home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 October
/
Chip_2001-10_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d6
/
FRCLX.ZIP
/
SOURCE
/
IBX
/
FR_IBXTable.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-07-06
|
14KB
|
527 lines
{******************************************}
{ }
{ FastReport CLX v2.4 - IBX components }
{ Table component }
{ }
{ Copyright (c) 2000 by EMS }
{ Copyright (c) 1998-2001 by Tzyganenko A. }
{ }
{******************************************}
unit FR_IBXTable;
interface
{$I FR.inc}
uses
Types, SysUtils, Classes, QGraphics, FR_Class, QStdCtrls,
QControls, QForms, QMenus, QDialogs, DB, FR_DBSet, IBDatabase,
IBCustomDataSet, IBTable;
type
TfrIBXDataset = class(TfrNonVisualControl)
protected
FDataSet: TIBCustomDataSet;
FDataSource: TDataSource;
FDBDataSet: TfrDBDataset;
procedure FieldsEditor(Sender: TObject);
procedure ReadFields(Stream: TStream);
procedure WriteFields(Stream: TStream);
procedure SetPropValue(Index: String; Value: Variant); override;
function GetPropValue(Index: String): Variant; override;
function DoMethod(MethodName: String; Par1, Par2, Par3: Variant): Variant; override;
public
constructor Create; override;
destructor Destroy; override;
procedure DefineProperties; override;
procedure Loaded; override;
procedure ShowEditor; override;
end;
TfrIBXTable = class(TfrIBXDataSet)
private
FTable: TIBTable;
procedure JoinEditor(Sender: TObject);
protected
procedure SetPropValue(Index: String; Value: Variant); override;
function GetPropValue(Index: String): Variant; override;
public
constructor Create; override;
destructor Destroy; override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure DefineProperties; override;
procedure Loaded; override;
property Table: TIBTable read FTable;
end;
implementation
uses
FR_DBUtils, FR_Utils, FR_Const, FR_LEdit, FR_DBFldEditor,
FR_IBXMd, Variants;
{ TfrIBXDataSet }
constructor TfrIBXDataSet.Create;
begin
inherited Create;
FDataSource := TDataSource.Create(frDialogForm);
FDataSource.DataSet := nil;
FDBDataSet := TfrDBDataSet.Create(frDialogForm);
FDBDataSet.DataSource := FDataSource;
Flags := Flags or flDontUndo;
end;
destructor TfrIBXDataSet.Destroy;
begin
FDBDataset.Free;
FDataSource.Free;
FDataSet.Free;
inherited Destroy;
end;
procedure TfrIBXDataSet.DefineProperties;
function GetDatabases: String;
var
i: Integer;
sl: TStringList;
begin
Result := '';
sl := TStringList.Create;
frGetComponents(frDialogForm, TIBDatabase, sl, nil);
sl.Sort;
for i := 0 to sl.Count - 1 do
Result := Result + sl[i] + ';';
sl.Free;
end;
begin
inherited DefineProperties;
AddProperty('Active', [frdtBoolean], nil);
AddEnumProperty('Database', GetDatabases, [Null]);
AddProperty('Fields', [frdtHasEditor, frdtOneObject], FieldsEditor);
AddProperty('FieldCount', [], nil);
AddProperty('Filter', [frdtString], nil);
AddProperty('EOF', [], nil);
AddProperty('RecordCount', [], nil);
{$IFNDEF Delphi2}
AddProperty('IsEmpty', [], nil);
{$ENDIF}
end;
procedure TfrIBXDataSet.SetPropValue(Index: String; Value: Variant);
var
d : TIBDatabase;
begin
inherited SetPropValue(Index, Value);
Index := AnsiUpperCase(Index);
if Index = 'NAME' then
begin
FDataSource.Name := 'S' + FDataSet.Name;
FDBDataSet.Name := '_' + FDataSet.Name;
end
else if Index = 'ACTIVE' then
FDataSet.Active := Value
else if Index = 'DATABASE' then
begin
d := frFindComponent(FDataSet.Owner, Value) as TIBDatabase;
FDataSet.Database := d;
end
else if Index = 'FILTER' then
begin
FDataSet.Filter := Value;
FDataSet.Filtered := Trim(Value) <> '';
end;
end;
function TfrIBXDataSet.GetPropValue(Index: String): Variant;
function frGetDataBaseName(Owner: TComponent; d: TIBDatabase): String;
begin
Result := '';
if d <> nil then
begin
Result := d.Name;
if d.Owner <> Owner then
Result := d.Owner.Name + '.' + Result;
end;
end;
begin
Index := AnsiUpperCase(Index);
Result := inherited GetPropValue(Index);
if Result <> Null then Exit;
if Index = 'ACTIVE' then
Result := FDataSet.Active
else if Index = 'DATABASE' then
Result := frGetDataBaseName(FDataSet.Owner, FDataSet.Database)
else if Index = 'FILTER' then
Result := FDataSet.Filter
else if Index = 'EOF' then
Result := FDataSet.Eof
else if Index = 'RECORDCOUNT' then
Result := FDataSet.RecordCount
else if Index = 'FIELDCOUNT' then
Result := FDataSet.FieldCount
{$IFNDEF Delphi2}
else if Index = 'ISEMPTY' then
Result := FDataSet.IsEmpty
{$ENDIF}
end;
function TfrIBXDataSet.DoMethod(MethodName: String; Par1, Par2, Par3: Variant): Variant;
begin
Result := inherited DoMethod(MethodName, Par1, Par2, Par3);
if MethodName = 'GETINDEXPROPERTY' then
begin
if Par1 = 'FIELDS' then
Result := FDataSet.FieldByName(Par2).AsVariant;
end
else if MethodName = 'OPEN' then
FDataSet.Open
else if MethodName = 'CLOSE' then
FDataSet.Close
else if MethodName = 'NEXT' then
FDataSet.Next
else if MethodName = 'PRIOR' then
FDataSet.Prior
else if MethodName = 'FIRST' then
FDataSet.First
else if MethodName = 'LAST' then
FDataSet.Last
else if MethodName = 'FETCHALL' then
FDataSet.FetchAll
end;
procedure TfrIBXDataSet.ReadFields(Stream: TStream);
var
i: Integer;
n: Word;
s: String;
Field: TField;
ds1: TDataset;
fName: String;
fType: TFieldType;
fLookup: Boolean;
fSize: Word;
fDefs: TFieldDefs;
begin
fDefs := FDataSet.FieldDefs;
Stream.Read(n, 2); // FieldCount
for i := 0 to n - 1 do
begin
fType := TFieldType(frReadByte(Stream)); // DataType
fName := frReadString(Stream); // FieldName
fLookup := frReadBoolean(Stream); // Lookup
fSize := frReadWord(Stream); // Size
fDefs.Add(fName, fType, fSize, False);
Field := fDefs[fDefs.Count - 1].CreateField(FDataSet);
if fLookup then
with Field do
begin
Lookup := True;
KeyFields := frReadString(Stream); // KeyFields
s := frReadString(Stream); // LookupDataset
ds1 := frFindComponent(FDataSet.Owner, s) as TDataSet;
FFixupList['.' + FieldName] := s;
LookupDataset := ds1;
LookupKeyFields := frReadString(Stream); // LookupKeyFields
LookupResultField := frReadString(Stream); // LookupResultField
end;
end;
end;
procedure TfrIBXDataSet.WriteFields(Stream: TStream);
var
i: Integer;
s: String;
SaveActive: Boolean;
begin
SaveActive := FDataSet.Active;
FDataSet.Close;
frWriteWord(Stream, FDataSet.FieldCount); // FieldCount
for i := 0 to FDataSet.FieldCount - 1 do
with FDataSet.Fields[i] do
begin
frWriteByte(Stream, Byte(DataType)); // DataType
frWriteString(Stream, FieldName); // FieldName
frWriteBoolean(Stream, Lookup); // Lookup
frWriteWord(Stream, Size); // Size
if Lookup then
begin
frWriteString(Stream, KeyFields); // KeyFields
if LookupDataset <> nil then
begin
s := LookupDataset.Name;
if LookupDataset.Owner <> FDataSet.Owner then
s := LookupDataset.Owner.Name + '.' + s;
end
else
s := '';
frWriteString(Stream, s); // LookupDataset
frWriteString(Stream, LookupKeyFields); // LookupKeyFields
frWriteString(Stream, LookupResultField); // LookupResultField
end;
end;
FDataSet.Active := SaveActive;
end;
procedure TfrIBXDataSet.Loaded;
var
i: Integer;
s: String;
ds: TDataSet;
f: TField;
begin
// fixup component references
try
Prop['DataBase'] := FFixupList['DataBase'];
for i := 0 to FFixupList.Count - 1 do
begin
s := FFixupList.Name[i];
if s[1] = '.' then // lookup field
begin
f := FDataSet.FindField(Copy(s, 2, 255));
ds := frFindComponent(FDataSet.Owner, FFixupList.Value[i]) as TDataSet;
f.LookupDataset := ds;
end
end;
Prop['Active'] := FFixupList['Active'];
except;
end;
end;
procedure TfrIBXDataSet.ShowEditor;
begin
FieldsEditor(nil);
end;
procedure TfrIBXDataSet.FieldsEditor(Sender: TObject);
var
SaveActive: Boolean;
begin
SaveActive := FDataSet.Active;
FDataSet.Close;
with TfrDBFieldsEditorForm.Create(nil) do
begin
DataSet := FDataSet;
ShowModal;
frDesigner.Modified := True;
Free;
end;
FDataSet.Active := SaveActive;
end;
{ TfrIBXTable }
constructor TfrIBXTable.Create;
begin
inherited Create;
FTable := TIBTable.Create(frDialogForm);
FDataSet := FTable;
FDataSource.DataSet := FDataSet;
Component := FTable;
BaseName := 'Table';
Bmp.LoadFromResourceName(hInstance, 'FR_IBXTABLE');
end;
destructor TfrIBXTable.Destroy;
begin
FDataSet := nil;
FTable.Free;
inherited Destroy;
end;
procedure TfrIBXTable.DefineProperties;
function GetIndexNames: String;
var
i: Integer;
begin
Result := '';
try
with FTable do
if (TableName <> '') and (IndexDefs <> nil) then
begin
IndexDefs.Update;
for i := 0 to IndexDefs.Count - 1 do
if IndexDefs[i].Name <> '' then
Result := Result + IndexDefs[i].Name + ';';
end;
except;
end;
end;
function GetIndexFieldNames: String;
begin
Result := '';
try
with FTable do
if (TableName <> '') then
begin
Result := IndexFieldNames;
end;
except
end;
end;
function GetMasterSource: String;
var
i: Integer;
sl: TStringList;
begin
Result := '';
sl := TStringList.Create;
frGetComponents(FTable.Owner, TDataSet, sl, FTable);
sl.Sort;
for i := 0 to sl.Count - 1 do
Result := Result + sl[i] + ';';
sl.Free;
end;
function GetTableNames: String;
var
i: Integer;
sl: TStringList;
begin
Result := '';
if FTable.Database <> nil then
begin
sl := TStringList.Create;
FTable.DataBase.GetTableNames(sl, False);
sl.Sort;
for i := 0 to sl.Count - 1 do
Result := Result + sl[i] + ';';
sl.Free;
end;
end;
begin
inherited DefineProperties;
AddEnumProperty('IndexName', GetIndexNames, [Null]);
AddEnumProperty('IndexFieldNames', GetIndexFieldNames, [Null]);
AddProperty('MasterFields', [frdtHasEditor, frdtOneObject], JoinEditor);
AddEnumProperty('MasterSource', GetMasterSource, [Null]);
AddEnumProperty('TableName', GetTableNames, [Null]);
end;
procedure TfrIBXTable.SetPropValue(Index: String; Value: Variant);
var
d: TDataset;
begin
inherited SetPropValue(Index, Value);
Index := AnsiUpperCase(Index);
if Index = 'INDEXNAME' then
FTable.IndexName := Value
else if Index = 'INDEXFIELDNAMES' then
FTable.IndexFieldNames := Value
else if Index = 'MASTERSOURCE' then
begin
d := frFindComponent(FTable.Owner, Value) as TDataSet;
FTable.MasterSource := frGetDataSource(FTable.Owner, d);
end
else if Index = 'TABLENAME' then
FTable.TableName := Value
end;
function TfrIBXTable.GetPropValue(Index: String): Variant;
begin
Index := AnsiUpperCase(Index);
Result := inherited GetPropValue(Index);
if Result <> Null then Exit;
if Index = 'INDEXNAME' then
Result := FTable.IndexName
else if Index = 'INDEXFIELDNAMES' then
Result := FTable.IndexFieldNames
else if Index = 'MASTERSOURCE' then
Result := frGetDataSetName(FTable.Owner, FTable.MasterSource)
else if Index = 'TABLENAME' then
Result := FTable.TableName
end;
procedure TfrIBXTable.LoadFromStream(Stream: TStream);
begin
FFixupList.Clear;
inherited LoadFromStream(Stream);
FFixupList['DataBase'] := frReadString(Stream);
Prop['DataBase'] := FFixupList['DataBase'];
FTable.TableName := frReadString(Stream);
FTable.Filter := frReadString(Stream);
FTable.Filtered := Trim(FTable.Filter) <> '';
FTable.IndexName := frReadString(Stream);
FTable.IndexFieldNames := frReadString(Stream);
FTable.MasterFields := frReadString(Stream);
FFixupList['MasterSource'] := frReadString(Stream);
Prop['MasterSource'] := FFixupList['MasterSource'];
FFixupList['Active'] := frReadBoolean(Stream);
ReadFields(Stream);
try
FTable.Active := FFixupList['Active'];
except;
end;
end;
procedure TfrIBXTable.SaveToStream(Stream: TStream);
begin
inherited SaveToStream(Stream);
frWriteString(Stream, Prop['DataBase']);
frWriteString(Stream, FTable.TableName);
frWriteString(Stream, FTable.Filter);
frWriteString(Stream, FTable.IndexName);
frWriteString(Stream, FTable.IndexFieldNames);
frWriteString(Stream, FTable.MasterFields);
frWriteString(Stream, Prop['MasterSource']);
frWriteBoolean(Stream, FTable.Active);
WriteFields(Stream);
end;
procedure TfrIBXTable.Loaded;
begin
Prop['MasterSource'] := FFixupList['MasterSource'];
inherited Loaded;
end;
procedure TfrIBXTable.JoinEditor(Sender: TObject);
begin
with TfrIBXFieldsLinkForm.Create(nil) do
begin
MasterDS := frFindComponent(FTable.Owner, Prop['MasterSource']) as TDataSet;
DetailDS := FTable;
if MasterDS <> nil then
begin
ShowModal;
frDesigner.Modified := True;
end;
Free;
end;
end;
var
Bmp: TBitmap;
initialization
Bmp := TBitmap.Create;
Bmp.LoadFromResourceName(hInstance, 'FR_IBXTABLECONTROL');
frRegisterControl(TfrIBXTable, Bmp, (SInsertTable));
finalization
frUnRegisterObject(TfrIBXTable);
Bmp.Free;
end.