|
Вопрос # 4 865/ вопрос решён / |
|
Здравствуйте!
Как сделать чтобы в процессе выполнения некоторых действий по нужному событию вышло окно (как создать новое окно я знаю) , но следующие действия дальше не выполнялись пока в новом окне не будет дан ответ?
Делаю примерно так:
procedure TForm1.Delay(ms: longint);// собственно это аналогично функции sleep;
var TheTime: LongInt;
begin
TheTime := GetTickCount + ms;
while GetTickCount<TheTime do Application.ProcessMessages;
end;
....
.....
Form3:= TForm3.Create(Application);
...
Form3.Show;
...
while Form1.lbl1.Caption = 'False' do Form1.Delay(1000); // - Именно этот момент меня и смущает.
В общем всё работает так как нужно! НО один минус... процедура Delay жрёт 50% ресурсов процессора (и то это только потому что у меня 2-х ядерный прцессор), а если использовать функцию sleep, тогда форма тупо замерзает пока не выполнить действие на форме 3. Собственно такая проблема!
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 26 декабря 2010, 19:44
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 16; последнее сообщение — 27 декабря 2010, 16:31; участников в обсуждении: 4.
|
min@y™ (статус: Доктор наук), 26 декабря 2010, 19:57 [#1]:
Надо делать не так. У формы есть метод ShowModal(). Щас покажу, как он работает...
unit uInputBox;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TInputBoxForm = class(TForm)
TitleLabel: TLabel;
Edit: TEdit;
OkButton: TButton;
CancelButton: TButton;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure EditChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
InputBoxForm: TInputBoxForm;
function RussianInputBox(const ACaption, ATitle: string;
var AText: string): Boolean;
implementation
{$R *.dfm}
function RussianInputBox(const ACaption, ATitle: string;
var AText: string): Boolean;
begin
InputBoxForm:= TInputBoxForm.Create(Application);
with InputBoxForm do
begin
Caption:= ACaption;
TitleLabel.Caption:= ATitle;
Edit.Text:= AText;
OkButton.Enabled:= AText <> '';
Result:= ShowModal <> mrCancel;
if Result
then AText:= Edit.Text;
end;
end;
procedure TInputBoxForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) and (Edit.Text <> '')
then ModalResult:= mrOk;
end;
procedure TInputBoxForm.EditChange(Sender: TObject);
begin
OkButton.Enabled:= Edit.Text <> '';
end;
end.
Функция RussianInputBox() выводит на экран окно, куда надо ввести строку. Пока не введёшь или не нажмёшь "Отмена", нихрена не случится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 26 декабря 2010, 20:06 [#2]:
XYZ
"Digital Networked Knight"
|
26 декабря 2010, 20:09: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse): готово
|
eclipse (статус: Посетитель), 26 декабря 2010, 20:10 [#3]:
Я прмерно так и думал... тока я думал это самое событие сравнимо как вывести MessageDLG... тока не знал его!
|
|
eclipse (статус: Посетитель), 26 декабря 2010, 20:18 [#4]:
Блин ... а вот чёт кновой форме никак не могу применить.
|
|
eclipse (статус: Посетитель), 26 декабря 2010, 20:25 [#5]:
Всё допёрло!
на до вызвать открытие формы как Form2.ShowModal;
|
|
min@y™ (статус: Доктор наук), 26 декабря 2010, 20:26 [#6]:
Цитата (eclipse):
Блин ... а вот чёт кновой форме никак не могу применить.
Почему?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 26 декабря 2010, 20:47 [#7]:
А не подскажите как сделать... форма 3 или 2 создается только один раз призапуске всей программы... при этом на этих формах присутствует image - его я использую как фон... формы 2 и 3 только вылазиют Form2.ShowModal; по такому типу и закрываются по Form2.Close.. но при этом после нескольких запусков картинка пропадает... Почему? как избавиться от этого неприятного момента?
|
|
min@y™ (статус: Доктор наук), 26 декабря 2010, 20:59 [#8]:
Ой, только не сегодня. Завтра утром давай. Напомни.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 26 декабря 2010, 21:06 [#9]:
Не вопрос!
|
|
DNK (статус: Студент), 27 декабря 2010, 14:20 [#10]:
eclipse: По-умалчиванию они должны создаваться. Проверь: Главное меню -> Project -> Options -> Закладка Forms -> Список Auto-Create Forms
"Digital Networked Knight"
|
|
Вадим К (статус: Академик), 27 декабря 2010, 15:56 [#11]:
Как разделить процедуру - есть две идеи.
первая - разделить именно на два куска процедуру.
В конце первой вставить вызов формы, а она уже запустит вторую половинку кода.
вторая - создаем тред, который выполняет все, а когда нужно показать форму - тред сам себя останавливает. потом форма его сама запустит дальше.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 27 декабря 2010, 16:10 [#12]:
И понимаю Вадим. Но для моего варианта это слишком запутанно получится.
|
|
Вадим К (статус: Академик), 27 декабря 2010, 16:25 [#13]:
хотя, тут подумалось, можно ведь использовать showmodal вместо show и никаких проблем.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 27 декабря 2010, 16:27 [#14]:
Вадим... посмотрите ответы которые были ранее... я там так и написал!
|
|
eclipse (статус: Посетитель), 27 декабря 2010, 16:28 [#15]:
Я там также озвучил вопрос про то что как избавиться от пропадания image при Form.Show
|
|
Вадим К (статус: Академик), 27 декабря 2010, 16:31 [#16]:
упс, нашел. видимо страница закешировалась перед этим
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|