SDIタイプのテキストエディッタを作っているのですが、
ドラッグ&ドロップでつまずいています。
ショートカットやMemoコンポーネントにドラッグ&ドロップして
テキストファイルを開く方法は判るのですが(1つのファイル)、
一度に複数のファイルをドラッグ&ドロップした時に
新規にエディタを起動して、ドラッグ&ドロップされたファイル
を開く方法が判りません。
どのように対応すればいいのでしょうか?
まず、ParamCount,ParamStrがどういうものか理解されていますか?
プロジェクトを新規作成し、フォームにTMemo(Memo1)を貼り付け、フォームのCreateイベントに、
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
Memo1.lines.clear;
for i := 1 to ParamCount do
begin
Memo1.Lines.Add(ParamStr(i));
end;
end;
として試してみてください。
「こんなことは知ってるぞ」という場合、おそらく2つ目以降の起動方法がわからない、ということだと思います。
起動時のチェックを3つに分けてみましょう。
case ParamCount of
0: // 何もしない
begin
end;
1: // 1つだけ開く
begin
// 指定されたファイルを開く
end;
else // 複数開くのだが、2つ目以降は新規に開く
begin
// 1つ目に指定されたファイルを開く
for i := 2 to ParamCount do
begin
// ShellExecuteなどで自分自身を起動。パラメータに、現在のパラメータをばらして1つずつ指定する
end;
end;
こんな感じです。
>にしのさん
> まず、ParamCount,ParamStrがどういうものか理解されていますか?
ええと、ドラッグドロップ・・・みたいですよ、
これら二つは関係ないですよね?
>メメさん
ほんとは一つ目のファイル名を取得するときに、
(APIで指定する)インデックスに-1を指定して個数取得、
そのあとループで…とやらないといけないんですけど、
Delphiなんですから、コンポーネントという手もありますね。
"Delphian World"に、ファイルドラッグドロップコンポーネントがあるので、
それを利用してみてはどうでしょう?
0番目から順に、TStringsで取得できたはずですよ。
自分でやりたいというのなら、
このあたりを参考にしてくださいね。
http://www.runan.net/ "プログラミングTips(C言語ですけど、たいしたことないのでわかるでしょう)"
ちなみに、本題とは関係ないですけど、ParamStrとかの話が出たので…。
うちの おんぷむらのうら>おんぷ村倉庫>Delphiコンポーネント にTCmdInfoというクラスがあります。
コマンドラインを解析し、
結果を普通のTMemIniFileを読み取るかのように扱えるクラスです。
自分でやる場合ですけど、
ここで使うDragQueryFileのインデックスは、
DelphiではCardinal宣言されているので、0より少ない数値を指定できません。
なので、16進数表現で、$FFFFFFFFと指定しましょう。
(Integer型では、10進数の-1と同じ扱いになります)
失礼しました。
> ショートカットやMemoコンポーネントにドラッグ&ドロップして
の、「ショートカット」だけ見てました。
Memoコンポーネントにドラッグする場合は、まず、DragAcceptFilesでどこにドロップするかを決めます。
対象に送られてきたWM_DROPFILESメッセージを受けて、そのメッセージのWParam(内容はhDrop)を使ってDragQueryFileでファイルを取得します。
取得し終えたら、DragFinishでhDropを解放してやらないと、たぶんメモリリークするでしょう。
ちなみに、DragAcceptFilesを使うとき、DragQueryPointを使えば、「どこ(座標)に」ドロップされたかわかります。
にしのさん、たかみちえさんありがとうございます。
私の説明が悪かったようですね。。。
ドラッグドロップの方法については理解しているつもりで、
知りたかったのは、”2つ目以降の起動方法がわからない”でした。
でもShellExecuteを使うことが判りましたので、調べて見ます。
ShellExecuteって関連付けで実行するときのAPIですよね。。
コマンドラインって渡せるんですか?
> コマンドラインって渡せるんですか?
渡せますよ。たしかShellExecuteのコマンドの後、半角スペースを置いて指定します。
でも、それようなら、
うちの”おんぷむらのうら>おんぷ村倉庫>Delphiユニット”に、
stdFilesというユニットがあります。
そのなかのRunAs関数を使うと、CreateProcessで簡単にソフトを実行できますけど。
ツイート | ![]() |