ドラッグ&ドロップ


メメ  2003-05-14 21:29:41  No: 3530

SDIタイプのテキストエディッタを作っているのですが、
ドラッグ&ドロップでつまずいています。
ショートカットやMemoコンポーネントにドラッグ&ドロップして
テキストファイルを開く方法は判るのですが(1つのファイル)、
一度に複数のファイルをドラッグ&ドロップした時に
新規にエディタを起動して、ドラッグ&ドロップされたファイル
を開く方法が判りません。
どのように対応すればいいのでしょうか?


にしの  2003-05-14 23:43:50  No: 3531

まず、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;

こんな感じです。


たかみちえ  URL  2003-05-15 03:36:37  No: 3532

>にしのさん
> まず、ParamCount,ParamStrがどういうものか理解されていますか?
  ええと、ドラッグドロップ・・・みたいですよ、
これら二つは関係ないですよね?

>メメさん
  ほんとは一つ目のファイル名を取得するときに、
(APIで指定する)インデックスに-1を指定して個数取得、
そのあとループで…とやらないといけないんですけど、
Delphiなんですから、コンポーネントという手もありますね。
  "Delphian World"に、ファイルドラッグドロップコンポーネントがあるので、
それを利用してみてはどうでしょう?
0番目から順に、TStringsで取得できたはずですよ。

  自分でやりたいというのなら、
このあたりを参考にしてくださいね。
http://www.runan.net/ "プログラミングTips(C言語ですけど、たいしたことないのでわかるでしょう)"

  ちなみに、本題とは関係ないですけど、ParamStrとかの話が出たので…。
うちの おんぷむらのうら>おんぷ村倉庫>Delphiコンポーネント  にTCmdInfoというクラスがあります。
  コマンドラインを解析し、
結果を普通のTMemIniFileを読み取るかのように扱えるクラスです。


たかみちえ  URL  2003-05-15 03:42:28  No: 3533

自分でやる場合ですけど、
ここで使うDragQueryFileのインデックスは、
DelphiではCardinal宣言されているので、0より少ない数値を指定できません。
なので、16進数表現で、$FFFFFFFFと指定しましょう。
(Integer型では、10進数の-1と同じ扱いになります)


にしの  2003-05-15 06:47:30  No: 3534

失礼しました。
> ショートカットやMemoコンポーネントにドラッグ&ドロップして
の、「ショートカット」だけ見てました。
Memoコンポーネントにドラッグする場合は、まず、DragAcceptFilesでどこにドロップするかを決めます。
対象に送られてきたWM_DROPFILESメッセージを受けて、そのメッセージのWParam(内容はhDrop)を使ってDragQueryFileでファイルを取得します。
取得し終えたら、DragFinishでhDropを解放してやらないと、たぶんメモリリークするでしょう。

ちなみに、DragAcceptFilesを使うとき、DragQueryPointを使えば、「どこ(座標)に」ドロップされたかわかります。


メメ  2003-05-15 18:22:15  No: 3535

にしのさん、たかみちえさんありがとうございます。

私の説明が悪かったようですね。。。
ドラッグドロップの方法については理解しているつもりで、
知りたかったのは、”2つ目以降の起動方法がわからない”でした。
でもShellExecuteを使うことが判りましたので、調べて見ます。
ShellExecuteって関連付けで実行するときのAPIですよね。。
コマンドラインって渡せるんですか?


たかみちえ  2003-05-15 19:41:06  No: 3536

> コマンドラインって渡せるんですか?
  渡せますよ。たしかShellExecuteのコマンドの後、半角スペースを置いて指定します。

  でも、それようなら、
うちの”おんぷむらのうら>おんぷ村倉庫>Delphiユニット”に、
stdFilesというユニットがあります。
そのなかのRunAs関数を使うと、CreateProcessで簡単にソフトを実行できますけど。


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

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






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