![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятный Access Violation [IB6.x]
Василий К. © (2007-11-22 14:47:00)Приведенный ниже код работает нормально, если просто открывать форму и не выполнять двойной клик по сообщению, форма закрывается нормально. Стоит же открыть хотя бы одно - и при попытке закрытия Access Violation на "нулевом" адресе, после этого форма уже не создается и пишется "Component named 'cfmMessages' already exists". Что делать?
procedure TcfmMessages.lbMessagesDblClick(Sender: TObject);
var I: String;
begin
if (lbMessages.ItemIndex=-1) then Exit;
if not Visible then Exit;
if not lbMessages.Focused then Exit;
memText.Text := 'Загрузка сообщения...';
memText.Update;
SetStatus('Загрузка сообщения...');
Sleep(500);
try
I := lbMessages.Items[lbMessages.ItemIndex];
I := Parse(#15, I, 1); // ID сообщения
except
Exit;
end;
// получаем...
try
memText.Text := GetSimpleData('SELECT "TEXT" FROM "MESSAGES" WHERE "ID"='+I,
'TEXT');
SetStatus;
except
memText.Text := 'Ошибка загрузки сообщения...';
end;
// устанавливаем "прочитанный" статус...
try
I := lbMessages.Items[lbMessages.ItemIndex];
I := Parse(#15, I, 1); // ID сообщения
except
I := '-1';
end;
if (I='-1') then Exit;
lbMessages.Tag := lbMessages.ItemIndex;
if SimpleQuery('UPDATE "MESSAGES" SET "ISREAD"=1 WHERE "ID"='+I) then begin
FormCreate(Self);
lbMessages.Itemindex := lbMessages.Tag;
end;
ЮЮ (2007-11-23 12:28:00) [1]> В Project Options -> Forms -> Auto-Create forms заглядывал?
А что, создание нескольких экземпляров форм уже такое премтупление, что "Component named 'cfmMessages' already exists"..
Мне кажется, что ключевое здесь Component named. Т.е. где-то динамически создаются компоненты и им с какого-то перепугу устанавливается свойство Name, что просто лишнее.
P.Ы. Ошибка, естественно, не в приведенном коде, а в другом месте, не видном нам, но как всегда легко локализируемом отладчиком. Но их предпочитают искать на форуме. Anatoly Podgoretsky ©
> и им с какого-то перепугу устанавливается свойство Name,
> что просто лишнее.
Не лишнее, а лишнее попытка присвоить одно и тоже имя нескольким компонентам. ЮЮ © > Не лишнее, а лишнее попытка присвоить одно и тоже имя нескольким
> компонентам.
Не пытаясь этого сделать вообще (присвоить имя компоненту, т.е. процедуру, имеющую смысл в Design-е, и практически бессмысленную в RunTime), её не огребешь. :) DrPass ©
> ЮЮ © (23.11.07 12:35) [16]
Если ты создаешь форму через Create, она свое свойство Name считает из DFM-файла. Можно ничего и не присваивать oxffff ©
> Johnmen © (23.11.07 10:36) [10]
>
> > Msgs := TStringList.Create;
> > Msgs.Clear; Msgs.BeginUpdate;
>
> Прокомментируй этот код. Вторую строку.
Письменно?
C Днем рождения! :)
DrPass (2007-11-23 11:23:00) [2]
> with TcfmMessages.Create do begin
> ShowModal; Free;
> end;
В Project Options -> Forms -> Auto-Create forms заглядывал?
Anatoly Podgoretsky (2007-11-23 11:20:00) [3]> Сергей М. (23.11.2007 10:48:11) [11]
Да нет чудес, все возможно - например так lbMessagesDblClick(nill);, только к автору это явно не относится.
Сергей М. (2007-11-23 10:48:00) [4]Что далеко ходить ?
Чудеса начинаются с первых же строчек:
> if not Visible then Exit; //каким образом ты сюда попал, если форма невидима ?
> if not lbMessages.Focused then Exit; //если ты сюда попал, то листбокс заведомо имеет фокус - к чему же тогда эта бестолковая проверка
Johnmen (2007-11-23 10:36:00) [5]
> Msgs := TStringList.Create;
> Msgs.Clear; Msgs.BeginUpdate;
Прокомментируй этот код. Вторую строку.
Василий К. (2007-11-23 10:30:00) [6]with TcfmMessages.Create do begin
ShowModal; Free;
end;
или через try-finally
одинаковый результат = никакой.
DrPass (2007-11-23 10:25:00) [7]
> Василий К. (23.11.07 09:57) [7]
> Да я уже переделал под отдельную процедуру, все равно та
> же фигня.
FormCreate тут имеет косвенное отношение. В первую очередь, ты очевидно не делаешь Free форме, когда ее закрываешь, а при каждом открытии пытаешься создать новую форму с тем же именем.
Василий К. (2007-11-23 09:57:00) [8]Да я уже переделал под отдельную процедуру, все равно та же фигня.
Сергей М. (2007-11-23 09:53:00) [9]
> Василий К. (23.11.07 08:53) [5]
Ты за каким лешим вызываешь метод FormCreate ?)
Объясни общественности..
Василий К. (2007-11-23 08:53:00) [10]> FormCreate(Self);
procedure TcfmMessages.FormCreate(Sender: TObject);
var D: TIbDataSet; ToAdd, aFIO: String; Msgs: TStringList;
begin
// 2. Заполним список
D := Query('SELECT * FROM "MESSAGES" WHERE ("TOID"='+IntToStr(Login.ID)+
') AND ("FOLDER"=~\'+aFolderName+'~\)');
lbMessages.Clear;
Msgs := TStringList.Create;
Msgs.Clear; Msgs.BeginUpdate;
try
while not D.Eof do with D.Current do begin
ToAdd := ByName('ID').AsString+#15; // ID сообщения
aFIO := ByName('FROMID').AsString;
aFIO := Trim(GetUserName(StrToIntDef(aFIO, 999999)));
if (aFIO='') then aFIO := '999999';
ToAdd := ToAdd + Trim(aFIO) + #15;
ToAdd := ToAdd + ByName('TITLE').AsString+#15; // заголовок
ToAdd := ToAdd + ByName('DATE').AsString+#15; // дата отправки
ToAdd := ToAdd + ByName('ISREAD').AsString; // прочитано?
Msgs.Add(ToAdd);
D.Next;
end;
Msgs.EndUpdate;
lbMessages.Items := Msgs;
finally
Msgs.Free;
FinalizeQuery(D);
end;
end;
Johnmen (2007-11-22 16:07:00) [11]
> Сергей М. © (22.11.07 16:01) [3]
> Упалпацтул)
Не от того падаешь.
А я ещё под впечатлением от Дня ребёнка :) Инерция, однако...
Сергей М. (2007-11-22 16:01:00) [12]
> DrPass © (22.11.07 15:44) [2]
Упалпацтул)
DrPass (2007-11-22 15:44:00) [13]...и встать, когда с тобой Johnmen разговаривает!
Johnmen (2007-11-22 15:03:00) [14]
> then begin
> FormCreate(Self);
Это что, я спрашиваю?