Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema en la creación de componente derivado de TEdit. (https://www.clubdelphi.com/foros/showthread.php?t=57215)

Angel Fernández 08-06-2008 23:25:01

Problema en la creación de componente derivado de TEdit.
 
Saludos al foro.

Quisiera haceros una consulta sobre la creación de un componente sencillo, para aprender (tened en cuenta que es mi primer componente).
Estoy tratando de crear un componente derivado de Tedit para que me muestre con un código de colores si existe el fichero que aparece en la propiedad Text del tedit.
Por ejemplo, si existe el fichero: C:\Archivos de Programa\Fichero.txt que el tedit tenga de fondo el color verde y si no existe el fichero, tenga de fondo el color rojo.

Para hacerlo un poco más completo, le he implementado tres modos:
Modo abrir fichero: Si el fichero existe, color verde. Si no existe, color rojo. Ej: C:\Archivos de Programa\Fichero.txt
Modo abrir directorio: Igual que el anterior pero con directorios en vez de ficheros: Si existe la ruta, verde; si no, rojo. Ej: C:\Archivos de Programa\
Modo salvar fichero: Si el fichero existe color amarillo. Si no existe color verde. Si no existe la ruta del fichero, color rojo.
Ej: C:\Archivos de Programa\Fichero.txt -> Si existe, color amarillo. Si no existe, color verde.
Si escribimos C:\Arcivo de Programa\Fichero.txt -> Color rojo porque la ruta no existe.

Esto le he conseguido con el siguiente código en la propiedad change del nuevo componente:

Código Delphi [-]
procedure TColorEdit.Change(Sender: TObject);
begin
  if FMode = MOpenFile then
    if fileexists(text) then
    begin
      Color := FGreenColor;
      FResultInt := 0;
    end
    else
    begin
      Color := FRedColor;
      FResultInt := -1;
    end;
  if FMode = MOpenDir then
    if directoryexists(text) then
    begin
      Color := FGreenColor;
      FResultInt := 0;
    end
    else
    begin
      Color := FRedColor;
      FResultInt := -1;
    end;
  if FMode = MSaveFile then
  begin
    if fileexists(text) then
    begin
      Color := FYellowColor;
      FResultInt := 1;
    end
    else
    begin
      Color := FGreenColor;
      FResultInt := 0;
    end;
    if not directoryexists(extractfilepath(text)) then
    begin
      Color := FRedColor;
      FResultInt := -1;
    end;
  end;
end;

ResultInt es una variable de tipo integer que devuelve 0 para el color verde, -1 para el rojo y 1 para el amarillo.

Y aquí viene el problema: Si a este componente le llamo ColorEdit1 y en el evento OnChange escribo algo como por ejemplo:

procedure ColorEdit1Change(Sender: TObject);
begin
btn1.enabled:=coloredit1.text<>'';
end;

En este caso, el código de colores deja de funcionar. Y esto ocurre con cualquier cosa que escriba en el evento onchange, es decir, deja de funcionar el cambio de color de fondo. Si no escribo nada, funciona correctamente.

He probado a poner inherited en la definición del nuevo método change, pero me da un error diciendo que no se permite poner ahí inherited.

Espero haberme explicado correctamente.

¿Alguna idea?

Gracias de antemano.

PD: Si alguien está interesado, puedo colgar el código completo. No lo he puesto para no aturdir demasiado.

dec 09-06-2008 03:52:36

Hola,

No estoy muy puesto, pero, me parece que podrías comprobar si el evento en cuestión está asignado, y, si lo está, "dispararlo", algo así como:

Código Delphi [-]
if Assigned(FOnChange) then
begin
  FOnChange(Self);
end;

Tendrás que probar a ver si no explota algo. ;)

Angel Fernández 09-06-2008 14:55:46

Gracias dec por tu respuesta.

Sin embargo, no me funciona. Salta el error de access violation at ......

Por lo visto, si escribo algo en el evento onchange, ya no se activa el nuevo onchange creado por mí.

Buf, seguiré investigando.

Un saludo.

maeyanes 09-06-2008 15:21:13

Hola...

Te recomiendo que uses el método protegido Change del TEdit para hacer lo que quieres.

Código Delphi [-]
TMyEdit = class(TEdit)
protected
  procedure Change; override;
end;

implementation

procedure TMyEdit.Change;
begin
  // Código propio
  inherited
end;


Saludos...

Edit.

Quité la referencia al hilo de Dec ya que el tema tratado en ese hilo era en realidad otro...

Neftali [Germán.Estévez] 09-06-2008 15:45:24

El método Change que has colocado funciona perfectamente, pero te falta definir el inherited en el changed del componente (no en el evento).

Has sobreescrito (supongo) el método Changed en tu componente con la clausula override, así que si no llamas al inherited desde tu método perderás todo el código que se ejecuta en los predecesores(antecesores) de tu componente. En concreto en TCustomEdit.Change se lanza el evento OnChange, por lo tanto, al no colocar inherited en tu componente ese evento deja de funcionar.

Código Delphi [-]
procedure TColorEdit.Change;
begin
  inherited;

  if FMode = MOpenFile then
    if fileexists(text) then
    begin

   .....

EDITO: Veo que se me adelantaron... :o:o:o
Esto me pasa por no refrescar las ventanas...

maeyanes 09-06-2008 15:54:42

Hola...

Neftali, solo que el método Change que colocó Angel Fernandez es en realidad un manejador de eventos, checa la firma del método: procedure TColorEdit.Change(Sender: TObject);. Claro que en tiempo de diseño al asignar el evento OnChange, se pierde la referencia al método especificado.


Saludos...

Neftali [Germán.Estévez] 09-06-2008 16:08:27

Cita:

Empezado por maeyanes (Mensaje 292246)
...solo que el método Change que colocó Angel Fernandez es en realidad un manejador de eventos, checa la firma del método: procedure TColorEdit.Change(Sender: TObject)

Gracias maeyanes.
No me había fijado en el parámtero y estaba suponiendo que ha sobreescrito el método cuando realmante no es así.

He ahí el error.

Angel Fernández 09-06-2008 19:53:26

1 Archivos Adjunto(s)
Gracias a todos.

Lo que me ha indicado maeyanes funciona perfectamente.

Lo subo por si a alguien le interesa o quiere utilizarlo como base para otra cosa.

Un saludo.


La franja horaria es GMT +2. Ahora son las 17:14:45.

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