Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Центрирование InputQuery диалога над формой

Delphi , Программа и Интерфейс , Диалоги и Фреймы

Центрирование InputQuery диалога над формой

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// I borrowed the code from InputQuery and 
// added the stuff to center the InputQuery 
// form on top of another form instead of 
// positioning it in the middle of the screen. 


// Dieser Code positioniert die Input Box in die 
// Mitte der Form und nicht in die Mitte des 
// Bildschirms. 

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 MyInputQuery(const ACaption, APrompt: string;
   var Value: string): Boolean; overload;
 const
     SMsgDlgOK = 'OK';
   SMsgDlgCancel = 'Cancel';
 var
   x, y, w, h: Integer;
   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);

       // center Horzontally 
      w := (Form1.Width - Form.Width) div 2;
       X := Form1.Left + W;
       if x < 0 then
         x := 0
       else if x + w > Screen.Width then x := Screen.Width - Form.Width;
       Form.Left := X;

       // center vertically 
      h := (Form1.Height - Form.Height) div 2;
       y := Form1.Top + h;
       if y < 0 then
         y := 0
       else if y + h > Screen.Height then y := Screen.Height - Form.Height;
        Form.Left := X;
       Form.Top  := Y;

       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     := SMsgDlgOK;
         ModalResult := mrOk;
         default     := True;
         SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
           ButtonHeight);
       end;
       with TButton.Create(Form) do
       begin
         Parent      := Form;
         Caption     := SMsgDlgCancel;
         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;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   str: string;
 begin
   if MyInputQuery('Question', 'Whats your name ?', str) then
     label1.Caption := str;
 end;

Приведенный код - это модифицированная версия диалогового окна InputQuery в Delphi, которое центрирует форму на верхушке другой формы (Form1) вместо позиционирования ее в середине экрана.

Детальное объяснение функций и частей кода:

  1. Функция GetAveCharSize рассчитывает средний размер символа для шрифта канваса. Это используется для преобразования диалоговых единиц в пиксели.
  2. Функция MyInputQuery создает экземпляр TForm, устанавливает его заголовок и клиентскую ширину/высоту на основе параметров ACaption и APrompt. Затем она центрирует форму горизонтально и вертикально внутри Form1 с помощью рассчитанного среднего размера символа.
  3. Внутри функции MyInputQuery создается TLabel для предупреждения, TEdit для ввода пользователя и два объекта TButton для кнопок OK и Cancel. Позиции этих контролов устанавливаются в диалоговых единицах на основе рассчитанного среднего размера символа.
  4. После создания всех контролов она отображает форму как модальное диалоговое окно с помощью ShowModal. Если пользователь нажимает OK, она устанавливает результат в True и присваивает текст из TEdit-контроля параметру Value. Наконец, она освобождает созданный для этого входа TForm-объект.
  5. В примере кода обработчик события Button1Click вызывает MyInputQuery с заголовком и предупреждением для получения ввода пользователя, который затем отображается в Label1.Caption, если пользователь нажимает OK.

Предложение альтернативного решения:

Вместо ручного расчета позиции формы на основе ширины и высоты экрана можно использовать метод Center, предоставляемый TForm. Этот метод центрирует форму внутри ее родителя (Form1).

Пример модифицированного кода:

procedure CenterForm(Form: TForm);
begin
  Form.Left := (Form.Parent.Width - Form.Width) div 2;
  Form.Top := (Form.Parent.Height - Form.Height) div 2;
end;

// ...

with Form do
try
  // ...
  Center; // Центрирует форму внутри ее родителя
finally
  Free;
end;

Таким образом, вам не нужно ручно рассчитывать позицию формы на основе ширины и высоты экрана.

В статье описывается способ центрирования диалога InputQuery над формой, а не в середине экрана, с помощью изменения координат и размеров формы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:27:42/0.0058739185333252/1