Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Mostrar y ocultar texto de un TEdit creado en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=85838)

wilcg 14-05-2014 06:16:57

Mostrar y ocultar texto de un TEdit creado en tiempo de ejecución
 
hola amigos del foro de nuevo buscando ayuda,

El problema es el siguiente, tengo TEdit creados en tiempo de ejecución y algunos ocultan el texto están configurados para ocultar el texto por medio del PasswordChar del Edit y conectados a un TPopupMenu hasta ahy todo bien. Lo que quiero es Mostrar y ocultar el texto del edit desde el TPopupMenu, Mas claro si esta oculto lo muestro y viciversa, pero solo quiero que sea con el TEdit seleccionado.
Haber si alguien me da una ayudita.

ecfisa 14-05-2014 09:27:01

Hola wilcg.

Ejemplo:
Código Delphi [-]
...
implementation

var
  EditCount: Integer = 1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize; // a fines del ejemplo
end;

// Crear un Edit
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TEdit.Create(Self) do
  begin
    Name:= 'MiEdit'+IntToStr(EditCount);
    Parent:= Self;
    PasswordChar:= '*'; // oculta por defecto
    PopupMenu:= PopupMenu1;
    Width:= 100;
    Height:= 21;
    Left:= Random(Self.ClientWidth-100)+5;
    Top := Random(Self.ClientHeight-21)+5;
    //...
    Inc(EditCount);
  end;
end;

// Adecuar el texto a la acción
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  if (PopupMenu1.PopupComponent as TEdit).PasswordChar = #0 then
    miShowHidePwd.Caption:= 'Ocultar contraseña'
  else
    miShowHidePwd.Caption:= 'Mostrar contraseña';
end;

// TMenuItem del TPopupMenu (ocultar/mostrar)
procedure TForm1.miShowHidePwdClick(Sender: TObject);
const
  PWDCHAR: array[Boolean] of Char = (#0, '*');
var
  E: TEdit;
begin
  E:= FindComponent(PopupMenu1.PopupComponent.Name) as TEdit;
  if Assigned(E) then
    E.PasswordChar:= PWDCHAR[E.PasswordChar = #0]
end;

Saludos :)

wilcg 14-05-2014 19:17:20

Gracias ecfisa por contestar,

he realizado pruebas con tu código, y no va parece que falta agregarle algo para que quede bien.

creo que aquí no toma el edit indicado

Código Delphi [-]
procedure TForm1.miShowHidePwdClick(Sender: TObject);
const
  PWDCHAR: array[Boolean] of Char = (#0, '*');
var
  E: TEdit;
begin
  E:= FindComponent(PopupMenu1.PopupComponent.Name) as TEdit;
  if Assigned(E) then
    E.PasswordChar:= PWDCHAR[E.PasswordChar = #0]
end;

creo que en esta parte esta faltando algo, se indicaría el TEdit que queremos que haga la acción.
Código Delphi [-]
  E:= FindComponent(PopupMenu1.PopupComponent.Name) as TEdit;

aver si me ayudas ^\||/

ecfisa 14-05-2014 19:56:21

Hola wilc.
Cita:

he realizado pruebas con tu código, y no va parece que falta agregarle algo para que quede bien.
Antes de publicarlo, el código fué probado en Delphi 7 bajo Windows 8.1 y funciona perfectamente sin necesidad de agregado alguno.

O hubo alguna omisión en el copiado/pegado o mas probablemente no hayas asignado valor a la propiedad Name en la creación de los TEdit, lo que justificaría que la función FindComponent no encontrara el componente. Sería muy interesante ver la adaptación que has echo del ejemplo.

Para que puedas comparar y corregir el/los errores con tranquilidad te adjunto los archivos fuentes + el ejecutable.

Saludos :)

wilcg 15-05-2014 00:37:53

Tienes razón ecfisa, creo que el problema viene por como creo el TEdit, porque he hecho pruebas tal como tu código y funciona perfecto.

La forma como creo los TEdit es desde un archivo XML previamente guardado todos la información de cada TEdit.
aquí el código

Código Delphi [-]
var
  XML : TXMLDocument;
  NComponente : IXMLNode;
  l: Integer;
  Edit: TEdit;
begin
   XML := TXMLDocument.Create(Application);
   try
      XML.Active := True;

      XML.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Plantillas\00001.xml');

      for l := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
      begin

        // ¿Es una Edit?
        if XML.DocumentElement.ChildNodes[l].NodeName = 'Edit' then
        begin
          NComponente := XML.DocumentElement.ChildNodes[l];
          Edit := TEdit.Create(Scroll1);
          Edit.Parent := Scroll1;
          Edit.Name := NComponente.Attributes['Nombre'];
          Edit.Tag := NComponente.Attributes['ID'];
          Edit.Left := NComponente.Attributes['x'];
          Edit.Top := NComponente.Attributes['y'];
          Edit.Width := NComponente.Attributes['Ancho'];
          Edit.Height := NComponente.Attributes['Alto'];
          Edit.Font.Color := NComponente.Attributes['Color'];
          if NComponente.Attributes['Tipo'] = '*' then
          begin
            Edit.PasswordChar := '*';
            Edit.PopupMenu:= PopupMenu1;
          end;
        end;

      XML.Active := False;
   finally
      XML := nil;
   end;
   end;


esta es la forma como se crean los edit, creo que ahí esta el error.

ecfisa 15-05-2014 23:38:19

Hola wilcg.

Lo que podría estar provocando problemas es que el valor asignado a propiedad Name del control recién creado, bién podría estar vacío o ser inexistente:

Código Delphi [-]
 Edit.Name := NComponente.Attributes['Nombre'];
Nada asegura que exista 'Nombre', o que de existir, tenga algún valor designado.

Saludos :)

wilcg 16-05-2014 04:54:19

Ecfisa, gracias amigo ya esta solucionado efectivamente el problema era eso, cambie la forma de crear los edit y funciona perfecto.
Código Delphi [-]
      for l := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
      begin
          NComponente := XML.DocumentElement.ChildNodes[l];
          with TEdit.Create(self) do
          begin
            Parent:= ScrollB;
            Name:= 'txtEdit'+IntToStr(EditCount);
            Tag := NComponente.Attributes['ID'];
            Width:= NComponente.Attributes['Ancho'];
            Height:= NComponente.Attributes['Alto'];
            Left:= NComponente.Attributes['x'];
            Top := NComponente.Attributes['y'];
            Font.Color := NComponente.Attributes['Color'];
            if NComponente.Attributes['Tipo'] = '*' then
            begin
              PasswordChar := '*';
              PopupMenu:= PMContraseña;
            end;
            Inc(EditCount);
          end;      
      end;

este código funciona para mi proyecto


La franja horaria es GMT +2. Ahora son las 00:41:18.

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