есть ли в Delphi что нибуть типа InputQuery с форматом? (маска Date) в "окошке"?

Alex Brown
Дата: 29.01.2014 14:42:06
есть ли в Delphi что нибуть типа InputQuery с форматом? (маска Date) в "окошке"?
wadman
Дата: 29.01.2014 14:53:23
Alex Brown, придется "программировать" такое окошко. Хотя, разве-ж рисование формы и 4-х контролов на ней - программирование?
x77
Дата: 29.01.2014 14:53:46
InputQuery - это чисто дельфийская функция, которая живет в Dialogs. я просто копировал ее в отдельный юнит и переделывал как мне надо (т.е. вместо создания edit-а создавал masked input-ы, комбобоксы, и пр.).

получится что-то типа такого:

+
uses
  Consts;

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 InputQueryDate(const ACaption, APrompt: string;
  var Value: TDateTime): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TDateTimePicker;
  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);
      Position := poScreenCenter;
      Prompt := TLabel.Create(Form);
      with Prompt do
      begin
        Parent := Form;
        Caption := APrompt;
        Left := MulDiv(8, DialogUnits.X, 4);
        Top := MulDiv(8, DialogUnits.Y, 8);
        Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
        WordWrap := True;
      end;
      {
      Edit := TEdit.Create(Form);
      with Edit do
      begin
        Parent := Form;
        Left := Prompt.Left;
        Top := Prompt.Top + Prompt.Height + 5;
        Width := MulDiv(164, DialogUnits.X, 4);
        MaxLength := 255;
        Text := Value;
        SelectAll;
      end;
      }
      Edit := TDateTimePicker.Create(Form);
      with Edit do
      begin
        Parent := Form;
        Left := Prompt.Left;
        Top := Prompt.Top + Prompt.Height + 5;
        Width := MulDiv(164, DialogUnits.X, 4);
        Date := Value;
      end;

      ButtonTop := Edit.Top + Edit.Height + 15;
      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), Edit.Top + Edit.Height + 15,
          ButtonWidth, ButtonHeight);
        Form.ClientHeight := Top + Height + 13;
      end;
      if ShowModal = mrOk then
      begin
        Value := Edit.Date;
        Result := True;
      end;
    finally
      Form.Free;
    end;
end;
Alex Brown
Дата: 29.01.2014 15:03:35
x77,

Super,
very much благодарен :)
andreymx
Дата: 29.01.2014 15:32:43
x77,

я тоже лет 10 или 12 назад напросал кучу подобных окошек в клоне dialogs'a

+
function max_InputPassword(
   const ACaption, APrompt: string;
   var Value              : string;
   var save               : boolean;
   Const intFontSize      : integer = -1;
   Const bMemo            : Boolean = false
                         ): Boolean;

function max_InputQuery(
   const ACaption, APrompt: string;
   var Value              : string;
   Const Security         : boolean = false;
   Const intFontSize      : integer = -1;
   Const bMemo            : Boolean = false;
   Const bCheckSave       : Boolean = false
                         ): Boolean;
function max_InputBox(
      const ACaption, APrompt, ADefault: string;
      Const Security : boolean = false;
      Const intFontSize
                     : integer = -1
                       )
                     : string;

function InputDBGrid(const ACaption, APrompt: string; Const aDBGrid: TDBGrid;
                     Const AWidth : integer = -1;
                     Const AHeight: integer = -1;
                     Const ALeft  : integer = -1;
                     Const ATop   : integer = -1;
                     Const intFontSize
                                  : integer = -1
                       ): Boolean;


function InputRadioGroup
                    (const ACaption, APrompt: string; Const aRadioGroup: TRadioGroup;
                     Const AWidth : integer = -1;
                     Const AHeight: integer = -1;
                     Const ALeft  : integer = -1;
                     Const ATop   : integer = -1;
                     Const intFontSize
                                  : integer = -1
                       ): Boolean;

function InputListBox
                    (const ACaption, APrompt: string; Const aListBox: TListBox;
                     Const AWidth : integer = -1;
                     Const AHeight: integer = -1;
                     Const ALeft  : integer = -1;
                     Const ATop   : integer = -1;
                     Const intFontSize
                                  : integer = -1
                       ): Boolean;
какими-то даже пользовался активно
Alex Brown
Дата: 29.01.2014 15:37:18
опробовал.. супер функция
интеллект и помощь na sql.ru часто бесценна.. за исключением некоторых "навороченных" помощников иногда пролазящих со своими "супер" советами
Glays
Дата: 29.01.2014 15:42:03
wadman
Alex Brown, придется "программировать" такое окошко. Хотя, разве-ж рисование формы и 4-х контролов на ней - программирование?

Ещё хуже, нужно просто добавить Password Dialog и поменять эдит и текст окна.
wadman
Дата: 29.01.2014 15:53:31
Alex Brown
интеллект и помощь na sql.ru часто бесценна.. за исключением некоторых "навороченных" помощников иногда пролазящих со своими "супер" советами

Ты почти час убил на выпрашивание и тестирование функции, когда нарисовать окно и в нем несколько контролов - дело от силы пяти минут.
Glays
Дата: 29.01.2014 15:58:21
wadman, зато узнал много нового. Надеюсь.