Bu unit program database şema dialog işleminde kullanılır.
Kod: Tümünü seç
unit ads_DlgDbSchema;
{Copyright(c)2000 Advanced Delphi Systems
Richard Maley
Advanced Delphi Systems
12613 Maidens Bower Drive
Potomac, MD 20854 USA
phone 301-840-1554
maley@advdelphisys.com
The code herein can be used or modified by anyone. Please retain references
to Richard Maley at Advanced Delphi Systems. If you make improvements to the
code please send your improvements to maley@advdelphisys.com so that the
entire Delphi community can benefit. All comments are welcome.
}
(*
Description: ads_DlgDbSchema.pas.pas
This unit contains
*)
interface
{!~DBDlgSchema_ads
}
Function DBDlgSchema_ads(DatabaseName, TableName: String): Boolean;
implementation
Uses
ads_GraphicStrings,
ads_DlgDBFieldName,
ads_Exception,
Buttons,
Classes,
ComCtrls,
Controls,
Db,
DBTables,
Dialogs,
ExtCtrls,
Forms,
Graphics,
Grids,
StdCtrls,
SysUtils,
Windows
;
Var
UnitName : String;
ProcName : String;
const
TFieldType_S_ads : array[TFieldType] of string =
(
'Unknown',
'String',
'Smallint',
'Integer',
'Word',
'Boolean',
'Float',
'Currency',
'BCD',
'Date',
'Time',
'DateTime',
'Bytes',
'VarBytes',
{$IFDEF WIN32} 'AutoInc', {$ENDIF}
'Blob',
'Memo',
'Graphic'
{$IFDEF WIN32}
,
'Fmted Memo',
'Paradox Ole',
'DBase Ole',
'Typed Binary',
'Cursor',
'FixedChar',
'WideString',
'LargeInt',
'ADT',
'Array',
'Reference',
'DataSet'
{$ENDIF}
);
type
TDBSchemaDlg_ads = Class(TScrollingWinControl)
Public
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
Public
Table1: TTable;
PanelButtons: TPanel;
FontDialog1: TFontDialog;
PanelTop: TPanel;
PanelFields: TPanel;
GroupBoxFields: TGroupBox;
Struc: TStringGrid;
PanelIndices: TPanel;
GroupBoxIndices: TGroupBox;
Indices: TStringGrid;
PanelButtonSlider: TPanel;
ButtonPrint: TBitBtn;
ButtonFont: TBitBtn;
ButtonTable: TBitBtn;
ButtonClose: TBitBtn;
SaveDialog: TSaveDialog;
BitBtn1: TBitBtn;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonCloseClick(Sender: TObject);
procedure ButtonFontClick(Sender: TObject);
procedure ButtonTableClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure ButtonPrintClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure StrucSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure IndicesSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
FTitle : String; {stores the Dialog Title}
FBeveled : Boolean; {Selected panels have beveling if true}
FButtonsReSize : Boolean; {Buttons resize if true}
FButtonsAlignment : TAlignment; {taLeftJustify, taCenter, taRightJustify}
FButtonWidth : Integer; {Sets Button Widths}
FButtonSpacer : Integer; {Sets Button Spacer Width}
FApplyChanges : Boolean; {True if changes should be made. = mrOk}
FTable : TTable; {The initial table}
FColorOfGridFixed : TColor; {The color of the fixed cells in the grid}
FColorOfGrid : TColor; {The color of the non fixed cells in the grid}
FIsComponent : Boolean; {True if Form is part of a component,
False if Form is a standalone form,
Default is False}
FReSizeNow : Boolean; {Causes the form to resize when the
property is set}
FMinFormWidth : Integer; {Sets a Minimum FormWidth}
FMinFormHeight : Integer; {Sets a Minimum FormHeight}
FDatabaseName: String;
FTableName: String; {Company Phone presented in shareware message}
procedure SetReSizeNow(Value : Boolean);
procedure SetMinFormWidth(Value : Integer);
procedure SetMinFormHeight(Value : Integer);
procedure SetBeveled(Value : Boolean);
procedure SetDatabaseName(Value: String);
procedure SetTableName(Value: String);
Procedure PanelBevel(Beveled : Boolean; Panel: TPanel);
Function IsFieldKeyed(DatabaseName, TableName, FieldName: String): Boolean;
Function IsTable(DatabaseName, TableName: String): Boolean;
Function IsField(DatabaseName, TableName, FieldName: String): Boolean;
Function StringPad(
InputStr,
FillChar: String;
StrLen: Integer;
StrJustify: Boolean): String;
public
{ Public declarations }
procedure ReSizeAll;
procedure SetBevel;
procedure CustomPrint(Print : Boolean);
procedure DisplayStructure;
property IsComponent : Boolean
Read FIsComponent
Write FIsComponent;
property ReSizeNow : Boolean
Read FReSizeNow
Write SetReSizeNow;
published
property Title : String {stores the Dialog Title}
read FTitle
write FTitle;
property Beveled : Boolean {Selected panels have beveling if true}
Read FBeveled
Write SetBeveled;
property ButtonsReSize : Boolean {Buttons resize if true}
Read FButtonsReSize
Write FButtonsReSize;
property ButtonsAlignment : TAlignment {taLeftJustify, taCenter, taRightJustify}
Read FButtonsAlignment
Write FButtonsAlignment;
property ButtonWidth : Integer {Sets Button Widths}
Read FButtonWidth
Write FButtonWidth;
property ButtonSpacer : Integer {Sets Button Spacer Width}
Read FButtonSpacer
Write FButtonSpacer;
property ApplyChanges: Boolean {True if changes should be made. = mrOk}
Read FApplyChanges
Write FApplyChanges;
property DatabaseName: String
Read FDatabaseName
Write SetDatabaseName;
property TableName: String
Read FTableName
Write SetTableName;
property Table : TTable
Read FTable
Write FTable;
property ColorOfGridFixed : TColor {The color of the fixed cells in the grid}
Read FColorOfGridFixed
Write FColorOfGridFixed;
property ColorOfGrid : TColor {The color of the non fixed cells in the grid}
Read FColorOfGrid
Write FColorOfGrid;
property MinFormWidth : Integer {Sets the form's Minimum Width}
Read FMinFormWidth
Write SetMinFormWidth;
property MinFormHeight : Integer {Sets the form's Minimum Height}
Read FMinFormHeight
Write SetMinFormHeight;
end;
procedure TDBSchemaDlg_ads.ReSizeAll;
Var
ColW : Integer;
H : Integer;
Begin
ProcName := 'TDBSchemaDlg_ads.ReSizeAll'; Try
If Width < MinFormWidth Then Width := MinFormWidth;
If Height < MinFormHeight Then Height := MinFormHeight;
If PanelIndices.Visible Then
Begin
H := (Indices.RowCount * Indices.DefaultRowHeight) +
20 + {Height Addition for the GroupBox}
(PanelIndices.BorderWidth * 2) +
(PanelIndices.BevelWidth * 4) +
2 + {Single Line Border Style}
26 + {ScrollBars}
4; {Margin}
PanelIndices.Height := H;
End;
ColW := (Struc.Width div 9) -3;
Struc.ColWidths[0] := ColW * 1;
Struc.ColWidths[1] := ColW * 3;
Struc.ColWidths[2] := ColW * 2;
Struc.ColWidths[3] := ColW * 1;
Struc.ColWidths[4] := ColW * 2;
ColW := (Indices.Width div 8) -1;
Indices.ColWidths[0] := ColW * 2;
Indices.ColWidths[1] := ColW * 2;
Indices.ColWidths[2] := ColW * 2;
Indices.ColWidths[3] := ColW * 2;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.FormActivate(Sender: TObject);
Var
H : Integer;
Begin
ProcName := 'TDBSchemaDlg_ads.FormActivate'; Try
H := 24;
If IsComponent Then
Begin
{}
End
Else
Begin
Caption := Title; {stores the Dialog Title}
Struc.FixedColor := ColorOfGridFixed;
Indices.FixedColor := ColorOfGridFixed;
Struc.Color := ColorOfGrid;
Indices.Color := ColorOfGrid;
If ColorOfGrid = clNavy Then
Begin
Struc .Font.Color:= clWhite;
Indices.Font.Color:= clWhite;
End;
If Font.Size > 0 Then
Begin
H := ((Font.Size * 72) div Font.PixelsPerInch) * 3;
End;
Struc.DefaultRowHeight := H;
Indices.DefaultRowHeight := H;
SetBevel;
If Screen.Width < Width Then
Begin
Left := Screen.Width-26;
End
Else
Begin
Left := (Screen.Width - Width) div 2;
End;
If Screen.Height < Height Then
Begin
Top := Screen.Height-26;
End
Else
Begin
Top := (Screen.Height - Height) div 2;
End;
End;
If Not (Table = nil) Then
Begin
Table1 := Table;
End;
DisplayStructure;
ReSizeAll;
If Not (Table1.TableName = '') Then
Begin
TForm(Owner).
Caption :=
'Structure of ' +
UpperCase(Table1.DatabaseName) +
' : ' +
UpperCase(Table1.TableName);
End
Else
Begin
TForm(Owner).
Caption :=
'Structural Information';
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.FormCreate(Sender: TObject);
begin
ProcName := 'TDBSchemaDlg_ads.FormCreate'; Try
Title := 'Structural Information';{stores the Dialog Title}
Beveled := False; {Selected panels have beveling if true}
ButtonsReSize := False; {Buttons resize if true}
ButtonsAlignment := taCenter; {taLeftJustify, taCenter, taRightJustify}
ButtonWidth := 75; {Sets Button Widths}
ButtonSpacer := 10; {Sets Button Spacer Width}
ApplyChanges := False; {True if changes should be made. = mrOk}
Table := nil;
ColorOfGridFixed := clNavy; {The color of the fixed cells in the grid}
ColorOfGrid := clNavy; {The color of the non fixed cells in the grid}
IsComponent := False; {True if Form is part of a component,
False if Form is a standalone form,
Default is False}
FMinFormWidth := 300; {Sets a Minimum FormWidth}
FMinFormHeight := 350; {Sets a Minimum FormHeight}
{Set bevel prior to resizing}
SetBevel;
{ReSize at the end of the create}
ReSizeAll;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.ButtonCloseClick(Sender: TObject);
begin
ProcName := 'TDBSchemaDlg_ads.ButtonCloseClick'; Try
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.ButtonFontClick(Sender: TObject);
Var
H : Integer;
begin
ProcName := 'TDBSchemaDlg_ads.ButtonFontClick'; Try
H := 24;
FontDialog1.Font := Font;
If FontDialog1.Execute Then
Begin
Font := FontDialog1.Font;
If Font.Size > 0 Then
Begin
H := ((Font.Size * 72) div Font.PixelsPerInch) * 3;
End;
Struc.DefaultRowHeight := H;
Indices.DefaultRowHeight := H;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.ButtonTableClick(Sender: TObject);
Var
RowNo : Integer;
ColNo : Integer;
boRetVal : Boolean;
begin
ProcName := 'TDBSchemaDlg_ads.ButtonTableClick'; Try
boRetVal :=
DlgDBTableName_ads(
FDatabaseName,
FTableName);
If boRetVal Then
Begin
For ColNo := 0 To Struc.ColCount - 1 Do
Begin
For RowNo := 0 To Struc.RowCount - 1 Do
Begin
Struc.Cells[ColNo,RowNo] := '';
End;
End;
For ColNo := 0 To Indices.ColCount - 1 Do
Begin
For RowNo := 0 To Indices.RowCount - 1 Do
Begin
Indices.Cells[ColNo,RowNo] := '';
End;
End;
End
Else
Begin
Exit;
End;
Struc.ColCount := 5;
Struc.RowCount := 2;
Indices.ColCount := 4;
Indices.RowCount:= 2;
Table1.Active := False;
Table1.DatabaseName := DatabaseName;
Table1.TableName := TableName;
Table1.Active := True;
DisplayStructure;
ReSizeAll;
Caption :=
'Structure of ' +
DatabaseName +
' : ' +
TableName;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.DisplayStructure;
Var
RecNo : Integer;
i: Integer;
S: String;
begin
ProcName := 'TDBSchemaDlg_ads.DisplayStructure'; Try
If Table1.TableName = '' Then
Begin
PanelIndices.Visible := False;
Exit;
End;
Try
If Not Table1.Active Then Table1.Active := True;
Except
Exit;
End;
Struc.ColCount := 5;
Struc.RowCount := Table1.FieldCount+1;
For RecNo := 0 to Table1.FieldCount - 1 Do
Begin
Struc.Cells[0,RecNo+1] := IntToStr(Table1.FieldDefs.Items[RecNo].FieldNo);
End;
Struc.Cells[1,0] := 'Field Name';
For RecNo := 0 to Table1.FieldCount - 1 Do
Begin
Struc.Cells[1,RecNo+1] := Table1.FieldDefs.Items[RecNo].Name;
End;
Struc.Cells[2,0] := 'Data Type';
For RecNo := 0 to Table1.FieldCount - 1 Do
Begin
Struc.Cells[2,RecNo+1] :=
TFieldType_S_ads[Table1.FieldDefs.Items[RecNo].DataType];
End;
Struc.Cells[3,0] := 'Size';
For RecNo := 0 to Table1.FieldCount - 1 Do
Begin
Struc.Cells[3,RecNo+1] := IntToStr(Table1.FieldDefs.Items[RecNo].Size);
End;
Struc.Cells[4,0] := 'Key/Req''d';
For RecNo := 0 to Table1.FieldCount - 1 Do
Begin
If IsFieldKeyed(
Table1.DatabaseName,
Table1.TableName,
Table1.FieldDefs.Items[RecNo].Name)
Then
//If Table1.FieldDefs.Items[RecNo].Required Then
Begin
Struc.Cells[4,RecNo+1] := '*';
End;
End;
with Table1 do
begin
Open;
{Refresh IndexDefs object}
IndexDefs.Update;
if IndexDefs.Count > 0 then
begin
PanelIndices.Visible := True;
{Set up columns and rows in grid to match IndexDefs items}
Indices.ColCount := 4;
Indices.RowCount := IndexDefs.Count + 1;
{Set grid column labels to TIndexDef property names}
Indices.Cells[0, 0] := 'Name';
Indices.ColWidths[0] := 200;
Indices.Cells[1, 0] := 'Fields';
Indices.ColWidths[1] := 200;
Indices.Cells[2, 0] := 'Expression';
Indices.ColWidths[2] := 200;
Indices.Cells[3, 0] := 'Options';
Indices.ColWidths[3] := 300;
{Loop through IndexDefs.Items}
for i := 0 to IndexDefs.Count - 1 do begin
{Fill grid cells for current row}
Indices.Cells[0, i + 1] := IndexDefs.Items[i].Name;
Indices.Cells[1, i + 1] := IndexDefs.Items[i].Fields;
Indices.Cells[2, i + 1] := IndexDefs.Items[i].Expression;
if ixPrimary in IndexDefs.Items[i].Options then
S := 'ixPrimary, ';
if ixUnique in IndexDefs.Items[i].Options then
S := S + 'ixUnique, ';
if ixDescending in IndexDefs.Items[i].Options then
S := S + 'ixDescending, ';
if ixCaseInsensitive in IndexDefs.Items[i].Options then
S := S + 'ixCaseInsensitive, ';
if ixExpression in IndexDefs.Items[i].Options then
S := S + 'ixExpression, ';
if S > ' ' then begin
{Get rid of trailing ", "}
System.Delete(S, Length(S) - 1, 2);
Indices.Cells[3, i + 1] := S;
end;
end;
End
Else
Begin
PanelIndices.Visible := False;
end;
end;
If Not (Table1.TableName = '') Then
Begin
TForm(Owner).
Caption :=
'Structure of ' +
UpperCase(Table1.DatabaseName) +
' : ' +
UpperCase(Table1.TableName);
End
Else
Begin
TForm(Owner).
Caption :=
'Structural Information';
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.FormResize(Sender: TObject);
begin
ProcName := 'TDBSchemaDlg_ads.FormResize'; Try
ReSizeAll;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.ButtonPrintClick(Sender: TObject);
begin
ProcName := 'TDBSchemaDlg_ads.ButtonPrintClick'; Try
CustomPrint(True);
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.SetBevel;
Begin
ProcName := 'TDBSchemaDlg_ads.SetBevel'; Try
PanelBevel(Beveled,PanelFields);
PanelBevel(Beveled,PanelIndices);
PanelBevel(Beveled,PanelButtons);
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.SetBeveled(Value : Boolean);
Begin
ProcName := 'TDBSchemaDlg_ads.SetBeveled'; Try
FBeveled := Value;
SetBevel;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.SetReSizeNow(Value : Boolean);
Begin
ProcName := 'TDBSchemaDlg_ads.SetReSizeNow'; Try
ReSizeAll;
FReSizeNow := Value;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.SetMinFormWidth(Value : Integer);
Begin
ProcName := 'TDBSchemaDlg_ads.SetMinFormWidth'; Try
If FMinFormWidth <> Value Then FMinFormWidth := Value;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.SetMinFormHeight(Value : Integer);
Begin
ProcName := 'TDBSchemaDlg_ads.SetMinFormHeight'; Try
If FMinFormHeight <> Value Then FMinFormHeight := Value;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.SetDatabaseName(Value: String);
begin
ProcName := 'TDBSchemaDlg_ads.SetDatabaseName'; Try
FDatabaseName := Value;
Table1.DatabaseName := Value;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.SetTableName(Value: String);
begin
ProcName := 'TDBSchemaDlg_ads.SetTableName'; Try
FTableName := Value;
Table1.TableName := Value;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
Procedure TDBSchemaDlg_ads.PanelBevel(Beveled : Boolean; Panel: TPanel);
Begin
ProcName := 'TDBSchemaDlg_ads.PanelBevel'; Try
If Not Beveled Then
Begin
Panel.BevelOuter := bvNone;
Panel.BevelInner := bvNone;
Panel.BorderStyle:= bsNone;
End
Else
Begin
Panel.BevelOuter := bvRaised;
Panel.BevelInner := bvLowered;
Panel.BorderStyle:= bsSingle;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Function TDBSchemaDlg_ads.IsFieldKeyed(DatabaseName, TableName, FieldName: String): Boolean;
Var
Table : TTable;
FieldIndex : Integer;
i : Integer;
KeyCount : Integer;
LocalTable : Boolean;
ParadoxTbl : Boolean;
DBaseTable : Boolean;
TempString : String;
Begin
Result := False;
ProcName := 'TDBSchemaDlg_ads.IsFieldKeyed'; Try
If Not IsTable(DatabaseName, TableName) Then Exit;
If Not IsField(DatabaseName, TableName, FieldName) Then Exit;
TempString := UpperCase(Copy(TableName,Length(TableName)-2,3));
ParadoxTbl := (Pos('.DB',TempString) > 0);
TempString := UpperCase(Copy(TableName,Length(TableName)-3,4));
DBaseTable := (Pos('.DBF',TempString) > 0);
LocalTable := (ParadoxTbl Or DBaseTable);
Table := TTable.Create(nil);
Try
Try
Table.DatabaseName := DatabaseName;
Table.TableName := TableName;
Table.Active := True;
KeyCount := Table.IndexFieldCount;
FieldIndex := Table.FieldDefs.IndexOf(FieldName);
If LocalTable Then
Begin
If ParadoxTbl Then
Begin
Result := (FieldIndex < KeyCount);
End
Else
Begin
Table.IndexDefs.UpDate;
For i := 0 To Table.IndexDefs.Count-1 Do
Begin
{Need to check if FieldName is in the Expression listing}
If Pos(UpperCase(FieldName),UpperCase(Table.IndexDefs[i].Expression))>0 Then
Begin
Result := True;
Break;
End;
{Need to check if FieldName is in the Fields listing}
If Pos(UpperCase(FieldName),UpperCase(Table.IndexDefs[i].Fields))>0 Then
Begin
Result := True;
Break;
End;
End;
End;
End
Else
Begin
If Table.
FieldDefs[FieldIndex].
Required
Then
Begin
Result := True;
End;
End;
Except
End;
Finally
Table.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Function TDBSchemaDlg_ads.IsTable(DatabaseName, TableName: String): Boolean;
Var
Query : TQuery;
Begin
Result := False;
ProcName := 'TDBSchemaDlg_ads.IsTable'; Try
Query := TQuery.Create(nil);
Try
Try
Query.DatabaseName := DatabaseName;
Query.Sql.Clear;
Query.Sql.Add('Select *');
Query.Sql.Add('From');
If (Pos('.DB', UpperCase(TableName)) > 0) Or
(Pos('.DBF',UpperCase(TableName)) > 0) Then
Begin
Query.Sql.Add('"'+TableName+'"');
End
Else
Begin
Query.Sql.Add(TableName);
End;
Query.Active := True;
Result := True;
Except
End;
Finally
Query.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Function TDBSchemaDlg_ads.IsField(DatabaseName, TableName, FieldName: String): Boolean;
Var
Query : TQuery;
T : TTable;
i : Integer;
UpperFN : String;
TestFN : String;
Begin
Result := False;
ProcName:= 'TDBSchemaDlg_ads.IsField'; Try
UpperFN := UpperCase(FieldName);
If Not IsTable(DatabaseName, TableName) Then Exit;
Query := TQuery.Create(nil);
T := TTable.Create(nil);
Try
Try
Query.DatabaseName := DatabaseName;
Query.Sql.Clear;
Query.Sql.Add('Select ');
Query.Sql.Add('a.'+FieldName+' XYZ');
Query.Sql.Add('From');
If (Pos('.DB', UpperCase(TableName)) > 0) Or
(Pos('.DBF',UpperCase(TableName)) > 0) Then
Begin
Query.Sql.Add('"'+TableName+'" a');
End
Else
Begin
Query.Sql.Add(TableName+' a');
End;
Query.Active := True;
Result := True;
Except
Try
T.Active := False;
T.DatabaseName := DatabaseName;
T.TableName := TableName;
T.Active := True;
If T.FieldDefs.IndexOf(FieldName) > -1 Then
Begin
Result := True;
End
Else
Begin
For i := 0 To T.FieldDefs.Count -1 Do
Begin
TestFN := UpperCase(T.FieldDefs[i].Name);
If TestFN = UpperFN Then
Begin
Result := True;
Break;
End;
End;
End;
T.Active := False;
Except
End;
End;
Finally
Query.Free;
T.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Function TDBSchemaDlg_ads.StringPad(
InputStr,
FillChar: String;
StrLen: Integer;
StrJustify: Boolean): String;
Var
TempFill: String;
Counter : Integer;
Begin
ProcName := 'TDBSchemaDlg_ads.StringPad'; Try
If Not (Length(InputStr) = StrLen) Then
Begin
If Length(InputStr) > StrLen Then
Begin
InputStr := Copy(InputStr,1,StrLen);
End
Else
Begin
TempFill := '';
For Counter := 1 To StrLen-Length(InputStr) Do
Begin
TempFill := TempFill + FillChar;
End;
If StrJustify Then
Begin
{Left Justified}
InputStr := InputStr + TempFill;
End
Else
Begin
{Right Justified}
InputStr := TempFill + InputStr ;
End;
End;
End;
Result := InputStr;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
procedure TDBSchemaDlg_ads.CustomPrint(Print : Boolean);
Var
arIndicWidths : Array of Integer;
arStrucWidths : Array of Integer;
Grid : TStringGrid;
inCol : Integer;
inLen : Integer;
inMax : Integer;
inPad : Integer;
inRow : Integer;
lstText : TStringList;
RichText : TRichEdit;
sgCaption : String;
sgTemp : String;
Function IsObject(TestObject: TObject;AncestorClass: TClass): Boolean;
Begin
Result := (TestObject Is AncestorClass);
End;
begin
ProcName := 'TDBSchemaDlg_ads.CustomPrint'; Try
inPad := 5;
sgCaption := '';
If Self.Owner is TForm Then
Begin
sgCaption := TForm(Self.Owner).Caption;
If sgCaption = 'Structural Information' Then
Begin
ShowMessage('There is nothing to print.');
Exit;
End;
End
Else
Begin
If IsObject(Self,TForm) Then
Begin
sgCaption := TForm(Self).Caption;
If sgCaption = 'Structural Information' Then
Begin
ShowMessage('There is nothing to print.');
Exit;
End;
End;
End;
SetLength(arStrucWidths,Struc.ColCount);
SetLength(arIndicWidths,Indices.ColCount);
For inCol := 0 To Struc.ColCount - 1 Do
Begin
arStrucWidths[inCol] := 1;
End;
For inCol := 0 To Indices.ColCount - 1 Do
Begin
arIndicWidths[inCol] := 1;
End;
For inCol := 0 To Struc.ColCount - 1 Do
Begin
inMax := 1;
For inRow := 0 To Struc.RowCount - 1 Do
Begin
sgTemp := Struc.Cells[inCol,inRow];
inLen := Length(sgTemp);
If inLen > inMax Then inMax := inLen;
End;
arStrucWidths[inCol] := inMax+inPad;
End;
For inCol := 0 To Indices.ColCount - 1 Do
Begin
inMax := 1;
For inRow := 0 To Indices.RowCount - 1 Do
Begin
sgTemp := Indices.Cells[inCol,inRow];
inLen := Length(sgTemp);
If inLen > inMax Then inMax := inLen;
End;
arIndicWidths[inCol] := inMax+inPad;
End;
lstText := TStringList.Create();
RichText:= TRichEdit.Create(nil);
Try
RichText.Parent := Application.MainForm;
RichText.Visible := False;
RichText.Font.Name := 'Courier New';
lstText.Clear;
lstText.Add(sgCaption);
lstText.Add('');
lstText.Add('SCHEMA:');
Grid := Struc;
For inRow := 0 To Grid.RowCount - 1 Do
Begin
sgTemp := '';
For inCol := 0 To Grid.ColCount - 1 Do
Begin
inLen := arStrucWidths[inCol];
sgTemp := sgTemp + StringPad(Grid.Cells[inCol,inRow],' ',inLen,True);
End;
lstText.Add(sgTemp);
End;
lstText.Add('');
lstText.Add('INDICES:');
Grid := Indices;
For inRow := 0 To Grid.RowCount - 1 Do
Begin
sgTemp := '';
For inCol := 0 To Grid.ColCount - 1 Do
Begin
inLen := arIndicWidths[inCol];
sgTemp := sgTemp + StringPad(Grid.Cells[inCol,inRow],' ',inLen,True);
End;
lstText.Add(sgTemp);
End;
RichText.Lines.SetText(PChar(lstText.Text));
If Print Then
Begin
RichText.Print(sgCaption);
End
Else
Begin
If SaveDialog.Execute Then
Begin
RichText.Lines.SaveToFile(SaveDialog.FileName);
End;
End;
Finally
lstText .Free;
RichText.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.BitBtn1Click(Sender: TObject);
begin
ProcName := 'TDBSchemaDlg_ads.BitBtn1Click'; Try
CustomPrint(False);
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.StrucSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
ProcName := 'TDBSchemaDlg_ads.StrucSelectCell'; Try
CanSelect := False;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
procedure TDBSchemaDlg_ads.IndicesSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
ProcName := 'TDBSchemaDlg_ads.IndicesSelectCell'; Try
CanSelect := False;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
end;
Constructor TDBSchemaDlg_ads.Create(AOwner: TComponent);
Function IsControl(Obj: TObject): Boolean;
Begin
Result := (Obj is TControl);
End;
Begin
ProcName := 'TDBSchemaDlg_ads.Create'; Try
inherited;
Self.Parent := TWincontrol(AOwner);
PanelButtons := TPanel.Create(AOwner);
With PanelButtons Do
Begin
If IsControl(PanelButtons) Then
Begin
Parent := Self;
End;
Left := 0;
Top := 320;
Width := 492;
Height := 58;
Align := alBottom;
BevelOuter := bvNone;
BorderWidth := 10;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
PanelButtonSlider := TPanel.Create(AOwner);
With PanelButtonSlider Do
Begin
Parent := PanelButtons;
Left := 288;
Top := 10;
Width := 194;
Height := 38;
Align := alRight;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
ButtonPrint := TBitBtn.Create(AOwner);
With ButtonPrint Do
Begin
Parent := PanelButtonSlider;
Left := 40;
Top := 0;
Width := 35;
Height := 33;
Hint := 'Print this schema.';
Caption := ' ';
TabOrder := 0;
OnClick := ButtonPrintClick;
StringToGlyph_ads(Glyph,'object TBitmap_ads Bitmap.Data = {'+
' 06020000424D0602000000000000760000002800000028000000140000000100'+
' 0400000000009001000000000000000000001000000010000000000000000000'+
' 8000008000000080800080000000800080008080000080808000C0C0C0000000'+
' FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333'+
' 333333333333333333333333333333333333333333333333333FFF3333333333'+
' FFF33300033333333330003333777FFFFFFFFFF777FF30000000000000000003'+
' 3777777777777777777F30F8888888888888880337F3333333333333337F30F8'+
' 888888888888880337F3333333333333337F30F8888888888899880337F33333'+
' 33333333337F30FFFFFFFFFFFFFFFF0337FFFFFFFFFFFFFFFF7F370077777777'+
' 7777007337777777777777777773333000000000000003333337777777777777'+
' 7F3333300FFFFFFFFFF0033333377F3FFFFFFFF7733333330F00000000F03333'+
' 33337F7777777737F33333330FFFFFFFFFF0333333337F3FFFFFFFF7F3333333'+
' 0F00000000F0333333337F7777777737F33333330FFFFFFFFFF0333333337F3F'+
' F3333337F33333330F00FFFFFFF0333333337F7733333337F33333330FFFFFFF'+
' FFF0333333337FFFFFFFFFF7F333333300000000000033333333777777777777'+
' 3333333333333333333333333333333333333333333333333333333333333333'+
' 33333333333333333333}end');
NumGlyphs := 2;
End;
ButtonFont := TBitBtn.Create(AOwner);
With ButtonFont Do
Begin
Parent := PanelButtonSlider;
Left := 79;
Top := 0;
Width := 35;
Height := 33;
Hint := 'Change the font.';
TabOrder := 1;
OnClick := ButtonFontClick;
StringToGlyph_ads(Glyph,'object TBitmap_ads Bitmap.Data = {'+
' 96010000424D9601000000000000760000002800000018000000180000000100'+
' 0400000000002001000000000000000000001000000010000000000000000000'+
' 8000008000000080800080000000800080008080000080808000C0C0C0000000'+
' FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333'+
' 3333333333333333333333333333333333333700000000000000000000033788'+
' 8888888888888888880337884488888888888888880337884488888888888888'+
' 8803378844888888888717888803378844488888888818888803378844888888'+
' 8888187888033788448888888888111888033788444488558888187888033788'+
' 8888888758881887880337888888888858871111880337888888888858888888'+
' 8803378888888885558888888803378888888888588888888803378888888888'+
' 5788888888033788888888888558888888033788888888888888888888033700'+
' 0000000000000000000337F0CCCCCCCCCCCCCC0F0F0337777777777777777777'+
' 7773333333333333333333333333333333333333333333333333}end');
End;
ButtonTable := TBitBtn.Create(AOwner);
With ButtonTable Do
Begin
Parent := PanelButtonSlider;
Left := 119;
Top := 0;
Width := 35;
Height := 33;
Hint := 'Select a table to view its structure.';
TabOrder := 2;
OnClick := ButtonTableClick;
StringToGlyph_ads(Glyph,'object TBitmap_ads Bitmap.Data = {'+
' 96010000424D9601000000000000760000002800000018000000180000000100'+
' 0400000000002001000000000000000000001000000010000000000000000000'+
' 8000008000000080800080000000800080008080000080808000C0C0C0000000'+
' FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF009999C9999999'+
' 9C99999999999999C99999999C99999999999999C99999999C99999999999999'+
' C99999999C99999999999999C99999999C99999999999999C99999999C999999'+
' 99999999C9999C999C9999C999999999C9999C999C9999C999999999CCCCCCCC'+
' CC9999C9999999999C33333333C999C99999999999C33333333C99C999999000'+
' 000C33333333C0C9999990880FFFCC3333333CC99999908F0F8F8CCCCCCCCCC9'+
' 999990880FFFFFFFFFFFFF099999908F0F8F8F8F8F8F8F09999990880FFFFFFF'+
' FFFFFF099999908F0F8F8F8F8F8F8F09999990880FFFFFFFFFFFFF0999999000'+
' 00000000000000099999908808F8F8F8F8F8F809999990F80888888888888809'+
' 9999900000000000000000099999999999999999999999999999}end');
End;
ButtonClose := TBitBtn.Create(AOwner);
With ButtonClose Do
Begin
Parent := PanelButtonSlider;
Left := 158;
Top := 0;
Width := 35;
Height := 33;
Hint := 'Close this window.';
ModalResult := 1;
TabOrder := 3;
OnClick := ButtonCloseClick;
StringToGlyph_ads(Glyph,'object TBitmap_ads Bitmap.Data = {'+
' 06020000424D0602000000000000760000002800000028000000140000000100'+
' 0400000000009001000000000000000000001000000010000000000000000000'+
' 80000080000000808000800000008000800080800000C0C0C000808080000000'+
' FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00377777777777'+
' 777777773FFFFFFFFFFFF333333F888888888888F7F7F7888888888888883333'+
' 33888888888888877F7F788888888888888F333FF88844444400888FFF444444'+
' 88888888888333888883333334D5007FFF433333333338F888F3338F33333333'+
' 345D50FFFF4333333333388788F3338F3333333334D5D0FFFF433333333338F8'+
' 78F3338F33333333345D50FEFE4333333333388788F3338F3333333334D5D0FF'+
' FF433333333338F878F3338F33333333345D50FEFE4333333333388788F3338F'+
' 3333333334D5D0FFFF433333333338F878F3338F33333333345D50FEFE433333'+
' 3333388788F3338F3333333334D5D0EFEF433333333338F878F3338F33333333'+
' 345D50FEFE4333333333388788F3338F3333333334D5D0EFEF433333333338F8'+
' F8FFFF8F33333333344444444443333333333888888888833333333333333333'+
' 3333333333333333FFFFFF333333333333300000033333333333333888888F33'+
' 333333333330AAAA0333333333333338FFFF8F33333333333330000003333333'+
' 33333338888883333333}end');
NumGlyphs := 2;
End;
BitBtn1 := TBitBtn.Create(AOwner);
With BitBtn1 Do
Begin
Parent := PanelButtonSlider;
Left := 0;
Top := 0;
Width := 35;
Height := 33;
Hint := 'Save the schema to file.';
TabOrder := 4;
OnClick := BitBtn1Click;
StringToGlyph_ads(Glyph,'object TBitmap_ads Bitmap.Data = {'+
' 76010000424D7601000000000000760000002800000020000000100000000100'+
' 04000000000000010000120B0000120B00001000000000000000000000000000'+
' 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000'+
' FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333'+
' 333333FFFFFFFFFFFFF33000077777770033377777777777773F000007888888'+
' 00037F3337F3FF37F37F00000780088800037F3337F77F37F37F000007800888'+
' 00037F3337F77FF7F37F00000788888800037F3337777777337F000000000000'+
' 00037F3FFFFFFFFFFF7F00000000000000037F77777777777F7F000FFFFFFFFF'+
' 00037F7F333333337F7F000FFFFFFFFF00037F7F333333337F7F000FFFFFFFFF'+
' 00037F7F333333337F7F000FFFFFFFFF00037F7F333333337F7F000FFFFFFFFF'+
' 00037F7F333333337F7F000FFFFFFFFF07037F7F33333333777F000FFFFFFFFF'+
' 0003737FFFFFFFFF7F7330099999999900333777777777777733}end');
NumGlyphs := 2;
End;
PanelTop := TPanel.Create(AOwner);
With PanelTop Do
Begin
If IsControl(PanelTop) Then
Begin
Parent := Self;
End;
Left := 0;
Top := 0;
Width := 492;
Height := 320;
Align := alClient;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 1;
End;
PanelFields := TPanel.Create(AOwner);
With PanelFields Do
Begin
Parent := PanelTop;
Left := 0;
Top := 0;
Width := 492;
Height := 223;
Align := alClient;
BevelOuter := bvNone;
BorderWidth := 10;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
GroupBoxFields := TGroupBox.Create(AOwner);
With GroupBoxFields Do
Begin
Parent := PanelFields;
Left := 10;
Top := 10;
Width := 472;
Height := 203;
Align := alClient;
Caption := 'Fields';
TabOrder := 0;
End;
Struc := TStringGrid.Create(AOwner);
With Struc Do
Begin
Parent := GroupBoxFields;
Left := 2;
Top := 18;
Width := 468;
Height := 183;
Align := alClient;
BorderStyle := bsNone;
Color := clNavy;
Ctl3D := False;
FixedColor := clNavy;
Font.Color := clWhite;
Font.Height := -13;
Font.Name := 'Arial';
Font.Style := [];
Options := [goColSizing, goColMoving, goThumbTracking];
ParentCtl3D := False;
ParentFont := False;
TabOrder := 0;
OnSelectCell := StrucSelectCell;
(*
ColWidths := (
64
118
109
124
94);
RowHeights := (
24
24
24
24
24);
*)
End;
PanelIndices := TPanel.Create(AOwner);
With PanelIndices Do
Begin
Parent := PanelTop;
Left := 0;
Top := 223;
Width := 492;
Height := 97;
Align := alBottom;
BevelOuter := bvNone;
BorderWidth := 10;
Caption := ' ';
ParentColor := True;
TabOrder := 1;
End;
GroupBoxIndices := TGroupBox.Create(AOwner);
With GroupBoxIndices Do
Begin
Parent := PanelIndices;
Left := 10;
Top := 10;
Width := 472;
Height := 77;
Align := alClient;
Caption := 'Indices';
TabOrder := 0;
End;
Indices := TStringGrid.Create(AOwner);
With Indices Do
Begin
Parent := GroupBoxIndices;
Left := 2;
Top := 18;
Width := 468;
Height := 57;
Align := alClient;
BorderStyle := bsNone;
Color := clNavy;
FixedColor := clNavy;
Font.Color := clWhite;
Font.Height := -13;
Font.Name := 'Arial';
Font.Style := [];
Options := [goRowSizing, goColSizing, goColMoving, goThumbTracking];
ParentFont := False;
TabOrder := 0;
OnSelectCell := IndicesSelectCell;
(*
ColWidths := (
64
118
109
124
94);
*)
End;
Table1 := TTable.Create(AOwner);
With Table1 Do
Begin
If IsControl(Table1) Then
Begin
Parent := Self;
End;
Left := 97;
Top := 209;
End;
FontDialog1 := TFontDialog.Create(AOwner);
With FontDialog1 Do
Begin
If IsControl(FontDialog1) Then
Begin
Parent := Self;
End;
Font.Color := clWindowText;
Font.Height := -17;
Font.Name := 'System';
Font.Style := [];
MinFontSize := 0;
MaxFontSize := 0;
Left := 129;
Top := 209;
End;
SaveDialog := TSaveDialog.Create(AOwner);
With SaveDialog Do
Begin
If IsControl(SaveDialog) Then
Begin
Parent := Self;
End;
DefaultExt := '.rtf';
FileName := 'Schema.rtf';
Filter := 'RichText|*.rtf';
Title := 'Save Schema';
Left := 168;
Top := 208;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Destructor TDBSchemaDlg_ads.Destroy;
Begin
ProcName := 'TDBSchemaDlg_ads.Destroy'; Try
SaveDialog .Free;
FontDialog1 .Free;
Table1 .Free;
Indices .Free;
GroupBoxIndices .Free;
PanelIndices .Free;
Struc .Free;
GroupBoxFields .Free;
PanelFields .Free;
PanelTop .Free;
BitBtn1 .Free;
ButtonClose .Free;
ButtonTable .Free;
ButtonFont .Free;
ButtonPrint .Free;
PanelButtonSlider.Free;
PanelButtons .Free;
inherited Destroy;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
{!~DBDlgSchema_ads
}
Function DBDlgSchema_ads(DatabaseName, TableName: String): Boolean;
Var
Dialog : TForm;
Form : TDBSchemaDlg_ads;
Begin
Result := False;
Dialog := nil;
ProcName := 'DBDlgSchema_ads'; Try
Try
Dialog := TForm.Create(nil);
Form := TDBSchemaDlg_ads.Create(Dialog);
Form.Parent:= Dialog;
Form.Align := alClient;
With Dialog Do
Begin
Left := 439;
Top := 172;
Width := 500;
Height := 405;
BorderIcons := [];
Caption := 'Structural Information';
Color := clBtnFace;
Font.Color := clBlack;
Font.Height := -13;
Font.Name := 'Arial';
Font.Style := [];
StringToIcon_ads(Icon,'object TIcon_ads Icon.Data = {'+
' 0000010001002020100000000000E80200001600000028000000200000004000'+
' 0000010004000000000080020000000000000000000000000000000000000000'+
' 0000000080000080000000808000800000008000800080800000C0C0C0008080'+
' 80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF004444'+
' 4444444444444444444444444444444444444444444B44444444444444444444'+
' 44444444444B4444444444444444444444444B44444B4444B444444444444444'+
' 44444B44444B4444B444444B4444444B444444B4444B444B444444B444444444'+
' B44444B4444B444B44444B44444444444B44444B444B44B44444B44444444444'+
' 44B4444B444B44B4444B444444444444444B4444B44B4B4444B44444B4444444'+
' 4444B444B44B4B444B4444BB444444BB44444B44B44B4B44B444BB4444444444'+
' BB4444B44B4BB44B44BB44444444444444BBB44B4B4BB4B4BB44444444444444'+
' 44444BB4B4BB4BBB44444444444444444444444BBBBBBB444444444444444BBB'+
' BBBBBBBBBBBBBBBBBBBBBBBBBBB4444444444444BBBBBB444444444444444444'+
' 444444BB4BBB4BBBB4444444444444444444BB44BB4BB4B44BB4444444444444'+
' 44BB444B4B4BB44B444BBB4444444444BB4444B4B44B4B44B44444BB444444BB'+
' 44444B44B44B4B444B444444BB4444444444B444B44B4B4444B4444444444444'+
' 444B444B444B44B4444B44444444444444B4444B444B44B44444B44444444444'+
' 4B4444B4444B444B44444B4444444444B44444B4444B444B444444B44444444B'+
' 44444B44444B4444B44444444444444444444B44444B4444B444444444444444'+
' 44444444444B4444444444444444444444444444444444444444444444440000'+
' 0000000000000000000000000000000000000000000000000000000000000000'+
' 0000000000000000000000000000000000000000000000000000000000000000'+
' 0000000000000000000000000000000000000000000000000000000000000000'+
' 000000000000000000000000000000000000000000000000000000000000}end');
OldCreateOrder := True;
Position := poScreenCenter;
ShowHint := True;
OnActivate := Form.FormActivate;
OnCreate := Form.FormCreate;
OnResize := Form.FormResize;
PixelsPerInch := 96;
End;
Form.FormCreate(Dialog);
Form.DatabaseName := DatabaseName;
Form.TableName := TableName;
Dialog.ShowModal;
If Dialog.ModalResult = mrOK Then
Begin
//Do Something here
Result := True;
End;
Finally
Dialog.Free;
End;
Except On E : Exception Do RaiseError(UnitName,ProcName,E); End;
End;
Initialization
UnitName := 'ads_DlgDbSchema';
ProcName := 'Unknown';
End.