![]() |
Delphi MDI + компоненты в режиме Run-Time
Раньше никогда не было потребности, но вот сейчас понадобился такой прекрасный "режим" как Run-Time, тобишь создание компонентов/окон в уже запущенной программе.
1. Начнём с компонентов: Создаю я например компонент TEdit вот таким способом Код:
varКакие имена присваиваются второму, третьему и т.д. полям, ведь я указал имя "x" ( var x: TEdit; ) то есть это имя первого поля, а остальные-то не могут быть названы так же :confused: Я думал, может x[номер поля], но ничего подобного. --------------------------------------------------------------------------------------------------------- С этим вопросом разобрался, вот ответ: Цитата:
Можно сделать по такой схеме: 1. Создаём компонент. 2. Заносим в объект TList указатель на этот компонент. 3. Для обращения к любому из компонентов вытягиваем указатель из TList. Таким образом мы не ограничиваемся размером массива. Покажу на примере (кинем на форму не одну кнопку, а две. Одна будет создавать поля, а другая - поменяет текст в определенном поле): Код:
unit Unit1;2. Проблема с дочерними MDI окнами: 1. Создаю основную форму ( Form.Style := fsMDIForm ). 2. Создаю MDI форму ( From.Style := fsMDIChild ). 3. В Project - Options перекидываю MDIchild форму в раздел Available forms. 4. По идее на основной форме нужно создать кнопку с кодом: Код:
<имя дочерней формы> := TChildForm.Create(Owner);--------------------------------------------------------------------------------------------------------- С этим вопросом тоже разобрался, вот ответ: Такс, с MDI окнами тоже разобрался. Создаём две формы - Form1, Form2. Form1.FormStyle := fsMDIForm; Form2.FormStyle := fsMDIChild; В Unit1, в разделе uses дописываем Unit2: uses ......, Unit2; На Form1 кидаем две кнопки (первая создаёт окна, вторая меняет заголовок определенного ока): Код:
procedure TForm1.Button1Click(Sender: TObject); |
Насчет первого вопроса - x это всего лишь название переменной а не компонента. Название компонента можно установить/прочитать так: x.Name
Насчет второго не скажу, с MDI никогда не работал, ибо не нужно было Но убери создание, т.к. эта форма у тебя уже в avalable forms значит по идее создается автоматически. Просто "имя дочерней формы".Show или как там для mdi окон Сорри, ступил. Значит так, следующий код показал дочернее mdi окно у меня, при том что окно этой формы в avalaible forms: Form2 := TForm2.Create(self); Form2.Show; где TForm2 - класс вторичной формы и свойства выставлены как у тебя |
Цитата:
Цитата:
---------------------------------------- Добавлено: В общем насколько я понял, в моём примере, runtime заключается в создании неограниченного количества однотипных объектов имеющих одно общее имя, обращение к которым происходит при помощи определенного свойства имеющего структуру массива. |
Цитата:
procedure TForm1.Button2Click(Sender: TObject); var x : TEdit; begin x := TEdit.Create(self); x.Name := 'Edit1'; x.Parent := self; end; procedure TForm1.Button3Click(Sender: TObject); begin TEdit(FindComponent('Edit1')).Text := 'I''ve found you!'; end; Еще раз повторяю: х - название переменной, а не компонента |
Цитата:
|
Цитата:
Edits : array of TEdit :confused: Я то подумал у тебя нестандартная задача, и предложил нестандартное решение ПС я программирую меньше года |
Цитата:
|
В случае с компонентами так и делают - создают массив, но мне интересно, делфи шпарит до посинения при нажатии на кнопку текстовые поля, какие тогда у них имена, как к ним обращаться? С массивом всегда успею сделать :)
|
Цитата:
Цитата:
есть переменная например edit делая так edit := TEdit.Create(self); ты создаешь компонент и эта переменная указыват на этот компонент. Если ты повторишь эту процедуру - создашь новый компонент и эта переменная будет указывать уже на новый, а старый "потеряется". Откуда дельфе знать, может тебе надоело это поле и ты решил его выкинуть? А вот Name - уникальное, дельфи не даст тебе создать 2 компонента с одним именем. Так что если не хочешь использовать массивы - делай через Name как я тебе написал. Все, вопросов после этого остаться не должно я думаю. |
Ну тут без создания массива. Создается лишь одна переменная типа TChildForm;
|
| Время: 02:38 |