hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
MakeHPI/Delphi/chapter4 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

オブジェクトの情報を取得するsdk30a.png

ここではオブジェクトの情報を管理するHSPOBJINFO構造体の内容を取得してみようと思います。

開発環境

Borland Delphi 6 Personal

  • スクリプトに
      1
    
     
    
        objtext 1
    と書くと指定したオブジェクトのウィンドウテキストをメッセージボックスに表示する。
  • HSPOBJINFO構造体の取得方法を学ぶ。

ソースコード

fileobjtext.dpr
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
library objtext;
 
{$R *.res}
 
uses
  Windows, hsp3plugin in '..\hsp3plugin.pas';
 
function cmdfunc(cmd: Integer): Integer; cdecl;
var
  objinf: HSPOBJINFO;  // オブジェクト
  bm: PBMSCR;          // BMSCR構造体
  text: PChar;
  len: Integer;
  id: Integer;
begin
  exinfo.HspFunc_prm_next;
 
  case cmd of
    $00: begin
      id := exinfo.HspFunc_prm_geti;
      bm := exinfo.HspFunc_getbmscr(exinfo.actscr^);
 
      // 範囲外オブジェクトをエラー
      if (id < 0) or (bm.objmax <= id) then
        exinfo.HspFunc_puterror(HSPERR_INVALID_PARAMETER);
 
      // データ取得に失敗したらエラー
      if exinfo.HspFunc_getobj(exinfo.actscr^, id, @objinf) <> 0 then
        exinfo.HspFunc_puterror(HSPERR_DLL_ERROR);
 
      // 無効なオブジェクトもエラー
      if objinf.hCld = 0 then
        exinfo.HspFunc_puterror(HSPERR_INVALID_PARAMETER);
 
      // 有効なオブジェクト
      len := GetWindowTextLength(objinf.hCld);
      text := exinfo.HspFunc_malloc(len + 1);
      GetWindowText(objinf.hCld, text, len+1);
      MessageBox(bm.hwnd, text, 'オブジェクトタイトル', MB_OK);
      exinfo.HspFunc_free(text);
    end;
    else
      exinfo.HspFunc_puterror(HSPERR_UNSUPPORTED_FUNCTION);
  end;
  Result := RUNMODE_RUN;
end;
 
//-------------------------------------------------------------------
//      プラグイン登録関数
//-------------------------------------------------------------------
procedure reg_objtext(info: PHSP3TYPEINFO); stdcall;
begin
  hsp3sdk_init(info);
  info.cmdfunc := cmdfunc;
end;
 
//-------------------------------------------------------------------
//      関数のエクスポート
//-------------------------------------------------------------------
exports
  reg_objtext;
 
begin
end.

基本的にはHSPシステムが用意している関数を使えばいいのですが間違えると大変なことになる可能性があるので書いておきます。

オブジェクトのHSPOBJINFO構造体を取得するにはHspFunc_getobj関数を使います。
ヘッダファイルやドキュメントから関数の戻り値と引数を調べましょう。以下はドキュメントからの引用です。

int HspFunc_getobj( int wid, int id, void *inf );
function HspFunc_getobj(wid: Integer; id: Integer; inf: Pointer): Integer;

widで指定したウインドゥIDに配置されている、idで指定された番号のオブジェクト情報を取得します。
取得されたデータは、infで指定されたポインタにコピーされます。
HSP3の標準GUIを使用している場合は、infにはHSPOBJINFO構造体の内容がコピーされることになります。

つまりウィンドウ毎(BMSCR構造体)で管理されたHSPOBJINFOテーブルから該当するデータをコピーするわけですが、これをポインタのコピーと間違えないことです。
ポインタのコピーとは引数に指定したポインタ変数に、該当するHSPOBJINFO構造体のアドレスを渡すということです。

ただ渡すだけなら戻り値で渡せばいいので使用例がなくても「お?引数経由ということは書き込み用(指定したポインタの指す領域に書き込む)のかな?」と判断できます。

以下に簡単な(そのままでは使えない)使用例を間違い例と共に示します。

間違い例1
  1
  2
  3
var
  pobjinf: PHSPOBJINFO;
begin
  exinfo.HspFunc_getobj(wid, id, pobjinf); // どこをさしているのか分からないポインタを渡してしまう×
間違い例2
  1
  2
  3
var
  pobjinf: PHSPOBJINFO;
begin
  exinfo.HspFunc_getobj(wid, id, @pobjinf); // ポインタ変数のアドレスを渡してしまう×
正しい例
  1
  2
  3
var
  objinf: HSPOBJINFO;
begin
  exinfo.HspFunc_getobj(wid, id, @objinf); // HSPOBJINFO型変数のアドレスを渡す○

コメント


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
fileobjtext.dpr
223件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:30:54 (2436d)