C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[29]: コントロール・フォントスタイル変更時のFont解放について [2]


(過去ログ 78 を表示中)

[トピック内 64 記事 (41 - 60 表示)]  << 0 | 1 | 2 | 3 >>

■46107 / inTopicNo.41)  Re[18]: コントロール・フォントスタイル変更時のFont解放について
  
□投稿者/ とっちゃん (450回)-(2010/01/26(Tue) 12:05:12)
とっちゃん さんの Web サイト
No46069 (たくボン さん) に返信

本筋?は収束したみたいなんで。。。質問させてください。

.NET Framework は諸事情から使えない(世の中のPCすべてで、現行のWin32APIと同じレベルで使えるようにならないとねー)ので
詳しくないんですが。。。

System.Windows.Forms.Control.GetParentFont

このメソッドってどこで見つけたんですか?
ヘルプからは見つけられませんでした。

> Label1.Font = null;
>
とした時(プロパティの実装???)で出てくるんですか?
Fontプロパティのゲットメソッド?
名前規約が異なるからそこから呼ばれる何かなんだと思いますが。


飽きたと書いているところで本当に申し訳ないんですが
よく知らない人にももう少し分かりやすく説明してくれませんか?



その代わり、Give & Take の精神にのっとりここは解説します。
っていうか。。。ここしかわかるところないしwww

> とした時の、System.Windows.Forms.Control.GetParentFont + 0x14〜0x17の
>
> 00000014 xor eax,eax
> 00000016 pop esi
> 00000017 pop ebp
> 00000018 ret
>
> は何してるのか教えてください。
> esi, eaxが何指してて、何を返却してるのかとか。
>
IL には見えないので、x86 のニーモニックという前提で書きますが...

eax は、この関数(System.Windows.Forms.Control.GetParentFontと思われる)の戻り値です。

x86 の機械語は、CALL 呼び出しで戻り値がある場合は、EAXに設定するという決まりがあります。
EAXだけでは表現しきれない場合は、EDXを使います。それ以上の場合はなんだっけかな。。。
決まりがありますが忘れちゃいました。自分でコンパイラ書いたりしないし...

eax の具体的な内容ですが

xor eax, eax

とありますので、ここでeax同士でビットごとの排他的論理和の演算を行っています。
結果どうなるかというと、どんな値であろうと0になります。
排他的論理和についての詳細は、Wikipediaなどをご覧ください。
もちろん、C言語や、各種のCPU向け入門書籍類を参照しても載ってると思います。


次に、esi ですが、このアセンブリの前の部分でどういうことをしていたかわかりませんが
017番地に着た時点で、関数呼び出し前に保持していた内容に戻しています。
具体的にそれがどのようなものなのかについては、呼び出し元がわからないためわかりません。

ebp は特に言及されていないようですが、それについては疑問はないということでいいんですかね?


あ、そうそう、WinForms のフォントですが、詳しく知りたいならGDI+のフォントとその周辺について調べるといいと思います。
内部実装にGDI+を用いていますので。MSDNとかでも書いてあったと思います。
もしかしたらプログラミングWindowsとかで読んだだけかもしれませんが。。。

http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx
が、GDI+のトップです。いろいろとちりばめられて書かれているので読むの大変かもしれませんが。

わたしは、GDI+のフォント等については、全く興味なしなので聞かれても答えられませんけど。
縦書きグリフないからねw

引用返信 編集キー/
■46113 / inTopicNo.42)  Re[19]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ななし (9回)-(2010/01/26(Tue) 13:02:26)
No46092 (たくボン さん) に返信

> いや、こんな当たり前のことは分かってるつもりだから。

そうでしたか。すみません。
このことって、通常のクラス設計から考えるととってもイレギュラーな実装なので、通常は「当たり前」と思う人は少ないと思って書きました。
IDisposable なオブジェクトに対するこんな実装って、一般的にはなるべくしないことだし、フレームワークの中にも他にはあまりないと思います。(アンビエントのことではないです。)

No46104 (たくボン さん) に返信

> これのどれ?って話だから。

どれというわけではないですが、それぞれについて次のように思いました。
ほぼ最初の返信の内容といっしょかもですけど...。

・危険だから絶対にしてはいけないのか?

危険なので、なるべくしない方がいいと思います。
現状の実装では、安全に解放するのはとても難しいことだと、今回再認識できました。
絶対してはいけないと言ってもいいぐらいです。
「絶対してはいけない」という表現よりは、「フォントの開放はGCに任せるべき」の方が私にはしっくりします。

・わかってない普通のプログラマが間違って解放しても問題ないように設計されているのか?

そうはなっていません。
たとえば、たくボンさんが書かれた検証コードでは、最後に
Dim fontHeight = Label1.Font.GetHeight()
を実行すると例外が発生する通り、アンビエントなフォントが Dispose されちゃっていることには変わりないので、問題につながる可能性があります(UseCompatibleTextRendering が true の場合には、より顕著になるようです)。

間違って書かれたのかどうかはフレームワークには判断できないので、解放する手段が提供されている以上、誤って実行した際に問題が発生するのは仕方がないことだと思います。

・一般的にはしないだろうけど、動作が理解できているなら解放処理を書いても特に問題はないのか?

上述の通りで、問題の発生を避けるために、
・現状の実装に極度に依存するコード
・別の箇所に弊害を及ぼす可能性のあるコード
は、なるべく書かないようにした方が良いと考えています。

No46107 (とっちゃん さん) に返信

純粋にご質問と解釈して書かせてもらいます。空気読めなくてすみません。
Font プロパティのセッターでは、フォントの相違を確認するためにゲッターにて現在のフォントを取得します。
そのゲッターでは、アンビエントの処理のために親のフォントを取得します。
アンビエントについては、たぶん詳しく説明されたサイトがあると思いますので、まずは調べられてはと思います。
メソッドの見つけ方は、様々な方法があると思います。

> http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx
> が、GDI+のトップです。いろいろとちりばめられて書かれているので読むの大変かもしれませんが。

昨日探してました。ありがとうございます。
解決済み
引用返信 編集キー/
■46124 / inTopicNo.43)  Re[19]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (349回)-(2010/01/26(Tue) 14:32:40)
2010/01/26(Tue) 14:33:35 編集(投稿者)

No46107 (とっちゃん さん) に返信
> ■No46069 (たくボン さん) に返信
> System.Windows.Forms.Control.GetParentFont
>
> このメソッドってどこで見つけたんですか?
> ヘルプからは見つけられませんでした。

JITがメタ情報から逆アセンブリで吐き出したメタデータ内にある。
もう少し詳しく書くと、
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll
0x003A1296-0x003A12A2
がGetParentFontの記述(オフセット位置は.NETのバージョンで変わると思うので気になるなら自分で調べてください)

ヘルプにあるだけが全てでないのは昔から同じ。

> その代わり、Give & Take の精神にのっとりここは解説します。
> っていうか。。。ここしかわかるところないしwww
>
>>とした時の、System.Windows.Forms.Control.GetParentFont + 0x14〜0x17の
>>
>>00000014 xor eax,eax
>>00000016 pop esi
>>00000017 pop ebp
>>00000018 ret
>>
>>は何してるのか教えてください。
>>esi, eaxが何指してて、何を返却してるのかとか。
>>
> IL には見えないので、x86 のニーモニックという前提で書きますが...

逆アセンブル時のJITが吐き出したアセンブリ。

> x86 の機械語は、CALL 呼び出しで戻り値がある場合は、EAXに設定するという決まりがあります。
> EAXだけでは表現しきれない場合は、EDXを使います。それ以上の場合はなんだっけかな。。。
> 決まりがありますが忘れちゃいました。自分でコンパイラ書いたりしないし...

丁寧な解説ありがとうございます。その部分の動作はわかってるんだけど、問題はその時のレジスタが指すオブジェクトが何かって聞きたかったんです。

# とりあえず解決済みにしときます。
解決済み
引用返信 編集キー/
■46128 / inTopicNo.44)  Re[20]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ とっちゃん (451回)-(2010/01/26(Tue) 16:19:01)
とっちゃん さんの Web サイト
No46124 (たくボン さん) に返信
>>System.Windows.Forms.Control.GetParentFont
>>
>>このメソッドってどこで見つけたんですか?
>>ヘルプからは見つけられませんでした。
>
> JITがメタ情報から逆アセンブリで吐き出したメタデータ内にある。
> もう少し詳しく書くと、
> C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll
> 0x003A1296-0x003A12A2
> がGetParentFontの記述(オフセット位置は.NETのバージョンで変わると思うので気になるなら自分で調べてください)
>
> ヘルプにあるだけが全てでないのは昔から同じ。
>
プライベートなメソッドがあるのは、普通に自分のクラスとかでもあるので別段おかしなことではないと思いますし
一応、C とか C++ はある程度使えるので、それくらいの知識はあります。知識がないのは主に .NET Framework 方面だし。。。
で、さすがにメタデータも見ないでそれなに?と言うのは気がひけたので、オブジェクトブラウザで見てみました。。。

が、やっぱりないですね。こんな程度の参照の仕方じゃ甘いのかな?
あんまり詳しくないからこれ以上さっくり調べる方法知らないんですよね。。。

ってことで、とりあえずこのメソッドが何ものかくらいは教えてもらえませんか?
たくボンさんは、私よりずっと知識があるようですし、わからないから質問したんだし。。。




>>その代わり、Give & Take の精神にのっとりここは解説します。
>>っていうか。。。ここしかわかるところないしwww
>>
> >>とした時の、System.Windows.Forms.Control.GetParentFont + 0x14〜0x17の
> >>
> >>00000014 xor eax,eax
> >>00000016 pop esi
> >>00000017 pop ebp
> >>00000018 ret
> >>
> >>は何してるのか教えてください。
> >>esi, eaxが何指してて、何を返却してるのかとか。
> >>
>>IL には見えないので、x86 のニーモニックという前提で書きますが...
>
> 逆アセンブル時のJITが吐き出したアセンブリ。
>
あ、間違ってないんですね。よかった。

>>x86 の機械語は、CALL 呼び出しで戻り値がある場合は、EAXに設定するという決まりがあります。
>>EAXだけでは表現しきれない場合は、EDXを使います。それ以上の場合はなんだっけかな。。。
>>決まりがありますが忘れちゃいました。自分でコンパイラ書いたりしないし...
>
> 丁寧な解説ありがとうございます。その部分の動作はわかってるんだけど、問題はその時のレジスタが指すオブジェクトが何かって聞きたかったんです。
>
すいません。余計な解説だったってことですね。
「問題はその時のレジスタが指すオブジェクトが何かって聞きたかったんです。」
ということですが...

その時のレジスタってどの時のレジスタですか?
問題にしている個所がわからないので、どれ指してるのかよくわからんのですよ。
日本語読解力が低くて申し訳ないんですが。

それともニーモニックは全然関係なくて、どうやって持ってきたのかわからないけど
GetParentFont というメソッドの戻り値が知りたいってことなんですかね?


以下独り言...
アセンブラの世界でオブジェクトと言ったら、普通は、.obj ファイルを指すし。。。
いまどきのPC向けマクロアセンブラなら構造体とかあるけどそれはオブジェクトとは言わないしなぁ。。。
esi は呼び出し前に持ってた値って書いてるからそれが何か?は呼び出し元がわからない以上
誰にもわからないとしか言いようがないしなぁ。。。言葉が足りなかったのかなぁ?
やっぱりGetParentFontが何者かがわからないとこれ以上は何が聞きたいのかわからない気がするなぁ。。。

引用返信 編集キー/
■46134 / inTopicNo.45)  Re[21]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (350回)-(2010/01/26(Tue) 19:01:06)
No46128 (とっちゃん さん) に返信
> ■No46124 (たくボン さん) に返信
> >>System.Windows.Forms.Control.GetParentFont
> が、やっぱりないですね。こんな程度の参照の仕方じゃ甘いのかな?
> あんまり詳しくないからこれ以上さっくり調べる方法知らないんですよね。。。

調べる方法は、色々あるけど俺もちゃんと勉強してるわけでもないし、そのやり方で合ってるのかもわからないけど。
やってること自体はそんな難しくないから誰でもできます(俺でもできてるくらいなんだし)

> ってことで、とりあえずこのメソッドが何ものかくらいは教えてもらえませんか?
> たくボンさんは、私よりずっと知識があるようですし、わからないから質問したんだし。。。


言語はVB、.NETのバージョンは。AnyCPUターゲットでコンパイルしてx86で動作。
細かい動作は確認してもらえばいいので、要点のみ。
検証のコードは、フォームにLabel1を貼り付けて(この時点でアンビエントプロパティ)、Form_Loadに

Me.Label1.Font.Dispose()
Me.Label1.Font = Nothing

と書いただけの簡単なもの。
これでデバッグした時のアセンブリで話を進めます。

まず、
Me.Label1.Font = Nothing
は、

0000004d mov ecx,dword ptr [ebp-3Ch]
00000050 mov eax,dword ptr [ecx]
00000052 call dword ptr [eax+000005FCh]
00000058 mov dword ptr [ebp-4Ch],eax
0000005b mov ecx,dword ptr [ebp-4Ch]
0000005e xor edx,edx
00000060 mov eax,dword ptr [ecx]
00000062 call dword ptr [eax+0000010Ch]
00000068 nop

0x52のcallでGCFONT.Form1.get_Label1の参照を引っ張ってきて、0x62でこいつのSystem.Windows.Forms.Control.set_Fontを呼んでますよね。
get_Label1の中はそんな複雑じゃないので割愛。気になったのはこのset_Fontする時の動作。

0000004a call FFFDD100
して、

System.Windows.Forms.PropertySto re.GetObject
んで、0x32から
System.Windows.Forms.PropertySt ore.LocateObjectEntry
に入って、反復と比較を繰り返しながら何かを返却してますよね?

その直後に、

00000037 test eax,eax
00000039 je 000000C0

と来て、その直後、
0000004f mov esi,eax
00000051 test esi,esi
00000053 je 00000070

と続いて、無条件に0x70

System.Windows.Forms.PropertyS tore.GetObject
前回と同じで、0x32のcallから
System.Windows.Forms.PropertySt ore.LocateObjectEntry
と続いてもう一度PropertySto reからオブジェクトを拾ってきてる。

それからだらだらとレジスタの操作が続いて、0x68のcallで問題のSystem.Windows.Forms.Control.GetParentFont。

この時点でのレジスタは
EAX = 00000000 EBX = 00000000 ECX = 0136EFD0 EDX = 0000001C ESI = 00000000
EDI = 0136EFD0 EIP = 7B1C9BE0 ESP = 041AE3C8 EBP = 041AE3D8 EFL = 00000246

こんな感じ。

この中で
00000010 test eax,eax
00000012 jne 00000019

の後、0x19に飛んで、

0x1dのinternal属性と、CanAccessPropertyの処理が終わって

0000002d test eax,eax
0000002f je 00000014

となって、一番知りたい

00000014 xor eax,eax
00000016 pop esi
00000017 pop ebp
00000018 ret

で戻り値返却。


んじゃ、一体GetParentFontが返却するのは何なのか?ってとこが知りたかったんです。
ここまでが■4606の書き込み。

PropertySto re.GetObjectで何を2回拾ってきてて、GetParentFontが何を返してるのか。


この辺りの動作がわかれば、もっとワクワクできると思ったので、詳しいなちゃさんとjittaさんに質問したんですけどねぇ・・・。
まだまだお二人の足元にも及ばなかったようです。


> 以下独り言...
> アセンブラの世界でオブジェクトと言ったら、普通は、.obj ファイルを指すし。。。
> いまどきのPC向けマクロアセンブラなら構造体とかあるけどそれはオブジェクトとは言わないしなぁ。。。

ここはすいませんでした。
PropertySto re.GetObjectを通るのはわかってると思ったのでオブジェクトって書いてました。

> esi は呼び出し前に持ってた値って書いてるからそれが何か?は呼び出し元がわからない以上
> 誰にもわからないとしか言いようがないしなぁ。。。言葉が足りなかったのかなぁ?
> やっぱりGetParentFontが何者かがわからないとこれ以上は何が聞きたいのかわからない気がするなぁ。。。

俺もアセンブリは詳しい方ではないし、全部独学なので用語とか間違っていたら指摘してください(頭悪いので、あまり多くの単語を覚えるのは苦手なんです)

明日から新案件で2日ほど博多に出張するので、出先では書き込みできないかもしれませんが有益な情報や面白い情報とかあれば教えてください。

Sto reはまた空白入れてます。
引用返信 編集キー/
■46137 / inTopicNo.46)  Re[22]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (382回)-(2010/01/26(Tue) 22:46:34)
本当に動作を知りたいけど知らないという人のために一応書きます。
アセンブリコードだけで読み解かないと意味がないという人やそんなこと分かってるって人はこの書き込みは無視して放っといてください。


GetParentFontが返すのは、コントロールが所属するコンテナがあればそのコンテナ側のFontプロパティの呼び出し結果、コンテナがなければnull。
件のコード部分は単にコンテナがない時にnullを返すコードで今回は通らない。

get_Fontはコントロール自身がFontインスタンスを持ってるかPropertiesのGetObjectで取り出して、持っていればそれを返し、持っていなければ所属するコンテナ側のFontを取り出すために上記のGetParentFontを呼び出す、これがアンビエント動作のための処理。

GetObjectが2回実行されるのは、1回目がコントロール(Label)自身に設定されているフォントの取り出し、これはnullなのでGetParentFontが呼び出されて、そこからコンテナのget_Fontの再帰呼び出しになり再度(今度はコンテナ側の)PropertiesのGetObject呼び出し(2回目の)、これはコンテナ(フォーム)側のFontインスタンスが返るので再帰はここで終わり、最終的にコントロールのFontプロパティの値としてフォームのFontプロパティの値が返る。

set_Fontは現在のFontがアンビエントなのか自身の設定なのか、Fontの内容に変化があるのか等々を確認するために、get_Fontで現在のFont値、PropertiesのGetObjectで自身に設定されているFont値(こっちは実際にはnull)をそれぞれ取り出す。
なのでset_FontではGetObjectが都合3回呼び出される(アンビエントでなければ2回)。


DisposeFontHandleに関しては結局Fontインスタンス自身のリソース開放とは直接は関係なし、なのでまだ使用中のFontインスタンスをDisposeということだけしないように、つまりインスタンス単位できちんと管理できていれば、現在の実装では問題ない。
ただし、現実的にインスタンスをきちんと管理すること自体が現在の実装依存かつ複雑なので、結局Disposeはしない方が無難なことには変わりなし。
管理さえ完璧にできているのであれば問題は起こらない(今回のようにアンビエントにDisposeとかはだめ)。

引用返信 編集キー/
■46138 / inTopicNo.47)  Re[22]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ Azulean (511回)-(2010/01/26(Tue) 22:50:46)
なぜ、BCL(標準クラスライブラリ)のソースコードを飛ばして、x86 ベースの話になっているんだろうか。
ソースコードを読めばもっと分かりやすいのでは?コメントもついている箇所もありますよ。

http://referencesource.microsoft.com/


# 私はAmbientProperties が出てきた時点で追いかけるのを諦めた。
引用返信 編集キー/
■46141 / inTopicNo.48)  Re[23]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (351回)-(2010/01/27(Wed) 05:47:34)
No46137 (なちゃ さん) に返信
> 本当に動作を知りたいけど知らないという人のために一応書きます。

はぁ、起きてみてみたらもっともらしいことだけ書いてるよなぁ。
本当の動作?全てわかってるならちゃんと全部書いてくれよ。どこで調べたのか。本当にそうなのか?

> アセンブリコードだけで読み解かないと意味がないという人やそんなこと分かってるって人はこの書き込みは無視して放っといてください。

嫌味なつもりだろうけど、こんな説明じゃどんな検証をして、断言してるのかわかんないから。教科書読んだ?

まぁ、もうこの話は俺は興味無くなってきてるからどうでもいいんだけど、最後の最後まで仮定の域を出ない妄想の話をいっぱいありがとう。大変興味深く読ませてもらいました。

まるでおとぎ話のようでした。

No 46138 (Azulean さん) に返信
BCLだけで今回のケース全部理解できます?

#今日から忙しくなるかもしれないし俺はもう十分満足できたので、解決済みにしときます。
解決済み
引用返信 編集キー/
■46144 / inTopicNo.49)  Re[24]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ Azulean (512回)-(2010/01/27(Wed) 07:32:15)
No46141 (たくボン さん) に返信
> BCLだけで今回のケース全部理解できます?
どこまで追いかければ、全部理解できるか分からないので、できる・できないの回答自体ができません。
理由は先にも書いたように、「調べるのを諦めた」からです。

get_Font の表面的な動作を追うには逆アセンブル結果よりは読みやすいと思いますが、
読める部分だけで解決するかどうかは分かりません。
(思ったより複雑そうなので、時間に見合わないと考えて諦めました)


# 一般的なケースを含めて言えば、extern 宣言だけのものがあったり、GDI+ をラップしているだけであったり、
# 本当に欲しい情報にたどり着けないケースがあることは知っています。
解決済み
引用返信 編集キー/
■46145 / inTopicNo.50)  Re[24]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (383回)-(2010/01/27(Wed) 07:52:42)
No46141 (たくボン さん) に返信
> ■No46137 (なちゃ さん) に返信
>>本当に動作を知りたいけど知らないという人のために一応書きます。
>
> はぁ、起きてみてみたらもっともらしいことだけ書いてるよなぁ。
> 本当の動作?全てわかってるならちゃんと全部書いてくれよ。どこで調べたのか。本当にそうなのか?

一応あなたが知りたいと書いたところをメインにざっくり書いただけです。
本当「に」動作が知りたいんなら、こういう動作してるよって書いてるんです。

> 嫌味なつもりだろうけど、こんな説明じゃどんな検証をして、断言してるのかわかんないから。教科書読んだ?
> まぁ、もうこの話は俺は興味無くなってきてるからどうでもいいんだけど、最後の最後まで仮定の域を出ない妄想の話をいっぱいありがとう。大変興味深く読ませてもらいました。
> まるでおとぎ話のようでした。

知りたいとか回答待ちとかわくわくとか書きながら興味なしですか?
※まあそんな気もしたから、本当に知りたいんじゃないなら無視してってわざわざ書いたんですが
一応ここが知りたいと書いてあった部分をまず書いたんですけどね。

フレームワークのソースコードとデバッグ実行して表示したアセンブリコードを元に処理内容の概要というか重要な流れを書いただけです。
知りたいと書かれていたから一応本当に知りたいのかもしれないとも思って書いたんですが、教科書とか妄想とか仮定とかおとぎ話とか、最初から信用しないなら書いても無駄でしたね。
だったらしつこく人のなまえを出さないでください。

解決済み
引用返信 編集キー/
■46146 / inTopicNo.51)  Re[25]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (384回)-(2010/01/27(Wed) 08:17:34)
あ、何のどこをみて調べた結果かとかくらいは書くべきだったと思います。
なんだかもうね、めんどくさくなっちゃったんです。

解決済み
引用返信 編集キー/
■46150 / inTopicNo.52)  Re[24]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ とっちゃん (452回)-(2010/01/27(Wed) 11:08:10)
とっちゃん さんの Web サイト
No46141 (たくボン さん) に返信
> ■No 46138 (Azulean さん) に返信
> BCLだけで今回のケース全部理解できます?
>
> #今日から忙しくなるかもしれないし俺はもう十分満足できたので、解決済みにしときます。

あの。。。質問勝手に閉じないでよ。。。おいらは解決してねーよ?

引用返信 編集キー/
■46151 / inTopicNo.53)  Re[25]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ とっちゃん (453回)-(2010/01/27(Wed) 11:23:10)
とっちゃん さんの Web サイト
No46150 (とっちゃん さん) に返信

No 46138 で Azulean さんが、Source は?と言ってくれたので、思い出しました。

おいらのマシン、.NET Framework 2.0(SPなし) のソースが一部だけど落としておいたの忘れてましたw
#今でもあるはずだけど、シンボルサーバーから落としてきたやつです

まぁ、現行バージョンとは同じじゃないと思うので、今とは違うと思いますが。
わからないといったメソッドも定義されていました。

いあ、本当申し訳ない。荒らすだけになってしまいましたね。

勝手に書いていいかわからないので件の GetParentFont() の実装だけ。。。
private Font GetParentFont() {
if (ParentInternal != null && ParentInternal.CanAccessProperties)
return ParentInternal.Font;
else
return null;
}
というコードでした。

このソースから類推すると
xor eax, eax
pop esi
pop ebp
ret
の部分は、else 以降の部分ですね。
eax の正体が、Font オブジェクトのインスタンスであることがわかりました。

ちなみに、ParentInternal は探し方が悪いのか、見つけられませんでした。

いあ、検索したら山のようにヒットしてしまって。。。
たぶん、Control 型の変数だと思うんですが(そうやって受けてるところがあった)、正直わからんです。

ってことで、これでやっと解決済みにチェックが入れられる。

いあ、元質問者様には本当に申し訳ないです。全く関係ない話題であらしてしまって。。。
改めて、お詫び申し上げます。

解決済み
引用返信 編集キー/
■46163 / inTopicNo.54)  Re[26]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ななし (10回)-(2010/01/27(Wed) 13:03:13)
No46151 (とっちゃん さん) に返信

> いあ、検索したら山のようにヒットしてしまって。。。

フレームワークのソースは、デバッグでステップインするように設定することもできますよ。
ソースは複雑だし、最適化や公開されていない部分の影響もあるので、思うようにステップするのはそれなりにコツが必要ですけど。
(ご存知でしたらすみません。)

ところで私、解決済みチェックのこと誤解していました。
元質問者さん以外はチェック状態を変えない方がいいと思ってたんですが、返信で別の人が、関連する別の質問をするときは解除するんですね。
私、勝手に何度もチェック付けちゃってました。失礼しました。

解決済み
引用返信 編集キー/
■46166 / inTopicNo.55)  Re[27]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ みきぬ (746回)-(2010/01/27(Wed) 13:13:58)
特にルールでは決められてないので、

No46163 (ななし さん) に返信
> ところで私、解決済みチェックのこと誤解していました。
> 元質問者さん以外はチェック状態を変えない方がいいと思ってたんですが、
という考えも、

> 返信で別の人が、関連する別の質問をするときは解除するんですね。
という考えもどっちもあっていいと思います。
# 別スレたてるべきだ、という意見もあるよね

私の場合は「ホントにそれは解決でいいの?」と質問者に確認してほしいときに外してます。
解決済み
引用返信 編集キー/
■46174 / inTopicNo.56)  Re[28]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ななし (11回)-(2010/01/27(Wed) 13:37:48)
No46166 (みきぬ さん) に返信
> という考えもどっちもあっていいと思います。

了解です。
余計なことしちゃってたかと、とっちゃんさんの返信(「これでやっと」のところ)みて焦りました。


> 私の場合は「ホントにそれは解決でいいの?」と質問者に確認してほしいときに外してます。

それ、親切でいいですね。
解決済み
引用返信 編集キー/
■46181 / inTopicNo.57)  Re[27]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ とっちゃん (458回)-(2010/01/27(Wed) 14:57:40)
とっちゃん さんの Web サイト
No46163 (ななし さん) に返信
> ■No46151 (とっちゃん さん) に返信
>
>>いあ、検索したら山のようにヒットしてしまって。。。
>
> フレームワークのソースは、デバッグでステップインするように設定することもできますよ。
> ソースは複雑だし、最適化や公開されていない部分の影響もあるので、思うようにステップするのはそれなりにコツが必要ですけど。
> (ご存知でしたらすみません。)
>
ソースとかなら最悪デバッグインという手もあるんですが、
ソースを取得した当時と今とじゃ全く違うといっていいくらい違う環境なんでw



> ところで私、解決済みチェックのこと誤解していました。
> 元質問者さん以外はチェック状態を変えない方がいいと思ってたんですが、返信で別の人が、関連する別の質問をするときは解除するんですね。
> 私、勝手に何度もチェック付けちゃってました。失礼しました。
>
このあたりは、みきぬさんが書かれてる通りではないかな?と思います。

ついついチェックし忘れたりしますがw<自分がw

解決済み
引用返信 編集キー/
■46251 / inTopicNo.58)  Re[26]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (352回)-(2010/01/28(Thu) 22:26:02)
No46151 (とっちゃん さん) に返信
> ■No46150 (とっちゃん さん) に返信


> 勝手に書いていいかわからないので件の GetParentFont() の実装だけ。。。
> private Font GetParentFont() {
> if (ParentInternal != null && ParentInternal.CanAccessProperties)
> return ParentInternal.Font;
> else
> return null;
> }

そ。GetParentFontの実装はこれが正解。さすがですね。


ふー、やっと出張から帰宅。
昨日は接待だったので見れんかったけど、偉そうななちゃさんがどこまで回答できたか楽しみにして帰ってきたんだけど、結局逃げたみたいですね。ヤレヤレ...。

でも、ここまで辿りつくのに時間かかったよなぁ。結局最後はとっちゃんさんだったし。

> ■No46145

> フレームワークのソースコードとデバッグ実行して表示したアセンブリコードを元に処理内容の概要というか重要な流れを書いただけです。

はい、ここ間違い〜。全然理解できてない。流れすら理解できてなかったよね。

> だったらしつこく人のなまえを出さないでください。

名前出されるのが嫌なら、ちょっと自分の発言に反省するか、もっとスキルを上げて発言しようや。

俺が100言いたいことあったとしたら、今やっと2くらい。残りの98全部説明するのも時間かかるし、言ってもわからんだろうから俺ももう遊ぶのはやめときます(笑)期待してたのが間違いだった。まぁ、当然説明する義務もないし:-P



あ、今わかったわ。「ついてこれてない」のはなちゃさんの方だったか。俺がついていけてないとばっかり思ってたからわからなかったよ。ごめんなさい。



でも、よくまぁなちゃさんくらいの理解力で「本当の動作」とか書けるよね。俺だったら恥ずかしくて書けないなぁwwwオヤマノタイショウだから自分の力量を誇示したいんだろうけどさ、イノナカノカワズだと大海に出た時溺れますよ:-P
解決済み
引用返信 編集キー/
■46263 / inTopicNo.59)  Re[27]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ とっちゃん (459回)-(2010/01/29(Fri) 00:30:42)
とっちゃん さんの Web サイト
No46251 (たくボン さん) に返信
>>勝手に書いていいかわからないので件の GetParentFont() の実装だけ。。。
と、書いてるのにもかかわらず、ソース転記してしまうのですか?
ということは、転記しても問題ないということをわかっていらっしゃるのですね。
さすがです。迷わないように自分も精進しなければいけませんね。


> そ。GetParentFontの実装はこれが正解。さすがですね。
>
大変申し訳ないのですが、私にはこれを正解とする根拠がわかりません。
たくボンさんが何度も書いている PropertyS tore.GetObject も出てきませんし
No46134 のコメントの内容と結び付けることができませんでした。

ただ単に私の技術力が足りないだけだと思うのですが
そう簡単に身につくものではないので、
これが正解であるという根拠を示して解説していただけないでしょうか。

出張やら接待やらがあるようなのでお忙しいと思いますので
忙しいようであれば、却下していただいて構いません。

無理をお願いしているのはこちらですので。だめならダメで一言いただけると助かります。

よろしくお願いいたします。

※疑問再噴出につき解決は外します。
引用返信 編集キー/
■46273 / inTopicNo.60)  Re[28]: コントロール・フォントスタイル変更時のFont解放について
 
□投稿者/ たくボン (354回)-(2010/01/29(Fri) 10:34:55)
2010/01/29(Fri) 10:35:22 編集(投稿者)

No46263 (とっちゃん さん) に返信
> ■No46251 (たくボン さん) に返信
> 大変申し訳ないのですが、私にはこれを正解とする根拠がわかりません。
> たくボンさんが何度も書いている PropertyS tore.GetObject も出てきませんし
> No46134 のコメントの内容と結び付けることができませんでした。
>
> ただ単に私の技術力が足りないだけだと思うのですが
> そう簡単に身につくものではないので、
> これが正解であるという根拠を示して解説していただけないでしょうか。

すいません。申し訳ないのですが、これは却下させてもらいます。
却下の理由は、
・アセンブリを見て、このコードがぱっと頭の中に出てこないのはまだ経験が浅いと判断したため。
・本来なら、この辺の実装部はプログラマが手を出さなくてもいい領域のため。
・今回の件は私の中では解決しましたが、アセンブリレベルでの解析のため明確な資料が無い部分もあり、それを公の場所で公開するのはライセンス抵触すると考えているため(解決に至るまでの調査もここで書くには膨大になったので)
・教える義務がない(独学でやってきてるので、俺の方法が正しいとは断言できない)

どうしても知りたいのなら、自己責任の上、自分で調べてみるか詳しい人に直接聞いてみるのがいいと思います。
解決済み
引用返信 編集キー/

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

管理者用

- Child Tree -