Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

Как правильно делать диалоги?   Найти похожие ветки 

 
Kolan ©   (2007-11-06 10:41) [0]

Здравстввуйте,
 Допустип мне надо сделать диалог с 2 Editfvb, 2 Combo, и 1 CheckBox&#133 как его оформить?

Вот я поступаю так:


 TDefectDialogForm = class(TForm)
   Bevel1: TBevel;
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   Label1: TLabel;
   DefectNameEdit: TEdit;
   BlockLabel: TLabel;
   BlockComboBox: TComboBox;
   Label2: TLabel;
   GroupComboBox: TComboBox;
   Label3: TLabel;
   FactorEdit: TEdit;
   DeprecatedDefectCheckBox: TCheckBox;
 private
   { Private declarations }
   FLoadGroupsEvent: TLoadGroupsEvent;
   procedure DoLoadGroupsEvent(
     BlockName: string; BlockIndex: Integer; GroupList: TStrings);
 public
   { Public declarations }
   property OnLoadGroups: TLoadGroupsEvent read
     FLoadGroupsEvent write FLoadGroupsEvent;
 end;

 TDefectDialog = class
 private
   FDefectDialogForm: TDefectDialogForm;
   function GetDefectName: string;
   procedure SetDefectName(const Value: string);
   function GetBlocks: TStrings;
   procedure SetBlocks(const Value: TStrings);
   function GetGroups: TStrings;
   procedure SetGroups(const Value: TStrings);
   function GetFactor: Double;
   procedure SetFactor(const Value: Double);
   function GetIsDeprecated: Boolean;
   procedure SetIsDeprecated(const Value: Boolean);
   function GetBlockIndex: Integer;
   procedure SetBlockIndex(const Value: Integer);
   function GetGroupIndex: Integer;
   procedure SetGroupIndex(const Value: Integer);
   function GetLoadGroupsEvent: TLoadGroupsEvent;
   procedure SetLoadGroupsEvent(const Value: TLoadGroupsEvent);
 public
   function Execute: Boolean;

   constructor Create;
   destructor Destroy; override;

   property DefectName: string read GetDefectName write SetDefectName;
   property Blocks: TStrings read GetBlocks write SetBlocks;
   property Groups: TStrings read GetGroups write SetGroups;
   property Factor: Double read GetFactor write SetFactor;
   property IsDeprecated: Boolean read GetIsDeprecated write SetIsDeprecated;
   property BlockIndex: Integer read GetBlockIndex write SetBlockIndex;
   property GroupIndex: Integer read GetGroupIndex write SetGroupIndex;

   property OnLoadGroups: TLoadGroupsEvent read
     GetLoadGroupsEvent write SetLoadGroupsEvent;
 end;


Методы:
procedure TDefectDialog.SetDefectName(const Value: string);
begin
 if FDefectDialogForm.DefectNameEdit.Text <> Value then
   FDefectDialogForm.DefectNameEdit.Text := Value;
end;


function TDefectDialog.GetDefectName: string;
begin
 Result := FDefectDialogForm.DefectNameEdit.Text;
end;


И Соотв пользую так:
begin
 DefectDialog := TDefectDialog.Create;
 try
   <Устанавливаю свойства>
   if DefectDialog.Execute then
   begin
     <&#133>
   end;
 finally
   DefectDialog.Free;
 end;


А как надо?


 
clickmaker ©   (2007-11-06 10:44) [1]

а почему сомнения, что не так что-то делаешь?


 
Kolan ©   (2007-11-06 10:47) [2]

> а почему сомнения, что не так что-то делаешь?

Причина раз &#151; тут попахивате feature envy.
Причина два &#151; Форму видно в модуле, как бы её спрятать?


 
clickmaker ©   (2007-11-06 11:06) [3]

а зачем разбивать диалог на 2 класса - визуальный и не- ?
В VCL для стандартных типа opendialog так сделано, потому что это оболочки для виндозных функций-диалогов, но здесь форма-то - твоя целиком. Тебе и карты в руки


 
Kolan ©   (2007-11-06 11:08) [4]

> Тебе и карты в руки

То есть как лучьше делать?
Где создавать экземпляр?


 
clickmaker ©   (2007-11-06 11:13) [5]


> Где создавать экземпляр?

ну, популярностью пользуются два варианта

var Dlg: TDefectDialogForm;

 Dlg := TDefectDialogForm.Create(Application);
 with Dlg do begin
    try
      // Устанавливаем свойства
      Res := ShowModal;
     // Получаем что-то от диалога
    finally
      Free;
    end;
  end;

либо

Res := TDefectDialogForm.Execute(<input params>, <output params>);

где Execute - class function

Адепты "чистого" ООП ко второму варианту относятся скептически, дабы он несколько сдвигает концепцию к процедурно-ориентированной, а по науке надо все через свойства передавать. Но тем не менее, иногда очень удобно, особенно, если вызывается во многих местах


 
Kolan ©   (2007-11-06 11:29) [6]

> Тебе и карты в руки

То есть как лучьше делать?
Где создавать экземпляр?
> Res := TDefectDialogForm.Execute(<input params>, <output
> params>);

Тут еще не покатип при большом списке параметров. Будет &laquo;Long Parameter List&raquo;.

Первыйвариант мне ненравится тем, что клиент манипулирует формой.


> ну, популярностью пользуются два варианта

К сожалению оба эти варианта мне изветсны. Я думал мож есть еще что-то.


 
clickmaker ©   (2007-11-06 11:32) [7]


> Тут еще не покатип при большом списке параметров. Будет
> «Long Parameter List».

их можно упаковать в record. Причем, и те и другие


 
Kolan ©   (2007-11-06 11:39) [8]

> их можно упаковать в record. Причем, и те и другие

Ну ясно. Вообщем ответ я получил. Благодарю.



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
3-1184843757
ch_victor
2007-07-19 15:15
2007.12.02
подключение к ораклу через BDE


1-1189455742
Герой
2007-09-11 00:22
2007.12.02
Как нажать на запрещеную кнопку


2-1194072771
Nike85
2007-11-03 09:52
2007.12.02
Как сохранить рез-ты query в таблицу для дальнейшего импорта?


15-1194187576
lookin
2007-11-04 17:46
2007.12.02
Нужны советы по моноблоку Apple iMac 20"


15-1194017562
TUser
2007-11-02 18:32
2007.12.02
Посоветйте принтер