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.