Несколько форм в delphi

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

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

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

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


person chendriksen    schedule 18.03.2010    source источник


Ответы (3)


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

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

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

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

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

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

person Mason Wheeler    schedule 18.03.2010
comment
Спасибо! Я попробую сложный, чистый способ, я думаю... Если у меня есть две формы в программе, Form1 и Form2, как я могу сделать так, чтобы одна отображалась или скрывалась от другой формы. Я пробовал форму2. из Form1, но это не сработало. - person chendriksen; 18.03.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;
person dummzeuch    schedule 18.03.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);
person Daniel Luyo    schedule 18.03.2010