Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонятный 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);

Это что, я спрашиваю?


Наверх

Титульная страница Поиск, карта сайта Написать письмо