( ゚Д゚)ノ Delギコ猫のプログラミング相談室part2

このエントリーをはてなブックマークに追加
550524
>>524
自己解決しては見たけれど、理想には程遠いのです。
だれか、もっと頭の良いコードに改造してください(;´Д`)

↓一応問題を解決したコード。実行してみれば分かるけど … ねえ
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1000404430
551524:01/09/14 03:57
少し改良しましたが、まだなんとも。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1000404430
の2です。よろしくです。
552424です:01/09/14 08:11
亀レスですが、OpenToolsAPI、面白いですね。

いろいろ調べてみて
http://www.delphi32.com/vcl/lists/sc_n_73.asp
ここのソースが参考になりました。

IDEClock 1.1ってのが非常に参考になります。
IDEのメインウィンドウに現在の時刻を表示するだけですが、
このソースを参考にしてタイマーイベントを取って来れました。

何故かDelphi6ではOpenToolsAPIが大幅に変更になったようで
以前のバージョンのソースがそのままでは使えません。

Kylixを意識して改変したのかもしれませんが、それならそれで
Borlandはこれに関する技術情報をきちんと開示してほしいです。

折角なのでわたしの調べた範囲でOpenToolsAPI関連のリンク張っておきます。

[ソース関係]
http://www.tempest-sw.com/opentools/examples.html
http://www.delphi32.com/vcl/lists/sc_n_73.asp

[FAQ,TIPS,LINKS]
http://www.gexperts.org/opentools/
http://cjandia.freehomepage.com/me/works/delphi/articles/newide/newide.html
http://www.geocities.com/SiliconValley/Way/9006/ota.html
http://delphi.about.com/library/weekly/aa033099.htm

他にもあるかも
553528:01/09/14 12:01
>>540-541
無事kylixでも動きました。
一部のLabelのみフォントサイズ指定も出来ました。

If Ctrl.Components[I].Tag = 1 Then
で解決です。
>>552
参考になります。アリガト
555Delギコ:01/09/14 12:50
   ∧∧   / ̄
@_(,,゚Д゚) < D5-D6のVersion間互換性、低すぎない?
⊂,,__つつ.  \_

 Font.Name = #65325#65331' '#65328#12468#12471#12483#12463
この文字列を

 Font.Name = 'MS Pゴシック'
この文字列に変換するのを

OpenToolsで組み込んで欲しいよ。
   ∧∧   / ̄
@_(,,゚Д゚) < D5-D6のVersion間互換性、低すぎない?
⊂,,__つつ.  \_

 Font.Name = #65325#65331' '#65328#12468#12471#12483#12463
この文字列を

 Font.Name = 'MS Pゴシック'
この文字列に変換するのを

OpenToolsで組み込んで欲しいよ。
556デフォルトの名無しさん:01/09/14 12:52
>555
VCL ソースみりゃ、一発だろ?
557Delギコ:01/09/14 13:16
    ∧ ∧  ・・・・。
    ( ゚Д゚)
  〜( uu) ニジウ カキコ スマソ

D6入れるスペース作るために
D4アンインストしたら
D5が道連れでお亡くなりになられました。

がんばたけど…コードエクスプローラがどうしても現れない…カナチイ
558デフォルトの名無しさん:01/09/14 13:38
>>557
D5 再インストールすればよい話では?
559デフォルトの名無しさん:01/09/14 14:19
>>556
これか!DFM ファイルの形式が今までのと同じになるね。

[HKEY_CURRENT_USER\Software\Borland\Delphi\6.0\FileFormat]
"DFMFormat"=dword:00000000
560デフォルトの名無しさん:01/09/14 15:40
EJBのsessionBeanでstatelesssessionを作っているのですが、
EJBクラスの中のejbActivate(),ejbPassivate()というメソッドが何のために必要なのかわかりません。
教えて下さい。
561デフォルトの名無しさん:01/09/14 15:52
>>551
深さ優先で検索してるけど、幅優先で検索したほうが
早いかと。一度 node の items をスキャンして、
パス名に一致する items が見つかれば、そこを掘って行く
てな感じで。

つーか、それ以前にそういうメソッドがありそうで
ならないんだが…
IndexOf ではキャプション文字列での検索が出来ないし…
562Delギコ:01/09/14 16:11
   ンマーー ネコ ビックリ
  ∧ ∧∩
  (゚Д゚,,)ノ
   |  つ
   | ⊂)〜
    ∪

>>559
すげーよ。アンタが大将♪アンタが大将♪アンタが大将♪

動作確認しました。
FileFormatってキーを自分で作成するのね。

最初、ネ夕かと思テシマタ。

大サンクスコ
>>562
某国のことだからそのくらいの細工はしているだろうとは思ったが
ほんとにあるんだね。

ただそれやっちゃうとせっかく UNICODE にした意味がなくなっちゃうんだろうね。

EUC とか Shift-JIS とかを考えなくてすむので、CLX アプリにとっては
大事な機能です。
>>559 はブラクラ。もとい IDE が立ち上がらなくなります。
誰か削除願いを。
565Delギコ:01/09/14 17:46
>>564
      ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚)つ < 折れのではうまくいってるが?
   し― ∪     \___________

IDEが立ち上がらなくなったら
レジストリ元に戻せばいいことだろ。なぜ削除願いをせねばならん?

デマ野郎なら放置PLAY。
>>560
EJBって何?
>>566
Enterprise JavaBeans?
568Delギコ:01/09/14 18:01
  ヤッカイ ナリ
     ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ― (,,゚Д゚) < 例のdesignintf問題が発生した!
   し― し-J   \___________

D6のプロパテエデタ分離問題で

[致命的エラー] DesignEditors.pas(517): ファイル 'Proxies.dcu' が見つかりません

これが解決できないニャ。
MLもそれにまつわるの読んだのに…
ろくに答えられてる投稿がない…


TDefaultEditorを継承したプロパティエディタを作成すると
uses に DesignEditors;を追加する必要があるのに
これがコンパイルできないってドユコトYO!!

◆[Delphi:59073] Re: DsgnIntf 周りの変更について
> Borland のニューズグループでは designide.dcpを design time package
> の requires に追加しろ、というレスポンスが付いてました。
これをもう少し詳しく氏ってたら、具体的に教えてくださいな。

◆[Delphi:59359] Re: delphi6>Proxies.dcuが見つかりません
ここは詳しいけど、結局解決方法載ってないね。
569Delギコ:01/09/14 18:05
    ∧ ∧  /
    (;゚Д゚)<  いきなりEJBの話ふられても
     |つ つ  \
   @   |   エンタープライズ ト イエバ トレッキー
    ∪ ∪


 ∧ ∧ ──────
 (゚Д゚ ) <  ワープ速度5くらいで、ガンバッチクレ>>560
 ⊂⊂ \──────
    \  〜 ────
     し し ─────
   ビュヲーン
>>568
だからぁ。Proxies ユニットは単体で再配布されず、かならず designide パッケージ
内から提供されているものを使え。っていっているの。
この変更は Delphi4 からなんだから、いまさら文句言うなよ。
繰り返し、パッケージを使え。と書かれていたのに、今まで修正しなかったほうが
悪い。
>>568
一回しかやったこと無いんであやふや
Libフォルダにdesignide.dcpがあるから
パッケージのウインドウのRequireの欄に追加したらOKだったような
572Delギコ:01/09/14 18:39

      ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚)つ < >>570 全然わからん・・ワン
   し― ∪     \___________
 あ。ネコダッタ

>かならず designide パッケージ
>内から提供されているものを使え。っていっているの。

っていわれましても具体的なやり方がわかんないがな。

>今まで修正しなかったほうが悪い。
修正方法わからんのにどうやって直せと…ご無体な


   ∧∧   / ̄
@_(,,゚Д゚) < >>571 Libフォルダにdesignide.dcp
⊂,,__つつ.  \_ あるけど、バイナリファイルみたいなんですが…
           これをどうやて、修正すればいいニャ??
573デフォルトの名無しさん:01/09/14 18:42
自分のコンポーネントを含んでいるパッケージに
パッケージマネージャ経由でパッケージを追加しろ。っていってんだよ
574Delギコ:01/09/14 19:19
    ∧ ∧   / ̄
  ∩(,,゚Д゚) < 匍匐前進並に…ちょっぴり進んだ。
⊂,,⌒ ,,つつ.  \_ >>573サンクス
   ̄ ̄

だけど今度は変なエラーが出てきました。

[エラー] : 'EditProperty' の宣言がすでに定義されているものと異なります



なんか、TDefaultEditorのEditPropertyの実装変わってない?

procedure EditProperty(const Prop: IProperty; var Continue: Boolean); virtual;

D6HELPの"EditProperty 例"と違うんだけど。
実装が変わったのか、ヘルプの誤植なのか。
相対的に見ればどちらも正しく、どちらも間違えている。
絶対的に見てどちらが間違えているかは、開発者に聞くしかない。
576Delギコ:01/09/14 23:48
    _________
   //////////\           ミ☆
 ////////// ギコ.\   ミ☆
  ̄┃ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄┃ ̄
   ┃☆       ____ ┃
   ┠─┐   ‖∧ ∧ ‖ ┃  / ̄ ̄ ̄ ̄ ̄ ̄
   ┃  │   ‖(,,゚Д゚)..‖ ┃<  プロパティエディタ。難しいよ
   ┃°│     ̄∪∪ ̄  ┃  \______
 ━┻━┷━━━━━━━┻━━━━━━━━━━━━

 教えてくれた人。サンクス。
 なんとか解決できました。

 互換性のなくなるコンポ少なきゃいいけどね。

 >>575
 やぱり伝統的にHELPがイマイチ出来てないだけかも。
 
577デフォルトの名無しさん:01/09/14 23:52
MP3のタグ読み書きコンポない?
578483:01/09/15 00:11
>>484
灯台下暗し。さんきゅー
579デフォルトの名無しさん:01/09/15 00:37
質問です。

MDIアプリケーションにおいてメニューをToolBarで代用しているとき、
子ウィンドウを最大化すると「最小化」「閉じる」などのボタンや
子ウィンドウのアイコンが表示されなくなってしまいます。
こいつをうまいこと表示するにはどうすればいいんでしょうか。
580デフォルトの名無しさん:01/09/15 01:11
Delギコたん萌え
581素直じゃないね:01/09/15 09:49
>>575
誤魔化してるだけだな(w
582newsgroups.borland.comも見ようね:01/09/15 10:04
>>572
newsgroups.borland.com

borland.public.delphi.opentoolsapi

proxiesあたりを検索すれば引っ掛かるよ
あちらでもすでに報告されてますね
583Delギコ:01/09/15 16:04
    ∧ ∧   / ̄
  ∩(,,゚Д゚) < 英語でこの説明読むのきついね
⊂,,⌒ ,,つつ.  \_
   ̄ ̄
http://newsgroups.borland.com/cgi-bin/dnewsweb?cmd=listall&group=borland.public.delphi.&utag=

webから見れる分の過去ログ数が少ないニャ。
584デフォルトの名無しさん:01/09/15 21:46
質問があります。

TUIWebBrowserを使ったアプリケーションを作成しているのですが、
OfflineプロパティをTrueにセットしても、オフラインでNavigateして
くれません。ヘルプを見て、DownloadControlにCS_OFFLINEをセット
してみたのですが、それでもダメでした。
TUIWebBrowserを使って「オフライン作業」を実現するにはどうすれ
ばよいのでしょうか。
585Delギコ:01/09/15 21:56
  ∧ ∧  ・・・・。
  (;゚Д゚)
  U  U
〜|  |
  U U

ActionManegerの使い方が全然わからん。
>>584
とりあえずDelphiのバージョンとIEのバージョンを書こうよ。
とりあえず、質問とかするときは、いろいろとバージョンを
書いておいたほうが良いと思う。

俺は、TUIWebBrowserよりもEmbeddedWbを進めておく。
ttp://www.euromind.com/iedelphi/
587Delギコ:01/09/15 22:45
      ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ゚Д゚) < わかった!アクトン マネジャ!
      /⊃⊃   \
    〜(  ノ       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ⊂`J    ピョン
      ||
      ||
      ωωω

  マネジャノ カテゴリ ドラッグアンドドロップ ゴク ビミョウニ バグ アルミタイ
  サイショ デキナクテ ウロタエタ ヨ

>>584
MLで聞いたら親切な作者さんが出てくる事が多いぞ。
588584:01/09/15 23:15
>586
そうですね、迂闊でした。
とりあえずEmbeddedWbをインストールしたので今から
使ってみるです。
589デフォルトの名無しさん:01/09/15 23:34
以下の仕様を満たしたコンポーネントの作り方を教えてください。

TImage を配置。マウスボタンが押されたらへこんだ状態の
絵(DownedImage)を表示、マウスボタンが離されたら元に戻った状態の
絵(RaisedImage)を表示、マウスカーソルがボタン上にある場合は
アクティブ(ActivateImage)状態を示す画像を表示

これをコンポーネント化したもの。ただし、

コンポーネント上でマウスボタンを押す。
押したままの状態でコンポーネントから離れたい値まで
カーソルを持っていき、そこでマウスボタンを離す。

通常、この場合は MouseUp イベントは発生しない。
これをうまく処理して、普通のボタンのように振舞う
画像コンポーネントをつくりたい。
SpeedButton
591Delギコ:01/09/15 23:50
  ∧ ∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (,,゚Д゚)  < >>589ジブンで考えろや。
  U  ,つ゛  \____________
〜|  |
  ∪∪ ジブンデ ツクッタ ソース デモ アップ シロ
    ヒトノ ソース ツクッテ ヤルホド ヒマジャネェ

   ∧∧ プハー  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (,,゚Д゚) =3  < アクトンマネジャ保持のActionが1つもない状態で
   | つ日~~    \ActionListのActionカテゴリをActionMainMenuBarにD&Dしようとしても
  〜|  )       出来ないにゃ。
   U U
  コレ バグ チャウ?

  ActionManeger系のGUIかなり使いにくいぞ。
592デフォルトの名無しさん:01/09/16 01:25
>>589
TSpeedButtonパクれ。
593Delギコ:01/09/16 02:27
ActionManegerをひととおり使ってみたが・・・
見事なくらいバグだらけというか。使えない、、、はぁ。。。溜息

D6Pro版持ってる人はActMane使えなくても
Demos\ActionBandsをさわってみるとわかります。

  ∧ ∧ タイヘン カナシイ.....
  (,,゚Д゚)
  U  U
〜|  |
  U U

FormのDockingもそうだけど。(パソナでも使えるからDemos\Dockingで遊んでみー)
新方式のUIに関しては、なぜいつもこんなにいいかげんな
実装をするんだろう。>>某蘭土

ちゃんとデバッグしてるのか?

開発チームがFormのDockingもActionManegerも同じなのかなあ。
だとしたら、ずいぶんとデバッグをいいかげんにするチームらしい。

一度バグ入りで実装しちゃった部分は
将来的にも治らない事多いし。なんかヤだなあ。
>>593
使い方間違っているんじゃないの?
595名無しさん:01/09/16 03:57
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>594 デモsrcの遊び方に間違いも何もないと思うが
  (O)----(O)U-U) \__________
596Delギコ:01/09/16 05:02
  ∧ ∧    /
  (,,゚Д゚)  < ActManegerこんなかんじでどーよ
  |⊃ ,⊃   \
〜|  |
  ∪∪

Demos\ActionBands\WordPad.exeで
Windowを目イッパイせまくして
Customizeダイヤログ呼び出してそのまま閉じる
  >>ツールバー太いまま。

また、CustomizeMenuそのものを消してみる。
  >>settings.datを削除しない限り2度とCustomize不可能。

ダイアログを開いてツールバータブを開いて
EnabledFalseになっているMainMenuActionBar1を選択
[戻す]ボタンヲクリック
  >>MainMenu消えます。

こんな代物をユーザーさんに使ってもらうわけには....
597Delギコ:01/09/16 05:04
   ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜''~(,,゚Д゚) < それにしても・・・
  UU'UU    \________

あと、Actionのショートカットキーって
ActionManegerではカスタマイズできないみたい。


Borlandって妙な所抜けてない?

IDEのキーバインド変更もいまだに簡単には出来ないし。
GExper氏ラ無い頃はCtrl+Aもなくて苦労したよ。
D6からはCtrl+Aも定義されてるけど。
borlandのプログラマー社員って何人勤めてるのかな?
もう営業しかいないのかな?

社長しかいません。
600589:01/09/16 11:20
TSpeedButtonはだめ。
だって、ボタンより小さい画像しか使えないし、
ボタンを現す矩形が表示されてしまうし。
601ひとりごと:01/09/16 11:38
function IntToZeroStr(dt,keta:integer):string;
var i:integer;
begin
// Result:=''; を入れなくてもエラーにならないし
// 単独で試験したら動くからいいのかと思ったけど
// 連続して使うとなんか動作変なんだよね
// つい忘れちゃうから注意しないとダメだな

 for i:=1 to keta do begin
 Result:=char(ord('0')+(dt mod 10)) + Result;
 dt:=dt div 10;
 end;
end;
602デフォルトの名無しさん:01/09/16 11:57
>>601 そんな面倒なことしなくても、
format の精度指定子と間接指定子で簡単に実現できるよ

function IntToZeroStr(dt,keta:integer):string;
begin
 result := Format('%.*d',[keta,dt]);
end;
603デフォルトの名無しさん:01/09/16 11:59
>>589
Flatをtrueにしてみ。
604デフォルトの名無しさん:01/09/16 12:01
うん、だから、Trueにするとね、
マウスカーソルをFlatButton上に持ってきたときに
やはりボタン周囲に影が表示されてしまうでしょ。
それに、どちらにせよボタンより小さい範囲にしか画像が
表示されないし。たとえば、スキンを利用した
ソフトを作りたい場合に、それじゃあ困るわけね。

いや、いいんだけどさ。面倒だから書き込んだだけだし。
605Delギコ:01/09/16 12:15
>スキンを利用した ソフトを作りたい場合に

 ∧ ∧      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (,,゚Д゚)  <  そんなら結局リージョンも必要だろ?
  | つ[|lllll]). \_________
〜|   |
  ∪∪  ヂミチ ニ ガンバッタラ?

一朝一夕で適当に出来るもんじゃないし。
作り方、さらっと教えれるもんでもないが・・・

Compo探した方がよくない?
606601:01/09/16 12:18
>>602
それだと入力が 指定した桁数以上あるとズレてしまうから

function IntToZeroStr(dt,keta:integer):string;
begin
 dt:= dt mod power(10,keta); // こっちを入れるか
 result := Format('%.*d',[keta,dt]);
 result := copy(Result , length(Result)-keta,keta); //こっちを入れる必要があるかと
end;
607疑心暗鬼:01/09/16 12:27
はじめまして!

疑心暗鬼といいます。
ちょっと質問なんですけど、
下記のVBのプログラムの結果が同じにならないのは
どうしてなのかご教授願えますか?

質問内容

Fix関数でDoubleとVariantで同じ値が
入っているのに、Fixすると結果が違ってしまう。

環境
VB6 + SP6
Win2000

よろしくお願いします。


'********* ここからプログラム
Dim a As Variant
Dim b As Variant
Dim c As Variant
Dim t As Variant

Dim d As Double
Dim e As Double
Dim f As Double
Dim tt As Double

Dim g As Variant
Dim h As Variant
Dim i As Variant
Dim ttt As Variant

a = 24600
d = 24600
g = 24600

b = 24000
e = 24000
h = 24000

'VariantでDoubleの時と同じ結果を出すための苦肉の策
c = a * 1000 / b * 1000 / 10
t = Fix((c + 5) / 10) / 10

'Doubleでの正しい結果が出る
f = d / e * 100
tt = Fix(f + 0.5)

'Variantでは正しい結果が出ない
i = g / h * 100
ttt = Fix(i + 0.5)

MsgBox "ただしい計算結果 " & Str(t) & vbCrLf & _
"ただしい計算結果 " & Str(tt) & vbCrLf & _
"誤ってる計算結果 " & Str(ttt)

'********* ここまで
608疑心暗鬼:01/09/16 12:34
っていうか
VB専用のスレありましたね。

すいません。逝ってきます。m(_ _)m
609Delギコ:01/09/16 12:45
  ∧∧∩゛  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (,,゚Д゚)ノ < 逝ってらっしゃい。
  U  /   \____________
@|  |
  ∪∪  イヤ イイイミデ デス・・・
      ガンバテネ
610疑心暗鬼:01/09/16 13:54
>> 609
ガムバリマス
アリガトウゴデス
611デフォルトの名無しさん:01/09/16 15:03
おれ、まえから言いたくてしょうがなかったんだけど、
COPY関数で、特定の場所から右側の文字列を取得したいときに
以下のようにする人がいっぱい居るよね(このさい
Del6のRightStr関数のことは考えずに)

S := Copy( S, Index, Length(s)-Index+1 );

でも、これって

S := Copy( S, Index, MaxInt );

というふうに、長さ指定に式を使わなくても簡単に
実現できるんだよね。S の範囲を超えた部分は
自動的に無視されるから。
つーか、VCLのソースでもこういう使いかたしてる。
612デフォルトの名無しさん:01/09/16 15:06
>>606

Del6を使っているならば、

result := RightStr( Format('%.*d',[keta,dt]), keta );

でOKかと思われますが。
613Delギコ:01/09/16 15:11
      ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚) < また重箱墨つつき。
   し― し-J   \___________

D6のTControlbarのバンドがTCoolbarと同じになってる。
・・・話題に出てたっけ?

TCuteControlbarがあるからどうでもいいけど。(D6で動くかな)


>>611
微妙に知ってるが、時々書いてしまう。癖かもね。
614Delギコ:01/09/16 16:04
しぶとく、D6お試しレビュー
           _________
    ∧ ∧  /
    ( ゚∀゚)< をっ!TToolBar.Customizableケッコ。イイかも。
     |つ つ  \_________
   〜   |
    ∪ ∪

  WinAPIのToolbarカスタマイズダイアログがラップされてる
  TActMngよりも、こっちの方がよさそうだよ。
  ん?保存先はRegistryだけなのかな?
  あれ?ヤパリ微妙なバグだらけ・・・
  どんどん、Toolbuttonが消えるぞ。 
  OnCustomize系イベントが沢山あって何とかなりそうだけど。

  そういえばTMenubarを使わなくても
  TToolbar.Menuプロパが存在するね。
  これまたAltに対応しないという、バグありまくり。。

  なんだかなあ。
>>614
TToolBar.Customizable系は,コード見ると分かるけどWindowsコモンコントロールを
直接呼んでいるからOSのバグじゃないかな?
616Delギコ:01/09/16 16:25
 まだ、ソースは見てないんだけど。そなんだ。>>615クスコ

 普通のアプリ(WWWCとかBecky2)みたいに
 カスタマイズダイアログの左項目に
 元々のデフォルトButtonを表示させることは出来るのかな?

 ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄
   ∧ ∧    マターリ
   (,,゚Д゚)∫
   /  つ旦O
 〜(._[ ̄ ̄ ̄.]
       ̄ ̄ ̄
617名無しさん:01/09/16 16:43
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>604 チョピーリ参考までに
  (O)----(O)U-U) \__________

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=library&vi=1000625853&res=1

こんな規模になりますよ。流用・応用は御自由に
ちなみにこれだけではコンポ登録できまへん。
他にも沢山^2ソースが要りますテヘ
618604:01/09/16 19:27
いや、リージョンは必要ない。
そこまで複雑にするつもりは無いし、
スキンつうか、ごく普通のアプリでも使うし。
619592:01/09/16 20:59
>>600
だから、TSpeedButtonのソースをパクれって。
標準ではないことをやろうとしているのだから、標準のものだけで解決しようとせず、
似たもののコンポーネントのソースを見て、自分で作ればいいだけではないか。
ボタンを表す矩形が表示されるなら、矩形を描画している部分を実行しなければいい。
ボタンより小さい画像しか使えないなら、ボタンいっぱいに描画するように実装すればいい。
>>619
威張るな。うるさい。
もしかして P か?
621デフォルトの名無しさん:01/09/16 21:54
ビットマップ画像、ビットマップBがあるとして、
画像Aの中から画像Bに完全一致する場所を見つけたいの
ですが、もっと速いアルゴリズムは無いものでしょうか。

ここで、Bは、Aよりも小さいことが保証されています。
また、A,Bともに16色ビットマップです。

最初は、B画像の左上をA画像中の(X,Y)に重ね、
TBitmap.ScanLine を使って1ピクセルずつ比較、
これを全てのX,Yについて調査していましたが、
速度が遅く、あまり使い物になりませんでした。

そこで、Delで実装されている機能ならすこしは
早いだろうと、次のようなコードを考案しました。

1.B画像の左上が、A画像中の(X,Y)に重なるようにし、
その状態でXOR合成した画像を作成する。2画像が一致するならば、この段階で重ねた部分の画像全てのピクセルの値はゼロになっているはずだ。
2.重ねた部分の画像を抜き出し、それを左右に2分割する。
3.左半分の画像を、右半分の画像にOR合成する。
4.出来上がった画像を、さらに2分割し1〜2を繰り返す。
5.最終的に、横1ピクセルの画像が出来上がる。このすべての
ピクセル値がゼロならば、画像は一致することになる。

これでもまだ速さに不満が残るんですが。
622デフォルトの名無しさん:01/09/16 21:57
>>621
文字列検索に使うBM法を応用してみたら?
623デフォルトの名無しさん:01/09/16 22:00
>Delで実装されている機能
ではなくて,Windows で実装されている機能だな。それは。
BitMap を直接扱っている限り ScanLine より速くはならない。

繰り返し ScanLine を参照するのをやめて,いったん配列に読み出してしまうことを
考えてみたら?

あと処理速度を気にするのなら比較コードを書く前にどれくらいの時間がかかっているのかを
調べなさいね。
とりあえずTBitmapはやめて自前の二次元配列にした方がいいよ。

アルゴリズムはmpegエンコーダがそんなことやってたような。
たしか3D NOW!だのSSEを使ってアセンブラレベルで高速化してたな。
>Bは、Aよりも小さいことが保証
ってあるけど,小さなBを,繰り返しAから探し出すんだったら,
Aの(部分の)ハッシュ値を作って枝狩りするのが常套手段。

この説明で分からなかったらプログラムの手を止めて適当なアルゴリズム
事典を買いなさい。
626デフォルトの名無しさん:01/09/16 22:14
私はハッシュを実際にプログラムで使用したことが無く、
その考え方しか知らないのですが、

Bと一致する可能性のある全てのA部分について、
ピクセルの並び方からハッシュ値を作成し、
ハッシュ値をキーにして位置を探り出す

という事でしょうか。
627名無しさん:01/09/16 22:15
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>618 自分の本当に求める自分仕様は、自分しか作れません
  (O)----(O)U-U) \__________

と思うがどうよ
あれがおいらの自分仕様
あとはDelphian WorldかDSPに似たの無い?
とかとしか言いよう無いッス
>621
2次元配列化するだけで10倍くらい高速化されそうな予感。
640x400x16の全検索程度なら力技で十分いけそう。
629621:01/09/16 22:25
やりたい事をもう少し詳しく書きます。

大きい画像 Sourceと、
小さい画像

P[0],P'[0]
P[1],P'[1]
...
P[n],P'[n]

があります。

Source 中で P[0] に一致する部分があれば、その部分を P'[0] に置換する。

....

Source 中で P[n] に一致する部分があれば、その部分を P'[n] に置換する。

P[0] から P[n] についてこの作業を行うわけです。
630621:01/09/16 22:27
ありがとう、それではまず2次元配列にしたものを
つくってみようとおもいます。
631デフォルトの名無しさん:01/09/16 22:40
最初に縮小した絵を作成してそれでラフチェックしてからってのは
どうよ
>631
縮小したりハッシュ値生成したりする必要は無くって
単に最初に8ドットおきに比較してやればいいね
633デフォルトの名無しさん:01/09/16 22:56
>>632
それきっと駄目
なんで?
635デフォルトの名無しさん:01/09/16 23:05
>>634
飛び越してしまう危険があるから、とかかな。
Aは8ドットおきで読むにしても、Bは1ドットづつずらしてAの注目点に重なるピクセルだけ
比較していけばまあ飛び越す危険はないか。でもあんまり速くなさげだがどうよ?
頂点抽出以上の速度向上法はないだろうね
あとはMPEGの仕組みの勉強
637デフォルトの名無しさん:01/09/16 23:14
質問です。開始値が 0 だと保証されている配列の長さを得るとき、

High( ArrayVar )+1 と Length( ArrayVar )

どちらが効率良いでしょか。
638デフォルトの名無しさん :01/09/16 23:37
>>621
どのくらいの大きさの画像からどのくらいの大きさの画像をどのくらいの時間で
検出したのか参考に書いてよ

で、どのくらいの時間以内ならOKなのかを書いてくれればサジェスチョンできるかもよ
634>635
一番単純な比較に比べてましってだけで最速には程遠いね。
ただ氏が凝ったコードひねり出してる間に
さっさと実装してさっさと処理できる問題だと思うってだけ。
最悪のケースも考慮しなくてよさそうだし。
あるいはバックグラウンドで動かしてればいいし。
技術的な話じゃなくてごめんよ。

>637
High, Lengthはどっちもおんなじ。なので+1,-1のつかないほうが速い。
そこらへんの違いが気になるならCPUウィンドウで確認してみればいいよ。
640補足:01/09/16 23:49
>637
ArrayVarがコンパイル時にサイズが決まってる配列なら
定数に変換されるので+/-1つくつかないに関係なくおんなじ。
641デフォルトの名無しさん:01/09/16 23:51
現在、以下の使用で
作成しています。

【1】100 X 100程度の画像 Source から、20X20 程度の大きさの
画像 P[i] に完全一致する部分を検索し、
その場所を同サイズの画像 P'[i] で置き換える。
【2】この検索→置換を、P[0] から P[n] の画像について行う。
(n の値は5〜20程度)

【3】P[0] から P[n] まで調べたら、これを1ステップとする。
同ステップ内で、同一の領域が置換対象になる事は無い。
例えば P[0] を見つけ出し P'[0] に置換した場合、Source 中の
その領域は、P[1] 〜 P[n] までの画像の置換対象には
ならない。つまり、統一のピクセルが複数回置換されることは無い。
【4】1〜3を繰り返し、アニメーションを行う。

この1ステップ(つまりアニメの1コマ)を1/10秒ほどで
行いたいです。

もう少ししたら、暫定版のプログラムEXEを
アップするので、そうしたらもっとイメージを
つかんでもらえると思います。
642641:01/09/17 00:14
アップしました。
起動したら、コンパイルボタン(左上の0101と書いてあるボタン)
をクリックし、再生ボタン(中央上にある右向きの三角ボタン)
をクリックしてください。

http://www.geocities.co.jp/SiliconValley-Sunnyvale/1607/BitmapReplace.zip

赤枠の画像中から、
緑枠の左側に一致する画像を探し出し、緑枠右側の画像で置換します。

緑枠は2組あります。

両方の緑枠の置換前画像に一致する場合は、
左上にある緑枠で指定された置換式のほうが優先されます。

サンプルに同梱してある、工場.bmpをドラッグドロップして、
コンパイル→再生してください。

このぐらいの大きさになると、少し処理が重くなるんです。
643641:01/09/17 00:16
あ、画像を変更するときは、かならず■ボタンで
アニメーションを停止させてください。
止まってるように見えても、置換されていないだけで
アニメーションタイマーは動いていますから。
644デフォルトの名無しさん:01/09/17 00:22
あのー。
どこの誰かが作った実行ファイルを信用しろと?

ソースを出しなさい。
>641
なかなか面白いね。が、確かに重いみたい。

これなら高速化は簡単で前回書き換えのなかった部分を
検索しない(=前回書き換えた部分の周辺のみを検索する)
ようにすればいいよ。
これが最終目的なら、アプローチに疑問を感じるのって俺だけ?
Delギコさんこないとサビシイ
647641:01/09/17 00:51
おくれました。
これがソースファイルです。
自作ライブラリを使用しているので、
ソースに含まれる全コードのうち、半分以上は
今回のプログラムでは使用していません。

http://www.geocities.co.jp/SiliconValley-Sunnyvale/1607/BitmapReplaceSource.zip
648645:01/09/17 01:05
>646
このプログラムのミソはシステムが何も理解していないのに
結果的に工場が稼動し、迷路を抜けちゃうところ。
これってプログラマブルなLIFEだね。
思わず点滅信号機とグライダー作っちゃったよ。

ちなみに>645はLIFEでも使われてる高速化手法だよ。
>>647
KMath.pasがないYO
650641:01/09/17 01:17
ちなみに、元ネタは Visulan という、京大の人が
開発したビジュアルプログラム言語です。
検索すれば論文が見つかると思います。
これかな?ちょっと読んでみよ。
http://ryujin.kuis.kyoto-u.ac.jp/ylab/yamakaku/Papers/Thesis/Thesis.html
>>649
あ、すみません
修正しておきました。
ちなみに、Del6でコンパイルするとエラーが出ると思います。
型付定数への代入を許可しておいてください。
653Delギコ:01/09/17 01:25
    ∧ ∧   / ̄
  ∩(,,゚Д゚) < >>627 いいこと言うね。
⊂,,^__つつ.  \_

スキン化するくらいなら
折れなら必ずリージョンまで入れる。
リージョン入れないBitmapButtonは途中段階だな.
だって、完成したら自分以外の人にもかなり有用そうだもの。

でも、XP的には必要になったときにリファクタすればいいのかな。

    ∧ ∧  それにしても、画像系の話。
    ( ゚Д゚)  トテーモ高度ちゃう?
  〜( uu)  読んでるだけでワクワクシチャーウYO.

 アプローチ???
>>652
KDialogs_untInputDlg.DFMもないーよ
>>654
たびたびスマンです…
再び修正しました
なんていうか、人にソースを渡すって予想以上に大変なんですね。
コンパイルに必要なファイルを一覧表示してくれる機能はないものでしょうか。
>656
コンパイルされたdcuみれば大体見当はつくんじゃない。

ソフトのほうは地図とパターンを別画像に分離して欲しいかも。
あと編集はイメージエディタやペイントに任せて、
タイムスタンプが変更されたらリロード・コンパイルして欲しい。
まあ、どうでもいい部分ではあるけど。
>>655
あれ? 入ってないみたいな
>>651
それそれ、そのページを読んで
面白そうだからちょっと作ってみたんです。
透過色とか、キーボード入力なんかも欲しかったので。
>>655
がーっ
またか…
だんだんイライラしてきたYO

面倒なんで、ライブラリフォルダの中身全部同梱しました。

http://www.geocities.co.jp/SiliconValley-Sunnyvale/1607/BitmapReplaceSource.zip
これを機会に、ライブラリ.pas から別の ライブラリ.pasを
参照する事を極力避けようかと思います。

あるライブラリを一つ渡そうとすると、
参照している全ての ライブラリ.pas を渡さないといけない…
>>660
KDialogs_untInputDlg.DFMがないんすよー。フォームファイル
pasだけしかない…
印刷したら全部で66ページもある。しかも用紙切れっぽい...

まだ全然読んでないんだけどこれって言語と呼べるほどの
汎用性や広がりを持ち得るのかな?
みたところたまたま迷路を抜けてたまたまソーティングされて、
たまたまチューリングマシンが動いてるだけのようにも見える(藁
いまライブラリを整理しているので、
ちょっとまってください。
KDialog もその他のものも、
今回のプログラムで使用してないんですね。
ライブラリが参照しているだけで。
665641:01/09/17 02:43
やっと整理できました。
ライブラリパスをデフォルトの状態に戻して
コンパイルチェックしたので、今度こそ足りないファイルは無いと思います。

http://www.geocities.co.jp/SiliconValley-Sunnyvale/1607/BitmapReplaceSource_For_D6.zip
666デフォルトの名無しさん:01/09/17 02:46
>>665
ヤター! コンパイルできたYO!
667デフォルトの名無しさん:01/09/17 02:49
>>663

広がりというか、大元のコンセプトは

グラフィックのプログラムは
グラフィックによって記述しよう

という事じゃないかな。
668デフォルトの名無しさん:01/09/17 04:34
Builderのコンポ、インストールできる?
669デフォルトの名無しさん:01/09/17 06:53
>668
出来ない
670Delギコ:01/09/17 13:09
 ∧ ∧   / 結城タンのJavaデザパタ本を買った。
 (,,゚Д゚) <  ・・・・・・
  |つ つ  \  3800円もした。
@|  |
  ∪∪ 人月の神話とXP本も買ったら万円dダ…
671デフォルトの名無しさん:01/09/17 14:02
項書換系の応用もの?。っていうか項書換系そのものか。
672 ◆WjpJ5Iis :01/09/17 15:46
ML に OfficeXP の愚痴,書き込むなよ。
それに返事付けるなよ。

...早く NEC/NTT 軍団出てこないかな。
> 3800円もした。

この分野では、"も"ってほどじゃないような…。
674デフォルトの名無しさん:01/09/17 16:39
Delphi6 Personalでリソースにアイコンを詰め込みたいのだが
どうしたらよいのだろう...
675support ◆WjpJ5Iis :01/09/17 16:45
>>674
Personal にもリソースコンパイラ/イメージエディタがあるじゃないか

icons.res ができているなら適当なソースコードで
{$R icons.res}

*.rc があるなら,プロジェクトファイルに .rc を追加。

まだ何も作っていなければイメージエディタで .res を作ってしまえ。
676デフォルトの名無しさん:01/09/17 16:47
質問です。
Imageでクリッカブルマップを作りたいのですがどうしたらいいでしょうか?

たとえば640x480のimage領域のうちimage座標からTOP100、Left100の場所に128x128の
クリック範囲を作りたい場合などです。
677デフォルトの名無しさん:01/09/17 17:11
>>675
アイコンを新規で追加ではなく既存ファイルから追加はできないかな?
icon1.ico icon2.ico ...って複数のアイコンがあって
それをまとめて icon.res にしたいのだが...
Delphiにはその手のツールは付属してない?
>>676
空のTImageやTShapeを貼るとか。
679676:01/09/17 17:21
>>678
最初はそれを思いついたんですけどCSV(もしくはiniファイル)から座標を持ってくるらしくて、、、
それに画像情報がコロコロと変わるらしいんです。

「画像のクリッカブルポイントをソースを触ることなくテキスト修正だけで触れるようにしろ」って事らしいです。
可能ですかね?

別にImageじゃなくてもPaintBoxでもShapeでもいいんです。
今はPaintBoxでがんばってますが。
680support ◆WjpJ5Iis :01/09/17 17:23
>>677
>その手のツール
イメージエディタ。

細かい操作が必要なら x.rc ってファイル作って

Icon1 icon icon1.ico
Icon2 icon icon2.ico

て書いて、プロジェクトファイルに追加。
681デフォルトの名無しさん:01/09/17 17:33
>>680
ラジャー∠(@O@) ビシッ!
rcからコンパイルすることにいたしまする。
>画像情報がコロコロと変わるらしいんです
だったらなぜ
TPaintBox.Left
TPaintBox.Top
TPaintBox.Width
TPaintBox.Height
に「プログラムで」代入しようとしないんだ?
683682:01/09/17 17:49
補足
座標だけでなく個数も変わるなら「プログラムで」Createすればいいだけだが。
684Delギコ:01/09/17 18:02
      ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ― (,,゚Д゚) < KylixMLって配信方法とか変わった?
   し― し-J   \___________

ずーっと。とどかないニャリ?
685support ◆WjpJ5Iis :01/09/17 18:10
>>684
9/6 の #717 / Re: TIdSMTP って
が最後
>>685
同じく。
687デフォルトの名無しさん:01/09/17 18:25
>>670
お、買ったね。どうだい感想は。>Delギコ氏
俺はガンマ本は挫折して、
いろんな本から慣れてったんだが、
この本がもっと早く出ていればなぁと思った。
デザパタはVCLを参考にするのもいいけど
Javaのクラスライブラリも参考にすると良いよ。
>>679
TListかもしくはTRectの動的配列を宣言しておいて、
起動時に設定ファイルから読みこむ。
で、後はマウスイベントで座標を判定して処理する。
とか。
689名無しさん:01/09/17 18:32
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>679 遊ぶDelphiだかいう本で範囲内をクリックしたか判定するサンプルが
  (O)----(O)U-U) \__________
690デフォルトの名無しさん:01/09/17 18:51
>>679
仕様の詳細や判定領域の数がわからんので、
>>688の方法が正攻法だね。
数少なくて決まっているなら、PaintBoxが手っ取り早い。

なんか、感じからすると動的なオブジェクトの生成もできなさそうなので、
(違ったら失礼(違ってなくても失礼か))
時間があれば、>>688の方法をできるようになっておいた方がいいぞ。
691小心者:01/09/17 20:01
コマンドラインのパラメータをみるのにParamstr(1)でやろうかと思ったんですが
これだと半角スペースのところで途切れてうまくファイル名を見ることができないです。
一応関連付けの時に"%1"を付ければうまくいくんですが、付けないときでもうまくいくようにしたいです。
なにかいい方法はないんでしょうか?
TeraPadでもそうだから無理なのかな。
>>691
そういう仕様なので仕方ないです。文句はMSにいってくり。
693692:01/09/17 20:17
あーていうか、それを何とかしたいと言ってるのか。
とりあえずCmdLine変数でパラメータ丸ごととって、
自力で解析するしかあるまい。
空白を発見したら、実在するファイル名かどうか調べるのか?
いやでも、「c:\un ko」というのがパラメータがあったとき、
「c:\un」という絶対パス指定ファイルと「ko」という相対パスのファイルが
あったときの判定も考えると・・・えらい面倒だな。
694デフォルトの名無しさん:01/09/17 20:25
for i:=1 to ParamCount-1 do
begin
 if S = '' then S := ParamStr(i);
 if FileExists( S ) then
 begin
  FileNames.Add( S )
  s:='';
 end
 else
  S := S + ' ' + ParamStr(i);
 Inc(i);
end;
695デフォルトの名無しさん:01/09/17 20:29
{ファイル名にカンマが含まれていたらアウト。}

S := '';
for i:=1 to ParamCount-1 do
begin
 {ドライブが含まれるなら直前までをファイル名とみなす}
 if ExtractFileDrive( ParamStr(i) ) <> '' then
 begin
  if S <> '' then FileNames.Add( S );
 end
 else
  S := S + ' ' + ParamStr(i);
end;
696>691:01/09/17 20:31
そういうしょうもない小細工してるアプリって
いつか誤動作してトラブルになるからやめて欲しいかも
697デフォルトの名無しさん:01/09/17 21:01
私、Javaは嫌い。しかし 一つ うらまやしい 有る。
クラス プロパティ に 定数 していできる 良い。

THoge = class
public
 const Milk:string = 'yukijirusi';
end;

みたいに やりたい。
698Delギコ:01/09/17 21:38
      ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚) < クラスプロパティに定数。別にうれしくない
   し― し-J   \___________

 THoge = class(TObject)
 private
  class function ConstValue: String;
 end;

class function THoge.ConstValue: String;
const
 Value: String = 'イッテヨシ';
begin
 Result := Value;
end;

やれるとしたら、この程度かしら?

定数なんてWM_とか接頭語をつけて区分すればいいだけでないの?
699デフォルトの名無しさん:01/09/17 21:40
書き換えられないことを保証したいだけなら
property にするなり、引数なし関数にすれば?

可視性をクラス内に限定したいのなら出来ないけど、上に書いた方法で
対応できないかな?

どちらにしろ言語仕様の重箱つつきにあまり意味はない。
700デフォルトの名無しさん:01/09/17 21:44
>>698
プロパティ版。FConstString も ConstString も同じ可視性を
持つから情報隠蔽としては役に立たないコードだ。

THoge = class(TObject)
private
 FConstString : String;
 property ConstString read FConstString;
end;
701デフォルトの名無しさん:01/09/17 22:17
>>700
こうでは?

THoge = class(TObject)
private
 FConstString: string;
public
 constructor Create; //ここでFConstStringを設定
 property ConstString read FConstString;
end;
702デフォルトの名無しさん:01/09/17 22:20
>>701
あれ?確かに 697 では public。
698 にひきづられちゃったよ........
703Delギコ:01/09/17 22:37
      ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚)つ < それだとインスタンス毎に領域とるでしょ。
   し― ∪     \___________
704デフォルトの名無しさん:01/09/17 22:51
>>694-695

for i:=1 to ParamCount-1 do
        ↓
for i:=1 to ParamCount do では?
705デフォルトの名無しさん:01/09/18 00:17
>>695
if S <> '' then FileNames.Add( S );
の後で S := ''; も必要だYO
706デフォルトの名無しさん:01/09/18 00:26
>>703
じゃあこうかな?

THoge = class(TObject)
private
 function ReadConstString: string;
public
property ConstString: string read ReadConstString;
end;

fonction THoge.ReadConstString: string;
const
 Value: string = 'イッテヨシ';
begin
 Result := Value;
end;

>>698とほとんど変わらないっていうツッコミはなしね
707デフォルトの名無しさん:01/09/18 00:34
これでOK!

const GIKO = 'GIKO!' ;

type
 THoge = class
 public
  property ConstString : string read GIKO;
 end;
708701=706:01/09/18 00:45
>>707
プロパティがクラスの外のやつも参照できるなんて知らなかったよ
ただ使う機会は少なそう
C++のstaticなメンバ変数みたいに使えるかのな


ところでじつは>>579で質問していたんだけど、
誰も使ってないのかな>TToolBarでメニュー
TCoolBar上において、VC風にしてみたんだけど、
MDI子ウィンドウの最大化時の処理がいまいち…

一応TToolBarをもう一個置いてその上にボタンを配置して、
子ウィンドウの状態が変わったときに出し入れしてるんだけど、
どうもいまいち見た目が本物に似ない…
誰か他にやってる人いませんかね?
709ひらぽん:01/09/18 02:49
>自分自身のクラスインスタンスを保持する方法
とっくに解決済みかも知れませんが、少々気になったので。

type
TArxForm1 = class(TForm)
private
FMyClassList: TList;
published
property List: TList read FMyClassList; // 読み込み専用
end;

implementation

constructor TMyClass.Create(AOwner: TComponent);
begin
inherited;
FMyClassList.Add(Self);
end;

destructor TMyClass.Destroy;
begin
FMyClassList.Extract(Self);
inherited;
end;

end.
710デフォルトの名無しさん:01/09/18 03:07
>>709
うぁ。ML からきたな?玄ちゃんみたいにならないでね。

んで何番に対するコメントだ?
711デフォルトの名無しさん:01/09/18 03:31
>>707
嘘書くな。
Delphi に Java の Hashset クラスみたいなのはないの?
713デフォルトの名無しさん:01/09/18 05:32
>>712
単純だけど TBucketList (ただし D6)
おおサンキュウ。
googleする前にヘルプを検索すればよかった。
自作のクラスのデータ検索に使うのでこれで十分。
715デフォルトの名無しさん:01/09/18 06:17
BucketFor メソッドを書き換えることで,自分の好きなハッシュ関数が使えるんで
いろいろ調整してみてください >>714

ただね... 今のコードにはバグがあるから項目の削除はできない。気をつけて。
716-:01/09/18 06:18
MLで紹介すんなゴルァ
>717
まったくもって同意。
MLにギコとか書くなよ、ヴァカが。
719Delギコ:01/09/18 08:36
            ∧ ∧
      〜′ ̄ ̄(メ゚Д゚)つ
        UU ̄ ̄U
______∧________________

 MLで紹介するな。烈しく逝ってよし。

 これだからPersonalでプログラミングしはじめた厨房ってやつは・・・
正直MLで紹介したやつはバカとしかいえない。
被害者としての玄ちゃんみたいのが増えてほしくない。
721デフォルトの名無しさん:01/09/18 08:45
>>707
できねーって!!


どちらにせよ、propertyで出来てもインスタンス生成しないと
参照できないとしたらつかえんな。class propertyみたいのがいるのか?

結局、今のDelphiでやるとしたら、class functionしかないか。
MLはレベルも下がってきたが礼儀も下がってきた
MLの説明読まないやつばっか
こっちの方が言いたいこと言えていいNa
723Delギコ:01/09/18 10:03
 ∧ ∧  >>720 同意
 (;゚Д゚)  あれには関わらないのがよさそう。
 (|  |つ
〜|  |  >>722
  ∪∪  Subjectと内容の合ってないものや( 【 Delphi 4 について】)
送信日時のズレてるヤツとか
ストレートにOutlookの話を聞いてくるのとか(Outlook Express Set User ???)

カルシウム不足だから即切れしそうだよ。

>>708
MDIがあまり使われないような気が…

>>709
なぜにList…
前に話題になった折れが勝手にクラスフィールドって読んでいる方法でもないと
Listに自分自身を代入する意味があまりないと思うのだが。
2chが紹介されたって、何番の記事?
みてみたい。
>>709
すまん。俺の読解力がないのか、
ソースがおかしいのかよくわからん。
何がしたいのか誰か解説してくれ。
727デフォルトの名無しさん:01/09/18 10:58
ML に紹介された割には静かだね。
>>727
大挙して押し寄せられても困る。
はじめまして。MLから来ました。
早速ですがDelphi6 Personalでメモ帳とペイント互換ソフトの作り方を教えてください。
初心者なのでなるべく詳しくお願いします。
730Delギコ:01/09/18 11:17
   ∧∧ プハー   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (,,゚Д゚) =3  < MLノ ヒトタチ ダッテ 2chはチェックしてるさ
   | つ日~~    \ イマサラ 厨房に紹介されるまでもなし。
  〜|  )
   U U
動的配列の内容を一気にコピーする方法ってある?

A, B : array of Integer;
- - - - - - - - - - - - - - - -
CopyArray( A, B );

みたいな。
>>729
ここで厨房な質問するとMLよりもひどい目にあう。
A := B;
734Delギコ:01/09/18 11:24
>>729>初心者なのでなるべく詳しくお願いします。

  ∧ ∧  /
  (#゚Д゚)<  イヤダ
   |つ つ  \
 〜|  |  オオキナ コエ デ イッテヤリタイ
  ∪ ∪

顔を洗って
D6付属のDemoを全てみてから出直せ。

あと、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999486538&rm=100
このリンク全部見ろ。
>>734
ネタやろ。
>>729
MLからきましたなんてかいて
sageてるのでちがうとおもわれ。
http://vvv.geocities.co.jp/SiliconValley/5634/t82B5_0017.html#76

初心者ですので、簡潔にお願いします。 【発言】
----------------------------------------------------
(1)スゴイ・・・
・某所で見かけた発言。 発言と言うより、サブジェクト。
・いや、それにしてもスゴイなぁ、何と言うか、う〜んスゴイ。
・ここまで有無を言わせず、自己都合を押し付ける勢いを持っているサブジェクトと言うのは、なかなか無いですな。

■この文章から読み取る事ができるのは・・・
・自分がした質問にだけ答えろ!
・お前たちは「それは何故ですか?」などと下らない質問をするな!!
・ましてや「もう少し調べてください」などと偉そうな事を抜かすな!!!
・・・・と、いう事なんでしょうね。

(2)しかし、一つ疑問点が・・・。
・それは、質問内容から察するに、彼の御仁には、どうしようもなく知識も調べる気も無いようなご様子なのに、「簡潔な回答」だけで、事が終わるのかな?という事。
・しかし、「初心者」と言って免罪符を振りかざす連中の中にも、「できる限り詳しく教えろ」と言う人も居るし、色々種類が居るんですねぇ。
・でも、こんな傍若無人なメールにも返答をする奇特な人って居る事と、その懐の深さにビックリ。
738 :01/09/18 11:31
procedure TForm1.FormShow(Sender: TObject);
begin
 Caption := 'メモ帳';
end;
だからネタだってばよ
740デフォルトの名無しさん:01/09/18 11:39
「MLから来ました」

ってのは、たぶん、つかみだと思う。(笑)

ここで一発笑いを取っといて「メモ帳の作り方教えて」などと言う
逆撫でする言葉を入れといて、最後に「詳しく教えろ!」という
とどめを指して読み手を怒りの渦に巻き込んでいると思われ
本筋に戻ろうぜ。
画像検索はどうなったんだ。
743ひらぽん:01/09/18 12:22
>>725
>何がしたいのか誰か解説してくれ。

くらすふぃーるどの定義方法の提示かと思ってたら
今元ネタもう一回見たら・・・

>自分自身のクラスインスタンスを保持する方法

でしたね。思いっきり外してました、失礼しました〜。(^^ゞ
744デフォルトの名無しさん:01/09/18 12:26
>>743
正直者なんだろうけど、メールアドレス欄に実アドレスを入れるのは止めときなさい。
745f:01/09/18 12:32
正直、親切すぎるからMLはレヴェル下がってるよな
あとpちゃんがらみで、うっかり自爆して脱出した人多すぎ

>>724
[Delphi:60611] 2ch の Delphi 関係スレッド
BB弾の人
747725:01/09/18 12:38
>>743
すまん。ネタかと思ったんだよ。
きみは2ちゃんには向かないかも。
メアドは書いちゃいけないよ。人を信用してはいけないよ。
>pちゃんがらみ
pcodeになりすまそうとして失敗したとか?
> [Delphi:60611] 2ch の Delphi 関係スレッド
残念、過去ログにはまだ収録されていなかった…
>>740
楽しいか?
750名無しさん:01/09/18 12:46
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>729 すごく簡単です
  (O)----(O)U-U) \__________

ShellExecute(Handle,'OPEN','notepad.exe',Nil,Nil,SW_SHOW);
ShellExecute(Handle,'OPEN','mspaint.exe',Nil,Nil,SW_SHOW);

互換性高過ぎて失神します
751デフォルトの名無しさん:01/09/18 12:46
はじめまして。失礼いたします。

>あとpちゃんがらみで、うっかり自爆して脱出した人多すぎ
とはどのような意味なんでしょうか。

もし、この掲示板のマナーを間違えておりましたらご教授お願いします。

あと、E-mail には何を書けばよいのでしょうか。

よろしくお願いします
>>731
copy関数、後はヘルプ見てくれ。ちなみに性的配列ならMove関数。
753Delギコ:01/09/18 12:57
    ∧ ∧  /
    (,,゚Д゚)<  クラスフィールド?
     |つ つ  \
   @   |  
    ∪ ∪

ひらぽん氏が話題を負ってくれたので紹介してみる。
こういう事がやりたいんじゃないの?
2chのどこかで教えてもらったけど、どこか忘れた。

 TMyClass = class(TObject)
 private
  FName: String;
 public
  constructor Create;
  destructor Destroy; override;
  class function ClassList: TObjectList;//クラスメソッド
  property Name: String read FName write FName;
 end;

{ TMyClass }

var
 MyClassList: TObjectList; //Unit内Object

class function TMyClass.ClassList: TObjectList;
begin
 Result := MyClassList;
 //Unit内Objectをクラスメソッドを利用してアクセス
end;

constructor TMyClass.Create;
begin
 MyClassList.Add(Self);
 //クラスを生成するたびにListに登録
end;

destructor TMyClass.Destroy;
begin
 MyClassList.Extract(Self);
 //クラスを破棄するときにListから破棄
 inherited;
end;

initialization
 MyClassList := TObjectList.Create;
 //Unit内Objectはここで生成

finalization
 MyClassList.Free;
 //Unit内Objectの破棄

end.
754Delギコ:01/09/18 12:59
___  ヽ
_ /⊂ `∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 | |  \( ゚Д゚)< 使い方。
  | /   ∪ ∪  \_____________


/////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
begin
 TMyClass.Create.Name := 'Button1で生成されたMyClass';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TMyClass.Create.Name := 'Button2で生成されたMyClass';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 TMyClass.Create.Name := 'Button3で生成されたMyClass';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 TMyClass.Create.Name := 'Button4で生成されたMyClass';
end;

procedure TForm1.Button5Click(Sender: TObject);
var
 i: Integer;
begin
 Memo1.Lines.Add('インスタンスは'+IntToStr(TMyClass.ClassList.Count)+'個あります');
 Memo1.Lines.Add('インスタンスの内容は以下の通り');
 for i := 0 to TMyClass.ClassList.Count-1 do
 begin
  Memo1.Lines.Add(TMyClass(TMyClass.ClassList.Items[i]).Name);
 end;
end;

実行結果

  インスタンスは4個あります
  インスタンスの内容は以下の通り
  Button4で生成されたMyClass
  Button3で生成されたMyClass
  Button2で生成されたMyClass
  Button1で生成されたMyClass
755デフォルトの名無しさん:01/09/18 13:29
>>751
そういう質問は初心者版逝ってくれ。
2chはほかの場所と比べるとかなり特殊な
礼儀とローカルール(用語や漢字の読み方にいたるまで)
があるから、すべてを教える気にはならない。
756デフォルトの名無しさん:01/09/18 13:45
Copy だと完全代入になるよね。それはよいんだけど、
次のような場合はコードをがりがり書くしかないのかな

A , B : array of Integer ;
- - - - - - - - - - - - - - - - - -

SetLength ( A , LengthOfA );
SetLength ( B , LengthOfB );

で、

A [ m ] 〜 A [ m+c ] に
B [ n ] 〜 B [ n+c ] を代入したい場合。
757デフォルトの名無しさん:01/09/18 13:51
Copyは命令としても使えるって知ってた?

Copy(A, m, c ) := Copy(B, n, c);

↑配列 A の m から c 個分を、配列 B の n から c 個分で置換する
>>753
実際に使用する場面が思い浮かばない....
どんなときに使った?

>>751
蒙古ない方がいいと思われ、売買
759Delギコ:01/09/18 14:18
  ∧ ∧    />>758 実際には使用したことはないです。
  (,,゚Д゚)  < クラス外にインスタンス数保持しておけばいいもんね。
  U  ,つ゛  \
〜|  |
  ∪∪

 でも、よくあるButtonの動的生成する時などに
 TMyButtonとTMyButtonListなどを作っておいて
 別UnitにしておくとFindComponentなんて必要なくなってちょっとベンリかも。
760Delギコ:01/09/18 14:18

  ∧ ∧    /興味あるのでToolbarCustomize調査中。
  (,,゚Д゚)  < ほんとに、APIを軽くラップしただけミターイ
  |⊃ ,⊃   \設計とか実装とか全くなし。
〜|  |     Customizeダイアログを呼ぶメソッドすらないのかニャ
  ∪∪
 ネコデモ ワカルカシラ
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_142.htm

とりあえず
WM_CUSTOMIZE
の定義すらVCLで密からナック手、ブルー
761デフォルトの名無しさん:01/09/18 14:22
>>757
>Copy(A, m, c ) := Copy(B, n, c);

デマ流すの楽しいかい?
762デフォルトの名無しさん:01/09/18 14:27
>>761
デマに反応して楽しい下位?
763Delギコ:01/09/18 14:29
       ∧ ∧
     _(゚Д゚ )__
    /|  ∪∪ /\
  /| ̄ ̄ ̄ ̄|\/
    |      |/
     ̄ ̄ ̄ ̄
>>761 指摘サンクス。
デマは困る。>>762逝ってよしい

CopyはFunctionだから、戻り値に代入出来ないよね。

>>756
その程度はガリガリいこう。
範囲が超えた時の例外処理考えたら頭痛くなりそ。
>>751
空気をつかむのがマナー
意味わからなければMLに戻った方が宵
DelのCPUウィンドウをメニューから開く裏技があったよう
な気がするんだけど、知ってる?
>>765
裏技? 普通にメニューにないか?
表示-デバッグ
767Delギコ:01/09/18 15:51
  ∧ ∧    /
  (,,゚Д゚)  < >>760ネコ ニハ ワカンネーゼ
  |⊃ ,⊃   \
@|  |
  ∪∪

猫でもわかるプログラミング
第142章 ツールバーをカスタマイズする
http://www.kumei.ne.jp/c_lang/sdk2/sdk_142.htm

…"ネコプロ"評価高いみたいだけど、実際
 SDK第二部のこのあたりになると
 SampleプログラムもDLできないみたいだし
 投げやりで独り善がりな記述ばかりで
 非常に読みにくい。
 説明だけに終始してるしなあ。

とか逝ったら怒られる??

分かりやすいと思われる方は、
VCLでToolbarCustomizeを実装してみてちょー。
  とか逝ってみる。
768Delギコ:01/09/18 16:20
 クラスふぃーるどの使う事例
 思い出しました。

 ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄
   ∧ ∧    マターリ
   (,, ゚Д゚)∫
   /  つ旦O
 〜(__n n[ ̄ ̄ ̄.]
         ̄ ̄ ̄
 Form上で動作するComponentで

 設計時にProperty ACompoとProperty BCompoで
 指定したものに対してAが動くとBも連動して動くというもの。
 つくった。名前はMoveCompoとしよう。

 MoveCompo1でACompo=Button1BCompo=Label1として
 Button1を移動させたら、Label1もくっついて移動するものデシ。

 そのときに
 MoveCompo2でACompo=Label1 BCompo=Button1と
 されると動作的に非常によろしくないので(無限に移動しつづけそうだから)
 同じクラスのインスタンス中で指定しているCompoは
 A/BCompoプロパティで指定できないようにしました。
769Delギコ:01/09/18 17:05
なんか、一人でカキコんでる気がするが…

 ∧∧∩  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (゚Д゚)ノ < シツモーーーーソ
 (|  |   \__________
〜|  |
  ∪∪

各種ControlにActionを指定すると
TAction.Updateイベントが発生するけど

あれは何のメッセージを見てUpdateイベントが発生してるの?

VCLのソースのどこみたらわかるーとか。教えてCRAY


イマまでActionのUpdateイベントで処理していた部分を
サブクラス化してみたんだけど何のメッセージをフックすればいいのか
わかんないのです
>>767
猫プロのすごいところは継続しているところだからね。
あの量は真似できんわ。

Delギコもwebページ作ってくれないかなあ。
>>770
文章よりもAAの方が多かったり・・・。
772Delギコ:01/09/18 18:15
          >>769自己レフ
 ∧∧∩゛  /わかった!
 (,,゚Д゚)ノ < WM_PAINTダ!
 U  /   \
 |  |
ノ∪∪

  ∧ ∧  ・・・・。 タ・・タブン
  (,,゚Д゚)
  U  U  アテルカシラ?
〜|  |
  U U
WM_AA
774679:01/09/18 18:45
昨日の質問の続きになります。
---------------------------------------------
procedure TFrom1.FormPaint(Sender: TObject);
var
Rek : TRect;
begin
Lef := 500; //Left
Tp := 200; //Top
Rig := 550; //Right
Bot := 250; //Bottom
Rek := Rect(Lef,Tp,Rig,Bot);
Pen1.Canvas.TextRect (Rek,Lef,Tp,'Ok!');
end;
---------------------------------------------
指定座標に文字や四角を書くのはいいのですが
それにクリックイベントを付ける方法が分かりません。
procedure TForm1.FormMouseDown(Sender:TObject;
      x,y:Integer;Shift:TShift;Button:TMouseButton);
begin
 if InRange( x, BUTTON_LEFT, BUTTON_RIGHT ) and
    InRange( y, BUTTON_TOP, BUTTON_BOTTOM ) then
 begin
  .......
 end;
776デフォルトの名無しさん:01/09/18 19:19
UNDO の実現方法て…

A.手順を全てスタックに保存しておき、UNDOする場合は
  逆の手順を辿っていく。

B.その時点での全てのデータを保存しておき、UNDOする場合は
  一つ前のデータを読み出していく。
Aだと機能が一つ増えるごとに、それに対応したUNDO機能が必要になるような。
Bだと簡単だが、ものすごい量のメモリが必要になるような。
777デフォルトの名無しさん:01/09/18 19:22
>>756
まあ、あまり誉められたコーディングスタイルではないんだろうけど、
Move((PChar(ArrayA) + m * SizeOf(Integer))^, (PChar(ArrayB) + n * SizeOf(Integer))^, C * SizeOf(Integer))
という手もあるにはある。範囲チェックは自己責任。
778708:01/09/18 19:35
>>723
むう。複数ウィンドウをぼこぼこ表示するようなのだったら
MDIのほうがいいかなと思ったんだが。
ちょいとインターフェースを変えてSDIにするか。

>>776
Bの方法で、変更箇所だけ保存しておけば
それほどメモリは使わないんじゃない?
もっとも、全消しとか使った場合はメモリ量は多くなるが…
779デフォルトの名無しさん:01/09/18 19:42
>A [ m ] 〜 A [ m+c ] に
>B [ n ] 〜 B [ n+c ] を代入したい場合。

var
 p,q:pointer;
begin
 p:=@A+m;
 q:=@B+n;
 for i:=1 to c do
 begin
  p^:=q^;
  inc(p);
  inc(q);
 end;
780デフォルトの名無しさん:01/09/18 20:44
お勧めのbug tracking systemってありますか?
なければDelphiで作っちゃおうかなと思っているんですが。
781デフォルトの名無しさん:01/09/18 20:52
>>776
多くの場合、
A.手順を全てスタックに保存
だね。emacs もそう。

操作Xを作るときに、必ずその逆操作を組にして作る。と決めてしまえば
よし。もし逆操作提供できない(めんどくさいとか、メモリ確保が出来ないとか)
ときは、「その操作は復元できませんぞ」ってダイアログを出すようにする。
782デフォルトの名無しさん:01/09/18 21:05
MLで紹介とか好意的に見えるが、これは事件の臭いがする!

吉田が2chで叩かれた。

吉田、2chを潰したい。

2chのアクセス数増大問題発生。

もっと客を増やして、潰してやれ!

MLで紹介。

人が殺到。2ch閉鎖!

吉田(゚д゚)ウマー
783デフォルトの名無しさん:01/09/18 21:13
>781
文字を処理対象にしたツールの場合は良いけど、
画像処理系の場合は不可逆処理の
オンパレードだからね…
>>774
失礼とは思いますが・・・
メッチャワラタ
昔描き順を全部記憶しておいて
nをundoしたら画面クリアして0..n-1を再描画って
ペイントソフトがあったな。
786もっとうまく書けないかな?:01/09/18 21:37
// ↓これの標準ライブラリがあるといいんだけど...
function pchar2str(p: pchar): string;
begin
 if assigned(p) then result := p else result := '';
end;

procedure output(p: pchar);
begin // pはnilかも知れない
 memo1.lines.add(format('%s', [pchar2str(p)]));
end;
787デフォルトの名無しさん:01/09/18 22:17
>>785
それ面白そう。手順をファイルに保存できるようにすれば、
CGそのものを保存するよりも
ファイルサイズが小さくなったりするかも。

適度にウェイトかけて再生できれば
書き順を知れておもろいかも。
788デフォルトの名無しさん:01/09/18 22:24
>>787
Illustratorで代表されるベクタ系ドロウツールはみんな"手順記録系"と
いえるし、Flashもこの範疇だな。
>>787
↓それをもろにやってる
ttp://www.portalgraphics.net/
これのおもしろいところは、画像を投稿するときに
サーバーにその手順データを送って向こう側でレンダリングするところだ。
さらにその画像をDLするときは手順データを持ってこられるので、
絵師の書き方がわかるというシロモノ。
790デフォルトの名無しさん:01/09/19 01:01
>>789
これおもしれええええええええええええ!
いやあ、いいもん紹介してもろたー

しかし一ヶ月の投稿数が900って…
ギャラリー一覧見るだけでも疲れるな、こりゃ。
791名無しさん:01/09/19 01:47
  --下手人-∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜□□ □□ ( ゚Д゚)<  >>786 ネタ?
  (O)----(O)U-U) \__________

var
pc:pchar;
str:string;
begin
pc := 'test';
str := string(pc);
edit1.Text := str;
end;

誰かおいらに休みを下さい
792デフォルトの名無しさん:01/09/19 02:33
なんつーか、あれだな。
Inside DelphiX の著者は19歳なんだな。
なんですと!>792
あっちは発育が良いから・・
>>789
4700円 のシェアウェアか。
うーむ。
795デフォルトの名無しさん:01/09/19 02:59
>>793
>>あっちは発育が良いから・・

もしかして私の誤解かも知れないけど・・
「Inside DelphiX 」って日本人が書いているんですけど..
たった一通のメールのせいで
今日はクソレスばっかりだったな。もうねよ
797デフォルトの名無しさん:01/09/19 03:20
>>789
ほー。OpenCanvas は Delphi 製ですか。1999年というと D4 くらいかな?
798デフォルトの名無しさん:01/09/19 03:23
>>796
まぁまぁ。どうなることかと思ったけど,MLでは無視された用だし
こちらも荒れ模様というほどでは無かったから良いんじゃない?
799エロじじい:01/09/19 04:21
>>795
じゃあこっちも発育が良くなったのか!
いい時代じゃの〜
たいしたレスしない奴に限って...
>797
まじで!? VCLScanner で調べてみよう
802デフォルトの名無しさん:01/09/19 09:30
本当だ… Delphi でこんなにスムースな画像処理プログラムがつくれるのか…

ついでに JGrep もDelphiだったんだね…
803Delギコ:01/09/19 09:47
    ∧ ∧  /
    (,,゚Д゚)<  OpenCanvasすごすぎ!
     |つ つ  \
   @   |  
    ∪ ∪

フリーの画像ツール調べていてoC1.1を見てた事があったが
こんなすごいシェアウェアになっていたのねん。

会社みたーいだけど、すごい技術力ありそう。
ネット時代に即したサイト運営も○ダ〜ニャ
webだけ見てる限り、何者が開発・運営してるのかサパーリわからん。
匿名なのか? > OpenCanvas
downloadしないと分からないようにでもしてるのか?
ってさすがにDelphiと関係ない話になるな。
>OpenCanvas
BCBの可能性は無いの?
>>802
Delphiでもスピード的に問題なくできるよーん。
ただTCanvas使ってたんじゃだめだけどね。
TCanvasなんとかしてほしいね。

しかし書き方が学べるって、OpenCanvasいいねぇ。
807Delギコ:01/09/19 10:10
 ∧ ∧  ここにいるDelphianは
 (;゚Д゚)  すでに、BCBとDelphiの差異なんてマターク
 (|  |つ  気にしていないのだ。>>805
〜|  |
  ∪∪
 ホボ オナジコト デキルノ シッテルカラ
>>807
描画の処理だけCでガシガシにかいてたりもありかなぁ
と思ったもんで
809デフォルトの名無しさん:01/09/19 10:52
【Q】ライブラリパスには複数のパスを指定できますが、
仮に複数のディレクトリ内に Hoge.pas が有る場合、

uses Hoge;

と指定したらどこにある Hoge.pas が参照されるのでしょうか。
C:\Piyo\Hoge.pas と C:\Giko\Hoge.pas では
ライブラリパスに

C:\Piyo; C:\Giko

とあった場合、最初にある Piyo の方が優先されますか。

正直日本語おかしいけど
日本語を母国語とする皆さんなら理解していただけますねOK。
>809 その通り。ファイルパスを明示したい場合はinを使う。
811デフォルトの名無しさん:01/09/19 11:02
>>810
in 指定はプロジェクトファイル(.dpr)でしか効き目がないため
個々のユニットが参照するユニットとは食い違う可能性があり
混ざるとめんどくさくなるぞ。
自分のライブラリがたまってくると
似たようなライブラリの名前つけるのとか管理がめんどくさい。

Javaみたいにしてほしいなぁ。
もうかなり独自拡張してるんだから良いでしょ。 >Borland
OpenCanvasはもともとdemo系のプログラマさんが作ったものだから、
技術もそうだが、処理速度なんかもはやくて納得。
ある意味、Pascal使ってるのも納得。
814デフォルトの名無しさん:01/09/19 12:52
ソースコードにフォルダパスが入るのダサいYO>>812
ライブラリのフォルダ階層変えるとコンパイル通らないじゃん。
COBOLのソースにコンパイルマシン名を書くのもダサいね。
815812:01/09/19 13:22
>>814
>ライブラリのフォルダ階層変えるとコンパイル通らないじゃん。

in使うのも一緒のような気が。。。
なんかもっといい方法あるかなぁ。
816814:01/09/19 13:45
>>in使うのも一緒のような気が。。。

全然違う。ライブラリのフォルダを指定しとけば、
inの中ではフォルダパス要らないんだYO!(だって、標準dcuがそうでしょ)
817814:01/09/19 13:55
もしかして、ライブラリを全部プロジェクトに入れてたりしないよNE?>>812
818デフォルトの名無しさん:01/09/19 14:55
カンマ区切りのテキストファイルを別々の変数に読み込むにはどうしたらいいでしょうか?
ど素人な質問ですいません。

ex.
[test.csv]
aaa,1,2,5

これを別の変数に
819Delギコ:01/09/19 15:04
 ∧ ∧   / >>818
 (,,゚Д゚) < TStringList.CommaTextに大入
  |つ つ  \ TStringListはオブジェクトだから気をつけて。
〜   |
 ∪ ∪
820Delギコ:01/09/19 15:06
 ∧ ∧   /
 (,,゚Д゚) < またもや、しつもーん。
  |つ つ  \
〜|  |
  ∪∪

コントロール(具体的にはStringGridなんだけど)
のzオーダーに他のコントロール(例えばScrollbar)を
あわせたい時はどうしたらいいのでせう?

つまり、Gridのひとつ上にBarをもってきたいの。
他のControlのZ位置関係はずらしたくないの。
821812:01/09/19 15:23
>>814
>inの中ではフォルダパス要らないんだYO!(だって、標準dcuがそうでしょ)
今確認できないんだが、標準のライブラリってinいるんだっけ?

いままでは個人のライブラリフォルダを作って
環境設定のライブラリパスを設定していたんだが、
似た内容のライブラリとかがいっぱいできてきたり
他人のライブラリで名前かぶったり
そろそろ何とかしようかなと思ってるんだけど。

ライブラリの管理ってどうしてる?
822デフォルトの名無しさん:01/09/19 15:37
>>820
Scrollbar(子)のparentプロパティにGridを入れれば良いんじゃないの。
そういう意味ではない?
823Delギコ:01/09/19 15:48
       ||
       | |
      ∧| |
   Σ (゚Д| |
      /つ| |
    〜  ||
     (/ ||
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     
ハッ……ワスレテタ

>>822そうかも。タメシテミマス


MLでD6→D5のdfm変換が公開されたようですね。
イマはレジストリ変更で対応してるけど。

[HKEY_CURRENT_USER\Software\Borland\Delphi\6.0\FileFormat]
"DFMFormat"=dword:00000000
824Delギコ:01/09/19 16:02
| | ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| |Д゚) <  >>822 パレントだめでした。
| ⊂|   \________
| | |
| |U
 ̄ ̄ ̄ ̄ ̄
Editに対するUpDownみたいな事がやりたいの。
Parentにするとどうも妙な動作する。

Zオダ〜ってTComponent or TControl プロパ順に並んでるのかな?


┬┴┬┴┤ ∧ ! "ライ" ノ ツカナイ "ブラ" ガスキ
┴┬┴┬┤゚Д゚) 
┬┴┬┴┤ .U        
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ライブラリの管理は、パッケージを活用するとかなりイイカンジ。
ソレデモ、ヤパーリ、ユニット名やクラス名は別々にしないとダメな気する。
Javaに比してDelの名前空間(っていう?)はちょっぴりイヤ。
825デフォルトの名無しさん:01/09/19 16:11
あれっ、できなかった?ごめん。。。
Delphian WorldのMOStringGridとか参考にしてみれば?

パッケージかぁ。やったことないんだよね。
結構頻繁にリファクタするし。。。
826デフォルトの名無しさん:01/09/19 16:31
>>825
リファクタすれば?
必要に応じてパッケージのリビルドもやってくれるよ。
827デフォルトの名無しさん:01/09/19 17:01
>リファクタすれば?
>必要に応じてパッケージのリビルドもやってくれるよ。

おおっ、ちょっと光明が見えたかも。
ガイドを読んでみると、ソースとか指定してまとめられてよさそう。( ´∀`)

でもこれって名前解決できるの?
828818:01/09/19 17:12
LoadFromFile(FileName);temp.CommaTextにファイルから読み込んでも互換性が無いと
いわれちゃいます。
829Delギコ:01/09/19 17:17
 ∩ ∩
 | ∪ |
 |  〜
 | ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 | i ,,゚Д゚) <  たぶん、こうする
 U U    \________

temp.LoadFromFile(ファイル名);
temp.CommaText := temp.Text;


temp[0〜temp.Count-1]までにComma区切りの内容が入る
830デフォルトの名無しさん:01/09/19 19:46
ScrollBarがGridのスクロールに憑いて来ちゃうね
パネルの子にGridとScrollBar持たせれば?
String(nil)=''になることは保証されてる?
リファレンスには見当たらないんだけど
832デフォルトの名無しさん:01/09/19 21:35
>>831
されている。
長さ0の長い文字列は、メモリアロケートされない。
RTL ソース読みなさい。
833デフォルトの名無しさん:01/09/19 21:51
dpr から、コンパイルに必要な全てのファイルを調べるには

1.Delphiのライブラリパスをセミコロン区切りの文字列として TStringList にぶち込む
2.dpr の uses 節を調べる
3.ライブラリパスの最初に有るものから順番に、uses されたファイルを検索する
4.ファイルが見つかったら一覧に登録し、そのファイルの uses 節を調べて検索する(再帰処理)。ただし、既に一覧にある場合は無視する。

この方法でぬかりないですか?
>832
いや、実装ではなくって仕様の話なんだけど
835デフォルトの名無しさん:01/09/19 22:02
>>833
リンカにマップファイルを生成させて、それを読むのが一番確実。
836デフォルトの名無しさん:01/09/19 22:09
>>834
すまん。質問を誤読していた。

String(nil) は、nil が長さ0の文字列だから、
「Pascal 文字列とヌルでおわる文字列の混在」に書かれているように
'' と等しい文字列に変換される。
837デフォルトの名無しさん:01/09/19 22:15
処理時間が非常に長い関数で、途中経過を報告したい場合は
一般的にどういう実装をするのでしょうか。
私は以下のようにやってました。

procedure OmoiSyori( Status : TStatusBar = nil );
begin
 .....
 if Status is TStatusBar then
  Status.SimpleText := '現在〜の処理中です';
 .....
end;
でも、これだとステータスバーにしか対応できないし、
もっと一般的にしたいんですけど…
>837
プログレスバー+ラベルを貼ったフォームをShow(Modal)する
839デフォルトの名無しさん:01/09/19 22:31
一般的というならこれでどうよ。

type TOnReport = procedure ( report:string );

procedure OmoiSyori( Proc:TOnReport=nil );
begin
...
if Assigned(Proc) then Proc( '〜を処理中' );
...
end;
840839:01/09/19 22:32
これなら、Captionに表示だろうがStatusBarだろうが
プログレスバーだろうがフォームだろうが、
OnReport関数を描くだけで何にでも対応できる。
841デフォルトの名無しさん:01/09/19 22:32
>> 837
.RePaint
842837:01/09/19 22:41
>>839
この方法でやったのですが、互換性が無いというエラーがでます。

TForm1 = class( ... )
...
procedure Report(s:string);
...
end;

.....

procedure TForm1.Button1Click( ... );begin
 NagaiSyori( Report ); ←ここでエラー
end;
843837:01/09/19 22:42
procedure TForm1.Report(s:string);
begin
 StatusBar1.SimpleText:=s;
end;
844837:01/09/19 22:44
>>841
すみません、Repaint をどういう風に使えばいいのでしょうか?関数内からフォームを呼び出してラベルなりキャプションを
変更し、フォーム.Repaint して画面を更新という事ですか。

でも、それだとそのフォーム専属の関数になってしまい、
結局メソッドにしたほうが良いという事になってしまいますよね…
845837:01/09/19 22:54
あ、
type TOnReport = procedure ( report:string ) of object;

とやったら何故かうまくいきました。解決です。
846デフォルトの名無しさん:01/09/20 05:13
>>837
質問の答になってませんが
一般の関数や手続きじゃなくて
クラスのメソッドならイベントにしてしまうのですが.

THeavyJobProgressEvent = procedure (Sender: TObject; const Msg: string);
THeavyJob = class
protected
procedure Progress(procedure const Msg: string); virtual;
public
constructor Create;
destructor Destroy; override;
function Execute; virtual;
property Settei1: string read FSettei1 write SetSettei1;
property Settei2: integer read FSettei2 write SetSettei2;
property OnProgress: THeavyJobProgressEvent read FOnProgress write FOnProgress;
end;

(中略)

procedure THeavyJob.Progress(procedure const Msg: string);
begin
if Assigned(FOnProgress) then

end;

(後略)

public
constructor Create;
destructor Destroy; override;
function Execute; virtual;
property Settei1: string read FSettei1 write SetSettei1;
property Settei2: integer read FSettei2 write SetSettei2;
property OnProgress: THeavyJobProgressEvent read FOnProgress write FOnProgress;
end;
847ななしヘタぐらま:01/09/20 05:15
う,間違えて書き込んでしまいましたごめんなさい.

>>837
質問の答になってませんが
一般の関数や手続きじゃなくて
クラスのメソッドならイベントにしてしまうのですが.

THeavyJobProgressEvent = procedure (Sender: TObject; const Msg: string);
THeavyJob = class
protected
procedure Progress(procedure const Msg: string); virtual;
public
constructor Create;
destructor Destroy; override;
function Execute; virtual;
property Settei1: string read FSettei1 write SetSettei1;
property Settei2: integer read FSettei2 write SetSettei2;
property OnProgress: THeavyJobProgressEvent read FOnProgress write FOnProgress;
end;

(中略)

procedure THeavyJob.Progress(procedure const Msg: string);
begin
if Assigned(FOnProgress) then
FOnProgress(self, Msg);
end;

procedure THeavyJob.Execute;
begin
// 処理のループの中でProgressメソッドを呼び出す
end;

(後略)
848Delギコ:01/09/20 10:37
  ∧ ∧    /procedure of Objectはメソッド
  (,,゚Д゚)  <
  U  ,つ   \
@|  |
  ∪∪ モウ ワカッテルト オモウケド
849名無しさん:01/09/20 11:07
quadrupleおとして、インストールしたんですが、
ウイルススキャンでここのファイルがいつもひっかかる。
これは誤認ですか?
850Delギコ:01/09/20 11:15
   ∧ ∧  ・・・・。
   (,,゚Д゚)
   U  U  サブクラス化してると
  〜|  |  激しくDelphiが死亡するノ…ツラーイニャ
   U U

ACompoをBCompoでサブクラス化するとき
ACompoに対してBCompo1/BCompo2/BCompo3...
でサブクラス化しちゃだめっぽいね

多重にサブクラス化したことある人いる??
851デフォルトの名無しさん:01/09/20 11:24
Delギコまともな文章書け。
852デフォルトの名無しさん:01/09/20 11:42
>>850
親が存在するコンポは親が解放されるとともに自分自身も
解放されるからじゃない?

どのようにサブクラスしたいの?
853デフォルトの名無しさん:01/09/20 11:45
てゆうかあ、サブクラスが使えないDelギコもう駄目だろ。消えろ。
854デフォルトの名無しさん:01/09/20 12:01
わかるなら教えてやれよ
偉そうなくせに使えない奴だなぁ
855デフォルトの名無しさん:01/09/20 12:03
教えてやりたいが、何でサブクラスで
「激しくDelphiが死亡するノ…ツラーイニャ 」になるんだ。有り得ないYO!
856Delギコ:01/09/20 12:14
  ∧∧     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (,,゚Д゚)  < 日本語くちゃくちゃになってしまったの
 ヽ/つ且~~  \ゆるしたもれ。
  (__ _)

標準コンポTStrGridに対してTMyGridBarを作成しました。
んで、このTMyGridBarはGridプロパでGridを一つ選択できます。
選択したとたんにGridをサブクラス化して
とあるGridに流れるMessageを見てTMyGridBarにお知らせしまする。

で、このTMyGridBarを複数作ってからプロパティで
ひとつのStringGridを指定しました。

StringGridは何回も何回もサブクラス化されまする。
それはうまくいくのですが
857Delギコ:01/09/20 12:15
   ∧ ∧    コマットルデ
   (,,゚Д゚)∫
   /  つ旦O
 〜(._[ ̄ ̄ ̄.]
       ̄ ̄ ̄
___/\_____
その状態から
MyGridBar1.Gridプロパにnilを代入したときに
(もしくはStringGrid2を代入してもいいよ)
元のStringGrid1のWndProcを正しく戻してやらなきゃいけないのだけど。
それが出来ないの。

通常。サブクラス化では一度StringGridのWndProcをバッファに入れるじゃない。
 FOldWndProc := StrGrid.WndProc;
 StrGrid.WndProc := NewGridWndProc;//New...はメソッド

で、元に戻すときは
 StrGrid.WndProc := FOldWndProc
 FOldWndProc := nil;

だよねえ。このStrGrid.WndProcが他の所でサブクラス化されているから
勝手にもとのものを代入していいのかわるいのか…
というか、Delがフリーズしたりアクセスバイオるからダメなんだろう…

うーん、むずかしけりよ。
なんか、複雑に考えすぎているのかな。
858Delギコ:01/09/20 12:16
 ∧∧  *  />サブクラスが使えないDelギコもう駄目だろ。消えろ。
 (,,゚Д゚) / < 単純なサブクラス化くらいできるわ、
  | つ●)   \
〜|   |  
  U U
 サンプルヲ アゲル ジュンビ シテミル
859デフォルトの名無しさん:01/09/20 12:25
procedure of object がメソッドだという事は、

TFunc:procedure of object;

と書いた場合、TFunc と、普通の手続き(クラスに依存しない手続き)は代入互換性が無いって事?
860デフォルトの名無しさん:01/09/20 12:26
!!
procedure of object って、
「オブジェクトの手続き」って事か!!!
なんでいままで気が付かなかったんだろう…
>857
 単純なリンクリストだから
 A->B->C
となってBを消去する時は A->C とつないでやらなければならないだけでは?
862Delギコ:01/09/20 12:45
>>861
       ∧ ∧  ・・・・。
       ( ゚Д゚)  ソデス
       |∪ |
      〜|  |
       U U  デモ デキニャイ
ドキュソ デスカ?
この場合、  StrGrid.WndProc が 自分(NewGridWndProc)を指していなければ
安全には取り外せない。


安全に取り外すには、 StrGrid.WndProcが指しているメソッドに
取り外せというメッセージを送りつけて、取り外されたら元に戻した後
再度 取り外す前の StrGrid.WndProc に取り付けろとメッセージを送るとか

あるいは安全に取り外せないと判ったら取り外さないのも方法かもね
864デフォルトの名無しさん:01/09/20 12:50
CマガのDelphi 6J Enterpriseトライアル版を試しているんだが、
データベースプログラミングをわかりやすく解説してあるHPを教えろ。
865デフォルトの名無しさん:01/09/20 12:52
ActionListをつかって、イベントを

MenuItem と SpeedButton に割り振っています。

が、しかし!
Action にキャプションを指定すると、当然そこで指定した
キャプションが MenuItem と SpeedButton の両方に
表示されることになりますが、SpeedButton には Glyph だけで
キャプション文字列は表示したくないんです。

現在、Action にはキャプションを指定せず、MenuItemに手動で
キャプション指定していますが、スマートに解決する方法はありませんか。
      ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚)つ < WinProc系の話難しくてついて逝けない…
   し― ∪     \___________
>>865
ToolBar.ShowCaption
868863:01/09/20 13:03
この場合、TMyGridBarしかサブクラスをしないのなら

WindProcは ob object だよね?

StrGrid.WndProc が 自分(NewGridWndProc)を示していなければ
示しているポインタから
関数ポインタとオブジェクトに分解して、
そいつのOldWndProcを書き換えてしまうのが素早い方法だろう

ただ、グループで開発しるような場合は、>>863の方法をお勧めする
869デフォルトの名無しさん:01/09/20 13:03
>>867
あの、ツールバーが関係ない場合は?
870Delギコ:01/09/20 13:03
      ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ゚Д゚) < >>863 さんくす。
      /⊃⊃   \
    〜(  ノ       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ⊂`J   ダヨネダヨネ

イマの所、グローバルなListに同一Classが入るようにしてて
そのList内を探索して

 if TMyGridBar(List.Item[i]).FOldWndProc = Self.NewGridWndProc then

こうしたいんだけど、、、これって比較できないみたいなの。
procedure of Objectの同一性ってどうやって調べますの??


        ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜′ ̄ ̄(#゚Д゚)< >>864くたばれ
  UU ̄ ̄ U U  \_____________
http://homepage2.nifty.com/boheme/delphi/dbtips/index.html
http://user3.allnet.ne.jp/tadnakam/Delphi/delphi4/db/index.htm

    ∧ ∧   />>865がんばってね。
  ∩(,,゚Д゚) <  >>866まずは普通のサブクラス化を調べてみYOU!
⊂,,⌒ ,,つつ.  \>>867フォロークスコクスコサンクスコ
   ̄ ̄
871Delギコ:01/09/20 13:06
    ∧ ∧   / ̄ >>869
  ∩(,,゚Д゚) < SpeedButton.Caption := '';
⊂,,^__つつ.  \_ Actionを設定したあとにな。
872デフォルトの名無しさん:01/09/20 13:11
>>870
メソッドをTMethod型にキャストすることでそのメソッドのインスタンスと
関数アドレスが分かります。この二つを比較することで同一性が判断できます。

if (TMethod(method1).Code=TMethod(method2).Code) and // 関数アドレス比較
 (TMethod(method1).Data=TMethod(method2).Data) then // インスタンス比較
begin
 // method1 と method2 は一致した!
end;
Win98で、タスクバーのアイコン(最小化されている奴)が点滅する場合がありますが、この点滅の発動条件はいったい何ですか?
874デフォルトの名無しさん:01/09/20 13:27
>>870
あんがとよ。死ね。
875Delギコ:01/09/20 13:28
  ∧ ∧∩ しょええええ。
  (゚Д゚,,)ノ  >>872出来たよ出来たよ
   |  つ
   | ⊂)〜  すごーいよ。
    ∪     メソッドはイチド of Objectに代入しなきゃいけないみたいだけど。

 ∧ ∧  スバラシイ!
 (,,゚Д゚)  カンシャノ キモチ ウケトッテ!!!!
  |つIO
〜   |
 ∪ ∪
876デフォルトの名無しさん:01/09/20 13:41
877863:01/09/20 13:45
この場合は、特別なメッセージを用意しておいて
 その送り主が自分かどうかという方法もあるよ。

というか、そういうメッセージを定義しておくべきだったんじゃないか? >MS

サブクラス解放時にサブクラスのリンクを
 WM_DetachProc,DetachStart,this でthis=selfでなければ解放
 WM_DetachProc,DetachEnd,this 再度接続

するメッセージ
878デフォルトの名無しさん:01/09/20 13:49
連続した同一文字列の圧縮(文字数を減らす)ていうのやりたいんですが
どんな方法がいいですか?

perlで言うところの
s/(\-\-|==)+/$1/g;
みたいのが簡潔に表記できないかなぁと。
「--------==========」→「---===」になります。

http://homepage1.nifty.com/ht_deko/algo002.html
みたいなルーチンで一文字ずつ指定するか、
http://homepage1.nifty.com/bmonkey/delphi/delphi.html
のAWK関数郡を使うのがいいんですかねぇ

    ∧ ∧   /
  ∩(,,TДT) < 教えてくださいー
⊂,,⌒ ,,つつ.  \
   ̄ ̄
879Delギコ:01/09/20 13:57
       ∧ ∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       (゚Д゚,,)  < >>863 あんたはすごい
       ⊂ ⊂|    \___________
        |   |〜
        ∪ ∪  
  Delギコ、自分がペーペーだと知る2001年セプテムバー
880Delギコ高速回答:01/09/20 13:58

____∧ ∧_ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
___( ゚Д゚)< このスレはーーー
__ / ⊃ つ  \______________
_〜′ /
_ ∪ ∪  >>873 あれは窓がActiveになりたがっているんじゃない?
        OSの設定でレジを弄るとActiveになりたがるやつは
       点滅せずにActiveになるとオモワレ

 ∧ ∧ ──────
 (゚Д゚ ) < チャットかよーーー
 ⊂⊂ \──────
    \  〜 ────
     し し ─────

>>878 StringReplace使う
 while (1<=AnsiPos('--', S))
  S := StringReplace(S, '--', '-', [rfReplaceAll]);
んな漢字
881Delギコ:01/09/20 14:02
    ∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (,,゚Д゚)ノ <  >>878
    | ⊃|   | あら?ちがった?
    |   |    \_____________
    ⊂ノ〜
    ∪   正規表現はイマイチわからん
        他のネコにおまかせ
882デフォルトの名無しさん:01/09/20 14:20
 ∧ ∧   >880 ありがとう
 (,,゚Д゚)   とりあえずこれでやってみます
  |つ(1)O でも他のやりかたあったら教えてください
〜   |   >正規表現わかる人
 ∪ ∪
883デフォルトの名無しさん:01/09/20 14:25
う〜ん、ここ見てると勉強になるぅ
>>878
正規表現って
s/(\-\-|==)+/$1/g;
でなんで「--------==========」が「---===」になるの?

鬱死
885デフォルトの名無しさん:01/09/20 14:38
//連続したスペースを、1つのスペースに圧縮する
function CompressSpace( s:string ):string;
const Space = ' ';
begin
 while AnsiPos( Space, s ) >= 1 do
  s := ReplaceStr( s, Space+Space, Space );
 result := s;
end;
886Delギコ:01/09/20 14:42
  ∧ ∧   /
  ( ゚Д゚)< 1ッ点か…
   |つ つ  \
 〜|  |
  ∪ ∪

改めてSubClass化に思いをはせたのですが
多重のサブクラス化って
同じクラス内で防止しても限定的にOKなだけで
アリアラな所でサブクラス化されているかどうかをチェックしだすと
安全にサブクラス化を解除する方法って無理なのでは??

とりあえず
すべてのコンポーネントにOnMessageイベントが欲しい!
なんていってみる。

TUpDownコンポはうまくやっているみたいだけど、
あれって、Editをサブクラス化してますの??
887デフォルトの名無しさん:01/09/20 14:42
1.$1 は 括弧で囲まれた部分を表す。
2.\- はハイフンそのものを表すエスケープ文字である
3.+ は連続を示す。
4.| で区切られたものは、左右どちらかに一致する事を示す。

これらの事から、正規表現

s/(\-\-|==)+/$1/g;
の $1 は文字列 -- もしくは文字列 == を表し、

-- の連続したもの、又は == の連続したものに一致する部分が、
-- 又は == で置き換えられることになる。
888デフォルトの名無しさん:01/09/20 14:45
従って、

while AnsiPos( '----', S) > 0 do S := ReplaceStr(S, '----', '--' );
while AnsiPos( '====', S) > 0 do S := ReplaceStr(S, '====', '==');

が正しい。
889デフォルトの名無しさん:01/09/20 15:04
>>856-857

設計をこう変更した方が簡単じゃないの?

 TStrGridに最初に張り付いたTMyGridBarがオーナーになって
 他に張り付いたTMyGridBarの一覧を保持しておく
2番目以後に張り付いた TMyGridBarはサブクラスはせず
 最初にオーナーになったTMyGridBarがWinProcメッセージを
 分配する。

TMyGridBar.gridが設定される時は Gridに対してUSERメッセージを送る。
既にサブクラスされていればUSERメッセージでオーナのTMyGridBarが帰って来る
から、そのオーナにコネクトするようにすればいい

オーナーが取り外される場合は自分の持っているリストの
先頭にオーナーを譲る
890Delギコ:01/09/20 15:19
  ∧ ∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (,,゚Д゚)  < それも一応考えました。
  U  ,つ゛  \____________
〜|  |
  ∪∪

> 既にサブクラスされていればUSERメッセージでオーナのTMyGridBarが帰って来る
> から、そのオーナにコネクトするようにすればいい
この辺がちょっとわからないですが

> 最初にオーナーになったTMyGridBarがWinProcメッセージを
> 分配する。
このオーバーヘッドがチョット大きいかと思ったもので,,,
悩み中だったのです。

TMyGridBarを沢山作ったらそれだけ
サブクラスのWndProcの中で全てのものをチェックしなきゃいけないし
StringGridも複数だと
各々TMyGridBarを付けると
単純に1つのインスタンスだけがサブクラス化する
というわけにも逝かなくなるし…

いろいろ難しいです。
とりあえず、サブクラス化解除できない時は
EComponentErrorを発生させることにしました。
Delギコさんって暇人?
892878:01/09/20 15:30
>887 あ、先に解説されてた。サンクスです。
ちなみに「s」は置換コマンドで、お尻の「g」は繰り返しを意味します。

>Delギコさんって暇人?
オレもそう思った(藁
893Delギコ:01/09/20 15:41
 / ̄ ̄ ̄ ̄ ̄ ̄
 | 暇人?
 |                 r――――――――――
 ∨ ̄ ̄ ̄ ̄ ̄∧_∧   |ヒッキーなの?
 ∧_∧     (´∀` )  <
( ´∀`)    (   ∧∧   |_________
(   つ/ ̄ ̄ ̄ ̄(´∀` )   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(   ∧ ∧     /(⊂   )o < 2ch中毒だよ
  /_(  ;)__/ /       \________
 || ̄/  | ̄ ̄||/ ┌───────
 ||, (___/   ||  < ほっとケ
             └───────

   ∧∧     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (,,゚Д゚)  <  ちょっと休むか…
 @/つ且~~  \___________
  (__ _)
894デフォルトの名無しさん:01/09/20 18:14
>>890

TOwnerGridBar をつくる。サブクラス化するのは
こいつだけ。TMyGridBar のインスタンスは、こいつ
のメソッドでいくらでも作成する。こいつは、その
リストを保持してメッセージを分配する。TMyGridBar
は、自分が破棄されるときは、こいつに通知してリスト
からはずしてもらう。
895884:01/09/20 18:31
>>887>>892
ぃゃマジレスくれるとは思わんかったサンクス

ところで「--------==========」は「--==」じゃないの?
「--」x複数=>「--」
「==」x複数=>「==」
なんじゃないの?サッパリ
896Delギコ:01/09/20 18:46
          ∩ ∩  
         | ∪ | .
         |  〜  
       __| ∧ ∧  
 ┌┐   | \,,゚Д゚)、
 │| ̄)〓(  ,, ̄ ̄ ̄)
 └. ̄     ̄ ̄ ̄ ̄
      3時間で充電完了
897Delギコ:01/09/20 18:47
  ( )   ( )
   ( )
    ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (゚Д゚,,)< SubClass化コンポすべてに対応するのは無理なのかな。
   | ̄ ̄ ̄| \_______
   |二二二|
   |___|
   从从从从

以下のようなTCompo継承コンポを用意してみた。

constructor TFormFucker.Create(AOwner: TComponent);
begin
 inherited;

 if (AOwner is TCustomForm) then
 begin
  FOldFormProc := TCustomForm(AOwner).WindowProc;
  TCustomForm(AOwner).WindowProc := FormWndProc;
 end else
 begin
  FOldFormProc := nil;
 end;
end;

      ( )
  ( )  
   ( ) ( )
    ∧ ∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (゚Д゚;)_ < 思いもしない罠アリコード
   |U ̄U |  \_______
   |二二二|
   |___|
   从从从从

destructor TFormFucker.Destroy;
begin
 if Assigned(FOldFormProc)
  and (Self.Owner is TCustomForm) then
 begin
  TCustomForm(AOwner).WindowProc := FOldFormProc;
  FOldFormProc := nil;
 end;

 inherited;
end;

procedure TFormFucker.FormWndProc(var Message: TMessage);
begin
 FOldFormProc(Message);
end;
898Delギコ:01/09/20 18:48
        (  )
  ( )   (  ) 
   ( )  ( )
    ∧ ∧( ) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (;゚Д゚) < 動作結果ぁああ
    / づ   \_______
   | ̄ ̄ ̄|
   |二二二|
   |___|
   从从从从

FormFucker1を配置、FormFucker2を配置
FormFucker2を削除、FormFucker1を削除>>ダイジョウブ

FormFucker1を配置、FormFucker2を配置
FormFucker1を削除、FormFucker2を削除>>IDE コワレテヨシ


                 ( )
            ( )  
             ( ) ( )
          ____バシャァ
          |  | │ |∧ ∧ ・・・・・
    从从   |  | │ |(*゚Д゚) SubClass化ってけっこう危険?
   从从从从 |  | │ | _つつ
           ̄ ̄ ̄ ̄~~~~~~~~~~~~~~

TFormFuckerクラスだけがFormをSubClass化するだけなら
対応策はあるけれども似たようなFormSubClass化コンポーネントの
TAFormFucker/TBFormFuckerを作られると
どうしようもなくないですか??

それとも対策ありますか?
899Delギコ:01/09/20 18:53
  ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ゚Д゚)<  次スレの準備完了済み
  ノつ つ \__________
〜/  ノ
 し' ∪  アンシンシテ900Getセヨ
901デフォルトの名無しさん:01/09/20 19:11
たまに初心者向けの話題も出るので、わけわからんながらも見てます。
Delギコさんがんばれー
(充電完了が気に入ったYO!)
902デフォルトの名無しさん:01/09/20 19:28
Delギコ→中級
相談室→初級
Delphi/Kylix Tech→中・上級

という住み分けでいいのかしらん?
903デフォルトの名無しさん:01/09/20 20:59
OnMessage
WindowProc
SetWindowsHookEx
などメッセージを操作する方法がいろいろあって
どのときにどれを使ったらいいのかよくわからん
優先順位も???
誰か説明Please
では、ここに常駐していて、かつスレ全体のうち70%ぐらいの
話の内容が理解できる私は中級に認定されますか。
905デフォルトの名無しさん:01/09/20 21:42
>>903
Windows メッセージパッシングの基本原理を知っているかどうかで、
説明がかなり変わるんだが...

SetWindowsHook(Ex) は Windows API で用意されていて、直接ウィンドウプロシージャを
書き換える。VCL/TWindow コントロールでなくても利用可能。

WindowProc は、VCL 側で定義されている、コントロールごとに存在する
ウィンドウプロシージャ。コントロールのソースコードがある場合には
これを書き換えるほうがメンテナンスしやすい。

さらに、メッセージを処理するたびに呼び出される OnMessage が
用意されていて、この構文を使えばイベントと同様にコードが書ける。

「イベントと同様」とは、あるインスタンスでデフォルトとは異なる振る舞いを
させたいときに、継承クラスを作成してバリエーションを作るのではなく、
最初から用意されているイベントに対してコードを追加することで対応する
ことを意味します。

ところがすべての Windows メッセージに対して、Dynamic メソッドを
定義できるため、コントロールのソースがある場合、わざわざ WindowProc を
変更する必要はほとんどない。

ソースがない/書き換えると大事になりそうな基本クラスなどの定義
済み動作を置き換えたいときくらいかな?

一部の重要なウィンドウズメッセージは扱いやすい形に書き換えられ

ちょっと知りつぼみな説明になった。
わからんところがあれば質問!
906Delギコ:01/09/20 21:52
http://oshiete.goo.ne.jp/jsp/oshiete_search2.jsp?c=221&tag=207

          。°゜  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   __ ∧ ∧゚     / 教えて!goo にもDelphiが載るといいのにニャ。
〜⊂_⊂( ゚Д゚)っ  <____________
907rock me:01/09/20 22:17
>サブクラス化コンポの開放
class procedure サブクラス化コンポ.XXX(var Msg: TMessage);
type
 PMethod = ^TMethod;
var
 m: TWndMethod;
begin
 TMethod(m).Code := PMethod(Self)^.Code;
 TMethod(m).Data := PMethod(Self)^.Data;
 m(Msg);
end;
っていけるかな?これなら「罠」は消えるはずだけど。
PMethod(p)^に目的のプロシージャいれて
Form.WindowProcにはTObject(p).XXXをいれて
開放する時はPMethod(p)^にOldWindowProc入れてやる。
いくらかごみ出るけど、気になるならリスト作って
finalizationででも開放するとか。
908rock:01/09/20 23:01
class procedureにしなくてもOK?
とにかくSelfとして渡される変数に真の呼び出し先の情報を入れといて、
WindowProc変数は開放時にも変更しないというアイデア。品が無いけど。
>>898
何度も出てるように多重サブクラスの特効薬は、特定のメッセージで
解放させる事じゃない?

解放させるメッセージ番号が決まっていれば一番いいんだけどね。
とりあえずプロジェクトで定数を決めておけばいいでしょ
WM_DatachProcを WndProcで受け取ったら
LParamを見て送信者=受信者でなければ
 WParam=WM_DetachProcDetach  なら取り外し
 WParam=WM_DetachProcReConnect なら再接続

  msg.Msg :=WM_DetachProc;
  msg.WParam:=WM_DetachProcDetach;
  msg.LParam:=self;
  Nproc:= TCustomForm(AOwner).WindowProc;
TCustomForm(AOwner).WindowProc := FOldFormProc;
  Nproc(msg);
  msg.Msg :=WM_DetachProc;
  msg.WParam:=WM_DetachProcReConnect;
  msg.LParam:=self;
  Nproc(msg);

910デフォルトの名無しさん:01/09/20 23:08
あと、VCL では結構気軽にウィンドウハンドルの再構築が行われるので、
API レベルでフックしていると大変なことになる。

何度いわれても懲りないなぁ > Halbow
911Delギコ:01/09/20 23:14
       ∧ ∧  ・・・・。
       ( ゚Д゚)
       |∪ |
      〜|  | ナンカ ワケワカ
       U U

>>905 OnMessageはTApplicationにしかないと思う。
TWinControl全てにあっていいと思うけど
そしたら多重SubClass化なんてくだらない問題も解決かな。

> ところがすべての Windows メッセージに対して、Dynamic メソッドを
> 定義できるため、コントロールのソースがある場合、わざわざ WindowProc を
> 変更する必要はほとんどない

ここ以下がサパーリわかりません??
わからなすぎて、何がわからないのかもわからな・・・


>>907
スンマソン、またーくわからないでし。
罠、消えますの?PMethod(Self)^.自分のMethod??

現在、>>897
元に戻す時にTMethod(ナンカ.WndProc) = TMethod(Self.新しいWndProcメソド)
を確認して、Trueなら戻すし Falseなら例外でサブクラス化解除しないよにしてます。
IDE上からなら
サブクラス化、解除不可でCompo削除不可になっても
プロジェクトを閉じて開きなおせばたぶんCompo削除可能なのですが

プログラム上からTFuckCompoClassをCreateしたりFreeしたりすると
やぱりだめでしょうね(そんなことする奴はイネーと思うが)

サブクラス化は各Compo一つに1回だけを心がけるべきかしら。
>>906 事故レス >>909の方法は間違いだ。途中の順番逆だし
  これだと多重にサブクラスされていた場合に対応出来ない。

再帰的に、
WM_DetachProcが送られたら
LParamを見て送信者=受信者でなければ
 元に戻してFOldWndProcに同じメッセージを投げつける
 メッセージから帰って来たら再度コネクトする
LParamを見て送信者=受信者なら
 元に戻して完了

とすればどうだろ
検証してないけど

procedure TFormFucker.FormWndProc(var Message: TMessage);
begin
 case Message.Msg of
WM_DetachProc:
  begin
TCustomForm(AOwner).WindowProc := FOldFormProc;
   if (TFormFucker(LParam) <> Self) then begin //呼び出したのが自分でなければ
    FOldFormProc(Message);//さらに解放を続ける
  FOldFormProc:=TCustomForm(AOwner).WindowProc ;
    TCustomForm(AOwner).WindowProc := FormWndProc;//接続しなおす
  end;
  end;
 else  FOldFormProc(Message);
 end;
end;

destructor TFormFucker.Destroy;
var msg:TMessage;
begin
  msg.Msg :=WM_DetachProc;
  msg.WParam:=Longint(FormWndProc);
  msg.LParam:=Longint(self);

end;
914907:01/09/20 23:32
> ところがすべての Windows メッセージに対して、Dynamic メソッドを
> 定義できるため、コントロールのソースがある場合、わざわざ WindowProc を
> 変更する必要はほとんどない
message指令とか、WM〜メソッドをoverrideするってことかも。

907の説明)サブクラス化を行うコンポを削除すると問題なのは、
自分のメソッド(FormのWindowProcと置き換えていたやつ)
が他のコンポにOldProcみたいなかんじで保存されていて、
インスタンスが破壊された後にも呼び出される事があるってことだと思う。
だからWindowProcを置き換えるメソッドはクラスメソッドにして、
そこから処理本体のメソッドを呼び出すようにするという仕組み。
で、使い終わったら、処理本体でなくて、置き換える前のFormのメソッドを
呼び出すようにしてやる。
インチキをしているのは、クラスメソッドを呼ばせる時、TMethod.Data
に当たる部分のデータを、書き換えてしまうところ。
ここの数値が正当じゃなくても、ちゃんと呼んでくれるみたい。
説明下手でスマソ
そういや昔「ばか者」を意味するfuckerって
名前をつけるのは不適切とかのたまってたのがいたな
916デフォルトの名無しさん:01/09/20 23:54
>>915
えーあー カタカナ語はちゃんと語源を確認しようね

で、システムをフックする関数(かなにか)に
Hooker ってなずけた人がいるんです。

Hooker については
http://www.sanseido.net/sup/ItemPane.asp?P0=12&P1=MAIN,NODE,57198
を。
917Delギコ:01/09/21 00:11
                ∧ ∧   / ̄ ̄ ̄ ̄ ̄
                (゚Д゚*,) <  書いてみた
             _φ_⊂)__  \_____
           /旦/三/ /|
        | ̄ ̄ ̄ ̄ ̄|  |
        |千葉ピーナッツ|/
          ̄ ̄ ̄ ̄ ̄
こんな感じでなってるよね。

Form1.WndProc
=A.NewProc
 begin
  ・・・
  A.FOldProc=B.NewProc
 end;      begin
           ・・・
           B.FOldProc=C.NewProc
          end;       begin
                    ・・・
                    C.FOldProc=サブクラス化しないときのForm1のWndProc
                   end;

A/B/Cは一応、自分が作れるものとしましょう。
他人が作ったものでも対応できればいいけど、さすがにそりゃ無理でしょ

で、A/B/CのClassは全く別だとしましょう。
TA,TB,TCとでも考えてくださればいいっす。
918Delギコ:01/09/21 00:12
    ∧ ∧   / ̄
  ∩(,,゚Д゚) <  おもしろい。
⊂,,⌒ ,,つつ.  \_
   ̄ ̄ ソンナニ sage ンデモ エエデ(関西風)

Bをサブクラス化から開放したいとき
A.FOldProc:=B.FOldProcする必要があって
それってWM_DetachProcメッセージ伝達で出来るのかしら??
ちょっとイメージできてないです。

というか、Bを開放するときに、Aも一緒にはずしてしまうって事かしら。

でもコンポーネントは配置されているのに
理由もなくサブクラス化されていない物が混じっているのも
ちょっときついかも

そのあとAを開放しようとすると
プログラム側がワケワカな挙動しないかな。
919884:01/09/21 01:07
誰か>>895教えてくだされ
>Delギコさん
新スレ立てるとき、ここの1みたく「その他のプログラム」って書くと
またVBの質問とか出てきそうだからやめよう。
検討済みだったらスマソ。
921デフォルトの名無しさん:01/09/21 08:11
多段サブクラス取り外し問題は
取付順
 ↓ objA ─────────────── WndProc → FoldwndProc
                               ↑           │
 ↓ objB ────────── WndProc → FoldwndProc    │
                         ↑                 │
 ↓ objC ───── WndProc → FoldwndProc            │
                ↑                          │
 ↓ objD WndProc → FoldwndProc                    │
          ↑                                  │
         msg ……………> (サブクラス先の.WndProc )←──┘

こういうふうになっていると安全に取り外せるのは objDだけ
 objAを取り外したい場合は objA,B,Cの順に取り外さなければいけない
 これはメッセージの流れる順だから
  取り外せというメッセージを送ればいい。

 そのメッセージを処理するWndProc内部で取り外し処理をしては
  送ったメッセージが自分のメッセージでなければ
   FoldWndProcを通じてルートを遡らせてゆき
   そのFoldWndProcが帰って来たら再度接続しなおす。

メッセージさえ共通にしておけばいいから複数のオブジェクトを設計する場合も
それほど難しい問題は起きない。
922913:01/09/21 08:54
検証した。 問題なく取り付け取り外しできるように見えるぞ

const WM_DatachProc = WM_USER;
type
 TtestLabel = class(TLabel)
  public
  FoldWndProc:TWndMethod;
  constructor Create(AOwner: TComponent);override;
  destructor Destroy;override;
  procedure  MyWndProc(var Message: TMessage);
 end;


constructor TtestLabel.Create(AOwner: TComponent);
begin inherited;
 if (AOwner is TCustomForm) then
 begin
  FOldWndProc := TCustomForm(AOwner).WindowProc;
  TCustomForm(AOwner).WindowProc := MyWndProc;
 end else begin
  FOldWndProc := nil;
 end;
end;


destructor TtestLabel.Destroy;
var msg:TMessage;
begin
 msg.Msg:=WM_DatachProc;
 msg.WParam:=longint(self);
  (Owner as TCustomForm).WindowProc(msg);
 inherited;
end;

procedure TtestLabel.MyWndProc(var Message: TMessage);
begin
 case Message.Msg of
 WM_DatachProc:begin
  (Owner as TCustomForm) .WindowProc := FOldWndProc;
   if ( Message.WParam <> LongInt(Self)) then
     begin
     FOldWndProc(Message);//さらに解放を続ける
     FOldWndProc:=(Owner as TCustomForm) .WindowProc;
     (Owner as TCustomForm) .WindowProc:= MyWndProc;
     end else FOldWndProc:=nil;
  end;
 WM_CHAR: begin //コンポーネントの動作チェック用
   text:=Char(Message.WPARAM);
  if assigned(FoldWndProc) then FoldWndProc(Message);
  end;
 else if assigned(FoldWndProc) then FoldWndProc(Message);
 end;
end;

procedure Register;
begin RegisterComponents('Samples', [TtestLabel]);
end;

end.
923デフォルトの名無しさん:01/09/21 09:02
という事でココをご覧のコンポーネント作家さん

 WM_DatachProc = WM_USER;

をサブクラス取り外し用メッセージという事にして
WParamでSelfを送るという約束にしましょう。

LParamは空きとして
924デフォルトの名無しさん:01/09/21 09:07
さらにWindowsへのサブクラスの場合も考えて
LParam にはプロセスユニークと思われる番号(とりあえずプロセスID)が
与えられる事にしましょう。
925922:01/09/21 09:17
おっと、>>922 のコードでは
FOldWndProc がnilかどうか確認せずに使ってる個所が
何箇所かあるから修正してね
>>922-925
ふと思ったんだが、
WM_USERだとすでに使われていて別の意味を持つ場合もあると思うから、

RegisterWindowMessage('WM_SubclassFreeNotify');

みたいにして使った方が(・∀・)イイ!と思われ。
もしくはWM_USER+222みたいにするとか。222の意味は2chということで:-)
WM_USERってVCL自体で使ってたような。はまったことある。
WM_APP以降にせんと安心できなかったな。
RegisterWindowMessageがやはり無難な感じ
928デフォルトの名無しさん:01/09/21 09:50
ではサブクラス解放についてのまとめ

WM_DatachProc = RegisterWindowMessage('WM_SubclassFreeNotify');
WParam,LParam はユニークな値が入る
 この2つの値で送信者が自分かどうか判断し
  自分でなければリンクを解放して下位にメッセージを送り
  メッセージが帰って来たらリンクを再接続する
 送信者が自分ならリンクの解放だけを行う

VCL上のサブクラス取り外し
  WParam で selfが渡される WParam = LongInt(self)
  LParamは無視してよい

Win上のサブクラス取り外し
 LParamでプロセスID
 WParamはプロセス内ユニークな値(メソッドアドレス等それぞれのプロセスで管理)
929Delギコ:01/09/21 09:51

      ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 @' ― (,,゚Д゚) < 正規表現はわからんちー。
   し― し-J   \___________
 2chのどこかで正規表現すれがあったような気もする

>>921さんは>>922さん?
>こういうふうになっていると安全に取り外せるのは objDだけ
これで妥協してしまうのだったら
問題は非常に簡単なんですけどね。

> objAを取り外したい場合は objA,B,Cの順に取り外さなければいけない
??なんかわからなくなってきました。
objAを取り外したい場合はobjBのFoldWndProcを
サブクラス先の.WndProcに接続しなきゃいけないですよね。

>   そのFoldWndProcが帰って来たら再度接続しなおす。
イチドサブクラス化解除させてから再度サブクラス化させるってことかな

>>922のコードはイマからみてみます。
×Datach
○Detach
931921:01/09/21 09:56
×objAを取り外したい場合は objA,B,Cの順に取り外さなければいけない
○objAを取り外したい場合は objD,C,Bの順に取り外さなければいけない
>objAを取り外したい場合はobjBのFoldWndProcを
>サブクラス先の.WndProcに接続しなきゃいけないですよね。

 結果的にはそういう事だけど、
 それに拘るからハマルんだよ
 基本的にobjAからは objBが見えない。確実に割り出す方法はないんだよ。
 サブクラスがobjA,objBの2段だけなら サブクラス元のメソッドポインタから割り出せるけど
 さらにサブクラスされているともうダメ

 だから、メッセージを使う方法が一番安全で確実だと皆言ってるじゃないか
933Delギコ:01/09/21 10:15
    ∧ ∧  /
    (,,゚Д゚)<  こりゃまたすごいや。
     |つ つ  \
   @   |  
    ∪ ∪

動作コードみてようやくわかりました。
サンサンサンクスコクスコクスコーーーー

>>921の図でいうと
objAを取り外す場合

objAからメッセージを投げる
objDに伝わる
objDのサブクラス化を解除
objDからobjCに連絡
objCに伝わる
objCのサブクラス化を解除
objCからobjBに連絡
objBに伝わる
objBのサブクラス化解除
obfBからobfAに連絡
objAに伝わる
objAのサブクラス化解除
objAは自分自身なので何もしない
objAの処理が終わったので
objBに処理が戻り再度SubClass化
objBの処理が終わったので
objCに処理が戻り再度SubClass化
objCの処理が終わったので
objDニ処理が戻り再度SubClass化

こういう事になっているわけですね。
934Delギコ:01/09/21 10:27
 ∧ ∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (,,゚Д゚) < んまー。するどい>>932
  | つつヾ  \_______
〜|   | ユルシテヨ
  ∪∪

>  結果的にはそういう事だけど、
>  それに拘るからハマルんだよ

ええ、しっかりと浜りました。
みっちりときっちりと。

>  基本的にobjAからは objBが見えない。確実に割り出す方法はないんだよ。

そうっすね。
ということは、他人の作ったものが混じった場合、例えばここのCompo
http://www.psn.ne.jp/~nagayama/program/0017.html
(ごめんねサイト作者さん)
この仕組みは動作しないから…一体どうなるんだろ。

 …テストをしている限りは変な挙動はしていないみたい。
  ちゃんとtestLabelは取り外せますね。
  正しいのかな?

>  サブクラスがobjA,objBの2段だけなら サブクラス元のメソッドポインタから割り出せるけど
>  さらにサブクラスされているともうダメ

ですねー。

>  だから、メッセージを使う方法が一番安全で確実だと皆言ってるじゃないか

やっとわかたでし。
935デフォルトの名無しさん:01/09/21 10:39
再度 サブクラス解放についてのまとめ >>コンポーネント作家の方々へ

サブクラスを利用するコンポーネントは以下の手順で解放する事

var WM_DetachProc:Cardinal; をローカル変数として定義し
 コンポーネントの初期化部で
initialization
WM_DetachProc := RegisterWindowMessage('WM_SubclassFreeNotify');
end.
とする。

サブクラス解放時にはこのメッセージIDで
 WParam,LParam はユニークな値を入れて サブクラス先に送信する
 それを受信したWindowProcでは、
  この2つの値で送信者が自分かどうか判断し
   自分でなければリンクを解放して下位にメッセージを送り
   メッセージが帰って来たらリンクを再接続する
  送信者が自分ならリンクの解放だけを行う


VCL上のサブクラス取り外し
  WParam で selfが渡される WParam = LongInt(self)
  LParamは無視してよい    サンプルコード >>922

Win上のサブクラス取り外し
 LParamでプロセスID
 WParamはプロセス内ユニークな値(メソッドアドレス等それぞれのプロセスで管理)

注意: WM_DetachProc は定数ではないので case では使えない ifで判断する事
>>934 リンク先みてみた。

これが簡単に暴走しない理由は、
 FNewWndProc := MakeObjectInstance(WndProc);
とサンクを使っていて、オブジェクト解放時にこのサンクを解放していないからじゃないかと思う
937Delギコ:01/09/21 11:02
   ∧ ∧     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ( ゚Д゚)   < ほかの自作FormフックCompoも試した
.=| |==U=U==.| |= \___________
 | | |  |  | |   普通にVCLでフック解除するヤツだよ
 | | ノU U.  | |
 | |      .| |

testLabelを削除された時に
暴走はしないのですが
自作の方のサブクラス化は解除されてしまうます。
自作の方は正しくサブクラス化解除できないときは
例外を出すようにしてるからいいけど
タブン、マトモに削除するとWndProcがどこかに逝ってしまい
暴走するだろーな。

WM_DetachProc が流れた所で
安全にサブクラス化解除されない場合は例外発生して
元に戻るようにできないかいニャ。

 考え中.....

  そこまで拘らなくてもいいって肝するけどー。
938Delギコ:01/09/21 11:04
 ∧ ∧   /なんにせよ
 ( ゚Д゚) <  教えてくれたデフォルトの名無しさんズ。
  ノつノつ   \ありがとーう。
 ( 人  
  ソ  )
  ノ ノ
 ( 人  ネジッテ ミマシタ
  ソ  )
  ノ ノ
  UU
939878:01/09/21 11:07
>>895
最初の例が間違えてたっす。スマソ。

s/(\-\-|==)+/$1/g; の場合
「-」奇数→「---」
「-」偶数→「--」
ですな。例では「-=」ともに偶数だから結果は
895が書いてる通りになります。
940デフォルトの名無しさん:01/09/21 11:09
いまさらですが、サブクラスとは具体的にどういう作業を指すのでしょうか。
オブジェクト指向の一部ですか?それとも
単にテクニックの一つでしょうか。

サブクラスとWinProcとはどういう関係がありますか。
つーか、WinProcは何者ですか。
941デフォルトの名無しさん:01/09/21 11:16
Delphiでは、メッセージハンドラとしてメッセージマップなんかより、
ずっと綺麗にメッセージを隠蔽してるから、使わなくて問題無い。
また、Delphiでコールバック関数やメッセージ使うと、
あっという間に超読めないコードになる。
だから、メッセージ操作コード出さないでね>>Delギコ
942Delギコ:01/09/21 11:23
>>940
     ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ピュ.ー ( ゚Д゚)<  説明リンクを探したのだけど
  =〔~∪ ̄ ̄〕\いいのがないのだ。
  = ◎――◎

ちょっと前ならTNight2000っていう面白いCompoのサイトがあったのだが
サイトがお亡くなりになってしもた。
Googleのキャッシュでちょっと見れるみたい。

他には
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm
http://homepage2.nifty.com/boheme/delphi/tips/tec1080.htm
http://www.borland.co.jp/tips/delphi/dh015/index.html
こんなかんじかなあ。

簡単な説明すると
TLabelに流れてくるメッセージを見たい場合は
TLabelを継承してメッセージハンドラ記述して見てもいいんだけど
いろんな理由からそれをやりたくない場合
TLabelをサブクラス化するとそれが見れるという仕組みらしいよ


>>941何がいいたいんだ?
頻繁に必要になるものでもないが、必要なときには使うしかあるまい?
943Delギコ:01/09/21 11:48
             (  ヽ      ――――  ○  ――――
     , ⌒ヽ    (     )          // | \
    (    '   (       ヽ⌒ヽ 、   / / |    \
    ゝ    `ヽ(              )        | (⌒ 、
   (           、⌒         ヽ     (     ヽ
  (        (⌒              )   (
 (                          Y⌒ ヽ
  (        `)
   ゝ              ノ  ノ
_________________________________________________________________________________________
 〜〜 〜〜   〜〜〜  〜  〜〜  〜〜  〜  〜〜  〜
  〜〜     〜〜      〜〜        〜〜〜    〜
〜 〜〜     〜〜   〜〜   〜〜  〜〜    〜〜〜
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ....   ∧ ∧       ....      .....        ....      .....
 ....    (,,゚Д゚) ..      ....   ....      .....
    .... | ∪   ....           ...   ...       .
....    〜 | ナツガ オワッタ スレ モ オワッタ       ....          
  ....   ∪∪
       .... アツイ オモイデ サヨウナラ  ....      ....   ...     


新スレ立てました。サブクラス化などの続きはこちらで、、

( ゚Д゚)ノ Delギコ猫のプログラミング相談室part3
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001039863
944935:01/09/21 11:49
ああ、そうか、
 このメッセージが経路を辿る時に途中で解放せずにそのまま渡されて来る場合もある訳で
 経路の全てがこのメッセージをサポートしてるかどうかチェックする方法が無いといけないのか

 という事で、このメッセージを受け取った時のサブクラス先のポインタが自分が設定した時の
 状態に戻っていなければ・・・・・

 どうしようもないかな?
 せいぜいメッセージを出して別の何もしないコンポを動的に作成してそいつを割り当てておくしかないかも

という事でコンポ作家の皆さん >>935 をよろしく
945デフォルトの名無しさん:01/09/21 11:53
つまり、コントロールに送られたウィンドウメッセージを
最初に受け取るのが WinProc 関数であり、
これを別の関数に置換して、そちらにメッセージが
流れるように仕向ける操作を「サブクラス化」と呼ぶわけですか。
946884:01/09/21 11:54
>>939
ぁぁ納得したです
これで正規表現はバッチリだ(嘘
947デフォルトの名無しさん:01/09/21 12:08
>>941何がいいたいんだ?
>頻繁に必要になるものでもないが、必要なときには使うしかあるまい?

Delギコ生意気。使わずにできるぞ。
サブクラスの作成でつまずいてるんだろ。それがメッセージのせいって分からんのか。
分からんのだったら、人にアドバイスするな。
マターリいこうぜ
949Delギコ:01/09/21 12:49
 ∧ ∧      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (,,゚Д゚)    <  え〜、牛乳いかがっすかー。
./\品品昌_   \___________
( U__| 雷印 |
.U U ̄ ̄ ̄

カルシウム不足の方が1名おられるようで
他のお客様のご迷惑になりますので,,,
牛乳飲んどけ。

折れもカルシウム不足かも。ノンどくか。


でも、ウシって今・危ニャーかも??
>>949
牛乳には狂牛病の原因と考えられているプリオンは含まれません。
神経系の体液が関与しない限り安全です。
951デフォルトの名無しさん:01/09/21 21:11

終いには「Delギコ猫のプログラミング相談室」なんていう書籍が出そうだね(w
952デフォルトの名無しさん:01/09/22 06:13
なんで”サブクラス化”と言うのでしょうか?
サブクラスと言うと、子クラスを連想します。
数学の集合辺りの用語とか聞いた

>サブクラスと言うと、子クラスを連想します
合ってるやん
新スレあるのにageるとはこれいかに
>>Delギコ
スレが10までいったら書籍キボン。
デザパタとかも含めてお得なお値段\3Kあたりをキボンw

とりあえず終了
スレよりこれ以降は書き込みを自粛した方がよいかと思われ。
(モレモナー)

つうわけで再度誘導。

( ゚Д゚)ノ Delギコ猫のプログラミング相談室part3
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001039863
こっちのスレに書かしてもらいます。
なんとなく実装の改良案。
destructor TTestLabel.Destroy;
var
 TempWindowProc: TWndMethod;
 Msg: TMessage;
begin
 TempWindowProc := TCustomForm(Owner).WindowProc;
 TCustomForm(Owner).WindowProc := FOldWindowProc;
 Msg.Msg := WM_DetachProc;
 Msg.LParam := 0;
 Msg.WParam := WPARAM(Self);
 Msg.Result := 0;
 TempWindowProc(Msg);
inherited Destroy;
 if Msg.Result = 0 then
  raise Exception.Create('サブクラス化解除がおかしいですよ〜');
end;

procedure TTestLabel.MyWindowProc(var Msg: TMessage);
begin
 if Msg.Msg = WM_DetachProc then
 begin
  if Msg.WParam = WPARAM(Self) then
  begin
   Msg.Result := 1;
  end
  else
  begin
   FOldWindowProc(Msg);
   FOldWindowProc := TCustomForm(Owner).WindowProc;
   TCustomForm(Owner).WindowProc := Self.MyWindowProc;
  end;
 end
 else
  FOldWindowProc(Msg);
end;
957Delギッコー:01/09/22 11:32
    /\       ________
  /ギッコー   /
/____\ < 新スレでやろーう
  | ゚Д゚|    \
 ノ| || || || |し      ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         sageるよ
保守
にゃんまげ
保守