Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1139983253
Ega23
2006-02-15 09:00
2006.03.12
С Днём рождения! 15 февраля


2-1140578291
Непонял
2006-02-22 06:18
2006.03.12
MDI


1-1139157092
Ling
2006-02-05 19:31
2006.03.12
Работа со скролами


2-1140593231
Рафик
2006-02-22 10:27
2006.03.12
Memo


2-1140965218
Winni
2006-02-26 17:46
2006.03.12
физическое удаление записей в БД Paradox ( файлы *.mb) ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский