くだすれDelphi(超初 ..
481:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/17 16:42:31
>>481さん
ありがとうございます。
>上二つは1度呼ばれ三つめは3度呼ばれる。
なので、withを使った方が速度的には有利。
>副作用で実行結果すら異なることもあり得る。
この副作用ですが、withを使ったが為に起こると解釈してもいいでしょうか?
withを使わないと副作用が出ますというようなコードはいかがなものかと思うのですが・・・
483:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/17 19:30:36
Delphi の最適化はあまり当てにならないんだよね。
昔、サンプルプログラムにビットマップイメージをなるべくキレイに縮小する
コードがあったが、これは実数を使って計算していてあまりに遅いので整数に
直して数十倍のスピードにしたことがあった。ところが、面白いのは、プログ
ラムに、拡大ルーチン(縮小ルーチンとは別のプロシジャ)を組み込むと、若干
だが縮小の処理遅くなった。(拡大ルーチンは呼び出してない!!)
どうも、Delphiの最適化は、プログラムが小さいときは処理スピードが上がるように
最適化し、プログラムが大きくなるときは、処理スピードを犠牲にしてもプログラム
サイズが小さくなるようにしているみたいなんだ。
(これは Delphi2006とDelphi7で確かめた)
ま、だいたい1割くらいだったかな、遅くなったの。(ちょっとがっかりした)
485:ななしへたぐらま ◆XcB18Bks.Y
08/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:デフォルトの名無しさん
08/12/17 20:09:42
>>485
(最後の行)
>コンパイラはwith文を使わないときと同じようにTForm1のTagだと解釈します。
コンパイラはwith文を使わないときと同じようにTForm1のCaptionだと解釈します。
487:デフォルトの名無しさん
08/12/17 20:12:27
with を使うときは、何がどれに属しているかちゃんと知っていないとあぶない。
488:デフォルトの名無しさん
08/12/17 20:14:11
Delphi7で思考が止まってるけど、withって、コード補完が効かなくない?
なので、withは使わない様にしてる。
設定が足りないだけ?
489:デフォルトの名無しさん
08/12/17 21:05:33
そもそもDelphiのヘルプにObject PascalのBNFの記述がないのがおかしいんだけどな。
CodeGear腐ってる。
490:デフォルトの名無しさん
08/12/17 22:03:18
Synchronizeって引数付き関数呼べないよね?
引数付きの関数を呼ぶ場合どうすれば・・・
491:デフォルトの名無しさん
08/12/17 22:05:41
あ、メインスレッドでクリティカルセクション作っておいて、対象関数をEnterとLeaveで挟めば同じことかな?
492:デフォルトの名無しさん
08/12/17 22:18:11
>>491
気をつけないといけないのは、
メインスレッド側でも、サブスレッドで触る変数とかはクリティカルセクションで
ロック(?)しとかないといけない。
読み込むだけ、ならなくてもよい場合(1つの変数の値をよむだけとか)もある。
書き込むものは、しっかりとロックしとかないといけない
こういうのやるときはいきなり本番環境でやらずに、
簡単なスレッドのテストプログラムを作ってテストしてみるのがよいよ。
ポイントは(テスト駆動開発じゃないけど)必ず失敗するように組んでから、
成功するように組むとテストしやすい。
493:デフォルトの名無しさん
08/12/17 22:23:18
なるほど。
ってか変数読むだけならクリティカルセクション要らないんですか?
読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして)
494:デフォルトの名無しさん
08/12/17 22:36:05
サブスレッド側で値を書き込み
Synchronize中でメインスレッドから読みだすなら問題なし。
VCLが絡まないならCriticalSectionでももちろんいい。
>ってか変数読むだけならクリティカルセクション要らないんですか?
>読んでる最中に書き換えが起こると可能性があるとしても?(書き換え側は保護してるとして)
実際に遭遇したことはないけどマルチコア環境ではおかしくなるらしい。
495:デフォルトの名無しさん
08/12/17 22:54:16
念のため両方保護しておきます
>>492さん>>494さんありがとうございました
496:デフォルトの名無しさん
08/12/17 23:27:07
もう一つ質問すみません
クリティカルセクションはSyncronizeみたいにメインスレッドで実行するわけじゃないので、共用変数ごとに複数作っても問題ないですよね
もちろん保護内では共用変数は一つしか使わないという条件でです
497:デフォルトの名無しさん
08/12/18 00:16:02
>>496
もちろん可能だけど、(上で出た with のように)ちゃんと設計しないと
恐い恐いデッドロックに遭遇するので要注意です。
498:デフォルトの名無しさん
08/12/18 14:00:11
>>489
昔、breakやcontinueが「手続き」扱いで、びっくりしたことがある。
499:デフォルトの名無しさん
08/12/18 15:51:50
>490
Synchronizeは子スレッドで使用するので子スレッド内のPrivate変数を利用すればok、また参照だけならSynchronize
は必要ないですSynchronizeはあくまでメインスレッドの変数更新時の衝突回避なので
500:デフォルトの名無しさん
08/12/18 16:35:21
>>499
かなり昔のことで忘れたが、Synchronize で引数付き関数が呼べると「便利だなあ〜」などと思ったことがある。
コンパイラが頑張ってくれればできそうなものだと思うけど、間違ってる?
501:デフォルトの名無しさん
08/12/18 17:08:37
スレッドはTThreadをラップしてコンポーネント化してしまうと便利。
OnExecuteイベントハンドラにスレッドのコード書いて
FormのPrivateフィールドの変数を好き勝手に読み書きできて
そこからSynchronizeメソッドを呼ぶとOnSynchronizeイベントが呼び出されるようにして
UseThreadプロパティをFalseにするとサブスレッドを使わずメインスレッドからOnExecuteが実行されるように
小細工してロジックのバグを事前に潰しておくとデバッグがかなり楽になる。
502:デフォルトの名無しさん
08/12/18 19:19:57
なるほどね、コンポーネントにするところまでは考えなかった。
Threadを使うのに便利そうなUnitは作ったことあるけど、なんせ、マルチスレッド
にするプログラムはそう滅多になかったんで、(そのUnitは)どっかでカビが生え
たまま消滅してるはず。(ずーっと見てもいない)(^_^;
そういえばこの2年間シングルスレッドぱっかだなオレ。
503:ななしへたぐらま ◆XcB18Bks.Y
08/12/18 19:35:08
>>486
その通りでございます orz
ありがとう!
504:458
08/12/18 23:44:56
>>485
ありがとうございました
単なる私の不注意だったようですねお恥ずかしい
>>488
with内の[ItemIndex]は昔から効きませんね
505:デフォルトの名無しさん
08/12/19 09:28:39
>>501
コンポ化は便利そうだけど、イベントとして書くと貼り付けたFormのpas内に
コード書くことになるから、なんとなく抵抗があるな
スレッドは別処理するためにスレッドにすることが多いし、それだけで
ひとつのpasにまとめたい気分
506:デフォルトの名無しさん
08/12/19 09:33:42
>>501
それはいいかもね。
ちょっとした、TTimerのマルチスレッド版みたいな感覚かな。
MMTimerってのもあったけど、まあ、あれにはSynchronizeがなかったからな
507:デフォルトの名無しさん
08/12/19 09:54:41
>>505
つ TDataModule
508:デフォルトの名無しさん
08/12/19 21:08:05
TRegExprでExpressionに指定した正規表現が正しいか確認する方法はあるでしょうか?
Compileの例外を監視するとかですかね?
509:デフォルトの名無しさん
08/12/21 18:39:58
Del7でTMyForm作ってpublishedなプロパティ、イベントハンドラを追加して
それをフォームデザイナに反映させる方法ってない?
510:デフォルトの名無しさん
08/12/21 19:08:00
>>509
パッケージにするとか
511:デフォルトの名無しさん
08/12/21 21:43:26
>>509
フォームデザイナに反映させる時は、どうしてもIDEに組み込む必要があって
コンポーネントとかの形にしないといけないみたい
動的にはできないんだよな・・・
512:デフォルトの名無しさん
08/12/21 22:58:34
>>510-511
パッケージ化すればできちゃうの?
普通にコンポーネントとして登録すると
新規作成ででてくるのかな。
513:デフォルトの名無しさん
08/12/21 23:23:07
>509
ない。
あきらめろ(冷たいようだけど)。
514:デフォルトの名無しさん
08/12/23 01:06:16
TRegExprでテキストファイルの空行を削除するには、どうすればよいでしょうか?
^$とかではマッチしないし、(\r\n){2,}を\r\nに置き換えようとすると、そのまま\r\nが
表示されます・・・
515:デフォルトの名無しさん
08/12/23 01:27:44
>>514
^¥r¥n$だとどう?
516:514
08/12/23 01:34:30
>>515
即レスありがとうございます。
それでもマッチしません。
置換の方は、#13#10としてもダメです・・・
517:デフォルトの名無しさん
08/12/23 02:07:29
URLリンク(delwiki.info)
518:514
08/12/23 06:19:49
(?m)^\r\nでマッチするようになりました。
お騒がせしました。
519:514
08/12/23 07:16:29
続けてすみません。
置換後の文字列に改行を含むようにするにはどうすればよいか
分かりますでしょうか?
#13#10とすると、#13#10がそのまま表示されます。
520:デフォルトの名無しさん
08/12/23 07:21:53
'hogehoge'#13#10'fugafuga'
521:デフォルトの名無しさん
08/12/23 09:52:55
'hogehoge'+sLineBreak+'fugafuga'
522:デフォルトの名無しさん
08/12/23 10:15:36
sLineBreakって何で存在するの?
#13#10の方が短くていいじゃん
523:デフォルトの名無しさん
08/12/23 10:29:00
・数字の羅列よりも意味がわかりやすい
・将来、改行コードが変更されても対応しやすい
そんなところかと。
524:514
08/12/23 10:37:55
>>520-522
できました。
ありがとうございました。
525:デフォルトの名無しさん
08/12/23 17:12:04
>>523
追加:
・マジックナンバーつかうような奴とは仕事したくない、という奴と仕事ができる
526:デフォルトの名無しさん
08/12/23 17:37:39
じゃあ使わなくても何の問題もないな
527:デフォルトの名無しさん
08/12/23 21:58:23
>424
むちゃくちゃ遅レスでもう見てないと思うけど、こんなん見つけた。
Andy’s Blog and Tools ? Increase the number of MRU items
URLリンク(andy.jgknet.de)
528:デフォルトの名無しさん
08/12/24 12:52:47
HTMLパーサのコンポーネントでオススメのものありますか?
529:デフォルトの名無しさん
08/12/24 17:58:20
delphiに標準でついているコンポーネントのコンポーネントパレットに出ているアイコンの
画像を取りたいのですが、これらの画像はどこかのフォルダにあるんでしょうか?
delphi4です。
530:デフォルトの名無しさん
08/12/26 19:15:08
Print Screenキーでどうでしょ
531:デフォルトの名無しさん
08/12/26 21:43:48
そんなフォルダはないです? www
532:デフォルトの名無しさん
08/12/26 21:45:58
ない
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4250日前に更新/151 KB
担当:undef