delphi добавить форму в проект

BestProg

Создание новой формы и подключение ее к главной форме программы

Содержание

Условие задачи

Нужно к главной форме Form1 добавить новую форму Form2 в приложении.

В главной форме Form1 :

В новой форме Form2 :

01 02 00 004 01r

Рис. 1. Схема взаимодействия между формами

Выполнение

1. Запустить Embarcadero Delphi 2010. Создать проект по шаблону VCL Forms Application

Сохранить проект и главную форму с именем «MainForm» в некоторую папку. Автоматически главной форме присваивается имя Form1 (свойство Name в Object Inspector ).

2. Проектирование главной формы Form1

Главная форма проекта имеет вид, изображенный на рисунке 2.

01 02 00 004 02

Рис. 2. Главная форма Form1

3. Добавление новой формы в проект

Новая форма в проект добавляется путем вызова последовательности комманд (рис. 3):

01 02 00 004 03

Рис. 3. Добавление новой формы в проект

В результате, на экране появится новая пустая форма (рис. 4). Получить доступ к свойствам и методам (процедурам и функциям) этой формы можно с помощью имени Form2 по умолчанию.

01 02 00 004 04

Рис. 4. Новосозданная форма с именем Form2

Сохранить новую форму в файле можно с помощью команды

Таким образом, имеем две формы с такими же именами в программе (свойство «Name» ):

4. Настройка вида новой формы

Для настройки корректного вида новой формы ( Form2 ) выполняем следующие действия.

После внесенных изменений и корректировки положения компонент на форме Form2 окно новой формы будет иметь приблизительно такой вид как изображено на рис. 5.

01 02 00 004 05

Рис. 5. Вид дочерней формы после корректировки

5. Подключение формы 2 к модулю формы 1
6. Вызов дочерней формы из главной формы

Для вызова дочерней формы (Form2) программируем событие клика мышкой на кнопке « Show Form 2″.
Листинг программного кода этого события следующий.

7. Программирование событий в форме 2

В нашем случае программируем два события в модуле формы 2 ( Unit2.pas ):

Листинг программного кода обработки этих событий имеет вид.

Внешняя глобальная переменная ModalResult формы Form2 определяет поведение формы. Как только ModalResult становится равным ненулевому значению ( mrOk или mrNo ), то форма закрывается с соответствующим кодом возврата.

В результате вызова из главной формы функции

дочерняя форма 2 будет отображена на экране до тех пор, пока пользователь не закроет ее стандартными средствами Windows.

Теперь можно запустить программу на выполнение и протестировать ее.

Вывод

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

Источник

Unit delphi

Delphi 7. Занятие 2_5. Часть 1.

Подключения стандартного модуля — delphi unit uses

Мы уже говорили, что кроме кода, написанного программистом, для работы программы требуется множество стандартных процедур и функций.

Например, преобразование целого числа в строку символов — функция «IntToStr()».

Код этой функции находится в модуле SysUtils, указанном в предложении uses.

unit Unit1;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Buttons, ExtCtrls;

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

К счастью, имеется модуль «JPEG», подключение которого решает проблему:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Menus, StdCtrls, Buttons, ExtCtrls, JPEG;

Для просмотра «.png» картинок надо скачать в интернете модуль TPNGImage и подключить его наподобие модуля JPEG.

Интерфейс главной формы проекта.

При своём открытии среда IDE Delphi автоматически создаёт форму с именем Form1, которая будет являться главной формой программы (то есть её закрытие приводит к закрытию всей программы).

Разместим на ней все необходимые нам компоненты:

image

Во первых, это главное меню «TmainMemu». Далее, это панель, на которой расположим компонент «Tmemo». В нём будет размещено краткое справочное описание разрабатываемой нами программы.

Дополнительно используем две кнопки «BitBtn». Воспользуемся свойством «Kind» этого компонента. Для кнопки, расположенной на панели, установим значение «bkOK». Для второй установим «bkClose». Кнопка такого вида будет закрывать форму автоматически при её нажатии.

Сделаем так, чтобы панель «Panel1»не была видима при запуске программы. Для этого в инспекторе объектов установим свойство панели «Visible» в «false».

Если пользователь захочет посмотреть краткое описание программы, он должен выбрать пункт меню «О программе».

Main menu delphi

Создание главного меню формы.

Разместим на «Form1» компонент главное меню (MainMenu).

Прежде мы управляли действиями программы, нажимая на кнопки, теперь же будем делать это, выбирая пункты меню.

Для создания пунктов меню необходимо вызвать редактор, дважды щёлкнув по компоненту MainMenu1 или выбрать пункт «Items …» в окне ObjeсtInspector.

В открывшемся окне щелкаем по прямоугольнику и он окрашивается в голубой цвет:

image 1

В инспекторе объектов заполняем свойство «Caption» значением «Перейти» и нажимаем «Enter». Поле заполнится введённым значением.

image 2

Далее выделяем прямоугольник, расположенный справа и в «Caption» в инспекторе объектов вводим значением «О программе».

image 3

image 4

image 5

Появляется пункт подменю:

image 6

Подпункты подменю заполняются аналогично пунктам меню, вводя туда два значения: «ко второй форме» и «завершить программу».

image 7

Здесь приведём обработчики обработчики «кликов» по пунктам меню.

Обработчики пунктов меню.

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

Обработчики задаём для пунктов подменю.

Для пункта «ко второй форме»:

procedure TForm1.N3Click(Sender: TObject);

form2.Show;

Обработчик второго пункта меню «завершить программу»:

procedure TForm1.N4Click(Sender: TObject);

close; //процедура завершения программы.

Второй пункт главного меню «о программе»

procedure TForm1.N5Click(Sender: TObject);

self.Panel1.Visible:=true; //панель становится видимой.

Обработчик «клика» кнопки «ok»:

procedure TForm1.BitBtn1Click(Sender: TObject);

self.Panel1.Visible:=false; // делаем панель снова невидимой.

обработчик события для кнопки «Close» писать не надо. При выборе такого типа кнопки её срабатывание происходит автоматически и программа будет закрыта.

Создание второй, третьей и так далее форм и модулей.

В предыдущем разделе мы создали главную форму программы. Однако реальные программы часто содержат две и более форм.

Создадим вторую форму. Для этого в пункте главного меню IDE выберем пункт «File» и в нём пункт «New» и далее в открывающемся подменю пункт «Form».

Будет создана вторая форма с именем «Form2» и соответствующий ей модуль «Unit2».

Но модуль не обязательно должен быть привязан к форме. Создадим самостоятельный модуль «Unit3». Для этого опять воспользуемся главным меню «File» > «New» > «Unit».

Связь модулей между собой.

Если в созданных модулях написать программный код, то он никак не будет связан между собой. Пока модули не могут видеть друг друга.

Но попытка компиляции выдаст ошибку, так как в модуле «Unit1» ничего не известно о существовании «Unit2».

Аналогично добавляется ссылка на модуль «Unit3».

Предложение будет добавлено в секцию «implementation», а не в главное предложение «Uses» в секции «Interface» в связи со следующими соображениями.

Circular unit reference delphi — перекрёстные ссылки.

Существует проблема перекрёстных ссылок на модули.

Предположим, в модуле 2 есть данные, которые используются для работы процедур, расположенных в модуле 1.

Тогда в модуле 1 в предложении uses надо сделать ссылку на модуль 2. В принципе, это можно сделать в uses, расположенном в секции interface.

Всё будет нормально, пока не потребуется получить из модуля 2 доступ к данным, расположенным в модуле 1. Если сделать ссылку на модуль 1 в секции interface модуля 2, то в силу особенностей компилятора он выдаст ошибку «о недопустимости перекрёстных ссылок».

Решение этой проблемы весьма тривиально. Необходимо размещать ссылки на модули в секции implementation, что и происходит автоматически при использовании команды главного меню «File» > «Use Unit …».

Источник

Delphi добавить форму в проект

Редкая программа обходится одной формой. Мы можем с лёгкостью создавать дополнительные формы Delphi, предоставляющие возможность, например, вести диалог с пользователем, принимать и выводить любую необходимую информацию. В этом уроке научимся создавать несколько форм Delphi дополнительно к основной.

NewForm

Все новые формы автоматически заносятся в разряд автосоздаваемых, то есть в начале работы программы они будут автоматически создаваться сразу, одновременно с первой, главной Формой проекта. Нам не придётся этим заниматься в программе, но одновременное создание многих форм занимает ресурсы и время программы. Поэтому предлагаю сразу научиться создавать нужные формы только в нужный момент.

Если же мы перевели дополнительные Формы в разряд доступных, то перед каждым вызовом такой Формы необходимо делать проверку на существование Формы (оператором Assigned) таким образом:

if (not Assigned(Form2)) then // проверка существования Формы (если нет, то
Form2:=TForm2.Create(Self); // создание Формы)
Form2.Show; // (или Form2.ShowModal) показ Формы

Теперь разберёмся в разнице между обычными и модальными Формами. Обычные Формы позволяют свободно переходить между всеми Формами, находящимися в данный момент на экране. Модальная Форма в момент вызова блокирует переход между Формами проекта до тех пор, пока не будет закрыта, и работа возможна только в ней.

При попытке компилирования программы, содержащей вызов второй формы, Delphi выдаст такой запрос:

CreateForm2
означающий:
Форма Form1 содержит вызов формы Form2, которая объявлена в модуле Unit2, но который отсутствует в списке используемых модулей. Вы хотите добавить его? Нужно разрешить, и в начале модуля перед директивой
<$R *.dfm>
будет добавлена фраза
uses Unit2;
В принципе, можно добавить её туда перед компиляцией «ручками», и тогда запроса не будет. Но смысл? Отвечаем «Yes» и снова жмём F9.

Первым делом введём в форму операцию её закрытия! Сделать это можно несколькими способами. Возьмём кнопку, напишем «Закрыть» и в обработчике OnClick напишем:

Form2.Close; // В принципе, достаточно просто Close;

Этот же оператор работает при вызове его из меню формы, если меню, конечно, туда ввести (компонент MainMenu на вкладке Standard), о чём в дальнейшем обязательно поговорим!

Теперь же необходимо рассмотреть способ закрытия Формы, который относится именно к модальным формам. Он используется диалоговыми окнами с вопросом, требующим подтверждения, и в других аналогичных случаях. На Форме нужно расположить несколько кнопок, нажатие которых предполагает соответствующий ответ: «Да», «Нет», «Отмена», и т.д.
У каждой кнопки есть свойство ModalResult, среди значений которой mrYes, mrNo, mrCansel и другие (посмотрите!). Значение ModalResult выбранной кнопки передаётся свойству ModalResult Формы. Это свойство отсутствует в списке свойств Формы, которые можно увидеть в Инспекторе Объектов, но программно оно доступно (напишите » Form2 «, поставьте точку и поищите в появившемся списке!).
Нажатие кнопки со значением свойства ModalResult, отличного от mrNone, приводит к закрытию Формы, даже если у кнопки отсутствует обработчик нажатия! Затем можно проанализировать свойство ModalResult Формы и выяснить, какой же ответ на поставленный вопрос дал пользователь:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowModal;
if Form2.ModalResult=mrYes then // Этот оператор будет доступен только после закрытия Form2
Form1.Caption:=’Пользователь ответил положительно!’;
end;

В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда
CanClose:=True;
Например, если создать такой обработчик OnCloseQuery основной Формы программы:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;

то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows!

Работа с файлами в Delphi В начало урока Создание подпрограмм в Delphi

Потом, для того, чтобы работать с дополнительной формой я пишу form2.show;

Код, стоящий в обработчике нажатия открывающей форму 2 кнопки, выглядит следующим образом, как и у вас написано:

Form2:=TForm2.Create(Self);
(кстати, я довольствуюсь одной это строкой, поскольку моя программа организована так, что повторно нажать на кнопку вызова формы 2 не получится, я просто прячу форму 1 после вызова).

Вот. Значит, всё работает замечательно.

По моему замыслу при вызове формы 2 у меня должна ещё и открываться и форма 3 (то есть при нажатии кнопки с формы 1 вызывается две формы, а не одна). (Кстати, на самом деле не форма 3, а форма 5, просто я так написал, чтобы вам было легче читать и понять меня, это не суть важно, мы будем называть её формой 3).

Форма 3 является модальной, это тоже не то, о чём я хотел говорить.

Проблема была в следующем, программа, когда натыкалась на строку
Form3:=TForm3.Create(Self);

Возникала ошибка Access violation.
Я долго парился, в чём же тут дело, пробовал много вариантов, но ошибка не хотела уходить.

И тут я посмотрел на слово CREATE, и вспомнил, что у меня стоит обработчик события создания формы 3 (FormCreate). Я пошёл, закомментировал его тело с помощью комбинации //, то есть у меня этот обработчик после этого фактически перестал выполняться, ибо выполняться было нечему. После этого всё заработало.

Вопросы такие:
1. Обработчик события создания формы выполняется раньше её создания??
2. Что делать в том случае, если всё-таки мне необходимо выполнить комплекс каких-либо действий при создании формы с помощью обработчика FormCreate, а создаваемую форму я создаю посредством конструкции Form3:=TForm3.Create(Self);

Заранее спасибо за ответ.
Автор, добавлено 2.01.11, 17:32:48
Не совсем понятно, как у вас вызываются эти формы 2 и 3. Я попробовал. Кнопкой на первой форме создаю и вызываю обе. И при событии onCreate третьей формы пишу

Caption:=’Изменение заголовка’; // Не важно что

Почему-то всё отрабатывает, при нажатии на кнопку выскакивают обе дополнительные формы, третья с изменённым заголовком. Каким образом вы прячете первую форму, может, дело в этом? Я просто написал перед вызовом форм Form1.Visible:=False. Или всё же используете объекты третьей формы, которые пока не существуют.

Попробуйте вместо onCreate выполнять действия в onActivate третьей формы. Вадим Мошев, добавлено 2.01.11, 18:04:27
Сейчас объясню, как вызываю формы.
У меня есть форма 1. На ней стоит кнопка. При её нажатии у меня создаётся и показывается форма 2.

По моему замыслу, когда я с формы 1 вызываю 2 и 3-ю, пользователь программы сначала должен поработать с 3-й формой, причём во время работы с ней 2-я форма должна быть ему недоступна. И только когда работа с 3-й формой завершена, он начинает работать со второй. То есть, на момент работы с 3-й формой работа всей остальной программы должна быть заблокирована.

ДЛя того, окна имели кнопку на панели задач, нужно изменить стиль окна. Вот как это делается, на примере второй формы:

type
TForm2 = class(TForm)
private
< Private declarations >
procedure CreateParams(var Params: TCreateParams);
override;
.
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
ExStyle := ExStyle or WS_EX_APPWINDOW;
end; Мария, добавлено 27.06.11, 22:30:16
кажется, я не совсем правильно описала задачу
в моей программе есть 2 формы, при нажатии на кнопку на первой форме открывается вторая форма а первая скрывается,так вот, первая форма TForm1 = class(TForm), т.е. задана как главная форма, её я могу менять добавляя на неё всякие элементы
( кнопки, мемо и тд) и меняя их размер и положение, а вторую форму после создания я менять не могу, она вылезает в программе всегда в первоначальном виде, к ней у меня нет доступа, как исправить? помогите пожалуйста Автор, добавлено 27.06.11, 22:53:05
Так вы хотите делать это программно, т.е. из первой формы создавать во второй форме компоненты динамически?

Тогда нужно создавать компоненты как переменные, и для ссылки на них использовать не Form2 а Unit2. Вот пример создания компонента TMemo:

procedure TForm1.Button2Click(Sender: TObject);
begin
Unit2.Memo:=TMemo.Create(Self);
Unit2.Memo.Parent:=Form2;
Unit2.Memo.Top:=0;
Unit2.Memo.Left:=0;
Unit2.Memo.Visible:=True;
end;

Что мешает написать на второй форме то же самое:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

uses Unit21, Unit31;

<$R *.dfm>
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Hide;
form2.Show;
show;
finally
form2.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
Hide;
form3.Show;
show;
finally
form3.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TTitleForm, TitleForm);
TitleForm.ShowModal;
Application.Run;

С другими формами мне вообще непонятно. Кода нет, о чём гадать?

Павел, добавлено 17.01.12, 15:24:53
Всё, проблемы решились.Access violation at adress выходило из-за ошибки в TitleForm.FormCreate.А во втором случае неправильно был установлен фокус. Елена, добавлено 28.01.12, 20:30:24
не совсем по теме вопрос. подскажете.может быть какие задачи можно реализовать в делфи в качестве научной работы в 11 классе? чтобы не сверх сложно, но графику можно было применить:) Автор, добавлено 29.01.12, 10:07:05
Ой, я не в курсе, что в 11 классе научные работы выполняют! Вот одной студентке помогал домашнее задание делать: рассчитать функцию f=n!/n^n (n факториал делить на n в степени n). Но это без графики, одни расчёты. А с графикой можно придумать, например, сделать компьютерную модель чего-либо, чтобы как-то двигалось, менялось, взаимодействовало. Например, город. Несколько улиц. На перекрёстках светофоры. Работают с определёнными интервалами переключения. Сделать модель движения транспорта, и можно анализировать оптимальные интервалы в зависимости от количества машин в городе. (Машина на перекрёстке меняет направление движения случайным образом.) Это будет действительно научная работа. Сам придумал только что! Так что не взыщите, я же не препод. Аноним, добавлено 10.02.12, 16:03:48
можете помочь. как сделать, что бы при при нажатие на кнопку открывалась следущая форма, если в edit написан определенный текст? а то я уже кучу сайтов облазил и нигде найти не могу(
примерно так:
если edit1.text=’1337(например)’ то Form2.show Автор, добавлено 10.02.12, 19:49:41
Ну, всё вы уже сами написали. Создаём обработчик нажатия на кнопку и там пишем:

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

procedure TForm2.WMSysCommand;
begin
case Msg.CmdType of
SC_MINIMIZE:
begin

end;
SC_MAXIMIZE:
begin
form2.Top:=form1.Top+25;
form2.Height:=form1.Height-25;
end;
end;
inherited;
end;

1й пример срабатывает только 1й раз далее если форму сворачивать и разворачивать то он перестаёт работать. Второй просто не работает.

procedure TForm2.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if Top СанЁк, добавлено 20.06.12, 02:52:21
Наконец то русским языком написано. Спасибо большое! Евгений, добавлено 27.03.13, 05:51:32
Здравствуйте подскажите пожалуйста у меня возникла проблема.
Я пытаюсь сделать в программе автозапуск с системой по CheckBox1 точнее сделал, но он работает только с главной формы, а у меня в программе настройки находятся на другой форме при этом автозапуск не работает подскажите как решить проблему? Автор, добавлено 27.03.13, 07:23:07
Я пытаюсь выделить инфу из вашего сообщения и. не могу. Ничего не понятно.

procedure TSetings1.CheckBox5Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.create;
reg.rootkey := hkey_current_user;
reg.lazywrite := false;
If CheckBox1.Checked then
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, true) then
begin
reg.WriteString(‘progrmma’, application.exename);
reg.CloseKey
end;
end
else
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, false) then
begin
if reg.ValueExists(‘progrmma’) then
reg.DeleteValue(‘progrmma’);
reg.CloseKey;
end;
end;
reg.free;
end;
Setings1 форма 3
Clock1 Главная форма программы
Программа компилируется, но автозапуск не происходит Евгений, добавлено 27.03.13, 11:52:34
Имя программа это Clockv210
Евгений, добавлено 27.03.13, 11:56:03
Извиняюсь с кодом напутал
Вот верный

procedure TSetings1.CheckBox5Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.create;
reg.rootkey := hkey_current_user;
reg.lazywrite := false;
If CheckBox1.Checked then
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, true) then
begin
reg.WriteString(‘Clockv210’, application.exename);
reg.CloseKey
end;
end
else
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, false) then
begin
if reg.ValueExists(‘Clockv210’) then
reg.DeleteValue(‘Clockv210’);
reg.CloseKey;
end;
end;
reg.free;
end;
Setings1 форма 3
Clock1 Главная форма программы
Программа компилируется, но автозапуск не происходит Автор, добавлено 27.03.13, 12:45:23
Ну вот, сразу бы так.

procedure TForm1.Button1Click(Sender: TObject);
begin
TForm1.FormCloseQuery(TObject, True);
Close;
end;
end.
Пишет: Incompatible types:’TObject’ and ‘Class reference’ и указывает на TObject. Что нужно сделать, чтобы заработало? Автор, добавлено 24.04.13, 15:08:43
Так вообще делать нельзя. Процедура CloseQuery вызывается при закрытии Формы, её не нужно вызывать вручную. И просто в этой процедуре прописываете условие закрытия Формы, для этого приравниваете CanClose True или False. В вашем случае вводите глобальную переменную типа Boolean, нажатием кнопки меняете её значение, и пытаетесь закрыть Форму. А в процедуре CloseQuery анализируете вашу переменную, или просто приравниваете к ней CanClose:

var MyClose: Boolean=False;//глобальная переменная

procedure TForm1.Button1Click(Sender: TObject);
begin
MyClose:=not MyClose;
Close;
end;

Пытался сделать копию класса:
TMyForm = class(TForm)
Memo2: TMemo;
private
< Private declarations >
public
UserId: Integer;
< Public declarations >
end;

var
MyForm: TMyForm;
i: Integer;

//создаем форму, чтоб инициализировать счетчик
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

//нажимаем кнопку для создания новой формы и присвоения ей номера
procedure TForm1.ButtonClick(Sender: TObject);
begin
FormChat:=TMyForm.Create(Application);
FormChat.UserId:=i;
FormChat.Show;
Inc(i);
end;

Но почему-то выдает Resource TMyForm not found.

Подскажите, что я сделал не так, и что нужно сделать, чтоб эта форма была независимой от первой (в плане сворачивания в панель задач) и отдельной кнопкой на панели задач?

P.S.: Если я знаю Handle объекта, то можно ли обратиться к этому объекту по Handle?

Спасибо.
Павел, добавлено 11.11.13, 16:19:30
Возможно новых свойств в форме будет больше. Павел, добавлено 11.11.13, 16:33:33
к P.S.
Точнее не объекта, а процесса. Правильно ли я понял, что у всего, что создано в Application есть свой Handle? У формы, у Thread`а, у Socket`а. Автор, добавлено 11.11.13, 17:32:56
У каждого окна свой Handle. В данном случае имеется в виду, что окно это не только Форма.

Насчёт сокетов ничего сказать не могу, я далёк от этого. Павел, добавлено 12.11.13, 08:19:10
И снова я попытаюсь вернуться к моим баранам. :)
Я все-таки сделал так, чтоб на панели задач были отдельные кнопки для каждого окна.
Однако они не совсем отдельные, как могло бы показаться на первый взгляд.

При сворачивании основной формы (основного окна), сворачиваются и исчезают с панели задач и остальные дочерние кнопки.

Как мне от этого избавиться?
Буду премного благодарен за помощь. Павел, добавлено 12.11.13, 08:44:52
И снова это я. :)
А вопрос на этот раз такой: Как мне при создании n-ного количества форм через
var
FormChat: TForm;

обратиться ко всем созданным формам поочередно (неизвестно, сколько будет созданных форм)? FindComponent для самих форм не подходит, т.к. он только с визуальными компонентами внутри формы работает. Автор, добавлено 12.11.13, 13:42:58
1. Так как вы сделали, наверное никак. При сворачивании главной Формы другие свернутся. Значит, что? Первую Форму не нужно использовать! Начинайте сразу со второй, она и будет главная. Тогда при её сворачивании остальные останутся.

2. А по имени не пробовали, свойство Name. При создании форм задайте им имена, да? Павел, добавлено 12.11.13, 14:21:24
Спасибо за советы, но я на citforum`е попросил помощи по данным вопросам.
По поводу первого вопроса мне посоветовали то же самое.

По поводу второго есть такое решение (по перебору всех форм):
Сами формы перечислены в списке Screen.Forms

В частности пример:

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
s: string;
begin
for I := 0 to Screen.FormCount-1 do
begin
Memo1.Lines.Add(Screen.Forms[I].Name);
Screen.Forms[I].Height:=600;
end;
end;
(может кому и пригодится. )

Мне осталось только в динамически создаваемые формы научиться добавлять несколько свойств, чтоб можно было там хранить какие-либо идентификационные данные. Павел, добавлено 12.11.13, 14:23:41
Точнее на cyberforum`е. Автор, добавлено 12.11.13, 14:47:04
Ну задайте несколько переменных при конструировании формы, не пойму в чём проблема. Павел, добавлено 12.11.13, 15:05:51
Мне нужно, чтоб можно было обращаться к этим данным как-то так: :)
Screen.Forms[I].MyVar1:=num1;
if (Screen.Forms[I].MyVar2=num2) then
begin
что-то делать
end;

А еще я у вас на сайте видел, что есть такие типы переменных, как Point.
Можно ли их приспособить под формы?
Что-то вроде этого:
User32^[4]:=Screen.Forms[I];
и потом использовать:
User32^[4].Height:=600;
Чтоб таким образом сокращать имена форм и без перебора всех форм обращаться по поинтам?

Спасибо за терпение. :) Автор, добавлено 12.11.13, 15:16:56
1. Вы что никогда к переменным других форм не обращались? Ну да, как-то так.

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

TFChat = class(TForm)
Memo2: TMemo;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
FChat: TFChat;
i: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FChat:=TFChat.CreateNew(Application);
FChat.Name:=’User’+IntToStr(i);
Form1.Memo1.Lines.Add(FChat.Name);
FChat.OnClose:=FChat.FormClose;

//создаю динамические объекты на динамической форме
FChat.Memo2:=TMemo.Create(FChat);
FChat.Memo2.Parent:=FChat;

FChat.Button2:=TButton.Create(FChat);
FChat.Button2.Parent:=FChat;
FChat.Button2.Top:=100;

procedure TFChat.FormCreate(Sender: TObject);
begin
Form1.Memo1.Lines.Add(‘FormCreate’+(Sender as TFChat).Name);
end;

Что мне надо написать, чтоб в форму с именем User0 в Memo2 добавилась строчка «bla-bla-bla»?
Пытался сделать так: User2.Memo2.Lines.Add(‘bla-bla-bla’); но не прокатило, т.к. User2 в программе четко нигде не описано.

Спасибо. Павел, добавлено 14.11.13, 17:28:41
Поправочка.
Что мне надо написать, чтоб в форму с именем User2 в Memo2 добавилась строчка «bla-bla-bla»?
Хотя цифра после User может быть любая. Вплоть до 1000. Автор, добавлено 14.11.13, 17:41:18
Я всё же когда-то создавал формы как элементы массива (динамического, конечно). Тогда нет необходимости добавлять их в секцию uses, а обращаться как к переменной.

Так-то вот просто добавьте новую форму в проект, и при попытке использовать её система добавит её в uses. Динамически сделать это наверное не удастся. Так что пока я вижу только способ с массивом, или другой переменной типа TForm.

В принципе, была у вас мысль с указателями, я сразу не понял, но если бы получилось, наверное, наилучший вариант. Автор, добавлено 14.11.13, 17:47:40
Всё, сегодня уже не могу отвечать. До завтра. Степан, добавлено 7.02.14, 19:41:12

procedure TForm1.N11Click(Sender: TObject);
begin
Form1.Hide;
Form2.Show;
end;

У меня на delfi7 пишет ошибку на строчке открытия новой формы Form2.Show; Можете сказать почему так? Автор, добавлено 7.02.14, 19:54:11
Какая ошибка?

Может, у вас эта форма ещё не существует, то есть метод Create ещё не работал. Так бывает, когда форма в свойствах приложения убрана из разряда автосоздаваемых. И это правильно. Но создавать эту форму нужно тогда так:

if (not Assigned(Form2)) then // проверка существования Формы (если нет, то
Form2:=TForm2.Create(Self); // создание Формы)
Form2.Show;

Кстати, всё это описано в тексте статьи.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • delphi динамическое создание формы
  • delphi динамическое создание форм