Статьи Королевства Дельфи

       

L1_pas


unit F_TbDlg;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Db, DBTables, DbItf, Buttons, DbItfT;

type

TTbDlgFr = class (TForm)

TbNameEdit: TEdit;

TbCaptionEdit: TEdit;

TbDescrEdit: TEdit;

OkBtn: TButton;

CancelBtn: TButton;

TbDbTypeComboBox: TComboBox;



Label1: TLabel;

procedure CancelBtnClick(Sender: TObject);

procedure OkBtnClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure TbNameEditKeyPress(Sender: TObject; var Key: Char);

procedure TbNameEditKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

private

FDbInterface : TDbInterface;

FpTInfoCategory : pTInfoCategory;

procedure Set_FDbInterface(const Value: TDbInterface);

Function Init : Bool;

procedure Set_FpTInfoCategory(const Value: pTInfoCategory);

public

function Execute : Bool;

Property ppTInfoCategory : pTInfoCategory read FpTInfoCategory

write Set_FpTInfoCategory;

published

Property DbInterface : TDbInterface read FDbInterface

write Set_FDbInterface;

end;

Var

TbDlgFr : TTbDlgFr;

implementation

uses F_TbDef;

{$R *.DFM}

{ TTbDlgFr }

function TTbDlgFr.Execute: Bool;

Var

k : Integer;

wpTInfoCategory : pTInfoCategory;

begin

k := TbDbTypeComboBox.ItemIndex;

// При приеме данных от пользователя - добавить префикс

wpTInfoCategory := pTInfoCategory(TbDbTypeComboBox.Items.Objects[k]);

FDbInterface.N_pTTableInfo.sTableAttr.Values['sTableName'] :=

wpTInfoCategory.sPrefix + TbNameEdit.Text;

FDbInterface.N_pTTableInfo.sTableAttr.Values['sTableAccess'] := '';

FDbInterface.N_pTTableInfo.sTableAttr.Values['sTableCaption'] := TbCaptionEdit.Text;

FDbInterface.N_pTTableInfo.sTableAttr.Values['sTableDescr'] := TbDescrEdit.Text;

Result := True;

end;

procedure TTbDlgFr.CancelBtnClick(Sender: TObject);

begin

Close;

end;

procedure TTbDlgFr.OkBtnClick(Sender: TObject);

Var

wTableName : String;

begin

// В имя таблицы нужно добавить префикс категории информации


wTableName := FpTInfoCategory.sPrefix + TbNameEdit.Text;

// Создание буферного экземпляра структуры таблицы

// с добавлением ссылки в список ссылочных типов

FDbInterface.Init_NpTTableInfo(wTableName, True);

if not Execute then

Exit;

if TbDefFr = nil then

TbDefFr := TTbDefFr.Create(nil);

try

TbDefFr.DbInterface := FDbInterface;

TbDefFr.ppTTableInfo := FDbInterface.N_pTTableInfo;

TbDefFr.ppTInfoCategory := FpTInfoCategory;

TbDefFr.ShowModal;

// Если таблица не была все же создана..

if not TbDefFr.Execute then

// ..освобождение ресурсов из-под FN_pTTableInfo

begin

// Единичный акт создания таблицы сопровождается обновлением

// списков типов данных системы

FDbInterface.Kill_NpTTableInfo(True);

end;

finally

TbDefFr.Free;

TbDefFr := nil;

end;

Close;

end;

procedure TTbDlgFr.Set_FDbInterface(const Value: TDbInterface);

begin

FDbInterface := Value;

end;

procedure TTbDlgFr.FormCreate(Sender: TObject);

Var

k : Integer;

begin

FpTInfoCategory := nil;

for k := 0 to ComponentCount - 1 do

if TComponent(Components[k]) is TEdit then

TEdit(Components[k]).Clear;

end;

procedure TTbDlgFr.Set_FpTInfoCategory(const Value: pTInfoCategory);

begin

FpTInfoCategory := Value;

end;

Function TTbDlgFr.Init : Bool;

begin

Result := False;

if FDbInterface = nil then

Exit;

// Список категорий информации

TbDbTypeComboBox.Items.Clear;

TbDbTypeComboBox.Items.Assign(FDbInterface.FbDbTypeList);

TbDbTypeComboBox.Sorted := True;

// Если на входе категорию информации на задали - выбрать первую

if FpTInfoCategory = nil then

begin

TbDbTypeComboBox.ItemIndex := 0;

FpTInfoCategory := pTInfoCategory(TbDbTypeComboBox.Items.Objects[0]);

end

else

TbDbTypeComboBox.ItemIndex :=

TbDbTypeComboBox.Items.IndexOfObject(TObject(FpTInfoCategory));

Result := True;

end;

procedure TTbDlgFr.FormActivate(Sender: TObject);

Var

wFullTbName, wS,

wCategPrefix, s : String;

kICateg,

kPrefixL, k : Integer;

wpTInfoCategory : pTInfoCategory;

begin

Init;

kPrefixL := Length(FpTInfoCategory.sPrefix);



wS := TbNameEdit.Text;

// Если название таблицы оказалось не заданным - предлагаем его

if Trim(wS) = '' then

begin { Имя таблицы не задано }

wFullTbName := FDbInterface.Get_UniqueTableName(apDbType);

// Выделяем из wFullTbName префикс для категории информации

wCategPrefix := Copy(wFullTbName, 1, kPrefixL);

// Предварительно ставим неопределенную категорию информфации

wpTInfoCategory := nil;

for k:=0 to FDbInterface.InfoCategoryList.Count-1 do

begin

wpTInfoCategory := pTInfoCategory(FDbInterface.InfoCategoryList[k]);

if wpTInfoCategory.sEnumName = 'icNoCateg' then

Break

else

wpTInfoCategory := nil;

end;

wS := wpTInfoCategory.sInfoDescr;

TbDbTypeComboBox.ItemIndex := TbDbTypeComboBox.Items.IndexOf(wS);

for kICateg := 0 to FDbInterface.InfoCategoryList.Count-1 do

begin

if pTInfoCategory(FDbInterface.InfoCategoryList[kICateg]) = nil then

Continue;

if pTInfoCategory(FDbInterface.InfoCategoryList[kICateg]).sPrefix =

wCategPrefix then

begin

s := pTInfoCategory(FDbInterface.InfoCategoryList[kICateg]).sInfoDescr;

TbDbTypeComboBox.ItemIndex := TbDbTypeComboBox.Items.IndexOf(s);

Break;

end;

end;

{ Заполняем поля информацией по умолчанию }

{ Пользователю префикс не показываем }

System.Delete(wFullTbName, 1, kPrefixL);

TbNameEdit.Text := wFullTbName;

TbCaptionEdit.Text := wFullTbName;

TbDescrEdit.Text := 'Таблица БД ' + wFullTbName;

end;

end;

procedure TTbDlgFr.TbNameEditKeyPress(Sender: TObject; var Key: Char);

begin

if Key = #13 then

FindNextControl(Sender as TWinControl, True, True, True).SetFocus;

end;

procedure TTbDlgFr.TbNameEditKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if Key = VK_UP then

FindNextControl(Sender as TWinControl, False, True, True).SetFocus

else if Key = VK_DOWN then

FindNextControl(Sender as TWinControl, True, True, True).SetFocus;

end;

end.


Содержание раздела