掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ドラッグ&ドロップでファイル名とフルパスを取得してデータベースに格納するには? (ID:21511)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ユーザーのファイルの追加・削除操作によってListBox上にファイル名を表示し、 表示された画像ファイルをコンバートするプログラムを作ろうとしています。 それでListBox上にフルパスでファイル名を表示すると長くなるので、ファイル名部分だけ表示させたいなと思いまして、 しかし、画像をコンバートするにはフルパスは必要だから、そうなるとファイル名とフルパスとを結びつけて管理するデータベースを自作しないとダメだなと思って取り組んだのですが何やら上手くいきません。 問題の部分はドラッグ&ドロップでフルパスを取得した際に、ファイル名とフルパスをデータベースに格納する部分です。 最初はItems.AddObjects(ExtractFileName(Path), TObject(Path))で簡単に実現できそうだなと思ってやってみたんですがNG。 それで自作Recordを作ってみたり、Stringでキャストしてみたり、手を尽くしてみたのですが全然NGでして現在に至ります。 エラーメッセージは主にアクセス違反や無効なポインタ操作関連です。 特にItems.Add()ならOKでItems.AddObject()が上手く働かないのがよくわからないです。 上手く処理できる方法を教えてください。 ちなみにDelphiは経験一週間程度なので初歩的な勘違いをしてるかもしれません。 ソースは以下です。 //////////////////////////////////////////////////// unit Test; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TUnitDB = record FileName: TStringList; end; TForm_Test = class(TForm) ListBox_FileName: TListBox; procedure FormCreate(Sender: TObject); 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; DB : TUnitDB; 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); // これはOK ListBox_FileName.Items.AddObject(Path, TObject(String(Path))); // NG DB.FileName.Add(Path); // これもNG end; // ハンドルを解放 DragFinish(msg.Drop); end; end. ////////////////////////////////////////////////////// unit UnitDB; interface uses Classes, Dialogs, SysUtils; type TUnitDB = class public FFileName: TStrings; FFilePath: TStrings; procedure Add(const S: String); end; implementation procedure TUnitDB.Add(const S: String); begin FFileName.Add(S); FFilePath.Add(S); end; end. ////////////////////////////////////////////////////////
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.