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
388 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 00:17:14 ] TEditの枠のありなしでサイズが変わるのはVCL内で実装されているから、 継承してサイズが変わらないようにすればおk それ以前にコントロールは自分でも描画できるから、簡単に枠を描画することが可能 ↓にサンプルがある www.delphipages.com/threads/thread.cfm?ID=171344&G=171334 VCLはただWindowsコントロールをラップしてるだけでなく独自のコードも追加してるし、 >>383 はかなり見当違いの回答なので初心者は参考にしないようにね
389 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 00:22:03 ] 2006ではDelphi以外のHELPも(親切に)表示するのが仕様ということでハイ {{{{(+_+)}}}}。 (アーーーーめんどくさい) しかし、こんな簡単なことがデフォでできてないなんて、何なのこの会社?
390 名前:デフォルトの名無しさん [2008/12/11(木) 00:24:47 ] 教えてください。MediaPlayerを使って1から9までの動画をランダムにつなげて流すというプログラムを作っています(例えば2→5→8→1→3→9→4→7→6の順番で動画を流してくれるようなプログラムです) とりあえず作ってみたのですがボタンを押してもうんともすんとも動きません。ここが間違ってる、こうしたら良いなどのアドバイスをいただけたらと思います。よろしくお願いします var cou,new,test,i:Integer; video:Array[1..9]of integer; procedure TForm1.Button2Click(Sender: TObject); begin cou:=cou+1; if cou>9 then exit; Randomize; new:=Random(10); repeat test:=0; For i:=1 to cou do if new=video[i] then test:=1; If test=1 then new:=random(10); until test=0; video[cou]:=new; MediaPlayer2.FileName:=ExtractFilePath(application.ExeName)+'tabidachi'+IntToStr(new)+'.wmv'; MediaPlayer2.Open; MediaPlayer2.Notify:=True; MediaPlayer2.Play; procedure TForm1.MediaPlayer2Notify(Sender: TObject); if (MediaPlayer2.DeviceID <> 0) and (new < 10) then begin MediaPlayer2.FileName := ExtractFilePath(application.ExeName)+'tabidachi'+IntToStr(new)+'.wmv'; MediaPlayer2.Open; MediaPlayer2.Play; Inc(new); end;
391 名前:デフォルトの名無しさん [2008/12/11(木) 00:44:39 ] 宿題でダイヤモンドパターンのプログラムがあるのですが教えてください!!!!
392 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 00:45:27 ] couの初期値って何なの?
393 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 03:01:18 ] >>388 そうなんですか。それで変な動作をするんですね・・ TEdit くらい単純なラッパーの方がいいのに。
394 名前:386 mailto:sage [2008/12/11(木) 10:02:34 ] ヘルプの編集思い出した。 編集というか、デフォルトのフィルタを変更するだけだけど 「ヘルプ」→「フィルタの編集」 (フィルタなし) を選択して、例えば以下を突っ込んで Save ("DevLang"="Delphi") OR ("DocSet"="bds_Win32") OR ("DocSet"="PSDK") OR ("DocSet"="indy") これで、デフォルトでDelphiとBDS Win32とPlatformSDK、Indy 10からしか検索されない。 根本的にいらないヘルプをはずすわけではなく、 実質、起動時にフィルタを選択しているのでヘルプ起動時少し重いが難
395 名前:386 mailto:sage [2008/12/11(木) 10:06:04 ] 根本的に削除する方法みつけた。これでいけるんじゃね? ヘルプを登録しなおすには:某所:So-net blog bousyo.blog.so-net.ne.jp/2006-01-09 某所 - C++Builder のヘルプを削除するには bousyo.blog45.fc2.com/blog-entry-91.html
396 名前:386 mailto:sage [2008/12/11(木) 10:08:25 ] ああ、やべえ、 >>394 はやらん方がいいわw (フィルタなし) に Saveすると、以下の様にでて元に戻せなくなるわw --------------------------- Windows Internet Explorer --------------------------- Filter cannot be saved without a definition --------------------------- OK --------------------------- 欠陥ヘルプww
397 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 10:22:02 ] >>396 の問題は、deleteで(フィルタなし)を削除しようとしたら大丈夫だった >>395 のヘルプの編集はうまくいった。 以下C++と.NETの削除の方法 for Vista。 まずは、適当なフォルダに %PROGRAMFILES%\Borland\BDS\4.0\Help\Common\mergeWin32.xml をコピー。 以下のパッチを当てる。(といっても該当行を削除するだけ) --- mergeWin32.org.xml 2005-11-14 10:00:00.000000000 +0900 +++ mergeWin32.xml 2008-12-11 10:12:02.910931700 +0900 @@ -10,16 +10,13 @@ <CompiledIndex>Help\Win32\bds4Win32devguide.HxI</CompiledIndex> <CompiledIndex>Help\Win32\bds4Win32tasks.HxI</CompiledIndex> <CompiledIndex>Help\Win32\bds4Win32api_win32.HxI</CompiledIndex> -<CompiledIndex>Help\Win32\bds4Win32api_cpp.HxI</CompiledIndex> <HelpTopic>Help\Win32\bds4Win32guide.HxS</HelpTopic> <HelpTopic>Help\Win32\bds4Win32devguide.HxS</HelpTopic> <HelpTopic>Help\Win32\bds4Win32tasks.HxS</HelpTopic> <HelpTopic>Help\Win32\bds4Win32api_win32.HxS</HelpTopic> -<HelpTopic>Help\Win32\bds4Win32api_cpp.HxS</HelpTopic> </FileList> <Filters> <Filter Name="Developer Studio 2006 for Win32">"DocSet"="bds_Win32"</Filter> -<Filter Name="Language: C++">"DevLang"="C++"</Filter> </Filters> </Merge> </helpConfig> (つづく)
398 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 10:24:29 ] 同じフォルダに以下のregHelp.batファイルを作り、管理者権限で実行 copy mergeWin32.xml "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common" "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common\regHelp.exe" -7 "%PROGRAMFILES%\Borland\BDS\4.0\Help\Common\regHelp.exe" 5 おもむろにヘルプを起動すると、しばらく後適用された状態で検索ができる / ̄\ | | \_/ __|___ / \ / \ l | ( | \ 〃_/ >'⌒ ̄ ̄、,\ / \ / ィ ,ノ'ヾ ヽ ( / ), l ) ノ _,/ 、,, | /⌒ ̄ ̄ ̄ | l 、_ ,ノ ,/ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| . └┬:‐┬───┬‐────┘ ノ ,‐‐,) 丿,‐‐,) ┼ヽ -|r‐、. レ | (,∠/ (,∠/ d⌒) ./| _ノ __ノ
399 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 10:39:17 ] >>397 念のため編集前に mergeWin32.xml はバックアップを取っておいた方がよいです
400 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:52:35 ] >>394-399 サンキューベリーマッチ! m(_ _)m
401 名前:390 [2008/12/11(木) 13:28:48 ] >>392 さん 初期値は設定していません。設定しないとうまくいかないんでしょうか? 引き続きご回答いただければ幸いです。よろしくお願いします
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は使わない様にしてる。 設定が足りないだけ?