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

Вниз

Сериализация дочернего   Найти похожие ветки 

 
DimaBr   (2006-05-25 11:35) [0]

Здравствуйте !
Есть панель с ToolBar-ом. Никак не записываются кнопки в ресурс. Уже создал свой ToolBar со своей сериализацией, всё равно не помогает. Помогите пожалуйста. :(((

unit TestPanel;

interface
uses Classes,ExtCtrls,Forms,Controls,ComCtrls,dialogs,SysUtils;
type
TMyToolBar = class(TToolBar)
 procedure GetChildren(Proc: TGetChildProc; Root: TComponent);override;
end;

TTestPanel = class(TCustomPanel)
 private
   fBar: TMyToolBar;
  public
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent);override;
    constructor Create(Aowner: TComponent);override;
    destructor Destroy;override;
    procedure Notification(AComponent: TComponent; Operation: TOperation);override;
  published
    property Bar: TMyToolBar read fBar write fBar;
end;

procedure Register;

implementation
procedure Register;
begin
 RegisterComponents("Standard",[TTestPanel]);
end;

{ TTestPanel }

constructor TTestPanel.Create(Aowner: TComponent);
var i: integer;
begin
 inherited;
 RegisterClass(TMyToolBar);
 fBar := TMyToolBar.Create(self);
 i := 1;
 while FindComponent("ToolBar"+IntToStr(i)) <> nil do inc(i);
 fBar.Name := "ToolBar"+IntToStr(i);
end;

destructor TTestPanel.Destroy;
begin
 fBar.Free;
 inherited;
end;

procedure TTestPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
 Proc(fBar);
end;

procedure TTestPanel.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
 inherited;
 if (Operation = opRemove)and(AComponent = Bar) then fBar := nil;
end;

{ TMyToolBar }

procedure TMyToolBar.GetChildren(Proc: TGetChildProc; Root: TComponent);
var i: integer;
begin
//   Always 0   !!!!!!!!!!!!!!!!!!!!!!!
 ShowMessage(inttostr(ButtonCount));
 for i := 0 to ButtonCount -1 do
   Proc(Buttons[i]);
end;

end.


 
StriderMan ©   (2006-06-01 15:28) [1]


>  for i := 0 to ButtonCount -1 do
>    Proc(Buttons[i]);

а если попробовать ComponentCount...?


 
DimaBr   (2006-06-02 13:38) [2]

Ну хоть кто-то ответил :))).
Естественно пробывал, даже давал им имена и FindComponent не находит.


 
StriderMan ©   (2006-06-02 17:15) [3]

может у ToolBar кнопки не являются компонентами в Делфишном смысле


 
DimaBr   (2006-06-05 13:08) [4]

TComponent
TControl
TWinControl
TToolWindow
TToolBar


 
DimaBr   (2006-06-05 13:09) [5]

Ой, ошибся, надо вот так

TComponent
TControl
TGraphicControl
TToolButton


 
StriderMan ©   (2006-06-05 19:21) [6]

еще как вариант - ControlCount


 
DimaBr   (2006-06-06 08:42) [7]

Так ведь дурак, но не на столько же. Пробывал, причём с самого начала. Это то и удивило, что кнопки есть а FindComponent = nil


 
StriderMan ©   (2006-06-06 11:54) [8]

ну прям даже сам заинтересовался. Есть еще одна мысль - кнопки лежат на какой-то подложке, которая у них является Parent"ом, а уже подложка на ToolBar"е


 
StriderMan ©   (2006-06-06 12:45) [9]

очень странно. У меня код


procedure TForm1.ToolButton1Click(Sender: TObject);
var
 i: integer;
begin
 for i := 0 to tb.ButtonCount - 1 do
   ShowMessage(tb.Buttons[i].Name);
end;


прекрасно работает


 
DimaBr   (2006-06-06 12:46) [10]

Полложкой является мой компонент (панель), её сохраняет нормально
procedure TTestPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
Proc(fBar);
end;


 
StriderMan ©   (2006-06-06 12:52) [11]

кстати в коде, который вы тут представили, не создаются кнопки на ToolBar"е, может в этом дело... :)


 
DimaBr   (2006-06-06 13:31) [12]

Они и не должны создаваться в коде, разве что в (SetParent запихнуть) поскольку набиваются вручную в дизайнере как в реальном ToolBare.


 
StriderMan ©   (2006-06-06 13:37) [13]

хм. В рантайме насоздавал кнопок, все прекрасно записалось в FileStream.


procedure TTestPanel.CreateButtons;
var
 i: integer;
begin
 for i := 1 to 5 do
   with TToolButton.Create(Owner) do
   begin
     Parent := fBar;
   end;
end;


А в SetParent у панельки пришлось дописать к вашему классу:


procedure TTestPanel.SetParent(AParent: TWinControl);
begin
 inherited;
 fBar.Parent := Self;
end;


 
DimaBr   (2006-06-06 14:05) [14]


> А в SetParent у панельки пришлось дописать к вашему классу:
>
>
>
> procedure TTestPanel.SetParent(AParent: TWinControl);
> begin
>  inherited;
>  fBar.Parent := Self;
> end;

Что же это получается, fBar в ресурсе сохраняется, читается нормально, а парента у него нет ? Нужно вручную проставлять ?


 
StriderMan ©   (2006-06-06 15:05) [15]

Зарегистрирован ведь компонент TTestPanel, а он уже сам создает ToolBar, и должен сам разруливать кто у него будет парентом.

Когда вы в дизайне кладете свою панель на форму, сначала вызывается конструктор TTestPanel.Create, а в конструкторе Parent этой панели еще неизвестен, поэтому рисоваться ей негде, соответственно ToolBar который создается в конструкторе панели тоже "еще не знает". где ему рисоваться. и если ему в конструкторе панели сказать
ToolBar.Parent := Self
то он скажет что-то типа "No Parent Window".

Потом после конструктора панельке присваивается Parent, вот здесь- то и нужно тубару тоже парента дать


 
DimaBr   (2006-06-06 15:34) [16]

Спасибочки огромное.



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

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

Наверх




Память: 0.5 MB
Время: 0.031 c
15-1171438394
Rouse_
2007-02-14 10:33
2007.03.11
А вы говорите зачем в Москве много зарабатывать?


15-1171518389
TUser
2007-02-15 08:46
2007.03.11
Хранение ссылок на сайты


15-1171525596
novill
2007-02-15 10:46
2007.03.11
Есть ли клиенты для просмотра других сайтов по Дельфи?


15-1171561649
alien1769
2007-02-15 20:47
2007.03.11
Вакансия для программиста на С++


15-1171596526
Slider007
2007-02-16 06:28
2007.03.11
С днем рождения ! 16 февраля