Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизAccess Violation Найти похожие ветки
← →
Jaxtor (2003-04-07 10:52) [0]Специалисты по AccessViolation помогите!!!
В одной из процедур модуля объявлена переменная ShowForm: TForm;
Также в этой процедуре есть визуализация формы:
ShowForm:=(DocForm.FindComponent("PrihNaklForm_") as TForm);
if ShowForm=nil then
begin
ShowForm:=NewPrihNakl.TNewPrihForm.Create(Self);
ShowForm.Name:="PrihNaklForm_";
end;//if ShowForm=nil
ShowForm.Show;
А вот когда на форме NewPrihNakl нажимается кнопка возникает AccessViolation. Причем не сразу после нажатия, а после
операции:
KomuVariant:=NewPrihNakl.NewPrihForm.DBLookupComboboxEh1.DataSource.DataSet.FieldValues["COMPANYID"];
var KomuVariant: Variant;
Что тут может быть?
← →
Palladin (2003-04-07 11:19) [1]все что угодно
← →
Jaxtor (2003-04-07 11:23) [2]Palladin, большое тебе спасибо за правильный ответ!!!!
← →
Digitman (2003-04-07 11:31) [3]
> Jaxtor
а тебе - за великолепно продуманный вопрос !
← →
Digitman (2003-04-07 11:39) [4]вот эта строчка
ShowForm:=NewPrihNakl.TNewPrihForm.Create(Self);
вызывает оч большие вопросы и сомнения в корректности
кр.того,
ShowForm=nil - при каких условиях и в какие моменты ссылка на ShowForm сбрасывается в nil ?
← →
Jaxtor (2003-04-07 11:44) [5]>ShowForm:=NewPrihNakl.TNewPrihForm.Create(Self);
здесь все нормально.
>ShowForm=nil - при каких условиях и в какие моменты ссылка на ShowForm сбрасывается в nil?
Естественно, когда ссылки на эту форму нет.
← →
Jaxtor (2003-04-07 11:46) [6]Собственно мой уровень знаний позволяет самостоятельно ответить на этот вопрос, здесь вопрос только во времени.
← →
Skier (2003-04-07 11:47) [7]Рискну заняться телепатией...:)
var
AComponent : TComponent;
begin
AComponent := DocForm.FindComponent("PrihNaklForm_");
if not Assigned(AComponent) then begin
AComponent := TNewPrihForm.Create(Self);
with TNewPrihForm(AComponent) do begin
Name:="PrihNaklForm_";
KomuVariant:=DBLookupComboboxEh1.DataSource.
DataSet.FieldValues; //(?)
Show;
//освобождение формы возлагается на автора...
end; //with
end; //if
end;
← →
Digitman (2003-04-07 11:51) [8]1. NewPrihNakl - это что, имя модуля ?
2. время жизни локальной переменной процедуры равно времени жизни процедуры. Вот тебе и "грабли")
← →
Jaxtor (2003-04-07 11:58) [9]>время жизни локальной переменной процедуры равно времени жизни процедуры
Да, ты прав, я это знаю. Скорее всего ошибка возникает по этой причине. Но переменную ShowForm я не использую в модуле NewPrihNakl. Можно сделать ее глобальной, но при этом запись:
ShowForm.DBLookupComboboxEh1.DataSource.DataSet.FieldValues["COMPANYID"]; будет неправильным.
← →
Lord Warlock (2003-04-07 11:58) [10]Я попробовал прокатать упрощенный до Form1, Form2 пример. Очень большую роль играет Self, а у тебя он - не понятно кто, хотя судя по коду должен быть DocForm. AccessVioletion у меня начисто исчез после включения свойств Drag&Dock. Form1 - Dock
← →
Digitman (2003-04-07 12:00) [11]если NewPrihNakl - это имя модуля и NewPrihForm есть переменная в этом модуле, то мои "телепатическиеспособности" подсказывают, что в момент обращения к этой переменной ее содержимое не имеет смысла ("мусор" или nil). Ибо нигде в приведенном коде эта переменная не упоминается в кач-ве приемника ссылки на экз-р класса TNewPrihForm
← →
Jaxtor (2003-04-07 12:02) [12]Значит вопрос теперь, как используя переменную ShowForm обращаться к компонентам, размещенным на форме?
ShowForm. ....
← →
Lord Warlock (2003-04-07 12:03) [13]Хотя нет про Drag&Dock я наврал, все и так работает
← →
Palladin (2003-04-07 12:07) [14]
> Jaxtor © (07.04.03 12:02)
точно также как ты и делал
ShowForm.FindComponent
← →
VaS (2003-04-07 12:08) [15]Особенно радует строчка
NewPrihNakl.NewPrihForm.DBLookupComboboxEh1.DataSource.DataSet.FieldValues["COMPANYID"]
:))
← →
Jaxtor (2003-04-07 12:21) [16]Не понимаю так что-ли:
var v:Variant;
v:= ShowForm.FindComponent("NewPrihNakl.NewPrihForm.DBLookupComboboxEh1.DataSource.DataSet.FieldValues["COMPANYID"]") as Variant;
Тупизм какой-то.
← →
Palladin (2003-04-07 17:19) [17]да
точно
тупизм
← →
icWasya (2003-04-07 18:36) [18]
var v:Variant;
ShowForm:TForm;
LookUp:TDBLookupComboboxEh;
ShowForm:=(DocForm.FindComponent("PrihNaklForm_") as TForm);
LookUp:= ShowForm.FindComponent("DBLookupComboboxEh1) as TDBLookupComboboxEh;
v:= LookUp.DataSource.DataSet.FieldValues["COMPANYID"]") as Variant;
← →
MalkoLinge(ForgotPass) (2003-04-07 18:48) [19]Люди ! Он просто издеваеться
Jaxtor - совет, изредка просто необходимо ДУмать, что пишешь. Тогда подобных ошибок не будет вообще. А еще есть замечательная штука, как ссылка на класс.
Далее
ShowForm:=(DocForm.FindComponent("PrihNaklForm_") as TForm);
Несмотря на то, что nill без ошибок приводиться к Tform, сия операция из за неявного вызова is очень медленная и бессмысленная в случае, если компонента нету :) Если обращать побольше внимания на такие-вот вещи...глядишь и ошибок поуменьшиться
← →
Сашко (2003-04-07 20:02) [20]Мужики! А что с моим вопросом?
У меня тоже AccessViolation, хотя ситуация попроще.
delphimaster.net/view/1-1049667119/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c