source: cprs/trunk/CPRS-Chart/Options/fOptionsReportsCustom.pas@ 730

Last change on this file since 730 was 456, checked in by Kevin Toppenberg, 16 years ago

Initial Upload of Official WV CPRS 1.0.26.76

File size: 19.7 KB
RevLine 
[456]1unit fOptionsReportsCustom;
2
3interface
4
5uses
6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 StdCtrls, ExtCtrls, Spin, ORCtrls, fOptions, ComCtrls, ORFn, ORNet, Grids, uConst,
8 ORDtTm, rCore;
9
10type
11 TfrmOptionsReportsCustom = class(TForm)
12 Panel1: TPanel;
13 Bevel3: TBevel;
14 btnApply: TButton;
15 btnCancel: TButton;
16 Panel2: TPanel;
17 grdReport: TCaptionStringGrid;
18 edtMax: TCaptionEdit;
19 odbStop: TORDateBox;
20 odbStart: TORDateBox;
21 odbTool: TORDateBox;
22 btnOK: TButton;
23 Panel3: TPanel;
24 edtSearch: TCaptionEdit;
25 Label1: TLabel;
26 function ValFor(ACol, ARow: Integer): string;
27 procedure FormCreate(Sender: TObject);
28 procedure grdReportMouseDown(Sender: TObject; Button: TMouseButton;
29 Shift: TShiftState; X, Y: Integer);
30 procedure grdReportKeyPress(Sender: TObject; var Key: Char);
31 procedure grdReportDrawCell(Sender: TObject; ACol, ARow: Integer;
32 Rect: TRect; State: TGridDrawState);
33 procedure UMDelayEvent(var Message: TMessage); Message UM_DELAYEVENT;
34 procedure edtMaxExit(Sender: TObject);
35 procedure btnApplyClick(Sender: TObject);
36 procedure btnCancelClick(Sender: TObject);
37 procedure odbStartExit(Sender: TObject);
38 procedure odbStopExit(Sender: TObject);
39 procedure FormClose(Sender: TObject; var Action: TCloseAction);
40 procedure odbStartKeyPress(Sender: TObject; var Key: Char);
41 procedure odbStopKeyPress(Sender: TObject; var Key: Char);
42 procedure edtMaxKeyPress(Sender: TObject; var Key: Char);
43 procedure btnOKClick(Sender: TObject);
44 procedure edtSearchChange(Sender: TObject);
45 procedure edtSearchKeyPress(Sender: TObject; var Key: Char);
46 procedure FormShow(Sender: TObject);
47 procedure grdReportKeyDown(Sender: TObject; var Key: Word;
48 Shift: TShiftState);
49 procedure FormDestroy(Sender: TObject);
50 private
51 { Private declarations }
52 //startDate,endDate,
53 maxOcurs,signal: integer;
54 rptList: TStringList;
55 fDropColumn: Integer;
56 sDate,eDate: string;
57 procedure ShowEditor(ACol, ARow: Integer; AChar: Char);
58 public
59 { Public declarations }
60 end;
61var
62 frmOptionsReportsCustom: TfrmOptionsReportsCustom;
63 const
64 Col_StartDate = 1;
65 Col_StopDate = 2;
66 Col_Max = 3;
67 TAB = #9;
68procedure DialogOptionsHSCustom(topvalue, leftvalue, fontsize: integer; var actiontype: Integer);
69
70implementation
71
72uses rOptions, uOptions, fReports, uCore, uAccessibleStringGrid;
73
74{$R *.DFM}
75
76procedure TfrmOptionsReportsCustom.UMDelayEvent(var Message: TMessage);
77{ after focusing events are completed for a combobox, set the key the user typed }
78begin
79 case Message.LParam of
80 Col_StartDate:
81 begin
82 odbStart.Visible := True;
83 odbStart.Text := Chr(Message.WParam);
84 end;
85 COL_StopDate :
86 begin
87 odbStop.Visible := True;
88 odbStop.Text := Chr(Message.WParam);
89 end;
90 COL_Max :
91 begin
92 edtMax.Visible := True;
93 edtMax.Text := Chr(Message.WParam);
94 end;
95 end;
96end;
97
98procedure DialogOptionsHSCustom(topvalue, leftvalue, fontsize: integer; var actiontype: Integer);
99var
100 frmOptionsReportsCustom: TfrmOptionsReportsCustom;
101begin
102 frmOptionsReportsCustom := TfrmOptionsReportsCustom.Create(Application);
103 actiontype := 0;
104 try
105 with frmOptionsReportsCustom do
106 begin
107 if (topvalue < 0) or (leftvalue < 0) then
108 Position := poScreenCenter
109 else
110 begin
111 Position := poDesigned;
112 Top := topvalue;
113 Left := leftvalue;
114 end;
115 ResizeAnchoredFormToFont(frmOptionsReportsCustom);
116 ShowModal;
117 actiontype := btnApply.Tag;
118 end;
119 finally
120 frmOptionsReportsCustom.Release;
121 end;
122end;
123
124procedure TfrmOptionsReportsCustom.FormCreate(Sender: TObject);
125begin
126 rptList := TStringList.Create;
127 TAccessibleStringGrid.WrapControl(grdReport);
128end;
129
130procedure TfrmOptionsReportsCustom.ShowEditor(ACol, ARow: Integer; AChar: Char);
131
132 procedure PlaceControl(AControl: TWinControl);
133 var
134 ARect: TRect;
135 begin
136 with AControl do
137 begin
138 ARect := grdReport.CellRect(ACol, ARow);
139 SetBounds(ARect.Left + grdReport.Left + 2, ARect.Top + grdReport.Top + 2,
140 ARect.Right - ARect.Left - 1 , ARect.Bottom-ARect.Top -1 );
141 Visible := True;
142 Tag := ARow;
143 BringToFront;
144 Show;
145 SetFocus;
146 end;
147 end;
148 procedure Synch(AEdit: TEdit; const edtText: string);
149 begin
150 AEdit.Text := edtText;
151 AEdit.SelectAll;
152 end;
153begin
154 inherited;
155 if ARow = 0 then Exit; //header row
156 with grdReport do if (ARow = Pred(RowCount)) and (ACol > 4 ) then Exit;
157 case ACol of
158 Col_StartDate: begin
159 if (ARow > 0 ) then
160 begin
161 PlaceControl(odbStart);
162 Synch(odbStart,ValFor(Col_StartDate,ARow));
163 if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_StartDate);
164 end;
165 end;
166 Col_StopDate: begin
167 if (ARow > 0 ) then
168 begin
169 PlaceControl(odbStop);
170 Synch(odbStop, ValFor(Col_StopDate,ARow));
171 if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_StopDate);
172 end;
173 end;
174 Col_Max: begin
175 if (ARow > 0 ) and (StrToInt(ValFor(Col_Max,ARow)) > 0) then
176 begin
177 PlaceControl(edtMax);
178 Synch(edtMax, ValFor(Col_Max,ARow));
179 fDropColumn := Col_Max;
180 if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_Max);
181 end;
182 end;
183 end;
184end;
185
186function TfrmOptionsReportsCustom.ValFor(ACol, ARow: Integer): string;
187begin
188 Result := grdReport.Cells[ACol, ARow];
189end;
190
191procedure TfrmOptionsReportsCustom.grdReportKeyPress(Sender: TObject;
192 var Key: Char);
193begin
194 inherited;
195 if grdReport.Col = 1 then
196 sDate := grdReport.Cells[grdReport.Col,grdReport.Row];
197 if grdReport.Col = 2 then
198 eDate := grdReport.Cells[grdReport.Col,grdReport.Row];
199 if (grdReport.Col = 3) and (grdReport.Cells[grdReport.Col, grdReport.Row]='') then
200 Exit else if Length(grdReport.Cells[3, grdReport.Row]) > 0 then maxOcurs := StrToInt( grdReport.Cells[3,grdReport.Row]);
201 if Key = #13 then ShowEditor(grdReport.Col, grdReport.Row, #0);
202 if Key = #9 then
203 begin
204 odbStart.Visible := False;
205 odbStop.Visible := False;
206 edtMax.Visible := False;
207 ShowEditor(grdReport.Col, grdReport.Row, #0);
208 end;
209 if Key in [#32..#127] then ShowEditor(grdReport.Col, grdReport.Row, Key);
210 signal := 0;
211end;
212
213procedure TfrmOptionsReportsCustom.grdReportMouseDown(Sender: TObject;
214 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
215var
216 ACol,ARow: integer;
217begin
218 inherited;
219 if (not User.ToolsRptEdit) then // For users with Reports settings edit parameter not set.
220 begin
221 abort;
222 exit;
223 end;
224 grdReport.MouseToCell(X,Y,ACol,ARow);
225 if (ARow < 1) or (ACol < 1) then
226 begin
227 odbStop.Visible := False;
228 odbStart.Visible := False;
229 edtMax.Visible := False;
230 Exit;
231 end;
232 if ACol = 1 then
233 begin
234 odbStop.Visible := False;
235 edtMax.Visible := False;
236 sDate := grdReport.Cells[1,ARow];
237 ShowEditor(ACol, ARow, #0);
238 end;
239 if ACol = 2 then
240 begin
241 odbStart.Visible := False;
242 edtMax.Visible := False;
243 eDate := grdReport.Cells[2,ARow];
244 ShowEditor(ACol, ARow, #0);
245 end;
246 if (ACol = 3) and (grdReport.Cells[ACol,ARow]='') then
247 begin
248 odbStart.Visible := False;
249 odbStop.Visible := False;
250 Exit;
251 end
252 else if (ACol = 3) and (strtoint(grdReport.Cells[ACol,ARow])>0) then
253 begin
254 odbStart.Visible := False;
255 odbStop.Visible := False;
256 maxOcurs := strtoint(grdReport.Cells[ACol,ARow]);
257 ShowEditor(ACol, ARow, #0);
258 end
259 else
260 begin
261 grdReport.Col := 0;
262 grdReport.Row := ARow;
263 end;
264 signal := 0;
265end;
266
267procedure TfrmOptionsReportsCustom.grdReportDrawCell(Sender: TObject; ACol,
268 ARow: Integer; Rect: TRect; State: TGridDrawState);
269begin
270 inherited;
271 grdReport.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
272 Piece(grdReport.Cells[ACol, ARow], TAB, 1));
273
274end;
275
276procedure TfrmOptionsReportsCustom.edtMaxExit(Sender: TObject);
277var
278 newValue: String;
279 code, I: integer;
280begin
281 if edtMax.Modified then
282 begin
283 newValue := edtMax.Text;
284 if length(newValue) = 0 then
285 begin
286 InfoBox('Invalid value of max occurences', 'Warning', MB_OK or MB_ICONWARNING);
287 edtMax.Text := IntToStr(maxOcurs);
288 edtMax.SetFocus;
289 edtMax.SelectAll;
290 end;
291 if length(newValue) > 0 then
292 begin
293 Val(newValue, I, code);
294 if I = 0 then begin end; //added to keep compiler from generating a hint
295 if code <> 0 then
296 begin
297 InfoBox('Invalid value of max occurences', 'Warning', MB_OK or MB_ICONWARNING);
298 edtMax.Text := IntToStr(maxOcurs);
299 edtMax.SetFocus;
300 edtMax.SelectAll;
301 end;
302 if code = 0 then
303 begin
304 if strtoint(edtMax.Text) <= 0 then
305 begin
306 InfoBox('the value of max should be greater than 0', 'Warning', MB_OK or MB_ICONWARNING);
307 edtMax.Text := intToStr(maxOcurs);
308 edtMax.SetFocus;
309 edtMax.SelectAll;
310 exit;
311 end;
312 grdReport.Cells[Col_Max, edtMax.Tag] := edtMax.Text;
313 if compareStr(Piece(Piece(grdReport.Cells[0,edtMax.Tag],TAB,2),'^',2),'M')=0 then
314 begin
315 edtMax.Visible := False;
316 btnApply.Enabled := True;
317 Exit;
318 end;
319 grdReport.Cells[0,edtMax.Tag] := grdReport.Cells[0,edtMax.Tag] + '^M';
320 edtMax.Visible := False;
321 btnApply.Enabled := True;
322 end;
323 end;
324 end;
325end;
326
327procedure TfrmOptionsReportsCustom.btnApplyClick(Sender: TObject);
328var
329 valueStartdate, valueStopdate,valueMax, rpt, values,name: string;
330 i: integer;
331begin
332 for i := 1 to grdReport.RowCount do
333 begin
334 if CompareStr(Piece(Piece( grdReport.Cells[0,i],TAB,2),'^',2),'M')=0 then
335 begin
336 rpt := Piece(Piece( grdReport.Cells[0,i],TAB,2),'^',1);
337 name := Piece( grdReport.Cells[0,i],TAB,1);
338 odbTool.Text := grdReport.Cells[1,i];
339 valueStartDate := odbTool.RelativeTime;
340 odbTool.Text := grdReport.Cells[2,i];
341 valueStopDate := odbTool.RelativeTime;
342 valueMax := grdReport.Cells[3,i];
343 if Length(valueMax)<1 then
344 valueMax := '7';
345 values := valueStartdate + ';' + valueStopDate + ';' + valueMax;
346{ if CompareStr(name,'Imaging (local only)')=0 then // imaging report id is hard coded to be 10000
347 values := valueStartdate + ';' + valueStopDate + ';;;' + valueMax
348 else}
349 rpcSetIndividualReportSetting(rpt, values);
350 end;
351 end;
352 btnApply.Enabled := False;
353 odbStart.Visible := False;
354 odbStop.Visible := False;
355 edtMax.Visible := False;
356 frmReports.LoadTreeView;
357 with frmReports.tvReports do
358 begin
359 if Items.Count > 0 then
360 Selected := Items.GetFirstNode;
361 frmReports.tvReportsClick(Selected);
362 end;
363end;
364
365procedure TfrmOptionsReportsCustom.btnCancelClick(Sender: TObject);
366begin
367 rptList.Clear;
368 Close;
369end;
370
371
372procedure TfrmOptionsReportsCustom.odbStartExit(Sender: TObject);
373const
374 TX_BAD_START = 'The start date is not valid.';
375 TX_STOPSTART = 'The start date must not be after the stop date.';
376var
377 x,ErrMsg,datestart,datestop: String;
378begin
379 if odbStart.text = '' then
380 begin
381 InfoBox(TX_BAD_START, 'Warning', MB_OK or MB_ICONWARNING);
382 odbStart.Visible := True;
383 odbStart.Text := sDate;
384 odbStart.Setfocus;
385 odbStart.SelectAll;
386 exit;
387 end;
388 if odbStart.Text = sDate then
389 exit;
390 ErrMsg := '';
391 odbStart.Validate(x);
392 if Length(x) > 0 then
393 begin
394 ErrMsg := TX_BAD_START;
395 InfoBox(TX_BAD_START, 'Warning', MB_OK or MB_ICONWARNING);
396 odbStart.Visible := True;
397 odbStart.Text := sDate;
398 odbStart.Setfocus;
399 odbStart.SelectAll;
400 exit;
401 end;
402 datestart := odbStart.RelativeTime;
403 datestop := MakeRelativeDateTime(
404 StrToFMDateTime(grdReport.Cells[Col_StopDate,odbStart.Tag])
405 );
406 delete(datestart,1,1);
407 delete(datestop,1,1);
408 if StrToIntDef(datestart,0)> StrToIntDef(datestop,0) then
409 begin
410 InfoBox(TX_STOPSTART, 'Warning', MB_OK or MB_ICONWARNING);
411 odbStart.Text := grdReport.Cells[Col_StopDate,odbStart.Tag];
412 odbStart.SetFocus;
413 odbStart.SelectAll;
414 exit;
415 end;
416 grdReport.Cells[Col_StartDate, odbStart.Tag] := DateToStr(FMDateTimeToDateTime(odbStart.FMDateTime));
417 odbStart.Visible := False;
418 btnApply.Enabled := True;
419 if compareStr(Piece(Piece(grdReport.Cells[0,odbStart.Tag],TAB,2),'^',2),'M')=0 then
420 Exit;
421 grdReport.Cells[0,odbStart.Tag] := grdReport.Cells[0,odbStart.Tag] + '^M';
422end;
423
424procedure TfrmOptionsReportsCustom.odbStopExit(Sender: TObject);
425const
426 TX_BAD_STOP = 'The stop date is not valid.';
427 TX_BAD_ORDER = 'The stop date must not be earlier than start date.';
428var
429 x, ErrMsg,datestart,datestop: string;
430begin
431 if odbStop.text = '' then
432 begin
433 InfoBox(TX_BAD_STOP, 'Warning', MB_OK or MB_ICONWARNING);
434 odbStop.Visible := True;
435 odbStop.Text := eDate;
436 odbStop.Setfocus;
437 odbStop.SelectAll;
438 exit;
439 end;
440
441 if odbStop.Text = eDate then
442 exit;
443
444 ErrMsg := '';
445 odbStop.Validate(x);
446 if Length(x) > 0 then
447 begin
448 ErrMsg := TX_BAD_STOP;
449 InfoBox(TX_BAD_STOP, 'Warning', MB_OK or MB_ICONWARNING);
450 odbStop.Visible := True;
451 odbStop.Text := eDate;
452 odbStop.Setfocus;
453 odbStop.SelectAll;
454 exit;
455 end;
456
457 datestart := MakeRelativeDateTime(
458 StrToFMDateTime(grdReport.Cells[Col_StartDate,odbStop.Tag])
459 );
460 datestop := odbStop.RelativeTime;
461 delete(datestart,1,1);
462 delete(datestop,1,1);
463 if StrToIntDef(datestart,0)> StrToIntDef(datestop,0) then
464 begin
465 InfoBox(TX_BAD_ORDER, 'Warning', MB_OK or MB_ICONWARNING);
466 odbStop.Text := grdReport.Cells[Col_StartDate,odbStop.Tag];
467 odbStop.SetFocus;
468 odbStop.SelectAll;
469 exit;
470 end;
471 grdReport.Cells[Col_StopDate, odbStop.Tag] := DateToStr(FMDateTimeToDateTime(odbStop.FMDateTime));
472 odbStop.Visible := False;
473 btnApply.Enabled := True;
474 if compareStr(Piece(Piece(grdReport.Cells[0,odbStop.Tag],TAB,2),'^',2),'M')=0 then
475 Exit;
476 grdReport.Cells[0,odbStop.Tag] := grdReport.Cells[0,odbStop.Tag] + '^M';
477end;
478
479
480procedure TfrmOptionsReportsCustom.FormClose(Sender: TObject;
481 var Action: TCloseAction);
482begin
483 Close;
484 rptList.Clear;
485end;
486
487procedure TfrmOptionsReportsCustom.odbStartKeyPress(Sender: TObject;
488 var Key: Char);
489begin
490 if Key = #13 then
491 begin
492 odbStart.Visible := False;
493 Perform(WM_NextDlgCtl, 0, 0);
494 exit;
495 end;
496end;
497
498procedure TfrmOptionsReportsCustom.odbStopKeyPress(Sender: TObject;
499 var Key: Char);
500begin
501 if Key = #13 then
502 begin
503 odbStop.Visible := False;
504 Perform(WM_NextDlgCtl, 0, 0);
505 exit;
506 end;
507end;
508
509procedure TfrmOptionsReportsCustom.edtMaxKeyPress(Sender: TObject;
510 var Key: Char);
511begin
512 if Key = #13 then
513 begin
514 edtMax.Visible := False;
515 Perform(WM_NextDlgCtl, 0, 0);
516 exit;
517 end;
518end;
519
520procedure TfrmOptionsReportsCustom.btnOKClick(Sender: TObject);
521begin
522 if btnApply.Enabled then
523 btnApplyClick(self);
524 Close;
525end;
526
527procedure TfrmOptionsReportsCustom.edtSearchChange(Sender: TObject);
528var
529 i: integer;
530 needle,hay: String;
531 selRect: TGridRect;
532
533begin
534 if (edtSearch.Modified) and (signal=0) then
535 begin
536 needle := UpperCase(edtSearch.text);
537 if length(needle)=0 then
538 begin
539 selRect.Left := 0;
540 selRect.Top := 1;
541 selRect.Right := 0;
542 selRect.Bottom := 1;
543 grdReport.Selection := selRect;
544 grdReport.TopRow := 1;
545 exit;
546 end;
547 for i := 1 to grdReport.RowCount do
548 begin
549 hay := Piece(UpperCase(grdReport.Cells[0,i]),TAB,1);
550 hay := Copy(hay,0,length(needle));
551 if Pos(needle, hay) > 0 then
552 begin
553 selRect.Left := 0;
554 selRect.Top := i;
555 selRect.Right := 0;
556 selRect.Bottom := i;
557 grdReport.Selection := selRect;
558 grdReport.TopRow := i;
559 exit;
560 end;
561 end;
562 end;
563 if (edtSearch.Modified) and (signal=1) then
564 begin
565 signal := 0;
566 end;
567 Exit;
568end;
569
570procedure TfrmOptionsReportsCustom.edtSearchKeyPress(Sender: TObject;
571 var Key: Char);
572begin
573 if Key = #13 then
574 begin
575 Perform(WM_NextDlgCtl, 0, 0);
576 edtSearch.Text := '';
577 exit;
578 end;
579end;
580
581procedure TfrmOptionsReportsCustom.FormShow(Sender: TObject);
582var
583 i,rowNum: integer;
584 startOff,stopOff: string;
585 today: TFMDateTime;
586begin
587 today := FMToday;
588 signal := 0;
589 rptList := TStringList.Create;
590 CallV('ORWTPD GETSETS',[nil]);
591 MixedCaseList( RPCBrokerV.Results );
592 rptList := TStringList(RPCBrokerV.Results);
593 SortByPiece(rptList,'^',2);
594 rowNum := rptList.Count;
595 grdReport.RowCount := rowNum + 1;
596 grdReport.Cells[0,0] := 'Report Name';
597 grdReport.Cells[1,0] := 'Start Date';
598 grdReport.Cells[2,0] := 'Stop Date';
599 grdReport.Cells[3 ,0] := 'Max';
600
601 for i := 1 to grdReport.RowCount-1 do
602 begin
603 grdReport.Cells[0,i] := Piece(rptList[i-1],'^',2)+ TAB + Piece(rptList[i-1],'^',1);
604 startOff := Piece(Piece(rptList[i-1],'^',3),';',1);
605 stopOff := Piece(Piece(rptList[i-1],'^',3),';',2);
606 delete(startOff,1,1);
607 delete(stopOff,1,1);
608 grdReport.Cells[1,i] := DateToStr(FMDateTimeToDateTime(FMDateTimeOffsetBy(today, StrToIntDef(startOff,0))));
609 grdReport.Cells[2,i] := DateToStr(FMDateTimeToDateTime(FMDateTimeOffsetBy(today, StrToIntDef(stopOff,0))));
610 grdReport.Cells[3,i] := Piece(Piece(rptList[i-1],'^',3),';',3);
611 end;
612 if not edtSearch.Focused then
613 edtSearch.SetFocus;
614 btnCancel.Caption := 'Cancel';
615 if (not User.ToolsRptEdit) then // For users with Reports settings edit parameter not set.
616 begin
617 grdReport.onKeyPress := nil;
618 grdReport.onMouseDown := nil;
619 odbStart.readOnly := true;
620 odbStart.onExit := nil;
621 odbStart.onKeyPress := nil;
622 odbStop.readOnly := true;
623 odbStop.onExit := nil;
624 odbStop.onKeyPress := nil;
625 edtMax.readOnly := true;
626 odbTool.readOnly := true;
627 btnOK.visible := false;
628 btnApply.visible := false;
629 btnCancel.Caption := 'Close';
630 end;
631end;
632
633procedure TfrmOptionsReportsCustom.grdReportKeyDown(Sender: TObject;
634 var Key: Word; Shift: TShiftState);
635begin
636 if (Key = VK_TAB) then
637 begin
638 if ssShift in Shift then
639 begin
640 EdtSearch.SetFocus;
641 Key := 0;
642 end
643 else if ssCtrl in Shift then
644 begin
645 if User.ToolsRptEdit then
646 btnApply.SetFocus
647 else
648 btnCancel.SetFocus;
649 Key := 0;
650 end;
651 end;
652 if Key = VK_ESCAPE then begin
653 EdtSearch.SetFocus;
654 Key := 0;
655 end;
656end;
657
658procedure TfrmOptionsReportsCustom.FormDestroy(Sender: TObject);
659begin
660 TAccessibleStringGrid.UnwrapControl(grdReport);
661end;
662
663end.
664
Note: See TracBrowser for help on using the repository browser.