![]() |
![]() ![]() ![]() ![]() |
|
Урок 13 - Жизнь и смерть в режиме RunTime на KOLDelphi , Технологии , KOL и MCK
Ведущий раздела KOL и MCK: Анатолий aka XVeL Полную версию библиотеки KOL и MCK можно скачать здесь. 13 урок... Если вы суеверный можете не читать :) В этом разделе у нас будет немного мистики и чертовщины (Кнопки и прочие контролы интерфейса будут возникать и пропадать неоткуда). В общем если вы немного Гарри Потерр данный монолог будет вам интересен :) В форуме уже звучали вопросы про "динамическое" создание кнопок. Если
ваш проект на VCL то глоток знаний по данному вопросу можно получить на
сайте Королевство DELPHI в статья "Жизнь и смерть в режиме run-time" (надеюсь автор статьи
не обвинит меня в плагиате).
При создание объекта на уже работающем окне вам кроме обычного
конструктора надо сделать обращение к CreateWindow. // form - родительский объект на котором создается контрол NewBigButton := NewButton(form, 'КНОПКА'); NewBigButton.CreateWindow; Если все нормально CreateWindow возвращает true. Так что если вы "правильный" программист неплохо бы эту функцию вызывать c проверкой через IF. "Родительский" объект "нумерует" все объекты которые вы создаете на
нем. var i: Integer; ... // form - родительский объект NewBigButton := NewButton(form, 'КНОПКА'); NewBigButton.CreateWindow; i := form.ChildIndex(NewBigButton); // получаем номер объекта form.Children(i).caption := ' Это кнопка'; // обращаемся к тому же NewBigButton
Наверное у некоторых читателей может возникнуть вопрос: к чему мне все
эти "номера дочерних объектов"?
program Primer13;
uses
kol,
messages,
windows;
{$R *.RES}
var
form, butNewElement, lebDel, edNoDel, butDelElement, gb,
rbButton, rbEditBox, rbRadioBox, rbCheckBox: pControl;
new: pControl;
Nomer: integer;
const
cButton = 1;
cEditBox = 2;
cRadioBox = 3;
cCheckBox = 4;
procedure ClickElemet(Dummy: Pointer; Sender: PControl);
begin
case Sender.Tag of
cButton: ShowMessage('Нажата кнопка - № ' + Int2Str(form.ChildIndex(Sender)));
cRadioBox: ShowMessage('Нажата RadioBox - № ' + Int2Str(form.ChildIndex(Sender)));
cCheckBox: ShowMessage('Нажат CheckBox - № ' + Int2Str(form.ChildIndex(Sender)));
end; {case}
end;
procedure ClickButMakeButton(Dummy: Pointer; Sender: PControl);
begin
// Фактически самая главная функция.
// В зависимости от того какой RadioBox выбран создаем
// определенного вида объект
if rbButton.Checked then
begin
new := NewButton(form, '');
new.Width := 100;
new.Caption := 'Button №' + int2Str(form.ChildIndex(new));
new.Tag := cButton;
end
else
if rbEditBox.Checked then
begin
new := NewEditBox(form, []);
new.Text := 'EditBox №' + int2Str(form.ChildIndex(new));
new.Tag := cEditBox;
end
else
if rbRadioBox.Checked then
begin
new := NewRadioBox(form, '');
new.Caption := 'RadioBox №' + int2Str(form.ChildIndex(new));
new.Width := 100;
new.Tag := cRadioBox;
end
else
if rbCheckBox.Checked then
begin
new := NewCheckBox(form, '');
new.caption := 'CheckBox №' + int2Str(form.ChildIndex(new));
new.Width := 100;
new.Tag := cCheckBox;
end;
new.CreateWindow;
// ------- располагаем по красивее новый контрол -------
new.Left := 10;
inc(Nomer);
// так как все 4 элемента имеют одинаковую высоту...
new.Top := Nomer * new.Height;
// ------------------------------------------------------
new.OnClick := TOnEvent(MakeMethod(nil, @ClickElemet));
end;
//////////////////////////////////////////////////////////////////////////
procedure ClickDelElemet(Dummy: Pointer; Sender: PControl);
begin
form.Children[Str2Int(edNoDel.Text)].free;
end;
//////////////////////////////////////////////////////////////////////////
begin
Applet := NewApplet('RunTime');
Applet.Font.FontName := 'Arial';
Applet.Font.FontWidth := 15;
form := NewForm(Applet, 'Создание в режиме RunTime элементов интерфейса').SetSize(600, 450);
form.CenterOnParent;
//--------------------------- рисуем интерфейс ---------------------------
gb := NewGroupBox(form, 'Выберите').SetAlign(caRight);
gb.Width := 100;
rbButton := NewRadioBox(gb, 'Button').SetAlign(caTop);
rbEditBox := NewRadioBox(gb, 'EditBox').SetAlign(caTop);
rbRadioBox := NewRadioBox(gb, 'RadioBox').SetAlign(caTop);
rbCheckBox := NewRadioBox(gb, 'CheckBox').SetAlign(caTop);
// главная кнопка
butNewElement := NewButton(gb, 'Создать');
butNewElement.Width := 110;
butNewElement.Align := caTop;
butNewElement.OnClick := TOnEvent(MakeMethod(nil, @ClickButMakeButton));
butDelElement := NewButton(gb, 'Удалить').SetAlign(caBottom);
butDelElement.OnClick := TOnEvent(MakeMethod(nil, @ClickDelElemet));
edNoDel := NewEditBox(gb, []).SetAlign(caBottom);
edNoDel.Text := '1';
lebDel := NewWordWrapLabel(gb, 'Номер удаляемого элемента').SetAlign(caBottom);
//------------------------------------------------------------------------
run(Applet);
end.
Размер кода 3,3 Кб. Размер программы 31,5 Кб (без сжатия
и замены модулей). На экране увидите Вы примерно следующее:
P.S. В этом уроке на KOL рассматриваются вопросы создания и управления визуальными объектами в режиме runtime, а также использование свойств Tag и ChildIndex для присвоения имён и идентификации дочерних объектов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||