home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / kolekce / d6 / FRCLX.ZIP / SOURCE / FR_Dict.pas < prev    next >
Pascal/Delphi Source File  |  2001-07-09  |  35KB  |  1,354 lines

  1.  
  2. {******************************************}
  3. {                                          }
  4. {           FastReport CLX v2.4            }
  5. {             Data dictionary              }
  6. {                                          }
  7. { Copyright (c) 1998-2001 by Tzyganenko A. }
  8. {                                          }
  9. {******************************************}
  10.  
  11. unit FR_Dict;
  12.  
  13. interface
  14.  
  15. {$I FR.inc}
  16.  
  17. uses
  18.   SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
  19.   QStdCtrls, QComCtrls, FR_Class, FR_Ctrls, FR_DSet, FR_Pars,
  20.   QExtCtrls, QImgList, QButtons;
  21.  
  22. type
  23.   TfrDictForm = class(TForm)
  24.     PageControl1: TPageControl;
  25.     TabSheet1: TTabSheet;
  26.     TabSheet2: TTabSheet;
  27.     TabSheet3: TTabSheet;
  28.     Button1: TButton;
  29.     Button2: TButton;
  30.     FieldAliasesTree: TTreeView;
  31.     Label1: TLabel;
  32.     GroupBox1: TGroupBox;
  33.     CB1: TCheckBox;
  34.     Label2: TLabel;
  35.     Edit1: TEdit;
  36.     ImageList1: TImageList;
  37.     VarTree: TTreeView;
  38.     ValCombo: TComboBox;
  39.     ValList: TListBox;
  40.     Label3: TLabel;
  41.     Label4: TLabel;
  42.     ExprEdit: TfrComboEdit;
  43.     ExprCB: TCheckBox;
  44.     NewCategoryBtn: TfrSpeedButton;
  45.     NewVarBtn: TfrSpeedButton;
  46.     EditBtn: TfrSpeedButton;
  47.     DelBtn: TfrSpeedButton;
  48.     EditListBtn: TfrSpeedButton;
  49.     GroupBox2: TGroupBox;
  50.     Label5: TLabel;
  51.     Edit2: TEdit;
  52.     Label6: TLabel;
  53.     BandDSTree: TTreeView;
  54.     Image1: TImage;
  55.     Image2: TImage;
  56.     Image3: TImage;
  57.     AllTablesLB: TListBox;
  58.     frSpeedButton1: TfrSpeedButton;
  59.     frSpeedButton2: TfrSpeedButton;
  60.     frSpeedButton3: TfrSpeedButton;
  61.     frSpeedButton4: TfrSpeedButton;
  62.     frSpeedButton5: TfrSpeedButton;
  63.     frSpeedButton6: TfrSpeedButton;
  64.     frSpeedButton7: TfrSpeedButton;
  65.     frSpeedButton8: TfrSpeedButton;
  66.     AllBandsLB: TListBox;
  67.     Image4: TImage;
  68.     procedure FieldAliasesTreeClick(Sender: TObject);
  69.     procedure Edit1Exit(Sender: TObject);
  70.     procedure CB1Click(Sender: TObject);
  71.     procedure NewCategoryBtnClick(Sender: TObject);
  72.     procedure NewVarBtnClick(Sender: TObject);
  73.     procedure EditBtnClick(Sender: TObject);
  74.     procedure DelBtnClick(Sender: TObject);
  75.     procedure VarTreeKeyDown(Sender: TObject; var Key: Word;
  76.       Shift: TShiftState);
  77.     procedure ValComboClick(Sender: TObject);
  78.     procedure FieldAliasesTreeKeyDown(Sender: TObject; var Key: Word;
  79.       Shift: TShiftState);
  80.     procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  81.     procedure FieldAliasesTreeChange(Sender: TObject; Node: TTreeNode);
  82.     procedure ExprCBClick(Sender: TObject);
  83.     procedure BandDSTreeKeyDown(Sender: TObject; var Key: Word;
  84.       Shift: TShiftState);
  85.     procedure BandDSTreeClick(Sender: TObject);
  86.     procedure BandDSTreeChange(Sender: TObject; Node: TTreeNode);
  87.     procedure Edit2Exit(Sender: TObject);
  88.     procedure Edit2KeyPress(Sender: TObject; var Key: Char);
  89.     procedure VarTreeChange(Sender: TObject; Node: TTreeNode);
  90.     procedure ValListClick(Sender: TObject);
  91.     procedure ExprEditExit(Sender: TObject);
  92.     procedure ExprEditEnter(Sender: TObject);
  93.     procedure Button1Click(Sender: TObject);
  94.     procedure FormShow(Sender: TObject);
  95.     procedure EditListBtnClick(Sender: TObject);
  96.     procedure ExprEditButtonClick(Sender: TObject);
  97.     procedure FormCreate(Sender: TObject);
  98.     procedure FormHide(Sender: TObject);
  99.     procedure FieldAliasesTreeExpanding(Sender: TObject; Node: TTreeNode;
  100.       var AllowExpansion: Boolean);
  101.     procedure frSpeedButton1Click(Sender: TObject);
  102.     procedure frSpeedButton3Click(Sender: TObject);
  103.     procedure frSpeedButton4Click(Sender: TObject);
  104.     procedure frSpeedButton2Click(Sender: TObject);
  105.     procedure frSpeedButton5Click(Sender: TObject);
  106.     procedure frSpeedButton6Click(Sender: TObject);
  107.     procedure frSpeedButton7Click(Sender: TObject);
  108.     procedure frSpeedButton8Click(Sender: TObject);
  109.     procedure FieldAliasesTreeDragOver(Sender, Source: TObject; X,
  110.       Y: Integer; State: TDragState; var Accept: Boolean);
  111.     procedure FieldAliasesTreeDragDrop(Sender, Source: TObject; X,
  112.       Y: Integer);
  113.     procedure AllTablesLBDragOver(Sender, Source: TObject; X, Y: Integer;
  114.       State: TDragState; var Accept: Boolean);
  115.     procedure AllTablesLBDragDrop(Sender, Source: TObject; X, Y: Integer);
  116.     procedure BandDSTreeDragOver(Sender, Source: TObject; X, Y: Integer;
  117.       State: TDragState; var Accept: Boolean);
  118.     procedure BandDSTreeDragDrop(Sender, Source: TObject; X, Y: Integer);
  119.     procedure AllBandsLBDragOver(Sender, Source: TObject; X, Y: Integer;
  120.       State: TDragState; var Accept: Boolean);
  121.     procedure AllBandsLBDragDrop(Sender, Source: TObject; X, Y: Integer);
  122.     procedure AllTablesLBDblClick(Sender: TObject);
  123.     procedure AllBandsLBDblClick(Sender: TObject);
  124.     procedure ValComboDrawItem(Sender: TObject; Index: Integer;
  125.       ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  126.     procedure ValListDrawItem(Sender: TObject; Index: Integer; ARect: TRect;
  127.       State: TOwnerDrawState; var Handled: Boolean);
  128.     procedure AllTablesLBDrawItem(Sender: TObject; Index: Integer;
  129.       ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  130.     procedure AllBandsLBDrawItem(Sender: TObject; Index: Integer;
  131.       ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  132.     procedure VarTreeEdited(Sender: TObject; Node: TTreeNode;
  133.       var S: WideString);
  134.   private
  135.     { Private declarations }
  136.     Variables: TfrVariables;
  137.     FieldAliases: TfrVariables;
  138.     BandDatasources: TfrVariables;
  139.     ActiveNode: TTreeNode;
  140.     Busy: Boolean;
  141.     ShowRoot: Boolean;
  142.     procedure FillFieldAliases;
  143.     procedure FillBandDataSources;
  144.     procedure FillVariables(FirstTime: Boolean);
  145.     function CurDataSet: String;
  146.     procedure GetFields(Value: String);
  147.     procedure GetSpecValues;
  148.     procedure FillValCombo;
  149.     procedure ShowValue(Value: String);
  150.     procedure ApplyChanges;
  151.     function GetItemName(s: String): String;
  152.     procedure AddFieldAlias(DSName: String);
  153.     procedure DeleteFieldAlias(TreeNode: TTreeNode);
  154.     procedure AddBandDS(DSName: String);
  155.     procedure Localize;
  156.     procedure DisableClick;
  157.     procedure EnableClick;
  158.   public
  159.     { Public declarations }
  160.     Doc: TfrReport;
  161.   end;
  162.  
  163.  
  164. implementation
  165.  
  166. {$R *.xfm}
  167.  
  168. uses FR_Const, FR_Utils, FR_DBRel, FR_Vared, FR_Expr, Qt
  169. {$IFDEF IBO}
  170.   , IB_Components
  171. {$ELSE}
  172.   , DB
  173. {$ENDIF};
  174.  
  175.  
  176. procedure TfrDictForm.Localize;
  177. begin
  178.   Caption := S53340;
  179.   TabSheet1.Caption := S53341;
  180.   TabSheet2.Caption := S53342;
  181.   TabSheet3.Caption := S53343;
  182.   Label3.Caption := S53344;
  183.   Label4.Caption := S53345;
  184.   ExprCB.Caption := S53346;
  185.   NewCategoryBtn.Hint := S53347;
  186.   NewVarBtn.Hint := S53348;
  187.   EditBtn.Hint := S53349;
  188.   DelBtn.Hint := S53350;
  189.   EditListBtn.Hint := S53351;
  190.   Label1.Caption := S53353;
  191.   GroupBox1.Caption := S53354;
  192.   GroupBox2.Caption := S53354;
  193.   Label2.Caption := S53355;
  194.   Label5.Caption := S53355;
  195.   CB1.Caption := S53356;
  196.   Label6.Caption := S53358;
  197.   Button1.Caption := (SOk);
  198.   Button2.Caption := (SCancel);
  199. end;
  200.  
  201. procedure TfrDictForm.FormCreate(Sender: TObject);
  202. begin
  203.   Localize;
  204. end;
  205.  
  206. procedure TfrDictForm.FormShow(Sender: TObject);
  207. begin
  208.   Variables := TfrVariables.Create;
  209.   FieldAliases := TfrVariables.Create;
  210.   BandDatasources := TfrVariables.Create;
  211.  
  212.   FillVariables(True);
  213.   FillFieldAliases;
  214.   FillBandDataSources;
  215.   FillValCombo;
  216.   ValCombo.ItemIndex := 0;
  217.   ValComboClick(nil);
  218.   ExprCBClick(nil);
  219.   VarTree.SetFocus;
  220. end;
  221.  
  222. procedure TfrDictForm.FormHide(Sender: TObject);
  223. begin
  224.   ImageList1.Clear;
  225.   Variables.Free;
  226.   FieldAliases.Free;
  227.   BandDataSources.Free;
  228. end;
  229.  
  230. procedure TfrDictForm.Button1Click(Sender: TObject);
  231. begin
  232.   ApplyChanges;
  233. end;
  234.  
  235. procedure TfrDictForm.ApplyChanges;
  236. begin
  237.   Doc.Dictionary.Variables.Assign(Variables);
  238.   Doc.Dictionary.FieldAliases.Assign(FieldAliases);
  239.   Doc.Dictionary.BandDataSources.Assign(BandDataSources);
  240. end;
  241.  
  242. function TfrDictForm.GetItemName(s: String): String;
  243. begin
  244.   if Pos('{', s) <> 0 then
  245.     Result := Trim(Copy(s, 1, Pos('{', s) - 1)) else
  246.     Result := s;
  247. end;
  248.  
  249. procedure TfrDictForm.DisableClick;
  250. begin
  251.   ValList.OnClick := nil;
  252. end;
  253.  
  254. procedure TfrDictForm.EnableClick;
  255. begin
  256.   Application.HandleMessage;
  257.   ValList.OnClick := ValListClick;
  258. end;
  259.  
  260.  
  261. { Field aliases }
  262.  
  263. procedure TfrDictForm.AddFieldAlias(DSName: String);
  264. var
  265.   TreeNode: TTreeNode;
  266. begin
  267.   if DSName <> '' then
  268.   begin
  269.     FieldAliasesTree.Items.AddChild(FieldAliasesTree.Items[0], DSName);
  270.     TreeNode := FieldAliasesTree.Items[0].GetLastChild;
  271.     TreeNode.ImageIndex := 1;
  272.     TreeNode.SelectedIndex := 1;
  273.     FieldAliasesTree.Items.AddChild(TreeNode, (SNotAssigned));
  274.   end;
  275. end;
  276.  
  277. procedure TfrDictForm.DeleteFieldAlias(TreeNode: TTreeNode);
  278. var
  279.   i, n: Integer;
  280.   s, ItemName: String;
  281. begin
  282.   ItemName := GetItemName(TreeNode.Text);
  283.   for i := 0 to TreeNode.Count - 1 do
  284.   begin
  285.     s := TreeNode.Item[i].Text;
  286.     n := FieldAliases.IndexOf(ItemName + '.' + GetItemName(s));
  287.     if n <> -1 then
  288.       FieldAliases.Delete(n);
  289.   end;
  290. end;
  291.  
  292. procedure TfrDictForm.FillFieldAliases;
  293. var
  294.   i, n: Integer;
  295.   TreeNode: TTreeNode;
  296.   sl: TStringList;
  297.   DataSet: TfrTDataSet;
  298.   s, s1: String;
  299. begin
  300.   FieldAliases.Assign(Doc.Dictionary.FieldAliases);
  301.  
  302.   TreeNode := FieldAliasesTree.Items[0];
  303.   TreeNode.Text := S53352;
  304.   TreeNode.DeleteChildren;
  305.   CurReport := Doc;
  306.  
  307.   sl := TStringList.Create;
  308. {$IFDEF IBO}
  309.   frGetComponents(Doc.Owner, TIB_DataSet, sl, nil);
  310. {$ELSE}
  311.   frGetComponents(Doc.Owner, TDataSet, sl, nil);
  312. {$ENDIF}
  313.   sl.Sort;
  314.  
  315.   for i := 0 to sl.Count - 1 do
  316.   begin
  317.     DataSet := frGetDataSet(sl[i]);
  318.     if (DataSet <> nil) and Doc.Dictionary.DataSetEnabled(sl[i]) then
  319.     begin
  320.       s := sl[i];
  321.       s1 := s;
  322.  
  323.       n := FieldAliases.IndexOf(s);
  324.       if (FieldAliases.Count = 0) or (n = -1) then
  325.         s := ''
  326.       else if FieldAliases.Value[n] <> '' then
  327.         s := s + ' {' + FieldAliases.Value[n] + '}';
  328.  
  329.       if s <> '' then
  330.         AddFieldAlias(s) else
  331.         AllTablesLB.Items.Add(s1);
  332.     end;
  333.   end;
  334.  
  335.   FieldAliasesTree.Items[0].Expand(False);
  336.   FieldAliasesTree.Selected := FieldAliasesTree.Items[0];
  337.   sl.Free;
  338. end;
  339.  
  340. procedure TfrDictForm.FieldAliasesTreeExpanding(Sender: TObject;
  341.   Node: TTreeNode; var AllowExpansion: Boolean);
  342. var
  343.   i, n, ImageIndex: Integer;
  344.   sl: TStringList;
  345.   ItemName, s: String;
  346.   DataSet: TfrTDataSet;
  347.   NewItem: TTreeNode;
  348. begin
  349.   if Node.ImageIndex = 3 then
  350.     AllowExpansion := False
  351.   else if Node.ImageIndex = 1 then
  352.   begin
  353.     if Node.GetLastChild.ImageIndex = 0 then
  354.       Node.DeleteChildren else
  355.       Exit;
  356.     sl := TStringList.Create;
  357.     ItemName := GetItemName(Node.Text);
  358.     DataSet := frGetDataSet(ItemName);
  359.     try
  360.       frGetFieldNames(DataSet, sl);
  361.       sl.Sort;
  362.     except;
  363.     end;
  364.  
  365.     for i := 0 to sl.Count - 1 do
  366.     begin
  367.       ImageIndex := 2;
  368.       s := sl[i];
  369.       n := FieldAliases.IndexOf(ItemName + '.' + sl[i]);
  370.       if n <> -1 then
  371.         if FieldAliases.Value[n] <> '' then
  372.           s := sl[i] + ' {' + FieldAliases.Value[n] + '}' else
  373.           ImageIndex := 4;
  374.  
  375.       FieldAliasesTree.Items.AddChild(Node, s);
  376.       NewItem := Node.GetLastChild;
  377.       NewItem.ImageIndex := ImageIndex;
  378.       NewItem.SelectedIndex := ImageIndex;
  379.     end;
  380.  
  381.     sl.Free;
  382.   end;
  383. end;
  384.  
  385. procedure TfrDictForm.FieldAliasesTreeClick(Sender: TObject);
  386. var
  387.   TreeNode: TTreeNode;
  388.   s: String;
  389. begin
  390.   if Edit1.Modified then Edit1Exit(nil);
  391.   TreeNode := FieldAliasesTree.Selected;
  392.   if TreeNode <> FieldAliasesTree.Items[0] then
  393.   begin
  394.     s := TreeNode.Text;
  395.     if Pos('{', s) <> 0 then
  396.       s := Copy(s, Pos('{', s) + 1, Pos('}', s) - Pos('{', s) - 1);
  397.     Edit1.Text := s;
  398.   end
  399.   else
  400.     Edit1.Text := '';
  401.   ActiveNode := TreeNode;
  402.   Busy := True;
  403.   CB1.Checked := (TreeNode <> FieldAliasesTree.Items[0]) and (TreeNode.ImageIndex in [3, 4]);
  404.   Busy := False;
  405. end;
  406.  
  407. procedure TfrDictForm.Edit1Exit(Sender: TObject);
  408. var
  409.   s: String;
  410. begin
  411.   if Edit1.Modified then
  412.     if ActiveNode <> FieldAliasesTree.Items[0] then
  413.     begin
  414.       s := GetItemName(ActiveNode.Text);
  415.       ActiveNode.Text := s + ' {' + Edit1.Text + '}';
  416.       if ActiveNode.ImageIndex = 2 then
  417.         s := GetItemName(ActiveNode.Parent.Text) + '.' + s;
  418.       FieldAliases[s] := Edit1.Text;
  419.     end;
  420.   Edit1.Modified := False;
  421. end;
  422.  
  423. procedure TfrDictForm.CB1Click(Sender: TObject);
  424. var
  425.   TreeNode: TTreeNode;
  426.   ItemName, FullName: String;
  427. begin
  428.   if Busy then Exit;
  429.   TreeNode := FieldAliasesTree.Selected;
  430.   if (TreeNode = FieldAliasesTree.Items[0]) or (TreeNode = nil) then Exit;
  431.  
  432.   if TreeNode.ImageIndex in [2, 4] then
  433.   begin
  434.     ItemName := GetItemName(TreeNode.Text);
  435.     FullName := GetItemName(TreeNode.Parent.Text) + '.' + ItemName;
  436.     if TreeNode.ImageIndex = 2 then
  437.       TreeNode.ImageIndex := 4 else
  438.       TreeNode.ImageIndex := 2;
  439.     TreeNode.SelectedIndex := TreeNode.ImageIndex;
  440.  
  441.     if TreeNode.ImageIndex = 2 then
  442.       FieldAliases.Delete(FieldAliases.IndexOf(FullName)) else
  443.       FieldAliases[FullName] := '';
  444.     TreeNode.Text := ItemName;
  445.   end;
  446. end;
  447.  
  448. procedure TfrDictForm.FieldAliasesTreeKeyDown(Sender: TObject; var Key: Word;
  449.   Shift: TShiftState);
  450. begin
  451.   if Key = key_Return then
  452.     Edit1.SetFocus
  453.   else if Key = key_Space then
  454.     CB1.Checked := not CB1.Checked;
  455. end;
  456.  
  457. procedure TfrDictForm.Edit1KeyPress(Sender: TObject; var Key: Char);
  458. begin
  459.   if Key = #13 then
  460.     FieldAliasesTree.SetFocus;
  461. end;
  462.  
  463. procedure TfrDictForm.FieldAliasesTreeChange(Sender: TObject; Node: TTreeNode);
  464. begin
  465.   FieldAliasesTreeClick(nil);
  466. end;
  467.  
  468. procedure TfrDictForm.AllTablesLBDrawItem(Sender: TObject; Index: Integer;
  469.   ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  470. var
  471.   r: TRect;
  472. begin
  473.   r := ARect;
  474.   r.Right := r.Left + 18;
  475.   r.Bottom := r.Top + 15;
  476.   OffsetRect(r, 2, 0);
  477.   with AllTablesLB.Canvas do
  478.   begin
  479.     FillRect(ARect);
  480.     frDrawTransparent(AllTablesLB.Canvas, r.Left, r.Top, Image1.Picture.Bitmap);
  481.     TextOut(ARect.Left + 20, ARect.Top + 1, AllTablesLB.Items[Index]);
  482.   end;
  483. end;
  484.  
  485. procedure TfrDictForm.frSpeedButton1Click(Sender: TObject);
  486. var
  487.   i, n: Integer;
  488.   s: String;
  489. begin
  490.   n := AllTablesLB.ItemIndex;
  491.   i := 0;
  492.   while i < AllTablesLB.Items.Count do
  493.   begin
  494.     if AllTablesLB.Selected[i] then
  495.     begin
  496.       s := AllTablesLB.Items[i];
  497.       AddFieldAlias(s);
  498.       FieldAliases[s] := '';
  499.       AllTablesLB.Items.Delete(i);
  500.     end
  501.     else
  502.       Inc(i);
  503.   end;
  504.  
  505.   FieldAliasesTree.Items[0].Expand(False);
  506.   FieldAliasesTree.Selected := FieldAliasesTree.Items[0];
  507.   if n >= AllTablesLB.Items.Count then
  508.     Dec(n);
  509.   if n < AllTablesLB.Items.Count then
  510.     AllTablesLB.Selected[n] := True;
  511. end;
  512.  
  513. procedure TfrDictForm.frSpeedButton2Click(Sender: TObject);
  514. var
  515.   TreeNode: TTreeNode;
  516.   s: String;
  517. begin
  518.   TreeNode := FieldAliasesTree.Selected;
  519.   if (TreeNode = nil) or (TreeNode.ImageIndex <> 1) then Exit;
  520.  
  521.   s := GetItemName(TreeNode.Text);
  522.   DeleteFieldAlias(TreeNode);
  523.   AllTablesLB.Items.Add(s);
  524.   TreeNode.Delete;
  525.   FieldAliases.Delete(FieldAliases.IndexOf(s));
  526. end;
  527.  
  528. procedure TfrDictForm.frSpeedButton3Click(Sender: TObject);
  529. var
  530.   i: Integer;
  531. begin
  532.   for i := 0 to AllTablesLB.Items.Count - 1 do
  533.   begin
  534.     AddFieldAlias(AllTablesLB.Items[i]);
  535.     FieldAliases[AllTablesLB.Items[i]] := '';
  536.   end;
  537.   AllTablesLB.Items.Clear;
  538.   FieldAliasesTree.Items[0].Expand(False);
  539.   FieldAliasesTree.Selected := FieldAliasesTree.Items[0];
  540. end;
  541.  
  542. procedure TfrDictForm.frSpeedButton4Click(Sender: TObject);
  543. var
  544.   i: Integer;
  545.   TreeNode: TTreeNode;
  546. begin
  547.   for i := 0 to FieldAliases.Count - 1 do
  548.     if Pos('"', FieldAliases.Name[i]) = 0 then
  549.       AllTablesLB.Items.Add(FieldAliases.Name[i]);
  550.  
  551.   FieldAliases.Clear;
  552.   TreeNode := FieldAliasesTree.Items[0];
  553.   TreeNode.DeleteChildren;
  554. end;
  555.  
  556. procedure TfrDictForm.FieldAliasesTreeDragOver(Sender, Source: TObject; X,
  557.   Y: Integer; State: TDragState; var Accept: Boolean);
  558. begin
  559.   Accept := Source is TListBox;
  560. end;
  561.  
  562. procedure TfrDictForm.FieldAliasesTreeDragDrop(Sender, Source: TObject; X,
  563.   Y: Integer);
  564. begin
  565.   frSpeedButton1Click(nil);
  566. end;
  567.  
  568. procedure TfrDictForm.AllTablesLBDragOver(Sender, Source: TObject; X,
  569.   Y: Integer; State: TDragState; var Accept: Boolean);
  570. begin
  571.   Accept := Source is TTreeView;
  572. end;
  573.  
  574. procedure TfrDictForm.AllTablesLBDragDrop(Sender, Source: TObject; X,
  575.   Y: Integer);
  576. begin
  577.   frSpeedButton2Click(nil);
  578. end;
  579.  
  580. procedure TfrDictForm.AllTablesLBDblClick(Sender: TObject);
  581. begin
  582.   frSpeedButton1Click(nil);
  583. end;
  584.  
  585.  
  586. { Band Datasources }
  587.  
  588. procedure TfrDictForm.AddBandDS(DSName: String);
  589. var
  590.   TreeNode: TTreeNode;
  591. begin
  592.   if DSName <> '' then
  593.   begin
  594.     BandDSTree.Items.AddChild(BandDSTree.Items[0], DSName);
  595.     TreeNode := BandDSTree.Items[0].GetLastChild;
  596.     TreeNode.ImageIndex := 7;
  597.     TreeNode.SelectedIndex := 7;
  598.   end;
  599. end;
  600.  
  601. procedure TfrDictForm.FillBandDataSources;
  602. var
  603.   i, n: Integer;
  604.   TreeNode: TTreeNode;
  605.   sl: TStringList;
  606.   s: String;
  607. begin
  608.   BandDataSources.Assign(Doc.Dictionary.BandDataSources);
  609.  
  610.   TreeNode := BandDSTree.Items[0];
  611.   TreeNode.Text := S53357;
  612.   TreeNode.DeleteChildren;
  613.   CurReport := Doc;
  614.  
  615.   sl := TStringList.Create;
  616.   frGetComponents(Doc.Owner, TfrDataSet, sl, nil);
  617.   sl.Sort;
  618.  
  619.   AllBandsLB.Items.Assign(sl);
  620.  
  621.   for i := 0 to sl.Count - 1 do
  622.   begin
  623.     s := sl[i];
  624.     n := BandDatasources.IndexOf(sl[i]);
  625.     if (BandDataSources.Count = 0) or (n = -1) then
  626.       s := ''
  627.     else if BandDatasources.Value[n] <> '' then
  628.       s := s + ' {' + BandDatasources.Value[n] + '}';
  629.  
  630.     AddBandDS(s);
  631.     if s <> '' then
  632.       AllBandsLB.Items.Delete(AllBandsLB.Items.IndexOf(sl[i]));
  633.   end;
  634.  
  635.   BandDSTree.FullExpand;
  636.   BandDSTree.Selected := BandDSTree.Items[0];
  637.   sl.Free;
  638. end;
  639.  
  640. procedure TfrDictForm.BandDSTreeKeyDown(Sender: TObject; var Key: Word;
  641.   Shift: TShiftState);
  642. begin
  643.   if Key = key_Return then
  644.     Edit2.SetFocus
  645. end;
  646.  
  647. procedure TfrDictForm.BandDSTreeClick(Sender: TObject);
  648. var
  649.   TreeNode: TTreeNode;
  650.   s: String;
  651. begin
  652.   if Edit2.Modified then Edit2Exit(nil);
  653.   TreeNode := BandDSTree.Selected;
  654.   if TreeNode <> BandDSTree.Items[0] then
  655.   begin
  656.     s := TreeNode.Text;
  657.     if Pos('{', s) <> 0 then
  658.       s := Copy(s, Pos('{', s) + 1, Pos('}', s) - Pos('{', s) - 1);
  659.     Edit2.Text := s;
  660.   end
  661.   else
  662.     Edit2.Text := '';
  663.   ActiveNode := TreeNode;
  664. end;
  665.  
  666. procedure TfrDictForm.BandDSTreeChange(Sender: TObject; Node: TTreeNode);
  667. begin
  668.   BandDSTreeClick(nil);
  669. end;
  670.  
  671. procedure TfrDictForm.Edit2Exit(Sender: TObject);
  672. var
  673.   s, ItemName: String;
  674. begin
  675.   if Edit2.Modified then
  676.     if ActiveNode <> BandDSTree.Items[0] then
  677.     begin
  678.       s := ActiveNode.Text;
  679.       ItemName := GetItemName(s);
  680.       if Pos('{', s) <> 0 then
  681.         s := Copy(s, 1, Pos('{', s) - 1) else
  682.         s := s + ' ';
  683.       ActiveNode.Text := s + '{' + Edit2.Text + '}';
  684.       BandDataSources[ItemName] := Edit2.Text;
  685.     end;
  686.   Edit2.Modified := False;
  687. end;
  688.  
  689. procedure TfrDictForm.Edit2KeyPress(Sender: TObject; var Key: Char);
  690. begin
  691.   if Key = #13 then
  692.     BandDSTree.SetFocus;
  693. end;
  694.  
  695. procedure TfrDictForm.AllBandsLBDrawItem(Sender: TObject; Index: Integer;
  696.   ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  697. var
  698.   r: TRect;
  699. begin
  700.   r := ARect;
  701.   r.Right := r.Left + 18;
  702.   r.Bottom := r.Top + 15;
  703.   OffsetRect(r, 2, 0);
  704.   with AllBandsLB.Canvas do
  705.   begin
  706.     FillRect(ARect);
  707.     frDrawTransparent(AllBandsLB.Canvas, r.Left, r.Top, Image4.Picture.Bitmap);
  708.     TextOut(ARect.Left + 20, ARect.Top + 1, AllBandsLB.Items[Index]);
  709.   end;
  710. end;
  711.  
  712. procedure TfrDictForm.frSpeedButton5Click(Sender: TObject);
  713. var
  714.   i, n: Integer;
  715.   s: String;
  716. begin
  717.   n := AllBandsLB.ItemIndex;
  718.   i := 0;
  719.   while i < AllBandsLB.Items.Count do
  720.   begin
  721.     if AllBandsLB.Selected[i] then
  722.     begin
  723.       s := AllBandsLB.Items[i];
  724.       AddBandDS(s);
  725.       BandDataSources[s] := '';
  726.       AllBandsLB.Items.Delete(i);
  727.     end
  728.     else
  729.       Inc(i);
  730.   end;
  731.  
  732.   BandDSTree.Items[0].Expand(False);
  733.   BandDSTree.Selected := BandDSTree.Items[0];
  734.   if n >= AllBandsLB.Items.Count then
  735.     Dec(n);
  736.   if n < AllBandsLB.Items.Count then
  737.     AllBandsLB.Selected[n] := True;
  738. end;
  739.  
  740. procedure TfrDictForm.frSpeedButton6Click(Sender: TObject);
  741. var
  742.   TreeNode: TTreeNode;
  743.   s: String;
  744. begin
  745.   TreeNode := BandDSTree.Selected;
  746.   if (TreeNode = nil) or (TreeNode.ImageIndex <> 7) then Exit;
  747.  
  748.   s := GetItemName(TreeNode.Text);
  749.   AllBandsLB.Items.Add(s);
  750.   TreeNode.Delete;
  751.   BandDataSources.Delete(BandDataSources.IndexOf(s));
  752. end;
  753.  
  754. procedure TfrDictForm.frSpeedButton7Click(Sender: TObject);
  755. var
  756.   i: Integer;
  757. begin
  758.   for i := 0 to AllBandsLB.Items.Count - 1 do
  759.   begin
  760.     AddBandDS(AllBandsLB.Items[i]);
  761.     BandDataSources[AllBandsLB.Items[i]] := '';
  762.   end;
  763.   AllBandsLB.Items.Clear;
  764.   BandDSTree.Items[0].Expand(False);
  765.   BandDSTree.Selected := BandDSTree.Items[0];
  766. end;
  767.  
  768. procedure TfrDictForm.frSpeedButton8Click(Sender: TObject);
  769. var
  770.   i: Integer;
  771.   TreeNode: TTreeNode;
  772. begin
  773.   for i := 0 to BandDataSources.Count - 1 do
  774.     AllBandsLB.Items.Add(BandDataSources.Name[i]);
  775.  
  776.   BandDataSources.Clear;
  777.   TreeNode := BandDSTree.Items[0];
  778.   TreeNode.DeleteChildren;
  779. end;
  780.  
  781. procedure TfrDictForm.BandDSTreeDragOver(Sender, Source: TObject; X,
  782.   Y: Integer; State: TDragState; var Accept: Boolean);
  783. begin
  784.   Accept := Source is TListBox;
  785. end;
  786.  
  787. procedure TfrDictForm.BandDSTreeDragDrop(Sender, Source: TObject; X,
  788.   Y: Integer);
  789. begin
  790.   frSpeedButton5Click(nil);
  791. end;
  792.  
  793. procedure TfrDictForm.AllBandsLBDragOver(Sender, Source: TObject; X,
  794.   Y: Integer; State: TDragState; var Accept: Boolean);
  795. begin
  796.   Accept := Source is TTreeView;
  797. end;
  798.  
  799. procedure TfrDictForm.AllBandsLBDragDrop(Sender, Source: TObject; X,
  800.   Y: Integer);
  801. begin
  802.   frSpeedButton6Click(nil);
  803. end;
  804.  
  805. procedure TfrDictForm.AllBandsLBDblClick(Sender: TObject);
  806. begin
  807.   frSpeedButton5Click(nil);
  808. end;
  809.  
  810.  
  811. { Variables }
  812.  
  813. procedure TfrDictForm.FillVariables(FirstTime: Boolean);
  814. var
  815.   i: Integer;
  816.   ANode, TreeNode: TTreeNode;
  817.   s: String;
  818. begin
  819.   Busy := True;
  820.   if VarTree.Items.Count > 0 then
  821.     VarTree.Items.Clear;
  822.   if FirstTime then
  823.     Variables.Assign(Doc.Dictionary.Variables);
  824.  
  825.   ShowRoot := True;
  826.   if Variables.Count = 0 then
  827.   begin
  828.     TreeNode := VarTree.Items.Add(VarTree.Selected, (SNotAssigned));
  829.     TreeNode.ImageIndex := -1;
  830.     TreeNode.SelectedIndex := -1;
  831.     ShowRoot := False;
  832.     ExprCB.Enabled := False;
  833.   end
  834.   else
  835.   begin
  836.     TreeNode := nil;
  837.     for i := 0 to Variables.Count - 1 do
  838.     begin
  839.       s := Variables.Name[i];
  840.       if (s <> '') and (s[1] = ' ') then
  841.       begin
  842.         TreeNode := VarTree.Items.Add(nil, Copy(s, 2, 255));
  843.         TreeNode.ImageIndex := 5;
  844.         TreeNode.SelectedIndex := 5;
  845.       end
  846.       else if TreeNode <> nil then
  847.       begin
  848.         ANode := VarTree.Items.AddChild(TreeNode, s);
  849.         ANode.ImageIndex := 6;
  850.         ANode.SelectedIndex := 6;
  851.       end;
  852.     end;
  853.   end;
  854.   Busy := False;
  855.   VarTree.FullExpand;
  856.   VarTree.Items[0].Selected := True;
  857. end;
  858.  
  859. procedure TfrDictForm.NewCategoryBtnClick(Sender: TObject);
  860. var
  861.   ANode, TreeNode: TTreeNode;
  862.   s: String;
  863.  
  864.   function CreateNewCategory: String;
  865.   var
  866.     i: Integer;
  867.  
  868.     function FindCategory(s: String): Boolean;
  869.     var
  870.       i: Integer;
  871.     begin
  872.       Result := False;
  873.       for i := 0 to Variables.Count - 1 do
  874.       begin
  875.         if AnsiCompareText(Variables.Name[i], s) = 0 then
  876.         begin
  877.           Result := True;
  878.           break;
  879.         end;
  880.       end;
  881.     end;
  882.  
  883.   begin
  884.     for i := 1 to 1000 do
  885.     begin
  886.       Result := 'Category' + IntToStr(i);
  887.       if not FindCategory(' ' + Result) then
  888.         break;
  889.     end;
  890.   end;
  891.  
  892. begin
  893.   TreeNode := VarTree.Selected;
  894.   if ShowRoot = False then
  895.   begin
  896.     TreeNode.Delete;
  897.     TreeNode := nil;
  898.     ShowRoot := True;
  899.     ExprCB.Enabled := True;
  900.   end;
  901.   if TreeNode <> nil then
  902.     TreeNode := VarTree.Items[0];
  903.  
  904.   s := CreateNewCategory;
  905.   Variables[' ' + s] := '';
  906.   ANode := VarTree.Items.Add(TreeNode, s);
  907.   ANode.ImageIndex := 5;
  908.   ANode.SelectedIndex := 5;
  909.   VarTree.Selected := ANode;
  910.   ANode.EditText;
  911. end;
  912.  
  913. procedure TfrDictForm.NewVarBtnClick(Sender: TObject);
  914. var
  915.   ANode, TreeNode: TTreeNode;
  916.   s: String;
  917.  
  918.   function CreateNewVariable: String;
  919.   var
  920.     i: Integer;
  921.  
  922.     function FindVariable(s: String): Boolean;
  923.     var
  924.       i: Integer;
  925.     begin
  926.       Result := False;
  927.       for i := 0 to Variables.Count - 1 do
  928.       begin
  929.         if AnsiCompareText(Variables.Name[i], s) = 0 then
  930.         begin
  931.           Result := True;
  932.           break;
  933.         end;
  934.       end;
  935.     end;
  936.  
  937.   begin
  938.     for i := 1 to 1000 do
  939.     begin
  940.       Result := 'Variable' + IntToStr(i);
  941.       if not FindVariable(Result) then
  942.         break;
  943.     end;
  944.   end;
  945.  
  946. begin
  947.   TreeNode := VarTree.Selected;
  948.   if (TreeNode = nil) or not ShowRoot then Exit;
  949.   if TreeNode.Parent <> nil then
  950.     TreeNode := TreeNode.Parent;
  951.  
  952.   s := CreateNewVariable;
  953.  
  954.   if TreeNode.GetNextSibling <> nil then
  955.     Variables.Insert(Variables.IndexOf(' ' + TreeNode.GetNextSibling.Text), s) else
  956.     Variables[s] := '';
  957.  
  958.   ANode := VarTree.Items.AddChild(TreeNode, s);
  959.   ANode.ImageIndex := 6;
  960.   ANode.SelectedIndex := 6;
  961.   TreeNode.Expand(True);
  962.   VarTree.Selected := ANode;
  963.   ANode.EditText;
  964. end;
  965.  
  966. procedure TfrDictForm.EditBtnClick(Sender: TObject);
  967. var
  968.   TreeNode: TTreeNode;
  969. begin
  970.   TreeNode := VarTree.Selected;
  971.   if (TreeNode <> nil) and ShowRoot then
  972.     TreeNode.EditText;
  973. end;
  974.  
  975. procedure TfrDictForm.DelBtnClick(Sender: TObject);
  976. var
  977.   TreeNode: TTreeNode;
  978.   i: Integer;
  979. begin
  980.   TreeNode := VarTree.Selected;
  981.   if (TreeNode <> nil) and ShowRoot then
  982.   begin
  983.     if TreeNode.ImageIndex = 5 then
  984.     begin
  985.       i := Variables.IndexOf(' ' + TreeNode.Text);
  986.       Variables.Delete(i);
  987.       while (i < Variables.Count) and (Variables.Name[i][1] <> ' ') do
  988.         Variables.Delete(i);
  989.     end
  990.     else
  991.       Variables.Delete(Variables.IndexOf(TreeNode.Text));
  992.  
  993.     TreeNode.Delete;
  994.     if VarTree.Items.Count = 0 then
  995.     begin
  996.       TreeNode := VarTree.Items.Add(VarTree.Selected, (SNotAssigned));
  997.       TreeNode.ImageIndex := -1;
  998.       TreeNode.SelectedIndex := -1;
  999.       ShowRoot := False;
  1000.       VarTree.Selected := VarTree.Items[0];
  1001.       ExprCB.Enabled := False;
  1002.     end;
  1003.   end;
  1004. end;
  1005.  
  1006. procedure TfrDictForm.VarTreeKeyDown(Sender: TObject; var Key: Word;
  1007.   Shift: TShiftState);
  1008. begin
  1009.   if Key = key_Insert then
  1010.     if ssCtrl in Shift then
  1011.       NewCategoryBtnClick(nil)
  1012.     else
  1013.       if (VarTree.Selected = nil) or (ShowRoot = False) then
  1014.         NewCategoryBtnClick(nil) else
  1015.         NewVarBtnClick(nil)
  1016.   else if (Key = key_Delete) and not VarTree.IsEditing then
  1017.     DelBtnClick(nil)
  1018.   else if Key = key_Return then
  1019.     EditBtnClick(nil)
  1020.   else if (Key = key_Escape) and not VarTree.IsEditing then
  1021.     Button2.Click;
  1022. end;
  1023.  
  1024. procedure TfrDictForm.VarTreeEdited(Sender: TObject; Node: TTreeNode;
  1025.   var S: WideString);
  1026. var
  1027.   s1: String;
  1028. begin
  1029.   if Node.ImageIndex = 6 then
  1030.     s1 := s else
  1031.     s1 := ' ' + s;
  1032.   if (AnsiCompareText(s, Node.Text) <> 0) and
  1033.      (Variables.IndexOf(s1) <> -1) then
  1034.     s := Node.Text
  1035.   else
  1036.   begin
  1037.     if Node.ImageIndex = 6 then
  1038.       Variables.Name[Variables.IndexOf(Node.Text)] := s1 else
  1039.       Variables.Name[Variables.IndexOf(' ' + Node.Text)] := s1;
  1040.   end;
  1041. end;
  1042.  
  1043. function TfrDictForm.CurDataSet: String;
  1044. begin
  1045.   Result := '';
  1046.   if ValCombo.ItemIndex <> -1 then
  1047.     Result := ValCombo.Items[ValCombo.ItemIndex];
  1048. end;
  1049.  
  1050. procedure TfrDictForm.FillValCombo;
  1051. var
  1052.   s: TStringList;
  1053. begin
  1054.   s := TStringList.Create;
  1055.   CurReport.Dictionary.GetDatasetList(s);
  1056.   s.Sort;
  1057.   s.Add((SSystemVariables));
  1058.   ValCombo.Items.Assign(s);
  1059.   s.Free;
  1060. end;
  1061.  
  1062. procedure TfrDictForm.ValComboClick(Sender: TObject);
  1063. begin
  1064.   if CurDataSet <> (SSystemVariables) then
  1065.     GetFields(CurDataSet) else
  1066.     GetSpecValues;
  1067. end;
  1068.  
  1069. procedure TfrDictForm.GetFields(Value: String);
  1070. begin
  1071.   CurReport.Dictionary.GetFieldList(Value, ValList.Items);
  1072.   ValList.Items.Insert(0, (SNotAssigned));
  1073. end;
  1074.  
  1075. procedure TfrDictForm.GetSpecValues;
  1076. begin
  1077.   with ValList.Items do
  1078.   begin
  1079.     Clear;
  1080.     Add((SNotAssigned));
  1081.     Add(SVar1);
  1082.     Add(SVar3);
  1083.     Add(SVar4);
  1084.     Add(SVar5);
  1085.     Add(SVar6);
  1086.     Add(SVar7);
  1087.     Add(SVar8);
  1088.     Add(SVar9);
  1089.   end;
  1090. end;
  1091.  
  1092. procedure TfrDictForm.ValComboDrawItem(Sender: TObject; Index: Integer;
  1093.   ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  1094. var
  1095.   Image: TImage;
  1096.   r: TRect;
  1097. begin
  1098.   r := ARect;
  1099.   r.Right := r.Left + 18;
  1100.   r.Bottom := r.Top + 16;
  1101.   OffsetRect(r, 2, 0);
  1102.   with ValCombo.Canvas do
  1103.   begin
  1104.     FillRect(ARect);
  1105.     if Index = ValCombo.Items.Count - 1 then
  1106.       Image := Image3 else
  1107.       Image := Image1;
  1108.     frDrawTransparent(ValCombo.Canvas, r.Left, r.Top, Image.Picture.Bitmap);
  1109.     TextOut(ARect.Left + 20, ARect.Top + 1, ValCombo.Items[Index]);
  1110.   end;
  1111. end;
  1112.  
  1113. procedure TfrDictForm.ValListDrawItem(Sender: TObject; Index: Integer;
  1114.   ARect: TRect; State: TOwnerDrawState; var Handled: Boolean);
  1115. var
  1116.   Image: TImage;
  1117.   r: TRect;
  1118. begin
  1119.   r := ARect;
  1120.   r.Right := r.Left + 18;
  1121.   r.Bottom := r.Top + 15;
  1122.   OffsetRect(r, 2, 0);
  1123.   with ValList.Canvas do
  1124.   begin
  1125.     FillRect(ARect);
  1126.     if CurDataSet = (SSystemVariables) then
  1127.       Image := Image3 else
  1128.       Image := Image2;
  1129.     if Index <> 0 then
  1130.       frDrawTransparent(ValList.Canvas, r.Left, r.Top, Image.Picture.Bitmap);
  1131.     TextOut(ARect.Left + 20, ARect.Top + 1, ValList.Items[Index]);
  1132.   end;
  1133. end;
  1134.  
  1135. procedure TfrDictForm.ExprCBClick(Sender: TObject);
  1136. begin
  1137.   frEnableControls([ExprEdit], ExprCB.Checked);
  1138.   if not ExprCB.Checked then
  1139.   begin
  1140.     ExprEdit.Text := '';
  1141.     if not Busy then
  1142.     begin
  1143.       ValList.ItemIndex := 0;
  1144.       ValListClick(nil);
  1145.     end;
  1146.   end
  1147.   else if not Busy then
  1148.   begin
  1149.     if not VarTree.Focused then
  1150.       ExprEdit.SetFocus;
  1151.     DisableClick;
  1152.     ValList.ItemIndex := 0;
  1153.     EnableClick;
  1154.   end;
  1155. end;
  1156.  
  1157. procedure TfrDictForm.VarTreeChange(Sender: TObject; Node: TTreeNode);
  1158. var
  1159.   s: String;
  1160. begin
  1161.   if Busy then Exit;
  1162.   ExprEditExit(nil);
  1163.   if Node.ImageIndex = 5 then
  1164.     s := ' ' + Node.Text
  1165.   else if Node.ImageIndex = 6 then
  1166.     s := Node.Text
  1167.   else
  1168.     Exit;
  1169.   ExprCB.Enabled := Node.ImageIndex = 6;
  1170.   if not ExprCB.Enabled then
  1171.     ExprCB.Checked := False;
  1172.   ShowValue(Variables[s]);
  1173. end;
  1174.  
  1175. procedure TfrDictForm.ShowValue(Value: String);
  1176. var
  1177.   i, n: Integer;
  1178.   s1, s2: String;
  1179.   Found: Boolean;
  1180.  
  1181.   function FindStr(List: TStrings; Str: String; IsField: Boolean): Integer;
  1182.   var
  1183.     i: Integer;
  1184.     s: String;
  1185.   begin
  1186.     Result := -1;
  1187.     for i := 0 to List.Count - 1 do
  1188.     begin
  1189.       if IsField then
  1190.         s := CurReport.Dictionary.RealFieldName[List[i]] else
  1191.         s := CurReport.Dictionary.RealDataSetName[List[i]];
  1192.       if AnsiCompareText(s, Str) = 0 then
  1193.       begin
  1194.         Result := i;
  1195.         break;
  1196.       end;
  1197.     end;
  1198.   end;
  1199.  
  1200. begin
  1201.   s1 := ''; s2 := '';
  1202.   Found := False;
  1203.  
  1204.   if Pos('.', Value) <> 0 then
  1205.   begin
  1206.     for i := Length(Value) downto 1 do
  1207.       if Value[i] = '.' then
  1208.       begin
  1209.         s1 := Copy(Value, 1, i - 1);
  1210.         s2 := Copy(Value, i + 1, 255);
  1211.         break;
  1212.       end;
  1213.     n := FindStr(ValCombo.Items, s1, False);
  1214.     if n <> -1 then
  1215.     begin
  1216.       if ValCombo.ItemIndex <> n then
  1217.       begin
  1218.         ValCombo.ItemIndex := n;
  1219.         ValComboClick(nil);
  1220.       end;
  1221.       if (s2 <> '') and (s2[1] = '"') then
  1222.         s2 := Copy(s2, 2, Length(s2) - 2);
  1223.       n := FindStr(ValList.Items, s2, True);
  1224.       if n <> - 1 then
  1225.       begin
  1226.         DisableClick;
  1227.         ValList.ItemIndex := n;
  1228.         EnableClick;
  1229.         Found := True;
  1230.       end;
  1231.     end;
  1232.   end;
  1233.  
  1234.   if not Found then
  1235.   begin
  1236.     if Trim(Value) = '' then
  1237.     begin
  1238.       DisableClick;
  1239.       ValList.ItemIndex := 0;
  1240.       EnableClick;
  1241.       ExprEdit.Text := '';
  1242.       ExprCB.Checked := False;
  1243.     end
  1244.     else
  1245.     begin
  1246.       for i := 0 to frSpecCount - 1 do
  1247.         if AnsiCompareText(frSpecFuncs[i], Value) = 0 then
  1248.         begin
  1249.           n := ValCombo.Items.IndexOf((SSystemVariables));
  1250.           if ValCombo.ItemIndex <> n then
  1251.           begin
  1252.             ValCombo.ItemIndex := n;
  1253.             ValComboClick(nil);
  1254.           end;
  1255.           DisableClick;
  1256.           if i = 0 then
  1257.             ValList.ItemIndex := 1 else
  1258.             ValList.ItemIndex := i;
  1259.           EnableClick;
  1260.           Found := True;
  1261.           break;
  1262.         end;
  1263.  
  1264.       if not Found then
  1265.       begin
  1266.         ExprEdit.Text := Value;
  1267.         ExprCB.Checked := True;
  1268.       end;
  1269.     end;
  1270.   end;
  1271.  
  1272.   if Found then
  1273.   begin
  1274.     Busy := True;
  1275.     ExprCB.Checked := False;
  1276.     Busy := False;
  1277.   end;
  1278. end;
  1279.  
  1280. procedure TfrDictForm.ValListClick(Sender: TObject);
  1281. var
  1282.   TreeNode: TTreeNode;
  1283.   s: String;
  1284.   n: Integer;
  1285. begin
  1286.   Busy := True;
  1287.   ExprCB.Checked := False;
  1288.   Busy := False;
  1289.   TreeNode := VarTree.Selected;
  1290.   if (TreeNode = nil) or (TreeNode.ImageIndex <> 6) then Exit;
  1291.  
  1292.   if ValList.ItemIndex = 0 then
  1293.     s := ''
  1294.   else
  1295.   begin
  1296.     if CurDataset = (SSystemVariables) then
  1297.     begin
  1298.       n := ValList.ItemIndex;
  1299.       if n = 1 then
  1300.         n := 0;
  1301.       s := frSpecFuncs[n];
  1302.     end
  1303.     else with CurReport.Dictionary do
  1304.       s := RealDataSetName[CurDataset] + '."' + RealFieldName[ValList.Items[ValList.ItemIndex]] + '"';
  1305.   end;
  1306.   Variables[TreeNode.Text] := s;
  1307. end;
  1308.  
  1309. procedure TfrDictForm.ExprEditEnter(Sender: TObject);
  1310. begin
  1311.   ActiveNode := VarTree.Selected;
  1312. end;
  1313.  
  1314. procedure TfrDictForm.ExprEditExit(Sender: TObject);
  1315. var
  1316.   TreeNode: TTreeNode;
  1317. begin
  1318.   TreeNode := ActiveNode;
  1319.   if (TreeNode = nil) or (TreeNode.ImageIndex <> 6) or not ExprEdit.Enabled then Exit;
  1320.   Variables[TreeNode.Text] := ExprEdit.Text;
  1321.   ActiveNode := nil;
  1322. end;
  1323.  
  1324. procedure TfrDictForm.EditListBtnClick(Sender: TObject);
  1325. begin
  1326.   with TfrVaredForm.Create(nil) do
  1327.   begin
  1328.     Variables := Self.Variables;
  1329.     if ShowModal = mrOk then
  1330.       FillVariables(False);
  1331.     VarTree.Items[0].Selected := True;
  1332.     Free;
  1333.   end;
  1334. end;
  1335.  
  1336. procedure TfrDictForm.ExprEditButtonClick(Sender: TObject);
  1337. begin
  1338.   with TfrExprForm.Create(nil) do
  1339.   begin
  1340.     ExprMemo.Text := ExprEdit.Text;
  1341.     if ShowModal = mrOk then
  1342.       ExprEdit.Text := ExprMemo.Text;
  1343.     Free;
  1344.   end;
  1345. end;
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353. end.
  1354.