現在フォームにGridをはりつけて、そのGridにcsvファイルをD&Dすればファイルの情報がGridに表示される用なアプリを作成しようとしているのですが、コンポーネントからD&DはGridのDragOverのAcceptをTrueにすれば可能なのですが
ファイルのD&Dの処理がうまくいかないので質問させていただきました。
ご教授お願いいたします。
キーワード、DragAcceptFiles, WM_DROPFILES
めんどくさいなら、コンポーネント
http://norg1964.hp.infoseek.co.jp/delphianworld/compo/system.html#SY0040
まず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;
こんなかんじかな。
ツイート | ![]() |