Главная страница
    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.47 MB
Время: 0.041 c
3-1155190299
zdm
2006-08-10 10:11
2006.10.15
куча query,table и т.д.


15-1158749498
user666
2006-09-20 14:51
2006.10.15
Отладчик Delphi 8


9-1136934788
Сложный вопрос
2006-01-11 02:13
2006.10.15
Как найти текстурные координаты точки на треугольнике?


2-1159595573
vegarulez
2006-09-30 09:52
2006.10.15
Вопрос по поводу Splash рисунка при загрузке программы.


2-1159428483
memo
2006-09-28 11:28
2006.10.15
DLLCHILD...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский