У меня проблемы с получением информации из форм, которые были сгенерированы программой динамически.
Моя программа работает до тех пор, пока ей не понадобятся данные от пользователя; в этот момент он должен запустить форму ввода и извлечь из нее данные.
Приведенный ниже пример кода запускается и отображает форму ввода, но не разрешает вводить ее. Возвращает длину текста в поле редактирования при инициализации формы.
Что неверного в этом подходе?
Если возможно, я хочу сохранить общий подход к разделению интерфейсов и реализации (включая формы); Я также хочу продолжать использовать немодальное отображение форм.
EDIT
После исследования модальных форм, предложенных @Ken White, я решил, что модальные формы не подходят для того, что я пытался сделать. Я придумал решение, которое кратко изложено так:
- Два интерфейса:
- IResult - определен для переноса необходимых данных из формы в UserInput.
- IUserInput - получить пользовательский ввод из формы в IResult.
- Две функции создателя - по одной для каждого интерфейса.
- Реализация интерфейсов - один объект для каждого интерфейса и один для фактической формы ввода пользователя.
Я написал подробное описание этого решения.
КОНЕЦ РЕДАКТИРОВАНИЯ
program TestProject2;
uses Dialogs, Forms, StdCtrls, SysUtils;
type
ITestForm = interface
function getFormString: string;
procedure setFormString(aString: string);
end;
TForm6 = class(TForm, ITestForm)
Edit1: TEdit;
private
function getFormString: string;
procedure setFormString(aString: string);
end;
{$R Unit6.dfm}
function NewTestFormOutput: string;
var
tmpForm: TForm6;
begin
Application.CreateForm(TForm6, tmpForm);
tmpForm.Show;
Result := tmpForm.getFormString;
end;
function TForm6.getFormString: string;
begin
Result := Edit1.Text;
end;
procedure TForm6.setFormString(aString: string);
begin
Edit1.Text := aString;
end;
var
i: Integer;
parser: string;
begin
parser := NewTestFormOutput;
i := Length(parser);
ShowMessage('The length is: ' + InttoStr(i));
end.