Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 26 декабря 2010, 19:44
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 27 декабря 2010, 16:31; участников в обсуждении: 4.
min@y™

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

DNK (статус: Студент), 26 декабря 2010, 20:06 [#2]:

XYZ
"Digital Networked Knight"

26 декабря 2010, 20:09: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse): готово

eclipse

eclipse (статус: Посетитель), 26 декабря 2010, 20:10 [#3]:

Я прмерно так и думал... тока я думал это самое событие сравнимо как вывести MessageDLG... тока не знал его!
eclipse

eclipse (статус: Посетитель), 26 декабря 2010, 20:18 [#4]:

Блин ... а вот чёт кновой форме никак не могу применить.
eclipse

eclipse (статус: Посетитель), 26 декабря 2010, 20:25 [#5]:

Всё допёрло!
на до вызвать открытие формы как Form2.ShowModal;
min@y™

min@y™ (статус: Доктор наук), 26 декабря 2010, 20:26 [#6]:

Цитата (eclipse):

Блин ... а вот чёт кновой форме никак не могу применить.

Почему?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 26 декабря 2010, 20:47 [#7]:

А не подскажите как сделать... форма 3 или 2 создается только один раз призапуске всей программы... при этом на этих формах присутствует image - его я использую как фон... формы 2 и 3 только вылазиют Form2.ShowModal; по такому типу и закрываются по Form2.Close.. но при этом после нескольких запусков картинка пропадает... Почему? как избавиться от этого неприятного момента?
min@y™

min@y™ (статус: Доктор наук), 26 декабря 2010, 20:59 [#8]:

Ой, только не сегодня. Завтра утром давай. Напомни.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 26 декабря 2010, 21:06 [#9]:

Не вопрос!
DNK

DNK (статус: Студент), 27 декабря 2010, 14:20 [#10]:

eclipse: По-умалчиванию они должны создаваться. Проверь: Главное меню -> Project -> Options -> Закладка Forms -> Список Auto-Create Forms
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 27 декабря 2010, 15:56 [#11]:

Как разделить процедуру - есть две идеи.
первая - разделить именно на два куска процедуру.
В конце первой вставить вызов формы, а она уже запустит вторую половинку кода.
вторая - создаем тред, который выполняет все, а когда нужно показать форму - тред сам себя останавливает. потом форма его сама запустит дальше.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 27 декабря 2010, 16:10 [#12]:

И понимаю Вадим. Но для моего варианта это слишком запутанно получится.
Вадим К

Вадим К (статус: Академик), 27 декабря 2010, 16:25 [#13]:

хотя, тут подумалось, можно ведь использовать showmodal вместо show и никаких проблем.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 27 декабря 2010, 16:27 [#14]:

:) Вадим... посмотрите ответы которые были ранее... я там так и написал!
eclipse

eclipse (статус: Посетитель), 27 декабря 2010, 16:28 [#15]:

Я там также озвучил вопрос про то что как избавиться от пропадания image при Form.Show
Вадим К

Вадим К (статус: Академик), 27 декабря 2010, 16:31 [#16]:

упс, нашел. видимо страница закешировалась перед этим:)
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.02 сек.