プラグインの「新規にファイルを作成」について

  1. プラグインの「新規にファイルを作成」のコマンドを実行した時の挙動について教えて下さい。
    メニューの「ウィンドウ」の「タブを有効」を「チェック」の状態で、以下の「新規作成」の関数を実行すると、「別のウィンドウ」で作成されます。
    メニューの「ウィンドウ」の「タブを有効」を「チェック」の状態で、メニューの「ファイル」の「新規作成」では、「新しいタブ」で作成されます。
    同じ「新規作成」でも、挙動が違うので質問させていただきました。

    「新規作成」で使用した関数は以下です。
    Editor_New(Application.Handle);

    念のために、「ファイルを開きます」を実行した場合は、「タブを有効」が「チェック」でも「アンチェック」でも、「別ウィンドウ」で作成されるのは確認しました。
    Editor_LoadFile(Application.Handle, TRUE, PWideChar(filename));

    よろしくお願いします。

     |  大石剛司  |  返信
  2. Mery Ver 3.2.3 で確認してみましたが、[タブを有効にする] チェック時は、Editor_New で「新しいタブ」で作成されました。

    お使いの Mery のバージョンが分からないので想像になってしまいますが、

    Editor_New(Application.Handle);
    

    ↑ この書き方で Application.Handle をターゲットにした場合、以前のバージョンですと強制的に別ウィンドウで作成されてしまうのかもしれません。

    Editor_New を Application.Handle に対して発行するのは、エディターウィンドウが存在しない場合 (Mery がタスクトレイに常駐していてウィンドウが存在しない状態) に限っての方法となっています。

    通常は、

    Editor_New(ウィンドウハンドル);
    

    のように、エディターウィンドウのハンドルをターゲットにすることで、そのウィンドウに対して「新しいタブ」が作成されます。

    Editor_LoadFile(Application.Handle, TRUE, PWideChar(filename));
    

    ↑ Editor_New 以外のメソッドは Application.Handle に対して発行しても動作しないはずなので、これが動作しているのはプラグインのソースコードに不備があるのかもしれませんよ。

     |  Kuro  |  返信
  3. 大石です。

    アドバイスありがとうございます。
    試行錯誤してみましたが、もう少し教えて下さい。

    以下のプラグインを実行したタイミングでのファイル作成では、タブで新規に作成されました。

    // OnCommand
    // プラグインを実行した時に呼び出されます
    // パラメータ
    // hwnd: ウィンドウのハンドル
    procedure OnCommand(hwnd: HWND); stdcall;
    begin
    //ファイル作成
    Editor_New(hwnd);
    //
    try
    //確保
    FormCsvText := TFormCsvText.Create(Application);
    FormCsvText.IntWindowHwnd := hwnd;
    //表示
    FormCsvText.ShowModal;
    //破棄
    FormCsvText.Free;
    finally
    //
    end;
    end;

    FormCsvText にボタン(Button1)を作成して、以下のファイル作成では別ウィンドウで作成されます。
    procedure TFormCsvText.Button1Click(Sender: TObject);
    begin
    //ファイル作成
    Editor_New(FormCsvText.IntWindowHwnd);
    end;

    作成したフォームから実行すると、同じウィンドウハンドルを指定しても動作が異なってしまいます。

    よろしくお願いします。

     |  大石剛司  |  返信
  4. ご返信ありがとうございます。

    そういうことでしたか。恐らく ShowModal をしているのが原因かと思います。

    Editor_New でウィンドウを対象にしてタブを作成する場合、対象となるウィンドウが Enabled でなければなりません。

    ShowModal を使ってモーダルなダイアログを表示すると Delphi の場合、他のウィンドウがすべて Disabled になってしまいますので、そのウィンドウに対しての操作が一切できなくなってしまいます。

    その状態で Editor_New を呼び出すと、有効なウィンドウが存在しないので新たに別ウィンドウが作成されるというわけです。

    Delphi は基本的に ShowModal で表示しているダイアログ以外のウィンドウに対しては操作が一切できない仕様になっていたと思いますので、ちょっと面倒ですがモーダルではないウィンドウを使うなどの回避策が必要だと思います。

     |  Kuro  |  返信
  5. 回答ありがとうございます。これで疑問点がなくなりました。

    今回は showmodal の戻り値が mrOK の場合のみ、Edit_New を呼び出すようにしました。もう少し動作確認を行ってから公開します。

     |  大石剛司  |  返信
スポンサーリンク