Как ни странно, но для того только, чтоб вывести пустое окно нам потребуется совершить довольно много действий. А именно:
- Написать оконную функцию минимального вида.
- Сформировать и зарегистрировать в системе собственный оконный класс.
- Создать окно и организовать цикл обработки сообщений.
Такая конструкция возникает от того, что программа для Win32 — это по сути набор окон, которые общаются друг с другом и с операционной системой посредством сообщений. Оконная функция — это и есть функция обработки сообщений.
1.1 Оконная функция
Минимальная оконная функция будет иметь следующий вид:
Рассмотрим аргументы:
Возвращаемое значение зависит от переданного сообщения. В большинстве случаев можно возвращать 0, как указание на то, что никакие дополнительные действия не потребуются.
Следует обратить внимание на тип вызова функции — stdcall . На данный момент Free Pascal использует такое соглашение о вызове по умолчанию, однако для надежности и во избежание возможных проблем в дальнейшем, я бы рекомендовал указывать его явно — как в данном примере. Напомню, что соглашение о вызове stdcall предполагает, что параметры передаются в стек справа налево, а очищает стек вызываемая подпрограмма.
Lazarus Установка и настройка Pascal в Windows. Одно окно
Итак, что мы делаем в теле функции? Во-первых, указываем умолчательный возврат нуля. В нашем простом случае, конечно, можно его прописать и в обработке конкретного сообщения, пока оно одно, но когда нам придется обрабатывать десятки (а то и больше) сообщений, для большинства из которых нормальное выполнение должно возвращать 0, привычка устанавливать его в самом начале лишней не будет.
Затем, оператор case разбирает сообщения. В данном примере, поскольку мы хотим получить простейшее окно без каких-либо полезных действий, почти все сообщения предоставим обработке по умолчанию. Такую обработку и выполняет функция DefWindowProc() , аргументы которой (и возвращаемое значение тоже) соответствуют аргументам оконной функции. DefWindowProc() объявлена в модуле Windows .
Единственное сообщение, которое нам требуется обрабатывать — WM_DESTROY , которое система посылает при закрытии окна. Дело в том, что нам требуется закончить работу программы, получив это сообщение, тогда как обработка по умолчанию не предполагает этого. Очевидно потому, что окно в общем случае может быть и не одно.
Мы же вызываем функцию PostQuitMessage() , которая устанавливает в очередь сообщений приложения сообщение WM_QUIT , по которому в дальнейшем мы должны прекратить цикл обработки сообщений и выйти из программы. Аргументом PostQuitMessage() является код возврата приложения. По традиции нулевое значение кода возврата означает нормальное завершение.
Замечательно — минимальную оконную функцию, которая нам когда-нибудь послужит каркасом для более сложных, мы написали. Что теперь с ней делать?
1.2 Класс окна
Займемся определением класса окна. По сути — это набор некоторых атрибутов, которые будут одинаковы для всех окон данного типа. Например, вышеупомянутая оконная функция определяет одинаковую реакцию на сообщения.
Free Pascal | Free Vision — создание диалогового окна.
Следующий код реализует создание нового класса окна:
Итак, по порядку:
Константа CN_MAIN — это имя класса. Поскольку в дальнейшем, когда класс зарегистрирован, мы будем обращаться к оконному классу сугубо по этому имени, вынос его в константу позволит нам избежать ошибок, связанных с мелкими опечатками, точнее — обнаруживать их на этапе компиляции, а не выполнения.
Переменная WndClass используется для того, чтобы создать в динамической памяти структуру, описывающую класс. Мы используем структуру типа TWndClassEx , хотя можно было бы и удовлетвориться TWndClass . Однако, варианты без Ex — это наследие Win16, и лучше отучаться (или не приучаться) их использовать. Хотя в данном случае — разница между TWndClassEx и TWndClass всего в одном поле — hIconSm , которое к тому же в настоящем примере мы просто зануляем.
Вначале мы выделяем память под структуру ( new ), а в конце ее освобождаем ( dispose ), поскольку после того, как класс зарегистрирован, нужда в ней отпадает.
Рассмотрим поля структуры:
- cbSize — целое число, определяющее размер структуры.
- style — стиль класса, образуется побитовым сложением различных флагов. В настоящем примере мы указали флаги CS_DBLCLKS , CS_HREDRAW , CS_OWNDC и CS_VREDRAW . Впрочем, на этапе минимальной и примитивнейшей программы, которую мы создаем, можно было и 0 поставить. Эти же флаги применимы в большинстве случаев, и мы их использовали скорее в шаблонных, чем в конкретных целях. Тем не менее — стоит пояснить их значения:
- CS_DBLCLKS — определяет, будут ли окна данного класса получать сообщения о двойном щелчке мыши. Если данный флаг не указан, то для определения двойного щелчка придется анализировать интервал и расстояние между одиночными, что, согласитесь, менее удобно.
- CS_HREDRAW и CS_VREDRAW — определяют, нуждается ли окно в перерисовке при изменении его горизонтальных и вертикальных, соответственно, размеров.
- CS_OWNDC — означает, что каждое окно использует свой собственный графический контекст для рисования, а не контест родительского окна или общий для всех окон класса.
Заполнив все поля мы передаем структуру функции RegisterClassEx() . Если бы мы использовали старую версию структуры — TWndClass , то и функцию бы взяли RegisterClass() . RegisterClassEx() возвращает специальное значение — атом, соответствующий нашему классу, если регистрация прошла успешно. В противном случае возвращаемое значение — 0, что мы и проверяем.
Открыть второе окно с кнопками — PascalABC.NET
Требуется в процедуре Myclick, чтобы выходило второе окно, в котором будут выведены результаты x1,x2,x3 и добавлено 3 кнопки (например «Вывести результаты расчета x1») Возожно ли это и что означает строчка
tb.Dock := DockStyle.Fill;
uses System.Windows.Forms, System.Drawing; uses FormsABC; type MyForm = System.Windows.Forms.Form; var I_boolean=false; s := new RealField(‘Введите исх. данные’); f1 := new FlowBreak; ok := new Button (‘Сделать расчет’); tb: TextBox; function CalcIntegral(s: real); begin x1:=s+1; x2:=s+3; x3:=s+4; end; procedure MyClick; begin var res := CalcIntegral(s.Value); tb.Text:=»; tb.AddLine(Format(‘Ответ: ‘, x1)); end; procedure InitControls; begin MainForm.Title := ‘Расчет’; MainForm.SetSize(700, 450); MainForm.CenterOnScreen; mainPanel.Dock := DockStyle.Left; mainPanel.Width := 150; ok.Click += MyClick; ParentControl := MainForm; tb := new TextBox; tb.Dock := DockStyle.Fill; end; begin InitControls; end.
Код к задаче: «Открыть второе окно с кнопками»
Листинг программы
procedure MyClick; begin var SecondForm := new Form; SecondForm.ClientSize := new System.Drawing.Size(200, 100); var b1 := new System.Windows.Forms.Button; b1.Text := ‘x1’; b1.Bounds := new System.Drawing.Rectangle(10, 50, 50, 20); var b2 := new System.Windows.Forms.Button; b2.Text := ‘x2’; b2.Bounds := new System.Drawing.Rectangle(70, 50, 50, 20); var b3 := new System.Windows.Forms.Button; b3.Text := ‘x3’; b3.Bounds := new System.Drawing.Rectangle(130, 50, 50, 20); var box := new System.Windows.Forms.TextBox; box.Dock := DockStyle.Top; SecondForm.Controls.Add(b1); SecondForm.Controls.Add(b2); SecondForm.Controls.Add(b3); SecondForm.Controls.Add(box); var res := CalcIntegral(s.Value); tb.Text:=»; tb.AddLine(Format(‘Ответ: ‘, x1)); SecondForm.ShowDialog; end;
Источник: studassistent.ru
Как открыть новое окно программы паскаль
Страницы
Горячие клавиши в среде программирования Free Pascal
Скорость выполнения поставленной задачи очень часто зависит от использования горячих клавиш. Основные горячие клавиши и их назначение:
Меню File
New Новый Открывает новое пустое окно в редакторе.
Open (F3) Открыть Вызывает диалог выбора файла и открывает выбранный файл в новом окне редактора.
Save (F2) Сохранить Сохраняет содержимое окна редактора в текущий файл. Если текущее окно еще не связано с файлом, то будет вызвано диалоговое окно для ввода имени файла.
Save as Сохранить как… Вызывает диалоговое окно для ввода имени файла. Текущее содержимое окна будет сохранено в указанный файл.
Change dir Сменить каталог Вызывает диалоговое окно для выбора каталога. Текущий рабочий каталог будет заменен на выбранную директорию.
Exit (ALT-X) Выход
Меню Edit
Undo (ALT-BKSP) Отмена Отменяет последнее действие, выполненное в редакторе
Redo Возврат Повторяет последнее действие, которое было отменено командой Undo. Эта команда может вернуть множество отмененных действий.
Cut (SHIFT-DEL) Вырезать Удаляет выделенный в окне текст и копирует его в буфер обмена.
Copy (CTRL-INS) Копировать Копирует текущее выделение в буфер обмена.
Paste (SHIFT-INS) Вставить Вставляет содержимое буфера обмена в текст, начиная с позиции курсора. Show clipboard Показать буфер обмена Открывает окно, где отображается текущее содержимое буфера обмена.
Copy to Windows Копировать в Windows Копирует выделение в буфер обмена Windows.
Paste from Windows Вставить из Windows Вставляет содержимое буфера обмена Windows (если он содержит текст) в окно редактора исходного кода в текущую позицию курсора.
Меню Run
Run (CTRL-F9) Пуск Если компиляция завершена без ошибок, то выполняется пуск программы.
Step over (F8) Пошаговое выполнение. Выполняет пошаговое выполнение программы, то есть при выборе этой команды выполняется текущая строка в исходном коде программы.
Goto cursor (F4) Перейти к курсору Запускает и выполняет программу до того места, где в исходном коде находится курсор.
Parameters Параметры Позволяет ввести параметры, которые будут переданы в программу в начале выполнения.
Program reset (CTRL-F2) Сброс программы. Если программа находится в режиме отладки, то сеанс отладки завершается, а запущенная программа принудительно закрывается. Может оказаться полезным при зависании программы.
Меню Compile
Compile (ALT-F9) Компиляция Компилирует содержимое активного окна.
Меню Debug
User screen (ALT-F5) Экран пользователя Позволяет переключаться между экраном программы и окном редактора.
Add watch (CTRL-F7) Добавить элемент наблюдения Добавляет элемент (например, переменную) в список отслеживания.
Watches Список отслеживания Отображает текущий список отслеживания значений в отдельном окне.
Breakpoint (CTRL-F8) Точка останова Устанавливает точку останова на текущей строке. В процессе отладки программа будет остановлена на этой точке.
Источник: informatikaschool10.blogspot.com