[Delphi] Ustalanie pozycji dla InputBox - rozwiązanie

0

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.
0

dodaj to jako gotowiec. czemu miałbyś nie mieć możliwości dodania artykułu? sprawdziłbyś może...

0

Faktycznie mogłem dodać. Po prostu nie czytałem wcześniej, że procedura jest taka, iż należy podać
w przeglądarce jako adres http://4programmers.net/Gotowce/nieisnitjacy_tytul_artykulu i można dodać.
mam nadzieję że artykuł stworzony zgodnie z zasadami i wkrótce google doda go do swojej bazy :)
A oto link do artukułu wraz z kodem: InputBox oraz InputQuery - ustawianie pozycji na ekranie

1 użytkowników online, w tym zalogowanych: 0, gości: 1