Несколько форм в Delphi - PullRequest
1 голос
/ 18 марта 2010

В моем Delphi Project я хочу иметь кнопку «Настройки», которая при нажатии открывает вторую форму (я думаю, что это правильный термин, я, по сути, хочу открыть новое окно) для настроек.

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

Настройки, которые вводит пользователь, также должны быть доступны для первой, «основной» формы.

Так, например, если моя программа состояла из основной формы, которая вычисляла «A» + «B» (A и B - целочисленные переменные), а форма настроек позволяла пользователю устанавливать значения для A и B, как бы я это сделал?

Ответы [ 3 ]

4 голосов
/ 18 марта 2010

Это не так уж сложно, если вы понимаете объектную модель Delphi. Форма - это объект, который происходит от TObject и поддерживается файлом DFM, чтобы упростить настройку макета. Элементы управления на нем являются другими объектами, и по умолчанию они общедоступны для других объектов из других модулей, как и ваша другая форма. Есть два способа сделать это.

Самый простой способ - сделать так, чтобы код другой формы считывал значения из элементов управления непосредственно после завершения работы с первой формой. Просто используйте такие вещи, как MyString := Form2.EditBox.Text;. Это не очень хороший стиль, но он работает.

Правильный способ сделать это - добавить в форму открытые свойства, которые будут извлекать значения элементов управления, или функцию, которая будет читать их и возвращать какой-либо объект или запись, содержащую все настройки. Это требует немного больше работы, но в результате получается более чистый код, который с меньшей вероятностью вызовет проблемы, если вы измените что-то в будущем.

РЕДАКТИРОВАТЬ: В ответ на вопрос в комментарии:

Чтобы сделать одну форму показанной и скрыть другую, вы вызываете Показать и скрыть ее. Или, если вы хотите, чтобы он отображался в модальном диалоговом окне, вызовите метод ShowModal, который позаботится о сокрытии, пока вы создаете кнопку, которая устанавливает ModalResult. (Подробнее о работе этих методов см. В справочном файле.)

Конечно, форма должна быть создана в первую очередь. Либо он может быть автоматически создан DPR, что хорошо для простых программ, но не так хорошо, когда вы получаете много форм в своем приложении, или вы можете создать его в коде. У Хенка есть пример того, как это сделать, хотя я бы не рекомендовал использовать ключевое слово с . И если вы создали форму самостоятельно, обязательно освободите ее после этого.

2 голосов
/ 18 марта 2010

Я обычно проектирую форму настроек и добавляю к ней функцию класса execute, которая изменяет запись, содержащую поля для настроек, например:

Tf_MySettings = class(TForm)
  // ...
private
  procedure SetData(const _Settings: TSettingsRec);
  procedure GetData(out _Settings: TSettingsRec);
public
  class function Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean;
end;

implementation

function Tf_MySettings.Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean;
var
  frm: Tf_MySettings;
begin
  frm := Tf_MySettings.Create(_Owner);
  try
    frm.SetData(_Settings);
    // for this to work, the OK button must have ModalResult=mrOK
    Result := frm.ShowModal = mrOK;
    if Result then
      frm.GetData(_Settings);
  finally
    frm.Free;
  end;
end;

procedure Tf_MySettings.SetData(const _Settings: TMySettingsRec);
begin
  ed_Name.Text := _Settings.Name;
  // ...
end;

procedure Tf_MySettings.GetData(out _Settings: TMySettingsRec);
begin
  _Settings.Name := ed_Name.Text;
  // ...
end;

Вы называете это так:

if Tf_MySettings.Execute(self, _Settings) then begin
  // settings have been changed
end;
0 голосов
/ 18 марта 2010

Я бы создал настройки объектов в форме 1 и отправил бы их в форму 2:

TSettings = class 
private    
  FPropA: integer;   
  FPropB: string; 
published 
  property PropA: integer read FPropA write FPropA:  
  property PropB: string read FPropB write FPropB: 
end;

...
form2.EditSettings(ASettings);
...