Re: 静的メソッドの呼び出しではインスタンスは不要です

投稿者:schutzen 投稿日:2019/11/17(Sun) 00:07:21 No.2524

ゆうとさん、早速のご返答ありがとうございます。調べてみましたら、基本的な所が理解できていなかったようで、お恥ずかしいです。

もう一つ質問よろしいでしょうか。
教えていただいた方法で生成したImage型のプロパティの取得やメソッドの呼び出しを試みています。例えば、
--------
ファイル文字列=「test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
imgから「PropertyItems」を取得する
imgから「GetPropertyItem」を{271}で呼び出す
--------
では、最後の2行が「手順が複数あり、どの手順を実行するか決定できません。」でエラーになります。
自分なりに調べたところ、Image型オブジェクト≒プロデルの画像のBaseObjectと思われたのですが、ドットネット型の「取得する」、「設定する」は使えず、Image型オブジェクトのメンバーにアクセスするコードを書く必要があるのでしょうか。

静的メソッドの呼び出しではインスタンスは不要です

投稿者:ゆうと 投稿日:2019/11/15(Fri) 16:31:20 No.2523

こんにちは ゆうとです。

ImageクラスのFromFileメソッドは、静的メソッドですのでドットネット型の「呼び出す」手順を使って呼び出します。
次のような感じでImage型のインスタンスを作ることができます。
----------------
ファイル文字列=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
----------------

参考にして下さい。

Re^2: 私にできるのは…

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/14(Thu) 21:55:37 No.2522

こんばんは。アークです。

「メモリマップドファイル」には2種類あるようです。
そのまま消えてしまうタイプと終了時にファイルに残すタイプです。
まぁ、ファイルを使いたくないという事であれば残るは「ADS」辺りでしょうか。

Re: 私にできるのは…

投稿者: 投稿日:2019/11/14(Thu) 21:19:41 No.2521

 こんにちは。

 クリップボードはちょっと使えないですね。
 そもそもすでに何かしらデータが入っていたら、クリップボードの中身が上書きされてしまうので。
 クリップボードに入っているのが文字列とか画像とかだけなら、1回バックアップして、書き戻すこともできるかもしれないですが、ファイルがコピーされていたりすると、かなりめんどうなことになるので。
 それなら一時ファイルを経由させる方がまだましだと思います。

> 本格的なプロセス間通信を実装するのなら「メモリマップドファイル」を使って、
> プロセス間で共通に使える変数を利用するのが良さそうです。
> 陸さんはCを遣られているので如何でしょうか。

 これも試してみました。
 ほぼほぼ要求は達成できましたが、1つ問題があって、メモリに書き込んだ側のプログラムが終了されてしまうと、書き込んだデータは読み込めなくなってしまいます。
 タイマーで定期的に監視しても、多分取得漏れが発生すると思います。

 それでは。

ドットネット型のインスタンス

投稿者:schutzen 投稿日:2019/11/14(Thu) 16:34:48 No.2520

こんにちは。いつもお世話になっております。
エクスプローラーでjpeg画像の詳細プロパティに表示されるタグを、プロデルから編集しようとしています。
https://social.technet.microsoft.com/Forums/scriptcenter/en-US/8b398413-0728-4a8a-a593-d2e8b92b88f2/editing-image-exif-tags?forum=ITCG などのPowerShellの例を参考に、以下のように書いてみました。
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
Imageは、dotnet_imageからインスタンスを作ったもの
imgは、dotnet_image:Fromfile(ファイル文字列)
-------
これを実行すると、3行目で次のようなエラーが出てしまいます。
-------
には、該当するコンストラクタがないためオブジェクトを作成できません。

[エラー番号900] [はじめ:32行目]
-------

そこで、少し書き直して、
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Bitmap」)を作る
imgは、dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの
-------
として実行してみると、次のようなエラーが返ってきました。
-------
発生した例外:
dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの(StaticCallExpression)
-------

インスタンス生成がうまく行っていないように思われるのですが、この場合どのように書けばよいのでしょうか。よろしくお願いいたします。

私にできるのは…

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/14(Thu) 10:26:09 No.2519

こんにちは。アークです。

二重起動を防止しつつ、既に起動しているプロセスにファイル名等を渡すだけなら一応可能です。
ウィンドウメッセージは送出するよりも受け取り方のが難しそうです。
標準出力を利用する方法はタイミングが難しそうです
環境変数を利用する方法は一度プロセスを再起動しないと反映されないようです。
本当はプロセス間で共通に使える変数が有ると良いのですが…。

取り敢えずクリップボードを利用して実現してみました。
ファイル名は「TestApp.exe」としました。
-----------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

クリップボードをクリアする
「[第一引数]」をクリップボードへコピーする

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素へ切り替える
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト1というテキストを作る
    その位置と大きさを{12,25,380,19}に変える
    その移動順を3に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を1に変える
  初期化終了する
終わり
  
  開いた時の手順
    テキスト1の内容を「[第一引数]」に変える
  終わり

  ボタン1がクリックされた時の手順
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり
  
  引数を更新する時の手順
    ファイルパスは、クリップボードの内容
    もしファイルパスが「」でないなら
      テキスト1の内容をファイルパスに変える
      クリップボードをクリアする
    もし終わり
  終わり

  アクティブ時の手順
    引数を更新する
  終わり
終わり
-----------------------------------------------------------
薦められる方法では有りませんが一応引数の内容を渡せます。

本格的なプロセス間通信を実装するのなら「メモリマップドファイル」を使って、
プロセス間で共通に使える変数を利用するのが良さそうです。
陸さんはCを遣られているので如何でしょうか。

Re^2: 複数起動時の処理について

投稿者: 投稿日:2019/11/13(Wed) 21:01:22 No.2518

 こんにちは。

 そういうことです。
 メディアプレイヤーソフト(WindowsMediaPlayerとか)をイメージしていただくとわかりやすいかと思います。

 それでは。

Re: 複数起動時の処理について

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/12(Tue) 23:46:41 No.2517

こんばんは。アークです。

例えば、バッチファイル1の内容が「start /b TestApp.exe "X:\MyApp\新規1.txt"」で、
バッチファイル2の内容が「start /b TestApp.exe "X:\MyApp\新規2.txt"」だったとして、
それを順番に起動したら多重起動しないでテキストのパス名だけがTestApp.exeに渡される、
という理解でよろしいでしょうか。

Re: 私なら…

投稿者: 投稿日:2019/11/09(Sat) 17:07:53 No.2516

 こんにちは。

 なるほど、タイマーを使うんですね。
 全然思いつきませんでした。
 まあ、「タイマー1の時間になった時の手順」で直接「メニュー項目がクリックされた」を呼び出すようにしたら、エラーになってはまってしまいましたが…。
 どちらにせよ、うまくいったので、大変助かりました。
 ありがとうございました。

 以上、今後ともよろしくお願いいたします。

私なら…

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/09(Sat) 15:21:37 No.2515

陸さん、こんにちは。アークです。

私ならこの様にします。
------------------------------------------------------------------------
窓というウィンドウを作る

窓へテキスト領域1というテキスト領域を作る
  そのドッキング方向を「全体」に変える

メニュー1というコンテキストメニューを作る
メニュー1へ切り取り項目というメニュー項目を追加する
  その内容を「切り取り(&T)」に変える
  そのクリックされた時の手順は、メニュー項目がクリックされた
メニュー1へコピー項目というメニュー項目を追加する
  その内容を「コピー(&C)」に変える
  そのクリックされた時の手順は、メニュー項目がクリックされた
メニュー1へ貼り付け項目というメニュー項目を追加する
  その内容を「貼り付け(&P)」に変える
  そのクリックされた時の手順は、メニュー項目がクリックされた
メニュー1へすべて選択項目というメニュー項目を追加する
  その内容を「すべて選択(&A)」に変える
  そのクリックされた時の手順は、メニュー項目がクリックされた
テキスト領域1のコンテキストメニューをメニュー1に変える

タイマー1というタイマーを作る
タイマー1の時間になった時の手順は、時間になった
タイマー1の間隔を200に変える

窓を表示する
待機する

// ここはメニューを表示させるコントロールに合わせる
テキスト領域1が右クリックされた時の手順
  タイマー1を開始する
終わり
  
時間になった時の手順
  メニュー項目がクリックされた
終わり
  
メニュー項目がクリックされた時の手順
  もし発生元が無なら
    もし[メニュー1の表示]が×なら
      タイマー1を停止する
      メニューが閉じた
    もし終わり
  そうでないなら
    タイマー1を停止する
    選択内容は、発生元の名前
    選択内容を表示する
  もし終わり
終わり

メニューが閉じた時の手順
  「メニューが閉じた」を表示する
終わり
------------------------------------------------------------------------
陸さんが望んでいるようなスマートな方法では無いかも知れませんが、
一応機能します。

▲ページの先頭へ

- WebForum -