📄 queryfrm.pas
字号:
{ Demostrates how to execute a query in a background thread. This
files contains the main user interface for this program. The background
query code is in ResltFrm }
unit QueryFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, IniFiles, ExtCtrls, DBTables;
type
TAdhocForm = class(TForm)
AliasCombo: TComboBox;
Label1: TLabel;
QueryEdit: TMemo;
Label2: TLabel;
NameEdit: TEdit;
PasswordEdit: TEdit;
Label3: TLabel;
Label4: TLabel;
ExecuteBtn: TButton;
CloseBtn: TButton;
SavedQueryCombo: TComboBox;
Label5: TLabel;
SaveBtn: TButton;
SaveAsBtn: TButton;
NewBtn: TButton;
Bevel1: TBevel;
procedure FormCreate(Sender: TObject);
procedure CloseBtnClick(Sender: TObject);
procedure ExecuteBtnClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure NewBtnClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
procedure SaveAsBtnClick(Sender: TObject);
procedure SavedQueryComboChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
QueryName, OldAlias: string;
SavedQueries: TIniFile;
Unnamed: Boolean;
function IsModified: Boolean;
function CheckModified: Boolean;
procedure Unmodify;
procedure ReadQuery;
procedure SaveQuery;
procedure SaveQueryAs;
public
{ Public declarations }
end;
var
AdhocForm: TAdhocForm;
implementation
uses DB, ResltFrm, SaveQAs;
{$R *.DFM}
function StrToIniStr(const Str: string): string;
var
Buffer: array[0..4095] of Char;
B, S: PChar;
begin
if Length(Str) > SizeOf(Buffer) then
raise Exception.Create('String to large to save in INI file');
S := PChar(Str);
B := Buffer;
while S^ <> #0 do
case S^ of
#13, #10:
begin
if (S^ = #13) and (S[1] = #10) then Inc(S)
else if (S^ = #10) and (S[1] = #13) then Inc(S);
B^ := '\';
Inc(B);
B^ := 'n';
Inc(B);
Inc(S);
end;
else
B^ := S^;
Inc(B);
Inc(S);
end;
B^ := #0;
Result := Buffer;
end;
function IniStrToStr(const Str: string): string;
var
Buffer: array[0..4095] of Char;
B, S: PChar;
begin
if Length(Str) > SizeOf(Buffer) then
raise Exception.Create('String to read from an INI file');
S := PChar(Str);
B := Buffer;
while S^ <> #0 do
if (S[0] = '\') and (S[1] = 'n') then
begin
B^ := #13;
Inc(B);
B^ := #10;
Inc(B);
Inc(S);
Inc(S);
end
else
begin
B^ := S^;
Inc(B);
Inc(S);
end;
B^ := #0;
Result := Buffer;
end;
function TAdhocForm.IsModified: Boolean;
begin
Result := (AliasCombo.Text <> OldAlias) or NameEdit.Modified or
QueryEdit.Modified;
end;
function TAdhocForm.CheckModified: Boolean;
begin
Result := True;
if IsModified then
case MessageDlg(Format('Query %s modified, save?', [QueryName]),
mtConfirmation, mbYesNoCancel, 0) of
mrYes: SaveQuery;
mrCancel: Result := False;
end;
end;
procedure TAdhocForm.Unmodify;
begin
OldAlias := AliasCombo.Text;
NameEdit.Modified := False;
QueryEdit.Modified := False;
end;
procedure TAdhocForm.ReadQuery;
begin
if not CheckModified then Exit;
with SavedQueries do
begin
QueryName := SavedQueryCombo.Items[SavedQueryCombo.ItemIndex];
QueryEdit.Text := IniStrToStr(ReadString(QueryName, 'Query', ''));
AliasCombo.Text := ReadString(QueryName, 'Alias', '');
NameEdit.Text := ReadString(QueryName, 'Name', '');
end;
Unmodify;
if Showing then
if NameEdit.Text <> '' then
PasswordEdit.SetFocus else
QueryEdit.SetFocus;
end;
procedure TAdhocForm.SaveQueryAs;
begin
if GetNewName(QueryName) then
begin
Unnamed := False;
SaveQuery;
with SavedQueryCombo, Items do
begin
if IndexOf(QueryName) < 0 then Add(QueryName);
ItemIndex := IndexOf(QueryName);
end;
end;
end;
procedure TAdhocForm.SaveQuery;
begin
if Unnamed then
SaveQueryAs
else
with SavedQueries do
begin
WriteString(QueryName, 'Query', StrToIniStr(QueryEdit.Text));
WriteString(QueryName, 'Alias', AliasCombo.Text);
WriteString(QueryName, 'Name', NameEdit.Text);
Unmodify;
end;
end;
procedure TAdhocForm.FormCreate(Sender: TObject);
procedure CreateInitialIni;
const
VeryInefficientName = 'IB: Very Inefficient Query';
VeryInefficientQuery =
'select EMP_NO, Avg(Salary) as Salary\n'+
' from employee, employee, employee\n' +
' group by EMP_NO';
AmountDueName = 'DB: Amount Due By Customer';
AmountDueByCustomer =
'select Company, Sum(ItemsTotal) - Sum(AmountPaid) as AmountDue\n' +
' from customer, orders\n' +
' where Customer.CustNo = Orders.CustNo\n' +
' group by Company';
begin
{ Create initial INI file when one doesn't already exisit }
with SavedQueries do
begin
WriteString(VeryInefficientName, 'Query', VeryInefficientQuery);
WriteString(VeryInefficientName, 'Alias', 'IBLOCAL');
WriteString(VeryInefficientName, 'Name', 'SYSDBA');
SavedQueryCombo.Items.Add(VeryInefficientName);
WriteString(AmountDueName, 'Query', AmountDueByCustomer);
WriteString(AmountDueName, 'Alias', 'DBDEMOS');
WriteString(AmountDueName, 'Name', '');
SavedQueryCombo.Items.Add(AmountDueName);
end;
end;
begin
{ Grab session aliases }
Session.GetAliasNames(AliasCombo.Items);
{ Load in saved queries }
SavedQueries := TIniFile.Create('BKQUERY.INI');
SavedQueries.ReadSections(SavedQueryCombo.Items);
if SavedQueryCombo.Items.Count <= 0 then CreateInitialIni;
SavedQueryCombo.ItemIndex := 0;
QueryName := SavedQueryCombo.Items[0];
Unmodify;
ReadQuery;
end;
procedure TAdhocForm.FormDestroy(Sender: TObject);
begin
SavedQueries.Free;
end;
procedure TAdhocForm.CloseBtnClick(Sender: TObject);
begin
Close;
end;
procedure TAdhocForm.ExecuteBtnClick(Sender: TObject);
begin
BackgroundQuery(QueryName, AliasCombo.Text, NameEdit.Text, PasswordEdit.Text,
QueryEdit.Text);
BringToFront;
end;
procedure TAdhocForm.NewBtnClick(Sender: TObject);
function UniqueName: string;
var
I: Integer;
begin
I := 1;
repeat
Result := Format('Query%d', [I]);
Inc(I);
until SavedQueryCombo.Items.IndexOf(Result) < 0;
end;
begin
AliasCombo.Text := 'DBDEMOS';
NameEdit.Text := '';
PasswordEdit.Text := '';
QueryEdit.Text := '';
QueryEdit.SetFocus;
QueryName := UniqueName;
SavedQueryCombo.ItemIndex := -1;
Unnamed := True;
end;
procedure TAdhocForm.SaveBtnClick(Sender: TObject);
begin
SaveQuery;
end;
procedure TAdhocForm.SaveAsBtnClick(Sender: TObject);
begin
SaveQueryAs;
end;
procedure TAdhocForm.SavedQueryComboChange(Sender: TObject);
begin
ReadQuery;
end;
procedure TAdhocForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := CheckModified;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -