Newsgroup: it.comp.lang.delphi
Titolo: Che fregatura: ExcelRange.Font.Size è di sola lettura

Vorrei impostare la dimensione del font in un intervallo di celle di un 
foglio Excel (ExcelXp.pas e Excel 10), ma scopro che č di sola lettura.
E adesso come faccio?
"Da dentro" Excel (Editor di Visual Basic) si puň impostare ma "da fuori" 
(OLE server) no!!!
L'interfaccia interessata č ExcelRange, che si ottiene dal metodo Selection
var
  ExcelRangeIntf: ExcelRange;
(...)
//seleziono piů colonne, per esempio
  _sheet.Range['A:H', EmptyParam].Select;
  if _sheet.Application.Selection[0].QueryInterface(ExcelRange, 
ExcelRangeIntf) = S_OK then
    begin
 
ExcelRangeIntf.Font.Name
 := 'Courier New';
//sorpresa, č di sola lettura!
      //ExcelRangeIntf.Cells.Font.Size := 12;
      {if fsBold in Options.XLSFontStyle then
        ExcelRangeIntf.Font.Bold := True
      else if fsItalic in Options.XLSFontStyle then
        ExcelRangeIntf.Font.Italic := True}
    end;
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

Soluzione.
////////////////////////////////////////////////////////////////////////////
unit Unit1;
interface
{$DEFINE OFFICE2000}
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
{$IFDEF OFFICE2000}
  Excel2000
{$ELSE}
  ExcelXp
{$ENDIF}
;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses ComObj;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
const
  TEMP_FILENAME = 'temp.xls';
var
  xla: TExcelApplication;
  xlw: _Workbook;
  filename: string;
  procedure ApplyFont(const StartCell, FontName: string; FontSize: Integer);
  //non funziona correttamente
  begin
    with xla.Cells.Range[Format('%s:%s', [StartCell, StartCell]), EmptyParam] 
do
    begin
      Formula := FontName;
      Style.Font.Size := FontSize;
 
Style.Font.Name
 := FontName;
    end;
  end;
  procedure ApplyFont2(const StartCell, FontName: string; FontSize: Integer);
  //funziona correttamente, col late binding
  var
    _range: Variant;
  begin
    _range := xla.Cells.Range[Format('%s:%s', [StartCell, StartCell]), 
EmptyParam];
    _range.Font.Size := FontSize;
    _
range.Font.Name
 := FontName;
    _range.Formula := FontName;
  end;
var
  Excel, FoglioExcel: Variant;
begin
  xla := TExcelApplication.Create(nil);
  try
    xlw := xla.Workbooks.Add(EmptyParam, 0);
    ApplyFont2('A1', 'Courier New', 12);
    ApplyFont2('B2', 'Verdana', 10);
    filename := ExtractFilePath(Application.ExeName) + TEMP_FILENAME;
    if FileExists(filename) then
      DeleteFile(filename);
{$IFDEF OFFICE2000}
    xlw.SaveAs(
      filename,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      False,
      False,
      xlNoChange,
      xlUserResolution,
      False,
      EmptyParam,
      EmptyParam,
      0);
{$ELSE}
    xlw.SaveAs(
      filename,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      False,
      False,
      xlNoChange,
      xlUserResolution,
      False,
      EmptyParam,
      EmptyParam,
      0,
      0);
{$ENDIF}
    xla.Visible[0] := True;
    xla.Disconnect;
  finally
    xla.Free;
  end;
end;
end.
