Ver Mensaje Individual
  #10  
Antiguo 31-05-2015
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
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
    //TODO:lock;
    try
      //TODO: TFont(Source).Lock;
      try
        BeginUpdate;
        try
          CharSet := TFont(Source).CharSet;
          SetColor(TFont(Source).Color, TFPCanvasHelper(Source).FPColor);
          if TFont(Source).PixelsPerInch <> FPixelsPerInch then
            // use size to convert source height pixels to current resolution
            Size := TFont(Source).Size
          else
            // use height which users could have changed directly
            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
        //TODO: TFont(Source).UnLock;
      end;
    finally
      //TODO: UnLock;
    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?
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita