Witam. Ostatnio pytał o to użytkownik Rady, chodzi o sposób na wyśrodkowanie okienek typu InputBox
oraz InputQuery. Poniższy moduł umożliwia to ustawiając dane okienko w miejscu podane przez dwa
ostatnire parametry w funkcjach InputBoxPos oraz InpuQueryPos. Pierwszy z nich to pozycja od lewej
nasotmiast drugi to pozycja od góry. Jeżeli jedna z wartości będzie poniżej zera - to okienko zostanie
wyświetlone tak jak standardowo na środku ekranu. Mam nadzieję, że komuś się przyda. Dodał bym
może artykuł taki, ale nie wiem czy jest sens, poza tym chyba nie mam takiej możliwości o ile pamiętam.
{*********************************************************************
Ten modul to przerobiony dialogs.pas ze xrodel dolaczonych do Delphi 3
Zmieniono deklaracje i definicje funkcji... Funkcje InputQueryPos oraz
InputBoxPos nalezy wywolac z dwoma dodaktowymi parametrami: Left_Pos i
Top_Pos, ktore ustalaja pozycje okienka od lewej i od gory. Jesli obie
wartosci lub jedna z nich jest ponizej zera - okno ukaze sie na srodku
ekranu czyli tak jak standardowe okienka typu InputBox i InputQuery...
Natomiast stale OKBtn_Caption i CancelBtn_Caption - zawietaja etykiety
dla przyciskow: Ok (po lewej w oknie) oraz Anuluj (po prawej w oknie).
*********************************************************************}
unit IB_Pos;
{$R-}
interface
uses
Windows, CommDlg, Graphics, Controls, Forms, StdCtrls;
const
OKBtn_Caption = 'OK';
CancelBtn_Caption = 'Anuluj';
function GetAveCharSize(Canvas: TCanvas): TPoint;
function InputBoxPos(const ACaption, APrompt, ADefault: string;
Left_Pos, Top_Pos : integer): string;
function InputQueryPos(const ACaption, APrompt: string;
var Value: string; Left_Pos, Top_Pos : integer): Boolean;
implementation
function GetAveCharSize(Canvas: TCanvas): TPoint;
var
I: Integer;
Buffer: array[0..51] of Char;
begin
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
Result.X := Result.X div 52;
end;
function InputQueryPos(const ACaption, APrompt: string;
var Value: string; Left_Pos, Top_Pos : integer): Boolean;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
Result := False;
Form := TForm.Create(Application);
with Form do
try
Canvas.Font := Font;
DialogUnits := GetAveCharSize(Canvas);
BorderStyle := bsDialog;
Caption := ACaption;
ClientWidth := MulDiv(180, DialogUnits.X, 4);
ClientHeight := MulDiv(63, DialogUnits.Y, 8);
if (Left_Pos < 0) or (Top_Pos < 0) then
begin
Position := poScreenCenter;
end
else
begin
Left := Left_Pos;
Top := Top_Pos;
end;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
AutoSize := True;
Left := MulDiv(8, DialogUnits.X, 4);
Top := MulDiv(8, DialogUnits.Y, 8);
Caption := APrompt;
end;
Edit := TEdit.Create(Form);
with Edit do
begin
Parent := Form;
Left := Prompt.Left;
Top := MulDiv(19, DialogUnits.Y, 8);
Width := MulDiv(164, DialogUnits.X, 4);
MaxLength := 255;
Text := Value;
SelectAll;
end;
ButtonTop := MulDiv(41, DialogUnits.Y, 8);
ButtonWidth := MulDiv(50, DialogUnits.X, 4);
ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
with TButton.Create(Form) do
begin
Parent := Form;
Caption := OKBtn_Caption;
ModalResult := mrOk;
Default := True;
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
with TButton.Create(Form) do
begin
Parent := Form;
Caption := CancelBtn_Caption;
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(92, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
if ShowModal = mrOk then
begin
Value := Edit.Text;
Result := True;
end;
finally
Form.Free;
end;
end;
function InputBoxPos(const ACaption, APrompt, ADefault: string;
Left_Pos, Top_Pos : integer): string;
begin
Result := ADefault;
InputQueryPos(ACaption, APrompt, Result, Left_Pos, Top_Pos);
end;
end.