Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1254405490
Blondin
2009-10-01 17:58
2009.11.15
Антикейлоггер


15-1253050186
Nic
2009-09-16 01:29
2009.11.15
Москвичи!!!


1-1223917702
просто так
2008-10-13 21:08
2009.11.15
object`ы в delphi 2009


2-1254144718
SergejM
2009-09-28 17:31
2009.11.15
TFileStream и array of extended


15-1253369312
Игорь
2009-09-19 18:08
2009.11.15
APM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский