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

Вниз

Если в компоненте есть ссылка на другой и это другой удалят...   Найти похожие ветки 

 
Kolan ©   (2007-02-16 10:33) [0]

Здравствуйте,
 Сабж, что будет?

Например есть класс:
 
TLabeledEdit = class(TInsideHintEdit)
 private
   { Private declarations }
   FLabel: TLabel;
 published
   property NotifyLabel: TLabel read FLabel write FLabel;
 end;
 


И процедура:

procedure TLabeledEdit.ShowStringOnLabel(S: string; Color: TColor);
begin
 if Assigned(FLabel) then
 begin
   if Assigned(FBeforeShowStringOnLabelEvent) then
     FBeforeShowStringOnLabelEvent(Self, S, Color);
   FLabel.Font.Color := Color;
   FLabel.Caption := S;
 end;
end;


Что будет если этот Лэйбл  назначат, а потом удалят? - AV, так как Assigned(FLabel) скажет что все ок.

Вопрос как сделать чтобы AV небыло?
В TForm, например, если назначить меню и потом его удалить ничего же не будет. Или ImageList...


 
Сергей М. ©   (2007-02-16 10:38) [1]

У любого компонента есть метод FreeNotification


 
Arm79 ©   (2007-02-16 10:39) [2]


> TLabeledEdit = class(TInsideHintEdit)
>  private
>    { Private declarations }
>    FLabel: TLabel;
>  published
>    property NotifyLabel: TLabel read FLabel write FLabel;
>
>  end;


   property NotifyLabel: TLabel read FLabel write SetFLabel;

в процедуре SetFLabel указываешь корректное удаление старого значения Flabel и присваивание Flabel nil


 
RASkov   (2007-02-16 10:40) [3]

> [0] Kolan ©   (16.02.07 10:33)

procedure TLabeledEdit.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited Notification(AComponent, Operation);
 if (AComponent = FLabel) and (Operation = opRemove) then
   FLabel := nil;
end;


 
Kolan ©   (2007-02-16 10:42) [4]

> SetFLabel

А она вызовется при удалении?

У любого компонента есть метод FreeNotification
О, только как пользоваться я не понял :( Справкку читал :)
Пример можно?


 
Kolan ©   (2007-02-16 10:43) [5]

> RASkov   (16.02.07 10:40)

Благодарю.


 
Kolan ©   (2007-02-16 10:45) [6]

> RASkov   (16.02.07 10:40)

Подожди, а кто её будет вызывать? Что-то я недопонял как эта система работает


 
Сергей М. ©   (2007-02-16 10:48) [7]


> Kolan


Твой  TLabeledEdit должен быть владельцем того самого TLabel.


 
Kolan ©   (2007-02-16 10:51) [8]

> [7] Сергей М. ©   (16.02.07 10:48)
>
> > Kolan
>
>
> Твой  TLabeledEdit должен быть владельцем того самого TLabel.

А если нет? Вот если я бросил на форму ТулБар и ИмэджЛист, у нех у обоих владелец форма. А теперь назначю ИмэджЛист ТулБару, владелец же не изменится. Как это сделать?


 
RASkov   (2007-02-16 10:54) [9]

> [6] Kolan ©   (16.02.07 10:45)

Этот метод вызывается когда создаются или уничтожаются компомненты


 
Kolan ©   (2007-02-16 10:54) [10]

procedure TExtLabeledEdit.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FLabel) and (Operation = opRemove) then
  FLabel := nil;
end;


Вроде работает. А в дизайн тайме ничего добавлять ненадо?


 
umbra ©   (2007-02-16 10:55) [11]


>  property NotifyLabel: TLabel read FLabel write FLabel;

FLabelPresent: boolean;
{....................................}
property NotifyLabel: TLabel read FLabel write SetLabel;
{..................................}

procedure SetLabel(value: TLabel);
begin
 If FLabelPresent then
   begin
    FreeAndNil(value);
    FLabelPresent := false
  else
    begin
       Flabel := Value;
       FLabelPresent := true;
    end;
end;


 
RASkov   (2007-02-16 10:56) [12]

> [10] Kolan ©   (16.02.07 10:54)

Он и в дизайнтайме работает


 
Kolan ©   (2007-02-16 10:57) [13]

Угу, все работает, благодарю.


 
Kolan ©   (2007-02-16 10:58) [14]

> umbra ©   (16.02.07 10:55)

Благодарю, разобрался уже.



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

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

Наверх




Память: 0.5 MB
Время: 0.037 c
15-1170946604
Rouse_
2007-02-08 17:56
2007.03.04
Хто тут работу искал?


1-1168354965
sia
2007-01-09 18:02
2007.03.04
принудительное закрытие приложения


2-1171140052
Дрон
2007-02-10 23:40
2007.03.04
TrackBar


2-1171093444
inkvizitor
2007-02-10 10:44
2007.03.04
открытие текстового файла в StringGrid


2-1171358625
misere
2007-02-13 12:23
2007.03.04
Конвертация массива из byte-ов в integer