1 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:50:40 ] Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を 勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが お礼はDelphiの布教と初心者の救済をお願いします。 <前スレ> くだすれDelphi(超初心者用)その47 pc11.2ch.net/test/read.cgi/tech/1214292265/ <過去スレ> DelWiki避難所(Delphi 関連の過去スレッド) delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
481 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 16:11:29 ] var alias: TMyType; begin alias := foo.bar.baz; alias.aaa; alias.bbb := 1; alias.ccc; end; は with foo.bar.baz do begin aaa; bbb := 1; ccc; end; と同じ。 foo.bar.baz.aaa; foo.bar.baz.bbb := 1; foo.bar.baz.ccc; とは異なる(可能性がある)。 プロパティbazがgetbazを呼んでいる場合 上二つは1度呼ばれ三つめは3度呼ばれる。 速度が遅くなるだけではなく副作用で実行結果すら異なることもあり得る。
482 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 16:42:31 ] >>481 さん ありがとうございます。 >上二つは1度呼ばれ三つめは3度呼ばれる。 なので、withを使った方が速度的には有利。 >副作用で実行結果すら異なることもあり得る。 この副作用ですが、withを使ったが為に起こると解釈してもいいでしょうか? withを使わないと副作用が出ますというようなコードはいかがなものかと思うのですが・・・
483 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 19:20:53 ] >>446 俺も知らなかったのでテストしてみたら新たな疑問が 上と下でSenderが変わってしまうのは何故? procedure TForm1.Button1Click(Sender: TObject); begin with (Sender as TButton) do begin case Tag of 0:Caption:='ゼロ'; 1:Caption:='いち'; else Caption:='たくさん'; ShowMessage('てすと'); end; Tag:=Tag+1; end; end; with (Sender as TComponent) do にするとフォームのキャプションが変わる?
484 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 19:30:36 ] Delphi の最適化はあまり当てにならないんだよね。 昔、サンプルプログラムにビットマップイメージをなるべくキレイに縮小する コードがあったが、これは実数を使って計算していてあまりに遅いので整数に 直して数十倍のスピードにしたことがあった。ところが、面白いのは、プログ ラムに、拡大ルーチン(縮小ルーチンとは別のプロシジャ)を組み込むと、若干 だが縮小の処理遅くなった。(拡大ルーチンは呼び出してない!!) どうも、Delphiの最適化は、プログラムが小さいときは処理スピードが上がるように 最適化し、プログラムが大きくなるときは、処理スピードを犠牲にしてもプログラム サイズが小さくなるようにしているみたいなんだ。 (これは Delphi2006とDelphi7で確かめた) ま、だいたい1割くらいだったかな、遅くなったの。(ちょっとがっかりした)
485 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/17(水) 20:06:45 ] >>458 with文は最近使うようになりました。たとえば Nantoka.Kantoka.Untara.Kantara.Options := Nantoka.Kantoka.Untara.Kantara.Options + [opHoeHoe, opHanyaan]; みたいな文だと with Nantoka.Kantoka.Untara.Kantara do Options := Options + [opHoeHoe, opHanyaan]; と読みやすく感じます。 最近のDelphiのIDEは入力補完でもwith文に対応してくれているようなので昔よりは使いやすいと思います。 何行にもわたる場合やwith a, b, c do とか書かれると私の場合は逆に混乱してしまいますので使いません。 >>483 TComponentにはTagはありますがCaptionはないからです。 with (なんとか) do のブロック内では コンパイラはできる限り(なんとか)に対する記述であると解釈します。 そしてそのように解釈できない場合はwith文を使わないときと同じように解釈します. そのため with Sender as TComponent do とした場合、 このwithブロック内で単にTagと書かれている場合には TComponentにはTagプロパティがあるので コンパイラはSender as TComponentのTagだと解釈します。 一方でこのwithブロック内で単にCaptionと書かれている場合には TComponentにはCaptionプロパティがないので コンパイラはwith文を使わないときと同じようにTForm1のTagだと解釈します。
486 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 20:09:42 ] >>485 (最後の行) >コンパイラはwith文を使わないときと同じようにTForm1のTagだと解釈します。 コンパイラはwith文を使わないときと同じようにTForm1のCaptionだと解釈します。
487 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 20:12:27 ] with を使うときは、何がどれに属しているかちゃんと知っていないとあぶない。
488 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 20:14:11 ] Delphi7で思考が止まってるけど、withって、コード補完が効かなくない? なので、withは使わない様にしてる。 設定が足りないだけ?
489 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 21:05:33 ] そもそもDelphiのヘルプにObject PascalのBNFの記述がないのがおかしいんだけどな。 CodeGear腐ってる。
490 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:03:18 ] Synchronizeって引数付き関数呼べないよね? 引数付きの関数を呼ぶ場合どうすれば・・・
491 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:05:41 ] あ、メインスレッドでクリティカルセクション作っておいて、対象関数をEnterとLeaveで挟めば同じことかな?
492 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:18:11 ] >>491 気をつけないといけないのは、 メインスレッド側でも、サブスレッドで触る変数とかはクリティカルセクションで ロック(?)しとかないといけない。 読み込むだけ、ならなくてもよい場合(1つの変数の値をよむだけとか)もある。 書き込むものは、しっかりとロックしとかないといけない こういうのやるときはいきなり本番環境でやらずに、 簡単なスレッドのテストプログラムを作ってテストしてみるのがよいよ。 ポイントは(テスト駆動開発じゃないけど)必ず失敗するように組んでから、 成功するように組むとテストしやすい。
493 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:23:18 ] なるほど。 ってか変数読むだけならクリティカルセクション要らないんですか? 読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして)
494 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:36:05 ] サブスレッド側で値を書き込み Synchronize中でメインスレッドから読みだすなら問題なし。 VCLが絡まないならCriticalSectionでももちろんいい。 >ってか変数読むだけならクリティカルセクション要らないんですか? >読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして) 実際に遭遇したことはないけどマルチコア環境ではおかしくなるらしい。
495 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 22:54:16 ] 念のため両方保護しておきます >>492 さん>>494 さんありがとうございました
496 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 23:27:07 ] もう一つ質問すみません クリティカルセクションはSyncronizeみたいにメインスレッドで実行するわけじゃないので、共用変数ごとに複数作っても問題ないですよね もちろん保護内では共用変数は一つしか使わないという条件でです
497 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 00:16:02 ] >>496 もちろん可能だけど、(上で出た with のように)ちゃんと設計しないと 恐い恐いデッドロックに遭遇するので要注意です。
498 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 14:00:11 ] >>489 昔、breakやcontinueが「手続き」扱いで、びっくりしたことがある。
499 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 15:51:50 ] >490 Synchronizeは子スレッドで使用するので子スレッド内のPrivate変数を利用すればok、また参照だけならSynchronize は必要ないですSynchronizeはあくまでメインスレッドの変数更新時の衝突回避なので
500 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 16:35:21 ] >>499 かなり昔のことで忘れたが、Synchronize で引数付き関数が呼べると「便利だなあ〜」などと思ったことがある。 コンパイラが頑張ってくれればできそうなものだと思うけど、間違ってる?
501 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 17:08:37 ] スレッドはTThreadをラップしてコンポーネント化してしまうと便利。 OnExecuteイベントハンドラにスレッドのコード書いて FormのPrivateフィールドの変数を好き勝手に読み書きできて そこからSynchronizeメソッドを呼ぶとOnSynchronizeイベントが呼び出されるようにして UseThreadプロパティをFalseにするとサブスレッドを使わずメインスレッドからOnExecuteが実行されるように 小細工してロジックのバグを事前に潰しておくとデバッグがかなり楽になる。
502 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 19:19:57 ] なるほどね、コンポーネントにするところまでは考えなかった。 Threadを使うのに便利そうなUnitは作ったことあるけど、なんせ、マルチスレッド にするプログラムはそう滅多になかったんで、(そのUnitは)どっかでカビが生え たまま消滅してるはず。(ずーっと見てもいない)(^_^; そういえばこの2年間シングルスレッドぱっかだなオレ。
503 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/18(木) 19:35:08 ] >>486 その通りでございます orz ありがとう!
504 名前:458 mailto:sage [2008/12/18(木) 23:44:56 ] >>485 ありがとうございました 単なる私の不注意だったようですねお恥ずかしい >>488 with内の[ItemIndex]は昔から効きませんね
505 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 09:28:39 ] >>501 コンポ化は便利そうだけど、イベントとして書くと貼り付けたFormのpas内に コード書くことになるから、なんとなく抵抗があるな スレッドは別処理するためにスレッドにすることが多いし、それだけで ひとつのpasにまとめたい気分
506 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 09:33:42 ] >>501 それはいいかもね。 ちょっとした、TTimerのマルチスレッド版みたいな感覚かな。 MMTimerってのもあったけど、まあ、あれにはSynchronizeがなかったからな
507 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 09:54:41 ] >>505 つ TDataModule
508 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 21:08:05 ] TRegExprでExpressionに指定した正規表現が正しいか確認する方法はあるでしょうか? Compileの例外を監視するとかですかね?
509 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 18:39:58 ] Del7でTMyForm作ってpublishedなプロパティ、イベントハンドラを追加して それをフォームデザイナに反映させる方法ってない?
510 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 19:08:00 ] >>509 パッケージにするとか
511 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 21:43:26 ] >>509 フォームデザイナに反映させる時は、どうしてもIDEに組み込む必要があって コンポーネントとかの形にしないといけないみたい 動的にはできないんだよな・・・
512 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:58:34 ] >>510-511 パッケージ化すればできちゃうの? 普通にコンポーネントとして登録すると 新規作成ででてくるのかな。
513 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 23:23:07 ] >509 ない。 あきらめろ(冷たいようだけど)。
514 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:06:16 ] TRegExprでテキストファイルの空行を削除するには、どうすればよいでしょうか? ^$とかではマッチしないし、(\r\n){2,}を\r\nに置き換えようとすると、そのまま\r\nが 表示されます・・・
515 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:27:44 ] >>514 ^¥r¥n$だとどう?
516 名前:514 mailto:sage [2008/12/23(火) 01:34:30 ] >>515 即レスありがとうございます。 それでもマッチしません。 置換の方は、#13#10としてもダメです・・・
517 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 02:07:29 ] delwiki.info/?%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%2FTRegExpr%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%98%E3%83%AB%E3%83%97%2FSyntax%20of%20Regular%20Expressions
518 名前:514 mailto:sage [2008/12/23(火) 06:19:49 ] (?m)^\r\nでマッチするようになりました。 お騒がせしました。
519 名前:514 mailto:sage [2008/12/23(火) 07:16:29 ] 続けてすみません。 置換後の文字列に改行を含むようにするにはどうすればよいか 分かりますでしょうか? #13#10とすると、#13#10がそのまま表示されます。
520 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 07:21:53 ] 'hogehoge'#13#10'fugafuga'
521 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 09:52:55 ] 'hogehoge'+sLineBreak+'fugafuga'
522 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 10:15:36 ] sLineBreakって何で存在するの? #13#10の方が短くていいじゃん
523 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 10:29:00 ] ・数字の羅列よりも意味がわかりやすい ・将来、改行コードが変更されても対応しやすい そんなところかと。
524 名前:514 mailto:sage [2008/12/23(火) 10:37:55 ] >>520-522 できました。 ありがとうございました。
525 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 17:12:04 ] >>523 追加: ・マジックナンバーつかうような奴とは仕事したくない、という奴と仕事ができる
526 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 17:37:39 ] じゃあ使わなくても何の問題もないな
527 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:58:23 ] >424 むちゃくちゃ遅レスでもう見てないと思うけど、こんなん見つけた。 Andy’s Blog and Tools ? Increase the number of MRU items ttp://andy.jgknet.de/blog/?page_id=198
528 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 12:52:47 ] HTMLパーサのコンポーネントでオススメのものありますか?
529 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 17:58:20 ] delphiに標準でついているコンポーネントのコンポーネントパレットに出ているアイコンの 画像を取りたいのですが、これらの画像はどこかのフォルダにあるんでしょうか? delphi4です。
530 名前:デフォルトの名無しさん [2008/12/26(金) 19:15:08 ] Print Screenキーでどうでしょ
531 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 21:43:48 ] そんなフォルダはないです? www
532 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 21:45:58 ] ない