Текущий архив: 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.47 MB
Время: 0.048 c