08/12/03 18:01:45
>>347
それだと非ビジュアルコンポーネントまでカウントしてしまうので
> if Components[i] is TControl then
みたいに絞り込むか ControlCount/Controls を使うと良いと思います。
>>326
Delphiはプログラミング教育用に生まれたPascalの血を引いた言語ですから
わかりやすさを捨てることはないでしょうね。
逆にPascalのbegin~endがうざかった人間が作ったのがCですから
突き放したような結論で恐縮ですが
「Delphiのbegin~endがうざいならCPB使え」
ということになってしまうのではないかと思います。
(…なあんてことを書いたときに限ってDelphi2010あたりで{}が実装されたりして)
350:デフォルトの名無しさん
08/12/03 21:11:09
そういえば昔、SQL Anywhere というデータベースを使ったことがあったが、
そのストアードプロシジャーは if文が
if 条件 then 文1 else 文2 end
という構文で、文1と文2は単文でも複文でも begin end が不要だったな。
ありゃあ見やすいし、書きやすかった。
begin end や { } なんて過去の遺物、消え去るよ。
351:デフォルトの名無しさん
08/12/03 21:19:41
graphics32ってMPL1.1ですけど、改造しないで普通に使用して公開する場合は
ソースを公開する必要はないと聞きますけど
ここの URLリンク(ja.wikipedia.org)
特徴のところで
バイナリ形式で配布する場合には、ソースをバイナリと一緒に公開しないと
いけないみたいな事かいてるんですけどどっちが本当ですか?
352:デフォルトの名無しさん
08/12/03 21:39:55
>>349
どれのことだ
URLリンク(ja.wikipedia.org)
CPB
* ビルマ共産党
* キャンベル・スープ・カンパニーのNYSEコード。
* 公共放送機構 (Corporation for Public Broadcasting)
* セントラル・パシフィック・バンク
353:デフォルトの名無しさん
08/12/03 21:57:27
BCBだな
354:デフォルトの名無しさん
08/12/03 22:42:57
>>351
Delphi持ってるならGLSceneを使え
スレリンク(tech板)
の 25 辺りから見るとよいよー
355:351
08/12/04 04:45:25
>>354
やっぱりソースは公開しなくても良いんですね
おかげでスッキリしました、ありがとうございます
356:ななしへたぐらま ◆XcB18Bks.Y
08/12/04 16:30:30
すいません、思いっきり略称間違えました… orz
357:デフォルトの名無しさん
08/12/05 02:03:30
onKeyDown や onKeyPress などを使って、
『キーの同時押し』を検知する方法ってありますか?
たとえばAlt + Tab を検知するなど。
358:デフォルトの名無しさん
08/12/05 02:36:22
Downならif Shift = [ssAlt] thenで
359:デフォルトの名無しさん
08/12/05 18:41:49
GetAsyncKeyStateはだめ?
360:デフォルトの名無しさん
08/12/06 00:02:20
同時押しの検出ならGetKeyStateかShiftパラメータでは?
361:デフォルトの名無しさん
08/12/06 09:00:10
Del7+Win2000
フォームを半透過指定してフォーム上のコンポーネントは非透過ってのは可能?
Transparentみたいな色指定透過っぽい感じ
362:デフォルトの名無しさん
08/12/06 10:45:21
Pascal を C++ っぽくしろって、
日本語は英語と同じ文法にしろっていうような門やん
363:デフォルトの名無しさん
08/12/06 15:16:53
>>362
Begin...Endの事?
そうは思わないな…
日本語だって英語の良いところはカタカナという形で吸収するんだから
コメントと文法くくりはBegin、{両方サポートしてくれたら私もうれしいな。
でもそうなると過去のソースが動かなくなるわけで、そこまでして言語仕様を拡張することには反対
結果として{は無理だと思うけど。
コンパイラ指令で切り分けできたら面白いすね、デフォルトはOFFで。
364:デフォルトの名無しさん
08/12/06 15:45:26
TEditの枠線の色を赤色に変えるにはどうしたらいいでしょうか?
よろしくお願いします。
365:デフォルトの名無しさん
08/12/06 15:51:45
OSの管轄なので無理
あるいはオナニードロドロ
366:364
08/12/06 15:58:30
早速回答ありがとうございます。
ちょっと変えてくれと言われたんだけど厳しそうだし、
見た目の問題だけなのでそのまま放置しますw
367:デフォルトの名無しさん
08/12/06 16:00:53
>>364
一回り大きいPanelに乗せてPanelの色を変える
368:デフォルトの名無しさん
08/12/06 16:12:37
>>366
ならそいつにVSでも変えてろハゲとでも言ってればいい希ガス
369:デフォルトの名無しさん
08/12/06 19:18:45
Delphi2006でヘルプを使いDelphi終了すると、タスクにdexplore.exeが残り、
再びDelphi2006起動してヘルプを使いDelphi終了すると、タスクにdexplore.exeが2つ残り、
とドンドンdexplore.exeがタスクに増えて行きます。(OSはXPです)
これって、メモリーけっこう食ってますが、Delphiのバグでしょうか?
370:デフォルトの名無しさん
08/12/06 21:16:21
dexplorerのバグでしょう、きっと。
371:デフォルトの名無しさん
08/12/07 09:41:05
VS だとそんなことないから Delphi のIDEのバグじゃないの?
372:デフォルトの名無しさん
08/12/07 11:49:41
食わせてるデータがまずいからだとは思うんだけど、それで逝っちゃうようなのはやっぱりバグだと思うんだ。
DelphiのIDEはDExplorerをキックしてるだけだしね。ちなみにXPで発現することが多いみたい。
373:デフォルトの名無しさん
08/12/07 16:17:50
Borland Developer Studio 2006 (Professional)をデフォ状態でDelphi使うと
ヘルプにC++の内容まで検索されてウザイ。
C++の内容が検索されなくなる設定ができるかどうか調べても未だに分からない。
どなたかHELP!
374:デフォルトの名無しさん
08/12/07 19:34:12
それが円馬鹿クオリテー
375:デフォルトの名無しさん
08/12/08 02:15:33
フィルタ条件ではあかんのか
376:デフォルトの名無しさん
08/12/08 09:20:16
6とかだとヘルプファイルの検索対象の範囲とか設定できるんだけどねぇ‥‥
CLXのヘルプ外したりとか。
377:デフォルトの名無しさん
08/12/08 11:59:47
ヘルプはひどいな
リンクも不十分だし、欲しい情報になかなかとべん
378:ななしへたぐらま ◆XcB18Bks.Y
08/12/08 17:35:10
旧ボーランド時代からヘルプは良くなかったですねぇ。
初代Delphiの頃はまだ良かったのですが…
>>367
さらにEditを枠無しにしたら完璧ですね。
379:デフォルトの名無しさん
08/12/09 16:44:35
>>378
やってみたけど枠を消すと文字がずれて、枠有りの状態のようにはいかなかった。
380:ななしへたぐらま ◆XcB18Bks.Y
08/12/09 17:47:19
確かにうまくいきませんでした。
赤パネル
Editと同じ色のパネル
Edit
の三段重ねでEditの位置を調整してなんとかそれらしく?なりましたがなかなか骨の折れる作業です。
複数貼り付けるならアンカーを使ったり赤パネルの代わりに赤フレームにすると作業効率は多少ましになるかもしれませんが
AutoSizeが利かなくなるのかフォントサイズを変えてもウィンドウサイズが変わらないのはつらいですね。
381:デフォルトの名無しさん
08/12/09 18:32:27
そんなことするよりTCustomEdit継承して新しく作った方が楽じゃない?
382:デフォルトの名無しさん
08/12/09 20:53:08
初心者質問お願いします。
DateTimePickerにMaxDateを設定している時、
プログラムでDateTimePickerのDate プロパティにMaxDateと同じ日付を代入することはできないのでしょうか?
手動ではMaxDateの日付を設定できます。
当方Delphi4です。
~例~
(MaxDate は2008/12/31と設定している)
DateTimePicker1.Date := StrToDate('2008/12/30'); ・・・日付が反映される
DateTimePicker1.Date := StrToDate('2008/12/31'); ・・・日付が反映されない
DateTimePicker1.Date := StrToDate('2009/1/1'); ・・・日付が範囲を超えているとエラーが出る
(手動で2008/12/31を設定することはできる)
383:デフォルトの名無しさん
08/12/09 21:23:34
TEdit も TDateTimePicker もウィンドウズのコントロールだから、その機能は
本質的には Delphi と関係ない。MSDN 読むほうがいい。 >>381 は馬鹿回答。
384:382
08/12/09 21:49:28
>>383
そうでしたかぁ。
ありがとうございました。
385:デフォルトの名無しさん
08/12/10 00:48:07
>382
Timeプロパティに何が入ってるか確認したほうがよいかも。
386:デフォルトの名無しさん
08/12/10 08:21:07
>>373
俺も2006でDelphiだけが表示される正式なヤリ方がしりたい。
前にどこかを見てやったときは、ヘルプのアプリ?がバグバグで
設定したのに設定したことにならなかったり嫌になった覚えがあるな。
しかし、どうやって設定したか憶えてなくて困る。
Delphiヘルプのみってのが確かできたはずなんだが。
6の時はテキスト弄るだけで簡単だったけどな。
387:382
08/12/10 13:20:42
>>385
Timeプロパティを00:00:00にしたら正しく動きました!
ありがとうございました!
388:デフォルトの名無しさん
08/12/11 00:17:14
TEditの枠のありなしでサイズが変わるのはVCL内で実装されているから、
継承してサイズが変わらないようにすればおk
それ以前にコントロールは自分でも描画できるから、簡単に枠を描画することが可能
↓にサンプルがある
URLリンク(www.delphipages.com)
VCLはただWindowsコントロールをラップしてるだけでなく独自のコードも追加してるし、
>>383はかなり見当違いの回答なので初心者は参考にしないようにね
389:デフォルトの名無しさん
08/12/11 00:22:03
2006ではDelphi以外のHELPも(親切に)表示するのが仕様ということでハイ {{{{(+_+)}}}}。
(アーーーーめんどくさい)
しかし、こんな簡単なことがデフォでできてないなんて、何なのこの会社?
390:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 00:44:39
宿題でダイヤモンドパターンのプログラムがあるのですが教えてください!!!!
392:デフォルトの名無しさん
08/12/11 00:45:27
couの初期値って何なの?
393:デフォルトの名無しさん
08/12/11 03:01:18
>>388 そうなんですか。それで変な動作をするんですね・・ TEdit くらい単純なラッパーの方がいいのに。
394:386
08/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
08/12/11 10:06:04
根本的に削除する方法みつけた。これでいけるんじゃね?
ヘルプを登録しなおすには:某所:So-net blog
URLリンク(bousyo.blog.so-net.ne.jp)
某所 - C++Builder のヘルプを削除するには
URLリンク(bousyo.blog45.fc2.com)
396:386
08/12/11 10:08:25
ああ、やべえ、 >>394 はやらん方がいいわw
(フィルタなし) に Saveすると、以下の様にでて元に戻せなくなるわw
---------------------------
Windows Internet Explorer
---------------------------
Filter cannot be saved without a definition
---------------------------
OK
---------------------------
欠陥ヘルプww
397:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 10:39:17
>>397
念のため編集前に mergeWin32.xml はバックアップを取っておいた方がよいです
400:デフォルトの名無しさん
08/12/11 12:52:35
>>394-399
サンキューベリーマッチ! m(_ _)m
401:390
08/12/11 13:28:48
>>392さん
初期値は設定していません。設定しないとうまくいかないんでしょうか?
引き続きご回答いただければ幸いです。よろしくお願いします
402:デフォルトの名無しさん
08/12/11 13:33:07
cou:=cou+1;
の行にBreakPointを置いて、実行。
止まったときのcouの値は?
cou:=0;
で初期化しないとだめじゃないの?
自動で0にしてくれたっけ?
403:390
08/12/11 13:57:43
>>402さん
cou:=0;で設定し、ブレークポイント置いて実行してみました
couは1で止まってしまっているみたいです…
404:デフォルトの名無しさん
08/12/11 14:22:02
ランダムに再生の前に、普通に再生は出来るの?
video: array[1..9]of Integer に適当に数値を入れて、再生させると再生できるの?
それとも、それでも再生できないの?
ランダムの部分がいけないのか、再生部分がいけないのかの切り分けはしましたか?
405:ななしへたぐらま ◆XcB18Bks.Y
08/12/11 14:41:32
>>402
ローカル変数は初期化されません(0にしてくれません)。
だから自分で初期値として0を代入しなければなりません。
ちなみにグローバル変数は初期化されます(0にしてくれます)。
たまたま0になっているときもありますがこれを当て込んではいけません。
406:390
08/12/11 14:42:17
>>404さん
ボタンを押しても何も起きません。読み込みもしてくれなくてうんともすんともです
再生部は問題ないようです。前半部のランダムの部分が良くないようです
説明不足な点が多くすみません
407:デフォルトの名無しさん
08/12/11 14:50:19
この板の上の方にBINGOの問題があって、
そこで同じようにランダムに数値を並べる例が出てるから、みて見れば?
その例にそってvideo[1..9]にちゃんとランダムに数値を入れるところまで、
頑張ってみようよ。
408:デフォルトの名無しさん
08/12/11 16:18:31
Del7でバックグラウンド、最小化状態のウィンドウを
フォアくグラウンドに持ってきたくて
URLリンク(www.swissdelphicenter.ch)
のコードを組み込んでみたところ
バックグラウンドからは成功したものの
最小化状態からはフォアグラウンド化できません。
どうやればいいんでしょうか。
409:デフォルトの名無しさん
08/12/11 22:52:35
マウスのホイールをフックしたいのですがホイールの上下を感知することってできるのでしょうか?
410:デフォルトの名無しさん
08/12/11 23:00:56
すみません
wParamを見ればいいことがわかりました
お騒がせしました
411:デフォルトの名無しさん
08/12/13 03:08:36
var a: array[0..10] of Byte;
みたいな感じで定義した配列に、@a[0]を対象にMoveMemoryとかをやっても大丈夫なんですか?
配列はメモリ上で常に連続しているものなんですか?
Cardinal型とByte型の配列を相互に入れ替えるとき、Moveは面倒くさくて
412:デフォルトの名無しさん
08/12/13 03:40:11
連続して無いとFileName: array[0..MAX_PATH] of Char;とか使えなくなる
ので連続してるだろう
413:デフォルトの名無しさん
08/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の続き
08/12/13 18:42:22
和の値(小数点以下3桁目を四捨五入する)
平均の値(小数点以下3桁目を四捨五入する)
二乗和の値(小数点以下3桁目を四捨五入する)
も是非是非お願いします!!!!
415:デフォルトの名無しさん
08/12/13 18:44:36
これぐらい分からないとしょうがないぞ
0
0
for
do
begin
i
i*i
200
s
ss
416:デフォルトの名無しさん
08/12/13 18:46:11
おれも出来てなかった
417:デフォルトの名無しさん
08/12/13 18:47:08
自力で解く気ゼロだな
418:デフォルトの名無しさん
08/12/13 18:54:21
5にrandomize入れてしまったw
4はdo beginで
419:390
08/12/13 22:00:35
>>407さん
いろいろとアドバイスいただきありがとうございました。お礼が遅くなり申し訳ありません
420:デフォルトの名無しさん
08/12/13 22:34:48
>>413
宿題スレはこちら
Pascalの宿題は俺にやらせろ!!Part2
スレリンク(tech板)
421:デフォルトの名無しさん
08/12/13 23:40:05
宿題を丸投げする413が教授に怒られますように
ニヤニヤ
422:デフォルトの名無しさん
08/12/13 23:44:44
大学でDelphi習うところあるんだね
423:デフォルトの名無しさん
08/12/14 00:05:58
どっちかというとDelphiというよりはPascalだろーけどな
424:デフォルトの名無しさん
08/12/14 00:09:20
Delphi2006でファイルメニューの「開き直す」を選んだとき、過去のプロジェクトがたった4件しか表示されません。
これだと、ちょっと別のプロジェクトをいじっていると肝心のプロジェクトが表示されなくなったりして面倒です。
そこで「開き直す」プロジェクト数を増やそうと思ってオプションを見ましたが、該当するパラメータが見つかりませんでした。
このようなプロジェクト数を増やす設定は可能でしょうか。
425:デフォルトの名無しさん
08/12/14 01:53:01
>>424
それは俺も不便に思ってる。
スタートページも確かパス表示なしな上に、
プロジェクトの履歴少ないよな
426:デフォルトの名無しさん
08/12/14 04:33:00
>>424
プロジェクトのショートカットをデスクトップにでも作っておけ
427:デフォルトの名無しさん
08/12/14 06:18:44
ショートカットだと、もう一個IDEが起動する(´・ω・`)ショボーン
428:デフォルトの名無しさん
08/12/14 11:26:28
Delphi2006なら
HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Closed Projects
を書き換えるだけのソフトを作っておけばいい
コマンドラインにプロジェクトファイルをくっつけて
429:デフォルトの名無しさん
08/12/14 11:42:52
それって簡単?
430:デフォルトの名無しさん
08/12/14 11:45:35
簡単かどうか試せばいいんじゃね?
431:デフォルトの名無しさん
08/12/14 12:04:00
ActiveProjectsとかいうフォルダにショートカット作っておいて
タスクバー右クリツールバーの登録で指定して
>>から起動したいファイルをIDEにドラッグドロップすれば開けるんじゃね。
432:デフォルトの名無しさん
08/12/14 12:41:52
>>430
やってみたけどIDE起動してると効かないみたい。そしてIDE終了さ
せるときエラーになる。
IDE起動してない状態で書き換え、IDE起動させれば確かに効くけど、
IDEの再起動が面倒かな。
433:デフォルトの名無しさん
08/12/14 13:18:43
>>431
やってみた。
ショートカットだと .lnk ファイルが開かれるだけ。
実プロジェクトファイルだと、現行プロジェクトを非アクティブにしてプロジェクトグループに追加される。
しかし、元々関係ないプロジェクト同士でプロジェクトグループにすると、どのユニットが何がなんだか分か
らなくなる。
434:デフォルトの名無しさん
08/12/15 08:39:54
いくつものスレッドでメインスレッドにある一つの配列をいじくる場合って衝突する危険性があると思います
どうやって衝突を回避するんですか?
435:デフォルトの名無しさん
08/12/15 08:50:37
>>434
補足です
その共通に使う配列は構造体の配列でaddしたりDeleteしたりする関数を呼ぶ事で操作しています
スレッドから操作関数をよぶときにどこかが呼んでいる時は待つ、みたいなことができればいいと考えています
どうすればそういうことができるのでしょうか?
436:デフォルトの名無しさん
08/12/15 09:40:13
mutexやCriticalSectionで衝突する可能性のあるコードを保護する。
TCriticalSectionでも使っとけ。
437:デフォルトの名無しさん
08/12/15 12:17:00
下記スレッドの説明から
異なるスレッドが所有する VCL または CLX のメソッド/関数/
プロパティを別のスレッドの中から扱う場合、排他処理の問題が
発生します。
メインスレッドの所有するオブジェクトに対しては Synchronize
メソッドを使う事ができます。他のオブジェクトを参照するため
のメソッドをスレッドクラスに追加し、Synchronize メソッドの
引数として渡します。
438:デフォルトの名無しさん
08/12/15 13:43:44
>>434 >>437
玄人ではありませんし、add,deleteの頻度にもよりますが、add,deleteが1秒内に何十回も発生するなら
そのたびにSynchronizeを多用するとスレッド化のメリットが失われますのでいかがなものかと思います。
その場合、私なら全配列を丸々コピーしてスレッド内処理後、Synchronizeもしくはterminate後に元にコピーします。
当然、メモリー効率は犠牲にします。
低頻度ならそのたびにSynchronizeで良いのでは?
439:デフォルトの名無しさん
08/12/15 14:04:42
>>438
>434
>いくつものスレッドでメインスレッドにある一つの配列をいじくる場合
ということなので、各スレッドがコピーして保持し処理後にリストアするならばスレッドにする必要が無いと思う
>Synchronizeを多用するとスレッド化のメリットが失われます
メリットはまさに衝突回避なのだと思うけど、ここで頻度については議論の外でいいのでは?
まー後は434さんが実装して確認するのがはやいわな
440:ななしへたぐらま ◆XcB18Bks.Y
08/12/16 01:20:02
>>411
亀ですが、言語仕様では
「静的配列はその配列の要素型の連続した変数の並びとして格納されます」
とあります。
わかりにくいのですが「連続した変数の並び」ということなので
連続して並んでいることを保証していると考えて良いと思います。
441:デフォルトの名無しさん
08/12/16 04:00:12
動的配列は連続してないかも、ってそんなことあるかいな・・
442:デフォルトの名無しさん
08/12/16 09:53:45
動的配列はポインタ1個だから、1つのメモリブロックしか扱えない。
だから連続してないってことはありえない。
443:デフォルトの名無しさん
08/12/16 10:44:42
初期化にFillCharルーチンなんぞを使ってるけど、動的配列や静的配列が
どんなに大きくてもここ数年まったく問題なく動いていますんで、間違い
なく連続してると思いますヨ。
444:デフォルトの名無しさん
08/12/16 18:16:34
case文のelseはbegin,endでくくらなくてもOK?
case i of
1: aa;
2: bb;
else
cc1;
cc2;
end;
445:デフォルトの名無しさん
08/12/16 18:21:38
ok
446:ななしへたぐらま ◆XcB18Bks.Y
08/12/16 19:42:58
し、知りませんでした… orz
Delphi 4とDelphi 5の言語ガイド「case文」の項を見るとひとつの文しか記述出来ないような文面なのですが
Turbo Delphi Explorerのヘルプ「宣言と文」の項を見ると複数の文を記述できるという内容が書いてありました。
しかし試してみたところDelphi 5とTurbo Delphi Explorerの両方でコンパイルが通ってかつすべての文が実行されるのを確認しました。
case 文の else 以降にbegin~endを付けなくて良いとなるとコードもかなりすっきりしそうですね。
447:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/16 20:30:33
俺も知らなかった
でもcase文ってそんなに使わないよねってか使えないよねcase文って
449:デフォルトの名無しさん
08/12/16 20:38:12
縁の下の力持ちってとこだろう
450:ななしへたぐらま ◆XcB18Bks.Y
08/12/16 20:58:11
>>447
私がVCLのソースを参考にしたものはこんな感じです:
・TStringsとその派生クラス
・TCollection/TCollectionItemとそ(ry
・Resultをループ変数に使う
>>448
( ))))))))))))
//(;;;`∀´;;;) 使うんだな、それが!
/ \
__| | | |___
||\  ̄ ̄ ̄ ̄
|| \ -●-●
451:デフォルトの名無しさん
08/12/16 21:28:59
case文使わなかったら、if then地獄になるじゃん
452:デフォルトの名無しさん
08/12/16 21:42:49
相変わらずドキュメントがだめだなぁ
453:デフォルトの名無しさん
08/12/16 21:51:30
ならWikiか何かで強力なドキュメント作っておくれよ
454:デフォルトの名無しさん
08/12/16 22:46:44
何かでcase文よりIF文の方が早いって見てから、ずっとifelse羅列してる俺がいる。
455:デフォルトの名無しさん
08/12/16 22:56:55
どう考えても逆w
5万で組んだマシンがあまりにも速すぎてゲーム以外では持て余し気味で
もうプロファイルも取らずに局所的な高速化を試みることもなくなったな。
456:デフォルトの名無しさん
08/12/16 22:57:32
そんな超微量な時間のために可読性を捨てるのもちょっとな
457:デフォルトの名無しさん
08/12/16 23:44:29
多態を使えばcaseの出番は減る。
多重なwithはスコープを不明確にするので控えめがお勧め。
458:デフォルトの名無しさん
08/12/17 00:03:35
withって読みづらいからいらない
459:デフォルトの名無しさん
08/12/17 00:49:01
case sender of
btn1 : ~;
btn2 : ~;
btn3 : ~;
end;
とかいつかは出来るようになると思って早・・・3.0からかな。
まぁ無理なんだけどね。なんかcase文って惜しいイメージ。
勿論多用する派。
460:デフォルトの名無しさん
08/12/17 01:42:08
他の方法で
461:デフォルトの名無しさん
08/12/17 02:56:24
case TButton(Sender).Tag of
1 : ~;
2 : ~;
3 : ~;
end;
で済ますかな自分なら。
462:デフォルトの名無しさん
08/12/17 09:21:06
ヘルプ「宣言と文」を見てみたらひでえな。
コードが読みづらいし、間違ったセミコロン付いてるし。
463:デフォルトの名無しさん
08/12/17 10:28:34
リストに格納した構造体のポインタを使う時なんかは、
いちいちキャストしなきゃならないのがうっとうしいからWith使うなぁ
464:デフォルトの名無しさん
08/12/17 10:34:09
>>462
elseやendの前のセミコロンのことか?
それだったらずっと以前に拡張になったことと記憶してるが。
465:デフォルトの名無しさん
08/12/17 10:49:03
いつからif文のelseの直前にセミコロン付けても良くなったんだ??
466:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/17 11:01:52
withを使うと効率がよくなると聞いたが。
a.hoge1 := 0
a.hoge2 := 0
a.hoge3 := 0
は毎行aを参照するコードが走るけど、
with a do
でくくるとaを参照するコードが1回で済む
という感じだった。
468:デフォルトの名無しさん
08/12/17 13:09:45
コード行数は少なめに短くがモットーの俺はアンチwith
ループで何万回実行するとかじゃない限りそんな些細なことは気にしないな・・
469:デフォルトの名無しさん
08/12/17 13:55:23
>コード行数は少なめに短く
これも些細なことだと気づかないのか?
470:デフォルトの名無しさん
08/12/17 14:01:40
速度は計測しない限りわからんけど、コードは見ればすぐわかる
ソースは昔のものでも結構参照するし(俺は)、易読性が最重要
471:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/17 14:08:12
俺はね
そもそもbeginで改行するのすら許せない神経質
473:デフォルトの名無しさん
08/12/17 14:16:00
>>472
ははは、笑った。それならそれを突き通すんだ!
誰も文句は無いですよ。
474:デフォルトの名無しさん
08/12/17 14:42:58
コードは少ない方がいい。
そう思っていた時期もありました・・・
475:デフォルトの名無しさん
08/12/17 14:45:36
改行は多いほど見やすい
長い文は二行に
そう思ってた時期が、俺にもありました
476:デフォルトの名無しさん
08/12/17 15:00:35
>長い文は二行に
これは、今でもそうですね。
ただ、長い文になる事が無いように気を使ってコーディングしますけど。
>改行は多いほど見やすい
これは、ネタでも笑えないね。
477:デフォルトの名無しさん
08/12/17 15:14:39
2chの書き込みでも無駄に改行いれて書き込むおかしな人がいるが
そういう類の人じゃないだろうか?
478:デフォルトの名無しさん
08/12/17 15:24:57
コンパイルされると最適化されるからどっちでもいい
479:デフォルトの名無しさん
08/12/17 15:59:55
with do
を使う・使わないでコンパイルされるものが違うんでしょ?
最適化されないんでしょ?違うのかな?
教えてください。識者の方。
480:デフォルトの名無しさん
08/12/17 16:10:52
同じ参照が続いたコードなんだから、コンパイルで最適化されると思うけどね
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
ない