csvをD&D


プラス  2007-09-07 19:05:01  No: 27693

現在フォームにGridをはりつけて、そのGridにcsvファイルをD&Dすればファイルの情報がGridに表示される用なアプリを作成しようとしているのですが、コンポーネントからD&DはGridのDragOverのAcceptをTrueにすれば可能なのですが
ファイルのD&Dの処理がうまくいかないので質問させていただきました。
ご教授お願いいたします。


ofZ  2007-09-07 20:48:04  No: 27694

キーワード、DragAcceptFiles, WM_DROPFILES

めんどくさいなら、コンポーネント
http://norg1964.hp.infoseek.co.jp/delphianworld/compo/system.html#SY0040


AVA  2007-09-12 04:40:37  No: 27695

まずTFormに対してファイルのドロップを受け入れる設定をします。
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

実際ファイルがドロップされたときWindowsがドロップされたよっていうMessageを送ってきますのでそのMessageを受けて起動する処理を作ります。
  private
    { Private 宣言 }
    procedure WMDropFiles(var Msg: TWMDropFiles); 
      message WM_DROPFILES;
  public
    { Public 宣言 }
  end;
・・・
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  FileName: array[0..255] of char;
  Fname: string;
  F: TextFile;
  strs: TStringList;
  ARow: integer;
  Buff: string;
begin
  {ドロップされたファイル名を取得}
  DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
  Fname := StrPas(FileName);

  ARow := 0;
  AssignFile(F, Fname);
  Reset(F);
  strs := TStringList.Create;
  try
    while not EOF(F) do
    begin
      Inc(ARow);
      Readln(F, Buff);
      strs.CommaText := Buff;
      strs.Insert(0,IntToStr(ARow)); //Column 0 に行番号
      if StringGrid1.ColCount < strs.Count then
        StringGrid1.ColCount := strs.Count;
      if StringGrid1.RowCount < ARow then
        StringGrid1.RowCount := ARow + 1;  //Row 0はヘッダー
      StringGrid1.Rows[ARow].Assign(strs);
    end;
  finally
    strs.Free;
    CloseFile(F);
  end;
end;

こんなかんじかな。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加