Форум: "Начинающим";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
ВнизКак реализовать? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c