![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно делать диалоги?
Kolan © (2007-11-06 10:41:00)Здравстввуйте,
Допустип мне надо сделать диалог с 2 Editfvb, 2 Combo, и 1 CheckBox как его оформить?
Вот я поступаю так:
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
end;
finally
DefectDialog.Free;
end;
А как надо?
Kolan (2007-11-06 11:39:00) [1]> их можно упаковать в record. Причем, и те и другие
Ну ясно. Вообщем ответ я получил. Благодарю.
clickmaker (2007-11-06 11:32:00) [2]
> Тут еще не покатип при большом списке параметров. Будет
> «Long Parameter List».
их можно упаковать в record. Причем, и те и другие
Kolan (2007-11-06 11:29:00) [3]> Тебе и карты в руки
То есть как лучьше делать?
Где создавать экземпляр?
> Res := TDefectDialogForm.Execute(, params>);
Тут еще не покатип при большом списке параметров. Будет «Long Parameter List».
Первыйвариант мне ненравится тем, что клиент манипулирует формой.
> ну, популярностью пользуются два варианта
К сожалению оба эти варианта мне изветсны. Я думал мож есть еще что-то.
clickmaker (2007-11-06 11:13:00) [4]
> Где создавать экземпляр?
ну, популярностью пользуются два варианта
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:08:00) [5]> Тебе и карты в руки
То есть как лучьше делать?
Где создавать экземпляр?
clickmaker (2007-11-06 11:06:00) [6]а зачем разбивать диалог на 2 класса - визуальный и не- ?
В VCL для стандартных типа opendialog так сделано, потому что это оболочки для виндозных функций-диалогов, но здесь форма-то - твоя целиком. Тебе и карты в руки
Kolan (2007-11-06 10:47:00) [7]> а почему сомнения, что не так что-то делаешь?
Причина раз тут попахивате feature envy.
Причина два Форму видно в модуле, как бы её спрятать?
clickmaker (2007-11-06 10:44:00) [8]а почему сомнения, что не так что-то делаешь?