Урок 13 - Жизнь и смерть в режиме RunTime на KOLDelphi , Технологии , KOL и MCKУрок 13 - Жизнь и смерть в режиме RunTime на KOL
Ведущий раздела 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 прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |