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

Вниз

проблемы с созданием компонента   Найти похожие ветки 

 
i-am-vladko ©   (2007-01-08 12:51) [0]

unit MyUnit;

interface

uses
 Classes, SysUtils, GRaphics, Controls, Dialogs
Variants, LMDControl, LMDBaseControl, LMDBaseGraphicButton,
 LMDCustomShapeButton, LMDShapeButton, LMDSplt,
 LMDSimplePanel, LMDFormDisplay, LMDFill;

type
 TDirection = (sdHorisontal, sdVertical);

 TSplitterPlace = (ossEven);

 TLMDBorderStyle = (lsDoubleLovered, lsDoubleRaised,
   lsNone, lsFrameInset, lsFrameOffset,
   lsLowered, lsLoweredExt, lsLoweredspb,
   lsRaised, lsRaisedExt, lsRaisedspb,
   lsSingle, lsSingleLowered, lsSingleRaised,
   lsWindowBorder);

 TLMDSplitPane = class(TLMDSplitterPane)
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

 TLMDCustomSplitter = class(TWinControl)
 protected
   FColor: TColor;
   FSplitPos: integer;
   FSplitMin: integer;
   FSplitMax: integer;
   FSplitWidth: integer;
   FDirection: TDirection;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Position: integer read FSplitPos write FSplitPos;
   property Min: integer read FSplitMin write FSplitMin;
   property Max: integer read FSplitMax write FSplitMax;
   property Width: integer read FSplitWidth write FSplitWidth;
   property Color: TColor read FColor write FColor;
   property Direction: TDirection read FDirection write FDirection;
 end;

 TLMDMainSplitter = class(TLMDCustomSplitter)
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

 TLMD4Pane3SplitCtrl = class(TLMDSplitterPanel)
 private
   FBorderStyle: TLMDBorderStyle;
   FOnSplitterChange: TNotifyEvent;
   FSplitter3: TLMDCustomSplitter;
   FSplitter2: TLMDCustomSplitter;
   FMainSplit: TLMDMainSplitter;
   FSplitterPlace: TSplitterPlace;
   aPane: array[0..3] of TLMDSplitPane;
   function GetSplitPane(index: integer): TLMDSplitPane;
   procedure SetSplitPane(index: integer; Value: TLMDSplitPane);
 protected
   procedure Loaded; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property BorderStyle: TLMDBorderStyle read FBorderStyle write FBorderStyle;
   property SplitterPlace: TSplitterPlace read FSplitterPlace write FSplitterPlace;
   property Splitter2: TLMDCustomSplitter read FSplitter2 write FSplitter2;
   property Splitter3: TLMDCustomSplitter read FSplitter3 write FSplitter3;
   property SplitterMain: TLMDMainSplitter read FMainSplit write FMainSplit;
   property Pane0: TLMDSplitPane index 0 read GetSplitPane write SetSplitPane;
   property Pane1: TLMDSplitPane index 1 read GetSplitPane write SetSplitPane;
   property Pane2: TLMDSplitPane index 2 read GetSplitPane write SetSplitPane;
   property Pane3: TLMDSplitPane index 3 read GetSplitPane write SetSplitPane;
   property OnSplitterChange: TNotifyEvent read FOnSplitterChange write FOnSplitterChange;
 end;

procedure Register;

implementation

{*.dfm}

procedure Register;
begin
 RegisterComponents("alphaA", [TLMD4Pane3SplitCtrl]);
end;

{ TLMD4Pane3SplitCtrl }

constructor TLMD4Pane3SplitCtrl.Create(AOwner: TComponent);
var i: integer;
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
 if (csDesigning in ComponentState) then
   for i := 0 to 3 do
   begin
     aPane[i] := TLMDSplitPane.Create(self);
     aPane[i].Parent := self;
     AddPane(aPane[i]);
   end;
 FSplitter3 := TLMDCustomSplitter.Create(self);
 FSplitter2 := TLMDCustomSplitter.Create(self);
 FMainSplit := TLMDMainSplitter.Create(self);
end;

destructor TLMD4Pane3SplitCtrl.Destroy;
var i: integer;
begin
 for i := 3 downto 0 do
   if Assigned(aPane[i]) then aPane[i].Destroy;
 if Assigned(FSplitter2) then FSplitter2.Destroy;
 if Assigned(FSplitter3) then FSplitter3.Destroy;
 if Assigned(FMainSplit) then FMainSplit.Destroy;
 inherited;
end;

function TLMD4Pane3SplitCtrl.GetSplitPane(index: integer): TLMDSplitPane;
begin
 Result := aPane[index];
end;

procedure TLMD4Pane3SplitCtrl.Loaded;
var i: integer;
begin
 inherited Loaded;
 {for i := 3 to 6 do
   if Assigned(aPane[i]) then begin
   aPane[i]:= nil;
   end;}
end;

procedure TLMD4Pane3SplitCtrl.SetSplitPane(index: integer;
 Value: TLMDSplitPane);
begin
 aPane[index] := Value;
end;

{ TLMDCustomSplitter }

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

destructor TLMDCustomSplitter.Destroy;
begin
 inherited Destroy;
end;

{ TLMDSplitPane }

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

destructor TLMDSplitPane.Destroy;
begin
 inherited Destroy;
end;

{ TLMDMainSplitter }

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

destructor TLMDMainSplitter.Destroy;
begin
 inherited Destroy;
end;

initialization
 RegisterClasses([TLMDSplitPane]);
end.


Скриншоты:
http://ifolder.ru/812880
http://ifolder.ru/812897

Вопрос:
вместо 4 - панелей на TLMD4Pane3SplitCtrl их 8, если сохранить проект, закрыть его и снова загрузить.
Что не так??? всю ночь промучился - не могу найти ответ. Помогите, плз...


 
i-am-vladko ©   (2007-01-08 14:23) [1]

кому интересно LMD для D5-6-7 здесь : http://ifolder.ru/813618


 
Palladin ©   (2007-01-08 15:04) [2]

не знаю что там по поводу 8, но возможно причина кроется в этом

procedure TLMD4Pane3SplitCtrl.SetSplitPane(index: integer;
Value: TLMDSplitPane);
begin
aPane[index] := Value;
end;

учти, что при обращении к свойству на запись, старая aPane не уничтожается, соответственно сколько раз ты присвоил значение одному из свойств столько aPane и добавилось... просто ссылки на них теряются, остаются только в Components


 
i-am-vladko ©   (2007-01-08 16:03) [3]

причина не в этом - сейчас переписал и тот же эффект
 
procedure TLMD4Pane3SplitCtrl.SetSplitPane(index: integer;
Value: TLMDSplitPane);
if not Assigned(Value) or (Value = nil)
   then exit;
 aPane[index].AutoScroll := Value.AutoScroll;
 aPane[index].AutoSize := Value.AutoSize;
 FreeAndNil(Value);
end;


 
Чапаев ©   (2007-01-08 17:27) [4]

> property Pane0: TLMDSplitPane index 0 read GetSplitPane
> write SetSplitPane;
Лично я бы запись не разрешал. Создавай их при создании основного объекта, если надо изменить -- используй Assign().


> вместо 4 - панелей на TLMD4Pane3SplitCtrl их 8, если сохранить
> проект, закрыть его и снова загрузить.
С Loaded() перемудрил, надо полагать.


 
i-am-vladko ©   (2007-01-08 17:30) [5]

Loaded вообще убрал!


 
i-am-vladko ©   (2007-01-08 17:34) [6]

полностью запретил запись
  property Pane0: TLMDSplitPane index 0 read GetSplitPane write SetSplitPane;где - то в другом ошибка


 
i-am-vladko ©   (2007-01-08 17:35) [7]

property Pane0: TLMDSplitPane index 0 read GetSplitPane;
- сейчас так


 
Чапаев ©   (2007-01-08 17:50) [8]

> Parent := AOwner as TWinControl;
Руки отбивать. Без комментариев.


> if (csDesigning in ComponentState) then
>   for i := 0 to 3 do
>   begin
>     aPane[i] := TLMDSplitPane.Create(self);
>     aPane[i].Parent := self;
>     AddPane(aPane[i]);
>   end;
Этот "заглавный" if зачем?

А вообще проверь, не остались ли старые *.dcu от твоего компонента где-нибудь в системных каталогах.


 
i-am-vladko ©   (2007-01-08 17:57) [9]


> > Parent := AOwner as TWinControl;
> Руки отбивать. Без комментариев.

знаю что нельзя...
без этого Design-time компонент не помещается на форму - Control "" has no parent window


> Этот "заглавный" if зачем?

без него лишние панели создаются при каждом Run-time


 
Чапаев ©   (2007-01-08 18:28) [10]

> без этого Design-time компонент не помещается на форму -
> Control "" has no parent window
Потомки пытаются рисоваться, когда рисоваться им ещё не на чем.


 
i-am-vladko ©   (2007-01-08 18:56) [11]


> Потомки пытаются рисоваться, когда рисоваться им ещё не
> на чем.

Понятненько... а как нужно сделать? Рисовать их ведь нужно когда Parent стоит... замкнутый круг...


 
Чапаев ©   (2007-01-08 19:09) [12]

С LMD tools не работал, не знаю специфики тамошних компонентов.


 
i-am-vladko ©   (2007-01-09 11:45) [13]


> С LMD tools не работал, не знаю специфики тамошних компонентов.

да вобщем это и хорошо ))  не советую - кривовато писаны, есть небольшие баги и встречается непредсказуемое повeдение... самая большая проблема - в переносимости : на разных Делфи компоненты, классы и модули в корне различны (не все, конечно - но создает кучу проблем), к тому же нет Sourse Code.



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

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

Наверх




Память: 0.51 MB
Время: 0.038 c
3-1165249048
DelphiLexx
2006-12-04 19:17
2007.02.25
Проблема с интерфейсов OK и Отмена, Commit и Rollback


2-1170748728
Клара
2007-02-06 10:58
2007.02.25
Запросы


2-1170682880
Legolas
2007-02-05 16:41
2007.02.25
Чтение файла


2-1170760184
Ламот
2007-02-06 14:09
2007.02.25
Указать в пути к файлу/папке переменную среды


2-1170504835
Garacio
2007-02-03 15:13
2007.02.25
Архивирование