Форум: "Компоненты";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизСериализация дочернего Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c