Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к динамически созданным объектам Delphi 
:(
    Опции темы
Arinna
Дата 15.8.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Здравствуйте!
Я динамически на Form1 создаю вкладки TabSheet  и на каждой из них таблицы StringGrid. Нужно заполнять эти таблицы данными из Form2, или из Form3 и т.д (пользователь сам выбирает). Как мне в каждой форме обращаться к динамически созданному StringGrid?


PM MAIL   Вверх
Frees
Дата 15.8.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



а ты сслки на созданные объекты сохраняй... в TList например, или можно FindWindow использовать


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Arinna
Дата 15.8.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



А можно так?

S:=TStringGrid(Form1.FindComponent('StringGrid1'));
S.Cells[0,1]:='1'; 

но тут ошибка... Вы не подскажете как правильно будет? А то я с ссылками что то не поняла...
PM MAIL   Вверх
Frees
Дата 15.8.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



А при создании компонентов вы какое имя им давали?, его и пишите в FindControl


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Arinna
Дата 15.8.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Там на этой форме есть StringGrid1.

Код

For i:=0 to Form2.Pagecontrol1.PageCount-1 do begin
  S:=TStringGrid.Create(Form2.PageControl1.Pages[i]);
   with S do
  begin
  Parent:=Form2.PageControl1.Pages[i];
  Visible := True;
  name := 'StringGrid'+inttostr(i);
  Options:=Options+[goEditing];
  Left:=3;
  Top:=50;
  FixedCols:=0;
  end;
end;


Вот... Я просто первый раз работаю с динамическими объектами... И вообще ничего не знаю... Я не правильно обращаюсь? Как надо написать? Куда писать FindControl? Я не поняла)
PM MAIL   Вверх
northener
Дата 15.8.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Arinna @  15.8.2011,  20:24 Найти цитируемый пост)
S:=TStringGrid.Create(Form2.PageControl1.Pages[i]);

Замените на
Код

  S:=TStringGrid.Create(Form2);




--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Arinna
Дата 15.8.2011, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Если я так сделаю, то таблица будет на форме, а не на вкладках. Я уже так делала) Получалась одна таблица.
PM MAIL   Вверх
maniaks1
Дата 15.8.2011, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 16.12.2006

Репутация: нет
Всего: нет



Лучше всего в данной ситуации создать наследника от TabSheet
с StringGrid.

Т.е. у каждой вкладки будет свой StringGrid

Таким образом всё становится очень просто:
Допустим наш клас TMyTabSheet

перебираем все, находим нужный по заголовку или по тегу (присваиваем заранее)

Код


for i:=0 to ComponentCount-1 do
if Components[i] is TMyTabSheet then (Components[i] as TMyTabSheet).StringGrid.....




Не забываем о создании StringGrid про создании вкладки и удалении, при удалении вкладки.
Если надо могу подкинуть пример.

Это сообщение отредактировал(а) maniaks1 - 15.8.2011, 20:43
PM MAIL ICQ   Вверх
Arinna
Дата 15.8.2011, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



northener, хотя вроде я сейчас так сделала и получилось... если что, я вернусь))) Спасибо)

Добавлено через 1 минуту и 18 секунд
maniaks1, если не сложно, то давайте...
PM MAIL   Вверх
northener
Дата 15.8.2011, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Arinna @  15.8.2011,  20:39 Найти цитируемый пост)
Если я так сделаю, то таблица будет на форме, а не на вкладках.

Тот контрол, на котором будет лежать таблица определяется не владельцем, а родителем и задается в этой строке:

Цитата(Arinna @  15.8.2011,  20:24 Найти цитируемый пост)
Parent:=Form2.PageControl1.Pages[i];




--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Arinna
Дата 15.8.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Нет... Для 

Код

TStringGrid(Form2.FindComponent('StringGrid0')).Cells[0,1]:='1' 

заработал, а вот

Код

TStringGrid(Form2.FindComponent('StringGrid1')).Cells[0,1]:='1'
  
нет почему то...( вообще я создаю по две таблицы на TabSheet. И Когда я исправила на
Код

S:=TStringGrid.Create(Form2);
 

Выдает ошибку A component named StringGrid2 already exists
Вот кусок кода с созданием двух Гридов на вкладке
Код

For i:=0 to Form2.Pagecontrol1.PageCount-1 do begin
  S:=TStringGrid.Create(Form2);
   with S do
  begin
  Parent:=Form2.PageControl1.Pages[i];
  Visible := True;
  name := 'StringGrid'+inttostr(i);
  Options:=Options+[goEditing];
  Left:=3;
  Top:=50;
  FixedCols:=0;
  end;
end;

For i:=0 to Form2.Pagecontrol1.PageCount-1 do begin
  S:=TStringGrid.Create(Form2);
   with S do
  begin
  Parent:=Form2.PageControl1.Pages[i];
  Visible := True;
  name := 'StringGrid'+inttostr(Pagecontrol1.PageCount+i);
  Options:=Options+[goEditing];
  Left:=525;
  Top:=50;
    FixedCols:=0;
  end;
end;
 
PM MAIL   Вверх
maniaks1
Дата 15.8.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 16.12.2006

Репутация: нет
Всего: нет



Код

type
  TMyTabSheet=class(TTabSheet)
  ScrollBox:TScrollBox;
  //Тут можно написать необходимые процедуры
  procedure aaa;
protected
public
  isSave:Boolean;
end;

procedure TMyTabSheet.aaa;
begin
  //
end;



Далее где нужно:

Код

var T: TMyTabSheet;
begin
  T := TMyTabSheet.Create(PageControl1);
  with T do
  begin
    Visible := True;
     Caption := 'Эксперимент  '+InttoStr(Random(100));
    PageControl:= PageControl1;  // Назначаем Tab в Page Control
    PageControl1.ActivePage:=T;  //Устанавливаем новую закладку активной

    //Создаём ScrollBox
    ScrollBox:=TScrollBox.Create(T);
    ScrollBox.Align:=alClient;
    ScrollBox.Parent:=T;

    T.isSave:=true;

  end;
  T:=Nil;
  T.Free;
end;



Удаление:

Код

if PageControl1.PageCount=0 then Exit;

//если надо, сохраняем...
if (PageControl1.ActivePage as TMyTabSheet).isSave ...

 FreeAndNil((PageControl1.ActivePage as TMyTabSheet).ScrollBox);
(PageControl1.ActivePage as TMyTabSheet).Free;



Возможны небольшие ошибки, но смысл думаю понятен.
Насчёт поиска вкладок наврал, надо приблизительно так:

Код

for i:=0 to PageControl1.PageCount-1 do
if (PageControl1.Pages[i] as TMyTabSheet).Caption='dgsdgsd' then
(PageControl1.Pages[i] as TMyTabSheet).ScrollBox .....

PM MAIL ICQ   Вверх
northener
Дата 15.8.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Arinna @  15.8.2011,  20:58 Найти цитируемый пост)
For i:=0 to Form2.Pagecontrol1.PageCount-1 do begin
  S:=TStringGrid.Create(Form2);
   with S do
  begin
  Parent:=Form2.PageControl1.Pages[i];
  Visible := True;
  name := 'StringGrid'+inttostr(i); При PageCount = 2 тут создаются StringGrid0 и StringGrid1
  Options:=Options+[goEditing];
  Left:=3;
  Top:=50;
  FixedCols:=0;
  end;
end;
For i:=0 to Form2.Pagecontrol1.PageCount-1 do begin
  S:=TStringGrid.Create(Form2);
   with S do
  begin
  Parent:=Form2.PageControl1.Pages[i];
  Visible := True;
  name := 'StringGrid'+inttostr(Pagecontrol1.PageCount+i);  А тут создаются StringGrid1 и StringGrid2
  Options:=Options+[goEditing];
  Left:=525;
  Top:=50;
    FixedCols:=0;
  end;
end;




--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Arinna
Дата 15.8.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Почему?
Код

name := 'StringGrid'+inttostr(Pagecontrol1.PageCount+i);   создаются StringGrid1 и StringGrid2


Ведь Pagecontrol1.PageCount=2.
Тогда Pagecontrol1.PageCount+0=2 и Pagecontrol1.PageCount+1=3...
Или я что то не так понимаю?...
PM MAIL   Вверх
northener
Дата 15.8.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Arinna @  15.8.2011,  21:14 Найти цитируемый пост)
Тогда Pagecontrol1.PageCount+0=2 и Pagecontrol1.PageCount+1=3

Извините. Это я ошибся.
Значит ошибка где-то в другом месте.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1369 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.