Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 13-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código Delphi [-]
type TCoolEdit = class(TEdit)

Inherited ejecuta el método que se llama igual en su ancestro. Puesto que el TCoolEdit deriva de un TEdit, lo que hace es ejecutar el método con el mismo nombre en la clase TEdit.

En plata: Lo que se hace es un puente, para que todo el código escrito en la clase TEdit, sirva para el TCoolEdit.

En este caso:
Código Delphi [-]
Inherited Create(AOwner);
se le ha de pasar el parámetro AOwner al Tedit, por eso se le añade el nombre del método (Create) y el parámetro AOwner.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 13-12-2006 a las 19:51:37.
Responder Con Cita
  #22  
Antiguo 14-12-2006
pascalutn2003 pascalutn2003 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Córdoba
Posts: 36
Poder: 0
pascalutn2003 Va por buen camino
Smile Respuesta a Delar

Hola Delar :

Respondiendo a tu pregunta, Inherited es la palabra reservada que implica la herencia.
En el caso de SetFocus y KillFocus (que es a los Inherited que creo estas refiriendote) heredan el comportamiento del metodo del ancestro; a seguir le agregué lo que me interesaba que hiciera, pero fijate que si no lo pones (al inherited) cuando el componente reciba el foco no vas a ver el cursor y no se pintará el texto que haya adentro si es que lo hay.
Hacele pruebas y mirá que resultados te dá.
Aunque de todos modos capaz que alguien atine a que haga lo que debe hacer sin la palabra reservada Inherited
De todos modos; como estoy trabajando con RePaint, tal vez sea esa la causa de verme obligado a utilizar Inherited.
Como te decía antes, hace pruebas y fijate si encontras alguna otra forma.

Espero que te aclare el panorama y suerte.

EDGARDO - Córdoba - Argentina
Responder Con Cita
  #23  
Antiguo 15-12-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Cool

Hola pascalutn2003,

He recopiado tu último código y he vuelto a instalar el mismo, si bien ahora cambia el color, lo hace en tiempo de diseño pero no así en tiempo de ejecución. Sería bueno quienes entienden sobre la programación de componentes te echen una mano para seguir adelante y finalizar tu componente.

Última edición por Deiv fecha: 15-12-2006 a las 15:38:22.
Responder Con Cita
  #24  
Antiguo 15-12-2006
pascalutn2003 pascalutn2003 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Córdoba
Posts: 36
Poder: 0
pascalutn2003 Va por buen camino
Question Que raro...

Hola Deiv:

Fijate que he estado revisando el codigo, lo he desinstalado y vuelto a instalar y funciona bien.

Las propiedades son:

ColorFocus : Color de fondo con el foco
ColorNoFocus : Color de fondo sin el foco
FontColorFocus : Color de la fuente con el foco
FontColorNoFocus : Color de la fuente sin el foco

Por defecto y siempre al recibir el foco la letra se pone en negrita.

Fijate nuevamente por favor y si no te funciona no se que pueda ser, seria bueno que otros amigos del club lo probaran y me dijeran si les pasa lo mismo.

Nuevamente el codigo que acabo de compilar y que tengo funcionando en mi maquina

Código Delphi [-]
unit CoolEdit;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics, Forms;

type TCoolEdit = class(TEdit)
     private

          fColorWithFocus     :    TColor;
          fColorWithOutFocus  :    TColor;

          FColorFont          :    TColor;
          fFontColorFocus     :    TColor;
          fFontColorNoFocus   :    TColor;
          Foco                :    Boolean;

          Procedure SetColor(Value:TColor);
          Procedure SetColorNoFocus(Value:TColor);
          Procedure SetFontColorFocus(Value:TColor);
          Procedure SetFontColorNoFocus(Value:TColor);


     protected

          Procedure WMSetFocus(var Message:TWMSetFocus);message WM_SETFOCUS;
          Procedure WMKillFocus(var Message:TWMKillFocus);Message WM_KILLFOCUS;

     public

          Constructor Create(AOwner:TComponent);override;
          Destructor Destroy;override;

     published

          Procedure RePaint;Override;

          Property ColorFocus      :    TColor Read fColorWithFocus Write SetColor Default clAqua;
          Property ColorNoFocus    :    TColor Read fColorWithOutFocus Write SetColorNoFocus Default clSilver;

          Property FontColorFocus  :    TColor Read fFontColorFocus Write SetFontColorFocus Default clBlue;
          Property FontColorNoFocus:    TColor Read fFontColorNoFocus Write SetFontColorNoFocus Default clBlack;

     end;


     Procedure Register;

implementation

Procedure TCoolEdit.SetFontColorFocus(Value:TColor);
Begin

     fFontColorFocus:=Value;

     Repaint;

End;

Procedure TCoolEdit.SetFontColorNoFocus(Value:TColor);
Begin

     fFontColorNoFocus:=Value;

     Repaint;

End;

Constructor TCoolEdit.Create(AOwner:TComponent);
Begin

     Inherited Create(AOwner);

     Color:=clSilver;
     fColorWithFocus:=clAqua;
     fColorWithOutFocus:=clSilver;
     fFontColorFocus:=clBlue;
     fFontColorNoFocus:=clBlack;

End;

Procedure TCoolEdit.WMSetFocus(var Message:TWMSetFocus);
Begin
     Inherited;

     Foco:=True;

     Repaint;
End;

Procedure TCoolEdit.WMKillFocus(var Message:TWMKillFocus);
Begin
     Inherited;

     Foco:=False;

     Repaint;
End;

Procedure TCoolEdit.Repaint();
Begin
     If Foco Then Begin
          Font.Style:=[fsBold];
          Font.Color:=fFontColorFocus;
          Color:=fColorWithFocus;
     End
     Else begin
          Font.Style:=[];
          Font.Color:=fFontColorNoFocus;
          Color:=fColorWithOutFocus;
     End;
End;

Procedure TCoolEdit.SetColor(Value:TColor);
Begin
     If fColorWithFocus <>Value Then Begin
          fColorWithFocus:=Value;
          Repaint;
     End;
End;

Procedure TCoolEdit.SetColorNoFocus(Value:TColor);
Begin
     If fColorWithOutFocus <>Value Then Begin
          fColorWithOutFocus:=Value;
          Repaint;
     End;
End;

Destructor TCoolEdit.Destroy;
Begin

     Inherited Destroy;

End;

procedure Register;
begin
  RegisterComponents('Cool', [TCoolEdit]);
end;

end.
Responder Con Cita
  #25  
Antiguo 15-12-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Pues yo lo acabo de instalar y aparentemente funciona, es decir, tengo varios CoolEdit en una forma y al navegar entre ellos con la tecla Tab cambian su color al recibir el foco. Bueno fue una prueba muy superficial pero al menos no me pasa los mismo que indica Deiv.

Saludos
Responder Con Cita
  #26  
Antiguo 16-12-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Wink

Bueno no sé como explicar, pero lo que sucede es que para desinstalarlo, primero que me fuí a Install Packages y busqué COOL, y no había, luego entonces reinstalé, ahí ya me salió un mensaje que ya existía duplicado, entonces en esa ventana que aparece Compile, Install, etc, ahi le dí Remove, si bien ya no veia al componente COOL en dicha ventana, pero seguía la pestaña de COOL entonces no se desinstaló, cosa mas rara, y cuando comprobé el componente, evidentemente trabajaba en tiempo de diseño pero no en tiempo de ejecución, algo debió truncarse imagino en mi máquina ya que si le funcionó a Randolph, entonces sí funca!
Responder Con Cita
  #27  
Antiguo 16-12-2006
pascalutn2003 pascalutn2003 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Córdoba
Posts: 36
Poder: 0
pascalutn2003 Va por buen camino
Exclamation Para Deiv

Hola Deiv:

El problema que podes llegar a tener es que cuando instalaste el componente lo hayas hecho en un paquete que ya existia.

Te recomiendo hacer lo siguiente :

1.- Click en Component en el menu principal de Delphi
2.- Click en Configure Palette
3.- Una vez dentro del cuadro de propiedades de la paleta de componentes "Palette Properties", vas a ver dos listados (uno al lado del otro)
4.- En el listado de la izquierda anda hasta el final del listado y Click sobre [All] para que te liste los componentes en su totalidad sin importar a quien pertenecen
5.- En el listado de la derecha vas a ver dos titulo (Name y Package); Click sobre Name para ordenar alfabeticamente los componentes
6.- Busca el componente Cool
7.- Si lo encontraste, fijate en la columna mas a la derecha a que paquete pertenece.
8.- Una vez localizado el componente, cerrá todo
9.- Buscá y abrí el paquete en cuestion haciendo doble click sobre dicho paquete
10.- En el cuadro de Edicion del paquete vas a ver una serie de botones (Compile, Add, Remove, Install y Options)
11.- Click sobre Remove
12.- En el cuadro de dialogo Remove From Project Click sobre el componente que quieras eliminar, darle a Ok y listo; no hay mas componente. Ojo guardá los cambios en el paquete.
13.- Reinstala el componente en un paquete nuevo (dale vos un nombre) y compilalo.
14.- Suerte y cuidado con lo que eliminas del paquete

Si tenes duda sobre algo avisame y te doy una mano

EDGARDO - Córdoba - Argentina
Responder Con Cita
  #28  
Antiguo 16-12-2006
Avatar de hector.roma
hector.roma hector.roma is offline
Miembro
 
Registrado: jul 2005
Ubicación: a caballo entre Galicia y Portugal
Posts: 58
Poder: 19
hector.roma Va por buen camino
Otro código parecido...

En su momento también necesite un código parecido, en mi caso no cambio el tipo de letra cuando el control está activo pero si el color del mismo permitiendo su selección desde el inspector de objetos.
Por otro lado, cómo la aplicación era de tamaño físicamente reducido decidí cargarme las etiquetas de cada TEdit y para que se supiera que era cada componente, decidí añadir una propiedad más DefaultValue que sirve para mostrar un texto por defecto en el caso que el usuario al salir del TEdit lo deje vacío (previamente tengo que decir que al entrar en el TEdit el text por defecto se borra para permitir al usuario introducir el valor que el quiera o no en función de la propiedad ClearOnEnter).

Os dejo mi código:
Código Delphi [-]
unit AdvEdit;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TAdvEdit = class(TEdit)
  private
    { Private declarations }
    FDefault : string;
    FChanged : boolean;
    FColor    : TColor;
    FOldColor : TColor;
    FClear: boolean;
  protected
    { Protected declarations }
    function getDefault : string; virtual;
    procedure setDefault(AValue:string); virtual;
    //function getChanged : boolean; virtual;
    procedure DoEnter; override;
    procedure DoExit; override;
  public
    { Public declarations }
    procedure Cls;
    function getChanges : boolean;
  published
    { Published declarations }
    property DefaultValue : string read getDefault write setDefault;
    property ActiveColor  : TColor read FColor write FColor;
    property ClearOnEnter : boolean read FClear write FClear;
  end;

procedure Register;

implementation

uses MaskUtils;

procedure Register;
begin
  RegisterComponents('Meus', [TAdvEdit]);
end;

{ TAdvEdit }

//Método para restaurar el componente de forma rápida
procedure TAdvEdit.Cls;
begin
  Text     := DefaultValue;
  FChanged := FALSE;
  Change
end;


procedure TAdvEdit.DoEnter;
begin
  //Guardamos el color original
  FOldColor := Color;
  //Establecemos nuestro color
  Color     := ActiveColor;
  //Solo borramos el contenido del cuadro de texto en el caso que
  //1. ClearOnEnter = TRUE y
  //2. El usuario no haya introducido un valor antes.
  if ((Text = DefaultValue) AND (FClear)) then Text := '';
  inherited;
end;

procedure TAdvEdit.DoExit;
begin
  // Al salir, si el usuario deja el cuadro en blanco o bien vuelve a escribir
  //el contenido original... por asi decirlo retornamos al estado por defecto
  if ((Text = '') OR (Text = Self.DefaultValue)) then begin
    Self.Text := Self.DefaultValue;
    Self.FChanged := FALSE;
  end
  else
    Self.FChanged := TRUE;
  // En cualquier caso, restauramos el Color original del cuadro
  Color := FOldColor;
  inherited;
end;

function TAdvEdit.getChanges: boolean;
begin
  //Para evitar comparaciones en el codigo tipo if Text = DefaultText...
  //uso este "flag" para saber si el usuario hizo cambios en el cuadro o no.
  getChanges := FChanged;
end;

function TAdvEdit.getDefault: string;
begin
  //Por probar a usar metodos con las propiedades
  getDefault := FDefault;
end;


procedure TAdvEdit.setDefault(AValue: string);
begin
  //Por probar a usar metodos con las propiedades
  FDefault := AValue;
end;

end.

Espero que alguien más a parte de mi pueda encontrar utilidad este "componente".

Un saludo y gracias a todos.
Responder Con Cita
  #29  
Antiguo 16-12-2006
Avatar de hector.roma
hector.roma hector.roma is offline
Miembro
 
Registrado: jul 2005
Ubicación: a caballo entre Galicia y Portugal
Posts: 58
Poder: 19
hector.roma Va por buen camino
Acabo de darme cuenta que el "uses MaskUtils;" no tiene mucho sentido o si, no lo sé en cualquier caso seguro que está ahi por algún intento de "evolución" y que puede ser eliminado sin problema.
Responder Con Cita
  #30  
Antiguo 16-12-2006
pascalutn2003 pascalutn2003 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Córdoba
Posts: 36
Poder: 0
pascalutn2003 Va por buen camino
Thumbs up Para Hector

Hola master:

Acabo de instalarlo y probarlo.

Sinceramente me gustó como lo encaraste, me habia olvidado de DoEnter y DoExit asi que voy a utilizar esa parte de tu codigo en el mio (me gusto mas).

Ahora sigo con el problema de como realizar el cambio de fuente en activo y no activo usando los tipo TFontStyle.

Tu codigo esta mejor porque contempla la propiedad Color para cuando esta inactivo, en cambio yo queria sacarmela de encima y no sabia como.

En otros terminos, me gusto mas el tuyo.

GRACIAS

EDGARDO - Córdoba - Argentina

Última edición por pascalutn2003 fecha: 16-12-2006 a las 17:43:06.
Responder Con Cita
  #31  
Antiguo 17-12-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Wink

Cita:
Empezado por pascalutn2003
6.- Busca el componente Cool
7.- Si lo encontraste, fijate en la columna mas a la derecha a que paquete pertenece.
8.- Una vez localizado el componente, cerrá todo
9.- Buscá y abrí el paquete en cuestion haciendo doble click sobre dicho paquete
10.- En el cuadro de Edicion del paquete vas a ver una serie de botones (Compile, Add, Remove, Install y Options)
11.- Click sobre Remove
12.- En el cuadro de dialogo Remove From Project Click sobre el componente que quieras eliminar, darle a Ok y listo; no hay mas componente. Ojo guardá los cambios en el paquete.
7.- ¿A que te refeieres con Paquete? ¿Quisiste decir pestaña de la PageControl?
8.- Bien cierro todas las ventanas.
9.- Busco en la pestaña del TabSheet de la PageControl donde estaba ubicado, pero ¿Donde doy doble click?? Le dí doble click a la pestaña, le dí doble click al componente y no sucede nada no aparece esa ventana que la conozco muy bien y se cómo utilizarla.
10.- Bueno finalmente he tratado de reinstalar el componente, así me salga el mensaje que existe un duplicado, y ahí aprovecho en REMOVErlo (11.-) cuando me aparece esa ventana(10.-)
12.- lo regrabo, pero cuando voy a la pestaña donde se encontraba el componente, por mucho que le haya dado Remove, por mucho que reinicio, SIGUE AHÍ y sigue trabajando!
Bueno finalmente intenté por otro lado, he instalado un componente que no me hacía falta solo por abrir esa ventana, lo Remuevo, reinicio y evidentemente ya no está el COOL component. Para asegurarme he editado el código para que me aparezca en otra pestaña:
Código Delphi [-]
procedure Register;
begin
  RegisterComponents('NuevoCoolEdit', [TCoolEdit]);
end;
Reinstalo el componente......
Y lo mas interesante es que se vuelve a instalar en la ANTIGUA PESTAÑA (Paquete) que estaba la última vez y no así en esta nueva de arriba, compruebo el código y ahora si trabaja muy bien.

No sé si mi Delphi 7 está funcionando mal o el Componente hace algo en reinstalaciones. Pero de trabajar ahora trabaja muy bien.

Última edición por Deiv fecha: 17-12-2006 a las 22:54:13.
Responder Con Cita
  #32  
Antiguo 18-12-2006
Avatar de hector.roma
hector.roma hector.roma is offline
Miembro
 
Registrado: jul 2005
Ubicación: a caballo entre Galicia y Portugal
Posts: 58
Poder: 19
hector.roma Va por buen camino
Me alegra que te haya gustado

Siguiendo la forma de este componente lo lógico sería pensar en esta aproximación:
Código Delphi [-]
...
published
  ...
  property ActiveFont:TFont read FFont write FFont;
  ...
pero cuando fueras al Inspector de objetos y le dieras al botón [...] para asignar los valores correspondiente a tu fuente te llevarás una pequeña sorpresa; por así decirlo Delphi no sabe que hacer para asignar de forma correcta los diferentes campos del TFont, para que funcione correctamente creo que vas a tener que jugar con la unit DesignEditors para definir un Property Editor para la asignación del TFont desde el inspector de objetos.

En cualquier caso y siendo un poco chapuzas, puedes poner algo del tipo:

Código Delphi [-]
private
...
FFontName : string;
  FOldFontName:string;
...
published
...
  property ActiveFontName:string read FFontName write FFontName;
...
{En el código DoEnter}
...
  FOldFontName := Font.Name;
  Font.Name := FFontName;
...
{En el código DoExit}
...
  Font.Name := FOldFontName;
...

Así lograrías poder cambiar el tipo de letra en tiempo de diseño para cada uno de los componentes de forma individual desde el propio inspector de objetos, y de este modo cada componente podría tener su tipo de letra diferente si eso tiene alguna utilidad...

Este cutre-procedimiento lo puedes extender también para el resto de propiedades del TFont que quieras modificar... si así lo haces te recomiendo empezar todas esas propiedades por alguna palabra común por ejemplo: FuenteActivaNombre, FuenteActivaTamaño, FuenteActivaEstilo, ... así lo que lograrías es que todas las propiedades aparezcan en el inspector de objetos agrupadas.
Responder Con Cita
  #33  
Antiguo 18-12-2006
Avatar de hector.roma
hector.roma hector.roma is offline
Miembro
 
Registrado: jul 2005
Ubicación: a caballo entre Galicia y Portugal
Posts: 58
Poder: 19
hector.roma Va por buen camino
Por si acaso estás tentado a preguntarme sobre esa unit y los editores de propiedades te recomiendo tanto la búsqueda por este foro de esos conceptos; como también, por ejemplo, la búsqueda en el google de: TPropertyEditor TFont Delphi el primer enlace trae ejemplos y te da dos referencias más para buscar: TFontNameProperty y TFontProperty... espero que te gusten las pruebas de ensayo y error como técnica de aprendizaje

Supongo que por mi parte ésta es toda la ayuda que te puedo ofrecer, pues poco he trabajado con los editores de propiedades.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ventana MDI, "Siempre visible" y "Pantalla completa" ixMike API de Windows 7 11-04-2007 18:36:55
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
"ChequeaEsto" elegido el futuro "Killer CLubDelphi" mamcx Noticias 51 31-10-2006 20:56:32
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16
Múltiples "Deshacer" en un editor de textos soul6301 Varios 1 05-06-2004 21:38:37


La franja horaria es GMT +2. Ahora son las 13:30:49.


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
Copyright 1996-2007 Club Delphi