Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
ВнизНепонятный Access Violation Найти похожие ветки
← →
Василий К. (2007-11-22 14:47) [0]Приведенный ниже код работает нормально, если просто открывать форму и не выполнять двойной клик по сообщению, форма закрывается нормально. Стоит же открыть хотя бы одно - и при попытке закрытия 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;
← →
Johnmen © (2007-11-22 15:03) [1]
> then begin
> FormCreate(Self);
Это что, я спрашиваю?
← →
DrPass © (2007-11-22 15:44) [2]...и встать, когда с тобой Johnmen разговаривает!
← →
Сергей М. © (2007-11-22 16:01) [3]
> DrPass © (22.11.07 15:44) [2]
Упалпацтул)
← →
Johnmen © (2007-11-22 16:07) [4]
> Сергей М. © (22.11.07 16:01) [3]
> Упалпацтул)
Не от того падаешь.
А я ещё под впечатлением от Дня ребёнка :) Инерция, однако...
← →
Василий К. (2007-11-23 08:53) [5]> 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;
← →
Сергей М. © (2007-11-23 09:53) [6]
> Василий К. (23.11.07 08:53) [5]
Ты за каким лешим вызываешь метод FormCreate ?)
Объясни общественности..
← →
Василий К. (2007-11-23 09:57) [7]Да я уже переделал под отдельную процедуру, все равно та же фигня.
← →
DrPass © (2007-11-23 10:25) [8]
> Василий К. (23.11.07 09:57) [7]
> Да я уже переделал под отдельную процедуру, все равно та
> же фигня.
FormCreate тут имеет косвенное отношение. В первую очередь, ты очевидно не делаешь Free форме, когда ее закрываешь, а при каждом открытии пытаешься создать новую форму с тем же именем.
← →
Василий К. (2007-11-23 10:30) [9]with TcfmMessages.Create do begin
ShowModal; Free;
end;
или через try-finally
одинаковый результат = никакой.
← →
Johnmen © (2007-11-23 10:36) [10]
> Msgs := TStringList.Create;
> Msgs.Clear; Msgs.BeginUpdate;
Прокомментируй этот код. Вторую строку.
← →
Сергей М. © (2007-11-23 10:48) [11]Что далеко ходить ?
Чудеса начинаются с первых же строчек:
> if not Visible then Exit; //каким образом ты сюда попал, если форма невидима ?
> if not lbMessages.Focused then Exit; //если ты сюда попал, то листбокс заведомо имеет фокус - к чему же тогда эта бестолковая проверка
← →
Anatoly Podgoretsky © (2007-11-23 11:20) [12]> Сергей М. (23.11.2007 10:48:11) [11]
Да нет чудес, все возможно - например так lbMessagesDblClick(nill);, только к автору это явно не относится.
← →
DrPass © (2007-11-23 11:23) [13]
> with TcfmMessages.Create do begin
> ShowModal; Free;
> end;
В Project Options -> Forms -> Auto-Create forms заглядывал?
← →
ЮЮ © (2007-11-23 12:28) [14]> В Project Options -> Forms -> Auto-Create forms заглядывал?
А что, создание нескольких экземпляров форм уже такое премтупление, что "Component named "cfmMessages" already exists". .
Мне кажется, что ключевое здесь Component named . Т.е. где-то динамически создаются компоненты и им с какого-то перепугу устанавливается свойство Name, что просто лишнее.
P.Ы. Ошибка, естественно, не в приведенном коде, а в другом месте, не видном нам, но как всегда легко локализируемом отладчиком. Но их предпочитают искать на форуме.
← →
Anatoly Podgoretsky © (2007-11-23 12:31) [15]
> и им с какого-то перепугу устанавливается свойство Name,
> что просто лишнее.
Не лишнее, а лишнее попытка присвоить одно и тоже имя нескольким компонентам.
← →
ЮЮ © (2007-11-23 12:35) [16]> Не лишнее, а лишнее попытка присвоить одно и тоже имя нескольким
> компонентам.
Не пытаясь этого сделать вообще (присвоить имя компоненту, т.е. процедуру, имеющую смысл в Design-е, и практически бессмысленную в RunTime), её не огребешь. :)
← →
DrPass © (2007-11-23 12:46) [17]
> ЮЮ © (23.11.07 12:35) [16]
Если ты создаешь форму через Create, она свое свойство Name считает из DFM-файла. Можно ничего и не присваивать
← →
oxffff © (2007-11-23 12:49) [18]
> Johnmen © (23.11.07 10:36) [10]
>
> > Msgs := TStringList.Create;
> > Msgs.Clear; Msgs.BeginUpdate;
>
> Прокомментируй этот код. Вторую строку.
Письменно?
C Днем рождения! :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.064 c