Форум: "Начинающим";
Текущий архив: 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