Урок Delphi 8Работа с дополнительными формами Delphi |
Уроки Delphi
1. Первая программа
2. Использование компонентов
3. События Delphi
4. Типы данных Delphi
5. Создание своих типов данных
6. Выражения и операторы
7. Работа с файлами в Delphi
8. Дополнительные формы
9. Подпрограммы в Delphi
10. Исключительные ситуации
11. Взаимодействие приложения с пользователем
12. Указатели в Delphi
13. Обзор компонентов
14. Работа со строками
15. Создание интерфейса
16. Графика в Delphi
17. Многопоточность в Delphi
18. Динамическое создание
компонентов Поиск по сайту Это важно:
Метод Application.ProcessMessages;
Это полезно:
Параметр Sender в обработчиках событий;
Бояться не надо |
Редкая программа обходится одной формой. Мы можем с лёгкостью создавать дополнительные формы Delphi, предоставляющие возможность, например, вести диалог с пользователем, принимать и выводить любую необходимую информацию. В этом уроке научимся создавать несколько форм Delphi дополнительно к основной. Форма создаётся вместе с новым модулем, описывающим её работу. Сразу же покажем, как удалить Форму из программы. Для этого также есть кнопочка, и команда меню Project -» Remove from project.... Так как Форма создаётся вместе с её модулем, то в появившемся окошке нужно выбрать модуль, который и будет удалён из проекта вместе с Формой: Сразу возникает вопрос, а что будет, если попытаться удалить и модуль Unit1, что останется?. Выполните команду Project -» View Sourse. В редакторе кода появится новая вкладка, на которой будет отображён код Главного Окна программы (не Главной Формы, а именно Окна. В Windows ведь все объекты рассматриваются как окна.) Главное окно невидимо, но управляет всем проектом, и может работать вообще без Форм. Туда можно вставлять свой код, и писать нехилые программы, как в классическом Паскале. Все новые формы автоматически заносятся в разряд автосоздаваемых, то есть в начале работы программы они будут автоматически создаваться сразу, одновременно с первой, главной Формой проекта. Нам не придётся этим заниматься в программе, но одновременное создание многих форм занимает ресурсы и время программы. Поэтому предлагаю сразу научиться создавать нужные формы только в нужный момент. Во-первых, нужно отменить автосоздание форм. Выполните команду меню Project -» Options... В появившемся окошке отображаются Main form (главная Форма), Auto-create (автосоздаваемые) и Available (доступные) формы проекта. Нам нужно перевести Форму из разряда автосоздаваемых в разряд доступных Форм. Делается это нажатием кнопки " > " (обратная операция - нажатием кнопки " < "): Таким образом, главная Форма Form1 создаётся сама, а дополнительную форму Form2 мы создадим в программе при необходимости. Если этого ничего мы не предприняли (что вполне допустимо при малом количестве дополнительных форм), то для появления новой Формы на экране достаточно написать: Form2.Show; // в случае обычной ФормыForm2.ShowModal; // в случае модальной ФормыЕсли же мы перевели дополнительные Формы в разряд доступных, то перед каждым вызовом такой Формы необходимо делать проверку на существование Формы (оператором Assigned) таким образом: if (not Assigned(Form2)) then // проверка существования Формы (если нет, тоForm2:=TForm2.Create(Self); // создание Формы)Form2.Show; // (или Form2.ShowModal) показ ФормыТеперь разберёмся в разнице между обычными и модальными Формами. Обычные Формы позволяют свободно переходить между всеми Формами, находящимися в данный момент на экране. Модальная Форма в момент вызова блокирует переход между Формами проекта до тех пор, пока не будет закрыта, и работа возможна только в ней. При попытке компилирования программы, содержащей вызов второй формы, Delphi выдаст такой запрос: означающий: {$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; Как видно из этого примера, для доступа из одной Формы как к свойствам другой Формы, так и к свойствам её компонентов необходимо указывать имя Формы, к которой мы обращаемся. Мы также имеем доступ к данным, использующимся в модуле, описывающим её работу. Для этого необходимо указывать уже имя модуля. Например, для обращения к переменной X из модуля Unit2 пишем так: Unit2.X .Имеющейся возможности укрыть данные от использования в других модулях касаться пока не будем. В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда CanClose:=True; Например, если создать такой обработчик OnCloseQuery основной Формы программы: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end; то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows! Работа с файлами в Delphi
В начало урока
Создание подпрограмм в Delphi Вопросы и комментарии (162) Решение задач в Delphi
Виктор Евсеев, добавлено 23.08.09, 00:21:50
Вообще, когда видишь такое, посещает мысль, а ведь это ж так просто, ну почему я это не смог придумать Респект автору :) Адам, добавлено 17.10.09, 20:58:59 На Ваш блог знакомый в аську ссылку кинул. Оказалось ,что не зря :) Понравилось. Тепрь все время читать буду :) CBИTOШA, добавлено 28.10.09, 14:48:30 Скажите, а у вас есть RSS поток в этом блоге? Автор, добавлено 28.10.09, 16:14:08 Честно говоря, пока нет. Арнольд, добавлено 12.11.09, 05:09:32 Не совсем уловил некоторые моменты, но в общем занятно :) Святослав, добавлено 2.12.09, 18:36:12 Познавательная статья, кстати автору хочу предложить установить от яндекс.денег полезную фишку на сайт "Дай рубль". Я бы дал, так сказать на поддержание. ;) Виталий, добавлено 3.12.09, 16:09:34 Вот запускаю я делфи у меня стоит первая форма, я ставлю на нее кнопку, создаю вторую форму. Какой код надо прописать для кнопки чеб при нажатии на нее открывалась вторая форма???????? Автор, добавлено 3.12.09, 16:58:23 Издеваетесь? Вышенаписанное почитать не пробовали? Валентин Родионов, добавлено 22.12.09, 22:46:09 И как автору не влом столько времени на написание статей тратить, мы конечно Вам очень благодарны, но вот я на такой альтруизм не способен :) Автор, добавлено 23.12.09, 08:31:27 Ну, это не совсем альтруизм! По крайней мере, пока себя окупает. Anatoliy Tomskih, добавлено 27.12.09, 13:22:59 Уважаемые авторы! Так и не нашёл ответа на отказы программы Delphi 7 выводить текстовые файлы в Поле TMemo операторами AssignFile(F,S),Reset(F) и Memo1.Text := S. Delphi 7 сообщает о невозможности найти путь к указанному файлу. С диалогами же работать умею, но хотел бы освоить файловую систему в Delphi 7. А. Томских, Забайкалье. Мой ящик: welgambit@mail.ru. 27.12.09. Автор, добавлено 27.12.09, 13:51:27 Можно, конечно, и так извратиться, но проще сразу считать текстовый файл самим компонентом TMemo: Memo1.Lines.LoadFromFile('имя файла'); Влдимир, добавлено 30.05.10, 17:27:43 А как присвоить переменной первой формы значение переменной второй формы ) Автор, добавлено 30.05.10, 18:29:54 Я написал об этом выше, но повторю. Если модуль второй формы имеет имя Unit2, и в ней определена переменная Y, то переменной Х из первой формы её значение присваивается так: Х := Unit2.Y; То есть, для использования в другом модуле, перед именем переменной должно стоять стоять имя того модуля, где она определена. Артем, добавлено 3.06.10, 19:01:58 А как можно использовать переменные первой формы во второй, если в коде первой формы уже написано uses Unit2? Автор, добавлено 4.06.10, 09:52:55 Всё аналогично. Напишите в коде второй uses Unit1 и переменные первой формы станут доступны во второй. С указанием имени модуля первой формы, естественно. Аноним, добавлено 4.06.10, 17:10:20 ситуация решилась сама. Нужно было всего-лишь записать uses Unit2 отдельной строкой, иначе компилятор выдавал ошибку circular unit reference. sitystroyinfo, добавлено 19.07.10, 10:11:18 Очень хорошее и полезное сообщение. Сам недавно искал в интернете данную тему и все обсуждения связанные с ней. Никита, добавлено 25.07.10, 23:15:09 У Вас написано: if (not Assigned(Form5)) then // проверка существования Формы (если нет, то Form5:= Form5.Create(Self); // создание Формы) Form5.Show; // (или Form2.ShowModal) показ Формы Пока не заменил строчку на Form5:= TForm5.Create(Self); Работать не хотело. А так заработало. ))) Автор, добавлено 26.07.10, 03:38:14 Да, это моя ошибка, спасибо. Исправляю! Дмитрий, добавлено 5.09.10, 17:32:27 Спасибо за статью!!! Я и не думал что все так просто :) spikeden, добавлено 20.09.10, 11:01:35 Вопрос!)) Допустим у меня есть проект в дэлфаке и мне надо что бы в этом проекте открылась форма совесем из другого проекта, как бы мне её туда прикрепить что ли? Автор, добавлено 20.09.10, 11:36:35 При работе в среде Delphi можно открывать формы и модули из любых других проектов. Они имеют расширение .pas и свободно открываются, даже если имеют одноимённое название с собственными модулями проекта. Однако ошибкой будет попытка открыть файл другого проекта (.dpr). Тогда текущий проект будет закрыт. spikeden, добавлено 20.09.10, 18:23:11 хм, тогда ещё вопрос)) возможно ли как то обьеденить 2 проекта в один, просто у меня как то так получается, что одна часть программы писалась в моём проекте, а вторая дорабатывалась по скачанным исходникам, или мне проще будет создать новую форму и скопировать листинг программы? Автор, добавлено 20.09.10, 19:21:24 Копируем нужный модуль в нашу новую папку. Затем жмём кнопочку с жёлтой папочкой и синим плюсиком, подсказка выскакивает "add file to project (shift+F11)" - ну или сразу shift+F11 и добавляем модуль в проект. Можно сразу из папки где он лежит, но потом запутаемся... spikeden, добавлено 20.09.10, 19:50:31 спосибо за помощь))) и за ресурс тоже спасибо большое, хорошая помощь для студентов, таких как я, которые только начинают учить delphi)) Вадим Мошев, добавлено 12.11.10, 13:44:54 У меня возникли вопросы. Один из которых звучит так. Чем чревато то, что я поступаю следующим образом: Я создаю дополнительную форму, в её модуле, разделе Implementation пишу uses unit1; Где Unit1 - модуль главной формы проекта, где в свою очередь я пишу тоже в разделе Implementation uses unit2; Потом, для того, чтобы работать с дополнительной формой я пишу form2.show; Вопрос: кроме съедания памяти (и вркмени) это червато чем-нибудь? Может это привести к ошибкам при дальнейней работе? Спасибо заранее! Автор, добавлено 12.11.10, 14:18:20 Ничем это не грозит. Именно так и подключаются дополнительные Формы. Но если их много, то лучше создавать их по мере необходимости, а не сразу в момент старта программы. Для этого нужно убрать их из разряда автосоздаваемых, как написано выше. А если дополнительных форм 2-3 штуки, то можно не заморачиваться. Чайник, добавлено 26.12.10, 20:19:58 Здравствуйте! Огромное спасибо за статью! Всё понятно. Вопрос такой: как сделать так, чтобы при открытии второй формы закрывалась первая? Автор, добавлено 26.12.10, 20:53:04 Элементарно - именно, при открытии второй формы, по событию OnActivate, выполняйте FormN.Close, где N - номер предыдущей формы. Однако, если вы попытаетесь закрыть форму №1, то закроется вся программа, так как она обычно бывает Главной Формой программы. Поэтому форму №1 делайте невидимой, а программу выполняйте в форме №2, тогда третьей формой вы сможете закрыть форму №2. Чайник, добавлено 27.12.10, 05:15:08 Спасибо! Всё очень понятно! Опять чайник, добавлено 27.12.10, 18:36:42 Уважаемый автор! По ходу работы с формами возникла еще одна проблема. Запустила в форме фоновую музыку,по Вашему совету форму 1 сделала невидимой. По возвращению к форме 1 после закрытия других форм музыка не воспроизводится. Как сделать повтор? Спасибо за Ваши советы! Чайник, добавлено 27.12.10, 19:43:47 А ведь дошло! Событие OnShow. Выполняю всё то же, что и при FormCreate. Музыка снова запускается. Всё очень просто благодаря Вам. Ещё раз спасибо! Вадим Мошев, добавлено 30.12.10, 16:30:15 Мысли вслух: поскольку я НЕ досконально владею средой программирования и Делфи, эта конструкция Form2:=TForm2.Create(Self) кажется мне странной. TForm2 - это же тип. Ладно бы мы обращались к свойству ОБЪЕКТА этого типа, а так, как мне кажется, мы обращается к свойству самого ТИПА... Автор, добавлено 30.12.10, 17:49:18 Да, действительно, как же можно использовать методы объекта, если самого объекта ещё нет!.. Дело в том, что есть методы, которые работают ещё до создания объекта - это методы класса (тип объекта может быть некоторого "класса") объекта. Например, такие как конструкторы Create и деструкторы Destroy. Всё это является областью объектно-ориентирванного программирования - ООП. Новичкам пока лучше с этим не заморачиваться. Хотя те, кто, как говорится, с молоком матери это впитал, потом чувствуют себя в ООП как рыба в воде. Вадим Мошев, добавлено 2.01.11, 15:58:47 Здравствуйте (и с Новым годом), вопрос такой. У меня есть форма (допустим Form1), на которой располагается кнопка, при нажатии на которую, открывается другая форма (например, Form2). Код, стоящий в обработчике нажатия открывающей форму 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. При наступлении события OnCreate у ВТОРОЙ формы у меня создание и показ третьей формы. Надо бы попробовать так как вы этио сделали. Да, кстати, ПРЯЧУ формы я методом form1.hide (я показываю form1.show) Автор, добавлено 2.01.11, 18:22:32 А вот я попробовал сделать как у вас. В результате, как и следовало ожидать, вторая форма не появляется, так как третья форма создаётся в обработчике onCreate второй, а так как она модальная - вы сами написали, то её появление блокирует дальнейший ход программы. И - с изменённым заголовком. Кстати, Visible:=False и Hide - один эффект. Но ошибок нет никаких. Вадим Мошев, добавлено 2.01.11, 18:54:50 Я виноват, немного кое-что неверно указал в своём вопросе. По моему замыслу, когда я с формы 1 вызываю 2 и 3-ю, пользователь программы сначала должен поработать с 3-й формой, причём во время работы с ней 2-я форма должна быть ему недоступна. И только когда работа с 3-й формой завершена, он начинает работать со второй. То есть, на момент работы с 3-й формой работа всей остальной программы должна быть заблокирована. А писал я о другом. У меня возникала ошибка Access Violation. В этом я виню обработчик события OnCreate. Как мне кажется, он вызывался раньше, чем форма была создана, то есть формы ещё не было, а обработчик мы уже вызываем, вот моё мнение. Бытовой пример: мы ставим стеклянную вазу на стол, которого ещё нет. Или же мы заселяем жильцов к квартиры дома, который ещё не построен. Автор, добавлено 2.01.11, 19:33:38 Ну я же промоделировал эту ситуацию, и всё сработало именно так, как вы и написали, непонятно, откуда у вас ошибка. И onCreate никак не может вызываться раньше создания формы. Итак, берём ваш вариант, когда третья форма создаётся в обработчике OnCreate второй. При этом вторая форма не только недоступна, но и пока не видна. В моём варианте - вторая уже видна, и так же недоступна. Саня, добавлено 24.01.11, 20:53:28 Благодарю автора за труд, очень помогло!!!!! Антон, добавлено 26.01.11, 21:09:33 Вопрос1: Как сделать форму модальной? Вопрос2: Как сделать так, чтобы при нажатии кнопки в форме2 происходило событие в форме1? Автор, добавлено 26.01.11, 23:19:09 1. Как сделать форму модальной Нужно её вызвать как модальную - Form2.ShowModal; 2. Как сделать так, чтобы при нажатии кнопки в форме2 происходило событие в форме1 Никак. По-любому, при нажатии кнопки в форме 2 будет происходить событие нажатия кнопки в форме 2. А уж что вы будете делать по этому событию - от вас зависит, управляйте объектами и переменными в любых формах. Как - описано в тексте урока. Антон, добавлено 27.01.11, 19:33:41 Премногоблагодарен.)) Евгений, добавлено 7.03.11, 14:33:54 дравствуйте, у меня вопрос: при записи procedure TForm1.Button5Click(Sender: TObject); begin if edit1.Clear = true then msg.show; end; вылетает куча ошибок и ворма не открывается, как быть? Автор, добавлено 7.03.11, 17:02:22 Конструкция Edit1.Clear=true - бессмыслица. Edit1.Clear - это процедура очистки. Если вам нужна проверка на пустой Edit1, то это просто: Edit1.Text='', без пробела в кавычках. Евгений, добавлено 7.03.11, 17:11:07 так я тоже пробовал, абсолютно тоже самое Аноним, добавлено 7.03.11, 17:25:36 автор, скажи пожалуйста, как бы мне создать новый юнит (без формы) и перенести туда некоторые процедуры из основного юнита? а именно, как сделать так, чтобы процедурам нового юнита были доступны переменные и компоненты основного юнита? и еще конкретней: у меня на form1 лежит StringGrid1, как бы мне до него достучаться из unit2 ? Димон, добавлено 7.03.11, 17:26:16 и кстати, я не аноним )) Димон, добавлено 7.03.11, 17:42:16 и я же и отвечаю на свой вопрос: в новом юните прописываем ссылку на основной не в первом uses, а в uses после implementation. я хз почему так, и как это работает, но работает (рекурсия, она повсюду 0.0) Динарочка, добавлено 15.06.11, 07:52:50 Очень интересный урок. Помогает при работе с данными компонентами! Мария, добавлено 27.06.11, 19:33:28 Здравствуйте, подскажите, пожалуйста, есть две формы, на панели задач только первая, как добавить туда вторую, чтобы иожно было её менять( скажем, кнопки добавлять и тд) ? заранее спасибо) Автор, добавлено 27.06.11, 21:12:03 На самом деле, на панели задач не первая форма, а главное окно приложения, которое управляет всеми формами, в том числе и первой. Просто ему придаются нулевые размеры, и оно невидимо. Попробуйте изменить заголовок первой формы, но на панели задач изменений не произойдёт, ведь главное окно вы не трогали. Теперь к сути вопроса. ДЛя того, окна имели кнопку на панели задач, нужно изменить стиль окна. Вот как это делается, на примере второй формы: 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; Но предварительно эту переменную (var Memo: TMemo;) нужно объявить в модуле Unit2. Мария, добавлено 27.06.11, 23:11:56 нет, насколько я поняла, это не обязательно вот смотрите я сохранила и закрыла программу, а при открытии заново файла .dpr не могу больше менять вторую форму , т.к. она не показывается, я к ней перехожу только при выполнении программы , но она уже остаётся в первоначальном виде но мне нужно менять её не при выполнении программы, а при повторном открытии .dpr,т.е. необходим доступ к обеим формам, т.к. я выполняю часть программы, проверяю действии или закрываю программу, а потом открываю заново и возвращаюсь к редактированию форм, но ко второй при этом перейти уже не могу, могу редактировать только первую Автор, добавлено 27.06.11, 23:18:21 Не можете открыть форму командой File - Open...? Откроется окошко, выбирайте форму (по имени её модуля: Unit2) и она откроется. То есть сначала открываете проект, при этом открывается и первая форма, а остальные открываете дополнительно. Мария, добавлено 27.06.11, 23:25:51 получилось)) спасибо огромное!!!!) просто только 2 дня назад начала дружить с Delphi ^^ Колян, добавлено 28.06.11, 00:03:30 Привет. спасибо за статью, очень полезна оказалась))))) не поможете в решение задачи: Используя запись с вариантами ( или с классами, как будет проще), в которой хранятся значения основных параметров геометрических фигур( для треугольника – длина 3-х сторон, для прямоугольника – длина 2-х сторон, для окружности – радиус), а также координаты X,Y их положения на плоскости, нарисовать эти фигуры, поместив в центр каждой из них значение предварительно вычисленных площадей. очень нужно совсем скоро сдавать ((((( буду очень благодарен!!!!! Автор, добавлено 28.06.11, 09:00:05 Вам сюда: programmersforum.ru И то вряд-ли кто возьмётся. Ведь предполагается помощь, а не решение с нуля... Иначе говоря, показываете ваш вариант, и спрашиваете, что не получается. тогда помогут. Дима, добавлено 21.07.11, 08:53:09 При попытке компилирования программы, содержащей вызов второй формы, Delphi не выдает вопрос на связывание форм, приходится прописывать в ручную, может где-то что-то настроить надо? Автор, добавлено 21.07.11, 09:43:16 Не встречал ничего подобного в настройках. Проводим эксперимент. Новый проект. Жмём кнопку для создания второй формы (New Form, или выполняем команду File - New - Form). Ставим на Форму1 кнопку, в обработчике нажатия пишем Form2.Show; и жмём F9. Неужели не вышло? Дима, добавлено 21.07.11, 10:13:21 Эффект присутствия, видимо, сейчас все получилось ;-) Сергей, добавлено 19.10.11, 16:01:12 Здравствуйте. Помогите разобраться: у меня есть форма (Form1) из неё, при нажатии на кнопку, вызывается вторая форма (Form2), как сделать так, что бы при нажатии на кнопку на второй форме (Form2) вызывалась обратно первая форма (Form1). Если можно с примером кода... Заранее благодарен. Автор, добавлено 19.10.11, 21:59:29 А как вы вызываете вторую Форму? Form2.Show; - так? Что мешает написать на второй форме то же самое: Form1.Show; Сергей, добавлено 20.10.11, 09:29:36 Вторую форму вызываю: Form2.Visible:=true, аналогично пробовал первую так вызывать, но без результатов. Дело в том, что пишу не в Delphi, а в FastReport (Скрипт Pascal) - аналогично Delphi. Пробовал Form1.ShowModal - работает, но Form2 потом уже не вызывается, дело в том, что ShowModal - это модальный режим, после нажатия кнопки сразу закрываются все формы и выдается результат. Может как-то цикл попробовать?... незнаю что и делать. procedure Button1OnClick(Sender: TfrxComponent); // нажатие на кнопку первой формы begin DialogPage2.Visible:=true // вызываем вторую форму end procedure Button3OnClick(Sender: TfrxComponent); // нажатие на кнопку второй формы begin DialogPage1.ShowModal // открываем первую форму в модальном режиме // DialogPage1.Visible:=true - так не работает end; Автор, добавлено 20.10.11, 10:01:30 Я про FastReport ничего не знаю, но вообще модальный режим это не когда закрываются все окна, а когда переход в исходное окно невозможен, пока модальное окно открыто. Нужно его закрыть. Тогда автоматически окажешься в исходном окне. Так может первое окно закрыть, и окажешься во втором? Но в Delphi этого представить не могу, ведь первое - главное окно, и его закрытие = закрытие всего приложения... (PS, Окно - читайте Форма) Сергей, добавлено 20.10.11, 12:22:31 Спасибо и на этом - трудиться и ещё раз трудиться... Алексей, добавлено 8.11.11, 21:04:01 Привет, статья очень полезная помогите в решение задачи: как изменить курсор при нажатой лев. клавиши мыши, а при отпускании обратно? Спасибо Автор, добавлено 8.11.11, 22:05:39 Нужно воспользоваться таким глобальным объектом как Screen. Он создаётся для любого приложения автоматически. Так вот,
Его значения можно посмотреть в свойстве Cursor любого компонента. Кроме них, можно также нарисовать любой свой курсор, с помощью специальных программ. Вопрос ещё вот в чём. По какому событию вы будете менять курсор! Вы написали - нажати левой кнопки мыши, значит - OnMouseDown, а возвращать - OnMouseUp. НО!!! Для какого компонента будет это событие? Если нужно чтобы это не зависело от месторасположения указателя мыши, то можно создать обработчики этих событий например для Формы, а остальным компонентам просто присвоить их в Инспекторе Объектов. Для обработчика OnMouseDown такой код:
Для обработчика OnMouseUp такой:
Вообще, конечно, нужно работу с курсорами описать как отдельную статью. А пока получилось так, что я стал делать ещё сайт про компонент StringGrid, про все его свойства, и т.д. Так вот, про Алексей, добавлено 10.11.11, 09:29:15 Спасибо Автору за ответ. Все сделал. Суть прог. такая: СкролБокс делает прокрутку большого изображения (оно не умещается в него целиком) только когда мышкой передвигаешь ползунки по вертикали и горизонтали, при этом изображение не двигается вместе с ползунком, а двигается только после отпускания кл. мыши! (или я не до конца знаю все свойства СкролБокс) Надо чтобы прокрутка была при движении колесика мыши (писал программу, сделал), и чтобы прокрутка была при нажатой лев. кл. мыши и соответственно движении мыши в разные стороны (писал программу, сделал), а курсор сразу не удалось изменить при нажатой лев. кл. мыши на изображении, а при отпускании возвращать обратно. Автор, добавлено 10.11.11, 10:10:27 То есть вам нужно было не по всему приложению изменить курсор, а только на изображении. Это проще. Я рад, если помог. Олег, добавлено 14.11.11, 11:11:18 у меня есть форма на которой в StringGride происходят вычисления и если какое-то поле не заполненно то выбивается ошибка, как мне сделать так чтобы если поле не заполненно выскакивало сообщение Введены не все значения Автор, добавлено 14.11.11, 14:09:20 Есть тема - исключительные ситуации в Delphi. Делаем так:
Короче, почитайте про исключительные ситуации. Денис, добавлено 16.11.11, 09:25:21 У меня есть две формы на первой множество кнопок (button1, button2,...buttonN). На второй форме есть компонент StringGrid,в третьей колонке (ColCount) каторого прописаны имена кнопок. Как сделать так, чтоб при двойном нажатии по строке компонента StringGrid нажималась кнопка первой формы с именем равным значению третьей колонки StringGrid Автор, добавлено 16.11.11, 21:43:45 Если бы был один тип кнопок, то просто (для простоты у меня всё на одной Форме):
А если кнопки разных классов, то сначала нужно определить класс. Предлагаю простым перебором - у вас же не 100500 разных видов кнопок, ну максимум штук пять. Просто нужно этот оператор заключить в секцию try/except - итого штук пять таких секций, какая-то одна и сработает верно. А если это кажется вам извратом, то сначала проверяйте класс оператором is Интернет-магазин электрооборудования |
|