{******************************************} { } { FastReport FMX v1.0 } { Query params editor } { } { Copyright (c) 1998-2013 } { by Alexander Tzyganenko, } { Fast Reports Inc. } { } {******************************************} unit FMX.frxEditQueryParams; interface {$I frx.inc} uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Forms, Data.DB, FMX.frxCustomDB, FMX.frxCtrls, System.Rtti, System.UITypes , System.Variants, FMX.Edit, FMX.ListBox, FMX.Layouts, FMX.Grid, System.Types {$IFDEF DELPHI18} ,FMX.StdCtrls {$ENDIF} {$IFDEF DELPHI24} ,FMX.Grid.Style {$ENDIF} ; type THackStringGrid = class(TStringGrid); TfrxParamsEditorForm = class(TForm) TypeCB: TComboBox; OkB: TButton; CancelB: TButton; ButtonPanel: TPanel; ExpressionB: TSpeedButton; ParamGrid: TStringGrid; procedure FormShow(Sender: TObject); procedure OkBClick(Sender: TObject); procedure FormHide(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ValueEButtonClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); procedure TypeCBChange(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ParamGridResize(Sender: TObject); private FParams: TfrxParams; procedure ParamGridDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; {$IFNDEF DELPHI20}var Accept: Boolean{$ELSE} var Operation: TDragOperation{$ENDIF}); procedure ParamGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); public property Params: TfrxParams read FParams write FParams; end; implementation {$R *.FMX} uses FMX.frxClass, FMX.frxRes, FMX.frxFMX; { TfrxParamEditorForm } procedure TfrxParamsEditorForm.FormShow(Sender: TObject); var i, NameColumn, dTypeColumn, ExpColumn: Integer; t: TFieldType; begin // in case column was moved ExpColumn := 2; dTypeColumn := 1; NameColumn := 0; for i := 0 to ParamGrid.ColumnCount - 1 do case ParamGrid.Columns[i].Tag of 1: NameColumn := ParamGrid.Columns[i].Index; 2: dTypeColumn := ParamGrid.Columns[i].Index; 3: ExpColumn := ParamGrid.Columns[i].Index; end; ParamGrid.RowCount := Params.Count; ParamGrid.BeginUpdate; for i := 0 to Params.Count - 1 do begin ParamGrid.Cells[NameColumn, i] := Params[i].Name; ParamGrid.Cells[dTypeColumn, i] := FieldTypeNames[Params[i].DataType]; ParamGrid.Cells[ExpColumn, i] := Params[i].Expression; end; ParamGrid.EndUpdate; for t := Low(TFieldType) to High(TFieldType) do TypeCB.Items.Add(FieldTypeNames[t]); ButtonPanel.Height := TypeCB.Height - 2; ExpressionB.Height := TypeCB.Height - 2; ButtonPanel.Visible := False; TypeCB.Visible := False; end; procedure TfrxParamsEditorForm.FormHide(Sender: TObject); var i, dTypeColumn, ExpColumn: Integer; t: TFieldType; begin if ModalResult <> mrOk then Exit; ExpColumn := 2; dTypeColumn := 1; // in case column was moved for i := 0 to ParamGrid.ColumnCount - 1 do case ParamGrid.Columns[i].Tag of 2: dTypeColumn := ParamGrid.Columns[i].Index; 3: ExpColumn := ParamGrid.Columns[i].Index; end; for i := 0 to ParamGrid.RowCount - 1 do begin for t := Low(TFieldType) to High(TFieldType) do if ParamGrid.Cells[dTypeColumn, i] = FieldTypeNames[t] then begin Params[i].DataType := t; break; end; Params[i].Expression := ParamGrid.Cells[ExpColumn, i]; end; end; procedure TfrxParamsEditorForm.ParamGridDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; {$IFNDEF DELPHI20}var Accept: Boolean{$ELSE} var Operation: TDragOperation{$ENDIF}); begin ParamGridResize(nil); end; procedure TfrxParamsEditorForm.ParamGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var C: TColumn; RowIndex, i: Integer; begin TypeCB.Visible := False; ButtonPanel.Visible := False; C := ParamGrid.ColumnByPoint(X, Y); if C <> nil then begin if C.Tag = 2 then begin TypeCB.Position.X := C.Position.X + ParamGrid.Position.X + 2; RowIndex := ParamGrid.RowByPoint(X, Y); if RowIndex > ParamGrid.RowCount - 1 then Exit; i := TypeCB.Items.IndexOf(ParamGrid.Cells[C.Index, RowIndex]); if i <> -1 then TypeCB.ListItems[i].IsSelected := True else TypeCB.ListItems[0].IsSelected := True; TypeCB.Position.Y := RowIndex * ParamGrid.RowHeight + ParamGrid.Position.Y + ParamGrid.RowHeight + 3; TypeCB.Width := C.Width; TypeCB.Visible := True; end else if C.Tag = 3 then begin ButtonPanel.Visible := True; ButtonPanel.Position.X := C.Position.X + ParamGrid.Position.X + C.Width - ButtonPanel.Width - 2; RowIndex := ParamGrid.RowByPoint(X, Y); if RowIndex > ParamGrid.RowCount - 1 then Exit; ButtonPanel.Position.Y := RowIndex * ParamGrid.RowHeight + ParamGrid.Position.Y + ParamGrid.RowHeight + 3; ButtonPanel.Visible := True; end; end; end; procedure TfrxParamsEditorForm.ParamGridResize(Sender: TObject); begin TypeCB.Visible := False; ButtonPanel.Visible := False; end; procedure TfrxParamsEditorForm.TypeCBChange(Sender: TObject); begin if TypeCB.Selected <> nil then ParamGrid.Cells[ParamGrid.ColumnIndex, ParamGrid.Selected] := TypeCB.Selected.Text; end; procedure TfrxParamsEditorForm.OkBClick(Sender: TObject); begin // ParamsLV.Selected := ParamsLV.Items[0]; end; procedure TfrxParamsEditorForm.ValueEButtonClick(Sender: TObject); var s: String; begin s := TfrxCustomDesigner(Owner).InsertExpression(ParamGrid.Cells[ParamGrid.ColumnIndex, ParamGrid.Selected]); if s <> '' then ParamGrid.Cells[ParamGrid.ColumnIndex, ParamGrid.Selected] := s; end; procedure TfrxParamsEditorForm.FormClose(Sender: TObject; var Action: TCloseAction); begin FormHide(Self); end; procedure TfrxParamsEditorForm.FormCreate(Sender: TObject); var SColumn: TStringColumn; begin Caption := frxGet(3700); OkB.Text := frxGet(1); CancelB.Text := frxGet(2); ParamGrid.BeginUpdate; ParamGrid.RowCount := 0; SColumn := TStringColumn.Create(ParamGrid); SColumn.Header := frxResources.Get('qpName'); SColumn.ReadOnly := True; SColumn.Tag := 1; SColumn.OnResize := ParamGridResize; SColumn.OnDragEnd := ParamGridResize; SColumn.OnDragOver := ParamGridDragOver; ParamGrid.AddObject(SColumn); SColumn := TStringColumn.Create(ParamGrid); SColumn.Header := frxResources.Get('qpDataType'); SColumn.ReadOnly := True; SColumn.Tag := 2; SColumn.OnResize := ParamGridResize; SColumn.OnDragEnd := ParamGridResize; SColumn.OnDragOver := ParamGridDragOver; ParamGrid.AddObject(SColumn); SColumn := TStringColumn.Create(ParamGrid); SColumn.Header := frxResources.Get('qpValue'); SColumn.ReadOnly := False; SColumn.OnResize := ParamGridResize; SColumn.OnDragEnd := ParamGridResize; SColumn.OnDragOver := ParamGridDragOver; SColumn.Tag := 3; ParamGrid.AddObject(SColumn); ParamGrid.OnMouseUp := ParamGridMouseUp; ParamGrid.OnDragOver := ParamGridDragOver; ParamGrid.OnDragEnd := ParamGridResize; {$IFDEF DELPHI20} ParamGrid.Options := ParamGrid.Options + [TGridOption.AlternatingRowBackground]; {$ELSE} ParamGrid.AlternatingRowBackground := True; {$ENDIF} ParamGrid.EndUpdate; end; procedure TfrxParamsEditorForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); begin if Key = VK_F1 then frxResources.Help(Self); end; end.