![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сериализация дочернего
DimaBr © (2006-05-25 11:35:00)Здравствуйте !
Есть панель с 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.
DimaBr (2006-06-06 15:34:00) [1]Спасибочки огромное.
StriderMan (2006-06-06 15:05:00) [2]Зарегистрирован ведь компонент TTestPanel, а он уже сам создает ToolBar, и должен сам разруливать кто у него будет парентом.
Когда вы в дизайне кладете свою панель на форму, сначала вызывается конструктор TTestPanel.Create, а в конструкторе Parent этой панели еще неизвестен, поэтому рисоваться ей негде, соответственно ToolBar который создается в конструкторе панели тоже "еще не знает". где ему рисоваться. и если ему в конструкторе панели сказать
ToolBar.Parent := Self
то он скажет что-то типа "No Parent Window".
Потом после конструктора панельке присваивается Parent, вот здесь- то и нужно тубару тоже парента дать
DimaBr (2006-06-06 14:05:00) [3]
> А в SetParent у панельки пришлось дописать к вашему классу:
>
>
>
> procedure TTestPanel.SetParent(AParent: TWinControl);
> begin
> inherited;
> fBar.Parent := Self;
> end;
Что же это получается, fBarв ресурсе сохраняется, читается нормально, а парента у него нет ? Нужно вручную проставлять ?
StriderMan (2006-06-06 13:37:00) [4]хм. В рантайме насоздавал кнопок, все прекрасно записалось в 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 13:31:00) [5]Они и не должны создаваться в коде, разве что в (SetParent запихнуть) поскольку набиваются вручную в дизайнере как в реальном ToolBare.
StriderMan (2006-06-06 12:52:00) [6]кстати в коде, который вы тут представили, не создаются кнопки на ToolBar'е, может в этом дело... :)
DimaBr (2006-06-06 12:46:00) [7]Полложкой является мой компонент (панель), её сохраняет нормально
procedure TTestPanel.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
Proc(fBar);
end;
StriderMan (2006-06-06 12:45:00) [8]очень странно. У меня код
procedure TForm1.ToolButton1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to tb.ButtonCount - 1 do
ShowMessage(tb.Buttons[i].Name);
end;
прекрасно работает
StriderMan (2006-06-06 11:54:00) [9]ну прям даже сам заинтересовался. Есть еще одна мысль - кнопки лежат на какой-то подложке, которая у них является Parent'ом, а уже подложка на ToolBar'е
DimaBr (2006-06-06 08:42:00) [10]Так ведь дурак, но не на столько же. Пробывал, причём с самого начала. Это то и удивило, что кнопки есть а FindComponent = nil
StriderMan (2006-06-05 19:21:00) [11]еще как вариант - ControlCount
DimaBr (2006-06-05 13:09:00) [12]Ой, ошибся, надо вот так
TComponent
TControl
TGraphicControl
TToolButton
DimaBr (2006-06-05 13:08:00) [13]TComponent
TControl
TWinControl
TToolWindow
TToolBar
StriderMan (2006-06-02 17:15:00) [14]может у ToolBar кнопки не являются компонентами в Делфишном смысле
DimaBr (2006-06-02 13:38:00) [15]Ну хоть кто-то ответил :))).
Естественно пробывал, даже давал им имена и FindComponent не находит.
StriderMan (2006-06-01 15:28:00) [16]
> for i := 0 to ButtonCount -1 do
> Proc(Buttons[i]);
а если попробовать ComponentCount...?