[delphi-users:1439] 動作している最中にメソッド名を取得したい

588 views
Skip to first unread message

Delフサギコ

unread,
Oct 24, 2010, 12:22:52 AM10/24/10
to delphi...@freeml.com
こんにちは。

Delphi2010か、XEかで、RTTIの拡張というのが行われたと思うのですが
全然使ってないので使い方がわかりません。

Button1Clickイベントや
自分で定義したメソッド名の内部から
そのメソッド名を取得するのは
どのようにしたらいいのでしょうか?

Delphi2007時代のRTTIではそのような動作は実現できなかったと思いますが
RTTIが拡張されてきっとできるんだと思います。


VB.NETでいうところの、下記のような事がしたいわけです。
@IT総合トップ > Insider.NET > Module キーワードで定義されたモジュール名の取得
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40442&forum=7

これができると
たとえばですが、メソッド内にログ書き出しメッセージを入れておくと
メソッド名を指定しなくても、どのメソッドからきている
ログなのかがわかるようになるので
コピペしてログ出力コードを埋め込むなどということが楽になりそうなのです。

--
Delフサギコ ミ・д・彡 <delfu...@gmail.com>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
「あなたはマック?それともマクド?」気になるコトを調査しました!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gaNYW
-----------------------------------------------------[freeml by GMO]--

かぶだれ

unread,
Oct 28, 2010, 4:21:03 AM10/28/10
to delphi...@freeml.com
こんにちは。かぶだれです。

>Button1Clickイベントや
>自分で定義したメソッド名の内部から
>そのメソッド名を取得するのは
>どのようにしたらいいのでしょうか?

これはattributeやらの新RTTIの勉強も兼ねてと思い探ってみたのですが、
できませんでした。
アセンブラでスタックから自分のアドレスを取得してcontextに設定しGetTMethodするとか、なんかわけのわからんおまじないが必要かも。

文字列によるMethod実行がpublic宣言でできるようになってました。
速達、動的クラスローディングに使用します。
TValue配列にパラメーターを型無しで渡せるというのは、プラグインには超ありがたい。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
★おにぎりせんべい分布調査★気になるコトを調査しました!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gbMQ9

中村拓男(自宅)

unread,
Oct 28, 2010, 5:10:13 AM10/28/10
to delphi-users
中村@ブレーンです。

新しい、RTTI は Delphi 2010 Handbook(Marco Cantu) が詳しいですが、
お望みの機能は無さそうです。

実行中のメソッドの取得は RTTI ではなくてスタックフレームの解析になると思いますが、
JCLでMAPファイルを埋め込めば可能だったと思います。
新 RTTI と組み合わせれば面白いことができるかもしれません。

2010年10月28日17:21 かぶだれ <delphi...@freeml.com>:

--
----------
naka...@asahi.email.ne.jp from Hino city Tokyo Japan


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習の予定も共有スケジュールに登録しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gbN9A

Delフサギコ

unread,
Nov 1, 2010, 8:46:17 PM11/1/10
to delphi...@freeml.com
お返事遅くなりました。
かぶだれさん、中村さん、調べていただいてありがとうございます。


簡単ではないようですね。残念です。

JCLは使っていますがあまり慣れていないので
「MAPファイルを使って」
というだけでは、私にはハードルが高そうなので
とりあえずあきらめておく事にします。


2010年10月28日18:10 中村拓男(自宅) <delphi...@freeml.com>:


> 中村@ブレーンです。
>
> 新しい、RTTI は Delphi 2010 Handbook(Marco Cantu) が詳しいですが、
> お望みの機能は無さそうです。
>
> 実行中のメソッドの取得は RTTI ではなくてスタックフレームの解析になると思いますが、
> JCLでMAPファイルを埋め込めば可能だったと思います。
> 新 RTTI と組み合わせれば面白いことができるかもしれません。
>
> 2010年10月28日17:21 かぶだれ <delphi...@freeml.com>:
>> こんにちは。かぶだれです。
>>
>>>Button1Clickイベントや
>>>自分で定義したメソッド名の内部から
>>>そのメソッド名を取得するのは
>>>どのようにしたらいいのでしょうか?
>>
>> これはattributeやらの新RTTIの勉強も兼ねてと思い探ってみたのですが、
>> できませんでした。
>> アセンブラでスタックから自分のアドレスを取得してcontextに設定しGetTMethodするとか、なんかわけのわからんおまじないが必要かも。
>>
>> 文字列によるMethod実行がpublic宣言でできるようになってました。
>> 速達、動的クラスローディングに使用します。
>> TValue配列にパラメーターを型無しで渡せるというのは、プラグインには超ありがたい。
>>
>>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新メンバーを便利な@招待機能で一気に登録しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gcUmK

中村@ブレーン

unread,
Nov 4, 2010, 3:07:50 AM11/4/10
to delphi...@freeml.com
中村@ブレーンです。

Delフサギコ さんは書きました:


>簡単ではないようですね。残念です。
>
>JCLは使っていますがあまり慣れていないので
>「MAPファイルを使って」
>というだけでは、私にはハードルが高そうなので
>とりあえずあきらめておく事にします。
>

いや、そう難しくはないですよ。要は
デバッグ情報を正しく埋め込んで、ちょこっと
コードを書くだけです。

ネットを探すと JclDebug の使用例がが結構落ちてます。
「JEDI Code Library」
http://delphi.wikia.com/wiki/JEDI_Code_Library

また、JCL 自身にもJclDebug のサンプルプロジェクトが含まれています。

JCL の Docs/expert.html の
「Debug Extension for JclDebug unit」に JclDebug ユニットを
利用するために必要なデバッグ情報(JDBG情報)の埋め込み方が
書いてあります。JCLをインストールすると必要な
ツール が IDE にインストールされます。

蛇足:

JCL2.2 って既に XE をサポートしているんですね。
Delphi 6, C++Builder 6 や Turbo Delphi も未だ
サポートしているのが素晴らしいです。

----------
東京都 日野市 中村拓男


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
★おにぎりせんべい分布調査★気になるコトを調査しました!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gd1dD

Delフサギコ

unread,
Nov 10, 2010, 10:33:49 PM11/10/10
to delphi...@freeml.com
こんにちは。
お返事おそくなりました。

教えていただいたページを見て、次のように書きまして動作確認しました。
ありがとうございます。

uses
JclDebug;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(CurrentFunctionName);
end;

{$W+}

function CurrentFunctionName: string;
begin
Result := jcldebug.GetLocationInfoStr(Caller(1));
end;

メッセージは、次のような表示になります。
---------------------------
Project1
---------------------------
[00478AE6] Unit1.TForm1.Button1Click (Line 35, "Unit1.pas")
---------------------------
OK
---------------------------

デバッグ情報の埋め込みは、
IDEメニューに組み込まれている
JCL Option メニューから、設定を次の通りにしています。

Debug info converter
Generate jdbg files
Always enabled

Insert JDBG data into the binary
Always enabled

バイナリに埋め込むとか、jdbgファイルを作るとか、そういうのが必要なのですね。
勉強になりました。


2010年11月4日16:07 中村@ブレーン <delphi...@freeml.com>:


> 中村@ブレーンです。
>
> Delフサギコ さんは書きました:
>>簡単ではないようですね。残念です。
>>
>>JCLは使っていますがあまり慣れていないので
>>「MAPファイルを使って」
>>というだけでは、私にはハードルが高そうなので
>>とりあえずあきらめておく事にします。
>>
>
> いや、そう難しくはないですよ。要は
> デバッグ情報を正しく埋め込んで、ちょこっと
> コードを書くだけです。
>
> ネットを探すと JclDebug の使用例がが結構落ちてます。
> 「JEDI Code Library」
> http://delphi.wikia.com/wiki/JEDI_Code_Library
>
> また、JCL 自身にもJclDebug のサンプルプロジェクトが含まれています。
>
> JCL の Docs/expert.html の
> 「Debug Extension for JclDebug unit」に JclDebug ユニットを
> 利用するために必要なデバッグ情報(JDBG情報)の埋め込み方が
> 書いてあります。JCLをインストールすると必要な
> ツール が IDE にインストールされます。
>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
学園祭で撮った写真をMLにアップしよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=gfaVN

Reply all
Reply to author
Forward
0 new messages