Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Как сделать чтобы форма вернула результат...   Найти похожие ветки 

 
Kolan ©   (2006-02-23 23:54) [0]

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

В коде OpenDialog.Execute непонял ка это сделать...


 
Плохиш ©   (2006-02-24 00:23) [1]


function TForm1.Execute: Integer;
begin
 Result := ShowModal;
end;

Это интересует?


 
Kolan ©   (2006-02-24 00:32) [2]

type
 TForm1 = class(TForm)
   OpenDialog1: TOpenDialog;
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
   FParam: Integer;
 public
   { Public declarations }
   procedure Execute(var Param: Integer);
 end;

procedure TForm1.Execute(var Param: Integer);
begin
{Показать форму.
Когда её закроют нажав на OK, вернуть параметр:
Param := FParam;
}
end;


PS А обязательно модально показывать?


 
API   (2006-02-24 00:33) [3]

TForm1 = class(TForm)
 procedure OKButtonClick(Sender: TObject);
 procedure CancelButtonClick(Sender: TObject);
public
 function ShowAndReturnResult: string;
end;

...

procedure TForm1.OKButtonClick(Sender: TObject);
begin
 ModalResult := mrOK;
end;

procedure TForm1.CancelButtonClick(Sender: TObject);
begin
 ModalResult := mrCancel;
end;

function TForm1.ShowAndReturnResult: string;
begin
 if (ShowModal = mrOK) then
   Result := "Закрыто кнопкой ОК"
 else
  Result := "Закрыто кнопкой Cancel";
end;


Приведенный код - только лишь пример.

Комментарии: У кнопок (TButton) есть свойство ModalResult, его можно установить в требуемое значение, чтобы не обрабатывать нажатие кнопок дополнительно (OKButtonClick, CancelButtonClick).

Метод ShowModal показывает форму в модальном режиме, и возвращает результат - каким образом был прерван модальный режим.

Возвращать можно любое значение. Возвращение строки - для примера.

Примечание: В Design-Time необходимо установить свойство TForm1.Visible в false.

Использование:

procedure TForm2.FormButtonClick(Sender: TObject);
var
 F: TForm;
begin
 F := TForm1.Create(nil);
 try
   ShowMessage(F.ShowAndReturnResult);
 finally
   F.Free;
 end;
end;  


 
API   (2006-02-24 00:35) [4]

procedure TForm1.Execute(var Param: Integer);
begin
{Показать форму.
Когда её закроют нажав на OK, вернуть параметр:
Param := FParam;
}
end;


procedure TForm1.Execute(var Param: Integer);
begin
 if ShowModal = mrOK then
   Param := FParam
 else
   Param := -1; // признак того, что закрыли не по OK (как пример)
end;

А обязательно модально показывать?

Необязательно, но тогда механизм возвращения результата будет другим...


 
Kolan ©   (2006-02-24 00:42) [5]

Любо дорого смотреть. :) Благодарю за подробнейший ответ :)


 
Kolan ©   (2006-02-24 00:52) [6]

Необязательно, но тогда механизм возвращения результата будет другим...

А как тогда быть?


 
API   (2006-02-24 00:58) [7]

const
 MM_ACCEPTRESULT = WM_USER + $40;

type
 TForm2 = class(TForm)
   procedure Button1Click(Sender: TObject);
 private
   procedure WMAcceptResult(var Msg: TMessage); message MM_ACCEPTRESULT;
 end;

 TForm1 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   FCallerHandle: THandle;
 public
   procedure ShowNoModal(CallerHandle: THandle);
 end;

...

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ...
 PostMessage(FCallerHandle, MM_ACCEPTRESULT, FResult, 0); // тут передается результат; можно использовать SendMessage
end;

procedure TForm1.ShowNoModal(CallerHandle: THandle);
begin
 FCallerHandle := CallerHandle;
 Show;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 TForm2.Create(Application).ShowNoModal(Handle);
end;

procedure TForm2.WMAcceptResult(var Msg: TMessage);
begin
 ShowMessage("Form1 closed with result " + IntToStr(Msg.WParam));
end;


Как-то так...
Заранее прошу прощения за возможные очепятки - писал прямо тут...

При открытии экземпляра TForm1 при помощи метода ShowNoModal, ей передается Handle формы, в которую надо будет потом вернуть результат, что и производится при закрытии экземпляра TForm1 путем передачи сообщения WM_ACCEPTRESULT (окну CallerHandle, которое у нас - вызвавшая форма Form2) с результатом в WParam. Вызвавший экземпляр TForm2 получает сообщение WM_ACCEPTRESULT, и извлекает результат.

Небольшой комментарий: Так как TForm1 и TForm2 размещены в разных модулях (в примере я их описал и реализовал вместе, но их надо разнести, я думаю - это понятно), то константа MM_ACCEPTRESULT должен быть определена или в обоих модулях, или в отдельном модуле, который необходимо будет подключить к двум этим модулям.
Значение WM_USER + $40 - некритично, подробнее смотрите справку по WM_USER и  пользовательским сообщениям.


 
API   (2006-02-24 01:02) [8]

WM_ACCEPTRESULT

Очепятался, конечно. По всему тексту - MM_ACCEPTRESULT. Хотя, можете назначить свое собственное название константе. Или вообще, отказаться от нее и везде прописывать конкретное числовое значение, но я не рекомендую.


 
Kolan ©   (2006-02-24 01:06) [9]

Все ясно :). Даже слишком хорошо...


 
Kolan ©   (2006-02-24 01:10) [10]

Еще раз благодарю за супер подробный ответ.

Правда ответа вроде: "посылай сообщение при закрытии окна.." наверно хватило бы. :)

Вообщем спасибо. Я даже страницу схранил :)


 
API   (2006-02-24 01:11) [11]

[3]
finally
 F.Free;
end;


Это лучше, все же, заменить на F.Release. Посмотрите в справке - почему.

[7]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);


В этом методе, в общем случае, следовало бы прописать Action := caFree;, чтобы форма сама уничтожалась.

Ну да хватит уже советов, а то я ухожу от темы ветки...



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
15-1139824556
Гарри Поттер
2006-02-13 12:55
2006.03.12
VPN+Outlook+Exchange


15-1139988050
DelphiN!
2006-02-15 10:20
2006.03.12
Требуется программист на Delphi. г.Алматы. р.Казахстан


2-1140893991
Serg1981
2006-02-25 21:59
2006.03.12
Размер файла


6-1132919309
Dmitry_177
2005-11-25 14:48
2006.03.12
RasConnectionNotification, определение дисконнекта


2-1140541048
Wel
2006-02-21 19:57
2006.03.12
C++Builder