Простой пример работы с DFL2

После установки DFL2 и Entice Designer (а возможно и Resource Builder) некоторым людям сразу захотелось попробовать начать работу и написать что-нибудь простенькое (или не очень), но как всегда бывает, очень трудно начать (да и лень многим смотреть исходный код самой библиотеки или хотя бы примеры), а очень хочется сделать хоть что-то своими руками.

В помощь таким людям, я покажу очень простое и вместе с тем абсолютно бесполезное приложение, которое действительно работает, а вместе с тем иллюстрирует простоту обращения с графической библиотекой DFL2: я подробно расскажу о том, как сделать простейшую программку, которая изменит заголовок окна по нажатию на кнопку (текст для заголовка будет взят из текстового поля формы), а заодно расскажу о некоторых деталях, которые помогут начать работу по написанию собственных программ и дам несколько советов по упрощению кода, путем исправления некоторых его элементов сгенерированных Entice Designer.

Начнем с того, что откроем Entice и создадим новую пустую форму, и назовем проект Exp0 (это сокращение от «Experiment0», или нулевой эксперимент).

Когда форма появится, необходимо слегка ее настроить, для чего воспользуемся правой панелью, на которой перечислены свойства формы в алфавитном порядке. первое свойство, которое придется изменить, это свойство height (ширина): выставляем значение этому свойству равное 128. Затем, продолжая манипулировать, геометрическими размерами окна, зададим свойство width (длина), присвоив ему значение равное 296.

На этом настройки размеров окна закончены, однако, стоит обратить еще на ряд свойств самой формы. Одно из таких свойств — свойство text, которое определяет надпись (заголовок окна) на окне, пока мы просто его поставим равным Exp 0. Теперь, нас заинтересуют два свойства, управляющие поведением окна: maximizeBox и minimazeBox, которые определяют, соответственно, разворачивается ли окно на весь экран или сворачивается ли окно в панель задач. Первое свойство мы выставим в false, нажав на кнопку напротив текущего значения, тем самым запретив развертку окна на полный экран, а второе свойство выставим в true, разрешая свертку окна.

Размеры окна мы задали, однако, ничто не помешает изменить размеры, если пользователь решит потянуть окно за его правый нижний угол. Такое поведение нам нежелательно, ведь тогда форма будет выглядеть очень некрасиво.

Для того, чтобы исключить изменение размеров окна, изменим свойство formBorderStyle, выбрав из выпадающего списка параметров, вариант FIXED_SINGLE.

На этом настройка формы завершена окончательно и теперь нам необходимо разместить элементы управления, выбрав их из имеющихся в дизайнере компонентов.

Первым элементом управления над которым мы будем издеваться, будет текстовое поле, которое можно добавить выбрав компонент TextBox на панели инструментов ToolBox. Размещаем элемент на форме и, в принципе, все уже готово, однако, иногда с помощью ручного размещения поместить элемент управления так «как надо» на форму не удается, но нас всегда могут выручить два свойства: left и top, определяющие, соответственно, величину отступа от левого края формы (или от левого края другого элемента управления, если вдруг один из элементов помещен в другой) и величину отступа от верхнего элемента (наверное, такая формулировка не очень понятна, если это так, то представьте, что left — это координата x в пикселях, а top — координата y в пикселях).

В нашем проекте, эти свойства принимают значения 8 и 24. Также как и форма, большинство элементов управления обладают свойствами height и width и текстовое поле не исключение: для нашего текстового поля, значения этих свойств равны 24 и 256. Кроме того, текстовое поле обладает и свойством text, которое поставим равным фразе «Нажмите на кнопку, чтобы изменить заголовок.», советую обратить внимание на это свойство, так как мы вернемся к нему позже.

Далее, под текстовым полем размещаем кнопку (Button) длиной 144 и шириной 23 (координаты левого верхнего угла, соответствующие уже рассмотренным свойствам, 120 и 56) с надписью «Изменить заголовок окна».

Вот и все: на этом дизайн закончен и переходим к программированию.

Сначала, как уже было сказано в предыдущих статьях, заменяем процедуру main сгенерированную Entice и добавляем вот такой метод в класс главной формы (он же — обработчик события «нажатие на кнопку»):

private void onChangeCaption(Object sender, EventArgs ea)
{
    	this.text = textBox1.text;
}

который будет обрабатывать нажатие на кнопку.

Как это работает? При нажатии на кнопку, возникнет некоторое событие (в DFL2 оно соответствует onClick) — и вызовет срабатывание метода OnChangeCaption в которое, в качестве аргументов, передадутся ссылка на объект (sender), вызвавший событие, и некоторые параметры самого события (ea). В данном случае, поскольку нам не нужна никакая информация ни об объекте, вызвавшем срабатывание, ни детали самого события, то мы их попросту игнорируем (надо заметить, что сигнатура нашего метода универсальна для большинства обработчиков событий элементов управления) и переносим значение свойства text из текстового поля (т.е. написанный в этом поле текст) в свойство text формы (т.е. надпись на окне).

Но, если скомпилировать текущий код, то не произойдет ровным счетом ничего — изменение заголовка при нажатии на кнопку не произойдет. Почему?

Дело в том, что написав обработчик нажатия на кнопку, мы не привязали его к нашей кнопке (действительно, если обработчик не привязан к кнопке, откуда компилятор узнает о том, что изменения сработают по нажатию на кнопку, а не по нажатию на что-то еще ?).

Чтобы привязать обработчик к щелчку мыши на кнопке, необходимо в секцию кода, сгенерированного Entice и описывающую свойства кнопки, добавить вот такой код:

button1.click ~= &onChangeCaption;

который добавляет обработчик события, разыменовывая указатель на обработчик.

В результате всех манипуляций, получаем следующий код приложения:

/*
	Generated by Entice Designer
	Entice Designer written by Christopher E. Miller
	www.dprogramming.com/entice.php
*/

import dfl.all;


class Exp0: dfl.form.Form
{
	// Do not modify or move this block of variables.
	//~Entice Designer variables begin here.
	dfl.textbox.TextBox textBox1;
	dfl.button.Button button1;
	//~Entice Designer variables end here.
	
	
	this()
	{
		initializeExp0();
		
		//@  Other Exp0 initialization code here.
		
	}
	
	
	private void initializeExp0()
	{
		// Do not manually modify this function.
		//~Entice Designer 0.8.5.02 code begins here.
		//~DFL Form
		formBorderStyle = dfl.all.FormBorderStyle.FIXED_SINGLE;
		maximizeBox = false;
		text = "Exp 0";
		clientSize = dfl.all.Size(290, 100);
		//~DFL dfl.textbox.TextBox=textBox1
		textBox1 = new dfl.textbox.TextBox();
		textBox1.name = "textBox1";
		textBox1.text = "Нажми кнопку, чтобы изменить заголовок окна";
		textBox1.bounds = dfl.all.Rect(8, 24, 256, 24);
		textBox1.parent = this;
		//~DFL dfl.button.Button=button1
		button1 = new dfl.button.Button();
		button1.name = "button1";
		button1.text = "Изменить заголовок окна";
		button1.bounds = dfl.all.Rect(120, 56, 144, 23);
		button1.parent = this;
		button1.click ~= &onChangeCaption;
		//~Entice Designer 0.8.5.02 code ends here.
	}
	
	private void onChangeCaption(Object sender, EventArgs ea)
    {
    	this.text = textBox1.text;
    }
}


int main()
{
	int result = 0;
	
	try
	{
		// Application initialization code here.
		
		Application.enableVisualStyles();
		Application.run(new Exp0);
	}
	catch(DflThrowable o)
	{
		msgBox(o.toString(), "Fatal Error", MsgBoxButtons.OK, MsgBoxIcon.ERROR);
		
		result = 1;
	}
	
	return result;
}

Скомпилировав, получаем:

res_0_o

В принципе это все, но я все же хочу обратить внимание на некоторые моменты, связанные с разработкой и дизайном графических приложений…

Первое, что я хотел бы сказать, Entice Designer, несмотря на то, что русские надписи могут использоваться в дизайне формы, не поддерживает непосредственных включений русских символов в код программы, иными словами, находясь внутри редактора кода Entice вы не можете добавлять в код комментарии или строки на русском языке, но тем не менее, если в форме присутствуют такие надписи, то они без проблем отображаются в редакторе кода. Однако, этот момент можно обойти: используйте CodeBlocks или другую IDE совместно с Entice — внеся русские комментарии из таких IDE и сохранив их в файле, можно добиться того, что открыв файл в Entice вы увидите свои комментарии без кракозябр.

Второй момент заключается в том, что сгенерированный дизайнером код можно (и нужно) значительно улучшить. Старайтесь всегда исправлять секцию описания компонентов, добавляя перед такой секцией слово private и тем самым скрывая эти элементы от доступа извне — это поможет сберечь вам усилия и нервы, особенно если вы разрабатываете приложение не один. Перед идентификатором каждого компонента, помещенного в private секцию, я рекомендую ставить знак подчеркивания, как бы выделяя особый статус таких идентификаторов в программе — эта рекомендация позволит вам более четко структурировать код и сделать компоненты более заметными визуально.

Если применить эти рекомендации, то фрагмент кода:

dfl.textbox.TextBox textBox1;
dfl.button.Button button1;

преобразуется в:

private:
	dfl.textbox.TextBox    _textBox1;
	dfl.button.Button      _button1;

что выглядит гораздо более понимаемо и структурированно.

Третье замечание состоит в том, что описание свойств в виде <переменная компонента>.<свойство> хотя и удобна, но все-таки достаточно огромна, особенно если графический интерфейс делается вручную или таких описаний очень много. Для того, чтобы избавить себя от мучительного копирования описаний свойств, нужно воспользоваться замечательной конструкцией языка D — конструкцией with, которая раскрывает область видимости некоторой структуры или некоторого класса в своем блоке, давая возможность обращаться к полям структуры или членам класса без упоминания самого имени структуры или класса.

Вот небольшой пример — код вида:

button1 = new dfl.button.Button();
		button1.name = "button1";
		button1.text = "Изменить заголовок окна";
		button1.bounds = dfl.all.Rect(120, 56, 144, 23);
		button1.parent = this;
		button1.click ~= &onChangeCaption;

легко преобразуется в более понимаемую форму с with:

with(_button1 = new dfl.button.Button)
{
		name = "button1";
		text = "Изменить заголовок окна";
		bounds = dfl.all.Rect(120, 56, 144, 23);
		parent = this;
		click ~= &onChangeCaption;
}

Удобно, не правда ли?

Несмотря на удобство, использование with может вас сильно огорчить: поменяв код дизайнера на блоки with, вы сделаете так, что изменения параметров формы или ее элементов не отразятся на файле кода. Из-за этой особенности самого дизайнера, я рекомендую применять такое преобразования кода только после того, как дизайн приложения будет окончательно закончен.

Вот собственно и все, аккуратно работайте с Entice и не забывайте рекомендации.

aquaratixc

Программист-самоучка и программист-любитель

Добавить комментарий