Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿¿TFont es una clase puntero?? (https://www.clubdelphi.com/foros/showthread.php?t=66569)

Archer 26-02-2010 16:46:21

¿¿TFont es una clase puntero??
 
Pues simplemente eso, ¿¿TFont es una clase puntero??, tengo un ejemplo que parece que lo confirma, pero me ralla la tira...

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Fuente: TFont;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Fuente := Label1.Font;
  Fuente.Color := clWhite;
  Label2.Font := Fuente;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Fuente := TFont.Create;
  Label1.Font.Size := 20;
end;

end.

es muy sencillo dos labels y un boton, supuestamente despues de pulsar el boton teniamos que tener 2 etiquetas con tamaño de fuente 20 una blanca y otra negra, pero no es asi, tenemos 2 etiquetas de tamaño 20 de color blanco las dos!!!!

parece ser que cuando cambio la propiedad "color" de la variable fuente se cambia tambien en la label1, como si realmente no existiera la variable como un objeto sino simplemente como una referencia hacia label1.font

¿es normal esto? ¿os pasa a todos? ¿lo sabias? ¿como narices se puede saber, que no sea el metodo prueba y ensayo, si una clase es una "clase puntero" o tiene "datos propios"? y ya por ultimo, ¿como hariais para acabar con una etiqueta de cada color de una manera "elegante" y sin usar mas etiquetas no visibles y cosas de esas?

por supuesto la mayoria de las preguntas de arriba no esperan respuesta, es una manera de hablar, tranquis!!! ;)

Saludos.

PD: Supongo que no tendra nada que ver pero uso Turbo Delphi Explorer en WinXP

roman 26-02-2010 17:06:36

En Delphi todos los objetos son apuntadores, aunque no se usa el operador ^ como en apuntadores normales.

// Saludos

Archer 26-02-2010 18:18:33

¿Y si quiero almacenar los parametros de una fuente fuera de un componente de la VLC?

Porque si declaro una variable del tipo TFont (para almacenar la fuente original) y luego cambio la fuente del componente se me cambiara tambien en la variable TFont... o vice versa...

roman 26-02-2010 18:44:16

Básicamente, tienes que crear un objeto de tipo Font (no basta declarar la variable, ties que crearla) y copiar las propiedades del objeto Font deseado, por ejemplo Edit1.Font.

Ahora bien, a partir de TComponent, Delphi implementa el método Assign, que algunas clases descendientes (pero no todas) usan para ese copiado de propiedades, de manera que se nos facilita el trabajo:

Código Delphi [-]
var
  Font: TFont;

begin
  Font := TFont.Create; // Hay que crear el objeto
  Font.Assign(Edit1.Font); // A partir de aquí, Font y Edit1.Font son indepedientes
  
  ...

  Font.Free; // Eventualmente hay que destruir lo que creamos
end;

Por otra parte, algo que te puede confundir al principio, es cuando haces una asignación del tipo:

Código Delphi [-]
Edit1.Font := Font;

En este caso, Edit1.Font y Font son ya independientes. La razón de esto es que en Delphi las propiedades de un objeto no necesariamente corresponden directamente a variables o campos dentro de la clase, sino que tras bambalinas, tal asignación se hace a través de un método SetFont de la clase TEdit, y este métod hace uso internamente de Assign:

Código Delphi [-]
procedure TEdit.SetFont(Value: TFont);
begin
  FFont.Assign(Font); // FFont es una variable privada de la clase
end;

// Saludos

rgstuamigo 26-02-2010 19:09:27

Cita:

Empezado por Archer (Mensaje 355218)
....
¿es normal esto? ¿os pasa a todos? ¿lo sabias? ¿como narices se puede saber, que no sea el metodo prueba y ensayo, si una clase es una "clase puntero" o tiene "datos propios"? y ya por ultimo, ¿como hariais para acabar con una etiqueta de cada color de una manera "elegante" y sin usar mas etiquetas no visibles y cosas de esas?

Aparte de lo comentado por roman creo que éste artículo de Ian Marteens te va sacar todas tus dudas.;).
Saludos...:)

roman 26-02-2010 19:23:44

Hombre, no seré yo Ian Marteens, pero realmente es lo mismo que ya le expliqué yo ;)

// Saludos

rgstuamigo 26-02-2010 19:28:39

Cita:

Empezado por roman (Mensaje 355233)
Hombre, no seré yo Ian Marteens, pero realmente es lo mismo que ya le expliqué yo ;)

// Saludos

Disculpa roman pero es que a veces me gusta que la gente lea un poco más para una mejor comprensión.:D


La franja horaria es GMT +2. Ahora son las 05:30:45.

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