SNK Software
Web Studio Монополия Metaproducts Утилиты Игры
Монополию Web Studio Библиотека
Вебмастер Дельфи Работа на ПК Самоучитель
Для PHP Для Delphi
Веб-дизайн Программирование Компьютеры Девайсы Заметки
SNK Software Индустрия hardware Индустрия software
О студии Портфолио Сопровождение сайтов

Новые материалы

Девайсы:
Сравнительный обзор Nokia Lumia 920 и HTC 8X
Девайсы:
Обзор Nokia Lumia 820 – смартфона на WP8
Вебмастеру:
Настройка Apache, PHP и MySQL для Linux-VPS
Вебмастеру:
VPS на домашнем ПК: настройка сети в VM VirtualBox и Debian
Вебмастеру:
VPS на домашнем ПК: устанавливаем Linux Debian 6
Вебмастеру:
VPS на домашнем ПК: установка VM VirtualBox
Работа на компьютере:
Иные возможности текстового процессора Word
Работа на компьютере:
Вставка объектов
Работа на компьютере:
Таблицы в Word
Работа на компьютере:
Печать и сохранение документов
Работа на компьютере:
Сноски, колонтитулы, оглавление и указатели в Word

Работа с VCL в среде Delphi

Изучив основы программирования в среде Delphi, включая даже такую область, как объектно-ориентированный подход, мы подошли к главной цели – вопросу быстрого создания приложений при помощи Delphi IDE и предоставляемых VCL компонент. Но прежде, чем исследовать сами компоненты, разберемся с вопросом их добавления и редактирования, а так же познакомимся поближе с фундаментом для размещения всех остальных компонент – классом TForm.

Работа с визуальным редактором

Когда вы только создаете новый проект в Delphi, вы сразу же получаете не только файл проекта, но и готовое к дальнейшему использованию окно программы. В терминологии Delphi это окно называется формой (form) и представляет собой основу, на которую помещаются все остальные компоненты приложения. Эта форма будет называться Form1, поскольку автоматическое наименование компонент в Delphi производится по принципу «название компонента + порядковый номер». Таким образом, для первого по счету компоненту типа Form мы получим название Form1. Кроме того, для компонент, имеющих текстовые подписи, включая ту же форму, это же название используется для свойства типа Caption или Text.

Чтобы поместить новый элемент интерфейса на поверхность формы, следует выбрать нужный компонент из палитры, щелкнув по нему мышкой, а затем щелкнуть по тому месту на форме, где этот компонент должен находиться по вашему замыслу. Например, если щелкнуть по компоненте Button (кнопка), находящейся на закладке Standard, а затем – по центру формы, то на форме появится кнопка, причем ее левый верхний угол будет, по возможности, находиться как раз в том месте, где был произведен щелчок мышкой (рис. 11.1).

Форма Delphi с помещенной на нее кнопкой
Рис. 11.1. Форма Delphi с помещенной на нее кнопкой

При этом появившийся на форме объект будет заключен в «рамку», обозначенную 8 черными квадратиками по углам и по серединным точкам сторон. Наличие такой рамки на объекте означает, что он в данный момент является выбранным для редактирования, и именно его свойства отображаются в данный момент в окне инспектора объектов.

Впрочем, эта рамка имеет еще одно предназначение: так, если потянуть за квадратик мышкой, то размер компонента будет изменен путем растягивания или сжатия в выбранном направлении. Переместить же компонент, можно просто перетащив его мышкой, подобно тому, как это делается с ярлыками на рабочем столе Windows. При этом «сетка», к которой привязываются компоненты, имеет размер 8 на 8 пикселей. Впрочем, при желании сетку можно перенастроить, или отключить вообще, для чего следует из меню Tools выбрать пункт Environment Options и установить нужные значения в группе Grid Options, находящейся на закладке Designer.

Но вернемся к тому, что можно сделать с компонентой при помощи инспектора объекта. Разумеется, учитывая то, что расположение компоненты на форме – не более, чем визуальное отображение свойств Left и Top, а ее размеры – свойств Height и Width, то, внося изменения в соответствующие поля инспектора объекта, можно добиться максимально точного расположения.

Вместе с тем, если компонент необходимо, скажем, отцентрировать по отношению к форме, или, что еще более актуально – выровнять интервалы между группой компонент, то можно воспользоваться утилитой выравнивания. Для этого следует щелкнуть по компоненте правой клавишей мышки и из контекстного меню выбрать пункт Position > Align, в результате чего откроется окно Alignment (рис. 11.2).

Выравнивание компонент в Delphi
Рис. 11.2. Выравнивание компонент

Выравнивать можно как по горизонтали, так и по вертикали. Допустим, если у нас имеется единственная кнопка, которую мы хотим поместить в центр окна, то следует выбрать пункты Center in window как для горизонтального (Horizontal), так и для вертикального (Vertical) выравнивания.

Теперь рассмотрим вариант, когда следует выровнять сразу несколько объектов. Для этого поместим на форму еще 2 кнопки, в произвольном месте. Затем следует выделить их. Сделать это можно двумя способами. В том случае, если форма пустая, а область, занимаемая нужными компонентами, не содержит других компонент (т.е. как в нашем случае), то достаточно охватить их общей рамкой при помощи мышки, нажав ее левую кнопку в одном углу группы (но не на области компонента), и протянув виртуальный прямоугольник до противоположного угла. Таким образом, все компоненты, попавшие хотя бы одним краем в такой прямоугольник, окажутся выделенными, что будет отмечено 4 серыми квадратиками по углам каждого компонента (рис. 11.3). Альтернативным способом является выбор компонент путем последовательного щелканья по ним мышкой при удерживаемой клавише Shift.

Выбранная группа компонент в Delphi
Рис. 11.3. Выбранная группа компонент

Когда выбрано несколько компонент, в инспекторе объектов отображаются только те свойства, которые можно изменить коллективно, для всех выбранных компонент сразу. Но если дело касается центрирования или взаимного выравнивания компонент, то лучше, опять-таки, обратиться к окну выравнивания. Так, чтобы выровнять все кнопки по центру формы по вертикали, а по горизонтали их сделать равноудаленными друг от друга, в окне выравнивания следует отметить Space equally в Horizontal и Center in window – в Vertical. В результате кнопки выстроятся в стройный ряд по середине окна (рис. 11.4).

Группа Delphi-компонент после выравнивания
Рис. 11.4. Группа компонент после выравнивания

С помощью другого инструмента – Size (размер) можно упорядочить размеры у группы элементов. Для вызова диалогового окна Size следует выбрать из контекстного меню пункт Position > Size, после чего можно будет изменять размеры по вертикали и горизонтали, приводя их к наибольшему или наименьшему общему, или же указывая размеры явно, в пикселях. Прочем, последнее можно сделать и из инспектора объектов, задав нужные значения для свойств Height и Width.

В остальном, правка свойств как отдельных компонент, так и их групп, производится путем установки соответствующих значений в окне инспектора объектов. Если при этом свойство отмечено значком «+», то это говорит о том, что оно составное, и для установки всех параметров следует сначала щелкнуть по этому значку, а затем выбрать значения во всех раскрывшихся полях. Что касается допустимых значений полей, то они так же определяются описанием класса данного компонента. При этом инспектор объекта, как правило, просто не допускает установки заведомо недопустимых значений. Так, для свойств булевского типа можно выбрать только True или False, а для полей перечисляемого типа будет приведен список с допустимыми значениями. Кроме того, для тех свойств, которые задаются, скажем, целыми числами, значениями, вы не сможете указать строку или вещественное число. Все это автоматически исключает целый ряд возможных ошибок.

СОВЕТ
Еще раз напомню, что нажатие на клавишу F1 в момент, когда курсор ввода находится на том или ином поле в инспекторе объектов, приводит к вызову справочной информации по данному свойству объекта.

Наконец, открою один маленький секрет: если произвести двойной щелчок по любому полю-списку, то будет выбрано следующее значение. Но если дважды щелкнуть по списку свойства Color, то откроется стандартное для Windows окно выбора цвета. Вместе с тем следует отметить, что такое поведение – открытие дополнительного окна редактирования – типично для тех свойств, которые имеют кнопку с многоточием, например, Font или Hint.

Формы в Delphi

Приложения, создаваемые в среде Delphi, как, впрочем, и любые другие Windows-программы, сосредоточены вокруг форм – окон приложения. К каждой форме в Delphi привязываются 2 файла. Один из них, с типичным для языка Pascal расширением pas, является программным модулем, описывающим класс формы и все ее компоненты. Другой файл, имеющий тип dfm, описывает расположение всех компонент на форме, их свойства, а так же параметры самой формы – т.е. все то, что можно настроить при помощи инспектора объектов. Это сделано, в том числе, с той целью, чтобы не загромождать сам код программы множеством определений различных свойств компонентов, относящихся к визуальному представлению. Файлы, содержащие описание форм и их компонентов, создаются и изменяются в полностью автоматическом режиме, в зависимости от того, какие действия были проделаны в визуальной среде с данной формой.

Тем не менее, посмотреть и даже отредактировать исходный код такого файла можно – для этого достаточно щелкнуть по форме правой клавишей мышки и выбрать из контекстного меню пункт View as text. Это приведет к тому, что окно с формой закроется, а в редактор кода вместо файла с программным кодом будет загружен объектный код, являющийся описанием формы со всеми ее свойствами, объектами и свойствами объектов. Вариант такого кода для формы с расположенной на ней кнопкой можно увидеть на листинге 11.1.

Листинг 11.1. Объектный файл формы

object Form1: TForm1 Left = 192 Top = 114 Width = 482 Height = 377 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 144 Top = 64 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 1 end end

Исследовав подобные файлы, можно убедиться, что в них сохраняются все параметры, необходимые визуальному объекту для представления. В частности, в них хранятся размеры, параметры шрифтов, цвета, тексты надписей и т.д. В том случае, если вы назначите какие-либо дополнительные свойства, в том числе обработчики событий, то они так же будут отображены в таком файле.

Что касается возможности правки, то сразу следует отметить, что добавлять новые объекты путем помещения их описания в объектный файл – не лучшая идея. В то же время, использовать правку формы в текстовом виде может быть удобно, например, в том случае, если требуется изменить, скажем, какое-нибудь слово, которое повторяется во многих текстовых подписях на одной форме, или же передвинуть ряд перекрывающих друг друга компонентов, и т.д.

При всем этом следует учитывать, что правка исходного текста должна производиться с максимальной осторожностью, поскольку в том случае, если вы случайно повредите структуру этого файла, то это приведет к невозможности вернуться к визуальному режиму и продолжить работу над программой, содержащей испорченный таким образом модуль. Собственно для того, чтобы вернуться к обычному, визуальному, режиму работы над формой, следует вновь воспользоваться контекстным меню, только на этот раз не формы, а редактора кода, и выбрать из него пункт View As Form, или же нажать Alt+F12.

Что касается другой составляющей формы – файла pas, который мы, собственно и видим в паре с ее визуальным представлением, то в нем хранится описание формы как класса, а так же подпрограмм, типов и переменных, не являющихся частью формы как таковой, но по тем или иным соображениям помещенных в данный файл. Применительно к той же самой форме, содержащей лишь одну простую кнопку, то pas-файл для нее будет выглядеть так, как представлено на листинге 11.2.

Листинг 11.2. Программный файл формы

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} end.

Мы видим, что модуль формы в части interface содержит включение целого ряда других модулей из библиотеки VCL, описание класса формы и глобальную переменную, представляющую собой форму как объект во время выполнения программы. В части implementation пока ничего нет, вернее, там имеется лишь ссылка на включение того самого объектного файла, который, с точки зрения Object Pascal, можно считать ни чем иным, как своеобразным конструктором формы.

Класс TForm

Итак, ключевую часть в программном модуле, описывающем то или иное окно приложения, является класс, описывающий это самое окно. Для форм в VCL, подобно другим компонентам, определен специальный класс – TForm. Однако следует учитывать, что на самом деле, класс TForm никогда напрямую не используется в приложениях: вместо него мы всегда будем работать с классами, порожденными на его основе. Дело в том, что формы всегда индивидуальны, ведь окна приложений содержат в себе другие элементы управления которые, в свою очередь, являются ни чем иным, как свойствами класса, описывающего форму. В частности, если вернуться к листингу 11.2, то видно, что форма в нем описывается как класс TForm1, а кнопка (Button1) является свойством этого класса. Если добавить к кнопке обработчик события (например, для OnClick), то этот обработчик автоматически получит имя Button1Click и будет определен как метод класса TForm1.

Разумеется, что при всем этом создаваемый класс, описывающий форму, унаследует все свойства и методы от базового класса TForm, который происходит от класса TCustomForm, добавляя к нему лишь методы, связанные с многооконным интерфейсом (MDI). Класс TCustomForm, в свою очередь, происходит от класса TScrollingWinControl, являющегося прямым потомком уже упоминавшегося ранее класса TWinControl, опять-таки, имеющего по отношению к своему родителю лишь одно глобальное отличие – возможность прокрутки содержимого. Учитывая все вышеизложенное, рассмотрим методы и свойства класса TCustomForm, которые достаточно часто используются применительно к создаваемым классам форм. В частности, среди методов следует отметить такие, как Close, Hide, Show, ShowModal, SetFocus и Release. Так, метод Close закрывает окно формы, но не удаляет ее из памяти. Правда, если это было единственным, или же главным окном приложения, то его закрытие приведет к завершению работы всего приложения.

ПРИМЕЧАНИЕ
Каждое приложение в Windows имеет главное окно. Если окно единственное, то оно и будет главным, в том же случае, когда окон несколько, главным назначается то, которое будет создано первым. Порядок создания окон можно посмотреть на закладке Forms окна свойств проекта (Project > Options), или же непосредственно в файле проекта. При необходимости этот порядок всегда можно изменить.

Методы Show и Hide делают окно видимым и невидимым, соответственно. А метод ShowModal делает окно не только видимым, но и единственным доступным для приложения, закрывая за собой все остальные окна – модальным. Типичный пример модального окна – диалог подтверждения при выходе из программы (рис11.5).

Типичный модальный диалог
Рис. 11.5. Типичный модальный диалог

Метод SetFocus устанавливает фокус ввода на тот или иной элемент управления, находящийся на форме. Ну и, наконец, метод Release является специализированным деструктором форм, т.е., если для обычных классов используется метод Destroy, а для компонент – Free, то для окон – Release.

Что касается свойств класса TForm, то все они являются унаследованными от родительских классов. Те их них, что принадлежат к еще не рассмотренному нами классу TCustomForm, представлены в таблице 11.1.

Таблица 11.1. Основные свойства класса TCustomForm
СвойствоОписание
Active Указывает, имеет ли в данный момент форма фокус ввода
ActiveControl Указывает на компонент, имеющий фокус ввода на форме
BorderIcons Определяет, какие кнопки должны быть на системном заголовке окна. Допустимые значения: biSystemMenu, biMinimize, biMaximize, biHelp
BorderStyle Определяет вид и возможности рамки окна. Допустимые значения: bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin
Canvas Предоставляет доступ к холсту окна
ClientHeight Указывает высоту клиентской части окна в пикселях (клиентская область исключает рамки, заголовок, полосы прокрутки и т.д.)
ClientRect Указывает габариты прямоугольника, образующего клиентскую часть окна
ClientWidth Указывает ширину клиентской части окна в пикселях
FormState Указывает на текущее состояние формы. Допустимые значения: fsCreating, fsVisible, fsShowing, fsModal, fsCreatedMDIChild, fsActivated
FormStyle Определяет тип формы. Допустимые значения: fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop
HelpFile Определяет файл справки, предназначенный для данной формы
Icon Определяет иконку формы
Menu Определяет компоненту-главное меню окна
ModalResult Используется для возвращения результата из модальных диалоговых окон
Position Определяет размеры и расположение окна. Допустимые значения: poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly, poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter
Visible Определяет, должно ли окно быть видимым
WindowState Определяет, в каком виде должно появиться окно на экране. Допустимые значения: wsNormal, wsMinimized, wsMaximized

ПРИМЕЧАНИЕ
Все свойства, связанные с отображением и типом формы, в частности, для рассматриваемых кнопок системного меню, а так же BorderStyle, FormStyle, Position, Visible и WindowState, проявляют себя только во время выполнения программы.

Еще одно важное замечание по свойству BorderIcons состоит в том, что на него имеет непосредственное влияние значение свойства BorderStyle. Например, кнопка контекстной справки (biHelp) будет видна только в том случае, если в качестве значения BorderStyle установлено bsDialog. Однако при этом кнопки сворачивания и разворачивания не будут отображены, вне зависимости от того, что установлено для них в свойстве BorderIcons. Ну а если свойство BorderStyle имеет значение bsNone, то вообще не только никаких кнопок, но и самого заголовка окна выведено не будет. В целом эффект установки значений для свойства BorderStyle и его воздействие на некоторые другие свойства формы, рассмотрены в таблице 11.2.

Таблица 11.2. Свойство BorderStyle
ЗначениеОписаниеВоздействие на другие свойства
bsNone Системный заголовок окна и рамка отсутствуют Установка BorderIcons не имеет смысла
bsSingle Одинарная рамка окна, не позволяющая изменять его размеры Для BorderIcons нельзя установить biHelp
bsSizeable Стандартное изменяемое окно Для BorderIcons нельзя установить biHelp
bsDialog Окно типа диалога. Рамка есть, но изменить размеры окна, свернуть его или развернуть нельзя Для BorderIcons нельзя установить biMinimize и biMaximize. Свойство MainMenu не имеет смысла
bsToolWindow Аналогично bsSingle, но с маленьким заголовком Отображается только кнопка закрытия окна
bsSizeToolWin Аналогично bsSizeable, но с маленьким заголовком Отображается только кнопка закрытия окна

Свойство Position отвечает за то, в каком месте экрана появится окно. Его возможные значения и их описания приведены в таблице 11.3.

Таблица 11.3. Свойство Position
ЗначениеОписание
poDesigned Окно появится на экране в том же месте и при тех же размерах, что во время разработки в среде Delphi
poDefault Размеры и расположение окна определяются операционной системой. При каждом запуске окно будет сдвигаться немного вниз и вправо
poDefaultPosOnly Расположение окна будет определяться операционной системой, а его размеры будут такими же, как во время разработки
poDefaultSizeOnly Размеры окна будет определяться операционной системой, а его расположение будет таким же, как во время разработки
poScreenCenter Размеры окна будут такими же, как при разработке, а его расположение будет выровнено по центру экрана
poDesktopCenter Аналогично psScreenCenter, но для приложений, рассчитанных на несколько экранов, выбор главного монитора не будет произведен
poMainFormCenter Размеры окна будут такими же, как при разработке, а его расположение будет выровнено по центру главного окна приложения. Данное значение используется только для вторичных форм приложения
poOwnerFormCenter Размеры окна будут такими же, как при разработке, а его расположение будет выровнено по центру окна-владельца, задаваемого при помощи свойства Owner

Еще одно свойство, отвечающее за появление окна на экране – WindowState - определяет, в каком состоянии оно должно появиться. При этом данное свойство действует «с оглядкой» на BorderStyle: если при выбранном для BorderStyle значении окно не может быть свернуто или развернуто, то установка соответствующих значений для WindowState так же не возымеет силы.

Наконец, такие свойства, как Active, ActiveControl и FormState, являются доступными только во время выполнения программы и могут быть использованы для определения текущего состояния окна.

Приложения SDI и MDI

При рассмотрении класса TForm мы намеренно опустили ряд свойств и методов, относящихся к многодокументному интерфейсу приложения. Дело в том, что прежде следует разобраться с самими принципами построение интерфейса приложений в ОС Windows.

Исторически сложилось так, что все Windows-приложения классифицируются по двум типам организации оконного интерфейса – SDI (Single Document Interface – однодокументный интерфейс) и MDI (Multiple Document Interface – многодокументный интерфейс). Во времена Windows 3.x Microsoft продвигала многодокументные версии приложений (начиная от диспетчера программ Windows и заканчивая офисными программами, например, Word for Windows). Но с момента появления Windows 95 сначала Microsoft, а затем и другие разработчики стали все чаще склоняться к однодокументной компоновке программ. Судя по всему, это было вызвано тем, что неподготовленному пользователю сложнее разобраться с «окнами в окнах» в стиле MDI. Вместе с тем, оба подхода к организации приложения имеют право на существование, поэтому рассмотрим вопросы организации MDI-приложений.

Итак, программы с однодокументным интерфейсом имеют одно или несколько окон, которые можно перемещать, открывать и закрывать вне зависимости друг от друга. Большинство современных приложений (скажем, Delphi) реализуют SDI-интерфейс: вы можете открыть несколько документов, при этом каждый из них будет находиться в отдельном, вполне самостоятельном окне.

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

В Delphi поддерживаются оба типа приложений, причем если по умолчанию создаются SDI-программы, то для создания MDI-приложения можно либо использовать заготовку, либо сделать главную (первую) форму приложения MDI-контейнером. Первый способ кажется быстрее: достаточно в меню File > New выбрать пункт Other, а в группе Projects открывшегося окна New Items щелкнуть по MDI Application и выбрать расположение проекта на диске. Результатом будет загрузка в рабочую среду Delphi нового приложения на основе шаблона многодокументного интерфейса, подготовленного специалистами Borland.

В итоге мы получим почти полноценное MDI-приложение, которое умеет создавать новые окна для своих «документов», открывать в них текстовые файлы и закрывать их, а так же упорядоченно размещать все дочерние окна в своей рабочей области (рис. 11.6). Фактически, приложив совсем немного усилий, на основе этой заготовки можно (но, откровенно говоря, вряд ли действительно не нужно!) создать очередной «улучшенный» вариант Блокнота (notepad.exe) на основе многодокументного интерфейса.

Приложение с MDI на основе шаблона Delphi
Рис. 11.6. Приложение с MDI на основе шаблона Delphi

Другой способ создать MDI-приложение заключается в том, что потребуется установить свойство FormStyle главного окна приложения в fsMDIForm. После этого можно создать еще одну форму (File > New > Form) и для нее установить это же свойство в значение fsMDIChild. Таким образом, первая форма станет главным окном, или MDI-контейнером, а вторая – дочерним окном.

Помимо свойства FormStyle, за реализацию MDI отвечают еще несколько свойств и методов класса TForm. Среди свойств это ActiveMDIChild, указывающее, какое из дочерних окон имеет фокус ввода, MDIChildCount, указывающее на количество открытых дочерних форм, а так же MDIChildren, предоставляющий доступ ко всем дочерним окнам. Последнее свойство представляет собой массив, ссылающийся на все дочерние окна, первое из них имеет индекс 0, а последнее – на единицу меньшее, чем их общее количество (т.е. MDIChildCount-1).

Кроме того, есть еще одно свойство – TileMode, определяющее, каким образом окна должны быть расположены при вызове метода Tile. Это свойство может принимать значения tbHorizontal – для горизонтального размещения, и tbVertical – для вертикального. Сам метод Tile, соответственно, используется для размещения дочерних окон в родительском на основе значения, заданного для свойства TileMode.

Другие методы формы, относящиеся к MDI-приложениям, это ArrangeIcons, Cascade, Next и Previous. Метод ArrangeIcons позволяет упорядочить все свернутые окна так, чтобы они расположились в линии и не перекрывали друг друга. Метод Cascade, наоборот, действует на раскрытые окна: обращение к этому методу расставляет окна каскадом, одно за другим со смещением вниз и влево (см. рис. 11.6). Что касается методов Next и Previous, то они, соответственно, позволяют переключаться к следующему и предыдущему дочернему окну.

При разработке MDI-приложений следует учитывать, что рабочая область главного окна не должна «загромождаться» какими-либо элементами управления. Единственное, что можно на нем разместить – это главное меню и инструментальную панель. Что касается дочерних окон, то на них, наоборот, не желательно иметь ни того, ни другого.

Избранное

SNK GSCP
SNK GSCP - новая библиотека для PHP 5!
Web Studio
Web Studio и Visual Workshop
Библиотека:
Стандарты на web-технологии
Монополия
Монополия Android
Загрузки:
скачать программы
Продукция:
программы и книги
Техподдержка / Связаться с нами
Copyright © 1999-2020 SNK. Все права защищены.
При использовании материалов с сайта ссылка на источник обязательна.
Рейтинг@Mail.ru