Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Self y Font en creación de componentes (https://www.clubdelphi.com/foros/showthread.php?t=76510)

salvica 05-11-2011 20:45:20

Self y Font en creación de componentes
 
Hola a todos

Estoy viendo el código de un componente bajado de internet, para modificarlo a mis necesidades, y encuentro que las funciones/procedimientos las construye utilizando la palabra Self
Código Delphi [-]
  Self.Canvas.Font.Assign(value);
pero cuando cambio la fuente al componente no actúa.

Estoy siguiendo el libro Delphi 4 de Francisco Charte, y veo que para modificar la fuente asigna Font.OnCreate := AttributeChanged;

He buscado esa función en intenet, pero no la encuento (debe ser definida en el componente). Desgraciadamente no dispongo del CD con el código de los ejemplos. En el libro pone (pag. 782. Fundamentos de creación de componentes)
Código Delphi [-]
private
  FFont : TFont;
protected
// Cuando las propiedades Brush, Pen o Font se modifican
// automáticamente generan un evento OnChange, que dirigiremos
// a éste procedimiento
  procedure AttributeChanged( Sender: TObject);
¿Alguien puede darme un poco de luz sobre el asunto?

Gracias
salvica

ecfisa 05-11-2011 23:17:56

Hola salvica.

Es claro que AttributeChanged no es nativo de Delphi y creo al igual que vos que es inherente al componente. Seguramente quién disponga del código que viene en el CD te podrá informar.

En relación a Self, hay que ver en que contexto está siendo usado, por que por ejemplo:
Código Delphi [-]
procedure TfrmUnForm.Button1Click(Sender: TObject);
begin
  ShowMessage(Self.ClassName); 
end;
Mostrará en pantalla TfrmUnForm ya que el parámetro implícito (Self), del método Button1Click es de tipo TfrmUnForm.

Un saludo.

salvica 05-11-2011 23:57:45

Hola ecfisa, gracias, lo del AttributeChanged me lo estaba figurando. Tendré que revisar la pila de CD's que tengo (por si lo encontrase)

Lo del Self, lo está utilizando para todo
Código Delphi [-]
procedure TComponentePrueba.SetFont(Value: TFont);
begin
  try
    Self.Canvas.Font.Assign(Value);
  except
  end;
end;

procedure TComponentePrueba.SetInactive(Value: boolean);
begin
  Self.FShowInactive :=  Value;
  Invalidate;
end;

procedure TComponentePrueba.SetInvertir(Value: boolean);
begin
  Self.FInvertir := Value;
  Invalidate;
end;

Es que es la primera vez que lo veo y me parece extraño.

En fin, gracias de nuevo
Saludos
salvica

ecfisa 06-11-2011 00:15:44

Hola de nuevo.

No lo has visto por que generalmente no se utiliza, ya que como te dije antes es implícito (aunque no es incorrecto usarlo).

Es decir que:
Código Delphi [-]
procedure TComponentePrueba.SetFont(Value: TFont);
begin
  try
    Self.Canvas.Font.Assign(Value);  // Self es TComponentePrueba
  except
  end;
end;

Es lo mismo que:
Código Delphi [-]
procedure TComponentePrueba.SetFont(Value: TFont);
begin
  try
    Canvas.Font.Assign(Value);  // Self (implícito) es TComponentePrueba
  except
  end;
end;

Un saludo.

salvica 06-11-2011 00:31:02

Cita:

Empezado por ecfisa (Mensaje 417721)
Hola de nuevo.

No lo has visto seguramente por que en la mayoría de los casos no se utiliza, ya que como te dije antes es implícito (aunque no es incorrecto usarlo).
Código Delphi [-]procedure TComponentePrueba.SetFont(Value: TFont); begin try Canvas.Font.Assign(Value); // Self (implícito) es TComponentePrueba except end; end;

Un saludo.

Gracias por la aclaración, de todas formas el componente debe dibujar en el Canvas, originalmente provenía de TCustomControl, lo ha intentado adaptar a un TGraphicControl, pero me dice que no encuentra la propiedad DoubleBuffered (que debe ser para evitar el parpadeo), con lo que lo he dejado como estaba
Código Delphi [-]
  //TComponentePrueba = class(TGraphicControl)
  TComponentePrueba = class(TCustomControl)

¿Que diferencia hay entre asignar la fuente al canvas o al componente?
Código Delphi [-]
procedure TComponentePrueba.SetFont(Value: TFont);
begin
  FFont := Value; // ---------> aquí asigna la fuente a la variable interna ( en el original esto no viene, pero FFont : TFont si)
  try
    Self.Canvas.Font.Assign(Value); // ---------> aquí asigna la fuente al canvas
  except
  end;
end;

ecfisa 06-11-2011 01:03:41

Hola.

Cita:

de todas formas el componente debe dibujar en el Canvas, originalmente provenía de TCustomControl, lo ha intentado adaptar a un TGraphicControl, pero me dice que no encuentra la propiedad DoubleBuffered
Es que la propiedad DoubleBuffered pertenece a la clase TWinControl, clase de la cuál deriva TCustomControl pero no TGraphicControl.

Cita:

¿Que diferencia hay entre asignar la fuente al canvas o al componente?
En realidad, los atributos de las fuentes se le asignan a la clase TFont en ambos casos.


Un saludo.

salvica 06-11-2011 01:12:57

Gracias por todo
Saludos
salvica


La franja horaria es GMT +2. Ahora son las 22:05:51.

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