Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   InputBox e InputQuery (https://www.clubdelphi.com/foros/showthread.php?t=83142)

olbeup 16-05-2013 10:16:49

InputBox e InputQuery
 
Hace tiempo que no creo ningún hilo, pero estas funciones InputBox y InputQuery, por que no se han renovado o ampliado como lo han hecho Delphi.

Me explico, InputBox o InputQuery son funciones que devuelve el texto escrito, pero si ese texto que escribes es una contraseña, por que no se puede pasar un parámetro a estas funciones que muestre un asterisco (*) mientras escribes.

He modificado el Dialogs.pas de Delphi y me ha quedado asi:

InputBox:
Código Delphi [-]
function InputBox(const ACaption, APrompt, ADefault: string; const APassChar: Char = #0): string;
...

function InputBox(const ACaption, APrompt, ADefault: string; const APassChar: Char = #0): string;
begin
  Result := ADefault;
  InputQuery(ACaption, APrompt, Result, APassChar);
end;
InputQuery:
Código Delphi [-]
function InputQuery(const ACaption, APrompt: string; var Value: string; APassChar: Char = #0): Boolean;
...

function InputQuery(const ACaption, APrompt: string; Value: string; const APassChar: Char = #0): 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);
      Position := poScreenCenter;

      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;
        PasswordChar := APassChar;
        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;

Me funciona muy bien, siempre hay un pero, cuando quiero recompilar todo el proyecto lo que hago primero, es borrar todos los .dcu y el Dialogs.pas vuelve a su estado natural como estaba antes, lo que me lleva a copiar el Dialogs.pas modificado dentro del proyecto y volver a recompilar, la pregunta es ¿cómo puedo recompilar Dialogs.pas y que no tenga que copiarlo en donde esta el proyecto?.

Un saludo.

ozsWizzard 16-05-2013 13:15:52

Dos cosillas...

1ª Habiendo una forma fácil de hacer lo de los asterisco, yo no cambiaría los ".pas" de Delphi.

La forma de hacer lo de los asteriscos es esta:

Crear este procedimiento
Código Delphi [-]
procedure InputBoxSetPasswordChar(var Msg: TMessage);
var
  hInputForm, hEdit, hButton: HWND;
begin
  hInputForm := Screen.Forms[0].Handle;
  if (hInputForm <> 0) then
  begin
    hEdit := FindWindowEx(hInputForm, 0, 'TEdit', nil);
    {
      // Change button text:
      hButton := FindWindowEx(hInputForm, 0, 'TButton', nil);
      SendMessage(hButton, WM_SETTEXT, 0, Integer(PChar('Cancel')));
    }
    SendMessage(hEdit, EM_SETPASSWORDCHAR, Ord('*'), 0);
  end;
end;

Y justo antes de la llamada al InputQuery, por ejemplo, poner esta instrucción
Código Delphi [-]
   PostMessage(Handle, InputBoxMessage, 0, 0);



Si aún así prefieres la modificación, una vez hayas hecho copia de seguridad de los ".pas" originales y sus correspondientes dcu, deberías borrar las dcu de delphi. Su ubicación depende de la instalación y el IDE que tengas. En mi caso, para que te hagas una idea, la ruta es esta

"C:\Program Files\Embarcadero\RAD Studio\9.0\lib\win32\debug"

Saludos

Casimiro Notevi 16-05-2013 13:29:52

Cita:

Empezado por olbeup (Mensaje 460537)
He modificado el Dialogs.pas de Delphi y me ha quedado asi:

Desde aquí escucho las sirenas de peligro :eek:

Cita:

Empezado por ozsWizzard (Mensaje 460543)
1ª Habiendo una forma fácil de hacer lo de los asterisco, yo no cambiaría los ".pas" de Delphi.

^\||/^\||/^\||/

nlsgarcia 17-05-2013 01:34:48

olbeup,

Cita:

Empezado por olbeup
...InputBox o InputQuery...muestre un asterisco (*) mientras escribes...

Revisa este link:
Cita:

Show password characters in a InputBox : http://www.swissdelphicenter.ch/torr...de.php?id=1208
Una sugerencia: Nunca modifiques las unidades de Delphi, bajo ningún concepto.

Espero sea útil :)

Nelson.

ecfisa 17-05-2013 01:48:42

Hola olbeup.

Yo coincido con lo que te han sugerido los compañeros. Aún suponiendo que todo resulte bién, depender de una unidad o componente para lograr cierta funcionalidad, es preferible que depender de un Delphi "a medida" para hacerlo.

Claro que eso no implica que no puedas hacerlo para experimentar, siempre tomando los recaudos necesarios...

Saludos. :)

olbeup 17-05-2013 09:16:36

Cita:

Empezado por ozsWizzard (Mensaje 460543)
Habiendo una forma fácil de hacer lo de los asterisco, yo no cambiaría los ".pas" de Delphi.

Así lo are, no cambiar las fuentes de delphi y gracias por la aportación ^\||/

Cita:

Empezado por Casimiro Notevi (Mensaje 460544)
Desde aquí escucho las sirenas de peligro :eek:

Ya las oí yo cuando empece a poner la primera letra :o

Cita:

Empezado por nlsgarcia (Mensaje 460586)
Nunca modifiques las unidades de Delphi, bajo ningún concepto

Oido cocina y gracias por el link ^\||/

Cita:

Empezado por ecfisa (Mensaje 460589)
Hola olbeup.

Yo coincido con lo que te han sugerido los compañeros. Aún suponiendo que todo resulte bién, depender de una unidad o componente para lograr cierta funcionalidad, es preferible que depender de un Delphi "a medida" para hacerlo.

Claro que eso no implica que no puedas hacerlo para experimentar, siempre tomando los recaudos necesarios...

Saludos. :)

Sabias palabras #:-)#


La verdad no me siento muy cómodo modificando las fuentes de Delphi, lo que are en su defecto es crear otras funciones maqueadas que realicen el mismo cometido, sin modificar un sólo punto de Delphi.

Gracias a todos por su recomendaciones y aportaciones :D:D:D

Un saludo.


La franja horaria es GMT +2. Ahora son las 13:07:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi