喫茶XRAYトップページ


[3720] ウィンドウのクラス名とタイトル取得コード返信 削除
2010/9/20 (月) 15:43:53 Mr.XRAY
KSCさんのカキコで突然思い出しました.
ワード操作フォームExとエクセル操作フォームExの,
「ウィンドウのクラス名とタイトル取得コード」がUnicode対応に
なっていませんでした.

GetMemなどのメモリ確保はバイト単位ですので,メモリリークを起こす
場合があります.
この種のエラーはやっかいで,その時点で必ずしもエラーが発生するとは
限りません.場合によってはアプリ終了後ということになって,中々
どこが悪いコードなのか特定できないことが多いのです.

今のところ動作していますので(するハズ),適当な時期に修正してきます.
ただし,コピペして使用しないでください.
サンプルプログラム集にも同様の間違いがあるかも知れません.
この手のコーディングが初めてに近い方のために,参考コードを以下に
書いておきます.

以下のコードであれば,Unicodeとかに関係なく動作するハズです.
MAX_PATHはDelphiのバージョンによって違います.256または512です.
具体的な数値を与えてもいいのですが,便利なのでこの値を使っています.
-1としていることに大した意味はありません.
PCharを使ったコードの方がいいかな?

//-----------------------------------------------------------------
//  ウィンドウハンドルからウィンドウのタイトルを取得
//-----------------------------------------------------------------
function GetWindowTextStr(hWindow: HWND): String;
var
  Buffer : array [0..MAX_PATH-1] of Char;
  Len    : Integer;
begin
  //hWindowのタイトル部の文字列長さを取得(+1はNull終端文字分)
  //APIのGetWindowTextLengthも内部でこのコードを実行していてMSDNでは
  //他のプロセスの文字列長さ取得にGetWindowTextLengtを使用するように
  //との記述がある
  Len := SendMessage(hWindow, WM_GETTEXTLENGTH, 0, 0) + 1;
  //念のためNull文字で埋める
  FillChar(Buffer, Len, #0);

  //文字列を取得
  SendMessage(hWindow, WM_GETTEXT, Len, LongInt(Addr(Buffer)));
  Result := String(Buffer);
end;

//------------------------------------------------------------------
//  ウィンドウハンドルからウィンドウのクラス名を取得
//------------------------------------------------------------------
function GetClassNameStr(hWindow: HWND): String;
var
  Buffer : array [0..MAX_PATH-1] of Char;
  Len    : Integer;
begin
  //念のためNull文字で埋める
  FillChar(Buffer, Length(Buffer), #0);
 
  Len := GetClassName(hWindow, Buffer, Length(Buffer));
  //Result := String(Buffer);も結果は同じ
  SetString(Result, Buffer, Len);
end;

まいった.まいった.
KSCさんのカキコがなかったら気づかなかったかも知れません.


[3721] HttpApp.HTMLEncode返信 削除
2010/9/20 (月) 15:53:19 Mr.XRAY
もうひとつ.DEKOさんの雑談の10/09/18分にありますHttpApp.HTMLEncode()
です.
サンプルプログラム集でこの関数を使用しているのがあります.
ご注意ください.
QC#78903に具体的なテストコードがあります.
http://qc.embarcadero.com/wc/qcmain.aspx?d=78903

QC#87435にも
http://qc.embarcadero.com/wc/qcmain.aspx?d=87435

MECSUtilsの入手はDEKOさんのところにリンクがあります.


[3722] 複数のバージョンのワードやエクセルを切り替えて使用返信 削除
2010/9/20 (月) 16:00:11 Mr.XRAY
> ワード操作フォームExとエクセル操作フォームExの,

ついでに宣伝です.
こんなのUPしました.今のところ操作フォームExに添付していますが,
コードを整備したらサンプルプログラム集に移動する予定です.
でも,こんなの使う人いるのかな?
私は提供する側なので,テストの都合で必要があり作成したものです.

http://mrxray.on.coocan.jp/Delphi/plWordEx/B_VersionInfo.htm#03


INCM/CMT
Cyclamen v3.82