掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ドラッグ&ドロップでファイル名とフルパスを取得してデータベースに格納するには? (ID:21515)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>ListBox自身にはフルパス格納 >ListBoxのOnDrawItemで、ファイル名のみ描画する。 >・・・ってのはどうですか? うあー、こんなイベントがあったとは、プロパティとメソッドばかり見てて気付きませんでした。 この手段で解決できました!ありがとうございました! >もしくは、別途StringListを用意し、TListBoxはファイル名のみ、StringListにはフルパスを格納し、Indexを合わせて使用する。 ファイル名用とフルパス用のListBoxを2つ作って同期させようかとも考えてました… 同期のコーディングでミスったら、自分のレベルだと解決の難しそうなバグを出しそうだったので途中で止めましたけどね。 >AddObjectでString型が使えないのは、ぶっちゃけ、String型は勝手にメモリを >確保・破棄してくれるPChar型だからであり、とあるメソッド内出宣言した変数は、 >そのメソッド内でしか使えない(スコープ・・・でいいんか?)から、 >AddObjectしたメソッド以外の場所でアクセスしようとしても、すでに開放されたあとの >メモリを参照するからエラーになる。 う〜ん、String型は使いどころが難しそうですね。 >ちなみに、TUnitDBのFFileNameやFFilePathのインスタンスは、どこで生成しているのやら? >クラスは、Createしないと使えませんよ。 CreateとDestoryを書かなくとも何故かエラーが出なかったもので、 コードの修正を繰り返しているうちに消えてしまいました…今度から気をつけます。 ファイル名の表示は以下のソースで解決できました。 英雄ムスカさん、えーとさん、ありがとうございました! //////////////////////////////////////////////////////////// unit Test; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TForm_Test = class(TForm) ListBox_FileName: TListBox; procedure FormCreate(Sender: TObject); procedure ListBox_FileNameDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); private procedure WMDropFiles(var msg: TWMDropFiles); message WM_DROPFILES; public end; var Form_Test: TForm_Test; implementation {$R *.dfm} procedure TForm_Test.FormCreate(Sender: TObject); begin // ドラッグ&ドロップを受け付ける DragAcceptFiles(Handle, True); end; // フォームへドラッグ&ドロップされた場合 procedure TForm_Test.WMDropFiles(var msg: TWMDropFiles); var Path: array [0..255] of Char; total, i: Integer; begin // いくつのファイルがドロップされたかを得る total := DragQueryFile(Msg.Drop, $FFFFFFFF, Path, SizeOf(Path)); // ファイル名を1つずつ得る for i := 0 to total - 1 do begin DragQueryFile(msg.Drop, i, Path, SizeOf(Path)); ListBox_FileName.Items.Add(Path); end; // ハンドルを解放 DragFinish(msg.Drop); end; // ファイル名部分のみをListBox上に表示 procedure TForm_Test.ListBox_FileNameDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin ListBox_FileName.Canvas.TextOut( Rect.Left+2, Rect.Top, ExtractFileName (ListBox_FileName.Items[Index])); end; end. ///////////////////////////////////////////////////////////////
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.