Cita:
Empezado por ecfisa
Hola Delphius.
Al tratar con apuntadores es totalmente correcta tu apreciación, como queda claro en este ejemplo:
Código Delphi [-]var f1, f2: TFont; begin f1 := TFont.Create; f2 := TFont.Create; f2 := f1; // (*) f2.Assign(f1) f1.Free; f2.Color := clRed; // ¡ Error, f2 no es un apuntador válido !
Lo correcto sería usar el método Assign (*), que copia las propiedades a la otra instancia de TFont.
Pero para el código anterior:
Código Delphi [-] Label1.Font := FontBase; Edit1.Font := FontBase; Memo1.Font := FontBase; ...
Font , que estos componentes heredan de TControl, está definida como una propiedad:
Código Delphi [-] TControl = class(TComponent) ... property Font: TFont read FFont write SetFont stored IsFontStored; ... end; ... procedure TControl.SetFont(Value: TFont); begin FFont.Assign(Value); end;
por lo que en el caso anterior, no se trataría de una asignación de punteros.
Saludos
|
Vaya. Eso si que es una sorpresa. No recordaba que una asignación del TFont entre componentes (al menos en los TControl y descendientes) se procediera con el Asign().
Recuerdo de La Cara Oculta la advertencia que se daba justamente sobre TFont y por ello se me quedó en la cabeza que debía hacerse por medio de Assing().
Hagan de cuenta entonces que no dije nada.
En Lazarus, las cosas son un poquito diferentes:
Código Delphi
[-]procedure TControl.SetFont(Value: TFont);
begin
if FFont.IsEqual(Value) then exit;
FFont.Assign(Value);
Invalidate;
end;
Y de curioso me puse a ver como está implementado el Assign() y vaya código de extraño e intrincado, me imaginaba algo más directo de copiar:
Código Delphi
[-]procedure TFont.Assign(Source: TPersistent);
begin
if Source is TFont then
begin
try
try
BeginUpdate;
try
CharSet := TFont(Source).CharSet;
SetColor(TFont(Source).Color, TFPCanvasHelper(Source).FPColor);
if TFont(Source).PixelsPerInch <> FPixelsPerInch then
Size := TFont(Source).Size
else
Height := TFont(Source).Height;
Name := TFont(Source).Name;
Orientation := TFont(Source).Orientation;
Pitch := TFont(Source).Pitch;
Style := TFont(Source).Style;
Quality := TFont(Source).Quality;
finally
EndUpdate;
end;
finally
end;
finally
end;
Exit;
end;
inherited Assign(Source);
end;
Saludos,
PD: Se que no se debe hacer pero... ¿alguien más se anima a hecharle un ojo a mi hilo abierto hace unos días?