FastReport_2022_VCL/LibD28/frxEditSQL.pas
2024-01-01 16:13:08 +01:00

353 lines
8.0 KiB
ObjectPascal

{******************************************}
{ }
{ FastReport VCL }
{ SQL editor }
{ }
{ Copyright (c) 1998-2021 }
{ by Fast Reports Inc. }
{ }
{******************************************}
unit frxEditSQL;
interface
{$I frx.inc}
uses
SysUtils,
{$IFNDEF FPC}
Windows, Messages,
{$ENDIF}
Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ToolWin, frxSynMemo,
frxCustomDB, frxBaseForm
{$IFDEF FPC}
, LResources, LCLType
{$ENDIF}
{$IFDEF Delphi6}
, Variants
{$ENDIF}
{$IFDEF QBUILDER}
, fqbClass
{$ENDIF};
type
TfrxSQLEditorForm = class(TfrxBaseLoadSavePrefForm)
ToolBar: TToolBar;
OkB: TToolButton;
CancelB: TToolButton;
QBB: TToolButton;
ParamsB: TToolButton;
ToolButton2: TToolButton;
CBPanel: TPanel;
CBDialect: TComboBox;
TBEditDialect: TToolButton;
ToolButton3: TToolButton;
LDialect: TLabel;
TBSaveDialect: TToolButton;
TBLoadDialect: TToolButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
procedure OkBClick(Sender: TObject);
procedure CancelBClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MemoKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure QBBClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ParamsBClick(Sender: TObject);
procedure TBEditDialectClick(Sender: TObject);
procedure CBDialectChange(Sender: TObject);
procedure TBSaveDialectClick(Sender: TObject);
procedure TBLoadDialectClick(Sender: TObject);
private
{ Private declarations }
FMemo: TfrxSyntaxMemo;
FQuery: TfrxCustomQuery;
{$IFDEF QBUILDER}
FQBEngine: TfqbEngine;
{$ENDIF}
FSaveSQL: TStrings;
FSaveSchema: String;
FSaveParams: TfrxParams;
procedure UpdateDialectsCB;
public
{ Public declarations }
procedure UpdateResouces; override;
procedure UpdateFormPPI(aNewPPI: Integer); override;
property Query: TfrxCustomQuery read FQuery write FQuery;
end;
implementation
{$IFNDEF FPC}
{$R *.DFM}
{$ELSE}
{$R *.lfm}
{$ENDIF}
uses frxClass, frxRes, frxEditQueryParams, frxEditSQLDialect, frxUtils, IniFiles;
const SettingSection = 'Form.TfrxSQLEditorForm';
procedure TfrxSQLEditorForm.CBDialectChange(Sender: TObject);
begin
if CBDialect.ItemIndex = FMemo.SynDialectStyles.ActiveIndex + 1 then Exit;
FMemo.SynDialectStyles.ActiveIndex := CBDialect.ItemIndex - 1;
{$IFDEF FPC}
frxUpdateControl(FMemo);
{$ELSE}
FMemo.Repaint;
{$ENDIF}
end;
procedure TfrxSQLEditorForm.FormCreate(Sender: TObject);
begin
{$IFDEF FR_COM}
Icon.Handle := LoadIcon(hInstance, 'SDESGNICON');
{$ENDIF}
FSaveSQL := TStringList.Create;
FSaveParams := TfrxParams.Create;
FMemo := TfrxSyntaxMemo.Create(Self);
with FMemo do
begin
Parent := Self;
Align := alClient;
Syntax := 'SQL';
ShowGutter := True;
GutterWidth := 30;
{ an example of using default AttributeStyles }
{ with TfrxAttributeStyle(AttributeStyles.Add) do
begin
FontColor := clRed;
AttrType := caKeyword;
FontStyle := [fsBold];
Keywords.Add('select');
end;
with TfrxAttributeStyle(AttributeStyles.Add) do
begin
FontColor := clRed;
AttrType := caText;
FontStyle := [fsBold];
Keywords.Add('id');
end;
}
{$IFDEF UseTabset}
BevelKind := bkFlat;
{$ELSE}
BorderStyle := bsSingle;
{$ENDIF}
Color := clWindow;
OnKeyDown := MemoKeyDown;
{$I frxEditSQL.inc}
end;
{$IFDEF QBUILDER}
QBB.Visible := True;
{$ENDIF}
if UseRightToLeftAlignment then
FlipChildren(True);
end;
procedure TfrxSQLEditorForm.FormDestroy(Sender: TObject);
begin
FSaveSQL.Free;
FSaveParams.Free;
end;
procedure TfrxSQLEditorForm.FormShow(Sender: TObject);
begin
FSaveSQL.Assign(Query.SQL);
FSaveParams.Assign(Query.Params);
FSaveSchema := Query.SQLSchema;
{$IFDEF QBUILDER}
try
FQBEngine := Query.QBEngine;
except
end;
{$ENDIF}
FMemo.Lines.Assign(Query.SQL);
FMemo.LoadFromIni(Query.Report.IniFile, SettingSection, '');
UpdateDialectsCB;
FMemo.SetFocus;
end;
procedure TfrxSQLEditorForm.FormHide(Sender: TObject);
begin
if ModalResult = mrOk then
begin
Query.SQL.Assign(FMemo.Lines);
end
else
begin
Query.SQL.Assign(FSaveSQL);
Query.Params.Assign(FSaveParams);
Query.SQLSchema := FSaveSchema;
end;
FMemo.SaveToIni(Query.Report.IniFile, SettingSection, '');
{$IFDEF QBUILDER}
if FQBEngine <> nil then
FQBEngine.Free;
{$ENDIF}
end;
procedure TfrxSQLEditorForm.OkBClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TfrxSQLEditorForm.CancelBClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TfrxSQLEditorForm.MemoKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = vk_Return) and (ssCtrl in Shift) then
ModalResult := mrOk
else if Key = vk_Escape then
ModalResult := mrCancel
else if Key = VK_F1 then
frxResources.Help(Self);
end;
procedure TfrxSQLEditorForm.QBBClick(Sender: TObject);
{$IFDEF QBUILDER}
var
fqbDialog: TfqbDialog;
{$ENDIF}
begin
{$IFDEF QBUILDER}
fqbDialog := TfqbDialog.Create(nil);
try
fqbDialog.Engine := FQBEngine;
fqbDialog.SchemaInsideSQL := False;
fqbDialog.SQL := FMemo.Lines.Text;
fqbDialog.SQLSchema := Query.SQLSchema;
if fqbDialog.Execute then
begin
FMemo.Lines.Text := fqbDialog.SQL;
Query.SQLSchema := fqbDialog.SQLSchema;
end;
finally
fqbDialog.Free;
end;
{$ENDIF}
end;
procedure TfrxSQLEditorForm.TBEditDialectClick(Sender: TObject);
begin
with TfrxSQLDialectForm.Create(Self) do
begin
SynDialectStyles := FMemo.SynDialectStyles;
ShowModal;
UpdateDialectsCB;
Free;
end;
end;
procedure TfrxSQLEditorForm.TBLoadDialectClick(Sender: TObject);
var
ini: TIniFile;
begin
if OpenDialog.Execute then
begin
ini := TIniFile.Create(OpenDialog.FileName);
try
FMemo.SynDialectStyles.LoadFrom(SettingSection, ini);
finally
UpdateDialectsCB;
ini.Free;
end;
end;
end;
procedure TfrxSQLEditorForm.TBSaveDialectClick(Sender: TObject);
var
ini: TIniFile;
begin
if SaveDialog.Execute then
begin
ini := TIniFile.Create(SaveDialog.FileName);
try
FMemo.SynDialectStyles.SaveTo(SettingSection, ini);
finally
ini.Free;
end;
end;
end;
procedure TfrxSQLEditorForm.UpdateDialectsCB;
var
i: Integer;
begin
CBDialect.Clear;
CBDialect.Items.BeginUpdate;
CBDialect.Items.Add('Default');
for i := 0 to FMemo.SynDialectStyles.Count - 1 do
CBDialect.Items.Add(FMemo.SynDialectStyles[i].Name);
CBDialect.Items.EndUpdate;
CBDialect.ItemIndex := FMemo.SynDialectStyles.ActiveIndex + 1;
end;
procedure TfrxSQLEditorForm.UpdateFormPPI(aNewPPI: Integer);
{$IFDEF FPC}
var
i: Integer;
{$ENDIF}
begin
inherited;
Toolbar.Images := frxResources.MainButtonImages;
{$IFDEF FPC}
Toolbar.ImagesWidth := Toolbar.Images.Width;
for i := 0 to ToolBar.ButtonCount - 1 do
ToolBar.Buttons[i].AutoSize:= true;
{$ENDIF}
Toolbar.ButtonWidth := 0;
Toolbar.ButtonHeight := 0;
end;
procedure TfrxSQLEditorForm.UpdateResouces;
begin
inherited;
Caption := frxGet(4900);
QBB.Hint := frxGet(4901);
ParamsB.Hint := frxGet(5714);
CancelB.Hint := frxGet(2);
OkB.Hint := frxGet(1);
LDialect.Caption := frxGet(6700);
TBEditDialect.Hint := frxGet(6701);
TBLoadDialect.Hint := frxGet(6705);
TBSaveDialect.Hint := frxGet(6706);
SaveDialog.Filter := frxGet(6707);
OpenDialog.Filter := frxGet(6707);
UpdateDialectsCB;
end;
procedure TfrxSQLEditorForm.ParamsBClick(Sender: TObject);
begin
Query.SQL.Assign(FMemo.Lines);
if Query.Params.Count <> 0 then
with TfrxParamsEditorForm.Create(Owner) do
begin
Params := Query.Params;
if ShowModal = mrOk then
Query.UpdateParams;
Free;
end;
end;
end.