Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

Непонятный 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
15-1195174258
Германн
2007-11-16 03:50
2007.12.16
И про футбол, но и не только :)


2-1195718661
Dreamse
2007-11-22 11:04
2007.12.16
Вопрос по запрету завершения своего приложения.


3-1186648790
alsov
2007-08-09 12:39
2007.12.16
Оптимизация запроса


2-1195566507
Kolan
2007-11-20 16:48
2007.12.16
В TreeView какое событие/я происходят в TreeView при RightClickSe


2-1195311260
Dru095
2007-11-17 17:54
2007.12.16
как удалить файл с определенной датой создания