« 2004年9月 | トップページ | 2004年11月 »

■Delphi8 and .NET 1.1 SP1の問題

Borland Japanのサイトで
.NET Framework 1.1 Service Pack適用時の問題について
という情報がありました。(いつ更新されたのかな?)
対応版の案内等ではなく、内容は前に紹介したUSのサイトと同じものです。

|

☆xlsをcsvで保存

[Delphi7]

今更、載せる必要もないかも知れませんが、エクセルファイルの指定シートをCSV形式で保存するサンプルです。今まで Excel2000 というユニットを使ってきましたが、今回 ExcelXP を使ったので、今までのプログラムがコンパイルできずに少し焦りました。

プログラム中にはありませんが、今まで
  ExcelWorksheet1.Range['A1','A1'].Value := 'データ';
としていたものも
  ExcelWorksheet1.Range['A1','A1'].Value2 := 'データ';
というような変更が必要でした。


uses ExcelXP;


{ Excelファイルの指定されたシートをCSVに保存します。 }
procedure TForm1.Button1Click(Sender: TObject);

  { セルの列名を数字からアルファベットに変換します。 }
  function GetAlfa(I: Integer): String;
  var
    J,K: Integer;
    S1,S2: String;
  begin
    Result := '';
    J := I div 26;
    K := I mod 26;

    if (K = 0) then
    begin
      J := J - 1;
      K := K + 26;
    end;

    if (J = 0) then
      S1 := ''
    else
      S1 := Chr(J+64);

    S2 := Chr(K+64);
    Result := S1+ S2;
  end;

const
  FileName = 'エクセルのファイル';
  WorkSheetName = 'CSVで保存したいシート名';
  CSVFile  = 'CSVファイル名';
var
  LCID, ColumnCount, RowCount: Integer;
  ExcelApplication1: TExcelApplication;
  ExcelWorkBook1: TExcelWorkBook;
  ExcelWorkSheet1: TExcelWorkSheet;
begin
  ExcelApplication1 := TExcelApplication.Create(nil);
  ExcelWorkBook1 := TExcelWorkBook.Create(nil);
  ExcelWorkSheet1 := TExcelWorkSheet.Create(nil);
  try
    LCID := GetUserDefaultLCID;
    ExcelApplication1.Connect;
    ExcelApplication1.Visible[LCID] :=  False;
    ExcelApplication1.DisplayAlerts[LCID] := False;

    { Excelファイルをオープンします。 }
    ExcelApplication1.Workbooks.Open(
        FileName,   //FileName: WideString
        EmptyParam, //UpdateLinks: OleVariant
        EmptyParam, //ReadOnly: OleVariant
        EmptyParam, //Format: OleVariant
        EmptyParam, //Password: OleVariant
        EmptyParam, //WriteResPassword: OleVariant
        EmptyParam, //IgnoreReadOnlyRecommended: OleVariant
        EmptyParam, //Orign: OleVariant
        EmptyParam, //Delimiter: OleVariant
        EmptyParam, //Editable: OleVariant
        EmptyParam, //Notify: OleVariant
        EmptyParam, //Converter: OleVariant
        EmptyParam, //AddToMru: OleVariant
        EmptyParam, //Local
        EmptyParam, //CorruptLoad
        LCID        //lcid: Integer;
         );

    ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);
    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[WorkSheetName] as _Worksheet);

    { 使用されている列数を取得します。 }
    ColumnCount := ExcelWorksheet1.UsedRange[LCID].Columns.Count;

    { 使用されている行数を取得します。 }
    RowCount    := ExcelWorksheet1.UsedRange[LCID].Rows.Count;

    { オートフィルタを解除します。 }
    if ExcelWorksheet1.AutoFilterMode[LCID] then
      ExcelWorksheet1.AutoFilterMode[LCID] := False;

    { セルに設定されている書式を消去します。 }
    ExcelWorksheet1.Range['A1',GetAlfa(ColumnCount)+IntToStr(RowCount)].ClearFormats;

    { 参考 - 書式を設定する場合 }
    //ExcelWorksheet1.Range['H2','H10'].NumberFormatLocal :='yyyy/m/d';

    { CSV形式でファイルを名前を付けて保存させます。 }
    ExcelWorkbook1.SaveAs(CSVFile,     //Filename
         xlCSV,       //FileFormat
        EmptyParam,  //Password
        EmptyParam,  //WriteResPassword
        False,       //ReadOnlyRecommended
        False,       //CreateBackup
        xlNoChange,  //AccessMode
        EmptyParam,  //ConflictResolution
        EmptyParam,  //AddToMru
        EmptyParam,  //TextCodepage
        EmptyParam,  //TextVisualLayout
        EmptyParam,  //Local
        LCID);       //LCID

    ExcelWorkbook1.Disconnect;  //要らないかも?
    ExcelApplication1.Quit;
    ExcelApplication1.Disconnect;
  finally
    ExcelWorkSheet1.Free;
    ExcelWorkBook1.Free;
    ExcelApplication1.Free;
  end;
end;

|

☆IdFTPでファイル名取得

[Delphi7]

FTPサーバーのファイル名を取得する必要があったので、Indyを使ってプログラムしてみました。フォームにButton、Memo、IdFTP、IdAntiFreeze1を貼り付けます。

procedure TForm1.Button1Click(Sender: TObject);
var
 SL: TStringList;
 I: Integer;
 S1, S2: String;
begin
 IdFTP1.Host     := 'ホスト';
 IdFTP1.Username := 'ユーザー名';
 IdFTP1.Password := 'パスワード';
 IdFTP1.Connect;
 SL:= TStringList.Create;
 try
  IdFTP1.ChangeDir('フォルダ名');
  IdFTP1.List(SL);
  for I := 0 to IdFTP1.DirectoryListing.Count -1 do
  begin
   S1 := IdFTP1.DirectoryListing.Items[I].FileName;  //ファイル名
   S2 := DateTimeToStr(
    IdFTP1.DirectoryListing.Items[I].ModifiedDate); //日付
   Memo1.Lines.Add(S1+ #9 + S2);
  end;
 finally
  SL.Free;
  IdFTP1.Quit;
 end;
end;

使っているIndyのバージョンは、9.00.10となっています。

|

« 2004年9月 | トップページ | 2004年11月 »