Главная страница
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.053 c
3-1155246216
Oxot_nik
2006-08-11 01:43
2006.10.15
Как создать дерево таблиц в Базе данных?


4-1148624062
Antonyan
2006-05-26 10:14
2006.10.15
Политика безопасности XP SP2


2-1159267336
syte_ser78
2006-09-26 14:42
2006.10.15
ожидание documentcomplete


2-1159419736
aht
2006-09-28 09:02
2006.10.15
Дабл клик на гриде


11-1134945791
ebta
2005-12-19 01:43
2006.10.15
forum archive