[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/05 09:41 / Filesize : 151 KB / Number-of Response : 533
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれDelphi(超初心者用)その48



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

402 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:33:07 ]
cou:=cou+1;
の行にBreakPointを置いて、実行。

止まったときのcouの値は?

cou:=0;
で初期化しないとだめじゃないの?
自動で0にしてくれたっけ?


403 名前:390 [2008/12/11(木) 13:57:43 ]
>>402さん
cou:=0;で設定し、ブレークポイント置いて実行してみました
couは1で止まってしまっているみたいです…

404 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 14:22:02 ]
ランダムに再生の前に、普通に再生は出来るの?
video: array[1..9]of Integer に適当に数値を入れて、再生させると再生できるの?
それとも、それでも再生できないの?

ランダムの部分がいけないのか、再生部分がいけないのかの切り分けはしましたか?


405 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/11(木) 14:41:32 ]
>>402
ローカル変数は初期化されません(0にしてくれません)。
だから自分で初期値として0を代入しなければなりません。
ちなみにグローバル変数は初期化されます(0にしてくれます)。

たまたま0になっているときもありますがこれを当て込んではいけません。


406 名前:390 [2008/12/11(木) 14:42:17 ]
>>404さん
ボタンを押しても何も起きません。読み込みもしてくれなくてうんともすんともです
再生部は問題ないようです。前半部のランダムの部分が良くないようです
説明不足な点が多くすみません

407 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 14:50:19 ]
この板の上の方にBINGOの問題があって、
そこで同じようにランダムに数値を並べる例が出てるから、みて見れば?

その例にそってvideo[1..9]にちゃんとランダムに数値を入れるところまで、
頑張ってみようよ。


408 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:18:31 ]
Del7でバックグラウンド、最小化状態のウィンドウを
フォアくグラウンドに持ってきたくて
www.swissdelphicenter.ch/torry/showcode.php?id=261
のコードを組み込んでみたところ
バックグラウンドからは成功したものの
最小化状態からはフォアグラウンド化できません。
どうやればいいんでしょうか。

409 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:52:35 ]
マウスのホイールをフックしたいのですがホイールの上下を感知することってできるのでしょうか?

410 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:00:56 ]
すみません
wParamを見ればいいことがわかりました
お騒がせしました



411 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 03:08:36 ]
var a: array[0..10] of Byte;
みたいな感じで定義した配列に、@a[0]を対象にMoveMemoryとかをやっても大丈夫なんですか?
配列はメモリ上で常に連続しているものなんですか?
Cardinal型とByte型の配列を相互に入れ替えるとき、Moveは面倒くさくて

412 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 03:40:11 ]
連続して無いとFileName: array[0..MAX_PATH] of Char;とか使えなくなる
ので連続してるだろう

413 名前:デフォルトの名無しさん [2008/12/13(土) 18:39:04 ]
すみません!!!
0から1の乱数randomを200回発生させ、第1項から200項目までの和、その平均、二乗和を求めるプログラムを穴埋めで回答するように。
という課題がわかりません↓↓
教えてください!!
なお、和はedit1、平均はedit2、二乗和はedit3に出力するものとし、
s: 和
ss: 二乗和
 r: 0 から1の乱数をいれる変数
av:  平均値       とする。
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
s,ss,r,av:real;
begin
s:=[(1)];
ss:=[(2)];

[(3)] i:=1 to [(4)]
[(5)]

r:=random;

s := s+ [(6)];
ss:= ss + [(7)];
end;
av:=s/[(8)];
edit1.text:=[(9)];
edit2.text:=FloatToStr(av);
edit3.text:=[(10)];
end;

}

414 名前:413の続き [2008/12/13(土) 18:42:22 ]
和の値(小数点以下3桁目を四捨五入する)
平均の値(小数点以下3桁目を四捨五入する)
二乗和の値(小数点以下3桁目を四捨五入する)
も是非是非お願いします!!!!

415 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:44:36 ]
これぐらい分からないとしょうがないぞ
0
0
for
do
begin
i
i*i
200
s
ss

416 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:46:11 ]
おれも出来てなかった

417 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:47:08 ]
自力で解く気ゼロだな

418 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:54:21 ]
5にrandomize入れてしまったw
4はdo beginで

419 名前:390 [2008/12/13(土) 22:00:35 ]
>>407さん
いろいろとアドバイスいただきありがとうございました。お礼が遅くなり申し訳ありません

420 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:34:48 ]
>>413
宿題スレはこちら
Pascalの宿題は俺にやらせろ!!Part2
pc11.2ch.net/test/read.cgi/tech/1136994325/



421 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 23:40:05 ]
宿題を丸投げする413が教授に怒られますように
ニヤニヤ

422 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 23:44:44 ]
大学でDelphi習うところあるんだね

423 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 00:05:58 ]
どっちかというとDelphiというよりはPascalだろーけどな

424 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 00:09:20 ]
Delphi2006でファイルメニューの「開き直す」を選んだとき、過去のプロジェクトがたった4件しか表示されません。
これだと、ちょっと別のプロジェクトをいじっていると肝心のプロジェクトが表示されなくなったりして面倒です。
そこで「開き直す」プロジェクト数を増やそうと思ってオプションを見ましたが、該当するパラメータが見つかりませんでした。
このようなプロジェクト数を増やす設定は可能でしょうか。


425 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 01:53:01 ]
>>424
それは俺も不便に思ってる。

スタートページも確かパス表示なしな上に、
プロジェクトの履歴少ないよな

426 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 04:33:00 ]
>>424
プロジェクトのショートカットをデスクトップにでも作っておけ

427 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 06:18:44 ]
ショートカットだと、もう一個IDEが起動する(´・ω・`)ショボーン

428 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 11:26:28 ]
Delphi2006なら
HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Closed Projects
を書き換えるだけのソフトを作っておけばいい
コマンドラインにプロジェクトファイルをくっつけて

429 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 11:42:52 ]
それって簡単?

430 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 11:45:35 ]
簡単かどうか試せばいいんじゃね?



431 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 12:04:00 ]
ActiveProjectsとかいうフォルダにショートカット作っておいて
タスクバー右クリツールバーの登録で指定して
>>から起動したいファイルをIDEにドラッグドロップすれば開けるんじゃね。

432 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 12:41:52 ]
>>430
やってみたけどIDE起動してると効かないみたい。そしてIDE終了さ
せるときエラーになる。
IDE起動してない状態で書き換え、IDE起動させれば確かに効くけど、
IDEの再起動が面倒かな。


433 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 13:18:43 ]
>>431
やってみた。

ショートカットだと .lnk ファイルが開かれるだけ。

実プロジェクトファイルだと、現行プロジェクトを非アクティブにしてプロジェクトグループに追加される。
しかし、元々関係ないプロジェクト同士でプロジェクトグループにすると、どのユニットが何がなんだか分か
らなくなる。


434 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 08:39:54 ]
いくつものスレッドでメインスレッドにある一つの配列をいじくる場合って衝突する危険性があると思います
どうやって衝突を回避するんですか?

435 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 08:50:37 ]
>>434
補足です
その共通に使う配列は構造体の配列でaddしたりDeleteしたりする関数を呼ぶ事で操作しています
スレッドから操作関数をよぶときにどこかが呼んでいる時は待つ、みたいなことができればいいと考えています
どうすればそういうことができるのでしょうか?

436 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 09:40:13 ]
mutexやCriticalSectionで衝突する可能性のあるコードを保護する。
TCriticalSectionでも使っとけ。

437 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 12:17:00 ]
下記スレッドの説明から


異なるスレッドが所有する VCL または CLX のメソッド/関数/
プロパティを別のスレッドの中から扱う場合、排他処理の問題が
発生します。

メインスレッドの所有するオブジェクトに対しては Synchronize
メソッドを使う事ができます。他のオブジェクトを参照するため
のメソッドをスレッドクラスに追加し、Synchronize メソッドの
引数として渡します。

438 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 13:43:44 ]
>>434 >>437
玄人ではありませんし、add,deleteの頻度にもよりますが、add,deleteが1秒内に何十回も発生するなら
そのたびにSynchronizeを多用するとスレッド化のメリットが失われますのでいかがなものかと思います。
その場合、私なら全配列を丸々コピーしてスレッド内処理後、Synchronizeもしくはterminate後に元にコピーします。
当然、メモリー効率は犠牲にします。
低頻度ならそのたびにSynchronizeで良いのでは?


439 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 14:04:42 ]
>>438
>434
>いくつものスレッドでメインスレッドにある一つの配列をいじくる場合
ということなので、各スレッドがコピーして保持し処理後にリストアするならばスレッドにする必要が無いと思う

>Synchronizeを多用するとスレッド化のメリットが失われます
メリットはまさに衝突回避なのだと思うけど、ここで頻度については議論の外でいいのでは?

まー後は434さんが実装して確認するのがはやいわな

440 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/16(火) 01:20:02 ]
>>411
亀ですが、言語仕様では

 「静的配列はその配列の要素型の連続した変数の並びとして格納されます」

とあります。

わかりにくいのですが「連続した変数の並び」ということなので
連続して並んでいることを保証していると考えて良いと思います。




441 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 04:00:12 ]
動的配列は連続してないかも、ってそんなことあるかいな・・

442 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 09:53:45 ]
動的配列はポインタ1個だから、1つのメモリブロックしか扱えない。
だから連続してないってことはありえない。

443 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 10:44:42 ]
初期化にFillCharルーチンなんぞを使ってるけど、動的配列や静的配列が
どんなに大きくてもここ数年まったく問題なく動いていますんで、間違い
なく連続してると思いますヨ。

444 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 18:16:34 ]
case文のelseはbegin,endでくくらなくてもOK?
case i of
1: aa;
2: bb;
else
cc1;
cc2;
end;

445 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 18:21:38 ]
ok

446 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/16(火) 19:42:58 ]
し、知りませんでした… orz

Delphi 4とDelphi 5の言語ガイド「case文」の項を見るとひとつの文しか記述出来ないような文面なのですが
Turbo Delphi Explorerのヘルプ「宣言と文」の項を見ると複数の文を記述できるという内容が書いてありました。
しかし試してみたところDelphi 5とTurbo Delphi Explorerの両方でコンパイルが通ってかつすべての文が実行されるのを確認しました。

case 文の else 以降にbegin〜endを付けなくて良いとなるとコードもかなりすっきりしそうですね。


447 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 20:28:16 ]
VCLのソース読むとかなり参考になるよ
例えばwith分で,で区切って複数の変数を使える
var


Edit: TEdit;
Button: TButton;
begin
中略
with Edit, Button do

Caption := Text;// ButtonのCaptionをEditのTextに設定
end;
これを知らないと
with Edit do with Button do〜とか書くことになる

448 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 20:30:33 ]
俺も知らなかった
でもcase文ってそんなに使わないよねってか使えないよねcase文って

449 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 20:38:12 ]
縁の下の力持ちってとこだろう

450 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [2008/12/16(火) 20:58:11 ]
>>447
私がVCLのソースを参考にしたものはこんな感じです:

・TStringsとその派生クラス
・TCollection/TCollectionItemとそ(ry
・Resultをループ変数に使う


>>448
          ( ))))))))))))
        //(;;;`∀´;;;)  使うんだな、それが!
         /     \
      __| |     | |___
     ||\   ̄ ̄ ̄ ̄     
     || \   -●-●




451 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:28:59 ]
case文使わなかったら、if then地獄になるじゃん

452 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:42:49 ]
相変わらずドキュメントがだめだなぁ

453 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:51:30 ]
ならWikiか何かで強力なドキュメント作っておくれよ

454 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:46:44 ]
何かでcase文よりIF文の方が早いって見てから、ずっとifelse羅列してる俺がいる。

455 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:56:55 ]
どう考えても逆w

5万で組んだマシンがあまりにも速すぎてゲーム以外では持て余し気味で
もうプロファイルも取らずに局所的な高速化を試みることもなくなったな。

456 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:57:32 ]
そんな超微量な時間のために可読性を捨てるのもちょっとな

457 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:44:29 ]
多態を使えばcaseの出番は減る。

多重なwithはスコープを不明確にするので控えめがお勧め。

458 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:03:35 ]
withって読みづらいからいらない

459 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:49:01 ]
case sender of
 btn1 : 〜;
 btn2 : 〜;
 btn3 : 〜;
end;
とかいつかは出来るようになると思って早・・・3.0からかな。
まぁ無理なんだけどね。なんかcase文って惜しいイメージ。
勿論多用する派。

460 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 01:42:08 ]
他の方法で



461 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 02:56:24 ]
case TButton(Sender).Tag of
 1 : 〜;
 2 : 〜;
 3 : 〜;
end;

で済ますかな自分なら。

462 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 09:21:06 ]
ヘルプ「宣言と文」を見てみたらひでえな。
コードが読みづらいし、間違ったセミコロン付いてるし。

463 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:28:34 ]
リストに格納した構造体のポインタを使う時なんかは、
いちいちキャストしなきゃならないのがうっとうしいからWith使うなぁ

464 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:34:09 ]
>>462
elseやendの前のセミコロンのことか?
それだったらずっと以前に拡張になったことと記憶してるが。


465 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:49:03 ]
いつからif文のelseの直前にセミコロン付けても良くなったんだ??

466 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:54:32 ]
>>463
昔作ったプログラムを後から見たとき、長い複文にwith使ったところ
は理解するのに一苦労した。これに懲りて今では例えば

var a:Hoge ← HogeHogeHogeHogeと同じオブジェクト型とする。
  .........
begin
  ..............
  a := HogeHogeHogeHoge;
  a.Nanchara := .....;
  a.Kanchara := .....;
  Dotchida(a.Nanchara);
  ..............
のようにして、with HogeHogeHogeHoge begin 〜 end の代わりにしてることが多い。
でも、withもたまに(短いとこに)は便利に使ってるよ。


467 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:01:52 ]
withを使うと効率がよくなると聞いたが。

a.hoge1 := 0
a.hoge2 := 0
a.hoge3 := 0

は毎行aを参照するコードが走るけど、

with a do
でくくるとaを参照するコードが1回で済む

という感じだった。


468 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:09:45 ]
コード行数は少なめに短くがモットーの俺はアンチwith
ループで何万回実行するとかじゃない限りそんな些細なことは気にしないな・・

469 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:55:23 ]
>コード行数は少なめに短く
これも些細なことだと気づかないのか?


470 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:01:40 ]
速度は計測しない限りわからんけど、コードは見ればすぐわかる
ソースは昔のものでも結構参照するし(俺は)、易読性が最重要



471 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:05:53 ]
Label1.Left := 10;
Label1.Top : = 100;
Label1.Caption := 'hogehoge';
Label1.Font.Hoge := hogehoge;
Label1.Font.Size := 13;



with Label1 do
begin
 Left := 10;
 Top : = 100;
 Caption := 'hogehoge';
 Font.Hoge := hogehoge;
 .Font.Size := 13;
end;

で、withがない方が見やすいんですね?
それなら良いんじゃないでしょうか。


472 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:08:12 ]
俺はね
そもそもbeginで改行するのすら許せない神経質

473 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:16:00 ]
>>472
ははは、笑った。それならそれを突き通すんだ!
誰も文句は無いですよ。


474 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:42:58 ]
コードは少ない方がいい。

そう思っていた時期もありました・・・

475 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:45:36 ]
改行は多いほど見やすい
長い文は二行に

そう思ってた時期が、俺にもありました

476 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 15:00:35 ]
>長い文は二行に
これは、今でもそうですね。
ただ、長い文になる事が無いように気を使ってコーディングしますけど。

>改行は多いほど見やすい
これは、ネタでも笑えないね。


477 名前:デフォルトの名無しさん [2008/12/17(水) 15:14:39 ]
2chの書き込みでも無駄に改行いれて書き込むおかしな人がいるが
そういう類の人じゃないだろうか?

478 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 15:24:57 ]
コンパイルされると最適化されるからどっちでもいい

479 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 15:59:55 ]
with do
を使う・使わないでコンパイルされるものが違うんでしょ?

最適化されないんでしょ?違うのかな?
教えてください。識者の方。


480 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 16:10:52 ]
同じ参照が続いたコードなんだから、コンパイルで最適化されると思うけどね



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 ]
ない






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<151KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef