Как извлечь данные из динамически сгенерированной формы? - PullRequest
1 голос
/ 26 октября 2011

У меня проблемы с получением информации из форм, которые были сгенерированы программой динамически.

Моя программа работает до тех пор, пока ей не понадобятся данные от пользователя; в этот момент он должен запустить форму ввода и извлечь из нее данные.

Приведенный ниже пример кода запускается и отображает форму ввода, но не разрешает вводить ее. Возвращает длину текста в поле редактирования при инициализации формы.

Что неверного в этом подходе?

Если возможно, я хочу сохранить общий подход к разделению интерфейсов и реализации (включая формы); Я также хочу продолжать использовать немодальное отображение форм.

EDIT

После исследования модальных форм, предложенных @Ken White, я решил, что модальные формы не подходят для того, что я пытался сделать. Я придумал решение, которое кратко изложено так:

  1. Два интерфейса:
  2. IResult - определен для переноса необходимых данных из формы в UserInput.
  3. IUserInput - получить пользовательский ввод из формы в IResult.
  4. Две функции создателя - по одной для каждого интерфейса.
  5. Реализация интерфейсов - один объект для каждого интерфейса и один для фактической формы ввода пользователя.

Я написал подробное описание этого решения.

КОНЕЦ РЕДАКТИРОВАНИЯ

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.

1 Ответ

6 голосов
/ 26 октября 2011

Ваш код, который вы опубликовали, не позволяет пользователю вводить данные до того, как он извлечет содержимое TForm6.Edit1.Text. Вы в основном говорите:

  1. Создать форму
  2. Показать его пользователю
  3. Немедленно прочитайте все, что было установлено во время разработки, в Edit1.Text формы

Если вы хотите получить контент от пользователя, вы должны дать ему возможность передать его вам. Вам нужно либо использовать ShowModal, чтобы представить форму и позволить пользователю вводить содержимое, либо использовать Show, чтобы форма передавала информацию обратно (через некоторый механизм, например PostMessage, или обработчик событий, как упоминал Джерри в своем комментарии. ) когда пользователь нажимает кнопку, чтобы сообщить, что есть данные для извлечения.

Тем не менее, по-прежнему необходимо предоставить пользователю возможность предоставить ввод, прежде чем вы сможете его извлечь.

...