Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Poner asterisco al lado de un TEdit (https://www.clubdelphi.com/foros/showthread.php?t=77291)

elGuerrero 12-01-2012 03:01:15

Poner asterisco al lado de un TEdit
 
Al componente TEdit le agregué la propiedad boleana Requerido para indicar si el campo no debe dejarse en blanco. El valor de esa propiedad quiero mostrarlo poniendo o no poniendo un asterisco rojo al lado derecho del rectángulo que delimita el TEdit, ya sea en tiempo de diseño o de ejecución.

He intentado poner el asterisco con TCanvas dentro del evento WMPaint pero no me ha funcionado.

Algo importante, la validación de que no esté en blanco no la integraré al componente sino en un procedimiento de la TForm.

A ver si pueden echarme una mano con el código o en caso de que no sea posible, pues también me lo digan.

Gracias.

LoPiTaL 12-01-2012 08:46:41

Hola!
Para lo que quieres hacer, yo heredaría de TCustomLabeledEdit, ya que este componente ya integra el label manteniéndolo público en lugar de published. De esta forma, con tu componente sólo deberías hacer en el setRequerido:

Código Delphi [-]
if (Value)
  Self.EditLabel.Caption:='*' 
else
  Self.EditLabel.Caption:='';

y poner las propiedades de la fuente y la posición del label (con LabelPosition y LabelSpacing).

Cuando lo arrastres en tiempo de diseño, por no tener las propiedades published no te dejará modificarlas, por lo que siempre tendrás el caption que indiques con la propiedad "Requerido".

Espero que te sirva.
Un saludo,
LoPiTaL

Neftali [Germán.Estévez] 12-01-2012 11:15:41

Hay varias opciones. Antes comentar que no me ha quedado claro si quieres el asterisco dentro del Edit (a la derecha) o fuera (a la derecha).

Si es dentro, puedes revisar el componente TEditInsideHelp de mi página.
Bájalo y revisa el código, pero creo que es lo que necesitas:

Código Delphi [-]
procedure TEditInsideHelp.WMPaint(var Message: TWMPaint);
var
  MCanvas: TControlCanvas;
  DrawBounds: TRect;
begin

  // Casos en los que no hacemos nada
  if (Self.Text <> '') or (not Self.FInsideHelpActive) then begin
    inherited;
    Exit;
  end;

  inherited;

  MCanvas := TControlCanvas.Create;
  DrawBounds := ClientRect;

  // proteccion
  try
    // Asignar el canvas
    MCanvas.Control := Self;

    // Pintar
    MCanvas.Brush.Color := Self.Color;
    MCanvas.Font.Color := Self.FInsideHelpColor;
    MCanvas.Font.Name := 'Arial';
    MCanvas.Font.Style := MCanvas.Font.Style + [fsBold];
    // texto
    MCanvas.TextOut(2,2, Self.FInsideHelpText);

  finally
    MCanvas.Free;
  end;

end;

En este caso se pinta lo que hay en una propiedad, pero es fácil modificar para que pinte un asterisco rojo a la derecha.

Si lo que quieres es pintarlo fuera del edit (a la derecha), pues puedes derivar como te han dicho, o incluso utilizar Frames, aunque creo que la primera opción es mejor.
Si me apuras puedes crear un componentes nuevo derivado de TPanel, que contenga un Edit y un Label.

elGuerrero 13-01-2012 03:35:57

No se me había ocurrido hacerlo así, y sí es como lo imaginaba.
Lo extra que tendría que hacer sería agregarle otras propiedades que ya le había puesto a mi TEdit derivado.
Muchas gracias.

elGuerrero 13-01-2012 03:38:10

Desearía el asterisco estuviera fuera, algo como:

[____] *

espero se entienda, la pseudo-imagen.
Respecto a usar el componente InsideHelp, intenté modificar el evento para poner el asterisco fuera pero no lo he logrado. Si pudieras ayudarme a hacerlo porque los componentes no son mi fuerte, y con eso me economizarías horas silla :)

Neftali [Germán.Estévez] 13-01-2012 13:58:13

Cita:

Empezado por elGuerrero (Mensaje 422854)
...
Respecto a usar el componente InsideHelp, intenté modificar el evento para poner el asterisco fuera pero no lo he logrado. Si pudieras ayudarme a hacerlo porque los componentes no son mi fuerte, y con eso me economizarías horas silla :)

OK, si lo que quieres es que esté fuera, es mejor la opción que te dió LoPiTal, pues ya tienes ambos componentes en uno, el EDIT y el LABEL.

Por lo pronto deriva el componente "sin nada."
(1) En el create modifica la fuente y color del Label y asigna el ASTERISCO al Caption.
(2) Modifica también la ubicación del Label.
...

Prueba, pon el código y dinos si te atascas...

elGuerrero 15-01-2012 01:42:12

Voy a hacer la derivación, como comenta LoPiTal y les comento la próxima semana pues estaré fuera unos días.
Por lo pronto, gracias por el apoyo a ambos.

elGuerrero 17-01-2012 06:11:41

Cita:

Empezado por elGuerrero (Mensaje 422853)
No se me había ocurrido hacerlo así, y sí es como lo imaginaba.
Lo extra que tendría que hacer sería agregarle otras propiedades que ya le había puesto a mi TEdit derivado.
Muchas gracias.

Debido a que ocupo otras propiedades de TEdit como TabOrder derive mejor de TLabeledEdit en lugar de TCustomLabeledEdit.
Les pongo lo escencial del código:

Código:

  TEntradaTxt = class(TLabeledEdit)
      FRequerido: Boolean;
      procedure SetRequerido(lVal: Boolean);
  public
      constructor Create(AOwner: TComponent); override;
  published
      property Requerido: Boolean read FRequerido write SetRequerido;
  end;

constructor TEntradaTxt.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FRequerido  := False;
  LabelPosition:= lpRight;
  LabelSpacing := 4;
  EditLabel.Caption:= '';
  EditLabel.Font.Color:= clRed;
end;

procedure TEntradaTxt.SetRequerido(lVal: Boolean);
begin
  if lVal <> FRequerido then
    begin
    FRequerido := lVal;
    if lVal then
      EditLabel.Caption:= '*'
    else
      EditLabel.Caption:= '';
    RecreateWnd;
    end
  else
    begin
    //***mi parche***
    if (not FRequerido) and (EditLabel.Caption <> '') then
      EditLabel.Caption:= '';
    end;
end;

El problema que tengo ahora es que en tiempo de diseño, cuando inserto el componente dentro de una WinForm me pone en el EditLabel.Caption la propiedad Name del componente.
A mi ver no me falta ninguna inicialización pero me sale ese valor y quise resolverlo agregando el código que marque con la etiqueta "mi parche", pero no me funciona.
En tiempo de diseño para borrar ese valor, una vez insertado el componente, en el Obj Inspector asigno con el mouse Requerido y luego lo desasigno y de esa manera desaparece el valor del Name en el Caption.

Podrian orientarme en ¿cómo puedo corregirlo para que salga en blanco en tiempo de diseño?

Gracias de antemano.

Neftali [Germán.Estévez] 17-01-2012 13:59:24

Prueba con algo así; Tal como lo habías hecho debería funcionar:

Código Delphi [-]
constructor TEntradaTxt.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FRequerido   := False;
  LabelPosition:= lpRight;
  LabelSpacing := 4;
  EditLabel.Font.Color:= clRed;
  EditLabel.Caption:= ' ';
  EditLabel.Invalidate;

end;

procedure TEntradaTxt.SetRequerido(lVal: Boolean);
begin
  if lVal <> FRequerido then begin
    FRequerido := lVal;
    if lVal then begin
      EditLabel.Caption:= '*'
    end
    else begin
      EditLabel.Caption:= '';
    end;
    Invalidate;
  end;
end;

Creo que el problema es dejar la cadena vacía en el Edit; Basta con que coloques un ESPACIO.
Por lo visto al dejarla vacía no le hace caso y vuelve a colocar el nombre.

elGuerrero 18-01-2012 03:10:29

Gracias totales, Neftali, ese era el código ad-hoc.

Y gracias también a LoPiTal, por la línea a desarrollar.


La franja horaria es GMT +2. Ahora son las 06:04:27.

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