Что за метод?YurikGL писал(а):... метод inherited...
Создание одинаковых форм
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Старый глюк лучше новых двух!
>Процедура записывает переданные через нее данные в массив
1) Массив должен быть объявлен в форме...
2) Как создаешь копии форм? У каждой новой копии должно быть свое уникальное имя. Если напишешь
Во так
Form1:=TFrom1.Create(self);
Form1:=TFrom1.Create(self);
неправильно.
1) Массив должен быть объявлен в форме...
2) Как создаешь копии форм? У каждой новой копии должно быть свое уникальное имя. Если напишешь
Во так
Form1:=TFrom1.Create(self);
Form1:=TFrom1.Create(self);
неправильно.
>Что за метод?
Яндекс+inherited+create... лучше никто не расскажет :-)
Яндекс+inherited+create... лучше никто не расскажет :-)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Форма ассоциирована с модулем, так?Я просил только сказать как сделать много форм одинаковых с индивид. внутренними переменными,а не расказывать как и где создаются формы. Если обидел кого ИЗВЕНИТЕ. :type:
Так вот, переменные, которые на уровне модуля определены - будут общими для всех форм. Т.е. все формы смогут "общаться" друг с другом через этти переменные.
А переменные, которые являются СВОЙСТВАМИ этих форм будут у каждой формы свои собственные.
Я пробовал создавать одним способом, но в коде формы есть массив и каждое новое окно при создании переписывает этот массив, т.е. он как бы один на все окна. Подскажите как можно создать много одинаковых окон с возможностью индивидуальных массивов и если можно с возможностью обращаться к ним.
Код: Выделить всё
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
FPERSONALARRAY: array[1..10] of SOMETYPE;
private
{ Private declarations }
public
{ Public declarations }
property PERSONAL_ARRAY: array[1..10] of SOMETYPE read FPERSONALARRAY write FPERSONALARRAY;
end;
var
Form1: TForm1;
GLOBALARRAY: array[1..10] of SOMETYPE;
........
procedure TForm1.FormCreate(Sender: TObject);
begin
For i:=1 to 10 do FPERSONALARRAY[i]:=......;
end;
Создавать по Form1.Create(Владелец).
Владельцем может быть и Application или другой наследник класса TComponent, например, находящийся на главной форме.
У владельца есть коллекция Components она перечисляет все компоненты, которыми владеет данный.
Взяв Components и разыменовав этот указатель с типом TForm1
Т.е. (Components as TForm1) или TForm1(Components)
можно уже обратиться к персональному для i-ой формы массиву
(SomeOwner.Components as TForm1).PERSONAL_ARRAY[j]:=SOMETYPE(Value);
Вот примерно так.
Если не получится пришите, попробую сделать реальный пример...
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Т.е., коллеги, я категорическит против массивов и динамических массивов с указателями на формы. Есть стандартные средства VCL. Если у формы есть Owner, то она сама ему скажет (когда будет умирать) что про нее надо забыть, и он почистит ее из Components.
>Naeel Maqsudov
А как тогда из одной формы обратиться к другой форме? В смысле, как их отличать друг от друга?
А как тогда из одной формы обратиться к другой форме? В смысле, как их отличать друг от друга?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
По условию этого вроде не требовалось, но если надо то можно так:
- добавляем к форме свойство скажем ID
- перекрываем конструктор, дабы при создании сразу задавать ID формы
- пишем простейшую функцию, которая в цикле по всем компонентам владельца (с типом TForm) находит нам нужный ID
- обращаемся к тому, что нашли
- добавляем к форме свойство скажем ID
- перекрываем конструктор, дабы при создании сразу задавать ID формы
- пишем простейшую функцию, которая в цикле по всем компонентам владельца (с типом TForm) находит нам нужный ID
- обращаемся к тому, что нашли

В цикле перебирать - вроде не самый быстрый подход.Игорь Акопян писал(а):По условию этого вроде не требовалось, но если надо то можно так:
- добавляем к форме свойство скажем ID
- перекрываем конструктор, дабы при создании сразу задавать ID формы
- пишем простейшую функцию, которая в цикле по всем компонентам владельца (с типом TForm) находит нам нужный ID
- обращаемся к тому, что нашли
А в случае использования прямых указателей на форму цикл вроде не нужен.
Исходя из этого мое ИМХО, что лучше работать через переменные или массивы.
С уважением...
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Ну это чисто прикладной вопрос.А как тогда из одной формы обратиться к другой форме? В смысле, как их отличать друг от друга?
В момент создания новая форма получает индекс к коллекции Components владельца. Что бы кто-то умел обращаться именно к этой форме, то надо ему либо сообщить этот индекс, либо указатель на экземпляр формы, либо пусть он сам (например в цикле) пороется в Components владельца и найдет нужный указатель. Четвертого не дано!

Это зависит от количества элементов. У Вас их ведь не 1000? Для несколоьких десятков это не критично.В цикле перебирать - вроде не самый быстрый подход.
Я не знаю для чего Вам все это нужно, но обычно если кто-то хочет куда-то обратиться он либо знает адрес, либо вычисляет его, либо обращается к кому-то, кто может это сделать. Это основа любого взаимодействия систем (и в TCP/IP и в телефонии и .... везде...). На это есть стандарты. Наиболее глобальным является OSI (Эталонная модель взаимодействия открытых систем).