: BMPオブジェクトがあるLISTBOXからテキストの取得

解決


 2006-08-25 12:16:12  No: 22983  IP: 192.*.*.*

OS:win2000 sp4
開発:Del6P

function GetSelText(hWnd: HWND; index: integer): string;
var
  len: integer;
  s: string;
  PC:PChar;
begin
  index := SendMessage(hWnd,LB_GETCURSEL,0,0);
  len := SendMessage(hWnd,LB_GETTEXTLEN,WPARAM(index),0);
  GetMem(PC,len+1);  // +1 for null-terminator
  SendMessage(hWnd,LB_GETTEXT,WParam(index),LParam(PC));
  SetString(s,PC,len);
  FreeMem(PC);
  result := s;
end;

指定インデックスのテキスト取得の為に上記の関数を作りました。
しかし、BMPオブジェクトを取得しているようでテキストが取り込めません。
テキストのみを取り込みたい場合どのようにすれば宜しいでしょうか?
ご存知の方がいらっしゃいましたらご教示お願いいたします。

編集 削除
えーと  2006-08-25 15:17:11  No: 22984  IP: 192.*.*.*

これは他アプリの ListBox ですか?
そうであれば、共有メモリを使う必要があります。ググってみてください。

編集 削除
 2006-08-25 18:25:30  No: 22985  IP: 192.*.*.*

他アプリのLISTBOXになります。
この関数はLISTBOXのハンドルを渡しさえすれば
他アプリのLISTBOXでも内容(テキスト)を取得できる事を
delphiとVBで作成したプログラムで確認しております。

対象プログラムはcanvasにTextoutしているようなのです。
canvasに書かれているtextは取得できないのでしょうか?

編集 削除
えーと  2006-08-25 18:40:21  No: 22986  IP: 192.*.*.*

> canvasに書かれているtextは取得できないのでしょうか?

できません。絵と同じですから。
たとえば、他アプリから、Delphi でつくったアプリの TLabel の
テキストをどうやって取得するか考えてみてください。

編集 削除
えーと  2006-08-25 18:41:42  No: 22987  IP: 192.*.*.*

> 対象プログラムはcanvasにTextoutしているようなのです。

ListBox ではないのですか?

編集 削除
 2006-08-25 19:29:47  No: 22988  IP: 192.*.*.*

なるほど・・・
絵と同じ。それでは完全に無駄ですね。
悪あがきせずに別の方法を検討してみます。

>> 対象プログラムはcanvasにTextoutしているようなのです。
>ListBox ではないのですか?
他アプリのListBoxです。
1要素につき画像とテキストのペアで表示されていました。

質問に答えて頂きありがとう御座います。
このスレはとりあえず解決とさせていただきます。

編集 削除
えーと  2006-08-25 20:02:59  No: 22989  IP: 192.*.*.*

> 1要素につき画像とテキストのペアで表示されていました。

あぁ、オーナードローですね。それではやはりテキストの取得は困難でしょう。

編集 削除
へびあし?  2006-08-25 20:50:59  No: 22990  IP: 192.*.*.*

>> 対象プログラムはcanvasにTextoutしているようなのです。
オーナードローであるかないかは無関係で、要はそのListBox.Items[]データが
設定されているかないかでしょう。
オーナードローであっても、普通は次のようにItems[]データを元にテキストを描画すると思いますけどね。それならテキストを取得できますよ。
 with ListBox do
  Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]);
ところで、最初に示されたコードは多分どこかで見つけたサンプルを丸写ししたんでしょうけど、この行は不要でしょ?
  index := SendMessage(hWnd,LB_GETCURSEL,0,0);

編集 削除
通りすがり  2006-08-25 20:57:15  No: 22991  IP: 192.*.*.*

> ところで、最初に示されたコードは多分どこかで見つけたサンプルを丸写ししたんでしょうけど、この行は不要でしょ?
>   index := SendMessage(hWnd,LB_GETCURSEL,0,0);

この行がない場合に、
「リストボックスの選択している行の文字列を取得する」場合、どうするんでしょうか。
indexがわからなければとれなさそうですが・・・。
# もしかして、WPARAMに-1とかしたら選択している行として扱われる?わけないですよね・・・

編集 削除
えーと  2006-08-26 00:40:22  No: 22992  IP: 192.*.*.*

> この行がない場合に、
>「リストボックスの選択している行の文字列を取得する」場合、どうするんでしょうか。

関数の形が

function GetSelText(hWnd: HWND; index: integer): string;

のようになってるんだから、呼ぶ前に index を取得するんでしょう。
逆に、あのコードでは、そのほかの項目は取れませんね。

> オーナードローであるかないかは無関係で、要はそのListBox.Items[]データが
> 設定されているかないかでしょう。

そのとおりですね。
外部にテキストと画像の配列を持ってるような場合は取れませんが。

編集 削除
えーと  2006-08-26 00:51:23  No: 22993  IP: 192.*.*.*

あぁ、でも関数の名前が GetSelText() なのね?

なんで index 渡す必要があるのだろう?

編集 削除