402 lines
14 KiB
ObjectPascal
402 lines
14 KiB
ObjectPascal
unit ANBInputBox;
|
|
{$MODE Delphi}
|
|
{$codepage UTF8}
|
|
interface
|
|
uses LCLIntf, LCLType, SysUtils, Graphics, Controls, Forms, StdCtrls, Classes, Types, MaskEdit, Spin, VCLEx;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; var isAccept: Boolean): String; OVERLOAD; STDCALL;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; const ABtnCaptions: array of String; var isAccept: Boolean): String; OVERLOAD; STDCALL;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; const ABtnCaptions: array of String; const AMaxLength: IntEx; var isAccept: Boolean): String; OVERLOAD; STDCALL;
|
|
function ShowPasswordInputBox (const ACaption, APrompt, ADefault, APassword: String; var isAccept, isPasswordConfirmed: Boolean; const APasswordChar: Char = '*'): String; OVERLOAD; STDCALL;
|
|
function ShowPasswordInputBox (const ACaption, APrompt, ADefault, APassword: String; var isAccept, isPasswordConfirmed: Boolean; const ABtnCaptions: array of String; const APasswordChar: Char = '*'): String; OVERLOAD; STDCALL;
|
|
function ShowComboBox (const ACaption, APrompt: String; var Items: TStringList; const ADefaultIndex: IntEx; var isAccept: Boolean): IntEx; OVERLOAD; STDCALL;
|
|
function ShowComboBox (const ACaption, APrompt: String; var Items: TStringList; const ADefaultIndex: IntEx; const ABtnsCaption: array of String; var isAccept: Boolean): IntEx; OVERLOAD; STDCALL;
|
|
function ShowMaskedBox (const ACaption, APrompt, AMask, ADefault: String; const isIgnoreMask: Boolean; var isAccept: Boolean): String; OVERLOAD; STDCALL;
|
|
function ShowMaskedBox (const ACaption, APrompt, AMask, ADefault: String; const isIgnoreMask: Boolean; const ABtnCaptions: array of String; const AMaxLength: IntEx; var isAccept: Boolean): String; OVERLOAD; STDCALL;
|
|
function ShowSpinedBox (const ACaption, APrompt: String; const ADefault: IntEx; var isAccept: Boolean): IntEx; STDCALL; OVERLOAD;
|
|
function ShowSpinedBox (const ACaption, APrompt: String; const ADefault, AMinValue, AMaxValue: IntEx; const ABtnCaptions: array of String; var isAccept: Boolean): IntEx; STDCALL; OVERLOAD;
|
|
const OkBtnDefCaption: String = '&Ok';
|
|
CancelBtnDefCaption: String = 'C&ancel';
|
|
implementation
|
|
function MyGetAveCharSize(Canvas: TCanvas): TPoint;
|
|
var I: IntEx;
|
|
Buffer: array[0..51] of Char;
|
|
begin
|
|
with Result do
|
|
begin
|
|
x:= 0;
|
|
y:= 0;
|
|
end;
|
|
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; var APasswordConfirmed: Boolean; const APassword: Boolean; const ANeedPassword: String; const APasswordChar: Char; const AMaxLength: IntEx; const ABtnsCaption: array of String): Boolean;
|
|
var Form: TForm;
|
|
Prompt: TLabel;
|
|
Edit: TEdit;
|
|
DialogUnits: TPoint;
|
|
ButtonTop, ButtonWidth, ButtonHeight: IntEx;
|
|
begin
|
|
Result:= false;
|
|
Form:= TForm.Create(Application);
|
|
with Form do
|
|
try
|
|
Canvas.Font:= Font;
|
|
DialogUnits:= MyGetAveCharSize(Canvas);
|
|
BorderStyle:= bsDialog;
|
|
Caption:= ACaption;
|
|
ClientWidth:= MulDiv(180, DialogUnits.X, 4);
|
|
Position:= poScreenCenter;
|
|
Color:= clBtnFace;
|
|
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:= AMaxLength;
|
|
if APassword then
|
|
PasswordChar:= APasswordChar;
|
|
Text:= Value;
|
|
SelectAll;
|
|
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:= ABtnsCaption[0];
|
|
ModalResult:= mrOk;
|
|
Cursor:= crHandPoint;
|
|
Default:= True;
|
|
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight);
|
|
end;
|
|
with TButton.Create(Form) do
|
|
begin
|
|
Parent:= Form;
|
|
Caption:= ABtnsCaption[1];
|
|
ModalResult:= mrCancel;
|
|
Cursor:= crHandPoint;
|
|
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.Text;
|
|
if APassword then
|
|
if Value = ANeedPassword then
|
|
APasswordConfirmed:= true
|
|
else
|
|
APasswordConfirmed:= false;
|
|
Result:= True;
|
|
end;
|
|
finally
|
|
Form.Free;
|
|
end;
|
|
end;
|
|
function MyInputComboQuery(const ACaption, APrompt: String; const Values: TStringList; const DefIndex: IntEx; var SelectedIndex: IntEx; const ABtnsCaption: array of String): Boolean;
|
|
var Form: TForm;
|
|
Prompt: TLabel;
|
|
Combo: TComboBox;
|
|
DialogUnits: TPoint;
|
|
ButtonTop, ButtonWidth, ButtonHeight: IntEx;
|
|
begin
|
|
Result:= false;
|
|
Form:= TForm.Create(Application);
|
|
with Form do
|
|
try
|
|
Canvas.Font:= Font;
|
|
DialogUnits:= MyGetAveCharSize(Canvas);
|
|
BorderStyle:= bsDialog;
|
|
Caption:= ACaption;
|
|
ClientWidth:= MulDiv(180, DialogUnits.X, 4);
|
|
Position:= poScreenCenter;
|
|
Color:= clBtnFace;
|
|
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;
|
|
Combo:= TComboBox.Create(Form);
|
|
with Combo do
|
|
begin
|
|
Parent:= Form;
|
|
Left:= Prompt.Left;
|
|
Top:= Prompt.Top + Prompt.Height + 5;
|
|
Width:= MulDiv(164, DialogUnits.X, 4);
|
|
Style:= csDropDownList;
|
|
Items.Assign(Values);
|
|
if DefIndex <= Items.Count - 1 then
|
|
ItemIndex:= DefIndex
|
|
else
|
|
ItemIndex:= -1;
|
|
end;
|
|
ButtonTop:= Combo.Top + Combo.Height + 15;
|
|
ButtonWidth:= MulDiv(50, DialogUnits.X, 4);
|
|
ButtonHeight:= MulDiv(14, DialogUnits.Y, 8);
|
|
with TButton.Create(Form) do
|
|
begin
|
|
Parent:= Form;
|
|
Caption:= ABtnsCaption[0];
|
|
ModalResult:= mrOk;
|
|
Cursor:= crHandPoint;
|
|
Default:= True;
|
|
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight);
|
|
end;
|
|
with TButton.Create(Form) do
|
|
begin
|
|
Parent:= Form;
|
|
Caption:= ABtnsCaption[1];
|
|
ModalResult:= mrCancel;
|
|
Cursor:= crHandPoint;
|
|
Cancel:= True;
|
|
SetBounds(MulDiv(92, DialogUnits.X, 4), Combo.Top + Combo.Height + 15, ButtonWidth, ButtonHeight);
|
|
Form.ClientHeight:= Top + Height + 13;
|
|
end;
|
|
if ShowModal = mrOk then
|
|
begin
|
|
SelectedIndex:= Combo.ItemIndex;
|
|
Result:= True;
|
|
end;
|
|
finally
|
|
Form.Free;
|
|
end;
|
|
end;
|
|
function MyInputMaskQuery(const ACaption, APrompt, AMask: String; var Value: String; const isIgnoreMask: Boolean; const AMaxLength: IntEx; const ABtnsCaption: array of String): Boolean;
|
|
var Form: TForm;
|
|
Prompt: TLabel;
|
|
Edit: TMaskEdit;
|
|
DialogUnits: TPoint;
|
|
ButtonTop, ButtonWidth, ButtonHeight: IntEx;
|
|
begin
|
|
Result:= false;
|
|
Form:= TForm.Create(Application);
|
|
with Form do
|
|
try
|
|
Canvas.Font:= Font;
|
|
DialogUnits:= MyGetAveCharSize(Canvas);
|
|
BorderStyle:= bsDialog;
|
|
Caption:= ACaption;
|
|
ClientWidth:= MulDiv(180, DialogUnits.X, 4);
|
|
Position:= poScreenCenter;
|
|
Color:= clBtnFace;
|
|
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:= TMaskEdit.Create(Form);
|
|
with Edit do
|
|
begin
|
|
Parent:= Form;
|
|
Left:= Prompt.Left;
|
|
Top:= Prompt.Top + Prompt.Height + 5;
|
|
Width:= MulDiv(164, DialogUnits.X, 4);
|
|
MaxLength:= AMaxLength;
|
|
EditMask:= AMask;
|
|
if isIgnoreMask then
|
|
Text:= Value
|
|
else
|
|
EditText:= Value;
|
|
ValidateEdit;
|
|
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:= ABtnsCaption[0];
|
|
ModalResult:= mrOk;
|
|
Cursor:= crHandPoint;
|
|
Default:= True;
|
|
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight);
|
|
end;
|
|
with TButton.Create(Form) do
|
|
begin
|
|
Parent:= Form;
|
|
Caption:= ABtnsCaption[1];
|
|
ModalResult:= mrCancel;
|
|
Cursor:= crHandPoint;
|
|
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
|
|
if isIgnoreMask then
|
|
Value:= Edit.Text
|
|
else
|
|
Value:= Edit.EditText;
|
|
Result:= True;
|
|
end;
|
|
finally
|
|
Form.Free;
|
|
end;
|
|
end;
|
|
function MyInputSpinQuery(const ACaption, APrompt: String; var _Value: IntEx; const AMinValue, AMaxValue: IntEx; const ABtnsCaption: array of String): Boolean;
|
|
var Form: TForm;
|
|
Prompt: TLabel;
|
|
Edit: TSpinEdit;
|
|
DialogUnits: TPoint;
|
|
ButtonTop, ButtonWidth, ButtonHeight: IntEx;
|
|
begin
|
|
Result:= False;
|
|
Form:= TForm.Create(Application);
|
|
with Form do
|
|
try
|
|
Canvas.Font:= Font;
|
|
DialogUnits:= MyGetAveCharSize(Canvas);
|
|
BorderStyle:= bsDialog;
|
|
Caption:= ACaption;
|
|
ClientWidth:= MulDiv(180, DialogUnits.X, 4);
|
|
Position:= poScreenCenter;
|
|
Color:= clBtnFace;
|
|
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:= TSpinEdit.Create(Form);
|
|
with Edit do
|
|
begin
|
|
Parent:= Form;
|
|
Left:= Prompt.Left;
|
|
Top:= Prompt.Top + Prompt.Height + 5;
|
|
Width:= MulDiv(164, DialogUnits.X, 4);
|
|
MinValue:= Integer(AMinValue);
|
|
MaxValue:= Integer(AMaxValue);
|
|
if _Value < AMinValue then
|
|
Value:= AMinValue
|
|
else
|
|
if _Value > AMaxValue then
|
|
Value:= AMaxValue
|
|
else
|
|
Value:= _Value;
|
|
SelectAll;
|
|
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:= ABtnsCaption[0];
|
|
ModalResult:= mrOk;
|
|
Cursor:= crHandPoint;
|
|
Default:= True;
|
|
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight);
|
|
end;
|
|
with TButton.Create(Form) do
|
|
begin
|
|
Parent:= Form;
|
|
Caption:= ABtnsCaption[1];
|
|
ModalResult:= mrCancel;
|
|
Cursor:= crHandPoint;
|
|
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.Value;
|
|
Result:= True;
|
|
end;
|
|
finally
|
|
Form.Free;
|
|
end;
|
|
end;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; var isAccept: Boolean): String;
|
|
var Pasw: boolean;
|
|
begin
|
|
Result:= ADefault;
|
|
Pasw:= False;
|
|
isAccept:= MyInputQuery(ACaption, APrompt, Result, Pasw, False, '', '*', 0, [OkBtnDefCaption, CancelBtnDefCaption]);
|
|
end;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; const ABtnCaptions: array of String; var isAccept: Boolean): String;
|
|
var Pasw: boolean;
|
|
begin
|
|
Result:= ADefault;
|
|
Pasw:= False;
|
|
isAccept:= MyInputQuery(ACaption, APrompt, Result, Pasw, False, '', '*', 0, ABtnCaptions);
|
|
end;
|
|
function ShowInputBox (const ACaption, APrompt, ADefault: String; const ABtnCaptions: array of String; const AMaxLength: IntEx; var isAccept: Boolean): String;
|
|
var Pasw: boolean;
|
|
begin
|
|
Result:= ADefault;
|
|
Pasw:= False;
|
|
isAccept:= MyInputQuery(ACaption, APrompt, Result, Pasw, false, '', '*', AMaxLength, ABtnCaptions);
|
|
end;
|
|
function ShowPasswordInputBox (const ACaption, APrompt, ADefault, APassword: String; var isAccept, isPasswordConfirmed: Boolean; const APasswordChar: Char = '*'): String;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputQuery(ACaption, APrompt, Result, isPasswordConfirmed, True, APassword, APasswordChar, 0, [OkBtnDefCaption, CancelBtnDefCaption]);
|
|
end;
|
|
function ShowPasswordInputBox (const ACaption, APrompt, ADefault, APassword: String; var isAccept, isPasswordConfirmed: Boolean; const ABtnCaptions: array of String; const APasswordChar: Char = '*'): String;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputQuery(ACaption, APrompt, Result, isPasswordConfirmed, True, APassword, APasswordChar, 0, ABtnCaptions);
|
|
end;
|
|
function ShowComboBox (const ACaption, APrompt: string; var Items: TStringList; const ADefaultIndex: IntEx; var isAccept: boolean): IntEx;
|
|
begin
|
|
Result:= ADefaultIndex;
|
|
isAccept:= MyInputComboQuery(ACaption, APrompt, Items, Result, Result, [OkBtnDefCaption, CancelBtnDefCaption]);
|
|
end;
|
|
function ShowComboBox (const ACaption, APrompt: String; var Items: TStringList; const ADefaultIndex: IntEx; const ABtnsCaption: array of String; var isAccept: Boolean): IntEx;
|
|
begin
|
|
Result:= ADefaultIndex;
|
|
isAccept:= MyInputComboQuery(ACaption, APrompt, Items, Result, Result, ABtnsCaption);
|
|
end;
|
|
function ShowMaskedBox (const ACaption, APrompt, AMask, ADefault: String; const isIgnoreMask: Boolean; var isAccept: Boolean): String;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputMaskQuery(ACaption, APrompt, AMask, Result, isIgnoreMask, 0, [OkBtnDefCaption, CancelBtnDefCaption]);
|
|
end;
|
|
function ShowMaskedBox (const ACaption, APrompt, AMask, ADefault: String; const isIgnoreMask: Boolean; const ABtnCaptions: array of String; const AMaxLength: IntEx; var isAccept: Boolean): String;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputMaskQuery(ACaption, APrompt, AMask, Result, isIgnoreMask, AMaxLength, ABtnCaptions);
|
|
end;
|
|
function ShowSpinedBox (const ACaption, APrompt: String; const ADefault: IntEx; var isAccept: Boolean): IntEx;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputSpinQuery(ACaption, APrompt, Result, 0, 100, [OkBtnDefCaption, CancelBtnDefCaption]);
|
|
end;
|
|
function ShowSpinedBox (const ACaption, APrompt: String; const ADefault, AMinValue, AMaxValue: IntEx; const ABtnCaptions: array of String; var isAccept: Boolean): IntEx;
|
|
begin
|
|
Result:= ADefault;
|
|
isAccept:= MyInputSpinQuery(ACaption, APrompt, Result, AMinValue, AMaxValue, ABtnCaptions);
|
|
end;
|
|
end.
|