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

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

TPersisten массив свойств и вызов методов хозяина [D7, WinXP]


Perfect ©   (2006-02-08 11:49:00) 

Вот листинг в котором необходимо вызвать сообщение HMSetSidebar из... ну я там пометил:

------------------------------------------------------------------------
unit PftFrame;

interface

uses
 SysUtils, Classes, Controls, ExtCtrls, StdCtrls, Types, Windows, Messages, Forms
 , Dialogs;

CONST
 HM_SETSIDEBAR = WM_USER + 1;

type
 TBorderArray = class(TPersistent)
 private
   FLeft  : boolean;
   FRight : boolean;
   FTop   : boolean;
   FDown  : boolean;
   function GetVal(const Index: Integer): boolean;
   procedure SetVal(const Index: Integer; const Value: boolean);
 public
   constructor Create(AOwner : TComponent);
 published
   property Left  : boolean index  0 read GetVal write SetVal default false;
   property Right : boolean index  1 read GetVal write SetVal default false;
   property Top   : boolean index  2 read GetVal write SetVal default false;
   property Down  : boolean index  3 read GetVal write SetVal default false;
 end;

type
 TCustomPftFrame = class(TScrollingWinControl)
 private
   FSideBar: TBorderArray;
   procedure HMSetSidebar(var Message: TMessage); message HM_SETSIDEBAR;
 protected
   property SideBar : TBorderArray read FSideBar write FSideBar;
 public
   constructor Create(AOwner : TComponent); override;
 published

 end;

type
 TPftFrame = class(TCustomPftFrame)
 private

 protected
   { Protected declarations }
 public
   constructor Create(AOwner : TComponent); override;
 published
   property SideBar;
   property Align;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('PftControls', [TPftFrame]);
end;

{ TCustomPftFrame }

constructor TCustomPftFrame.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FSidebar := TBorderArray.Create(AOwner);
end;

procedure TCustomPftFrame.HMSetSidebar(var Message: TMessage);
begin
 ShowMessage('Refresh');
end;

{ TPftFrame }

constructor TPftFrame.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
end;

{ TBorderArray }

constructor TBorderArray.Create(AOwner: TComponent);
begin
 inherited Create;
 FLeft  := false;
 FRight := false;
 FTop   := false;
 FDown  := false;
end;

function TBorderArray.GetVal(const Index: Integer): boolean;
begin
 Result := false;
 case Index of
   0: Result := FLeft ;
   1: Result := FRight;
   2: Result := FTop  ;
   3: Result := FDown ;
 end;
end;

procedure TBorderArray.SetVal(const Index: Integer; const Value: boolean);
begin
 case Index of
   0 : FLeft  := Value;
   1 : FRight := Value;
   2 : FTop   := Value;
   3 : FDown  := Value;
 end;
 //Отсюда вызывать!!!!
end;

end.
                 
------------------------------------------------------------------------


Perfect   (2006-02-26 19:44:00) [1]

ты прав я не думал об этом, просто когда-то давно я таким подходом пользовался и что-то мне там не понравилось (не помню почему) - и видимо в памяти(всмысле моей "мозговой" :) памяти) что неприятное осталось, а в моем исходнике уже подход отработан и работает довольно успешно везде вот и прывык. И все же спасибо за совет долой предрассудкикто я в конце - концов програмер или нет.


Юрий Зотов   (2006-02-08 21:04:00) [2]

Добавление - если следовать п.1 то проблема сабжа тоже исчезает сама собой, вместе с совершенно ненужным классом.


Юрий Зотов   (2006-02-08 20:59:00) [3]

1. Зачем нужна куча булевских полей, когда можно просто объявить перечислимый тип и множество для него?

TBorderSide = (bsLeft, bsRight, bsTop, bsBottom);
TBorderSides = set of TBorderSide;

Тогда свойство этого типа можно вводить прямо в компонент, а класс TBorderArray не понадобится вовсе. Кстати, вместе с ним исчезнут и допущенные в нем погрешности. Например, такой конструктор ему совершенно не нужен, поскольку он ровно ничего не делает (поля обнуляются и без него), а вот метод GetOwner как раз не помешало бы и перекрыть (как именно - см. [1]).

2. Раз уж компонент создает объект класса TBorderArray в своем конструкторе, то почему он не уничтожает его в своем деструкторе? Поскольку это некомпонентский класс, никакие введения собственных Owner'ов здесь не дадут автоматического удаления и в итоге имеем 100%-ную утечку памяти.


Perfect   (2006-02-08 19:21:00) [4]

Спасибки добрый человек счас попробуем


DimaBr   (2006-02-08 15:38:00) [5]

TBorderArray = class(TPersistent)
private
 fOwner: TComponent;
....

constructor TBorderArray.Create(AOwner: TComponent);
begin
inherited Create;
fOwner := AOwner;
...

procedure TBorderArray.SetVal(const Index: Integer; const Value: boolean);
begin
...
 TCustomPftFrame(fOwner).HMSetSidebar();
...


Наверх

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