Компоненты на Tabbednotebook
var
abc: TButton;
begin
abc := TButton.Create(self);
abc.Parent := TabbedNotebook1;
abc.Caption := 'eee';
abc.Left := 80;
abc.Top := 150;
abc.Width := 100;
abc.Height := 25;
TabbedNotebook1.PageIndex:=1;
end;
...
Запара в том что, компонет размешаеться на активной вкладке, но после смены вкладки и возвращению обратно его там нету. Вот как мне сделать чтобы он не пропадал? Т.к. у меня каждая последующая таблица будет заполняться исходя из данных в предадущей то мне нужен доступ ко всем таблицам сразу, да и нужно чтобы пользователь мог переключаться между вкладками и смотреть результаты.
Надеюсь вопрос сформулирован достаточно понятно.
За ранее Спасибо.
А теперь ответ на вопрос
[QUOTE=Red_Dragon!]Я вот поюзал TabControl, компонет перестал пропадать при смене вкладок, но прикол в том что он теперь на всех вкладках, как его поместить только на 1?[/QUOTE]
Учи матчасть!
Как проверю отпишусь! Еще раз спасиб!
var
NewTabSheet:TTabSheet;
NewBut:TStringGrid;
begin
NewTabSheet := TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
PageControl1.ActivePage:=NewTabSheet;
NewBut:=TStringGrid.Create(NewTabSheet);
NewBut.Visible:=True;
NewTabSheet.InsertControl(NewBut);
Inc(x);
PageControl1.ActivePage.Caption:=('Интерация '+ IntToStr(x));
end;
...
Всем спс, правда не так уж и много народу участвовало =)
Матчасть учил? :)
Создаешь массив указателей и хранишь там указатель на каждый созданный компонент. Или через TWinControl.Controls
Еще я обратил внимание что ты используешь InsertControl. Используй лучше свойство Parent ;)
P.S. Tokolist, будешь ржать, но матчасть почитывал :)
Да вот дело вот как, я как мартышка с очками, крутил вертел эту FindChildControl и хз как ее пральна юзать. Я Предпологал что самое разумное юзание это типа вот так ( к примеру заполнить клетку 1,1 тестом с Edit --->
FindChildControl('Tab1').Cells[1,1]:=Edit1.Text;
Но нет, такого не получаеться, потому что после точки предлогает вовсе не функции Grid.
Еще пробывал
PageControl1.FindChildControl('Tab1')...
Пробовал еще некоторые компинации но без успешно, еще и как назло в хелпике только:
function FindChildControl(const ControlName: string): TControl;
Вообше как я понимаю там что-то с ..:TControl; не так...
Тока что вот нашол похожий пример, подписал его под себя но получаеться поиск по классу, а не по имени.
procedure TForm1.Button2Click(Sender: TObject);
var
TSG:TStringGrid;
i:byte;
begin
TSG:=nil;
for i:=0 to PageControl1.ControlCount-1 do
begin
if PageControl1.Controls.ClassName='TStringGrid'
then
begin
TSG:=TStringGrid(PageControl1.Controls);
Edit1.Text:=TSG.Cells[1,1];
end;
end;
end;
Возможно ли таким способом осуществить и поиск по имени?
FindChildControl('Tab1').Cells[1,1]:=Edit1.Text;
Но нет, такого не получаеться, потому что после точки предлогает вовсе не функции Grid.
Так абсолютно неверно.
Еще пробывал
PageControl1.FindChildControl('Tab1')...
Пробовал еще некоторые компинации но без успешно, еще и как назло в хелпике только:
function FindChildControl(const ControlName: string): TControl;
Вообше как я понимаю там что-то с ..:TControl; не так...
Уже ближе :)
Там все правильно с TControl. Функция возвращает указатель на TControl, т.к. все контролы унаследованы от этого типа. На самом деле возвращаемый объект является нужным тебе контролом. Это раз. Вызывать функцию нужно у того объекта, на котором лежат контролы (в твоем случае - TabSheet): PageControl -> TabSheet -> Grid1
begin
(PageControl1.ActivePage.FindChildControl('Grid1') as TStringGrid).Cells[1, 1] := Edit1.Text;
end;
Тока что вот нашол похожий пример, подписал его под себя но получаеться поиск по классу, а не по имени.
procedure TForm1.Button2Click(Sender: TObject);
var
TSG:TStringGrid;
i:byte;
begin
TSG:=nil;
for i:=0 to PageControl1.ControlCount-1 do
begin
if PageControl1.Controls.ClassName='TStringGrid'
then
begin
TSG:=TStringGrid(PageControl1.Controls);
Edit1.Text:=TSG.Cells[1,1];
end;
end;
end;
Возможно ли таким способом осуществить и поиск по имени?
Ну в общем можно и так (переделка для поиска по имени):
var TSG:TStringGrid;
i:byte;
begin
TSG:=nil;
for i:=0 to PageControl1.ActivePage.ControlCount-1 do
begin
if PageControl1.ActivePage.Controls.Name = 'Grid1' then
begin
TSG:=TStringGrid(PageControl1.ActivePage.Controls);
Edit1.Text:=TSG.Cells[1,1];
end;
end;
end;
ЗЫ: Обрати внимание на приведение типов в моем первом примере - там используется оператор as. В этом случае, если возвратиться объект не типа TStringGrid, то выбросится исключение, а в твоем случае (второй пример):
var
NewTabSheet:TTabSheet;
NewBut:TStringGrid;
begin
NewTabSheet := TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
PageControl1.ActivePage:=NewTabSheet;
NewBut:=TStringGrid.Create(NewTabSheet);
NewBut.Visible:=True;
NewBut.Name:='Tab'+IntToStr(x);
NewBut.Cells[1,1]:='123';
NewTabSheet.InsertControl(NewBut);
Inc(x);
PageControl1.ActivePage.Caption:=('Интерация '+ IntToStr(x));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
(PageControl1.ActivePage.FindChildControl('Tab0') as TStringGrid).Cells[1, 1] := Edit1.Text;
end;
Держи (хоть ты и не прислушиваешься к моим советам):
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Grids;
type
TForm1 = class(TForm)
Button1: TButton;
PageControl1: TPageControl;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
StrGrids: array of TStringGrid;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
NewTabSheet: TTabSheet;
NewStrGrid: TStringGrid;
begin
NewTabSheet := TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
NewTabSheet.Caption:=('Интерация ' + IntToStr(Length(StrGrids)));
NewStrGrid := TStringGrid.Create(NewTabSheet);
SetLength(StrGrids, Length(StrGrids) + 1);
StrGrids[High(StrGrids)] := NewStrGrid;
with NewStrGrid do
begin
Cells[1,1] := '123';
Parent := NewTabSheet;
Visible := True;
end;
PageControl1.ActivePage := NewTabSheet;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StrGrids[2].Cells[1, 1] := 'test';
end;
end.
ЗЫ код писал в 4 утра, но неоднократное тестирование показало, что количество глюков близится к нулю :)
ЗЫ ЗЫ не забудь, что перед тем, как жать вторую пимпочку нужно нажать первую хотябы три раза :)
Еще хотел бы узнать, что бы ты мне посоветовал почитать на эту тему? матчасть)) может какие ссылоку есть хорошие?