3

I am programming a program where you have to enter a password into a InputBox to gain access to the programs min features . But I have a problem if you click on cancel on the inputbox my program gives a error message . So i wanted to know if any one know how I can get that right because with the Messagedlg I know you use IF . But how can I get it right with a InputBox ?

Arioch 'The
  • 15,799
  • 35
  • 62
0x436f72647265
  • 414
  • 2
  • 8
  • 21

2 Answers2

11

InputBox() returns a blank string if the dialog is canceled, eg:

var
  Pass: String;

Pass := InputBox('Password needed', 'Enter the password:');
if Pass <> '' then
begin
  // use Pass as needed...
end;

Alternatively, use InputQuery() instead, which returns a Boolean to indicate whether the dialog was canceled or not, eg:

var
  Pass: String;

if InputQuery('Password needed', 'Enter the password:', Pass) then
begin
  // use Pass as needed...
end;
Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
  • @Remy_Lebeau Thanks for the help I will go and try that. I have 1 more question do you maby know how to make a Input Box masked ?? I know what to change but do I need to write a knew InputBox Function?? – 0x436f72647265 May 30 '13 at 08:12
  • @CordreSmith about masking te input box http://stackoverflow.com/q/591333/1699210 – bummi May 30 '13 at 08:17
  • Passing #31+'Enter the password' as the 2nd parameter to InputQuery causes the TEdit in the box to echo the password character instead of the entered text. – Freddie bell Jan 14 '14 at 19:01
  • @Freddiebell: Any value below `#32` will cause the `TEdit.PasswordChar` to be set to `'*'`. However, that feature was introduced in XE2, so it does not exist in D7. – Remy Lebeau Jan 14 '14 at 20:03
0

Many times it is better to have a custom InputQuery

function InputValor(const aCaption: String; APrompt: string; var aValor: 
String): Boolean;
var
    vForm  : TForm;
    vLabel : TLabel;
    vBtnOk : TBitBtn;
    vValor : TEdit;
    vBtnCancel : TBitBtn;
begin
    Result  := False;
    vForm   := TForm.Create(Application);
    vLabel  := TLabel.Create(vForm);
    vValor  := TEdit.Create(vForm);
    vBtnOk  := TBitBtn.Create(vForm);
    vBtnCancel := TBitBtn.Create(vForm);

    with vForm do
    begin
        Name           := 'frmValor';
        Position       := poScreenCenter;
        BorderIcons    := [biSystemMenu];
        BorderStyle    := bsDialog;
        Caption        := aCaption;
        ClientHeight   := 150;
        ClientWidth    := 515;
        Color          := clBtnFace;
        OldCreateOrder := False;
        Font.Charset   := DEFAULT_CHARSET;
        Font.Color     := clWindowText;
        Font.Height    := -11;
        Font.Name      := 'Tahoma';
        Font.Style     := [];
        OldCreateOrder := False;
        PixelsPerInch  := 96;
        Left           := 0;
        Top            := 0;
    end;

    with vLabel do
    begin
        Name     := 'vLabel';
        Parent   := vForm;
        AutoSize := False;
        Left     := 18;
        Top      := 15;
        Width    := 484;
        Height   := 41;
        Caption  := APrompt;
        WordWrap := True;
    end;

    with vValor do
    begin
        Name      := 'vValorEdit';
        Parent    := vForm;
        Left      := 18;
        Top       := 62;
        Width     := 484;
        Height    := 21;
        Text      := '';
    end;

    with vBtnOk do
    begin
        Name        := 'vBtnOk';
        Parent      := vForm;
        Caption     := 'Aceptar';
        Left        := 335;
        Top         := 103;
        Width       := 75;
        Height      := 25;
        TabOrder    := 1;
        ModalResult := mrOk;
    end;

    with vBtnCancel do
    begin
        Name        := 'vBtnCancel';
        Parent      := vForm;
        Caption     := 'Cancelar';
        Left        := 427;
        Top         := 103;
        Width       := 75;
        Height      := 25;
        TabOrder    := 2;
        ModalResult := mrCancel;
    end;

    vForm.ShowModal;

    if (vForm.ModalResult = mrOk) and (vValor.Text <> '') then
    begin
        Result := True;
        aValor := vValor.Text;
    end else
    begin
        Result := False;
        aValor := '';
    end;

    FreeAndNil(vForm);
end;

Use in the same way as the Official:

var
    vTest : String;
begin
    if (InputValor('Title', 'Label text', vTest) = True) then
        ShowMessage(vTest);
end;