Создание одинаковых форм

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

gesper
Сообщения: 13
Зарегистрирован: 14 фев 2005, 18:35
Откуда: общество openwww

YurikGL писал(а):... метод inherited...
Что за метод?
Старый глюк лучше новых двух!
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>Процедура записывает переданные через нее данные в массив
1) Массив должен быть объявлен в форме...
2) Как создаешь копии форм? У каждой новой копии должно быть свое уникальное имя. Если напишешь
Во так
Form1:=TFrom1.Create(self);
Form1:=TFrom1.Create(self);
неправильно.
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>Что за метод?

Яндекс+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;

Эту форму надо (как было замечено выше) убрать из AutoCreate.
Создавать по 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.
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>Naeel Maqsudov

А как тогда из одной формы обратиться к другой форме? В смысле, как их отличать друг от друга?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

По условию этого вроде не требовалось, но если надо то можно так:
- добавляем к форме свойство скажем ID
- перекрываем конструктор, дабы при создании сразу задавать ID формы
- пишем простейшую функцию, которая в цикле по всем компонентам владельца (с типом TForm) находит нам нужный ID
- обращаемся к тому, что нашли
Изображение
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Игорь Акопян писал(а):По условию этого вроде не требовалось, но если надо то можно так:
- добавляем к форме свойство скажем ID
- перекрываем конструктор, дабы при создании сразу задавать ID формы
- пишем простейшую функцию, которая в цикле по всем компонентам владельца (с типом TForm) находит нам нужный ID
- обращаемся к тому, что нашли
В цикле перебирать - вроде не самый быстрый подход.
А в случае использования прямых указателей на форму цикл вроде не нужен.
Исходя из этого мое ИМХО, что лучше работать через переменные или массивы.

С уважением...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А как тогда из одной формы обратиться к другой форме? В смысле, как их отличать друг от друга?
Ну это чисто прикладной вопрос.
В момент создания новая форма получает индекс к коллекции Components владельца. Что бы кто-то умел обращаться именно к этой форме, то надо ему либо сообщить этот индекс, либо указатель на экземпляр формы, либо пусть он сам (например в цикле) пороется в Components владельца и найдет нужный указатель. Четвертого не дано! :)

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