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

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

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


Kolan ©   (2007-02-16 10:33:00) 

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

Например есть класс:
 
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...


Kolan   (2007-02-16 10:58:00) [1]

> umbra ©   (16.02.07 10:55)

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


Kolan   (2007-02-16 10:57:00) [2]

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


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

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

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


umbra   (2007-02-16 10:55:00) [4]


>  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:54:00) [5]

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

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


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

procedure TExtLabeledEdit.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:51:00) [7]

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

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


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


> Kolan


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


Kolan   (2007-02-16 10:45:00) [9]

> RASkov   (16.02.07 10:40)

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


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

> RASkov   (16.02.07 10:40)

Благодарю.


Kolan   (2007-02-16 10:42:00) [11]

> SetFLabel

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

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


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

> [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;


Arm79   (2007-02-16 10:39:00) [13]


> 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


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

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


Наверх

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