Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Компоненты на Tabbednotebook

25K
16 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Всем привет! Вот такая запара. Цель такова: У нас есть TabbedNotebook, на нем будет неизвествое колличество вкладак, и на каждой вкладке нужно разместить по StringGrid, т.к. мы не знаем сколько будет вкладак с таблицами, то создание идет через код. Ну чтобы не показывать пример с таблицей возмем полегче, возмем кнопку
Код:
...
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;
...


Запара в том что, компонет размешаеться на активной вкладке, но после смены вкладки и возвращению обратно его там нету. Вот как мне сделать чтобы он не пропадал? Т.к. у меня каждая последующая таблица будет заполняться исходя из данных в предадущей то мне нужен доступ ко всем таблицам сразу, да и нужно чтобы пользователь мог переключаться между вкладками и смотреть результаты.

Надеюсь вопрос сформулирован достаточно понятно.
За ранее Спасибо.
25K
16 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Я вот поюзал TabControl, компонет перестал пропадать при смене вкладок, но прикол в том что он теперь на всех вкладках, как его поместить только на 1?
4.6K
17 апреля 2007 года
Tokolist
268 / / 22.03.2007
Во-первых, чем тебя TPageControl не устраивает?

А теперь ответ на вопрос

 
Код:
abc.Parent := (TabbedNotebook1.Pages.Objects[PageIndex] as TTabPage);


[QUOTE=Red_Dragon!]Я вот поюзал TabControl, компонет перестал пропадать при смене вкладок, но прикол в том что он теперь на всех вкладках, как его поместить только на 1?[/QUOTE]

Учи матчасть!
25K
18 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Спасибо, главное что и подсказал и дал поучительный совет, это как раз то что нужно. :) Вообше не думал что у меня будет такая смешная запара после того что писал...
Как проверю отпишусь! Еще раз спасиб!
25K
18 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Вытоге получилось нечно следующие
Код:
...procedure TForm1.Button1Click(Sender: TObject);
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;
...

Всем спс, правда не так уж и много народу участвовало =)
25K
27 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Тока щас наткнулся на проблемму, суть в слудующем. После завершения функции я не могу обращаться к созданным компонентам, чтобы к примеру запомнить их, или может просто не вьеду как к ним обращаться. Подскажиет?
4.6K
28 апреля 2007 года
Tokolist
268 / / 22.03.2007
Цитата: Red_Dragon!
Тока щас наткнулся на проблемму, суть в слудующем. После завершения функции я не могу обращаться к созданным компонентам, чтобы к примеру запомнить их, или может просто не вьеду как к ним обращаться. Подскажиет?


Матчасть учил? :)

Создаешь массив указателей и хранишь там указатель на каждый созданный компонент. Или через TWinControl.Controls

Еще я обратил внимание что ты используешь InsertControl. Используй лучше свойство Parent ;)

303
28 апреля 2007 года
makbeth
1.0K / / 25.11.2004
Red_Dragon!, у любого виндового контрола есть функция FindChildControl, которая по имени дочернего контрола (св-во Name) возвращает указатель на него. Естественно перед вызовом это имя нужно задать. Кроме того, есть процедура GetTabOrderList, которая возвращает список дочерних контролов, упорядоченных по табуляции (св-во TabOrder).
25K
29 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Такс всем спасибки, учту, буду пробовать завтра. Отпишусь обязательно.
P.S. Tokolist, будешь ржать, но матчасть почитывал :)
25K
30 апреля 2007 года
Red_Dragon!
12 / / 16.04.2007
Ну впринцыпе нормал, но хотелось кое что пашет косо. Выложите ка пример юзания плз.
303
02 мая 2007 года
makbeth
1.0K / / 25.11.2004
А что пашет косо? Свой код выложи, мож чего присоветуем ;)
25K
03 мая 2007 года
Red_Dragon!
12 / / 16.04.2007
Цитата: makbeth
А что пашет косо? Свой код выложи, мож чего присоветуем ;)



Да вот дело вот как, я как мартышка с очками, крутил вертел эту 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;
Возможно ли таким способом осуществить и поиск по имени?

303
03 мая 2007 года
makbeth
1.0K / / 25.11.2004
Цитата: Red_Dragon!
Да вот дело вот как, я как мартышка с очками, крутил вертел эту FindChildControl и хз как ее пральна юзать. Я Предпологал что самое разумное юзание это типа вот так ( к примеру заполнить клетку 1,1 тестом с Edit --->
FindChildControl('Tab1').Cells[1,1]:=Edit1.Text;
Но нет, такого не получаеться, потому что после точки предлогает вовсе не функции Grid.


Так абсолютно неверно.

Цитата: Red_Dragon!

Еще пробывал
PageControl1.FindChildControl('Tab1')...
Пробовал еще некоторые компинации но без успешно, еще и как назло в хелпике только:
function FindChildControl(const ControlName: string): TControl;
Вообше как я понимаю там что-то с ..:TControl; не так...

Уже ближе :)
Там все правильно с TControl. Функция возвращает указатель на TControl, т.к. все контролы унаследованы от этого типа. На самом деле возвращаемый объект является нужным тебе контролом. Это раз. Вызывать функцию нужно у того объекта, на котором лежат контролы (в твоем случае - TabSheet): PageControl -> TabSheet -> Grid1

 
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
    (PageControl1.ActivePage.FindChildControl('Grid1') as TStringGrid).Cells[1, 1] := Edit1.Text;
end;
Соответственно при создании грида его свойство Name должно быть задано как 'Grid1'.

Цитата:

Тока что вот нашол похожий пример, подписал его под себя но получаеться поиск по классу, а не по имени.
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;
Возможно ли таким способом осуществить и поиск по имени?

Ну в общем можно и так (переделка для поиска по имени):

Код:
procedure TForm1.Button2Click(Sender: TObject);
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;
Но этом случае ты просто воспроизводишь алгоритм FindChildControl (а зачем изобретать велосипед?)...
ЗЫ: Обрати внимание на приведение типов в моем первом примере - там используется оператор as. В этом случае, если возвратиться объект не типа TStringGrid, то выбросится исключение, а в твоем случае (второй пример):
 
Код:
TSG:=TStringGrid(PageControl1.ActivePage.Controls);
может произойти что угодно :)
25K
03 мая 2007 года
Red_Dragon!
12 / / 16.04.2007
Да согласе полностью, только хрень всеже в том что при выполении Нажатия на Батон2, вылетате ошибка памяти, а хрень какая-то, веть работать должна, все проверил, все имена, все переменные.
Код:
procedure TForm1.Button1Click(Sender: TObject);
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;
303
04 мая 2007 года
makbeth
1.0K / / 25.11.2004
Ну ошибку-то нужно в студию :) Так я ничего сказать не могу... в коде все вроде нормально.
25K
04 мая 2007 года
Red_Dragon!
12 / / 16.04.2007
А вот и ошибка, тока она мало что скажет кажись.
4.6K
05 мая 2007 года
Tokolist
268 / / 22.03.2007
2 Red_Dragon!
Держи (хоть ты и не прислушиваешься к моим советам):

Код:
unit Unit1;

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 утра, но неоднократное тестирование показало, что количество глюков близится к нулю :)
ЗЫ ЗЫ не забудь, что перед тем, как жать вторую пимпочку нужно нажать первую хотябы три раза :)
25K
06 мая 2007 года
Red_Dragon!
12 / / 16.04.2007
Tokolist, как всегда спасибо, вот видать и разабрались, щас пое и буду пробывать.
Еще хотел бы узнать, что бы ты мне посоветовал почитать на эту тему? матчасть)) может какие ссылоку есть хорошие?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог