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

Вниз

TPersisten массив свойств и вызов методов хозяина   Найти похожие ветки 

 
Perfect ©   (2006-02-08 11:49) [0]

Вот листинг в котором необходимо вызвать сообщение 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.
                 
------------------------------------------------------------------------


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

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();
...


 
Perfect ©   (2006-02-08 19:21) [2]

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


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

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

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

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

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


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

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


 
Perfect ©   (2006-02-26 19:44) [5]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
4-1148964758
Шмель
2006-05-30 08:52
2006.10.15
Сохранение позиции окна


6-1147845759
BanderLog
2006-05-17 10:02
2006.10.15
Использование TIdSync в Indy10


15-1158671748
Empleado
2006-09-19 17:15
2006.10.15
Есть ли возможность найти человека в Москве/Московской области?


2-1159683245
Колобок
2006-10-01 10:14
2006.10.15
не знаю какая тут тема


15-1158863422
гость23
2006-09-21 22:30
2006.10.15
Реал-тайм звук с микрофона в динамиках ноутбука