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

Вниз

Как реализовать?   Найти похожие ветки 

 
faiwer ©   (2009-10-03 15:19) [0]

в общем примерно такая ситуация. динамически создаются TLabel-ы, и onClick присваивается на отдельную процедуру. В ходе работы этой процедуры почти всегда будет возникать ситуация что эту Label надо удалить и продолжить выполнять код

procedure TMainF.TagAction(sender: TObject);
begin
...
 if ... then begin
   ...
   A;
   ...
 end;
end;


где в A происходит удаление этого самого экземпляра Label которого OnClick и обрабатывается. Код впринципе выполняется нормально, но возникает Abstract Error, я решил перенести это в отдельную нить, но она стала конфликтовать с Canvas и просто дико плодить разные ошибки памяти.

В общем не могу вкурить как это сделать правильно?
желательно чтото вроде:

procedure TMainF.TagAction(sender: TObject);
begin
 ...
 if ... then B;
end;

где B производит нужный код и удаляет этот самый Label не приводя к Abstract Error. Как это сделать?!


 
DVM ©   (2009-10-03 16:30) [1]


> faiwer ©   (03.10.09 15:19)  

Ты пытаешься удалить экземпляр класса в его же методе. Так делать нельзя.
Самое надежное - это завести свое сообщение, например
WM_MYMESSAGE = WM_USER + 123;

Далее в обработчике onClick  тогда когда надо удалить Label мы посылаем ОКНУ ФОРМЫ на котором лежит Label это сообщение с пом PostMessage(), указав в lParam или wParam сообщения конкретный экземпляр Label, который подлежит удалению:

PostMessage(Handle, MYMESSAGE, 0, Integer(sender));

Форма, получает данное сообщение и САМА удаляет метку.


 
DVM ©   (2009-10-03 16:32) [2]


> Форма, получает данное сообщение и САМА удаляет метку.

Само собой для этого надо в обработчике сообщения написать что-то вроде

TLabel(lParam).Free;


 
faiwer ©   (2009-10-03 17:21) [3]

procedure TMainF.WMTagClick(var message: TMessage);
begin
TLabel(message.LParam).Free; // удаление
end;

procedure TMainF.TagClick(sender: TObject);
begin
...
F_ID:=-1;
case FResults[0].sector of
  ord(sTools): F_ID:=GetToolsList(FindsList,0,FResults[0].id);
  ord(sRoomTools): F_ID:=GetToolsList(FindsList,1,FResults[0].id);
  ord(sRecipes): F_ID:=MainF.GetRecipesList(FindsList,FResults[0].id);
  ord(sOthers): F_ID:=MainF.GetOthersList(FindsList,FResults[0].id);
end;

if F_ID>-1 then begin
  PostMessage(MainF.Handle, WM_TAGDELETE, 0, Integer(sender));

  case FResults[0].sector of
   ord(sTools): if (mode<>mTools) or (ToolsMode<>0) then ToolsSectorMIClick(mainF);
   ord(sRoomTools): if (mode<>mTools) or (ToolsMode<>1) then RoomToolsSectorMIClick(mainF);
   ord(sRecipes): if mode<>mRecipes then MainF.RecipesSectorMIClick(mainF);
   ord(sOthers): if mode<>mOthers then MainF.OthersSectorMIClick(mainF);
  end;

   List.ItemIndex:=F_ID;
   List.OnClick(self);
  end;
 end;
end;
end;


не сработало. код выполняется так:
1 посылается WM_TAGDELETE форме
2 выполняется код где удаляется метка
3 обрабатывается WM_TAGDELETE где происходит вторая попытка удалить метку.

в итоге был 1 Abstract Error теперь он же + ошибка памяти =) в теории я конечно могу исправить код где удаляется метка, чтобы етот код не удалял конкретно ету метку, но я думаю это будет гемморой, ибо метки в массиве.
вот код удаления меток (умня ето теги):

TTagLabel = array of TLabel;

procedure ClearTags(var list: TTagLabel);
var
i: smallint;
begin
if length(list)>0 then
begin
 for i := 0 to Length(list) - 1 do list[i].Destroy;
 SetLength(list,0);
end;
end;


 
DVM ©   (2009-10-03 17:26) [4]


> faiwer ©   (03.10.09 17:21) [3]


> 2 выполняется код где удаляется метка


> 3 обрабатывается WM_TAGDELETE где происходит вторая попытка
> удалить метку.

Нашиша два раза удалять одно и то же? Оттуда и ошибки.
Если при удалении ты затруднешься с тем, как отделить метки подлежащие удалению от прочих, то пометь как то нужные (или ненужные) тебе метки, например, положив в их свойство Tag какое либо значение.


 
faiwer ©   (2009-10-03 17:33) [5]

DVM, спс, я и раньше об етом думал, но боялся что это может привести к утечкам памяти. с обработкой сообщений убедился что всё нормально :D. теперь всё работает )



Страницы: 1 вся ветка

Текущий архив: 2009.11.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
2-1254422362
Anatoly Podgoretsky
2009-10-01 22:39
2009.11.15
AV при сложение AnsiString и UnicodeString в D2010


15-1252932944
SP
2009-09-14 16:55
2009.11.15
Математическая задачка


15-1253262614
vajo
2009-09-18 12:30
2009.11.15
Где WinAmp хранит информацию о рейтиге (оценка) песни?


2-1254202686
Анна
2009-09-29 09:38
2009.11.15
импорт данных в MSSQL2000 из БД Access


2-1254223177
defen
2009-09-29 15:19
2009.11.15
вывод значения ключа еестра