mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-02 02:23:44 +02:00
250 lines
6.2 KiB
ObjectPascal
250 lines
6.2 KiB
ObjectPascal
|
|
{*****************************************}
|
|
{ }
|
|
{ FastReport v2.3 }
|
|
{ Open table dialog }
|
|
{ }
|
|
{ Copyright (c) 1998-99 by Tzyganenko A. }
|
|
{ }
|
|
{*****************************************}
|
|
|
|
unit FR_DBOp;
|
|
|
|
interface
|
|
|
|
{$I FR.inc}
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, ExtCtrls;
|
|
|
|
type
|
|
TfrOpenDBDialog = class(TCommonDialog)
|
|
private
|
|
{ Private declarations }
|
|
FPanel: TPanel;
|
|
FLabel: TLabel;
|
|
FComboBox: TComboBox;
|
|
FDlghWnd: HWND;
|
|
FNullAlias: String;
|
|
FAliasName: String;
|
|
FFilter: String;
|
|
FFilterIndex: Integer;
|
|
FFileName: String;
|
|
FTableName: String;
|
|
FTitle: string;
|
|
procedure InitExtDlg;
|
|
procedure DoneExtDlg;
|
|
function GetAliasDirectory(A: String): String;
|
|
procedure ComboBoxChange(Sender: TObject);
|
|
public
|
|
{ Public declarations }
|
|
constructor Create(AOwner: TComponent); override;
|
|
{$IFDEF Delphi2}
|
|
function Execute: Boolean;
|
|
{$ELSE}
|
|
function Execute: Boolean; override;
|
|
{$ENDIF}
|
|
property AliasName: String read FAliasName write FAliasName;
|
|
property FileName: String read FFileName write FFileName;
|
|
property TableName: String read FTableName write FTableName;
|
|
published
|
|
property Filter: string read FFilter write FFilter;
|
|
property FilterIndex: Integer read FFilterIndex write FFilterIndex default 1;
|
|
property Title: string read FTitle write FTitle;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
{$R *.RES}
|
|
|
|
uses CommDlg, Dlgs, DB
|
|
{$IFDEF BDE}
|
|
, DBTables
|
|
{$ENDIF};
|
|
|
|
var
|
|
OpenDBDialog: TfrOpenDBDialog;
|
|
|
|
procedure CenterWindow(Wnd: HWnd);
|
|
var
|
|
Rect: TRect;
|
|
begin
|
|
GetWindowRect(Wnd, Rect);
|
|
SetWindowPos(Wnd, 0,
|
|
(GetSystemMetrics(SM_CXSCREEN) - Rect.Right + Rect.Left) div 2,
|
|
(GetSystemMetrics(SM_CYSCREEN) - Rect.Bottom + Rect.Top) div 3,
|
|
0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
|
|
end;
|
|
|
|
function ExplorerHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
|
|
var
|
|
s: String[255];
|
|
i: Integer;
|
|
b: Boolean;
|
|
begin
|
|
Result := 0;
|
|
if Msg = WM_NOTIFY then
|
|
case POFNotify(LParam)^.hdr.code of
|
|
CDN_INITDONE:
|
|
begin
|
|
SetParent(OpenDBDialog.FPanel.Handle, Wnd);
|
|
OpenDBDialog.FPanel.Show;
|
|
OpenDBDialog.FDlghWnd := GetWindowLong(Wnd, GWL_HWNDPARENT);
|
|
CenterWindow(OpenDBDialog.FDlghWnd);
|
|
end;
|
|
CDN_FOLDERCHANGE:
|
|
begin
|
|
s[0] := Chr(GetCurrentDirectory(255, @s[1]));
|
|
b := True;
|
|
with OpenDBDialog.FComboBox do
|
|
begin
|
|
for i := 0 to Items.Count-1 do
|
|
if AnsiCompareText(s, OpenDBDialog.GetAliasDirectory(Items[i])) = 0 then
|
|
begin
|
|
ItemIndex := i;
|
|
b := False;
|
|
break;
|
|
end;
|
|
if b then
|
|
ItemIndex := Items.IndexOf(OpenDBDialog.FNullAlias);
|
|
OpenDBDialog.FAliasName := Items[ItemIndex];
|
|
end;
|
|
SendMessage(GetDlgItem(OpenDBDialog.FDlghWnd, edt1), WM_SETTEXT, 0, 0);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
constructor TfrOpenDBDialog.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FFilterIndex := 1;
|
|
end;
|
|
|
|
procedure TfrOpenDBDialog.InitExtDlg;
|
|
begin
|
|
FPanel := TPanel.Create(Self);
|
|
with FPanel do
|
|
begin
|
|
Visible := False;
|
|
Parent := Self.Owner as TWinControl;
|
|
BevelOuter := bvNone;
|
|
SetBounds(0, 236, 400, 30);
|
|
FLabel := TLabel.Create(Self);
|
|
with FLabel do
|
|
begin
|
|
Parent := FPanel;
|
|
Left := 8;
|
|
Top := 2;
|
|
Caption := LoadStr(65000); //'&Alias:';
|
|
end;
|
|
FComboBox := TComboBox.Create(Self);
|
|
with FComboBox do
|
|
begin
|
|
Parent := FPanel;
|
|
Left := 81; Top := 0; Width := 234;
|
|
Style := csDropDownList;
|
|
Sorted := True;
|
|
{$IFDEF BDE}
|
|
Session.GetAliasNames(Items);
|
|
{$ENDIF}
|
|
FNullAlias := LoadStr(65001); //'None';
|
|
Items.Add(FNullAlias);
|
|
ItemIndex := 0;
|
|
OnChange := ComboBoxChange;
|
|
end;
|
|
FLabel.FocusControl := FComboBox;
|
|
end;
|
|
OpenDBDialog := Self;
|
|
end;
|
|
|
|
procedure TfrOpenDBDialog.DoneExtDlg;
|
|
begin
|
|
FComboBox.Free;
|
|
FLabel.Free;
|
|
FPanel.Free;
|
|
end;
|
|
|
|
function TfrOpenDBDialog.Execute: Boolean;
|
|
var
|
|
OpenFilename: TOpenFilename;
|
|
|
|
function AllocFilterStr(const S:string): PChar;
|
|
var P: PChar;
|
|
begin
|
|
Result := nil;
|
|
if S <> '' then
|
|
begin
|
|
Result := StrCopy(StrAlloc(Length(S) + 2), PChar(S));
|
|
P := Result;
|
|
while P^ <> #0 do
|
|
begin
|
|
if P^ = '|' then P^ := #0;
|
|
Inc(P);
|
|
end;
|
|
Inc(P);
|
|
P^ := #0;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
InitExtDlg;
|
|
FillChar(OpenFileName, SizeOf(OpenFileName), 0);
|
|
OpenFilename.hInstance := hInstance;
|
|
with OpenFilename do
|
|
try
|
|
lStructSize := SizeOf(TOpenFilename);
|
|
nMaxFile := MAX_PATH;
|
|
GetMem(lpstrFile, MAX_PATH + 2);
|
|
FillChar(lpstrFile^, MAX_PATH + 2, 0);
|
|
lpstrFilter := AllocFilterStr(FFilter);
|
|
nFilterIndex := FFilterIndex;
|
|
lpstrTitle := PChar(FTitle);
|
|
Flags := OFN_ENABLEHOOK + OFN_EXPLORER + OFN_ENABLETEMPLATE + OFN_HIDEREADONLY;
|
|
lpfnHook := ExplorerHook;
|
|
lpTemplateName := 'ALIASDLGTEMPLATE';
|
|
hWndOwner := Application.Handle;
|
|
Result := TaskModalDialog(@GetOpenFileName, OpenFileName);
|
|
if Result then
|
|
begin
|
|
FFileName := lpstrFile;
|
|
FTableName := ExtractFileName(lpstrFile);
|
|
if FAliasName = FNullAlias then
|
|
FAliasName := ExtractFilePath(lpstrFile);
|
|
FFilterIndex := nFilterIndex;
|
|
end;
|
|
finally
|
|
if lpstrFile <> nil then FreeMem(lpstrFile, MAX_PATH + 2);
|
|
if lpstrFilter <> nil then StrDispose(lpstrFilter);
|
|
end;
|
|
DoneExtDlg;
|
|
end;
|
|
|
|
function TfrOpenDBDialog.GetAliasDirectory(a: String): String;
|
|
var
|
|
sl: TStringList;
|
|
begin
|
|
Result := '';
|
|
if a <> FNullAlias then
|
|
begin
|
|
sl := TStringList.Create;
|
|
{$IFDEF BDE}
|
|
Session.GetAliasParams(a, sl);
|
|
{$ENDIF}
|
|
Result := sl.Values['PATH'];
|
|
sl.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrOpenDBDialog.ComboBoxChange(Sender: TObject);
|
|
var
|
|
s: String;
|
|
begin
|
|
s := GetAliasDirectory(FComboBox.Items[FComboBox.ItemIndex]);
|
|
SendMessage(GetDlgItem(FDlghWnd, edt1), WM_SETTEXT, 0, Integer(@s[1]));
|
|
PostMessage(FDlghWnd, WM_KEYDOWN, vk_Return, 0);
|
|
end;
|
|
|
|
end.
|