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 >
Pascal/Delphi Source File  |  2001-07-06  |  14KB  |  527 lines

  1.  
  2. {******************************************}
  3. {                                          }
  4. {   FastReport CLX v2.4 - IBX components   }
  5. {             Table component              }
  6. {                                          }
  7. {        Copyright (c) 2000 by EMS         }
  8. { Copyright (c) 1998-2001 by Tzyganenko A. }
  9. {                                          }
  10. {******************************************}
  11.  
  12. unit FR_IBXTable;
  13.  
  14. interface
  15.  
  16. {$I FR.inc}
  17.  
  18. uses
  19.   Types, SysUtils, Classes, QGraphics, FR_Class, QStdCtrls,
  20.   QControls, QForms, QMenus, QDialogs, DB, FR_DBSet, IBDatabase,
  21.   IBCustomDataSet, IBTable;
  22.  
  23. type
  24.   TfrIBXDataset = class(TfrNonVisualControl)
  25.   protected
  26.     FDataSet: TIBCustomDataSet;
  27.     FDataSource: TDataSource;
  28.     FDBDataSet: TfrDBDataset;
  29.     procedure FieldsEditor(Sender: TObject);
  30.     procedure ReadFields(Stream: TStream);
  31.     procedure WriteFields(Stream: TStream);
  32.     procedure SetPropValue(Index: String; Value: Variant); override;
  33.     function GetPropValue(Index: String): Variant; override;
  34.     function DoMethod(MethodName: String; Par1, Par2, Par3: Variant): Variant; override;
  35.   public
  36.     constructor Create; override;
  37.     destructor Destroy; override;
  38.     procedure DefineProperties; override;
  39.     procedure Loaded; override;
  40.     procedure ShowEditor; override;
  41.   end;
  42.  
  43.   TfrIBXTable = class(TfrIBXDataSet)
  44.   private
  45.     FTable: TIBTable;
  46.     procedure JoinEditor(Sender: TObject);
  47.   protected
  48.     procedure SetPropValue(Index: String; Value: Variant); override;
  49.     function GetPropValue(Index: String): Variant; override;
  50.   public
  51.     constructor Create; override;
  52.     destructor Destroy; override;
  53.     procedure LoadFromStream(Stream: TStream); override;
  54.     procedure SaveToStream(Stream: TStream); override;
  55.     procedure DefineProperties; override;
  56.     procedure Loaded; override;
  57.     property Table: TIBTable read FTable;
  58.   end;
  59.  
  60.  
  61. implementation
  62.  
  63. uses
  64.   FR_DBUtils, FR_Utils, FR_Const, FR_LEdit, FR_DBFldEditor,
  65.   FR_IBXMd, Variants;
  66.  
  67.  
  68. { TfrIBXDataSet }
  69.  
  70. constructor TfrIBXDataSet.Create;
  71. begin
  72.   inherited Create;
  73.   FDataSource := TDataSource.Create(frDialogForm);
  74.   FDataSource.DataSet := nil;
  75.  
  76.   FDBDataSet := TfrDBDataSet.Create(frDialogForm);
  77.   FDBDataSet.DataSource := FDataSource;
  78.  
  79.   Flags := Flags or flDontUndo;
  80. end;
  81.  
  82. destructor TfrIBXDataSet.Destroy;
  83. begin
  84.   FDBDataset.Free;
  85.   FDataSource.Free;
  86.   FDataSet.Free;
  87.   inherited Destroy;
  88. end;
  89.  
  90. procedure TfrIBXDataSet.DefineProperties;
  91.  
  92.   function GetDatabases: String;
  93.   var
  94.     i: Integer;
  95.     sl: TStringList;
  96.   begin
  97.     Result := '';
  98.     sl := TStringList.Create;
  99.     frGetComponents(frDialogForm, TIBDatabase, sl, nil);
  100.     sl.Sort;
  101.     for i := 0 to sl.Count - 1 do
  102.       Result := Result + sl[i] + ';';
  103.     sl.Free;
  104.   end;
  105.  
  106. begin
  107.   inherited DefineProperties;
  108.   AddProperty('Active', [frdtBoolean], nil);
  109.   AddEnumProperty('Database', GetDatabases, [Null]);
  110.   AddProperty('Fields', [frdtHasEditor, frdtOneObject], FieldsEditor);
  111.   AddProperty('FieldCount', [], nil);
  112.   AddProperty('Filter', [frdtString], nil);
  113.   AddProperty('EOF', [], nil);
  114.   AddProperty('RecordCount', [], nil);
  115. {$IFNDEF Delphi2}
  116.   AddProperty('IsEmpty', [], nil);
  117. {$ENDIF}
  118. end;
  119.  
  120. procedure TfrIBXDataSet.SetPropValue(Index: String; Value: Variant);
  121. var
  122.   d : TIBDatabase;
  123. begin
  124.   inherited SetPropValue(Index, Value);
  125.   Index := AnsiUpperCase(Index);
  126.   if Index = 'NAME' then
  127.   begin
  128.     FDataSource.Name := 'S' + FDataSet.Name;
  129.     FDBDataSet.Name := '_' + FDataSet.Name;
  130.   end
  131.   else if Index = 'ACTIVE' then
  132.     FDataSet.Active := Value
  133.   else if Index = 'DATABASE' then
  134.   begin
  135.     d := frFindComponent(FDataSet.Owner, Value) as TIBDatabase;
  136.     FDataSet.Database := d;
  137.   end
  138.   else if Index = 'FILTER' then
  139.   begin
  140.     FDataSet.Filter := Value;
  141.     FDataSet.Filtered := Trim(Value) <> '';
  142.   end;
  143. end;
  144.  
  145. function TfrIBXDataSet.GetPropValue(Index: String): Variant;
  146.  
  147.   function frGetDataBaseName(Owner: TComponent; d: TIBDatabase): String;
  148.   begin
  149.     Result := '';
  150.     if d <> nil then
  151.     begin
  152.       Result := d.Name;
  153.       if d.Owner <> Owner then
  154.         Result := d.Owner.Name + '.' + Result;
  155.     end;
  156.   end;
  157.  
  158. begin
  159.   Index := AnsiUpperCase(Index);
  160.   Result := inherited GetPropValue(Index);
  161.   if Result <> Null then Exit;
  162.   if Index = 'ACTIVE' then
  163.     Result := FDataSet.Active
  164.   else if Index = 'DATABASE' then
  165.     Result := frGetDataBaseName(FDataSet.Owner, FDataSet.Database)
  166.   else if Index = 'FILTER' then
  167.     Result := FDataSet.Filter
  168.   else if Index = 'EOF' then
  169.     Result := FDataSet.Eof
  170.   else if Index = 'RECORDCOUNT' then
  171.     Result := FDataSet.RecordCount
  172.   else if Index = 'FIELDCOUNT' then
  173.     Result := FDataSet.FieldCount
  174. {$IFNDEF Delphi2}
  175.   else if Index = 'ISEMPTY' then
  176.     Result := FDataSet.IsEmpty
  177. {$ENDIF}
  178. end;
  179.  
  180. function TfrIBXDataSet.DoMethod(MethodName: String; Par1, Par2, Par3: Variant): Variant;
  181. begin
  182.   Result := inherited DoMethod(MethodName, Par1, Par2, Par3);
  183.   if MethodName = 'GETINDEXPROPERTY' then
  184.   begin
  185.     if Par1 = 'FIELDS' then
  186.       Result := FDataSet.FieldByName(Par2).AsVariant;
  187.   end
  188.   else if MethodName = 'OPEN' then
  189.     FDataSet.Open
  190.   else if MethodName = 'CLOSE' then
  191.     FDataSet.Close
  192.   else if MethodName = 'NEXT' then
  193.     FDataSet.Next
  194.   else if MethodName = 'PRIOR' then
  195.     FDataSet.Prior
  196.   else if MethodName = 'FIRST' then
  197.     FDataSet.First
  198.   else if MethodName = 'LAST' then
  199.     FDataSet.Last
  200.   else if MethodName = 'FETCHALL' then
  201.     FDataSet.FetchAll
  202. end;
  203.  
  204. procedure TfrIBXDataSet.ReadFields(Stream: TStream);
  205. var
  206.   i: Integer;
  207.   n: Word;
  208.   s: String;
  209.   Field: TField;
  210.   ds1: TDataset;
  211.   fName: String;
  212.   fType: TFieldType;
  213.   fLookup: Boolean;
  214.   fSize: Word;
  215.   fDefs: TFieldDefs;
  216. begin
  217.   fDefs := FDataSet.FieldDefs;
  218.   Stream.Read(n, 2);             // FieldCount
  219.   for i := 0 to n - 1 do
  220.   begin
  221.     fType := TFieldType(frReadByte(Stream));                    // DataType
  222.     fName := frReadString(Stream);                              // FieldName
  223.     fLookup := frReadBoolean(Stream);                           // Lookup
  224.     fSize := frReadWord(Stream);                                // Size
  225.  
  226.     fDefs.Add(fName, fType, fSize, False);
  227.     Field := fDefs[fDefs.Count - 1].CreateField(FDataSet);
  228.     if fLookup then
  229.       with Field do
  230.       begin
  231.         Lookup := True;
  232.         KeyFields := frReadString(Stream);                      // KeyFields
  233.         s := frReadString(Stream);                              // LookupDataset
  234.         ds1 := frFindComponent(FDataSet.Owner, s) as TDataSet;
  235.         FFixupList['.' + FieldName] := s;
  236.         LookupDataset := ds1;
  237.         LookupKeyFields := frReadString(Stream);                // LookupKeyFields
  238.         LookupResultField := frReadString(Stream);              // LookupResultField
  239.       end;
  240.   end;
  241. end;
  242.  
  243. procedure TfrIBXDataSet.WriteFields(Stream: TStream);
  244. var
  245.   i: Integer;
  246.   s: String;
  247.   SaveActive: Boolean;
  248. begin
  249.   SaveActive := FDataSet.Active;
  250.   FDataSet.Close;
  251.   frWriteWord(Stream, FDataSet.FieldCount);  // FieldCount
  252.   for i := 0 to FDataSet.FieldCount - 1 do
  253.   with FDataSet.Fields[i] do
  254.   begin
  255.     frWriteByte(Stream, Byte(DataType));          // DataType
  256.     frWriteString(Stream, FieldName);             // FieldName
  257.     frWriteBoolean(Stream, Lookup);               // Lookup
  258.     frWriteWord(Stream, Size);                    // Size
  259.  
  260.     if Lookup then
  261.     begin
  262.       frWriteString(Stream, KeyFields);           // KeyFields
  263.       if LookupDataset <> nil then
  264.       begin
  265.         s := LookupDataset.Name;
  266.         if LookupDataset.Owner <> FDataSet.Owner then
  267.           s := LookupDataset.Owner.Name + '.' + s;
  268.       end
  269.       else
  270.         s := '';
  271.       frWriteString(Stream, s);                   // LookupDataset
  272.       frWriteString(Stream, LookupKeyFields);     // LookupKeyFields
  273.       frWriteString(Stream, LookupResultField);   // LookupResultField
  274.     end;
  275.   end;
  276.   FDataSet.Active := SaveActive;
  277. end;
  278.  
  279. procedure TfrIBXDataSet.Loaded;
  280. var
  281.   i: Integer;
  282.   s: String;
  283.   ds: TDataSet;
  284.   f: TField;
  285. begin
  286. // fixup component references
  287.   try
  288.     Prop['DataBase'] := FFixupList['DataBase'];
  289.     for i := 0 to FFixupList.Count - 1 do
  290.     begin
  291.       s := FFixupList.Name[i];
  292.       if s[1] = '.' then // lookup field
  293.       begin
  294.         f := FDataSet.FindField(Copy(s, 2, 255));
  295.         ds := frFindComponent(FDataSet.Owner, FFixupList.Value[i]) as TDataSet;
  296.         f.LookupDataset := ds;
  297.       end
  298.     end;
  299.     Prop['Active'] := FFixupList['Active'];
  300.   except;
  301.   end;
  302. end;
  303.  
  304. procedure TfrIBXDataSet.ShowEditor;
  305. begin
  306.   FieldsEditor(nil);
  307. end;
  308.  
  309. procedure TfrIBXDataSet.FieldsEditor(Sender: TObject);
  310. var
  311.   SaveActive: Boolean;
  312. begin
  313.   SaveActive := FDataSet.Active;
  314.   FDataSet.Close;
  315.   with TfrDBFieldsEditorForm.Create(nil) do
  316.   begin
  317.     DataSet := FDataSet;
  318.     ShowModal;
  319.     frDesigner.Modified := True;
  320.     Free;
  321.   end;
  322.   FDataSet.Active := SaveActive;
  323. end;
  324.  
  325.  
  326. { TfrIBXTable }
  327.  
  328. constructor TfrIBXTable.Create;
  329. begin
  330.   inherited Create;
  331.   FTable := TIBTable.Create(frDialogForm);
  332.   FDataSet := FTable;
  333.   FDataSource.DataSet := FDataSet;
  334.  
  335.   Component := FTable;
  336.   BaseName := 'Table';
  337.   Bmp.LoadFromResourceName(hInstance, 'FR_IBXTABLE');
  338. end;
  339.  
  340. destructor TfrIBXTable.Destroy;
  341. begin
  342.   FDataSet := nil;
  343.   FTable.Free;
  344.   inherited Destroy;
  345. end;
  346.  
  347. procedure TfrIBXTable.DefineProperties;
  348.  
  349.   function GetIndexNames: String;
  350.   var
  351.     i: Integer;
  352.   begin
  353.     Result := '';
  354.     try
  355.       with FTable do
  356.       if (TableName <> '') and (IndexDefs <> nil) then
  357.       begin
  358.         IndexDefs.Update;
  359.         for i := 0 to IndexDefs.Count - 1 do
  360.           if IndexDefs[i].Name <> '' then
  361.             Result := Result + IndexDefs[i].Name + ';';
  362.       end;
  363.     except;
  364.     end;
  365.   end;
  366.  
  367.   function GetIndexFieldNames: String;
  368.   begin
  369.     Result := '';
  370.     try
  371.       with FTable do
  372.       if (TableName <> '') then
  373.       begin
  374.         Result := IndexFieldNames;
  375.       end;
  376.     except
  377.     end;
  378.   end;
  379.  
  380.   function GetMasterSource: String;
  381.   var
  382.     i: Integer;
  383.     sl: TStringList;
  384.   begin
  385.     Result := '';
  386.     sl := TStringList.Create;
  387.     frGetComponents(FTable.Owner, TDataSet, sl, FTable);
  388.     sl.Sort;
  389.     for i := 0 to sl.Count - 1 do
  390.       Result := Result + sl[i] + ';';
  391.     sl.Free;
  392.   end;
  393.  
  394.   function GetTableNames: String;
  395.   var
  396.     i: Integer;
  397.     sl: TStringList;
  398.   begin
  399.     Result := '';
  400.     if FTable.Database <> nil then
  401.     begin
  402.       sl := TStringList.Create;
  403.       FTable.DataBase.GetTableNames(sl, False);
  404.       sl.Sort;
  405.       for i := 0 to sl.Count - 1 do
  406.         Result := Result + sl[i] + ';';
  407.       sl.Free;
  408.     end;
  409.   end;
  410.  
  411. begin
  412.   inherited DefineProperties;
  413.  
  414.   AddEnumProperty('IndexName', GetIndexNames, [Null]);
  415.   AddEnumProperty('IndexFieldNames', GetIndexFieldNames, [Null]);
  416.   AddProperty('MasterFields', [frdtHasEditor, frdtOneObject], JoinEditor);
  417.   AddEnumProperty('MasterSource', GetMasterSource, [Null]);
  418.   AddEnumProperty('TableName', GetTableNames, [Null]);
  419. end;
  420.  
  421. procedure TfrIBXTable.SetPropValue(Index: String; Value: Variant);
  422. var
  423.   d: TDataset;
  424. begin
  425.   inherited SetPropValue(Index, Value);
  426.   Index := AnsiUpperCase(Index);
  427.   if Index = 'INDEXNAME' then
  428.     FTable.IndexName := Value
  429.   else if Index = 'INDEXFIELDNAMES' then
  430.     FTable.IndexFieldNames := Value
  431.   else if Index = 'MASTERSOURCE' then
  432.   begin
  433.     d := frFindComponent(FTable.Owner, Value) as TDataSet;
  434.     FTable.MasterSource := frGetDataSource(FTable.Owner, d);
  435.   end
  436.   else if Index = 'TABLENAME' then
  437.     FTable.TableName := Value
  438. end;
  439.  
  440. function TfrIBXTable.GetPropValue(Index: String): Variant;
  441. begin
  442.   Index := AnsiUpperCase(Index);
  443.   Result := inherited GetPropValue(Index);
  444.   if Result <> Null then Exit;
  445.   if Index = 'INDEXNAME' then
  446.     Result := FTable.IndexName
  447.   else if Index = 'INDEXFIELDNAMES' then
  448.     Result := FTable.IndexFieldNames
  449.   else if Index = 'MASTERSOURCE' then
  450.     Result := frGetDataSetName(FTable.Owner, FTable.MasterSource)
  451.   else if Index = 'TABLENAME' then
  452.     Result := FTable.TableName
  453. end;
  454.  
  455. procedure TfrIBXTable.LoadFromStream(Stream: TStream);
  456. begin
  457.   FFixupList.Clear;
  458.   inherited LoadFromStream(Stream);
  459.   FFixupList['DataBase'] := frReadString(Stream);
  460.   Prop['DataBase'] := FFixupList['DataBase'];
  461.   FTable.TableName := frReadString(Stream);
  462.   FTable.Filter := frReadString(Stream);
  463.   FTable.Filtered := Trim(FTable.Filter) <> '';
  464.   FTable.IndexName := frReadString(Stream);
  465.   FTable.IndexFieldNames := frReadString(Stream);
  466.   FTable.MasterFields := frReadString(Stream);
  467.   FFixupList['MasterSource'] := frReadString(Stream);
  468.   Prop['MasterSource'] := FFixupList['MasterSource'];
  469.   FFixupList['Active'] := frReadBoolean(Stream);
  470.   ReadFields(Stream);
  471.   try
  472.     FTable.Active := FFixupList['Active'];
  473.   except;
  474.   end;
  475. end;
  476.  
  477. procedure TfrIBXTable.SaveToStream(Stream: TStream);
  478. begin
  479.   inherited SaveToStream(Stream);
  480.   frWriteString(Stream, Prop['DataBase']);
  481.   frWriteString(Stream, FTable.TableName);
  482.   frWriteString(Stream, FTable.Filter);
  483.   frWriteString(Stream, FTable.IndexName);
  484.   frWriteString(Stream, FTable.IndexFieldNames);
  485.   frWriteString(Stream, FTable.MasterFields);
  486.   frWriteString(Stream, Prop['MasterSource']);
  487.   frWriteBoolean(Stream, FTable.Active);
  488.   WriteFields(Stream);
  489. end;
  490.  
  491. procedure TfrIBXTable.Loaded;
  492. begin
  493.   Prop['MasterSource'] := FFixupList['MasterSource'];
  494.   inherited Loaded;
  495. end;
  496.  
  497. procedure TfrIBXTable.JoinEditor(Sender: TObject);
  498. begin
  499.   with TfrIBXFieldsLinkForm.Create(nil) do
  500.   begin
  501.     MasterDS := frFindComponent(FTable.Owner, Prop['MasterSource']) as TDataSet;
  502.     DetailDS := FTable;
  503.     if MasterDS <> nil then
  504.     begin
  505.       ShowModal;
  506.       frDesigner.Modified := True;
  507.     end;
  508.     Free;
  509.   end;
  510. end;
  511.  
  512.  
  513. var
  514.   Bmp: TBitmap;
  515.  
  516. initialization
  517.   Bmp := TBitmap.Create;
  518.   Bmp.LoadFromResourceName(hInstance, 'FR_IBXTABLECONTROL');
  519.   frRegisterControl(TfrIBXTable, Bmp, (SInsertTable));
  520.  
  521. finalization
  522.   frUnRegisterObject(TfrIBXTable);
  523.   Bmp.Free;
  524.  
  525. end.
  526.  
  527.