1 
2 {*****************************************}
3 {                                         }
4 {             FastReport v2.3             }
5 {     Select Band datasource dialog       }
6 {                                         }
7 {  Copyright (c) 1998-99 by Tzyganenko A. }
8 {                                         }
9 {*****************************************}
10 
11 unit LR_VBnd;
12 
13 interface
14 
15 {$I LR_Vers.inc}
16 
17 uses
18   Classes, SysUtils, LResources,
19   Forms, Controls, Graphics, Dialogs,
20   Buttons, StdCtrls, ButtonPanel, Spin,Variants,
21 
22   LR_Class, LR_Intrp;
23 
24 type
25 
26   { TfrVBandEditorForm }
27 
28   TfrVBandEditorForm = class(TForm)
29     ButtonPanel1: TButtonPanel;
30     edtRecCount: TSpinEdit;
31     GroupBox1: TGroupBox;
32     GroupBox2: TGroupBox;
33     Label1: TLabel;
34     CB1: TComboBox;
35     LB1: TListBox;
36     procedure FormCreate(Sender: TObject);
37     procedure CB1Click(Sender: TObject);
38     procedure LB1Click(Sender: TObject);
39     procedure CB1Exit(Sender: TObject);
40   private
41     { Private declarations }
42     Band: TfrBandView;
43     List: TfrVariables;
44     procedure FillCombo;
45   public
46     { Public declarations }
47     procedure ShowEditor(t: TfrView);
48   end;
49 
50 var
51   frVBandEditorForm: TfrVBandEditorForm;
52 
53 implementation
54 
55 {$R *.lfm}
56 
57 uses LR_DSet, LR_Const, LR_Utils;
58 
59 procedure TfrVBandEditorForm.ShowEditor(t: TfrView);
60 var
61   i, j, n: Integer;
62   s: String;
63   t1: TfrView;
64   b: Boolean;
65 begin
66   Band := t as TfrBandView;
67   List := TfrVariables.Create;
68   try
69     s := Band.Dataset;
70     b := False;
71     if Pos(';', s) = 0 then
72       b := True;
73     with frDesigner.Page do
74     begin
75       for i := 0 to Objects.Count - 1 do
76       begin
77         t1 := TfrView(Objects[i]);
78         if (t1.Typ = gtBand) and not (TfrBandView(t1).BandType in
79           [btReportTitle..btPageFooter, btOverlay, btCrossHeader..btCrossFooter]) then
80         begin
81           LB1.Items.Add(t1.Name + ': ' + frBandNames[TfrBandView(t1).BandType]);
82           n := Pos(AnsiUpperCase(t1.Name) + '=', AnsiUpperCase(s));
83           if n <> 0 then
84           begin
85             n := n + Length(t1.Name) + 1;
86             j := n;
87             while s[j] <> ';' do
88               Inc(j);
89             List[t1.Name] := Copy(s, n, j - n);
90           end
91           else
92             if b then
93               List[t1.Name] := s
94             else
95               List[t1.Name] := '0';
96         end;
97       end;
98     end;
99 
100     if LB1.Items.Count = 0 then
101       Exit;
102 
103     FillCombo;
104     LB1.ItemIndex := 0;
105     LB1Click(nil);
106 
107     if ShowModal = mrOk then
108     begin
109       CB1Exit(nil);
110       frDesigner.BeforeChange;
111       s := '';
112       for i := 0 to List.Count - 1 do
113       begin
114         s := s + List.Name[i] + '=' + VarToStr(List.Value[i]) + ';';
115       end;
116       Band.DataSet := s;
117     end;
118   finally
119     List.Free;
120   end;
121 end;
122 
123 procedure TfrVBandEditorForm.FillCombo;
124 begin
125   frGetComponents(CurReport.Owner, TfrDataset, CB1.Items, nil);
126   TStringList(CB1.Items).Sorted := False;
127   TStringList(CB1.Items).Sort;
128   CB1.Items.Insert(0, sVirtualDataset);
129   CB1.Items.Insert(0, sNotAssigned);
130 end;
131 
132 procedure TfrVBandEditorForm.FormCreate(Sender: TObject);
133 begin
134   Caption := sVBandEditorFormCapt;
135   GroupBox1.Caption := sVBandEditorFormBnd;
136   GroupBox2.Caption := sVBandEditorFormDataSource;
137   Label1.Caption := sVBandEditorFormRecordCount;
138 end;
139 
140 procedure TfrVBandEditorForm.CB1Click(Sender: TObject);
141 begin
142   frEnableControls([Label1, edtRecCount], CB1.ItemIndex = 1);
143 end;
144 
145 procedure TfrVBandEditorForm.LB1Click(Sender: TObject);
146 var
147   i: Integer;
148   s: String;
149 begin
150   s := LB1.Items[LB1.ItemIndex];
151   s := Copy(s, 1, Pos(':', s) - 1);
152   s := List[s];
153   if (s <> '') and (s[1] in ['1'..'9']) then
154   begin
155     i := 1;
156     edtRecCount.Text := s;
157   end
158   else
159   begin
160     i := CB1.Items.IndexOf(s);
161     if i = -1 then
162       i := CB1.Items.IndexOf(sNotAssigned);
163   end;
164   CB1.ItemIndex := i;
165   CB1Click(nil);
166 end;
167 
168 procedure TfrVBandEditorForm.CB1Exit(Sender: TObject);
169 var
170   s: String;
171 begin
172   s := LB1.Items[LB1.ItemIndex];
173   s := Copy(s, 1, Pos(':', s) - 1);
174   if CB1.ItemIndex = 1 then
175     List[s] := edtRecCount.Text
176   else
177     List[s] := CB1.Items[CB1.ItemIndex];
178 end;
179 
180 end.
181 
182