1 :
D使い :
2000/10/04(水) 05:57 Windows最強の開発環境と呼ばれるDelphi Delphiとその言語ObjectPascalの Technology/Technique についてのスレッド 質問・議論など 他の言語やツールはこうして実現している、という参考になる話は歓迎
2 :
D使い :2000/10/04(水) 06:00
まず、さっき知ったInterfaceの利用法 −自己開放型クラスを使った簡易複素数ライブラリ type //Interface部 IComplex = interface procedure Complex(r, i: Double); procedure Add(C: IComplex); function GetR: Double; function GetI: Double; procedure SetR(Value: Double); procedure SetI(Value: Double); property r: Double read GetR write SetR; property i: Double read GetI write SetI; function ToString: string; end; TComplex = class(TInterfacedObject, IComplex) private FR, FI: Double; function GetR: Double; function GetI: Double; procedure SetR(Value: Double); procedure SetI(Value: Double); procedure Add(C: IComplex); overload; public constructor Create; overload; constructor Create(r, i: Double); overload; procedure Complex(r, i: Double); function ToString: string; class function Add(C1, C2: IComplex): IComplex; overload; end;
3 :
D使い :2000/10/04(水) 06:06
長くてすまんっ (
>>2 の最後は省略されてません。)
次に実装部(implementatoin部)
{ TComplex }
procedure TComplex.Add(C: IComplex);
begin
Self.FR := Self.FR + C.GetR;
Self.FI := Self.FI + C.GetI;
end;
class function TComplex.Add(C1, C2: IComplex): IComplex;
begin
Result := TComplex.Create(C1.GetR + C2.GetR, C1.GetI + C2.GetI);
end;
procedure TComplex.Complex(r, i: Double);
begin
Self.FR := r;
Self.FI := i;
end;
constructor TComplex.Create(r, i: Double);
begin
inherited Create;
Self.Complex(r, i);
end;
constructor TComplex.Create;
begin
Self.Create(0, 0);
end;
function TComplex.GetI: Double;
begin
Result := Self.FI;
end;
function TComplex.GetR: Double;
begin
Result := Self.FR;
end;
procedure TComplex.SetI(Value: Double);
begin
Self.FI := Value;
end;
procedure TComplex.SetR(Value: Double);
begin
Self.FR := Value;
end;
function TComplex.ToString: string;
begin
Result := FloatToStr(Self.FR) + ' + ' + FloatToStr(Self.FI) + ' i';
end;
4 :
D使い :2000/10/04(水) 06:17
使い方: procedure TForm2.Button1Click(Sender: TObject); var a, b, c: IComplex; begin a := TComplex.Create(5, 6); b := TComplex.Create(3.5, 1.1); b.Add(TComplex.Create(0.14, 0.1)); c := TComplex.Add(a, b); ShowMessage('a=(' + a.ToString + '), b=(' + b.ToString + '), c=(' + c.ToString + ')'); end; ------------------------------------------------------- constructor Create(C: IComplex); がほしいとか、 そういう機能追加に当たるところは除いて、 ここまででまずいところがあるでしょうか? ちなみに上のコードでメモリリークはありませんでした。(MemCheck.pasで確認) 個人的には a.GetI などとするとプロパティを介さずに アクセスメソッドが使えてしまうのがちょっと嫌。 Interfaceだから仕方ないかな。
5 :
J使い :2000/10/04(水) 07:41
僕は immutable が良かったから SetX は実装しなかったけれど。
6 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 09:34
これは基本かな? with XX.create do try ・・プログラム・・ finally free; end; クラスを作って作業して捨てるのをローカル変数無しやる
7 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 09:39
>>6 そういうのいいならこうゆーのも?
with ListView1,TreeView1 do
8 :
>7 :2000/10/04(水) 09:59
それは悪い見本って事?
9 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 10:15
>6 Cから移ってきた当初はそういうwithの働きが分らなかった。 どこに参照が保持されるんだろうって。 ブロックのネストが深くならない点でも標準的書き方。 >7 双方に同じ名前のメンバがいた場合混乱しない? まあ、そこだけメンバ修飾すればいいんだけど。
10 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 10:46
というか、ListViewとTreeViewは重なりまくってますがな With ListView1 is L , TreeView1 is T do みたいに書ける時代が来るのを待つべきだね
11 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 10:50
>>4 私は以前自前のクラスライブラリにインターフェースを導入しかけましたが、
結局やめました。
理由は
・Delphiには既に3種類のクラスの生成・廃棄ルールがあり、
もうこれ以上増やしたくない
・インターフェース導入によってIとTが入り乱れて可読性が落ちる
・インターフェースはコードの量を削減に寄与しない
・単一継承だけでも破綻しない
というわけでインターフェースに関わるのは
COMがらみの場合のみにすると決めました。
これを踏まえた上でなお
インターフェースを導入するメリットはありますか?
またInpriseが提供しているライブラリで(VCL以外のものも含む)
COM関連以外でインターフェースを使っているものはありますか?
12 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 10:55
try except finally end って書きたい
13 :
D使い :2000/10/04(水) 11:14
>5 なるほど。immutable objectっていうのはそういうことだったのか! (immutable:不変の) JavaのStringクラスみたいな感じですね。 propertyさえもいらなくなってずいぶんすっきりするなぁ。 複素数みたいなプリミティブなクラスはimmutableの方がいいのかな。
14 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 14:11
Cの#defineみたいなの採用してくれないかなぁ‥ 記述量がすごく減るのになぁ‥
15 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 14:18
>11 >COM関連以外でインターフェースを使っているものはありますか OpenToolsAPI
>>12 try try
except
end finally
end;
これって動く?
17 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 15:52
動くけどこう書くんだよ。 try try //処理 except //処理 end; finally //処理 end; ダサクない。ネストはどれだけでもOKよ。
18 :
16 :2000/10/04(水) 16:11
技術と離れてすまないが、 トライトライって書くと松野ちかおねえさん思い出すの 俺だけか?
でポン。
20 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 16:52
>14 #define は下手な使い方されると可読性下がるので嫌い
21 :
J使い :2000/10/04(水) 17:01
Delphi で書いた自己解放型クラスと Java で書いたものでベンチをとってみました。 結果、 Delphi で書いた場合 Java の2倍近くの時間がかることがわかりました。 以上。
22 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 17:04
>15 OpenToolsAPI ってどんなことできるの? >18 その人自体知らないです。 >20 賛成。
23 :
>21 :2000/10/04(水) 17:07
Javaは実際には即座に開放してないからしょうがないね(^^; ガベージコレクションの威力って奴ですね
24 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 17:28
>>21 TObject.NewInstance メソッドをオーバーライドしたらどうすか?
25 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 17:31
26 :
漢太郎>25 :2000/10/04(水) 17:37
だからそれが、ガベージコレクションの威力なんでしょ?
え、ネタなんだけど...(HotSpotは宣伝文句では速い、実際は遅いよっていう)
そうなの? そこ読んだだけだけど、何かプログラム作ったら 単純に結果が速かったんだと思った
29 :
310 :2000/10/04(水) 18:55
type TTest=class published procedure test; end; で実行時情報を使ってメソッド"test"を検索して、 testを実行したい。という処理を書きたいのですが、 全然わかりません。 サンプルコードが解説ページへのリンク希望
30 :
漢太郎>29 :2000/10/04(水) 18:59
31 :
310 :2000/10/04(水) 20:06
>>21 普通にCreate/Freeする場合はどうなんでしょう
32 :
J使い :2000/10/04(水) 20:57
>31 どうせ変わらないだろ、と思ってやったら、 Java: 5127 msec. Delphi(Create/Free): 8262 msec. Delphi(interface): 12899 msec. になった。interface がもっと速ければなぁ。
33 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 21:05
>16,17 汚いなー ブロックが{}ならそこそこ見れるんだろうけど >12 の構文をサポートせよ!
34 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 21:09
>>32 うーんこの結果は信じがたい
実際のヒープを切り刻むような複雑なアプリでも
この傾向は変わらないの?
35 :
>32 :2000/10/04(水) 21:17
まあね。コンパイラ系の言語はOOPした時のヒープメモリの機構が重くなりがちだよね C++はnew deleteをオーバロードすればなんとか出来るけど Delphiも場合によって選択出来るような仕掛けがそろそろ欲しいな
36 :
>32 :2000/10/04(水) 21:28
InterlockedIncrement,InterlockedDecrementで時間がかかっていますね。 TObject.Create.Free を10000000回実行すると 6375 ms InterlockedIncrement(val);InterlockedDecrement(val); を10000000回実行すると 1687 ms
37 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 22:58
開発環境のエディタ、Emacs のようにインデントとか勝手にしてくれるようには できますか?
38 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 23:05
直接は無理じゃない? ctrl+jのコード補完機能を活用せよ delphi32.dci [b|begin/end] begin | end
39 :
37 :2000/10/04(水) 23:11
>38 OpenTools API って怪しいんだけれど、これでできないかなぁ? <ドキュメントが無い・・?
40 :
初心者質問 :2000/10/04(水) 23:26
Javaのnewってコードセグメントも実行時にロードされる(←正しい?)遅いんでは? もしそうなら、何もしないクラスのcreate/new、free/?比較ならJavaがはやくても、 メソッドが大きいものになれば変わってくるかも。
41 :
>40 :2000/10/04(水) 23:47
うんとね。もっと勉強したら判るから
42 :
41の解説 :2000/10/05(木) 00:17
結果だけ知ってもしょうがないでしょ。仕組みをしらないとね で仕組みはこんなスペースじゃ書けない。とりあえず答えを知 りたい欲求があるなら勉強してみたら? 答えかいちゃうと勉 強しなくなるでしょ? だから書かないよ。
43 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 01:17
>35 んが?メモリマネージャ丸ごととっかえられますけど?
44 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 01:30
45 :
D使い :2000/10/05(木) 01:42
>44 荒れるから他でやってほしいっす。 Delphiの技術話とは直接関係ないですし。
Delphiってしばらく見ないうちにえらく複雑になってるね。
47 :
>43 :2000/10/05(木) 08:22
だから>場合によって選択出来るような仕掛ってあるじゃん? new みたいにオブジェクト毎に別のメモリ管理したいって事でしょ?
48 :
>>47 :2000/10/05(木) 10:09
それなら TObject.NewInstance, FreeInstance メソッドを オーバーライドすれば?
49 :
47 :2000/10/05(木) 10:30
あ、ホントだ。virtualで定義されてる。ゴメン 勘違いしてた
50 :
47 :2000/10/05(木) 10:47
でも、あれ? じゃVMTってメモリ確保する前に既に存在するのか うーん。VCLソースもっと読んでみよう。なんか勘違いしてたみたい
51 :
D使い :2000/10/05(木) 12:08
>46 煽りじゃないと考えてレス この辺の話は普通にDelphiで開発してる分にはほとんど使わない。 必要となったら深いとこまで入れるって事。 って、Interface以外はDelphi1や2の頃から変わってない話じゃないのかな? 俺は新入りだから詳しくは知らないけど。
52 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 12:34
53 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 14:50
>52 Kylixが出たら作りたいソフトのアイデアが幾つかあるので楽しみです。 Linuxプログラマーが一気に増えそうですね。 Kylix製のフリーソフトが増えてくればゲーム以外の環境はLinuxに以降出来そう。
54 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 15:01
つかよー、FormStyleいじってて、気になったんだが・・・。 FormStyleにfsStayOnTop指定したとき、メインフォームとそれ以外のフォームじゃあ、動作が違うんだね。 メイン以外のを、常に手前に表示したい場合、みんなはどうしてるの? 過去スレに、Application.Norm〜を使うってのがあったから、オレはそれ使ってるけど・・・ なんか、スマートに決まるやり方、無い?
55 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 17:26
ところで、 Delphi6 は何か機能増えるんかな? 個人的には template が欲しいところ・・・。
56 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 18:19
>55 よし、それここに書き込め。 news://newsgroups.borland.com/borland.public.delphi.non-technical
57 :
ねこま :2000/10/06(金) 01:56
SetWindowPos(Handle, HWND_TOPMOST,
58 :
ねこま :2000/10/06(金) 01:57
ていうか,一緒か.
59 :
>54 :2000/10/06(金) 07:05
ニフテイのFDELPHI過去ログに色々あったなあ。 でもそれが一番簡単だったみたいだけど?
60 :
>56 :2000/10/06(金) 09:10
日本語で書き込んでもいいのかい
61 :
56 :2000/10/06(金) 10:58
>>60 I want templete.
じゃ通じないか。
Why don't using templete in Delphi.
I wish using templete in Delphi.
ごめん俺も英語駄目だ。
templete and generic container library,pleaseでじゅうぶん
63 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 12:01
悪いけどテンプレートは個人的には嫌い。 理由:使うと、ただでさえ大きい実行ファイルが一挙に膨張しそうに思えるから それに、演算子のオーバーロードか 演算子の新設機能が無いとあんまり意味ないかも。 というかそれが欲しい。 たとえば a + b は書けなくていいから a @ADD b みたいには書きたい
でもObjects[i] as TEditとかキャストばっかりってのもなんだよね TObjectのみしか保持できないコンテナライブラリって嬉しい?
65 :
64 :2000/10/06(金) 12:18
sageちゃった 確かに自分ではtemplate使わないと思うけどね
66 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 12:20
おいらもtemplateみたいなプリプロセッサに毛が生えたようなもの じゃなくてもっとエレガントなのが欲しいね。
67 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 12:24
>>66 充分エレガントな気がするが‥‥‥
もっとエレガントなのって、例えばどんなのよ?
68 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 12:25
代案として型関係なくオブジェクトaがメソッドfooを持っていたら 呼び出せてしまうというのは? Rubyとかのより動的な言語であるんだけど、 実行効率とトレードオフする必要がある
69 :
>64 :2000/10/06(金) 12:56
>Objects[i] as TEditとかキャストばっかりってのもなんだよね というかそれがDelphiの良さだと思ってた。 だって、何やってるか局所的に見て判るもの 最初は、作るのに手間かかるなあと思ってたけどさ
70 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 13:01
>61 日本のニュースグループに投稿したら?
71 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 13:45
あれ何て言ったかなあ、スレッドみたいに非同期じゃなくてコルーチン みたいに関数の途中で帰って来るけど 次呼び出したらそこから実行 させる機能。 これをDelphiで実装してほしいなあ。
72 :
55 :2000/10/06(金) 14:43
ああ、別に template じゃなくて、正確には parameterized type の機能が欲しいのう。
73 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 14:52
>63 template はコードを膨張させるとは限らないんだよ。 C++ の実装がたまたまそうなっているだけ。 >69 >だって、何やってるか局所的に見て判るもの は?意味不明。
74 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 15:14
>>71 NTではFiber APIとして実装されています。
75 :
D使い :2000/10/06(金) 15:15
以前はTemplateほしいと思ってたけど最近はあんまり思わないなぁ。 TObjectStackとかTObjectQueseとかから、property Itemと Add()だけオーバーライドした派生クラス作るし。 Template 作ったら演算子オーバーロードも必要だし、 そこまでするとC++になってしまう。 今ぐらいがちょうどいいバランスかな、と。 どうしても使いたいならC++使うし。
76 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 15:21
>Template 作ったら演算子オーバーロードも必要だし、 なぜですか?
77 :
D使い :2000/10/06(金) 15:30
templateって言語機能としては強力だけどシンプルさが失われてしまう。 多分コードの可読性が落ちることだろう。 TObjectしか格納できないコンテナライブラリってJavaもおなじ。 Platform NativeなJavaっていうのがDelphiの進むべき方向だと最近思ふ。
78 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 15:34
>77 >多分コードの可読性が落ちることだろう。 キャスト繰り返すこととか、型ごとにクラスをつくる (Java3D の Vector3d, Vector3f とか)ことの方が、 可読性落ちると思うけれど。
79 :
D使い :2000/10/06(金) 15:36
>>Template 作ったら演算子オーバーロードも必要だし、 >なぜですか? 比較演算子なかったらソートさえもできない
80 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 15:40
演算子オーバロードとかテンプレートとか、 ややこしいのはコンパイラ上ではなく、 pascal的スクリプトを用意してそれで実現して欲しいなあ object.script('c:=a+b;');みたいな感じ
81 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 15:47
>比較演算子なかったらソートさえもできない ソートするためには比較(関数・演算子)が必要だが、 template → ソート は発想が飛びすぎ。 Effective C++に載ってる、総称ポインタとtemplateを使った Stackクラスはみた? templateがなければ、あのエレガントさは実現できないでしょう。 (つまり、使用する型毎に派生させる必要がある)
82 :
75>79 :2000/10/06(金) 15:48
すみません。もう少し具体的にどういうことか教えてもらえませんか?
83 :
80 :2000/10/06(金) 15:51
あ、a,b,cは 当然object上のpublishedプロパティね。publishedメソッド も自動的にスクリプト側から使えるものとするね。
84 :
>81 :2000/10/06(金) 16:20
演算子オーバーロードが無いとテンプレートはリスト/スタックなどの ただ値を保持するだけのクラスにしか使えないな
85 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 16:25
>84 関数をオーバーロードするって考え方は出来ないのかね〜
86 :
>85 :2000/10/06(金) 16:32
それは同一ユニットでしか通用しないじゃん。
なんか、 「template = 演算子のオーバーロード」とか 「template = コンテナクラス」と考えている人が多いな。 「template = アルゴリズムの継承」でしょ。 演算子オーバーロードは、アルゴリズムをスマートに記述するための 手段に過ぎないし、コンテナクラスは応用例に過ぎない。 さらに、javaもそうだけど、 templateがないまま汎用コンテナクラスを実装すると、 危険or効率の悪いダウンキャストが必要になる。 templateでラップすれば安全性がずっと高まる。 ちなみに、C言語にはqsortという関数があるが、 これは、オブジェクトのアドレスと比較関数を パラメータとして、一般的な「ソート」を実現している。 このように、コンテナクラス程度の基本的なアルゴリズムのためなら、 compareとequalがあれば十分。さらにis-aもあれば言う事なし。 >それは同一ユニットでしか通用しないじゃん。 そうなの?知らんけど。で、 関数のオーバーロードは同一ユニットのみ → 演算子のオーバーロードがなければ使いものにならない → templateは価値が全く無い になる訳ね。 仮にtemplateが導入されても「使わなけりゃいいじゃん」 templateのせいでコンパイル時間が2倍になったら嫌だろうけど、 それ以外に弊害はあるわけ? 誰も使う事を強制しているわけじゃないでしょうが。 何故そこまでして不用論を展開するのか、理由がわからないな。 旧バージョンでコンパイルできないから? それとも、「今の仕様が最良」で、改変は認めたくないって事? 確かに言語仕様は複雑になってしまっているけどさ。 「Delphiが最良、改善点(劣る面)はない」 この考えで固定されている人があまりに多いから、 「デル厨は・・・」と言われるんだよ。<煽り
88 :
>87 :2000/10/06(金) 17:32
まあ良く判ってないから漠然とした不安を感じてるんだ。怒らせたならゴメン。 どんな感じの文法と、実装になるのかな? テンプレートだけ定義したユニットみたいなのが必要だよね? でその記述方法は? そして利用時の記述方法は? ・・・・具体性が無いと不安な人より。
89 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 17:32
>>77 >templateって言語機能としては強力だけどシンプルさが失われてしまう。
使う分には非常にシンプルだが?
まさか、キャストを多用してる方がシンプルだとかいう寝言は言わないよね?
確かに、<>の記述はうざい気もするけど、typedefや#defineもあるからうまく使え
ばそんなに問題にはならないと思うが。
あと、クラステンプレートの記述は確かにシンプルとは言い難いけど、関数テンプ
レートの記述はかなりシンプルだよ。
90 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 17:33
Java は 「まともな」 "template" を導入する場合VM の仕様変更が必要だから、 template を導入するのは難しいかもしれないが、 Delphi の場合は template 導入しても、87が言うように 「使わない」っていう選択肢があるから、いいんじゃない?
91 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 17:49
C++ でテンプレートを実装するためにどれだけ苦労するか、 知っていれば気楽に「テンプレートを」とはいうまい。 Java も、C++ より単純化した、パラメタライズド・オブジェクト を導入するでしょ? C++ テンプレートの処理系にとっての一番の問題は、 実体化されるまでコードを吐けないということだな。 こういった問題を、C++ では「すべてのコードが同じ ヘッダーファイルを読み込む」ことを仮定して逃げている。 個々のソースごとにコードを生成し、「運がよければ」 リンカが重複コードをまとめてくれるだろう。という 戦略だ。 これは、.H を持たない Pascal にとってはきつい。 売りである、コンパイル速度を維持することは 難しいだろう。
92 :
テンプレート不要派 :2000/10/06(金) 19:17
テンプレートの具体的な実装方法は? C++と同じマクロみたいなのが欲しいなら 単にプリプロセッサをかませばいい。 欲しい人が自分で作って公開したらいいんじゃないの? ようは、ユニットの自動作成機能みたいなものじゃない。 言語に無理に組込んで貰う必要はないと思う。 その為にエディタとかが異常に重くなるよりはよほど良いのでは?
93 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 20:35
>ようは、ユニットの自動作成機能みたいなものじゃない。 ほんじゃ、ウィザード(エキスパート)を作ればいい訳だ。
94 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 21:47
>C++と同じマクロみたいなのが欲しいなら うーん。#define 使ったトリックで、Generic Programing を したくないからテンプレートが出てきたんであって、 それを逆戻りする必要性はないな。
95 :
>94 :2000/10/06(金) 22:37
じゃなくて、テンプレートライブラリがいわゆる実コードの入ったライブラリ ではなく、実コードに展開する為の方法を記述したライブラリ方式で実現する 事をもって マクロみたいなものと言ってるんでは?
96 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 23:47
希望してるテンプレートって uses <嵌めたいクラス名> in 'テンプレート定義ファイル' とかやると 自動的にユニットが作られるみたいな感じかな?
97 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 00:56
Turbo Pascal時代にこんなやり方でgenericなコンテナライブラリを作りました。 例は関数ですがクラスにも応用できます。 #そういえば当時はresultなんてなかったな max.int.pas function Max(a, b: T): T; [eof] max.imp.pas function Max(a, b: T): T; begin if a > b then Result := a else Result := b; end; [eof] int_max.pas unit int_max; interface type T= Integer; {$i max.int.pas} implementation {$i max.imp.pas} end. [eof] 使い方 uses int_max, chr_max; var n: Integer; c: Char; begin n := int_max.max(10, 30); c := chr_max.max('A', 'B'); end;
ありゃ 何でインデントが消えちゃうんだろ?
99 :
>98 :2000/10/07(土) 01:19
全角スペースに置換するしかないみたいよ
>>98 スペースを に置換するという手もある。
コピペにはこっちの方が便利。
101 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 10:12
求む Delphi6 情報!
102 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 13:38
SOAPをサポートする。>Kylix & D6
103 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 13:40
TPageControlは ShowFrameプロパティが追加される。>Kylix
104 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 13:43
105 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 15:17
>104 本を買えってこと?
106 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 15:27
既にこんな本も。 Delphi 6 Developer's Guide Osborne McGraw-Hill; ISBN: 0072129956
107 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 16:57
template 不要論もわからなくはないが、キャスティングの問題とかは どうするんだ?
108 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 17:19
えーと、とりあえず言語仕様にブチ込んで
いらねー奴は使うなというのは反対。
Delphiの最重要キーワードである「最終的な生産性の高さ」という観点からみた場合、
# 好き・嫌い、ラクチン・面倒だけで議論してもしょうがないよね。
どこでもキャストは問題あり。
asが安全と言ったところで配布したアプリで例外出したらしょうがないでしょ?
可能な限りコンパイル時に検出したい。
コンテナクラスについては
>>75 >TObjectStackとかTObjectQueseとかから、property Itemと
>Add()だけオーバーライドした派生クラス作るし。
が妥当な意見。確かにこれやる度に野暮ったくってうんざりするけど、
増加するコード量・オーバーヘッドはわずかだし、検証も簡単でバグもでない。
109 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 18:32
>108 ># 好き・嫌い、ラクチン・面倒だけで議論してもしょうがないよね。 まぁ、楽チンってのは重要だよな。 楽チンだけれど、可読性が下がるとかあればまた別だけれどね。 TObjectList を継承する方法もあるが、 TList -> TMyObjectList とするより、 TList<TMyObject> とした方が楽だし読みやすいのではないか。
110 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 23:14
高度な話んなかで、腰折りっぽくてもうしわけねぇ。 プロジェクトのソースを、バージョンごとに管理・・・。 CVS,RCSっぽいやつのDelphi版ってありませんか?
111 :
108 :2000/10/07(土) 23:30
>>増加するコード量・オーバーヘッドはわずかだし、検証も簡単でバグもでない。 >TList<TMyObject> とした方が楽だし読みやすいのではないか。 まあそれは認めるし、(俺 as プログラムヲタ)の血が騒ぐ。 でも見てくれがよいという程度のメリットでは、 templateなんて大技が持ち込まれることは無いだろうね。 たぶんInpriseはそれを理解した上で>75の手法を取り入れたんじゃないかな。 # なんか議論が循環的になってきぞ
112 :
108 :2000/10/07(土) 23:32
>まぁ、楽チンってのは重要だよな。 >楽チンだけれど、可読性が下がるとかあればまた別だけれどね。 "楽チン"は書こうかどうか迷ったんだけど、 やっぱりつつかれちゃったね。 生産性を下げるような超短期的な楽チンのお手本が>6。 いちいちローカル変数を宣言すべきか省略すべきか意識的に判断する必要があるし、 デバッガで参照できないし、コード補完を利用できないor2種類用意する必要があるし、 さらにはこんな書き方教科書に載ってないから新卒DEL坊が必ず聞きにくるというおまけつき。 んで最後にメソッドfooに参照を渡す必要がでてきてローカル変数を使うように書き直して一件落着。 これだけのリスクを冒してまで、数バイトのタイプをケチる必要ある? 頼むから上っ面だけのクレバーなコード書くのやめて > ウチのDEL坊s 話を戻すとPascalは元々冗長なコーディングをする言語であるから、 生産性を上がらないようなら、 無理して変なスタイル・機能を持ち込んだりしないで、 我慢して普通のコーディングをしてね。 というのが俺の考え。
113 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 23:38
110> Enterprise版にはTeamSourceというのが統合されてる。 単体でも確か売ってたと思う。 それ以外の外部の管理ツールは 例えばUnit1.pasとUnit1.dfmを 常にペアで扱う必要があって結構注意が必要。 # 以前Visual SourceSafeでpasだけ管理してひどい目にあった だからプロジェクト単位・ディレクトリ単位で管理するのが楽。
114 :
109 as D厨 :2000/10/07(土) 23:52
>111 なるほど。 むやみに言語を拡張する必要がない(しないほうが良い)という意味では template はいらないとは思う。 少なくとも導入するなら、 Eiffel の総称(制限つきの総称) みたいなのを導入して欲しい。 ・・・というか、template(%総称)って、コンテナ以外の使い道って 結構あるのかなぁ?
115 :
D使い :2000/10/08(日) 00:42
templateについてはどうしてもC++の実装で考えてしまう。
身近な例が他にないからなぁ。
とりあえず、>91さんの言うJavaのParameterized Objectかな?
勉強しよっと。参考ページとかないですかねぇ?
Templateに近いものが導入されたら、絶対にSTLもほしくなると思う。
どっちにしても肥大化は避けられないのね。
>>97 すごい!目から鱗!
>CVS
K2Editorの作者はCVS使ってるようだけど。どうなんだろ?
116 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 00:59
コマンドライン版CVSは勘弁してほしいけど WinCVSはとても良い。半端だけどリファレンスもでた。 www.wincvs.com アンチMS派はこれに統一されるんじゃないかな。
117 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 03:49
静的な型付けのオブジェクト指向言語は、テンプレート(のような仕掛け)が ないと、キャストが増えてイヤーンな感じがする。
118 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 06:40
www.linkclub.or.jp/~tumibito/soft-an/cvs/download.html
119 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 12:19
ところで、 Continue や Break が手続きなのはなぜなんだ? と、 Writeln みたいな、引数の数に制限ないのは自分では宣言できない のも気持ち悪いのぉ。
120 :
>119 :2000/10/08(日) 14:46
continue;break;exit;が手続きなのは、文法的に手続の書ける位置に 書くものだからです。もちろん、書いて間違いな位置は沢山ありますが Pコード式の体系なら実際に手続きだったのかもしれません 引数の数については最近のDelphiならoverloadで対応可能かもしれません しかしwritelnは型を自動判別する機能もありますから同じようにするには 全部の組み合わせを書かなければならない訳で、実際にやるのは苦しいかも それよりオープン配列という便利なものがありますから無意味ですね。 まあこれはヘソみないなものですね。特に不要だけどついてる
121 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 15:33
>>114 >少なくとも導入するなら、 Eiffel の総称(制限つきの総称)
>みたいなのを導入して欲しい。
Object Pascalの仮想拡張文法によるサンプルコード希望。
# 昔メイヤー先生のOOP本読んだけど
# サンプルで使われてたEiffelの事は完全に忘れちゃってる
>>115 >Templateに近いものが導入されたら、絶対にSTLもほしくなると思う。
>どっちにしても肥大化は避けられないのね。
ライブラリの肥大化は大歓迎。ライブラリの貧弱なOOPLは役に立たない。
OOPはある意味ライブラリの効率的な作成・利用技術だからね。
逆に言語仕様の肥大化はこんな事になる。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970844960 PL/I症候群てやつね。
>>117 goto 107
堂に入った堂々巡りだな。
仮にtemplate入れてもTStrings.ObjectsやTag,Dataプロパティの
キャストは消えないよ。それとも消えるの?よくわからん。
122 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 16:04
キャストや継承云々は、 ライブラリの使用者が意識して使う必要があるか? という点が重要じゃないかな。 class GenericStack { protected: // 実体を作らせない GenericStack(); ~GenericStack(); void push(const void *object); void * pop(); private: struct StackNode {・・・}; StackNode *Top; }; class IntegerStack: public GenericStack {・・・} 継承して使うのが普通の考え方だけど、 template <class T> class Stack: private GenericStack { public: void push(T *object) { GenericStack::push(object); } T * pop() { return static_cast<T *>(GenericStack::pop()); } }; インターフェースをそのまま利用可能にし、階層の知識は不要 キャストを使わずに利用でき、出力コードの増加はゼロ generic.hライクなマクロでも実現できるけど、 その場合、型名を引数にしなければいけないね。
123 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 16:26
>
>>117 >goto 107
>
>堂に入った堂々巡りだな。
>仮にtemplate入れてもTStrings.ObjectsやTag,Dataプロパティの
>キャストは消えないよ。それとも消えるの?よくわからん。
Javaなんかでコンテナクラスを使用してると、ダウンキャストが
増えるんで、テンプレートがあればなぁ、と思うことがあるよ。
あ、Delphiってコンテナクラスが無いんだっけ?
124 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 16:41
結局「欲しい」「いらない」は、 実装したときのメリットとデメリットのトレードオフだから、 実際に実装されたモノを見ないと、大きさは計れない。 また、立場(設計側・使用側)により見解も異なる。 つーか、ここでうだうだ言っても、結局Inpriseの方針が全てだから・・ みんなそれは理解した上で言いたい事を言ってるだけだからね。 マクロとか、プリプロセッサは、 言語仕様に取りこまれるかどうかで生産性は大きく変わるでしょ。 自作のプリプロセッサをかけたソースを元にデバッグするとなんて、 修正しながらのテストが出来ないし、makeもMakefileから。 「ほぼ実現出来る」から「いらない」って単純に考えられるかなあ。 トレードオフと考えて判断するなら納得だけど。 例えば「C++にfinallyが欲しい」という意見があるけど、 デストラクタとマクロを使って似たような構文は実現出来る。 でも、それでも欲しいのは何故? finallyが「あった方が便利」だからだと思うんだけど。
125 :
>122 :2000/10/08(日) 17:24
それは、ようは継承を効率良く書くためというか、下位プログラマに書かせるなんだよね?
自分で書くなら要らんように思うが?
自分で書く時に効率良く書きたいなら、
>>97 の方法で使いたい時ソースをインクルードでは駄目かな?
まあDelphiはC++のようにどこでも型定義出来る訳じゃないから難しいか。
何故反対するかというと、この機能を実現したとすると、今の usesで
使いたいユニットをリンクする仕掛けを踏襲するには、コンパイル済ユニット
に、その手の情報(コンパイルしてない情報)を持たせなければならない。
すると、元のユニットを修正すると、そのユニットを使うと宣言してる全てを
コンパイルしなければならない。
たとえば、コンポーネントがソース無しで提供される事は良くあるけど、
そのコンポーネントでテンプレートが使われていたら、その依存関係が
非常にややこしくならないか?
126 :
125 :2000/10/08(日) 17:34
あるテンプレート提供された関数的ライブラリAが公開されているとする 別のコンポBがAを使っていてソース無しで公開されいた。 AとBを同時に使ってCを作った。 ところがAがバージョンアップされた。 普通のライブラリならAを更新するだけで問題無い。 でもテンプレートライブラリだとBを再コンパイルしなければならないのでは?
127 :
220 :2000/10/09(月) 01:44
げっ、文字が多いよ。ヨッパライにはつらすぎる。
おまけにジャックルーシェはゴミだし...
>>122 >階層の知識は不要
これはウソ。親クラスのインターフェースを知っとく必要があるでしょ。
class library利用者は最低限継承を理解してないとだめ。
実際は(データベース)コンポを使うだけという最下層があるんだけど。
>>123 その議論を今までえんえんとしてたの。
>>64 あたりから読んでね
現状は基底クラスであるTObjectのみしか保持できないコンテナライブラリのみある
おかげでダウンキャストをソース全域でやる必要がある。でも抜け道もある。>75
>>124 C++のfinallyは絶対必要。いくつかのバグが未然に防げる可能性が非常に高い。ブロックローカルなクラスなんてナンセンス。
あるいは
>>12 をサポートしてもいいかもしれない。生産性向上にはほとんど寄与しないけど。
ではなぜtemplateはだめでこっちは賛成なのか?
それは上記2つの改善は導入したところで全然副作用がないから。
templateは125,126の言うように、副作用がでかすぎる。
最悪VCL,コンテナライブラリの再設計が必要になる。
このコストはtemplateの導入メリットを遙かに上回る
#一日中コンテナクラスを宣言してるわけじゃないでしょ?
よって導入の必要性なし。これがトレードオフの結果。
...なんてのは、ここで言うまでもなくInpriseが判断した結果だと思うよ。
ここらへんのInpriseのエンジニアの徹底した現実主義に基づいた
判断力(サポートするアプリ・プラットフォームの範囲、
控えめでフラストレーションがたまるが強力な言語仕様、
実行速度などなど)はDelphiに関しては絶対的に信頼できるよ。
というか少なくとも俺はしてるの。いまのところ。
128 :
121 :2000/10/09(月) 01:45
げっ、文字が多いよ。ヨッパライにはつらすぎる。
おまけにジャックルーシェはゴミだし...
>>122 >階層の知識は不要
これはウソ。親クラスのインターフェースを知っとく必要があるでしょ。
class library利用者は最低限継承を理解してないとだめ。
実際は(データベース)コンポを使うだけという最下層があるんだけど。
>>123 その議論を今までえんえんとしてたの。
>>64 あたりから読んでね
現状は基底クラスであるTObjectのみしか保持できないコンテナライブラリのみある
おかげでダウンキャストをソース全域でやる必要がある。でも抜け道もある。>75
>>124 C++のfinallyは絶対必要。いくつかのバグが未然に防げる可能性が非常に高い。ブロックローカルなクラスなんてナンセンス。
あるいは
>>12 をサポートしてもいいかもしれない。生産性向上にはほとんど寄与しないけど。
ではなぜtemplateはだめでこっちは賛成なのか?
それは上記2つの改善は導入したところで全然副作用がないから。
templateは125,126の言うように、副作用がでかすぎる。
最悪VCL,コンテナライブラリの再設計が必要になる。
このコストはtemplateの導入メリットを遙かに上回る
#一日中コンテナクラスを宣言してるわけじゃないでしょ?
よって導入の必要性なし。これがトレードオフの結果。
...なんてのは、ここで言うまでもなくInpriseが判断した結果だと思うよ。
ここらへんのInpriseのエンジニアの徹底した現実主義に基づいた
判断力(サポートするアプリ・プラットフォームの範囲、
控えめでフラストレーションがたまるが強力な言語仕様、
実行速度などなど)はDelphiに関しては絶対的に信頼できるよ。
というか少なくとも俺はしてるの。いまのところ。
129 :
名無しさん@お腹いっぱい。 :2000/10/09(月) 12:28
>126 それは、つまりバイナリレベルで template が表現できない、 ってことだよね。 その考えが間違っていると思う。 確かに、 C++ の template をそのまま導入したら、 ソースが必要になるが、きちんと設計されていれば バイナリのままで問題ないはず。
130 :
提案 :2000/10/10(火) 09:49
という事で、このスレでは、バイナリレベルでどうやって テンプレートを実現するか的方向は如何? 非常に興味あります。 単に、継承を気軽に書く機能程度なら想像つくのですが・・・
131 :
>130 :2000/10/10(火) 10:47
確かに俺も想像力が貧困みたい。 継承を気軽に書く=クラスの割当てしか思い付かない。 こんな感じかな? 新クラス名 Allocate 親クラス名 配給クラス名 例: TFormsList Allocate TList TForm 機能としては 親クラスのTObjectを配給クラス名に呼び替えて使うだけ
132 :
名無しさん@お腹いっぱい。 :2000/10/10(火) 10:51
なんか必要性もロクにプレゼンできてないのに 実装論に突入しちゃうの?俺はもう飽きたから抜けるけど。 まとめ ・過去にTStackがボトルネックになって困ったる人いるの? ・それをvirtual使わない自前のTMyStackでリプレースして改善されたの? ・TObjectStack継承してタイプ数増えてバグ出てスケジュール遅れた人いるの? ・総称で充分じゃん、という議論はないの? ・templateいれたらinlineも入れるの? ・inlineいれたらinterfaceにコード書くの? ・コード展開したらさらに最適化弱くなるよ? ・上の入れても結局オプティマイザの貧弱さによる速度低下の方が大きくない? # 関数呼び出しのオーバーヘッドすら問題になるような # クリティカルなプロジェクトはそもそもBCB,Delphiじゃ無理 # てゆーか、どうしてC++であるBCBはDelphiより速くないの? ・コンパイラ・ライブラリの大改造より先にInpriseにやって欲しいことないの?
133 :
名無しさん@お腹いっぱい。 :2000/10/10(火) 10:55
>・コード展開したらさらに最適化弱くなるよ? これはウソだね。ごめんなさい。
134 :
130 :2000/10/10(火) 11:04
いや、テンプレート論は 他の言語でのプログラミング用語スレでやってるみたいだからって意味で
135 :
130 :2000/10/10(火) 11:06
こっちのスレは、バイナリ(コンパイル済ユニットファイル)レベルで 実現出来ない機能は要らない的な方向みたいに感じたので・・・勝手に提案しました
136 :
ソース管理 :2000/10/10(火) 13:41
う〜んむ、やっぱ、CVSなのかなぁ・・・。 CVSは若干、高機能すぎる気がしたのと、重かったりするのがちょっと・・・。 う〜んむ・・・ 簡単なのでいいんだよね・・・。 なんか、不毛な気もするけど、自分で作ってみる事にします。 どっかで作ってるの見かけたら、優しくしてね・・・。
137 :
名称未設定 :2000/10/10(火) 14:45
自分でやるなら バージョン名・日付などをディレクトリ名にして WinDiffというのが簡単ですよ。
138 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 12:08
>>136 つーかCVSでないと、複数のファイルまとめてバージョンXXみたいな管理
やりにくいんだよね。RCSのstate使ってできなくもないけど面倒くさい。
ブランチ分けて-current, -stableみたいにできるのも便利だし。
139 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 15:22
>>138 ブランチわかってない奴にプロジェクト引き渡したら、
データ壊しやがった。(バックアップはあったけど)
ツールは周りのレベルをよく見て使いすぎに注意しましょう。
>>135 >132は勝手に抜けただけなんだから、
勝手に続けちゃっていいよ。それが2chじゃん。
どうせならC++のSTLを1行も変えずに導入でき、
さらになるべくObject Pascal文法拡張を最小限に抑えるような
実装を話し合ってくれると面白いぞ。
140 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 20:35
確かに制限つきの総称はいらないな。
141 :
>139 :2000/10/11(水) 20:37
>どうせならC++のSTLを1行も変えずに導入でき この段階で既にpascalソースを吐くコンパイラを作れと同義かも
142 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 20:43
>141 STL移植&アップデートするより コンパイラ・コンバータ作ったほうが楽じゃん<-暴論?
>140 理由を述べよ
144 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 22:07
では、まじめな案。 type TCollection(ItemType : TObject) = class protected FItems: array of ItemType; FCount: Integer; function GetItem(Index: Integer): ItemType; procedure SetItem(Index: Integer; Value: ItemType); public procedure Add(Item: ItemType); function IndexOf(Item: ItemType): Integer; procedure Remove(Item: ItemType); property Count: Integer FCount; property Items[Index: Integer]: ItemType read GetItem write SetItem; end; 使い方の例 type TControlCollection = TCollection(TControl); 肝は、型引数として Delphi Class のみに限定するところ。 Delphi Class は実体としてはヒープ上のメモリブロックへの ポインタでしかない。だからコンパイル時の型チェックさえ処理できれば 生成コードそのものはポインタのやり取りと RTTI で実装可能。 その代償として、TCollection(integer) は宣言できない。
145 :
>144 :2000/10/11(水) 22:17
実装としては、TCollectionの ItemType=TObjectにしてコンパイル してしまって、利用側で隠れて As 使うって事だよね?
146 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 22:54
そ。理解できる人は一人はいるか。 実際には、コンパイラ側で最適化できる部分は多いので 暗黙の as はかなり削除できる。
一人しか、いないみたいだね。
148 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 10:19
>132眺めてておもうんですが、 Delphiアプリのボトルネックってどこなんでしょ? 個人的にはこんな感じだと思います UI(人間) = DBコンポ >>>> 最適化の弱さ >>> virtualメソッド呼び出し >= 普通のメソッド呼び出し
149 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 10:55
>144,145 実行時のasは余計な気がする EditCollection.Add( TEdit(Form1) ) とかできなくなっちゃうし(必要性云々は別として) 逆にこんなタコなコードをいちいちチェックするための コストを支払う必要はないのでは? ビルド時のチェックのみで十分だと思いますよ。
150 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 12:09
asは Assert(xxxx is Tyyyy)であると心得よ asに頼りすぎちゃいかんよ
TListを継承すればいいじゃん
152 :
29 :2000/10/21(土) 17:26
TObject.MethodAddressを使えば publishedメソッドを呼べることはわかりました。 publishedメソッドを検索・列挙して自動的に 全部(あるいはメソッド名でフィルタをかけて)呼ぶ という事は可能でしょうか。
オブジェクトにリンクされているのならね
154 :
リンクされているのならね :2000/11/15(水) 13:15
155 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 13:32
>29 出来ると思うけど、あまり意味ないように思うんだが?
156 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 20:00
たまにはあげる
157 :
名無しさん@お腹いっぱい。 :2000/12/04(月) 11:34
TStatusBarの右下に三角のマークツマミがあります あれをFormやPanelに描くにはどうしたらいいんですか? ついでにその上にマウスカーソルをもっていくと カーソルが変化するとうれしいです。 ヨロツク
158 :
名無しさん@お腹いっぱい。 :2000/12/04(月) 16:34
Delphiでシェルのコンテキストメニューに独自のメニュー追加する方法教えて下さい。 例えばコンテキストメニューに"ファイル名をクリップボードにコピー"とか 追加してみたいです。たぶんDLL作る必要があるんだと思いますが。
貴方なんども聞いてますね、ご苦労さん >158 Delphiシェル本を読んで、DelphiデモのContextMenuを動かしたら まあまあわかりますよ。
160 :
名無しさん@お腹いっぱい。 :2000/12/04(月) 21:05
Delphi買ったけど、マニュアルが難しくて何やっていいのか わからないです。
161 :
名無しさん@お腹いっぱい。 :2000/12/04(月) 22:10
>>160 何をしたくて買ったのか思い出してください。
162 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 01:59
Delphi5で、Integerに対してshr演算子使うと、ほんとにshr命令を出してしまうのですが sar命令にしたい時ってどーしたらいいのでしょうか というか符合付き右シフトなんですけど
163 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 02:20
div 2
164 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 02:50
>div 2 うーん、それだと-1をsarしても-1なんだけど -1 div 2 だと0になっちゃうんですよね〜
165 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 04:12
>>164 インラインアセンブラを使っては?。簡単だし。
166 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 06:28
結局 function sar16(aVal: Integer): Integer; register; asm sar eax,16 end; 式の中だったんで面倒くさいんで、こんな関数でくるみました
167 :
名無しさん@お腹いっぱい。 :2000/12/06(水) 15:38
Cの、 #pragma comment(linker, "-section:Shared,rws") #pragma data_seg("Shared") HWND hTest = NULL; #pragma data_seg() ってDelphiでもやりたいんですけど。 どうやって書くの?
メモリマップトファイルをつかう
169 :
167 :2000/12/08(金) 13:58
>168 やっぱそうなっちゃうのね(;_;)
170 :
名無しさん@お腹いっぱい。 :2000/12/15(金) 18:25
if (v >= minValue) and (v <= maxValue) then のつもりで if v in [minValue, maxValue] then と書いていて、バグの原因を突き止めるのに2時間掛った俺萎え 可読性よくしようとして逆に嵌まる見本みたいだったな〜
171 :
名無しさん@お腹いっぱい。 :2000/12/15(金) 18:59
if v in [minValue..maxValue] then じゃないの?
>170,171 その書きかたって、速度的には>=<=使うのと変わらないの?
173 :
名無しさん@お腹いっぱい。 :2000/12/15(金) 19:22
速度的には1回の比較で済むので速いよーな気がする。 ただし集合型は要素数が256以下で0〜255 までの範囲しか取れない。 関係ないけど範囲チェックなら、自分は直感的に if (minValue <= v) and (v <= maxValue) then こー書く。逆判定なら、 if (v < minValue) or (maxValue < v) then こーね。
174 :
170 :2000/12/15(金) 21:55
>if v in [minValue..maxValue] then >じゃないの? そーです、てんてんにしなければいけなかったのです 速度的にはわがんねけど(ぉ andとかor使うと、vを2回書かなくちゃいけないから 書き換えたときに片方だけ忘れるといやだと思ったのね
175 :
名無しさん@お腹いっぱい。 :2000/12/16(土) 00:19
>>172 -174
おまえら、なぜアセンブラ出力で確認しない?
176 :
名無しさん@お腹いっぱい。 :2000/12/16(土) 01:21
直接は関係ないんだけどWZ EditorでDelphiのIDEと同等の コード補完機能ってマクロかなんかでないの?
ブレークポイントで止めてCPUウインドウで確認してみた。 集合演算ではcmp命令にならないようだ。
>関係ないけど範囲チェックなら、自分は直感的に >if (minValue <= v) and (v <= maxValue) then おれも!
179 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 00:35
>>176 無理だろー。型の情報をどっから持ってくるん?
180 :
176>179 :2000/12/17(日) 00:44
ごめん、そっちじゃなくて「コードテンプレート」だった。 (ctrl+jでwhilebをwhile do begin endに展開する機能。 Wzに類似の機能もあるけどどーも使いづらい) # でもC++,Javaなどのコード補完はmuleのマクロでできるらしい
181 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 01:00
関係無いけどB2のキーワード設定に Pascal構文を入れると、MLが見やすくてよいね。
182 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 01:15
>>180 定型文をクリップボードにコピーするソフトを
Delphiで自作すれば?あ、でもインデントが問題
になるね。
外部エディタはFree版EmEditorぐらいしか使ってないので
わかりませ〜ん。
183 :
ばかもの国津慎吾じゃないぞ :2000/12/21(木) 20:06
へ?
何故にVB ML? 新手の煽り?
ってゆーか、タスクバーのプロパティで[時計の表示]をOff にして代わりに自作のタスクトレイ(ステータスエリア) に表示すれば済む話では?
187 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 21:55
Delphi使いの平均月収はいくらですか? 21万?
まあた煽りか・・・
189 :
183 :2000/12/22(金) 23:39
なーんだ、まだ出来てないの? はやくつくれつくれ、って。 Techスレだよ、Tech、 さっさとつくりなさいよ。
190 :
名無しさん@お腹いっぱい。 :2000/12/23(土) 03:09
interfaceにプロパティ持たせたいとき、 名前と型だけで勘弁してもらう方法ありませんか。 実装クラスでは単にフィールドに結び付けたいのに いちいちメソッドにしなきゃいけないのってうざったいっす。
191 :
デフォルトの名無しさん :2000/12/23(土) 10:40
>>190 実装上インターフェースが示すインスタンスは元のインスタンスとは別に
作られるのでメソッドは難しくないが、フィールドに結びつけるには
あまり効率よい方法はないので、メソッドで解決したほうが簡単ではあるまいか
>189 仕様が良く判らん。仕様を書きなさい
TComponent派生でFormに置くと 実行時に内部的にCanvasを生成して Widht、Heightで、タスククロックのサイズ部分を横取りさせる。 内部Canvasに描画すると TClockが描画するような感じになってくれるとよいでフ。 つまりTClockアプリが 巷にあふれんばかり登場するように作ってほしい。 誰が答えているのか、わかりそうなもんだな(w
>>193 あほっていうヤツがあほ
っていうか、作れない193はあほ?
195 :
デフォルトの名無しさん :2000/12/23(土) 14:55
余計に判らん・・・・ 解読すると、 1)名前はTClock フォームにある時は非ビジュアルコンポーネント プロパティ Canvas Width・Height OnPaintイベント 2)実行時 常駐してる TrayClockWClass クラスを探しサブクラス化 という事ですか? ならば 任意のコントロールに対して同じ仕様のコンポーネントを 親コンポーネントとして作ればもっと応用が利きますね
TClockってのは 有名なフリーソフトだと思うぞ。
ってゆーより、単なる煽り目的だからマジに捉えん方が いいと思うぞ。
なんか「VBで万年カレンダー」を思い出すよ・・・ (んなこと書くとまた1がしつこく上げてきそうだな。)
>>197 194の厨房的反応といい、VB-MLからの振りといい、
まず間違いなく煽りだろう。(ベクトルVB元気?)
200 :
名無しさん@お腹いっぱい。 :2000/12/24(日) 16:22
202 :
Del歴一週間 :2000/12/25(月) 11:30
質問なんですが、Outlookの送信者、件名、日付と並んでいるメール選択コンポIは、Delphiでは 何という名前のコンポーネントなんでしょうか?
TListView
TStringGrid(w
205 :
Del歴一週間 :2000/12/25(月) 16:37
>203 どうもありがとうございました。 一見しただけでは、わかりませんでした。
スレ違い。
208 :
名無しさん@お腹いっぱい。 :2000/12/29(金) 08:32
age
209 :
183,192 :2001/01/02(火) 14:55
209は一体何を期待しているのだろう? 山城慎吾ってのも厨房っぽくてものすごく さむい。
212 :
デフォルトの名無しさん :2001/01/07(日) 18:48
今更で申し訳ないんですが、 VB使いとDel坊の戦争はどっちが勝利を収めたのですか?
>213 かわいそうにそれくらいしか加われる話題がなかったのね。 Perlスレに行ってマンセーとでも叫んでれば?
Delphi欲しいよ〜お金が無いよぉ
>>215 働きなさい。
学生だったら学割でラーニング版1万ぐらいで買えるだろ。
217 :
デフォルトの名無しさん :2001/01/08(月) 19:17
ToolBar内に動的にToolButtonを追加・削除ってできます?
出来るよ。当たり前
219 :
デフォルトの名無しさん :2001/01/08(月) 20:38
どうやって?
Createすればいいじゃん。
221 :
ほり :2001/01/08(月) 20:43
procedure TForm1.Button1Click(Sender: TObject); var ToolBtn: TToolButton; begin ToolBtn := TToolButton.Create(Self); ToolBtn.Parent := ToolBar1; end;
普通に追加すればいいんですね。 ToolBarの専用メソッドをずっと探してました。
223 :
デフォルトの名無しさん :2001/01/09(火) 00:13
TThreadでスレッドを作って中でwhileループさせ、メインスレッドと同時に 処理を行っているのですが、メインが終了するときOnClose()で terminate,destroyしていますが、終了時にkernelが例外を起こして しまいます。これは裏のスレッドが終了していないということなのでしょうか? 強制終了フラグを作ってtrueになると裏スレッドが終了するように して、Close時に立てたりしてみたのですが(もちろんクリティカルつき)ダメでした・・・。
waitfor(だっけ?スペル違うかも)で スレッドが終わるのまってみてください。
waitforって、Synchronizeと衝突するとか読んだんですが 併用はできないということなんでしょうか? (waitforはメッセージ受け取らないし、syncはメッセージ受け取るまで終わらない)
誰か function IsUrl(s: WideString): Boolean を実装してください。
227 :
D使い(久々) :2001/01/09(火) 03:03
>>223 Terminate()メソッドはスレッドオブジェクトのTerminatedプロパティを
Trueにしてるだけだから
スレッドのExecute()中でTerminatedプロパティを監視しておく。
スレッドはTerminatedがTrueになったら自分で終了(Execute()を抜ける)
メインスレッドは、
Terminte()して、
WaitFor()でスレッドが自分で終了するのを待って、
Destory()する。 (or FreeOnTerminate = True)
>waitforって、Synchronizeと衝突するとか読んだんですが
Synchronizeに突入する前にTerminated見れ。
228 :
デフォルトの名無しさん :2001/01/09(火) 03:28
スレッドのWaitForではまったなぁ
>>Destory()する。 (or FreeOnTerminate = True) わわ、Free() の間違い。スマソ
230 :
デフォルトの名無しさん :2001/01/09(火) 11:21
231 :
226>230 :2001/01/09(火) 14:40
いえ、やりたいのはこんなのです
s := 'www.hoge.com';
if IsUrl(s) then
s := NormalizeUrl(s); // s := '
http://www.hoge.com/ '
232 :
デフォルトの名無しさん :2001/01/09(火) 15:33
オートコンプリートみたいな機能ですね。 末尾が.comとか.co.jpとか.netとかで判定するのでは 駄目?(直IPアドレスな所もありますが。)
233 :
223 :2001/01/10(水) 00:30
ありがとうございます。なんとか解決しました。 今日のお馬鹿・・・OnFormCreateで実行環境を初期化して、それが終わる前に MMTimer走らせたらクラッシュ。マルチスレッドって難しいですね・・・。
234 :
奥さん、名無しです :2001/01/10(水) 00:54
余計かもしれんが、 231みたいな用途だとするとIsUrlという名前は不適切じゃないかな。
IsHostName
236 :
デフォルトの名無しさん :2001/01/10(水) 20:59
ものすごく初歩的な質問で恐縮なんですが、、 手続きや関数でローカル変数って使いますよね? そのとき割り当てたメモリっていつ解放してるんですか? アプリケーション終了時には解放するんでしょうけど、 たとえば何時間も起動しっぱなしにしてる場合、無駄な領域が 塵も積もれば山となる的にどんどん増え続けてしまうものなんですか?
手続きや関数を出たとき
Delphian World 落ちっぱなしなんだけど
あ 復活した
>>236 正確にはスタックポインタの位置を関数が呼ばれる前に
戻してます。スタックサイズはデフォルトで最少16K、
最大1MByte程なので関数の中で馬鹿でかい配列なんか
宣言するとセグメントフォールトなんか出たりします。
そのため通常はポインタやオブジェクト参照などの
スタック消費量の少ない変数を使用し、実オブジェクトは
ヒープ領域と呼ばれる別セグメントなどに動的に確保します。
それらは明示的に開放する必要があります。
ただし長い文字列型や動的配列、バリアント型などは自動的な
メモリー管理を行っているものが有ります。
241 :
236 :2001/01/11(木) 01:24
明快な解答ありがとうございます。 馬鹿でかい配列などではなく、ただのIntegerやStringを使う度に気になって いたんですが、神経質過ぎたみたいでお恥ずかしい限りです。 あと、もう一つ伺いたいんですが、Delphiの内部メッセージ(CM_DialogKeyなど) についての説明が、ヘルプなどを見ても何一つ記述がありません。 コンポを自作している人はどうしてるんでしょうか? 解説本とかでいいものがあったらぜひ教えてください。
243 :
デフォルトの名無しさん :2001/01/11(木) 13:19
みんなレヴェルたか淫だから、 ギコバシックの開発手伝ってやれE 正月ボケも治ってきたろ?
244 :
デフォルトの名無しさん :2001/01/12(金) 02:13
HeaderControlメモリリークしてない? while True do THeaderControl.Create(nil).Free; でメモリが減りまくる
>244 ニュースグループでも報告があった。 FImageChangeLink を開放してないらしい。 しかしなんかかっこいいな<while True do THeaderControl.Create(nil).Free;
246 :
236 :2001/01/14(日) 04:44
>242 亀レスごめん。取り敢えず「バイブル」の方だけ買ってきました。 が、よく解らない。と言っても、これはこれで良い本ですが。 「Inside Delphi」に期待しようと思います。まだ手に入るかな? それと、中村さんのところは一応知ってました。レスどうもでした。 #ああ・・・こんなに苦労するくらいなら、 #おとなしくCでSDKやってれば良かった・・・かも知れず。
247 :
デフォルトの名無しさん :2001/01/20(土) 14:24
シツモソー。 TCheckBoxで、Checkedプロパティ変更するたびに、 OnClickイベント起動されてうざいんだけど、 こんな風に、イベントハンドラを退避させるしかないのかなぁ。 var tmpEvent: TNotifyEvent; tmpEvent := CheckBox.OnClick; CheckBox.OnClick := nil; CheckBox.Checked := True; CheckBox := tmpEvent; もっと簡単な方法ないノン?
248 :
デフォルトの名無しさん :2001/01/20(土) 21:52
OnClickイベントを procedure TForm1.CheckBox1Click(Sender: TObject); begin if FProgramChanging>0 then Exit; ほにゃら end; として Inc(FProgramChanging); try CheckBox1.Checked := True; finally Dec(FProgramChanging); end; でどうよ? このテクはどのコントロールでも使えるよ。
249 :
デフォルトの名無しさん :2001/01/20(土) 22:03
b.Parent = aとなるようなTWinControlのインスタンスbのリストって どうやれば作れるの?Components[]は違うよね。
>>248 ナノレホドー。
カウンタ使うのがミソやねー。
まとめて複数のプロパティ変更するときにもベソリっぽいし。
thanx!!
よいスレだ
251 :
デフォルトの名無しさん :2001/01/21(日) 14:52
252 :
名無しさん@お腹いっぱい。 :2001/01/21(日) 16:32
kylixは?
254 :
デフォルトの名無しさん :2001/01/26(金) 00:33
ThreadとTimerを使ってリアルタイムシミュレーションのプログラムをしていますが、 片方のスレッドの処理が重く、Timerのスレッドまで圧迫して困っています。 (処理が重くなるとだんだんTimerが遅くなる) 解決法はないものでしょうか?
255 :
デフォルトの名無しさん :2001/01/26(金) 00:41
>>254 重いほうのスレッドのプライオリティを下げてみれば?
タイマーの代わりにマルチメディアタイマーを使う。 根本的な解決にならんが‥
257 :
デフォルトの名無しさん :2001/01/26(金) 03:10
重い方のスレッドに適当にSleep(0)とか紛れこませておく。
Kylixは何と呼んでますか? 「カイリックス」「キーリクス」「キゥリクス」?
カイリックス
260 :
254 :2001/01/27(土) 00:30
重いのは描画の関数で、呼び出してから抜けるまでが長いんです。 これが、MMTimerのInterval内で終わればいいんですが、遅いマシンだと 足を引っ張ってしまうって感じです。 sleep(0)を入れようにも、drawメソッド自体が重くて・・・。 やっぱり描画関数のソースを分解しないとダメでしょうか。 (プライオリティについては初めてですがやってみます)
261 :
デフォルトの名無しさん :2001/01/27(土) 00:50
>>254 スレッドのプライオリティでダメなら別のプロセスに分けてみたら。
タイマー用のプログラムを別に動かして本体の方にメッセージを投げるとか。
一応本体のプロセスのプライオリティは下げた方がいいかも。
262 :
デフォルトの名無しさん :2001/01/27(土) 23:55
揚げてみる。
263 :
turbo type D :2001/01/30(火) 10:23
どうしてWindowsのコーディングがすべて Delphiにならないんだろう。いや、なってくれ頼むから。 適材適所の言語を覚えるのは何ら苦はない。 だがあきらかに Delphiパスカルより劣ったC++を Windowsプログラミングのために 覚えなければならないのは面倒だ。
BorlandがOSのデストリビューターになればいいんだよ。
よーしおれが買ってや。
268 :
デフォルトの名無しさん :2001/01/30(火) 16:37
>>263 ただでさえ糞なWindozeがさらに糞になるから。
>Delphiパスカルより劣ったC++を
VBより劣ったDelphiがC++に勝るわけないだろ。
DelphiにUML表記のクラスビルダーなんか付かないかなあ。 メソッドや属性を入力していくとそれがそのままコードエディタ に反映されたりするの。 GUIを作っている時はビジュアルデザイナとコードエディタの 2-Wayなんだけどクラス作る時はコードエディタだけなんだよね・・・ 今のコードエクスプローラやコード補完でも十分に使えてはいるけど・・・
271 :
デフォルトの名無しさん :2001/01/30(火) 20:47
DelphiにこだわらずにOCL似の言語も登場したらいいんじゃないかな。
とりあえずテスティングフレームワークを標準で付けて欲しいかも
273 :
デフォルトの名無しさん :2001/01/31(水) 03:28
MLで話題に上っていたが なんなの?テスティングフレームワークって。 あと>>OCLってなに?
274 :
名無さん :2001/01/31(水) 03:38
>264 賛成。 Linuxのディストリビューターになれば良いのに。 そしたらBorland流にOSをいろいろ発展させられるだろうに。
275 :
デフォルトの名無しさん :2001/01/31(水) 03:56
>>274 corelとの合併はそれが目的だったんだけど…
corelの株が暴落しておじゃんに。
276 :
デフォルトの名無しさん :2001/01/31(水) 11:24
辞書ファイルのような一つの巨大なテキストファイルから、欲しい語句の部分を 読み出すにはどのようなコードを書けば効率よくできるのでしょうか?
277 :
276 :2001/01/31(水) 11:25
すみません追加です。 語句は五十音順、もしくはアルファベット順に並んでいる場合です。
278 :
デフォルトの名無しさん :2001/01/31(水) 11:35
ファイルを一旦全部読んでいいのなら メモリ上に目次を適当な頻度で作る 目次をバイナリ検索して、ファイルの該当部分を読んで検索すればいい。 これを別のファイルで保存しとけば次の起動からは高速に起動できる。 それが許されないなら、ファイル全体をバイナリ検索。
279 :
278 :2001/01/31(水) 11:40
2048バイトを1ブロックとする。 検索中は隣り合う2ブロックを読み、最初にCRとか語句の区切りに使う単語迄を捨てる まずファイル全体のサイズを調べて真中へんのブロックを読み 後は比較しながらバイナリ検索
280 :
276 :2001/01/31(水) 12:04
>278 どうもありがとうございます。 目次の作成の部分なんですが、具体的にはaで始まる語句、bで始まる語句 のファイルアドレスを、ファイルなどに書き出すということでしょうか?
>>280 まあ、それで間に合うならそれでいいけどアルゴリズムの本でハッシュを調べると
もっと効率的になるかも。あと一般的な手法としては辞書から検索木を作っちゃう
っていう方法もある。ここはDelphiだからしゃーないけどSTLを使うと楽ちん。
って辞書か、ボケてた。278の方法のほかには二分検索があるね。
ってそれは278のいってることじゃん。鬱山車脳
284 :
デフォルトの名無しさん :2001/01/31(水) 17:54
>目次の作成の部分なんですが、具体的にはaで始まる語句、bで始まる語句 >のファイルアドレスを、ファイルなどに書き出すということでしょうか? それでもいいけど、たとえば100単語毎に語句とそのアドレスを書くようにすれ ばもっといいと思う。たとえば10万単語あっても目次は1000単語でいい。 で、アドレス間のファイルを(100単語文)一括で読む程度はどうせ HDが一周するのに収まるだろうから大小はそれほど問題なし。
285 :
デフォルトの名無しさん :2001/02/01(木) 00:47
>>276 DBは使えない事情があるの?xBASEのファイルなんて
ダンプしたらまんまテキストのISAMファイルなんだけど・・・
286 :
デフォルトの名無しさん :2001/02/01(木) 01:07
>>284 の方法にさらに 先頭1文字の変更点も単語表に追加し、
先頭1文字の表をメモリ上に用意しておけば、もう
カンペッキ
287 :
デフォルトの名無しさん :2001/02/01(木) 01:09
>>285 辞書ファイルの更新が無い状態なら DBは必ずしも効率的でないぞ
中身はB木かその変形だからね
288 :
ななし :2001/02/03(土) 19:40
どこかで、漢字を入力するとその読みを表示してくれるソフトをみたのですが、 これはどのようにやれば出来るのでしょうか。 なんかATOKとか関係してるみたい。ATOK用とMS-IME用とで別れてたので。
289 :
デフォルトの名無しさん :2001/02/03(土) 20:53
>>289 おーありがとうございます。
試してみます!
291 :
ななし :2001/02/04(日) 02:02
>>289 今そのページにあったコンポーネントを試してみました。
結果ですが、ユーザーによって入力された漢字なら読みを表示出来ますが、
クリップボードからの貼り付けだと、読みは表示できませんでした。
どなたかクリップボードからの貼り付けでもちゃんと読みを表示する方法をご存じないでしょうか。
おいおい、漢字には音読み訓読みがあるのはもちろん知ってるよな? 意味解析までしなきゃ到底無理だぞ。
294 :
turbo type D :2001/02/04(日) 02:40
ほんとうだ! 作者にメールしなさい。
295 :
デフォルトの名無しさん :2001/02/04(日) 07:26
>>291 ユーザーによって入力された漢字はプログラムで比較的楽にとれるんだけど、
読みを解析するとなると急に大変になるぞ。
297 :
turbo type D :2001/02/05(月) 01:39
>>293 のソフトはそれほど大変に作られているようには見えないのだが
IMEの再変換を使っているんだろうな。
EmEditorでも再変換機能がある
どうやるんだっけ?
マニュアル読め。>297 それでもわからんなら作者に連絡しろ。 それから、デルファイ厨房逝って良し!
どうやるんだっけってのは EmEditorの操作ではなくて プログラミングでどうやるんだっけ。って事な。 作れないヤツにイって良し呼ばわりされる覚え無し テメエが先首くくって氏ね.
ImmGetConversionListあたりであると推測する。 とにかく頭にImm〜の付くものをヘルプで調べてみては? 英語のヘルプにしか無い様だが。(MSDNでも和訳は無い)
自分で作るのめんどいな、 解説してるページどこかにないですか?
302 :
デフォルトの名無しさん :2001/02/13(火) 11:51
TRichEd98をDelphi5で使いたい! やっぱ自分でソース読んで直さなきゃダメ?
ソースあるんなら使えるじゃん
304 :
turbo type D :2001/02/13(火) 12:30
305 :
デフォルトの名無しさん :2001/02/13(火) 15:24
Delphiで非同期モニカを使いたいのですが、解説や具体的な例が無くて苦労しています CreateURLMoniker でIMonikerを得た後にどうしたらいいのでしょう?
306 :
デフォルトの名無しさん :2001/02/13(火) 17:01
307 :
305 :2001/02/13(火) 18:15
>>306 ありがとうございます。
MSDN見て非同期モニカが主流なのかと勘違いしていました。
どちらも日本語資料が見当たらなくて苦労しています。
これから勉強します
308 :
305 :2001/02/13(火) 20:55
309 :
デフォルトの名無しさん :2001/02/14(水) 00:13
TClientSocketを使って簡単なHTTPクライアントを作りたいんですが、 TClientSocket.Socket.ReceiveTextで受け取った文字列を TMemo.Lines.Addでメモに貼っても上手く改行されません。 HTTPサーバから送られてくる文字列はCFかLFが欠けてる様で、 改行部分が黒い点「・」←こんな感じになってしまいます。 どうすれば良いんですか?
310 :
デフォルトの名無しさん :2001/02/14(水) 07:04
>309 文字列を一文字ずつ調べてCFかLFが来たときそれが繋がってなかったら繋がるように置換する。
311 :
デフォルトの名無しさん :2001/02/14(水) 07:06
>309 ちゃんと繋がってるかいないか調べろよ。 UNIX系のサーバーだと改行コードがCFのみ(LFのみだっかたな?) MACだとその逆。 WinNT系だとCF・LFになってる。
312 :
デフォルトの名無しさん :2001/02/14(水) 09:06
HTTPって行末コード規定されてないの?
AdjustLineBreaksつかえ
314 :
デフォルトの名無しさん :2001/02/14(水) 14:58
>312 されてないないよ。 ヘッダ(HTTPが通信用に作った部分)は決まってるけど。 送信するデータ部分はテキストだろうがバイナリだろうがそのまま転送。
315 :
311 :2001/02/14(水) 15:20
ごめん。 サーバーは関係ないや。 HTML作ったコンピュータの改行コードだった。 でも一般的にFTPがサーバー側の改行コードに変換する。 CGIプログラムのファイルの場合は文字コードも変えるんだっけ?
316 :
309 :2001/02/14(水) 18:29
みなさん色々ありがとうございます、
>>313 さんの教えてくれた関数で問題が解決しました。
ところで、
スレッドオブジェクトを使ってプログラムを作っているんですが、
ExcuteメソッドからVCLのメソッドやプロパティを使う場合、
必ずわざわざ新しく別のメソッドを作って
Synchronizeで呼び出さないと駄目なんですか?
これってかなり面倒だと思うんですけど。
1つのメソッドの中に処理を全部詰め込んでも良いんですかね?
Executeの中はただWhileループと
Synchronizeによる呼び出しだけになっちゃいますけど。
面倒でもそうするの。 本当は必ずじゃないはずだけどね。
Syncで読んだ関数からまた関数よべばいいでしょ。 間違ってたら許してね。
319 :
デフォルトの名無しさん :2001/02/15(木) 17:14
DELPHI5のラーニング版で作ったソフトって自由に配布して良いんですか? それとも何か制約みたいなのがあります?
320 :
turbo type D :2001/02/15(木) 18:06
321 :
turbo type D :2001/02/15(木) 18:07
スマソ、すごいばかげた質問かもしれないが 以下のコードをトレース実行したら落ちる。 なぜ? マジレスキボーン procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; Moji: String; begin SL := TStringList.Create; try SL.LoadFromFile(ExtractFilePath(Application.ExeName)+'Unit1.pas'); ShowMessage(sl.Text); Moji := SL.Text; finally SL.Free; end; ShowMsg(Moji); end; procedure TForm1.ShowMsg(Str: String); var S: String; begin S := AnsiUpperCase( Str ); ShowMessage(S); end;
322 :
デフォルトの名無しさん :2001/02/15(木) 18:20
>>321 どこまでは落ちずにトレースできるのか
くらいは書かないか?
文字列は単に代入された時は中身はコピーされず参照だけ がコピーされる。書き換えようとした時に初めてコピーが 作成される。(コピー・オン・ライト)
324 :
デフォルトの名無しさん :2001/02/15(木) 19:04
試したけど、落ちない。
325 :
デフォルトの名無しさん :2001/02/15(木) 19:09
まずは落ち着いて、Windowsを再起動してみようよ。
>323リファレンスカウント
恐らくコードは省略されている。上記コードはStringListが解放された 後別になにもしていないので、メモリ内容は運良くそのままである。
329 :
turbo type D :2001/02/15(木) 19:54
ソースは省略抜きデシ
>>322 スマソ
ShowMsgまでいったらトレースで落ちる
トレースしないと落ちない。
さっきから3回目のインストでようやく原因がわかりそう。
D5エンプラ版にUpdate当てたら落ちる。
Updateあてなきゃおちない!
なんだこりゃ。ふざけてる。訴えてやるーーー(wウソ
Delphiは参照コピーにはなっていないはず。
330 :
デフォルトの名無しさん :2001/02/15(木) 19:58
ProでUpdate1当ててるけど落ちない。
エンプラ版かー、いーなー。何落ち?OSは?
>Delphiは参照コピーにはなっていないはず ヘルプで「長い文字列」の説明よむべし。
念のため procedure TForm1.ShowMsg(const Str: String); でテストやっていたがupdate前は正常動作だしupdate後は落ちる。 落かたはIDEフリーズproject1.exe終了できない user32.dllマキコミ落ち。ウザ落ちだ。 もしかしてBCBLrnのUpdateを入れたからかも? ああ、もう最悪。
>>332 読んだ、なるほど。
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
Moji: String;
begin
SL := TStringList.Create;
try
SL.LoadFromFile(ExtractFilePath(Application.ExeName)+'Unit1.pas');
ShowMessage(sl.Text);
Moji := SL.Text;
finally
SL.Free;
end;
ShowMsg(Moji);
ShowMessage(Moji);
end;
procedure TForm1.ShowMsg(Str: String);
begin
Str := '参照?'
end;
と
procedure TForm1.ShowMsg(var Str: String);
begin
Str := '参照?'
end;
はなぜ結果が違うノ?
そういや落ちる時、ダイヤログでまくりの中に こんなエラーも出てくる Assertion failure "(!" Unrecognized interface passed to ReleaseDbkInitf!")" in ..\win32src\dbkcom.cpp at line 594 Continue execution? なんじゃこれ。
上のはそのプロシージャ内のローカルな変数だけど、 下のは呼出し元の別名になってる。だから呼出し元の 変数の内容も変更できる。(ヘルプ「変数パラメータ」参照)
Windows2000?
取りあえず、CPUウインドウとアサートの使用は控えた方がいいな。
>>336 理解しました。
>>323 の読み方が甘かった。
NT4SP5
このマシンが腐れなだけかも。......最悪。投げやり。
SP5を当てた時何かのソフトが動かなくなったから SP3に戻した事がある。M$よ、お願いだからパッチに紛れて 新しい機能付け足さないでおくれ。
341 :
デフォルトの名無しさん :2001/02/15(木) 21:59
ウィンドウズ用のソフトで一般的に使われているツールバーのボタン画像 新規作成・開く・ファイルに保存・印刷・切り取り・コピー・貼り付け・・・その他色々 を自分の作っているソフトにも使いたいんですが、どこにあるんですか? 他のソフトのボタン画像をキャプチャーする方法も考えたんですが、 皆さんはどうしてます? DELPHIに付属してるボタン画像は変なので使いたくないんです。
治った!レジストリがぶっこわれていたみたい。 お騒がせしてメンゴm○m 環境をリカバーするために 壊れたレジストリを必死で毎回インストールしてた。
>>341 DelphiMLで紹介されているRzBmp/glyphs!/RimrockSoftware
とtoolbar97に付属のもの
DelphianWorldで2種類数は少ない
以前、世界征服宣言サイトで配っていてコレハ今はwebには存在しない。
DatulaのカスタムツールバーD-Rascalで利用できるアイコン集
QXエディタのカスタムアイコン集作者3人で11種類
DelphianWorldのgifファイル全部
ぐらい持っている。
この程度あると
ツールバーのデザインに困るという事はなくなった。
が、他にいいものがあるのなら欲しい。
MSOfficeのツールボタン画像はMSDNでは最近見付からない
VBAマクロで抽出すればすべて取り出せる気がする。
344 :
デフォルトの名無しさん :2001/02/15(木) 23:02
>>341 HINST_COMMCTRLの中の、
IDB_STD_LARGE_COLOR,IDB_STD_SMALL_COLOR,IDB_VIEW_LARGE_COLOR,
IDB_VIEW_SMALL_COLOR。
323は的外れだったような・・・TStrings.TextはプロパティでGetText を呼んでるんだから、SLの開放もへったくれもないんじゃない。ま、いいけど。
>>345 もっと内部の話じゃない?
オレみたいなデル厨には理解しなくてもいい部分だとオモワレ
347 :
デフォルトの名無しさん :2001/02/16(金) 00:52
TParserクラスを派生してTHtmlParserは簡単に作れるでしょうか。
家のDel5Proも
>>321 のコードで見事に落ちる。
何らかのセッティングによって落ちる模様。
もしくは変なコンポーネントか?
何を設定したらそうなるのかは全く不明だが。
349 :
デフォルトの名無しさん :2001/02/16(金) 08:46
>348 ShowMessageでソースファイルを表示しようとするからだろう。 そんな想定してなさそうな使い方しちゃ winは弱いよ。 やるなら動的にmemo乗ったフォームれ
>>347 同じ事考えたけど、結構大変だぜー。
結局派生じゃなくて、ソース改造した変種になっちまったぜー。
IHtmlDocument2にwriteして使う方が楽かもしれないぜー。
>>349 単なるテキストソース見るのにWinが弱いわけないよ。
そういう問題じゃない。
コンパイラの設定で"長い文字列"使うにしてるのだがそのあたりが
壊れているのだろうか。いずれにせよレジストリだけインストで
解決する問題のようだわ。
知ったかして、レジストリ弄ってた報い。すべては因果律のままに。
そんな所か。朝から浮津だmonazillaろう。
352 :
デフォルトの名無しさん :2001/02/16(金) 09:55
354 :
デフォルトの名無しさん :2001/02/16(金) 13:48
>turbo type D 落ちた壊れたとだけ言われても困るのは理解出来るよね? こういう時は ShowMessageの記述されてるソース dialigsを プロジェクトに追加してコンパイルgoするとVCL内部でも ソースでバック出来るから自分で原因を探してくれ やり方はShowMessageでマウス右ボタンから定義の検索 dialogsが表示されたらプロジェクトに追加
355 :
344 :2001/02/16(金) 16:02
>>352 SDKのヘルプに書いてあるよ。TBADDBITMAPのところに。
Delphi 3でTImageと空のTToolBar貼り付けて書いてみたけど、
素直にTBitmap.LoadFromResourceIDでは読み込めないみたい。
uses
CommCtrl;
procedure TForm1.FormCreate(Sender: TObject);
var
tbab: TTBAddBitmap;
tbb: TTBButton;
himl: HImageList;
i: Integer;
begin
tbab.hInst := HINST_COMMCTRL; {-1。ハンドルじゃない}
tbab.nID := IDB_STD_LARGE_COLOR;
tbb.iBitmap := SendMessage(ToolBar1.Handle,TB_ADDBITMAP,1,LParam(@tbab));
tbb.idCommand := 0;
tbb.fsState := TBSTATE_ENABLED;
tbb.fsStyle := TBSTYLE_BUTTON;
tbb.dwData := 0;
tbb.iString := 0;
SendMessage(ToolBar1.Handle,TB_ADDBUTTONS,1,LParam(@tbb));
himl := SendMessage(ToolBar1.Handle,TB_GETIMAGELIST,0,0);
for i := 0 to ImageList_GetImageCount(himl) do
ImageList_Draw(himl,i,Image1.Canvas.Handle,i*16,0,ILD_NORMAL);
end;
356 :
デフォルトの名無しさん :2001/02/16(金) 16:52
358 :
デフォルトの名無しさん :2001/02/16(金) 23:16
>>350 >結局派生じゃなくて、ソース改造した変種になっちまったぜー。
>IHtmlDocument2にwriteして使う方が楽かもしれないぜー。
ご親切に有難うございました。TParserクラスは名前は魅力的ですが使うのやめます。
IHtmlDocument2を理解しなきゃ...
359 :
turbo type D@monazilla :2001/02/23(金) 20:00
あり?互いのヘッダから互いのクラスを参照したくて 循環参照エラになっちゃった。 こういう場合どうすりゃいいんだっけ?アレアレ???? unit Board2ch; interface uses .. Browser; type TNichSite = class; TNichCategory = class; TNichBoard = class; TNichThread = class; TNichResponse = class; TNichSite = class private .. property WebBrowser: TNichWebBrowser read FWebBrowser write FWebBrowser; end; implementation ....................................... unit Browser; interface uses .. Board2ch type TNichBrowser = class private .. procedure NavigateThread(Thread: TNichThread); end; implementation こんなのTechじゃないって?(藁
implementation部のuses節で参照すべし。 共通の先祖で互いに内包オブジェクトを宣言し、 キャストして使用すべし。
361 :
turbo type D@monazilla :2001/02/23(金) 21:15
>implementation部のuses節で参照すべし。 べし...って出来ないから聞いてるのに。 >共通の先祖で互いに内包オブジェクトを宣言し、 >キャストして使用すべし。 出てくるクラスは全部TObject派生なんだけど。 もそっと具体的にタノンマス。
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private 宣言 } public { Public 宣言 } Other: TForm; end; var Form1: TForm1; implementation uses Unit2; {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); begin Other := Form2; end; procedure TForm1.Button1Click(Sender: TObject); begin Other.Show; end; end. ------ unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private 宣言 } public { Public 宣言 } Other: TForm; end; var Form2: TForm2; implementation uses Unit1; {$R *.DFM} procedure TForm2.FormShow(Sender: TObject); begin Other := Form1; end; procedure TForm2.Button1Click(Sender: TObject); begin Other.Show; end; end.
なるほど、TFormを引数としてわたせ、って事ですか。 そりゃそうだけど納得いかないなあ。 まあ、いっか。
364 :
turbo type D@monazilla :2001/02/23(金) 21:57
>なるほど、TFormを引数としてわたせ、って事ですか。 違うよ〜面倒だったから適当に書いただけだよ〜 君には以前何度か煽られたけど。 ま、同じD使いだしな。
366 :
デフォルトの名無しさん :2001/02/23(金) 23:38
>>363 設計がまずいからそんな事態になっちゃうんだろ。
データ部と表示部をまず完全に別にユニットに分けてみな。
ん?逆に関連が深いクラスなんだから同一ユニットで定義しても いいんじゃない?
368 :
デフォルトの名無しさん :2001/02/24(土) 00:50
あー、おれも、これのエレガントな解決法知りたいわ。まじでage
369 :
デフォルトの名無しさん :2001/02/24(土) 00:57
NichThread.pas作ってBoard2ch,Browserからusesする。 あるいはすべてひとつのunitにまとめる。 これしかねーぞ。 邪道な回答としては interface部ではTObjectとして保持して implementation部でusesしてキャスト。 あるいはどっちかのクラスをimplementation部で宣言する。
370 :
turbo type D :2001/02/24(土) 02:13
煽ってごめんね。
>>365 あおり煽られアオアオオオ
>>366 オレも今までそう思っていて
その通りなんですが。きびしいのよ。
なんでだろーなんでだろーーー
なぜがなんでだろーーー
現状は相互参照をやめて実装してる最中(モナカ)。
>>369 [ギャフン]
オブジェクト間通信を仲介するブローカー オブジェクトを作るとか。通信するオブジェクトが 1:nやn:mだったらこれがスマートだと思う。 1:1の限定された通信なら相互に参照を保持するのも いいと思うけど。
372 :
デフォルトの名無しさん :2001/02/25(日) 10:57
エディタをカスタマイズ可能なキーマッピング機能とか使ってる人いる? つーか、使い方わかる人いる?
373 :
turbo type D :2001/02/25(日) 15:43
>>372 日本で10人くらいならいると思う。(藁
オラはわからん。(ヘヘヘ.......シクシクシクシク
374 :
ななし :2001/02/25(日) 19:30
Delphi相談室スレのほうの116の質問がわかる方がいらっしゃったら 教えてください。(あちらのスレで) QuadrupleのDirectPlay機能での質問です。
スンマソンTechスレあげさせていただきやす。
http://piza.2ch.net/test/read.cgi?nofirst=true&st=142&to=142&bbs=tech&key=974446449 ここをみて
TWebBrowserをスクロールする方法はわかったのだけど
var
Doc: IHTMLDocument2;
y: Integer;
begin//
Doc :=
WebBrowser1.Document as IHTMLDocument2;
y := 100;
Doc.parentWindow.scroll(0, y);
スクロールしている現在の位置を取得する事が出来ない。
Doc :=
WebBrowser1.Document as IHTMLDocument2;
y := Doc.body.top;//<<ここでエラー
ShowMessage(IntToStr(y));
オセーテクレマンセ--
378 :
turbo type D@monazilla :2001/03/01(木) 13:02
さんくすこ。m(。w。)m オレ頭悪い事に前後みてなかったよ。 コード補完も出ないしね(ミグルシイイワケ) 関係無いけどリンク先 HTMLDocument := Browser.Document as IHTMLDocument2; ここで変数名にHTMLDocumentを使うと MSHTMLで定義されているからよろしくないね。
379 :
turbo type D@モナヂラドットオルグ(ワラ :2001/03/01(木) 13:11
つことで。 TWebBrowserをスクロールさせる方法 usesにMSHTMLユニットを追加 procedure TForm1.Button1Click(Sender: TObject); var Doc: IHTMLDocument2; y: Integer; begin Doc := WebBrowser1.Document as IHTMLDocument2; y:=olevariant(Doc).body.scrollTop; ShowMessage('現在のスクロール位置は'+ IntToStr(y)+'だぞ(゚Д゚)ゴルァ'+#13#10+ '勝手にスクロルさせるから覚悟しておけ'); y := y + 100; Doc.parentWindow.scroll(0, y); end; プレステ: クスコってあれだよね。アレを広げる道具の事だよね?銀色の? オシエテクレマン................ハズカシクテイエマセン
380 :
turbo type D@monazilla :2001/03/02(金) 16:46
おればっかでスソマセソ えっと、DOS日付でも作成日でも更新日でもなんでもいいのですが ファイルに日付情報をセットする方法と 同時にファイルを取得する方法を教えて欲しい。 いろいろ探したんだけどセットする方法がわからない。 何の種類の日付情報でもいいのだけど 書き込んだ内容を取得する事が出来るとよいのです。 よろしくお願いします。
スンマソン自己解決してしまった。
// ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄/ ̄
{
// 名前:turbo type
[email protected] (藁
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
聞いてアロエリーナ ちょっと言いにくいんだけど
聞いてアロエリーナ
ココカラノコードハ: ファイルの処理
SetFileDate ファイルに日付をセットする
GetFileDate ファイル日付を求める
GetFileSize ファイルサイズを求める
コウシン日ワ: 2001/03/02
ホカニ逝ットクコトハ:なにもなし
聞いてくれてありがと アロエリーナ♪
\________ _______/
|/
∧_∧
Ψ (∀・ )
□ (∩∩ノ)
// ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ }
procedure SetFileDate(FileName: String; DateTime: TDateTime);
var
FileHandle: Integer; FileDate: integer;
begin
FileHandle := FileOpen(FileName, fmOpenWrite);
if FileHandle > 0 then
FileDate := FileSetDate(FileHandle, DateTimeToFileDate(DateTime))
else
FileDate := -1;
FileClose(FileHandle);
if FileDate<>0 then
raise Exception.Create('ファイルに日付が書き込めなかったんじゃ(゚Д゚)ゴルァ');
end;
{ウエ(´Д`) homepage1.nifty.com/kens-hp/delphi.htm#Q03}
function GetFileDate(FileName: String): TDateTime;
var
FileHnd : integer;
intDosDate : integer;
datFileDate : TDateTime;
begin
FileHnd := 0;
Try
{ ファイルのハンドルを取得 }
FileHnd := FileOpen(FileName,fmOpenRead);
{ ファイルのタイムスタンプを取得 }
intDosDate := FileGetDate(FileHnd);
{ タイムスタンプを日付型に変換 }
datFileDate := FileDateToDateTime(intDosDate);
Result := datFileDate;
Finally
FileClose(FileHnd);
end;
end;
{ウエ(´Д`) homepage2.nifty.com\boheme\delphi\tips\tec0070.htm}
function GetFileSize(FileName: String): Integer;
var
Rec : TSearchRec;
intSize : integer;
begin
Result := 0;
{ ファイルの検索 }
if FindFirst(FileName, faAnyFile, Rec) = 0 then
begin
{ サイズの取得 }
intSize := Rec.Size;
{ KBに変換して表示 }
Result := intSize;
end;
FindClose(Rec);
end;
{ウエ(´Д`) homepage2.nifty.com\boheme\delphi\tips\tec0060.htm}
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
382 :
デフォルトの名無しさん :2001/03/06(火) 09:22
Memo1.Lines.Textを正規表現で検索することはできますか?
>>382 正規表現で検索するルーチンを自作するか、
もしくは、そういうライブラリを見つけてこれば可能。
というか、そういうコンポーネントがあるよ。
384 :
デフォルトの名無しさん :2001/03/06(火) 14:00
URLと簡単な使い方教えて。
386 :
デフォルトの名無しさん :2001/03/09(金) 08:21
Windows9x, 2000対応のインストーラを自作するハメになったのですが、 なにかよい資料はないでしょうか。 資料はWindowsのものであれば、言語はDelphi以外でもかまいません。 ちなみに、FDelphiを見ろ!は聞き飽きました(藁 (見れねーっての!!)
387 :
デフォルトの名無しさん :2001/03/09(金) 14:35
>>386 Delphiに付いてくるInstall Shield Express使えよ。素人が
インストーラ作ると迷惑なんだよ。
Win32Helpのファイルインストールライブラリ。
>>387 仕事なんじゃないの?
ま、そういう糞仕様は無視しましょう
390 :
デフォルトの名無しさん :2001/03/09(金) 21:20
delphiやるんならfdelphiは見られるようになっといたほうがいいぞ 仕事ならなおさらだ。
391 :
turbo type D :2001/03/09(金) 22:10
Delphiでのんびり働けるどこかいい場所ないですか?(藁 明日転職フェアに行こうかとオモイマフ
392 :
デフォルトの名無しさん :2001/03/09(金) 23:02
やめとけ、この時期にわざわざ転職フェアに参加してるって事は それなりに事情がある会社ってことだ。
393 :
某厨房作者 :2001/03/09(金) 23:49
オレにも紹介して。
394 :
デフォルトの名無しさん :2001/03/10(土) 11:53
OpenToolsをバリバリ活用してる人っている? GExpertsで間接的に、ってんじゃなくて。
395 :
turbo type D :2001/03/10(土) 17:07
寝坊した...鬱だし....
>>393 Delphiで就職なんて存在するかな?
397 :
デフォルトの名無しさん :2001/03/11(日) 04:16
CoolBar上のToolBarの位置をINIファイルに保存・復旧したいんだけど どのプロパティを使えばいいの?
398 :
デフォルトの名無しさん :2001/03/11(日) 04:30
dfmファイルをテキストで保存して覗けば分かるんじゃな〜い(やる気なし)
>>395 >Delphiで就職なんて存在するかな?
まれにあるよ。
俺はDelphi使いじゃないんで見送ってるが。
400 :
turbo type D :2001/03/11(日) 12:59
>>397 AboutDelphiミレ
>>399 紹介してよ。
つかBuilderでもいいけどね。
C++Builder指定で就職って大変だろうな。
今新しい職さがして面接いってるが 「前の会社ではDelphiとC++Builderで開発していた」っていったら Builderかよ顔されたよ…。 VisualC++使ったことないからなぁ…。
402 :
デフォルトの名無しさん :2001/03/12(月) 19:11
>>401 それはそれは。
ところでスレッドについて質問
TMyThread = class(TThread)
でコードは一切書かずに
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create(True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;
こんな事しただけで
メモリリークが1回起きるのだけど、何これ?
>>401 ゲーム系はなー。ビジネス系は存在さえ知らんと思われ。
>>402 FormDestroyが本当に呼ばれているかどうか怪しい。
404 :
402=turbo type D :2001/03/12(月) 19:38
>>403 メインフォームなので呼ばれているよ。
ブレイクするもの。
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create(False);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
FMyThread.Suspended := True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;
で、このようにするとメモリリークしない。
マルチスレッドコーディングムズすぎ。(゚Д゚)ゴルァ
簡単にスレッドがコーディングできるサンプルとか
コンポーネントとかない?
TThread.Destroyのヘルプで、 「説明 Destroy メソッドはスレッドに終了を通知し, スレッドがリターンするのを待ってから継承 Destroy メソッドを呼び出します。」って書いてあるけど スレッドが何か返すまで待ちぼうけしてるとか?
>>404 ホットゾヌで TThreadつかってみたけどリーク無しみたいです、
参考にならんかもしれませんが、いちよ、ほーれんそー。
408 :
デフォルトの名無しさん :2001/03/12(月) 23:52
キャストするのに 型(変数) と 変数 as 型 とどう違うのですか? そしてどちらが推奨されますか? 変数 as 型 はポインタ型だけみたいですけれど・・・。
409 :
デフォルトの名無しさん :2001/03/12(月) 23:54
TThread.Create.Free;でメモリリークするバグがある。 thread := TTread.Create; thread.Execute; thread.Free; のように一度Executeするとメモリリークしない
410 :
>408 :2001/03/13(火) 00:01
型(変数) は強制的にキャストする。 TForm(Buttom1).ShowModal のような無茶苦茶なことができる。 当然アクセス違反などのエラーが発生する。 (Sender as TForm).ShowModalはSenderが実際に TFormのインスタンスであった場合のみキャストできる。 TFormのインスタンスでない場合は例外が発生する。 以下のコードと大体同じ if Sender is TForm then TForm(Sender).ShowModal else raise Exception.Create('キャストエラー'); // いいかげん
411 :
408 :2001/03/13(火) 00:22
>410 ありがとー。 ということはできるだけ as を使ったほうが良いってことですね。 全部 as でできれば文句ないのですけれど・・・。
確かに処理が残ってるのにインスタンス勝手に 破棄されたらマズイかも。
413 :
turbo type D :2001/03/13(火) 09:42
>>409 サンクス。多分同じ問題
疑問が晴れました。
414 :
デフォルトの名無しさん :2001/03/13(火) 12:42
415 :
デフォルトの名無しさん :2001/03/13(火) 14:36
メモリリークって、どう確かめるのですか? (デストラクタが動いているかどうか?)
416 :
デフォルトの名無しさん :2001/03/13(火) 14:51
417 :
turbo type D :2001/03/13(火) 19:10
418 :
415 :2001/03/13(火) 19:25
>416, 417 ありがとうございます。 GetMemとFreeMemの呼び出された回数を利用しているんですね。 <ヒープの利用はすべてここに行き着くのか。
>>414 、紹介ありがと。
あんなところにそんな会社があるんだ。
でも、府内じゃなくて都内がいいな。(藁
420 :
turbo type D :2001/03/14(水) 11:02
TThread.Synchronizeでメソッドを使っているんだけど procedure of object;だけで引数付procedureが呼び出せなくて 結構不便。 procedure(AAA: String) of object; なんかをSynchronizeで渡すのによい方法はないでしょうか? 現状は begin FItem := xxx Synchronize(AAA); end; procedure AAA; begin BBB(FItem); end; こうしていて、少々不便なのです。
421 :
デフォルトの名無しさん :2001/03/14(水) 11:41
OnExecute, OnSynchronize, OnTermintateイベントと デッドロック->例外変換機能もってるTThreadラッパーコンポーネント持ってるよ。 発掘できたらあげるよ。
422 :
> :2001/03/15(木) 17:54
アゲ
424 :
turbo type D :2001/03/17(土) 18:54
リンク先に >TThreadに存在するWaitForメソッドやSuspend,Resumeメソッドはこのコンポーネントではわざと実装しませんでした。 >これらは扱いを間違えるとメモリリークが発生したりデッドロックを引き起こしたりと多少危険な面があるからです。 とありますね、実感するわ。 シンクロナイズと逆に メインスレッドから自作スレッド側の オブジェクトや変数にアクセスするときは 一度Suspendしてアクセスすればいいみたい。 なんとなくそんな気がする。
425 :
Delphiをもってない人 :2001/03/17(土) 23:25
何か思うんだけど Suspend,Resumeってスレッドを強制的に一時停止するんでしょ? それって見るからにすごく危険な香りが。 そもそもSuspendやResumeをしなくてすむように書くべきだと思うんだけど… ………あるんだからしかたないけどね。 WaitForはスレッドが終了するまで待つの? それはないと困ると思う。
426 :
>425 :2001/03/18(日) 00:33
suspend, resumeはWin32APIの単なるラッパー。 たとえばダウンロード・検索を 一時停止・再開するときなんかに普通に使うよ。 で、停止中にアプリを終了したときに どうするかはアプリの責任。 ここではまるのはアプリの設計がいいかげんなだけ。 状態遷移図でも書いて、前もってあらゆるケースを洗い出しておけば、 バグもでにくくなるよ。
あってもいいと思うけど、独自コンポ作るなら Suspended系はオレならユーザー側からは触れないようにしたい。 挙動が嫌すぎる。 ま、一時停止/再開には有用なのはわかるけど、初心者向けではない かと。
428 :
turbo type D :2001/03/18(日) 22:53
すんまそん、質問っす。 monazillaスレと重なりまくりですが、とりあえず質問はここで してみるですわ。 WinInetでタイムアウトとか ユーザーによるダイヤルアップ切断が行われた場合どうなるでしょうか? よくわからないので対応してないんですが、やばい?
429 :
>428 :2001/03/19(月) 00:57
(ダウンロード)ライブラリが例外を投げるようにするのは絶対に必要。 例外投げる(=現在の処理を強制中断)のをサボると、 最悪の場合、処理が成功したようになって別のバグを誘発する。 例外を処理するのはアプリケーションの責任なんだけど、 仮にアプリが処理を手抜きしてもユーザーに通知されるので、 ユーザーがリトライor終了できる。 サブスレッドが例外投げるとどうなるのか知らないけど。 もしメインスレッドでその例外を補足できないとしたら、 synchronize+エラーイベントにするといいかも。
430 :
turbo type D :2001/03/19(月) 01:31
いや、必要なのはわかってるんですが さぼってしまっていたので どうなってしまうのかが知りたいのです。 例外発生せずに止まるのだろうか?>>WinInet. それを補足するのは面倒だなあ...
431 :
デフォルトの名無しさん :2001/03/20(火) 01:16
alLeftとalBottomのパネルを組み合わせると必ず □□ □□ □□ ■■■■■ ■■■■■ となってしまうんだけど □□ □□ □□■■■ □□■■■ のようにalLeftが優先(?)されるようにはできない?
432 :
デフォルトの名無しさん :2001/03/20(火) 02:19
私の場合、パネルを3枚使って解決してます。 左のパネルを、alLeft 右のパネルを、alClient 右のパネルに、更にパネルを置いて、alBottom
×右のパネルに ○右のパネルの上に
434 :
turbo type D :2001/03/20(火) 15:23
Cマガで中村さんが解説していたと思う。
>でも、府内じゃなくて都内がいいな。(藁 うちの会社に来てもらいたいマジで>Delphi使い 土日休日無しで、こんな時間でも働ける(働かされる)環境ですが(泣)
436 :
デフォルトの名無しさん :2001/03/21(水) 09:18
そういやGExpertsって使ってる人いる? 俺は関数ジャンプとIDEのショートカット変更のためだけに使ってるけど(藁
437 :
turbo type D :2001/03/21(水) 10:11
>>436 話題になっていたので入れたけど
何が便利なのかがわからなくて放置してる。GExp
438 :
turbo type D :2001/03/21(水) 10:14
>>435 ・・・・・・・・・・・・・(・∀・;)週休二日は欲しいな.........
439 :
turbo type D :2001/03/21(水) 12:39
monazilla作ってます。 んで、質問です。 WebBrowserでスクロールバー位置を取得変更する事は可能なのですが どのタイミングで取得するとよいと思います? 俺的にはタイマーで取得したろうかと、ショボイ事しか思いつきません。 なんか、スクロールした時点で発生するイベントなどありますか? よろしくぅ。
440 :
ヒロユキ@ギコナビ :2001/03/21(水) 23:25
ギコナビっていうソフト作ってます。 質問です。 Delphi5でクールバー使ってるんだけど、TCoolBandのFixedをTrueにすると、 おかしな動作になります。 # TCoolBarにツールバー2つ、TAnime1つを乗せてます。 # んで、TAnimeの乗っているTCoolBandのFixedをTrueにしてます。 # Fixedが一つもないと正常なのですが・・・ おかしな動作って言うのは、ツールバーが乗っているTCoolBandのつまみを 捕まえたまま、上下に激しく動かすとTCoolBarのサイズが正常に変わらなくなります。 (CoolBarを一列にしても高さが2列分ある。描画がおかしくなる。) コモンコントロールのバグなのか、Delphiのバグなのか、オレの頭がおかしいのかが 分からないので、みなさん、試してみてもらえないでしょうか? DelphiのDemoについてくるCoolstufっていうブラウザでも再現します。 #エクスプローラで問題ないからVCLのバグかなぁ。 当方環境: Delphi5 + Update Windows2000pro CommonControlVersion: 5.81.4522.1800
441 :
turbo type D :2001/03/22(木) 13:53
>>DelphiのDemoについてくるCoolstufっていうブラウザでも再現します
オレのところでもなるよ
2台のマシンで両方とも再現した。
>>440 バグだろうね。
442 :
デフォルトの名無しさん :2001/03/22(木) 16:41
>>440 バグです。
D4でもD5でもなります。
D4の時にバグを回避するためだけのコンポを作ったのですが、詳細を全く思い出せません(w
たしか、Fixedが絡むとBreakの数を誤判定するようになってたような気がします。
重要な変数がPrivateに隠されてたので、ちと邪魔くさい回避法を取ったことだけは覚えてる。
443 :
turbo type D :2001/03/22(木) 18:37
左右のリサイズしたら直りますよね。
444 :
turbo type D :2001/03/22(木) 18:52
445 :
デフォルトの名無しさん :2001/03/22(木) 19:26
>>444 じゃあ適当に書いてみる。やったことないので空想。
でも、Delphi知らないのでDelphiに
PreTranslateMessageがあるかしらないが、あるなら、
その中で、
WM_LBUTTONUP
WM_MOUSEWHEEL
WM_KEYDOWN
その他、スクロールさせられそうなメッセージが飛んできた
ときにスクロール位置を保存する。てなかん字。
446 :
デフォルトの名無しさん :2001/03/22(木) 20:52
>>444 -445
WM_MOUSEWHEELも来るナリ。
PreTranslateMessageってなに?
447 :
デフォルトの名無しさん :2001/03/22(木) 20:54
>>441 -443
VCLのバグだったのですね。
たしかに、リサイズでOK。
Delphi6に期待しよう。
リサイズ時のVCLを追ってみたけど 解決できなかったよ(゚∀゚)ゴルァ だらかMLに情報を流してくれ。
449 :
コロスケD :2001/03/23(金) 10:47
>>445 -446
PreTranslateMessage
コロスケもわからないなりー
messageは忘れてたナリ、ありがと。
450 :
デフォルトの名無しさん :2001/03/23(金) 12:38
>>447 こんなところに書いても誰もチェックしないよ。ML に流してもだめ。
日本語でいいから、US borland のバグ登録フォームに流しなさい。
451 :
デフォルトの名無しさん :2001/03/23(金) 14:38
この程度ならMLで解決してくれるだろ、
452 :
デフォルトの名無しさん :2001/03/23(金) 16:40
>>446 >>449 PreTranslateMessageはMFCのCWndのメンバ関数。
Win32のイベント配送メカニズムと、MFC固有ののイベント配送メカニズム
を分離して理解してないので、他の言語でいうとどうなるのかは知らん。
働きとしては、そのウインドウとその子ウインドウへのイベントディスパッチ
をするまえにいろいろ前処理する/できる。
でも、PreTranslateMessageとかOnKeyDownとかはMFCのイベントマッパ
の機能っぽいから、DelphiにはDelphiのイベント配送補助システムが
あるんだろう。
453 :
turbo type D :2001/03/23(金) 20:10
>>452 さんサンクス
2chブラウザさんかな。
PreTranslateMessageはないけど
メッセージハンドラでフックしてみたら
全然取得できませんでした。
ホイールメッセージが
スクロール限界まで来たときにようやくはっせいする
VCLのTWebBrowser継承のメッセージハンドラではダメなのか...
サブクラス化でもしないと...
空想して実装したいなあ。
あと、WebBrowserでナビゲートした直後にスクロールバーを
動作させようと思ってもこれまたうまく動かない。
トホホホオホホホホオホオホホ
454 :
turbo type D :2001/03/23(金) 20:27
もうだめだ、だめだよう。ぐすんぐすん(・∀・、)
あきらめるのは、まだ早い。
456 :
デフォルトの名無しさん :2001/03/24(土) 21:54
スクロールした時点じゃなくて、 次のファイルを Navigateする直前に保存するのはだめ?
457 :
turbo type D :2001/03/24(土) 23:55
>>456 あ、それもらい!
スクロール位置を保存するのはそうするとして
復帰するほうなんだけど、んー。
とりあえず、Navigateが終わって即スクロールかましても動作しない!
458 :
turbo type D :2001/03/26(月) 13:27
日曜日に何の反応も無しかよ。
459 :
turbo type D :2001/03/26(月) 13:32
別の質問しておきます。 TWebBrowserの履歴をGoBackせずに URLを取得する方法はどうやるのでしょう。 IEなんかだと数段階戻るという事が実現できているので 出来そうなもんだが、やり方はさっぱり。 あと、履歴と関連づいたデータのポインタを保持させる事は 出来ないでしょうか。 履歴に関連したスレッドの情報を 保持させたいのだけど どうも自分でコーディングしていたらバグでまくりなので WebBrowser自体に処理を任せたいのです。
460 :
デフォルトの名無しさん :2001/03/26(月) 15:35
>459 セキュリティーの関係で取り出せないと聞いた事がある かちゅの作者も使ってるEmbeddedWbも多分自前で管理してると思う。
461 :
turbo type D :2001/03/26(月) 16:47
>>460 さんきゅう。そうか自前でやるとどうしてもバグがでる。
ちゃんとメッセージが流れてきてくれていたらいいのだが...
462 :
turbo type D :2001/03/26(月) 16:55
>>457 のこと、
サンプルを作ってみた。
function TForm1.GetWebBrowserScrollPos: TPoint;
var
Doc: IHTMLDocument2;
begin
Doc := WebBrowser1.Document as IHTMLDocument2;
Result.y:=olevariant(Doc).body.scrollTop;
Result.x:=olevariant(Doc).body.scrollLeft;
end;
procedure TForm1.SetWebBrowserScrollPos(Value: TPoint);
var
Doc: IHTMLDocument2;
begin
Doc := WebBrowser1.Document as IHTMLDocument2;
Doc.parentWindow.scroll(Value.x, Value.y);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Point1: TPoint;
begin
Point1 := GetWebBrowserScrollPos;
Form1.Left:= Point1.x;
Form1.Top := Point1.y;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetWebBrowserScrollPos(Point(Form1.Left, Form1.Top));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
WebBrowser1.Navigate('www.yahoo.co.jp');
// while WebBrowser1.Busy do Application.ProcessMessages;
Button2Click(nil);
end;
ボタン3を押してもうまく動かない。
コメントアウトしている部分を追加しても実行していると変。
navigate後に正しくスクロール位置を復帰させるには
どうしたらいいでしょうか。
ちゃんとスクロールしてくれない。
スマソ、字下げ忘れと uses MSHTMLも追加してください。D5pro以上です。
464 :
turbo type D :2001/03/26(月) 17:27
あと、話が先頭に戻るのですが リファレンスカウンタについて もう少し教えてください、誰か。 TInterfacedObjectの使い方も今ひとつわかりません。
465 :
デフォルトの名無しさん :2001/03/26(月) 17:53
>>458 >>457 じゃ、書いてみる。
ひょっとしたらNavigateした後、次のステートメントでスクロールしてないか?
Navigateは非同期動作なので、別スレッドを起動してすぐに関数から
戻ってくるけど、動作が完了するのはその後、OnNavigateCompleteイベント
が発生したとき。なので、NavigateCompleteを受けて関数呼ぶとよろし。
OnDocumentCompleteでもOK。違いはよく知らん。
466 :
turbo type D :2001/03/26(月) 18:11
for i:=1 to 200くらい do 感謝!!; ありがとーー。 OnNavigateComplete2 とOnDownloadComplete とっきどき誤動作しているみたいだけど とりあえず、これでやってみるよ。
467 :
turbo type D :2001/03/27(火) 15:27
今日はガンガンいくぜ。 つーことで シツモソです。教えてくださいマソコ WinInetのページをぐるっとまわって どこかで見たので改善したつもりだけど自信ないです。 どちらが正しいのでしょうか。 hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try hService := InternetOpenUrl( hSession, PChar(URL), nil, 0, 0, 0); try //適当に処理 finally InternetCloseHandle( hService ); end; finally InternetCloseHandle( hSession ); end; と hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned( hSession ) then begin hService := InternetOpenUrl( hSession, PChar(Edit1.Text), nil, 0, 0, 0); if Assigned( hService ) then begin //適当に処理 end; InternetCloseHandle( hService ); end; InternetCloseHandle( hSession ); end;
468 :
デフォルトの名無しさん :2001/03/27(火) 15:54
WinInetはDelphiの関数じゃないから例外は投げないでしょ。 よって後者が正しいはず。
469 :
turbo type D :2001/03/27(火) 16:04
明解回答ありがとう、サンクスコ hSessionにnilが入っていてもInt..OpenUrlしてしまうし 例外吐かずにまずいッてことですね。
470 :
デフォルトの名無しさん :2001/03/28(水) 14:38
>あーぁ…こんな俺でもいつか好きになってくれる女が出来るのかなー?
出来ません。妄想に浸るなボケ
>>59
472 :
turbo type D :2001/03/28(水) 17:45
リファレンスカウンタオブジェクトクラスを適当に作ってみたのですが どうも動作しません。 自分自身を破棄する部分で 自分自身をnilにするのはどうしたらよいでしょうか。 procedure TRefObject.DecRefCounter; で、Self:=nil を行なっているのですが これが正常に動作しないために if Assigned(FRefObject1) then で正しく判断されません。 FreeAndNilやFRefObject1<>nilとしてもダメみたい。 違う方法でnilにも出来るけど、ちょっと気になったので。 教えてくださいな。 /////////////////////////////////////// unit Unit2; interface uses Sysutils, Dialogs; type TRefObject = class(TObject) private FRefCounter: Integer; public constructor Create; procedure IncRefCounter; procedure DecRefCounter; end; TMyRefObject = class(TRefObject) public Name: String; procedure Message(S: String); end; implementation { TRefObject } constructor TRefObject.Create; begin FRefCounter := 0; end; procedure TRefObject.DecRefCounter; begin Dec(FRefCounter); if FRefCounter<=0 then begin Self.Free; Self := nil; end; end; procedure TRefObject.IncRefCounter; begin Inc(FRefCounter); end; { TMyRefObject } procedure TMyRefObject.Message(S: String); begin ShowMessage(S); end; end. ////////////////////////////////////////////// //------------------------------- procedure TForm1.Button2Click(Sender: TObject); begin FRefObject1 := TMyRefObject.Create; FRefObject1.Name := 'リファレンスカウンタオブジェクト'; end; procedure TForm1.Button3Click(Sender: TObject); begin FRefObject1.IncRefCounter; FRefObject1.Message('あ'); end; procedure TForm1.Button5Click(Sender: TObject); begin FRefObject1.DecRefCounter; end; procedure TForm1.Button7Click(Sender: TObject); begin if Assigned(FRefObject1) then begin Self.Caption := FRefObject1.Name; TButton(Sender).Caption := '定義されてるよ' end else begin TButton(Sender).Caption := '定義されてない'; end; end;
473 :
デフォルトの名無しさん :2001/03/28(水) 17:50
>472 IUnknown使えば?
>自分自身をnilにするのは むりなんじゃあ?DecRefAndNilみたいな手続き作るとか。
475 :
turbo type D :2001/03/28(水) 18:52
>>473 このスレの先頭で出てるインターフェースの実装は
仕組みがいまいちわからなかったので使うの止めておきました。
>>474 かなり試したけど無理だったみたい。(藁
で、関数にしたところでクラス変数をvar渡ししないといけないので
二つのアプローチがあると思うが、どっちがいいと思います?
以下みてください。
長文ごめんよ。オレは2系列の方、FreeAndNilの実装と同じ方が
よいと思っているんですが。
unit Unit2;
interface
type
TRefObject = class(TObject)
private
FRefCounter: Integer;
public
constructor Create; virtual;
property RefCounter: Integer read FRefCounter;
end;
TRefClass = class of TRefObject;
procedure DecRefCounter1(var RefObj: TRefObject);
procedure DecRefCounter2(var RefObj);
procedure IncRefCounter1(var RefObj: TRefObject; RefClass: TRefClass);
procedure IncRefCounter2(var RefObj; RefClass: TRefClass);
procedure FreeRefObject1(var RefObj: TRefObject);
procedure FreeRefObject2(var RefObj);
(*--▽---------------------------▼--
var
FRefObject1: TMyRefObject;
1系列の使い方
IncRefCounter1(TRefObject(FRefObject1), TMyRefObject);
DecRefCounter1(TRefObject(FRefObject1));
FreeRefObject1(TRefObject(FRefObject1));
キャストが必要
2系列の使い方
IncRefCounter2(FRefObject1, TMyRefObject);
DecRefCounter2(FRefObject1);
FreeRefObject2(FRefObject1);
キャストは不要
//--▲---------------------------△--*)
implementation
procedure IncRefCounter1(var RefObj: TRefObject; RefClass: TRefClass);
begin
if RefObj=nil then
begin
RefObj := RefClass.Create;
end;
Inc(RefObj.FRefCounter);
end;
procedure IncRefCounter2(var RefObj; RefClass: TRefClass);
begin
if TRefObject(RefObj)=nil then
begin
TRefObject(RefObj) := RefClass.Create;
end;
Inc(TRefObject(RefObj).FRefCounter);
end;
procedure DecRefCounter1(var RefObj: TRefObject);
begin
if RefObj=nil then Exit;
Dec(RefObj.FRefCounter);
if RefObj.FRefCounter<=0 then
begin
RefObj.Free;
RefObj := nil;
end;
end;
procedure DecRefCounter2(var RefObj);
begin
if TRefObject(RefObj)=nil then Exit;
Dec(TRefObject(RefObj).FRefCounter);
if TRefObject(RefObj).FRefCounter<=0 then
begin
TRefObject(RefObj).Free;
TRefObject(RefObj) := nil;
end;
end;
procedure FreeRefObject1(var RefObj: TRefObject);
begin
while Assigned(RefObj) do
DecRefCounter1(RefObj);
end;
procedure FreeRefObject2(var RefObj);
begin
while TRefObject(RefObj)<>nil do
DecRefCounter2(RefObj);
end;
{ TRefObject }
constructor TRefObject.Create;
begin
FRefCounter := 0;
end;
end.
2でいいんじゃないでしょうか。 ダイナミックキャストの方がいいのかも知れませんが。
ダイナミックキャストってBCBの機能じゃ??
そのとおりハズカシ、、、asの事でした。
479 :
turbo type D :2001/03/29(木) 11:37
もし、2だと、TRefObject派生じゃないクラスを入れたら えらいことになるんだけど... その辺の防御とかどうやってやるのか、突っ込んでホシィ でも、誰もリファレンスカウンタとか興味ない? 宇津田氏のう...
String系を例にすると、(皆そうなっていると思うけど)データ構造は class String { StringRef *ref; } class StringRef { int counter; StringData *data; } class StringData { char *str; }; が一般的だと思う。そのまま書けば、こんな感じ。(試してないけど) class StringData { char *str; public: StringData(const char *s): str(new char[strlen(s)+1]) { strcpy(str, s); } ~StringData() { delete[] str; } }; class StringRef { int counter; StringData *data; public: StringRef(const char *s): counter(0), data(new StringData(s)) {} ~StringRef() { delete data; } void IncRef() { ++counter; } void DecRef() { if (--counter < 0) delete this; } //delete出来なければ、String中で } class String { StringRef *ref; public: String(const char *s): ref(new StringRef(s)) {} String(const String& rhs) { ref->IncRef(); } //Assign ~String() { ref->DecRef(); } const char *c_str() { return ref->data->str; } } この形をベースにして、 ・メモリ上でStringDataとStringData.strをつなげる =構造体の最後のサイズ0のメンバ(char str[0])に持たせる ・メモリ上でStringRefとStringDataをつなげる =StringにDataを持たせ、Ref参照を*((StringRef *)Data-1)にする。 等の工夫をしているはず。 (この両方を実装すれば、c_str()は、ただのchar *と同じコストになる) Accessor(String)と実体(StringData)以外の カウンタ管理クラス(StringRef)自体は汎用性がある。 でも、実際に汎用性を持たせる(色々なxxxDataを扱う)ためには templateか多重継承(両方かも)が必須になる気がする。
481 :
turbo type D :2001/03/29(木) 17:07
む、、、むずかしいです。 話が見えない....理解ロクなくてスマソ
482 :
デフォルトの名無しさん :2001/03/29(木) 20:50
>>480 MoreEffectiveC++に、汎用リファレンスカウンタの
はなしが長々と載ってるよん。
483 :
turbo type D :2001/03/30(金) 11:25
戻り値で返すこんな方法も考えました。 これの使い方はこんな感じ。 FRefObject1 := TMyRefObject( IncRefCounter(FRefObject1, TMyRefObject) ); FRefObject1 := TMyRefObject( DecRefCounter(FRefObject1) ); FRefObject1 := TMyRefObject( FreeRefObject(FRefObject1) ); しかし、これも、邪魔なキャストばかり。 もっとエレガントな書き方がしたいのですが テンプレートの使えないDelphiではしかたないのか... type TRefObject = class(TObject) private FRefCounter: Integer; public constructor Create; virtual; property RefCounter: Integer read FRefCounter; end; TRefClass = class of TRefObject; function IncRefCounter(RefObj: TRefObject; RefClass: TRefClass): TRefObject; function DecRefCounter(RefObj: TRefObject): TRefObject; function FreeRefObject(RefObj: TRefObject): TRefObject; implementation function IncRefCounter(RefObj: TRefObject; RefClass: TRefClass): TRefObject; begin Result := RefObj; if RefObj=nil then begin Result := RefClass.Create; end; Inc(Result.FRefCounter); end; function DecRefCounter(RefObj: TRefObject): TRefObject; begin Result := RefObj; if RefObj=nil then Exit; Dec(Result.FRefCounter); if Result.FRefCounter<=0 then begin Result.Free; Result := nil; end; end; function FreeRefObject(RefObj: TRefObject): TRefObject; begin Result := RefObj; while Result<>nil do Result := DecRefCounter(Result); end;
484 :
turbo type D :2001/03/30(金) 11:27
FreeAndNilなんかみていても感じるけど オブジェクトのvar渡しだけ特殊な処理してくれてもいいのにな。 例えば上位クラスにキャストして扱ってくれるとか。 オレがしらないだけでやり方があるの? FreeAndNilのHELP 警告 Obj が TObject またはその下位オブジェクトの インスタンスでない場合は, Obj に値を渡さないようにしてください。 とあるが、これを言語レベルで警告や禁止する方法は必要だろうに。
485 :
デフォルトの名無しさん :2001/03/30(金) 12:13
>>484 少し考えれば駄目だって分かるよね?
procedure CreateObj(var Obj: TObject);
begin
Obj := TObject.Create;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Obj: TObject;
Comp: TComponent;
begin
CreateObj(Obj); // これはコンパイル出来て当然として
CreateObj(Comp); // これはコンパイル通っちゃあかんだろ。
end;
で下のように書き換えるのはどうよ? 戻り値がPointer型だから
型チェックは出来ないけど。
interface
function IncRefCounter(RefObj: TRefObject): Pointer;
function DecRefCounter(RefObj: TRefObject): Pointer;
function FreeRefObject(RefObj: TRefObject): Pointer;
implementation
function IncRefCounter(RefObj: TRefObject): Pointer;
begin
InterlockedIncrement(RefObj.FRefCount);
Result := RefObj;
end;
function DecRefCounter(RefObj: TRefObject): Pointer;
begin
Result := nil;
if (RefObj<>nil) and (InterlockedDecrement(RefObj.FRefCount)<=0) then
RefObj.Free;
end;
function FreeRefObject(RefObj: TRefObject): Pointer;
begin
Result := nil;
RefObj.Free;
end;
んー、まだわかりませんです。 んじゃ、これは通っちゃってもいいのかな? 通るけど。 procedure CreateObj(Obj: TObject); begin Obj := TObject.Create; end; procedure TForm1.Button2Click(Sender: TObject); var Obj: TObject; Comp: TComponent; begin CreateObj(Obj); CreateObj(Comp); end;
487 :
turbo type D :2001/03/30(金) 13:07
なぜかsageてしまったのでage
Pointerもいいんですが、
>>475 に上げた
procedure IncRefCounter1(var RefObj: TRefObject; RefClass: TRefClass);
procedure DecRefCounter1(var RefObj: TRefObject);
がキャストの厳しい言語として
あるべき姿なのかなあと、考えなおし初めてます。
だって、
procedure IncRefCounter2(var RefObj; RefClass: TRefClass);
procedure DecRefCounter2(var RefObj);
こっちだと、TRefObject派生じゃないものを
渡した時にどうしてもAccessバイオが出るし..
こういう実装は痛い気がする。
procedure IncRefCounter(var RefObj; RefClass: TRefClass);
var
Object1: TObject;
begin
try
if TRefObject(RefObj)=nil then
begin
TRefObject(RefObj) := RefClass.Create;
end;
Inc(TRefObject(RefObj).FRefCounter);
except
on EAccessViolation do
raise EConvertError.Create('リファレンスカウンタクラスではありません');
end;
end;
procedure DecRefCounter(var RefObj);
begin
try
if TRefObject(RefObj)=nil then Exit;
Dec(TRefObject(RefObj).FRefCounter);
if TRefObject(RefObj).FRefCounter<=0 then
begin
TRefObject(RefObj).Free;
TRefObject(RefObj) := nil;
end;
except
on EAccessViolation do
raise EConvertError.Create('リファレンスカウンタクラスではありません');
end;
end;
>Accessバイオ いい響きだ
レ--ス--それだけーーか--よーーー(TwT
490 :
( ゚Д゚) :2001/03/30(金) 18:50
みんな、よく知っているなぁ・・・。うらやましい。
文法よく知らんが、なんとか解読してくれ。 type TDataObject = class(TObject) public Name: String; procedure Message(S: String); end; TRefObject = class(TObject) private FRefCounter: Integer; FDataObject: TDataObject; procedure IncRefCounter; procedure DecRefCounter; public function Getter: TDataObject; end; TMyObject = class(TObject) private FRefObject: TRefObject; public procedure Message(S: String); property property Item: TDataObject read FRefObject.Getter; end; MyInstance1 ┐ MyInstance2 ┼──→ RefInstance ──→ DataInstance MyInstance3 ┘ この形にするのが基本。 TDataObjectをTRefObjectから派生させるなら、FDataObjectをnilには出来ない。 →カウンタを見てGetterがnilを返すしかない。
追加。 MyInstanceは常に(有効な)RefInstanceを持つ。 Refが持つDataはnil(無効)である場合もある。
493 :
turbo type D :2001/04/01(日) 14:54
遅くなってスンマソ。
土日はなにやら忙しいです。
で、
>>491 で示されている方式が一般的にC++などで実装されている
リファレンスカウンタの仕組みなんでしょうか。
TDataObjectの生成/破棄などを
対になるTRefObjectのGetterを使って行えばいい?
そうすればTDataObject部分がどんなデータ構造でも
リファレンスカウンタの機能を付随させることが
できるわけか。
レスありがとう。勉強になりました。
サンプルを作って遊んでみるかな。
494 :
デフォルトの名無しさん :2001/04/02(月) 01:37
Win2k+Delphi5です。 イースターエッグでOSごと固まりました。 Win2kが行方不明になったのこれが初めてで、ちとびっくり。 他の人はどうかな?
おお、そうですか。安心しました。 BorlandはWin2k対応パッチ(+ライブラリ)なんて これっぽっちも考えてないんだろうな。。(やれやれ
497 :
turbo type D :2001/04/03(火) 19:52
498 :
デフォルトの名無しさん :2001/04/03(火) 19:52
ディレクトリを監視して、そのディレクトリ内のファイルが 変更されたら通知するAPIなかったっけ?
499 :
turbo type D :2001/04/03(火) 20:06
FindFirstChangeNotification のへん? Delphi広場へどぞ
500 :
turbo type D :2001/04/03(火) 20:09
502 :
デフォルトの名無しさん :2001/04/04(水) 04:23
データベースを作りたいんだけど、どうやってつくるの〜?
503 :
デフォルトの名無しさん :2001/04/04(水) 04:38
>>502 MS-Excelを買ってきて、データをせっせと打ち込みましょう。
終わってみれば、ほら、「データベース」が完成してます。
それだけでは不満ですか?、さて、何が不満なのでしょう?
Delphi以外の問題は、他のスレッドでお願いしたいです。
プログラム以外の問題は、他の板でお願いしたいです。
>>503 針に餌が付いてないから、誰も食いつかないと思いますです。
505 :
turbo type D :2001/04/04(水) 07:34
>>seven 朝早いのに、厨房駆逐ありがと(w
506 :
>502 :2001/04/04(水) 09:45
Delphiでデータベース作るならBDEを使う。 でもlearningには付いてないよ。
507 :
turbo type D :2001/04/04(水) 10:44
TWebBrowserのリンク先に対してポップアップHintが表示される もっとも簡単なサンプルを誰かおせーて!キボーン ホットゾヌブラウザのソースで procedure TForm1.WebBrowser1StatusTextChange(Sender: TObject; const Text: WideString); を見てもわかんない、 。°°(≧w≦)°°。
508 :
デフォルトの名無しさん :2001/04/04(水) 10:48
Textが'#'+数値の形式かどうかで判断するんじゃだめなの?
>>502 CREATE DATABASE DB名;
510 :
turbo type D :2001/04/04(水) 19:29
そもそも、'ヒントだよ'
という文字列をヒント表示する方法がわかんないのです、
>>508
511 :
デフォルトの名無しさん :2001/04/04(水) 20:01
StayOnTopなフォームにヒント描いて マウスカーソルの左上に座標セットして Showするだけじゃん。
まじ?、hintWindowを継承したと思うが...
513 :
ヒロユキ@ギコナビ :2001/04/05(木) 00:03
>>512 var
p: TPoint;
ARect: TRect;
begin
FHint := THintWindow.Create(Self);
GetCursorpos(p);
p.x := p.x + 15; //なんとなく調整
p.y := p.y + 15;
ARect := FHint.CalcHintRect(Screen.Width, s, nil);
Rect.Top := ARect.Top + p.y; //なんかwinapiあったような…
ARect.Left := ARect.Left + p.x; //なかったっけ?Rectを一回で変更するやつ。
ARect.Bottom := ARect.Bottom + p.y;
ARect.Right := ARect.Right + p.x;
FHint.ActivateHint(ARect, 'ヒンート');
end;
あと、どっかに宣言。
FHint: THintWindow;
514 :
Dax :2001/04/05(木) 00:09
>>507 えっと、ホットゾヌブラウザはギコナビぱくりました!
やり方は
>>513 ヒロユキ@ギコナビ氏が書いたとおりです。
ただ、ホットゾヌブラウザではタイトルの部分を着色するために
THintWindowをわざわざ継承して Paintメソッドをオーバーライドしてます。
ただヒントを出すだけなら継承せんでよかですよ。
>>504 のばーじょんあっぷ版(前のはDelphi対応ではないという蟲があったため)
FormにStringGridを貼りつけて実行し、データをせっせと打ち込みましょう。
終わってみれば、ほら、「データベース」が完成してます。
それだけでは不満ですか?、さて、何が不満なのでしょう?
Delphi以外の問題は、他のスレッドでお願いしたいです。
プログラム以外の問題は、他の板でお願いしたいです。
516 :
ああもう下がりすぎ〜 :2001/04/16(月) 10:24
原水さんDelphi Users Groupのページどこいったのよ〜。 もう勝手に名乗っといて勝手に消さないでくれる?
517 :
デフォルトの名無しさん :2001/04/16(月) 10:36
519 :
デフォルトの名無しさん :2001/04/16(月) 12:45
521 :
デフォルトの名無しさん :2001/04/18(水) 19:32
質問ですが、エクスプローラで右ボタンでドラッグして適当な場所で ボタンを離すと ---------------------- ここにコピー ここに移動 ショートカットをここに作成 ---------------------- キャンセル ---------------------- というメニューがでてきますが、これは何らかの方法で自分のアプリ でもAPI等を使って表示&処理させられるものなのでしょうか? それとも自分で自アプリ上でマウスボタンが離されたらそういう メニューをだすようにゴリゴリ書くべきものなのでしょうか? (あ、Delphiとはあまり関係なかった…)
522 :
デフォルトの名無しさん :2001/04/18(水) 20:15
523 :
デフォルトの名無しさん :2001/04/18(水) 21:29
>>522 レスどうもです。
実はDrag and Drop Component Suite使ってるのです。
でも上記のメニューがでないんだよなぁ。うーむ。
今色々探してますけど、OLEでごりごりやればだせそうな…。
もうちょっと修行してきます!
おぉ、今気がついたけどDrag and Drop Component Suiteのページの 下によさげな参考リンクがいくつか。。。 早速修行します。
525 :
turbo type D :2001/04/20(金) 11:44
ようやく時間がとれた。。。疲れすぎ。 質問します。 AssignFileの使い方 try〜finally end の使い方が今ひとつはっきりしません。 AssignFile(datF, FNAME); rewrite(datF, 1); try blockWrite(datF, varA, sizeof(varA)); blockWrite(datF, varB, sizeof(varB)); finally CloseFile(datF); end; これがいいのか、 AssignFileとrewriteなどもtry〜finally間に 入れた方がいいのかって事です。 monaUtils見てて気になったです。 よろしくおねがいします。
526 :
turbo type D :2001/04/20(金) 11:45
また違う質問で、教えてください。 ファイルのエラーが出た場合 例えば、ファイルが存在してなかったりする場合 どんな例外を発生させればいいのでしょう。 そもそも、何かの例外が出るという場合 何の例外を発生させるべきかという事が 全くわからないのですが、 例外コード一覧などという資料がどこかにありますか? DateTimeToStringみたいなのを 自作したときに期待値以外のパラメータがきた場合 どんな例外を作成すればいいのかな。
まあ、きびしい。
Sysutils ユニットに載っているのが 例外のすべてなのですか?
530 :
デフォルトの名無しさん :2001/04/20(金) 13:04
「コード一覧」なんて寒い概念から 例外を救ったのが、例外クラスというやつだと思う。 コードってのは番号とかのことだと推察するけど、 番号だと「似た/似てない例外」ってのを 把握するのがめちゃめちゃ面倒なんだな。 その点、例外の種類をクラス使って分類するようにすると、 継承ツリーに「似た例外」を当てはめれば良くなる。 すっきり。 つーわけで答え。 クラスツリーブラウザ(ご免正式名称忘れた)で Exceptionクラスだかの下を一通り眺めろ。以上。 あとクラスだから当然、自作もなんぼでも可能ね。 これがコード(番号)だと、既存番号体系と矛盾せずに 新しい番号を付け加えるのが一苦労なんだよな。 例外クラスまんせー
>クラスツリーブラウザ(ご免正式名称忘れた)で >Exceptionクラスだかの下を一通り眺めろ。以上。 まあ、ご親切に。ありがとう。 モジュールエクスプローラというやつかな。 こりゃ便利です。すっかり忘却してました。 俺、例外クラスの概念は氏ってたけど なんとなく例外コードとしてしか認識できていなかった。 なるほど、例外クラスマンセーものです。
532 :
turbo type D :2001/04/20(金) 13:34
ageわすれ,えいっと。
533 :
デフォルトの名無しさん :2001/04/20(金) 13:49
OCXの利用でちょっと悩んでいます。 外部I/Fのコントロールなのですが、仕様書には、 >object.inp Port As String, Pin As Integer >(PortはPortAまたはPortBを指定) とあって、inp('PortA',1); とかすると "TOleEnumとSmallIntの互換性が云々"と出ます。 原因は何なのでしょうか・・・?
535 :
デフォルトの名無しさん :2001/04/21(土) 14:33
'foo;bar;baz' を'foo', 'bar', 'baz' に分割する方法はないですか? 最終的にTStringsにセットしたいのですが。
536 :
デフォルトの名無しさん :2001/04/21(土) 15:27
>>535 「正規表現」コンポーネントを使ってる。
文字列を切り刻んだりするのは「正規表現」が
一番強力なので、分割パターンがちょっとフクザツに
なったりする(かも知れない)状況では、迷わずコレ。
ま、フクザツでなくても、今時のCPUなら
処理コストを考える必要もさほど無いだろし。
正規表現って文法(?)が結構壊れてるんで、
覚えたり、まして読んだり(笑)するのは
ちょっと面倒だけど、どうせ正規表現自体を
そんなに長々と書くことは滅多に無いんで、
なんとかなる範囲です。
正規表現は、さくっと覚えておくと有利です。色々な場面で。
#あとunix畑と行き来しやすくなる(ぉ
bmRegExpとかいう正規表現コンポ集だと、
Awkコンポとかいうのがあって、
切り取る部分の正規表現(ここでは';')を与えると、
splitメソッド一発でTStringsに結果を出力してくれるよ。
537 :
デフォルトの名無しさん :2001/04/21(土) 15:35
>>531 あれ?モジュールだっけか?
継承図が出る奴は違ったと思うけど。
#御免。今手元にdelphiが無い環境なので、判らず。
まず継承図からException以下をなんとなく見る。
もし自分が今出したい例外にビンゴな「名前の」例外クラスがあったら
もうけものと思ってそれを使う。
ちょうどいいのが無かったら、できるだけ近そうな「名前の」例外を
選んで、それを継承して自分で好きな「名前の」例外を作る。
特に例外は、名前に拘るのが味噌だと思う。
例外Objectは実際にプログラムとして動くわけでもないんで、
#少なくとも、例外クラスに、意味のあるメソッドを書いたことが
#ないようなきがする(笑)
あるのはひたすら、「私はこう分類しました」という
名前のつけかただけ。ここで旨い名前をつけておけば
あとあと混乱しないで済むので、ちょっと気合入れて
名前を選ぶのをお勧め。
538 :
デフォルトの名無しさん :2001/04/22(日) 00:28
>>535 セミコロンをカンマに置き換えて
CommaTextに代入すればいいだけ。
539 :
デフォルトの名無しさん :2001/04/22(日) 00:55
>>538 それ駄目。'a,b;c,d' とかいったデータで誤動作しちゃうよね。
540 :
>535 :2001/04/22(日) 01:00
function Splitter(s: String; delimiter: String; list: TStrings): TStrings; var i: Integer; begin Result := list; list.Clear; while s <> '' do begin i := AnsiPos(delimiter, s); if i=0 then begin list.Add(s); Exit; end; list.Add(Copy(s, 1, i-1)); s := Copy(s, i + Length(delimiter), High(Integer)); end; end;
541 :
Del厨 :2001/04/22(日) 16:32
>>681 じゃ、あんたからどーぞ。
というか経験でしか物を見られないのかね。幸せな頭だ。
人月の神話なんて信じている典型ドキュなんじゃないの?
数百人月で複数ベンダーでとかでえらぶって
実は優秀な奴にやらせたら十数人月でした。ってのは
よくある話。
コテハンだとしょうもない事言われるから、本当にさよならね。
フリーで仕事してまーす。って言っても信じてもらえんかね。(w
言っている事の反論じゃなくて
人の経験数とかで何かを決めようなんて
2chを読んでいる人間からはどう思われるかねえ。
ま、そう反論でもしないと自分の心を守れないのだろうから
哀れではある。
モナーシステム開発の部長だって
周りからはバカにされてるけど
部長には部長の主張があるわけだ。
せいぜい現実世界ではバカにされないようにな。
542 :
デフォルトの名無しさん :2001/04/22(日) 16:33
まずった(藁
543 :
デフォルトの名無しさん :2001/04/22(日) 16:52
>>541 すげー部長はいるね。さすがに@@@で部長になるだけはあるな、っての。
うちの部長は、まじで何やってるんだろ?
会った事無いし、出先に来ないし、納品すら課長までで関係無いし。
俺、自分で商談取ってくるから営業とも会ったことないし。
人月は?受注価格÷会社の人月です。
だから作業期間と一切関係無いです(鬱だし脳
っていうか681って????
544 :
デフォルトの名無しさん :2001/04/22(日) 17:09
545 :
デフォルトの名無しさん :2001/04/22(日) 17:13
>>541 若いねえ君も。焦りすぎは禁物だぞ。世の中そんなにスグ
には変らん。
548 :
デフォルトの名無しさん :2001/04/22(日) 23:01
Delphiで作ったプログラムって、サイズどれぐらいですか? VC++とWTLだと、特別なDLLなしで20kぐらいでダイアログ表示だけのexeが作れます。 Delphiだとどれぐらいですか? ランタイムDLLとか、OCXとか必要になります?
549 :
デフォルトの名無しさん :2001/04/22(日) 23:04
>>548 DelphiだってSDKできるだろ。
おまえは馬鹿か?
551 :
548 :2001/04/22(日) 23:08
>>549 Delphi使うんだったら、VCL使いたいべ?
552 :
>548 :2001/04/22(日) 23:09
コンソールアプリから作りこめば 数kのアプリも簡単に作れます
>>548 そんなプログラム作る意味無い。vbsで数バイトだ。
VCユーザは万能言語をうたうから、脳味噌が硬直するんだsage
554 :
548 :2001/04/22(日) 23:12
>>553 機能のコアになる部分は大してサイズが変わんないだろ?
だから、フレームになる部分がどれぐらいのサイズになるか知りたいんだよ。
>Delphi使うんだったら、VCL使いたいべ? ダイアログ表示したいだけなら どれだっていーよ。
556 :
デフォルトの名無しさん :2001/04/22(日) 23:20
>>549 おまえみたいなやつがDelphi使いの品位を落とすんだよ。
黙っとけ。
557 :
548 :2001/04/22(日) 23:26
もしかして、Delphiがサイズでかいプログラムしか作れない、とかあおってると思われてる? 今はVC++だけど、TurboPascal3.0から、初代のDelphiも使ってるんで、そこんとこよろしく。
558 :
デフォルトの名無しさん :2001/04/22(日) 23:27
>>548 >Delphiで作ったプログラムって、サイズどれぐらいですか?
空のフォーム1枚のアプリで285 KB (291,840 バイト)
メモリ使用量はタスクマネージャの表示で2720KB(仮想メモリサイズ 680KB)
ランタイム切り離すと
13.5 KB (13,824 バイト)
メモリ使用量は3,552KB(仮想メモリサイズ 1,012 KB)
ランタイムを切り離すと使用メモリが増えるのは
関係ないモジュールまで(動的に)リンクされてしまうためだと思う。
559 :
デフォルトの名無しさん :2001/04/22(日) 23:29
じゃあ、答え。 Delphiでも「特別なDLLなしで20kぐらいでダイアログ表示だけのexeが作れます」
黙ってたけど・・・駄目だ、もう一回だけ言わせてくれ。 「おまえは馬鹿か?>558」 >ランタイムを切り離すと使用メモリが増えるのは >関係ないモジュールまで(動的に)リンクされてしまうためだと思う。
561 :
548 :2001/04/22(日) 23:36
>>558 あんがと。あんまり昔と変わらんね。
やっぱり適材適所で使うしかないかな。
kylixがでるから、Delphi系に全部移行しようかと思ったんだけど、
仕事によってはどうしても小さいプログラムにしなくちゃならなかったりするので。
もう一個教えて君で悪いんだけど、DelphiとC++Builderって、ソースコードを混在させたりとかできるの?
C++BuilderでVCLのソースを追っていったら、いきなりPascalになったんでビクーリしたよ。
562 :
デフォルトの名無しさん :2001/04/22(日) 23:46
>>560 ぷぷー
スタティックリンクで必要ないDLLが使われなくなったら、
そうなるんじゃねえのかよ。ドヴァカ。
564 :
デフォルトの名無しさん :2001/04/22(日) 23:54
>>561 >もう一個教えて君で悪いんだけど、DelphiとC++Builderって、ソースコードを混在させたりとかできるの?
>C++BuilderでVCLのソースを追っていったら、いきなりPascalになったんでビクーリしたよ。
Delphi/C++Builder共にC/C++形式のobjが生成可能なので一応可能です。
コンポーネントはDelphi->C++Builderのみ可能だったと思います。
ただ、あんまり突っ込んで試したことないけど。
>>560 >>ランタイムを切り離すと使用メモリが増えるのは
>>関係ないモジュールまで(動的に)リンクされてしまうためだと思う。
補足すると、例えばvcl50を静的にリンクするとスマートリンカが
vcl50の一部(この場合はTForm関連のみ)がリンクされ、
TButtonなどの使用していないコンポーネント部分のライブラリはリンクされない。
動的にリンクすると常にvcl50「全体」がリンクされるために
静的リンク時よりもメモリ使用量が増える。
というように理解してます。
568 :
>558,561 :2001/04/23(月) 01:28
おまえらコンソールアプリ作ったことねぇ〜のかよ! まさかDelphiはフォームのあるアプリしかつくれねぇとでも 思ってんのか? 馬鹿は逝け!
寝ろ>568
570 :
デフォルトの名無しさん :2001/04/23(月) 02:13
>補足すると、例えばvcl50を静的にリンクするとスマートリンカが >vcl50の一部(この場合はTForm関連のみ)がリンクされ、 スマートリンカをもってしても、VCLを使う奴はでかいよね。 やっぱりあれだけ充実(笑)したOOP仕掛けを演出するには それくらいのコスト(リンクされるものの多さ)を 払わないとならないんだろうな。 初めて(初代)delphiを触ったときは Exeのでかさでびっくりした(TP7まで素朴に スマートリンカ=小さいと思っていたので)けど、 まぁ時代がHDDを大きくしてくれた(笑)ので あれでもいいやというか、そういう肩の力抜いた感じで Borlandは先見の明あったと思う。 #あと、Exeがでかくなるせいか、ソースレベルでの流通が #多かった感じする(^^;のが嬉しい。
使わないユニットは極力Usesから外さないと ぜんぜんサイズがちがってくるよねー。 DLLやEXE分割、パッケージを使った方が有利になる トレードオフってどの位のもんだろう? (分けたらわけたでメモリ共有がめんどそう。)
あんがとね〜。 久しぶりにDelphiやるぜ〜。kylixも買うぜ〜。 あと、偉そうなこと逝ってるくせに実力ない厨房君たちは、せいぜいスキルアップに努めること。 DelphiはVBみたいに馬鹿でも使える、とか思われると腹立つんだよね〜。
573 :
名無しさん :2001/04/24(火) 02:55
>>572 VBは馬鹿でも使えるが、ソース見れば真性ヴァカか即わかるけどな。
馬鹿でも使える、ある意味素晴らしい言語ってないですかね?
575 :
デフォルトの名無しさん :2001/04/24(火) 09:43
>>574 馬鹿でも使えるってのはある意味すごいけど、
馬鹿を馬鹿のままにしておくってのはクソ言語。
まぁ言語というよりそいつのおかれた環境がクソなんだろうけど。
Delphiのおかげでずいぶんと成長できた。
>>575 言語が人を育てるわけではないのだが・・・
例えばドキュソな上司が作ったコーディング規約で
ドキュソなコードしか書かせてもらえないというのは
良くありそうだ。サラリーマンプログラマの場合。
コンソールアプリ作るときは、SysUtilsもはずしとけ。 数十KByte削減できるぞ(藁
WTLって、結構よさげだねー。 Delphi版つくれねぇかなぁ(w って、テンプレートないからつれえか・・・。
580 :
名無しさん :2001/04/24(火) 13:28
>>580 大人でそれを使うのは馬鹿っぽいが子供なら
天才かもしれんぞ。
582 :
名無しさん :2001/04/24(火) 19:31
583 :
Delphi5で :2001/04/24(火) 19:55
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin end. をコンパイルすると40k。 uses SysUtils;を除いてコンパイルすると16k。 ついでに{$APPTYPE CONSOLE}外すせばDOS窓も出ないアプリが つくれます。 厨房でごめん。
>>577 > 言語が人を育てるわけではないのだが・・・
そうなんだけど、言語が現すパラダイムというのもあると思うので。
後半は悲しく同意。
>>583 Sysutils外すと実質使えるのはSystemユニットのみ
なのでこれで何が出来るかと言えば・・・なんだろ?
やっぱパケジかなあ。
Windowsユニットはあんまりサイズ増えないよ。
587 :
デフォルトの名無しさん :2001/04/25(水) 06:34
Windowsユニットは全くサイズは増えないと思うが。
588 :
デフォルトの名無しさん :2001/04/25(水) 14:21
>>577 言語は人を育てる。
上司も人を育てる。
ただし、育つといってもマイナス方向も有るようで(笑)、
ドキュな言語や上司に出会うと、しばしば人は
マイナス成長を遂げてしまう。
マイナス教師をうまく反面教師に転嫁できることを
祈っています。
589 :
デフォルトの名無しさん :2001/04/29(日) 16:56
591 :
Exciteの翻訳ページだよ :2001/05/01(火) 00:29
>>590 なんかBorlandが儲かってるって記事の日本語訳みたいだけどExciteの翻訳が
醜いからいまいちわかりづらい。原文見たほうが良いかもね。
592 :
デフォルトの名無しさん :2001/05/01(火) 01:07
PASCALはもともとプログラミング教育用の言語だと情報学科 の友人に聞きましたが、どこがどう教育用なのでしょうか?
>>592 いまじゃ当たり前だけど構造化記法を意識しはじめた
はしりではなかったかと。
Cより1年ぐらい早かったんだっけ?よくわからん。
Cが実利主義的、悪く言うとOSを書くための高級アセンブラ だったのに対しPASCALはプログラムをお行儀よく書くための 言語として開発されたんじゃなかったっけ。 そのためカニはんかリッチのどちらかから 「PASCALはオモチャ」とのありがたい言葉を受けたらしい。
595 :
デフォルトの名無しさん :2001/05/01(火) 03:28
>>592 教育を目的に作られたから。
当初の目的と違った使われかたをするのは良くある事。
596 :
デフォルトの名無しさん :2001/05/01(火) 03:53
>>595 あまり答えになっとらんやん。
アレだ、学生がレポートで出してくるスパゲッティでパズルで
暗黙の型変換バシバシで自己改変なクソコードを読んで
採点するのに疲れた先生が考えたのがPASCAL。
型チェックが厳しく、ループ変数の制限が厳しく、ポインタの
概念を大幅に切り捨て、ライブラリはなかったことにして、
ともかく読みやすいコードを書くことを第一義に置いたものやね。
だから、素のPASCALはオモチャというのはまさにその通り。
TPやDelphiはちゃうよ。ボーランドが拡張しまくってるからね。
>>585 一度、修行にSysUtilsなしでアプリ組んだことあるよ。
アプリっつーかゲームでだけど。
ソース公開してるから、見た人驚いてるかも(いろんな意味で)
車輪の再発明になるから、そういうのが好きでない人の場合
あまり意味はない(藁
598 :
名無しさん :2001/05/01(火) 07:31
>>596 でもDelphiの方が、オブジェクト指向も若干わかりやすくない?
>>598 そりゃ、Delphiが既にPascalを元にした独自言語になってるから
だよ。
>>598 うんうん。オブジェクト指向の入門には最適なんだけどなー。
(C++の様に初心者の頭をこんがらかせる多重継承、演算子オーバロード、
テンプレートがない)
そういう意味で塚越氏の「Delphi オブジェクト指向プログラミング」
絶版は非常に残念。UMLなど取り入れて再版望む。
601 :
デフォルトの名無しさん :2001/05/01(火) 10:34
「TDatabase-BDE-ODBC」で接続しているとき、 ODBCの関数を呼びたいのですがODBCステートメントハンドルが必要です。 どうすればODBCステートメントハンドルを取得出来るのでしょう?
602 :
デフォルトの名無しさん :2001/05/01(火) 12:25
>>600 より「純粋」なOOPに近いよね。
TClassなんかも使える辺りが強力。
初心者だけじゃなくてもっとひろく使って欲しい感じ。
え?絶版?(t_t)
603 :
デフォルトの名無しさん :2001/05/01(火) 13:02
Delphiがオブジェクト指向の入門には最適なんてうそだろー。 そんなこと言ってる奴は、きっとDelphi入門者なんだろうな。
Javaは入門用というより、OOPが理解出来てないと 話にならん。OOPを強制させる、って趣向かな?
JAVAとかC++のスタチックメソッドってのは Delphiのクラスメソッドの事ですか? どうでもいいけど、 JAVAのオブジェクト指向は変だと思うけど。
609 :
デフォルトの名無しさん :2001/05/01(火) 14:18
>Delphiのクラスメソッドの事ですか? そうです。 ただし、 DelphiのClassMethodは、virtualに出来る っていう辺りが、圧倒的なアドバンテージ(笑)。 これのおかげで、ファクトリー云々パターンなんてものを 使う必要がなくなるんだよね。 TClassまんせー でも、別に難しい概念ってわけでもないから、 初心者にも熟練者にも美味しいと思うぞ、delphiのOOP仕様は。
610 :
デフォルトの名無しさん :2001/05/01(火) 14:20
>>603 delphiのOOPの中で初心者向きじゃない面って、どこ?
JAVAを少しだけ使ってみましたが単なる関数や手続きが作れないから staticメソッドばかり記述してたら オブジェクト指向ってなんだろうかと思う。 JAVA風クラスメソッドを作ってみました。 意味無いけど。 type TInteger = class(TObject) public class function parseInt(Value: String): Integer; end; class function TInteger.parseInt(Value: String): Integer; begin Result := StrToInt(Value); end; procedure TForm1.Button2Click(Sender: TObject); begin Button2.Caption := IntToStr( TInteger.parseInt('123456') ); end; インスタンス化しなくてもいいというメリットはあるけれど Delphiスタイルじゃないよね。
612 :
デフォルトの名無しさん :2001/05/02(水) 01:03
>>607 そうでもないよ。
>>611 みたいにすれば幾らでも抜け道なんざあるから。
あとは見た目の問題。Classを単なる名前空間もどきとして使うっていうアレね。
>>611 というか、あんまりクラスメソッド(Java風)のサンプルになってないのでわ?
このネタで思い出すのはどちらかというとJavaのIntegerクラス
(生intのラッパーObject)かな。ガベコレのないdelphiでやるのは
ちょっと度胸いるけどね(^^;;;
ああ。それで思い出した。delphiでヤな点といえば、
名前空間とClassの区別が構文上つけにくいこと。
ん?これはJavaも同じか。
しかしdelphiにはJavaみたいな階層化名前空間(笑)もないので、
ちょっとそういう面は弱いとは思う。Javaの名前空間は凶悪だもんな…
Javaは名前空間がディレクトリと強制ギプスでがっちり極められちまってるのがな。 初心者は必ずはまる。
>塚越氏の「Delphi オブジェクト指向プログラミング」 この本は、なぜかすいすいと読めました。kylix版での復活を望みます。
>>614 かなり古い本だが同氏が書いた
「ゲーム&&オブジェクト指向プログラミング」もなかなかいい。
TurboPascal時代に書かれたものだがTC++とTPの両方で
ソースが書かれているので両言語の表現の差が理解出来る。
616 :
デフォルトの名無しさん :2001/05/02(水) 10:23
617 :
デル坊 :2001/05/02(水) 13:28
>616 う〜ん、これは面白いね!Palmware作りたいと思ってたけど、 今更コードウォーリアもなぁ〜、と思ってたんで楽しみ。 こんなことまでできちゃうんだね。パフォーマンスもいいみたい だし、出たら速攻買います。
PASCALについて: みなさんこんにちは。私は今、趣味でVB,VCを使っています。 別にMS信者でもなく、プログラミングが好きなのです。 他にも色々(JAVA、Perl、C、シェルスクリプト)とか勉強し ています。そこで気になっているのがPASCALなのですが、 工学部の友人と話していると、大学に入って最初に受ける プログラミングの講義が、 電子・電気系の工学科:アセンブラ、C 情報系の工学科:PASCAL という具合なんですが、これはどう解釈すればよいので しょうか?電子・電気系がアセンブラってのは分かるの ですが。また、情報系の学生しかPASCALの講義がない らしいのですが、これも不思議です。 私自身、PASCALについて何もしらないし、他言語と比較して 述べることは出来ないのですが、PASCALを勉強すれば 他言語と違う何を得ることができるのでしょうか? 情報系だけに講義があるので、何か狙いがあると思うのですが。 よろしくお願い致します。
620 :
デフォルトの名無しさん :2001/05/03(木) 06:32
c2pって無かったでしょうか? 以前、どこかで見た気がするのですが いざ探すとなると見つからないものですね。
なんで情報系なのにSchemeやんないんだよ〜 C使えりゃPascalなんて応用で覚えられるのにい。 授業で使うPascalの言語的な仕様がどの程度の物なのかわからないけど、 素のパスカルじゃあんまり役に立たないよ?
>>PASCAL たぶんDelphiでもやるんだろ。
623 :
デフォルトの名無しさん :2001/05/03(木) 12:01
Delphi(ObjectPascal)やってるとJava覚えるときに楽。 逆もまた然り。 なかまなかま。
そっか、「translator」って入れるといいのか。 さんくす>624氏
627 :
デフォルトの名無しさん :2001/05/03(木) 16:51
BorlandのNewsグループに変なキティーが現れているな。 こいつが教師(のようだ)というのもなんか泣ける。
628 :
618 :2001/05/03(木) 17:33
>621 私は経済学部なもので。友人が工学部です、すいません。 >アルゴリズムの学習が主でしょう。 >主でしょう。 んー、なるほど。そういうことですか。情報学科の新入生でも プログラミング未経験者がいるそうですから納得できます。 余談ですが、世界プログラミングコンテストってありますよね(つい先日知った)。 1位は中国の清華大学だったようです。日本は東京工業大が5位だったか!? 詳細に覚えてませんが。これは言語に何を使用しているのかな? 先日NHKで清華大学のコンピュータ学科に入学した少女のことを言ってましたが、 いましたがコンピュータが好きで好きでたまらないのに貧乏でパソコンが買えず、 ダンボールでキーボードを作って遊んでたというか、勉強していたらしい。 おそらく出力は少女の脳ということだろう。中国は凄い奴がいるもんだなあ と改めて感じました。
中華少女が脳内プログラミング。 ハァハァ(´д`)
630 :
turbo type D :2001/05/03(木) 20:25
>>629 ハァハァって。
想像力たくましいな。国語の成績がよくなりそうだ。
きっと単なるオタ少女だと思うよ........
631 :
turbo type D :2001/05/03(木) 20:28
あ、P2CやC2Pの話題が出ているので もし D2BCBやBCB2Dの変換ソフト見つけたら 教えてください。 他力本願だけどね。 VB2DやD2VBってのも広い世の中 作っている人いても不思議じゃないよなあ。 ないですかね。
632 :
デフォルトの名無しさん :2001/05/03(木) 20:33
変換するくらいだったら片方で書く。
633 :
デフォルトの名無しさん :2001/05/03(木) 22:39
P2CとC2Pって可逆変換ですか? そうだとしたら面白いな。 cat src | p2c | c2p | p2c ....
634 :
デフォルトの名無しさん :2001/05/04(金) 02:54
> cat src | p2c | c2p | p2c .... ワラタ イミネー(;´д`)
636 :
>627 :2001/05/04(金) 10:52
>>627 Delphi初心者がうれしくてしょうがないって感じが出てていいと思うけど。
たぶん、Delphiに感動してるんでしょ
おれもはじめは感動したもん
637 :
デフォルトの名無しさん :2001/05/04(金) 19:04
クラスからクラスの定義されてるソースのパスを取得することはできる?
638 :
デフォルトの名無しさん :2001/05/04(金) 19:12
なんであんなに色んな人から説得されているのに自分の考えに疑問を 持たないのかな。中村さんにNECの応対の悪さの話を言ったりとか、 個人で参加している達に失礼じゃないのか? ところでかの人は「Closeメソッドで即アプリケーションは終了すべき」 という主旨の主張を繰り返しているけど、それ自体には問題ないの? 本当にその方が便利ならとっくにそういう仕様になってても良さそうな もんなのにそうなっていないということは、都合があっての現在の仕様 だと思っているだけど。
639 :
デフォルトの名無しさん :2001/05/04(金) 19:41
この人大学の教授なのか、講師なのか。。。 人に物を教える立場に居続けると 自分の意見が正しい意見だとしか 考えられないようになるのじゃないのかな? >ところでかの人は「Closeメソッドで即アプリケーションは終了すべき」 >という主旨の主張を繰り返しているけど、それ自体には問題ないの? だよなあ、ループが終了せずに突然終了されたら それこそ困りそう。 回避方法があるのならそれで対処してもらうほうが よっぽど理にかなってる。 まあ、アプリケーションの起動と終了処理は 素人が手を出せないほど面倒になってるとは この人は知るよしもないだろうな。 興味ある学生にはこのやり取りを印刷して配ってやればいいの。
640 :
デフォルトの名無しさん :2001/05/04(金) 20:16
>普通なら、ボーランドからの正式な回答が必要ならサポートへ、というところですが、 >この件について必要だというのであればお応えしましょう。 >「Close の動作は仕様です。」 >理由については、すでに多くの方が述べられているとおりです。 >大野 おおのさん、ユーモアのある人だねえ。(藁 だけど Y.Okamoto の典型的厨房脳には 通じるかどうか。 玄なんとかみたいな寒い反応されたら嫌すぎだ。
641 :
デフォルトの名無しさん :2001/05/04(金) 21:39
Nさんまで怒らせるような あまりにも自己中心的なひどい言動が続いたので 2chに呼び出してみました。(藁 くるかな Okamoto 君
642 :
デフォルトの名無しさん :2001/05/04(金) 22:51
なんかML実況っぽくてアレですが、 Ohnoさんがトドメを刺そうとしている模様。 だけど、きっとY.Okamotoさんは勘違いしたままに違いない。 根本的にわからない、わかろうとしないと、あの文を読んだだけでは 納得いかないだろう。
うんこはかわいそう・・・
644 :
デフォルトの名無しさん :2001/05/04(金) 23:08
ニュースグループ実況中継 > 要望を書いていただくのは自由ですが、コメントされている方々は、 > 今回の要望がナンセンスなものだということを詳細な理由をつけて説明されています。 > (これは、非常に嬉しいことです。この場を借りてお礼申し上げます) いやあ、オオノさま、とどめをさしてくださいまして ありがとうございます。 この場を借りてお礼を___ 見ていて気分がイィd(・∀・) 厨房はどうして自分が厨房だという事に気がつかないのだろう。 え?「オマエモナー」ですか?、すいません逝ってまいります。(藁
でもNewsGroup自体投稿量少なかったので楽しめました。 MLも最近つまんなかったし。<こういう俺が一番くずだ。
647 :
デフォルトの名無しさん :2001/05/05(土) 15:47
しかし、こんな教師に教えられるとはたまったものではないな。 教師とはこうも傲慢な職業なのか。 自分の視野の狭さというものを感じることはないらしい。 やだやだ。
>教師とはこうも傲慢な職業なのか。 水野朋子?
649 :
デフォルトの名無しさん :2001/05/05(土) 21:40
>648 そういえばミヅノは英語教師でしたな。(藁
ぐぇ。こいつ、Delphiの本まで書いてるのか。 そうするとある程度はDelphiに詳しいと思うが なぜCloseの仕様変更が不可能だという事すらわからないのだ。 心理学を学んでるって そうするとわざと怒らせて他の人間の行動を 分析したりしてるのか? ヤナ奴だなあ。コイツの書籍持ってなくてよかったよ。
652 :
デフォルトの名無しさん :2001/05/05(土) 22:26
>>651 Delphiに詳しいかもしれないけど、Windowsには詳しくなさそう。
実は後日「今までのは心理学の実験でした。お騒がせしました〜」
なんて投稿をするとか…。余計マズいか(w。
偽名でやってくれたまえ。頼むから(藁 2chネラーのたちの悪さを存分に発揮しようぜ
654 :
デフォルトの名無しさん :2001/05/06(日) 00:42
>2chネラーのたちの悪さを存分に発揮 なにするきだ?
本当に同一人物か?
Delphiの心理学本ってのが、前に立ち読みしたのと同じなら、あれは、DelphiというよりPascalって感じでした。 あんまりVCLを使ってないんですね。
657 :
デフォルトの名無しさん :2001/05/06(日) 08:40
>>656 確かあの本しかそういう本はないので同じ本。
本書いている奴よりも、ネットの常連の方が
良識な人たちばかりでほっとした。
もっとも必要のないDelphi本著者として記憶しておこうっと。
岡本氏の本はCQ出版からは何冊か出てるはず。 岡本氏の主張を通したいならGUIアプリじゃなくて コンソールアプリで学生達に授業すればいいのになあ? それともNewsGroup活性化の為に一芝居打ったのだろうか? 中村氏や大野氏を引きずり出すのには成功してるし。
659 :
sage :2001/05/07(月) 03:28
>>655 同じメールアドレスだよ。
>>658 >それともNewsGroup活性化の為に一芝居
なんで彼がそんなことを?
だいたい,喧嘩が起きないと活性化しないコミュニティってなんだ?
660 :
( ´∀`)さん :2001/05/07(月) 04:05
659 >だいたい,喧嘩が起きないと活性化しないコミュニティってなんだ? 2ちゃんねる
否定できん(´д`;)
これでいいのになあ。 procedure TForm1.Button1Click(Sender: TObject); var n : integer; begin repeat n := StrToInt(InputBox('Set an integer... n = 0 for Close', 'N =', '0')); case n of 0 : ; 1 : ShowMessage('Case - 1'); else ShowMessage('Case - else'); end; until n = 0; Close; end;
663 :
デフォルトの名無しさん :2001/05/08(火) 19:25
お、とうとう出ましたか。
665 :
turbo type D :2001/05/08(火) 19:37
反応早いですね。
666 :
デフォルトの名無しさん :2001/05/09(水) 12:20
667 :
turbo type D :2001/05/09(水) 13:26
668 :
turbo type D :2001/05/09(水) 14:19
で、なんでMLでは誰も発言しないの?D6のこと。
669 :
厨房 :2001/05/09(水) 15:37
>>668 日本のサイトしか見てないんじゃないの?
今日はじめてMLに話題が出てきた。 やはり中村さん。
DataSnapというのがメインなのかな。>>D6
BCBのコードガードはつかないのかなぁ
673 :
デフォルトの名無しさん :2001/05/10(木) 02:27
BCB5を使ってて、最近Delphi5も使い始めましたが、 てっきりCodeGuardがあるもんだと思っていましたので 驚きました。結構便利に使っていたので残念でもあります。 Delphi6には無いんでしょうか。
コードガードつかないかなぁと言っておいてなんですが、 実際CodeGuardの使い勝手はどんなもんなんですか?
676 :
turbo type D :2001/05/10(木) 09:53
>>674 同意。教えてくださいな。
MemCheckと同じような感じなのかな。
677 :
turbo type D :2001/05/10(木) 10:54
質問。 ある数値が素数かどうかを高速に求めるのはどうしたらよいでしょうか?
Helpからの転載。適度に改行を入れてます。 CodeGuard は,C++Builder で開発されたアプリケーション用の ランタイムデバッグ機能を提供します。CodeGuard は,構文規則に 違反していないためにコンパイラに報告されないエラーを報告します。 CodeGuard は,ボーランドのラインタイムライブラリに加えて, 多くの Windows API 関数も追跡し,マルチスレッドアプリケーションを 完全にサポートしています。 CodeGuard には,次に示す 2 つの概念があります。 メモリとリソースの使用 CodeGuard が検査するのは,誤ったメモリの使用法, 不適切なメモリの割り当てまたは解放,無効なファイルストリームまたは ハンドル,およびファイルストリームやハンドルの不適切な使用によって生じる リソースリークなどです。CodeGuard は逆参照時にポインタを検査して, ポインタの演算内容を確認します。メモリやリソースが解放される場合に, ユーザーのプログラムがその解放されたメモリ領域やリソースにアクセス しようとすると,CodeGuard はエラーを報告します。 関数の使用方法についての正当性 CodeGuard は関数の引数を調べ,関数の 戻り値によってエラーを報告します。また,関数呼び出しで使われている Windows リソースハンドルの 有効性を検査します。 CodeGuard の有効化と設定 CodeGuard は,静的なライブラリ(CG32.LIB)またはダイナミックリンク ライブラリ(CG32.DLL)を使用します。これらのライブラリには,関数の引数と 戻り値を検査するラッパー関数が含まれています。CodeGuard は, CodeGuard コンパイラオプションを有効にしてコンパイルした実行形式 ファイルのエラーだけを検出できます。 追加のランタイムオプションを設定するには,CodeGuard 環境設定 ユーティリティを使います。環境設定ユーティリティのマニュアルを 参照すれば,CodeGuard のエラーログの内容や,CodeGuard を効果的に 使う方法について理解することができます。
679 :
>677 :2001/05/10(木) 12:50
使用目的がわからないのでなんともいえないけど 値域が十分狭くて、何度も判定するなら 素数リストを生成して検索すればいいんじゃない。
680 :
turbo type D :2001/05/10(木) 15:11
>>679 ピタゴラスの三角形という数学ロジックを見るプログラムを
作っているので値域が十分に広いので
素数リストの方法は
ちょっと厳しいですわ。
まあ、パフォーマンスにシビアな
ソフトではないので、
泥臭く計算する事にします。
サンクスコね。
681 :
デフォルトの名無しさん :2001/05/10(木) 16:15
> 680 ”エラトステネスのふるい”を、ある数の平方根まで行うのは? 100までなら、100の平方根の10までの素数(2,3,5,7)に対して ふるいをかける。あとは再帰。
682 :
turbo type D :2001/05/10(木) 17:30
じぇーんじぇんわからません。(゚∀゚)ゴ...ゴルァ
683 :
turbo type D :2001/05/10(木) 17:31
”エラトステネスのふるい” なんかつおそうだ、 アルテミスの首飾りくらい強いのですか?(w
684 :
681 :2001/05/10(木) 17:43
>>678 アリガトゥヽ( ´ー`)ノ
これはつけてもらわねば
687 :
turbo type D :2001/05/10(木) 19:35
あってるかな? 2/3/5/7/11/13/17/19/23/29/31/37/41/43/47/53/59/61/67/71/73/79/83/89/97/101/ 103/107/109/113/127/131/137/139/149/151/157/163/167/173/179/181/191/193/197 /199/211/223/227/229/233/239/241/251/257/263/269/271/277/281/283/293/307/ 311/313/317/331/337/347/349/353/359/367/373/379/383/389/397/401/409/419/421 /431/433/439/443/449/457/461/463/467/479/487/491/499/503/509/521/523/541/ 547/557/563/569/571/577/587/593/599/601/607/613/617/619/631/641/643/647/653 /659/661/673/677/683/691/701/709/719/727/733/739/743/751/757/761/769/773/ 787/797/809/811/821/823/827/829/839/853/857/859/863/877/881/883/887/907/911 /919/929/937/941/947/953/967/971/977/983/991/997/
688 :
turbo type D :2001/05/10(木) 19:36
//------------------------------- //素数リスト procedure TForm1.SosuuList(Value: Integer); var SqrNum: Extended; Limit, i, j: Integer; SosuuList: array of Boolean; begin SqrNum := Sqrt(Value); Limit := Trunc(Int(SqrNum)); if Value <= 1 then Exit; SetLength(SosuuList, Value+1); //0..Limitまでの配列を用意 SosuuList[0] := False; SosuuList[1] := False; for i := 2 to Value do begin SosuuList[i] := True; end; for i := 2 to Limit do begin if SosuuList[i]=True then begin for j := 2*i to Value do begin if (j mod i) = 0 then SosuuList[j] := False; end; //for j end; //if SosuuList end; //for i for i := 2 to Value do begin if SosuuList[i] = True then begin Form1.Memo1.Lines.Add(IntToStr(i)); end; end; //for i end; procedure TForm1.Button1Click(Sender: TObject); begin SosuuList(1000) end;
アリガトね
>>684 素数って計算するというよりかわ、
データとして保持しておけばいいものなのね。
考えてみたらあたりまえか。
692 :
デフォルトの名無しさん :2001/05/15(火) 02:17
Delphi版仕様書工房みたいのありませんか、しかもフリーのもので。
Delphi4を使っていたが今朝Delphi5の最終バージョンアップ 案内が届いてD5にバージョンアップするとD6が無償! 一気に2バージョン揃えるチャ〜ンス(^ー^) やってくれるぜBorland。
なんか最近、Borland調子よさげですな。 売上あがってるのかなあ
695 :
デフォルトの名無しさん :2001/05/15(火) 21:36
日経LinuxのKylixの広告も結構インパクトあるな〜
697 :
デフォルトの名無しさん :2001/05/16(水) 02:54
>>693 -694
D5が余っている。
すぐにお金が必要。
だと思うが。
698 :
デフォルトの名無しさん :2001/05/18(金) 09:51
699 :
デフォルトの名無しさん :2001/05/18(金) 09:59
700 :
デフォルトの名無しさん :2001/05/18(金) 10:09
701 :
デフォルトの名無しさん :2001/05/18(金) 13:34
右クリックした時に何らかの処理をさせたい(例えばclose;) のですが、どのように記述したら宜しいのでしょうか? tipsサイト片っ端から探してみたのですが、何故かありませんでした。 Del職人の方のご教授をお願い致します。
TForm.Popup, TPopupMenu
マウスダウンイベントでミギをみる。かな。
705 :
デフォルトの名無しさん :2001/05/18(金) 15:28
また誰かプログラマ板で煽ってる奴がいる。 MLの転載だめ。
706 :
デフォルトの名無しさん :2001/05/19(土) 06:05
他のアプリケーションで保持されている文字列を 取得するには、どうしたらいいでしょうか? FindWindow 指定アプリを取得 GetWindowThreadProcessId プロセスID取得 OpenProcess プロセス開いて ReadProcessMemory メモリから読みこんで closeHandle 閉じる・・・ 読みこむ対象が数値であれば、出来ているのですが、 文字列になると動作しなくなります。 お願いします。
707 :
デフォルトの名無しさん :2001/05/19(土) 08:43
>>706 文字列って String 使ってる?
PChar 使ったらいけるんじゃないかな
708 :
706 :2001/05/19(土) 14:43
はい、PChar使っております。
709 :
デフォルトの名無しさん :2001/05/19(土) 16:52
ぴーちゃー?
ピーシーハア
711 :
デフォルトの名無しさん :2001/05/19(土) 17:41
他プロセスの情報を読むってOSによって方法違うんだよね。 デスクトップアイコンの位置を保存するときにハマったよ(^^; NT系だと GetWindowThreadProcessID OpenProcess VirtualAllocEx // ここで文字列の取得とかいろいろ ReadProcessMemory VirtualFreeEx CloseHandle って流れでアイコンの位置・文字列を取ったことがある。 VirtualAllocEx/FreeEx してるとこだけ 706 のと違うな。 このへん試してみたらどう? > 706
>>711 そのネタしってる人は数人に絞られてるなあ
と感じる俺もマニアックかねえ(w
デスクトップアイコン位置保存のテクを知りたいといわれて
突然見知らぬ中国人から英語メールが山ほど来た時は
少々辟易した。
713 :
706 :2001/05/19(土) 18:34
>>711 やってみます。どうも
>>712 ネット検索しても1個とかして出てこないぐらいコアですね(ww
>712 俺はフックで強引にやったけどな
オレもフックでやりました。ていうか、フックが普通かと思ってました。 そういうことで、711はやはりマニアックかと。
716 :
:2001/05/19(土) 20:31
ぽいんた おぷ きゃらくたー
>おぶ おぷ
(´д`;)
720 :
デフォルトの名無しさん :2001/05/19(土) 20:48
おんぷたん(´д`;)
ぼいんたん萌え(´д`;)
ごめん もうそのへんで ゆるして(´д`;)
723 :
デフォルトの名無しさん :2001/05/19(土) 23:02
DelphiとVisual SourceSafeの 組み合わせで開発している人いますか? 今ちょっと試しているんですが ・DelphiのIDEとVSS両方起動 ・フォームは*.dfm, *.pas両方をペアで管理 ・ファイルをチェックアウトしたらIDEのファイルを 一度閉じてから再度開く(リードオンリー属性を解除するため) といった点が面倒ですね。 なんか良い方法があったら教えてください
724 :
デフォルトの名無しさん :2001/05/20(日) 13:47
興味あるのでage
えーできました(w Pcharの初期化が肝でした。 Buffer : Pchar; Buffer := StrAlloc(256); ですです。 ありがとうございました。
とりあえず、NT系の関数を使用しても 98SEでは、問題ないようです。
727 :
デフォルトの名無しさん :2001/05/22(火) 20:45
>>730 止めてくれよう。表紙見るたびに想像するじゃないか。(藁
藁
一応・・・ね
734 :
デフォルトの名無しさん :2001/05/31(木) 00:42
でるふぁい
|\ ┌──────────┘- \ │ \ | 気のふれた方が > │ / └──────────┐- / ヽ(´ー`).ノ |/ ( へ) く - = ≡三 |\ - = ≡三 ┌──────────┘- \ _ = ≡三 │ \ ― =三三 | います >  ̄ = ≡三 │ / - = ≡三 └──────────┐- / (´ー`) - = ≡三 |/ ( ヽ ヽ) / >
736 :
デフォルトの名無しさん :2001/05/31(木) 04:07
↑ 自覚しろよ
>>728 爆笑、Delphiは、ギコ猫だったのか。
gikonekonanoka-...(wara
740 :
デフォルトの名無しさん :2001/05/31(木) 14:13
delphi用のjavadocみたいなのってないですか? フリーのやつで。
742 :
デフォルトの名無しさん :2001/06/02(土) 21:13
743 :
デフォルトの名無しさん :2001/06/03(日) 13:31
Delphiにて、Pythonインターフェィスの組み込み方ってどうやる? Iriaとかやってるよね?
744 :
デフォルトの名無しさん :2001/06/05(火) 01:12
あー、IriaさんPythonやめるっぽいね。 なんか組み込み用のスクリプトでいいのないかなー。 ライセンス周りが緩やかなヤツで。フリーで商用OKとかのね。 自作するしかないのか?
745 :
デフォルトの名無しさん :2001/06/05(火) 01:23
時期Iriaに組み込む予定で公開されているアレは駄目なのかい?
DMonkeyっすかー。ってソース公開されてるしー。すげ。
749 :
名無しさん :2001/06/06(水) 21:28
DelphiXって、なんでリファレンス以外に実ソース解析しか理解する方法ないの? どっかにマシなチュートリアルないのかぇ 本買ったが、添付Helpとサンプル印刷しただけじゃん。鬱。
よくしらんが、ダイレクトセックス8が出た時点で
だめなんじゃないのか?
>>749
学習に一番いいのがサンプルソースっていう考えなんじゃあないかな。
752 :
デフォルトの名無しさん :2001/06/07(木) 12:10
なんかスレ趣旨と違うみたいですが、新スレたてるほどでもないと思うんで
ここに書かせてもらいます。
Delphi始めたばっかのビギナーです。ビギナーなので慣れるまであれやこれ
やと教えていただきたいことが出ると思います。そういう質問を受け付けて
いる、活発な掲示板のあるサイトご存知でしたらご紹介頂けないでしょうか。
Delphiはじめるなら、まずはここに行けという定番サイトというか。
VBでいえば
http://www2j.biglobe.ne.jp/~little-g/vbtomo.html ここみたいなところがあれば嬉しいです。よろしくお願いします。
753 :
turbo type D :2001/06/07(木) 12:22
Delphi広場とAboutDelphi(DelphiMLの過去ログ検索)は押さえておいてください。 URLは検索してちょ。
754 :
デフォルトの名無しさん :2001/06/07(木) 13:24
onIdle とか使うとCPU使用率100%になるね・・・ winampとか、1%なのに・・・ なじょ・・・
シュレッド?ナジョ
次スレたてるときは、1に書いといたほうがいいなこのアドレス
758 :
752 :2001/06/07(木) 16:24
>>753 >>756 しばらくその2つのサイトに通いつめることにします。
どうもありがとうございました(__)
じゃ、そっちで会いましょう(藁
Delphi6を待ちきれずにDelphi5を買ったじょ。 楽しいなぁ。楽しいなぁ。 ATLでCOM作っていたときの苦しみがうそのようだ。
761 :
デフォルトの名無しさん :2001/06/07(木) 16:51
シュレッドつかっても100なの・・・ なじょ・・・
>シュレッド シュリープしてなからかな?
763 :
turbo type D :2001/06/08(金) 00:14
BorlandのnewsGで、UMLツールくっつけろ って意見が出てますね。 大賛成。 例のエクストリームプログラミングの ユニット試してみたいな。 なんか乗り遅れちゃった感じ。
765 :
デフォルトの名無しさん :2001/06/08(金) 10:09
Delphiのプログラムからプロセスを起動して そのプロセスと標準入出力でやりとりする サンプルかコンポーネントってないですか?
766 :
デフォルトの名無しさん :2001/06/08(金) 10:56
シュリープしたらへったよ!ありがとぉ! でもね、75fpsぐらいだしてCPU使用率が3%なwinampってなんでしゅか? でるFight!!じゃーむりのかなぁ。
767 :
デフォルトの名無しさん :2001/06/08(金) 10:59
だいれくとせっくすを使ってるのが、だめだったかなー ぶひーん
>>766 Soniqueなんかだと、CPUバリバリ食ってるけど
winampの起動時に別のプロセスの使用率が高くなってないか見てみよう。
>でるFight!!じゃーむりのかなぁ。 こんなこと言ってると他の環境でもきっとできないぞ。がんばれ。
770 :
デフォルトの名無しさん :2001/06/08(金) 13:43
procedure TForm1.FormCreate(Sender: TObject); begin beep; beep; beep; end; おとが3回なるよ!3回なるソフトちゅくったにょんー
ほう。
Canvas.TextOut で表示される文字を、アンチエイリアス処理したいのですが どうすればいいでしょうか?
773 :
デフォルトの名無しさん :2001/06/09(土) 21:35
念じる!
>>773 早速のご返事ありがとうございました。
今晩、徹夜で念じてみます。
778 :
デフォルトの名無しさん :2001/06/10(日) 22:52
age
779 :
デフォルトの名無しさん :2001/06/11(月) 13:16
Delphi5のExcelChartコンポーネントのサンプルがあるURL または使い方を解説してる書籍ってないですか?
780 :
seven :2001/06/12(火) 03:06
>Delphi5のExcelChartコンポーネントのサンプルがあるURL >または使い方を解説してる書籍ってないですか? 無い。C++Builder5から使ったときは辛かった。Webで解説したり書籍出したら売れるかも。 >市販品では、だめですか?エクセルクリエーター だめ。高速コンポーネントとして配布されているのに、市販ライブラリを通すと遅くなる。
782 :
デフォルトの名無しさん :2001/06/12(火) 19:30
age
Delphi使い始めて一年足らずの厨房ですが、宜しくお願いします。 ageてもよい物なのかわかりませんので、sageさせていただきます。 Delphiって、マルチステートメントてっと出来ないモンでしょうか? たとえば、ButtonClickイベントでユーザの入力を判定して、 入力が変な場合メッセージを表示してExit;したい場合、 if 〜 then begin messagebox(Handle, '入力変ですよん', nil, MB_ICONERROR); exit; end; ってしなきゃいけないじゃないですか。 それを if 〜 then messagebox(〜) : exit; って書きたいんです。 もしくは、 if 〜 then messagebox(〜): exit; とか。
>>783 if 〜 then Begin MessageBox(〜); Exit End;
っていうかマルチステートメントなんて悪い習慣
早く忘れなさい。
785 :
デフォルトの名無しさん :2001/06/13(水) 00:33
>>783 そんなもんまとめてraiseしたれ。
try
if チェック1 then
raise Exception.Create('エラー1');
if チェック2 then
raise Exception.Create('エラー2');
Except
On E: Exception do begin
MessageDlg(E.Message, mtError, [mbOk], 0);
Exit;
end;
end;
>>783 です。レスありがとうございます。
>>784 殿
あ、あれって悪い習慣だったんですか(^^;
簡潔になるから結構好きだったりするんですが。
しかし、やはりそうするか方法はないみたいですね。
>>785 殿
なるほど、そういう手もありますね。
しかし、Except節で
On E: Exception do begin
MessageDlg(E.Message, mtError, [mbOk], 0);
Exit;
end;
二つのステートメントを begin..end; で囲っているあたり、
業が深いですな(^^;
787 :
デフォルトの名無しさん :2001/06/13(水) 01:42
ていうか、マルチステートメントなんていう 糞みたいな概念、忘れなさい。 #ありゃBasicだったか? pascal(やC)の「文」の概念を一度きちんと覚えるよろし。 強く推奨。くれぐれもきちんとだぞ。半端だと逆効果だ。
>>783 です。
>>787 氏
ご教授ありがとうございす。
検索してみたんですが、いまいち、マルチステートメントの悪と、
Pascal、C の「文」の概念を解説したサイトが見つけられないのですが…
もしご存知でしたら、ご教授下さい。
マルチステートメントは、HSPやVBをメインにしていた頃に使用していました。
>マルチステートメント 久々に効いたよこの言葉。懐かしい。 昔Basic覚えたてのころ使ってた覚えが。
790 :
デフォルトの名無しさん :2001/06/13(水) 10:42
BASICなどは基本的に1行=1ステートメントだから 複数のステートメントを記述する為マルチステートメント なるものが考案された。 しかし、ソースがごちゃごちゃして論理の流れが掴みにくく なるし、しかもラベルの終端もコロンなもんだから ステートメントをラベルと誤認するなどあまりいい事が ない。メモリーが少なかった頃の遺物と考えていい。
わたしもがんばあて、かんがえてみたよ!みてね! procedure errDayo; begin messagebox(〜); exit; end; begin if 〜 then errDayo; これでどお?('-`)?
マルチステートメントなんて聞いたことも無かった。 N88BASICはやったんだけどなあ。
Cだと、 if (〜 ) messagebox(〜), exit; ってのが出来た気がするが、DelphiのPascalはできなかった気が・・・。 そういや、みなさんブロックの終わりの行の最後のセミコロン付けてる?省いてる? begin hogehoge; exit end こんなかんじに。
795 :
デフォルトの名無しさん :2001/06/13(水) 12:21
>>791 しかもメッセージ固定だし〜。こうすれば?
type
EMyError = class(Exception);
procedure ErrorPitcher(const msg: String);
begin
raise EMyError.Create(msg);
end;
procedure ErrorCatcher(E: Exception);
begin
MessageDlg(E.Message, mtError, [mbOk], 0);
end;
begin
try
if 条件1 then ErrorPitcher('エラー1');
if 条件2 then ErrorPitcher('エラー2');
if 条件3 then ErrorPitcher('エラー3');
except
on E: EMyErrorException do ErrorCatcher(E);
end;
end;
スマン、 × on E: EMyErrorException do ErrorCatcher(E); ○ on E: EMyError do ErrorCatcher(E);
>>791 ぎゃふん!まちがえちゃった!
exit;をhalt;にしてね!
あぼ〜んするのだ〜
ぼぼ〜ん
801 :
デフォルトの名無しさん :2001/06/13(水) 14:55
VCLってDelphi?
802 :
デフォルトの名無しさん :2001/06/13(水) 16:35
>>788 delphiの文法のヘルプは如何?
>>794 ピリオド演算子な。棄却演算子とかいうんだっけか?
2項演算子で「演算子の左の式の値を単純に捨て、右の式の値を返す」
という「演算子」だ、たしか。
演算子だから「式」の中には好きに書けるわけだ。
for (s=1, t=2; hoge(s,t); s++, t++){}
なんて書いた場合も、
s=1, t=2
および
s++, t++
という「2つの」式が有ると見なされるわけ。
なんでもかんでも演算子ってところがいかにもC的。
よしあしはさておき、pascalとは随分雰囲気が違うわな。
803 :
デフォルトの名無しさん :2001/06/13(水) 18:10
つまらんツッコミで申し訳ないがカンマ演算子です… 使えてもプログラムがわかりにくくなるから滅多に使わないけど。
804 :
デフォルトの名無しさん :2001/06/13(水) 22:45
>>783 =
>>788 です。
ご教授ありがとうございます。
>>789 氏
最初はHSP、次にVBとやっておりました。
ですので、マルチステートメントがあるのを当然かと
思っておりました。
>>790 氏
>メモリーが少なかった頃の遺物と考えていい。
なるほど。ご教授ありがとうございます。
>>791 氏
errDayo 中で Exit を使用しても errDayo を抜けるだけで、
意味無いように感じます。
と思ったら
>>793 氏でがいしゅつでした。(^^;
>>792 氏
申しわけありません、N88BASICは名前を聞いただけで、
実際に触った経験はないので何とも…
>>794 氏
自分は付けています。
省略したあと、その近辺を変更するとコンパイルエラー
の温床になってしまうので非常に煩わしいので。
>>795 -796氏
なるほど。また一つ勉強させていただきました。
>>798 -800氏
大変失礼で不躾な質問ですが、漫才でしょうか?
>>802 氏
なるほど、Delphiヘルプですか。
見落としていました。まさに灯台もと暗しです。
一度じっくり読んでみようと思います。
>>803 氏
「申し訳ない」というような書き込みとは思いません。
些細なこととはいえ、そのまま間違った知識を
広めるよりはよいと思います。
偉そうで申しわけありません。
でるぽいってむずかしいよね! がんばおー! proceudre TForm1.Creare(Sender : TObject); var i : integer; begin for i := 1 to 10 do begin beep; sleep(500); //おぼえたよ!すりーぷ!おしえてもらったよ! end; end; 音が10かい、休みながらなるよ!
proceudre TForm1.Creare(Sender : TObject); var i : integer; begin for i := 1 to 10 do begin beep; sleep(i*100); end; end; やはりこのくらいやらないと i が可哀相。
808 :
名無しさん :2001/06/14(木) 12:09
809 :
デフォルトの名無しさん :2001/06/14(木) 15:52
Delphiはもう終わっているときいたのですが本当でしょうか? もうバージョンアップもしないそうなんですが...
TNoteBook のページに動的に TEdit とかを作るのって どうやったら良いんですかね? いろいろ試してるんだけど良くわからんです。
813 :
デフォルトの名無しさん :2001/06/14(木) 18:37
DelphiXPなんて出たらヤだね。
815 :
:2001/06/14(木) 20:21
終わってるのはVBの方だと思うが、、、
マターリ逝きましょう、マターリ。
またあり!またあり! なんでも出来ることは、いいことだ! あいであとこんじょーさ!
ソースの場所を記憶するのに「しおり」ってありますよね? デフォルトだとCtrl+Shift+[数字]でマークして、Ctrl+[数字]でジャンプやつです。 これ、Delphi閉じちゃうと消えてしまうけれど そうならないような、かわりになるものってあります? もしくは、みなさんソースのマーク付けにどんな工夫しておられます?
820 :
デフォルトの名無しさん :2001/06/15(金) 08:26
ageます
まだD厨房のレベルですが。
>>819 コメントをある程度目立つように書く、
これくらいかな?
あとはブレークポイントを仕掛けっぱなしにしておくとか…
速度を考慮しなくていい場所なら、
if GetTickCount = 0 then
Application.ProcessMessage;
とでも書いて、ProcessMessages; に仕掛ける。
でもやっぱコメントかな?
822 :
819 :2001/06/15(金) 09:38
しおりの代わりに、 ・おしげなくTODO機能を使うとか、 (エディタにTODOリストをドッキングさせておいていつでも参照可能なようにしておく) ・無効状態にしたのブレークポイントを設置するとか、 (同様に、ブレークポイントリストをエディタにドッキングさせておく) とか考えていたんですが、しおりと違ってショートカットで移動できないので いかんせん常用できないんですよね(´д`;) Delphiお得意の環境拡張でなんとかならないかなーと思っていたり。
825 :
turbo type D :2001/06/15(金) 14:33
しおりの 保存機能は是非欲しいですね。 Borlandに要求しおうぜ!
826 :
turbo type D :2001/06/15(金) 14:53
Borland Mail Newsアゲ ◆「Delphi 3 または 4 → Delphi 5」バージョンアップは6月20日まで だって。
827 :
デフォルトの名無しさん :2001/06/15(金) 19:33
>>825 それ実装したら、Delphi6 買ってくれる?
828 :
turbo type D :2001/06/15(金) 19:42
実装してなくても買っちゃうね (w でも、しおりがどうして保存されないのかは 以前からナゾだったです。はい。
830 :
デフォルトの名無しさん :2001/06/15(金) 21:39
>>828 IOTAEditView の BookmarkPos プロパティで読み書きできるよ.
アドイン作ってみたら?もうあるかも.
831 :
turbo type D :2001/06/15(金) 23:10
他に、なにかあるとうれしいもの無いの?
Borlandに、自社製品使ったソリューション丸ごと。 カスタマイズ無制限・ノンロイヤリティー。
>>832 Tools API のソースのコメント、訳してよ・・・
あとサンプルコード、コンポーネントのテストで使ったものでも
いいから今の倍ぐらいにしてよ・・・
>>826 思い出して申し込んだ。Delphi6はCLXの絡みもあるから
買っておくかというところで。
DDKのHeaderFileも入れといて欲しいんだけど。 自分でPascalに直すの面倒だよ。( ´Д`;) あ、俺まだDelphi4なんだけど、Delphi5に付いてる?>DDKのヘッダ 付いてたら直ぐUpgradeするニョ。なるべく6月20日までに教えて・・(我侭
>>836 ヘッダーということはインポートユニットにゃ?
ほいじゃついでにTASMも。
>>834 >Tools API のソースのコメント、訳してよ
これくらいなら今のスケジュールでも何とかなるかな.
840 :
デフォルトの名無しさん :2001/06/16(土) 02:29
KylixでのMySQL接続プログラムはDelphi6でも使えるのかな?
>>839 細かいところは気にしないことにしましょう。
>>837 そです>インポートユニット
TASM、俺も欲しい。たまにBC4で使うけどやっぱ便利。
843 :
デフォルトの名無しさん :2001/06/16(土) 04:31
TASMはまだ売ってるんですか?
と思って検索したらあるみたいですね。失礼しました。
>>要望 inline asmでMMXやらSSEやらを正式対応もとむー。 アドインで無理やり使うのもなあ。
846 :
デフォルトの名無しさん :2001/06/16(土) 05:43
で、思うんだけど Delphiって、IDEの環境がカスタマイズができると言っても難しすぎる。 というか、あまりにサンプルや解説が少ない。 よって、気軽にカスタマイズできない。 その辺なんとかならないだろか。
847 :
:2001/06/16(土) 07:38
プロジェクトにコンポーネントライブラリを含められるようにして欲しい。 パッケージを再コンパイルしなくても使えるやつ。
>>845 Kylix 以降、MMX, SSE, 3DNow サポートしちょりまっせ。
>>847 パッケージグループを使って、アプリとパッケージをまとめて
ビルドかけたら?
850 :
デフォルトの名無しさん :2001/06/16(土) 11:34
>>849 逆にいうと、コンポーネントパレットに
「グローバルに」コンポを所属させたくない!という
希望を叶えることって出来ますか?
他のプロジェクトでも同じコンポをパレットに載せたくない。
載せられちゃう(少なくとも昔のverはそうだったよね)と
コンポのクラスをプロジェクトローカルに出来ない。
名前空間どころの騒ぎじゃなくなり、他のプロジェクトにまで
名前汚染をしちまう。つまり同じ名前の違うコンポを作れなくなる。
これ痛い。せっかくの(或る意味究極の)ライブラリ化技術なのに、
名前空間が制御できないんで事実上使い物にならない、つまり
「あるプロジェクトに属する」ライブラリを積極的にコンポ化
するというモチベーション(?)を、失ってしまう。
(コンポはプロジェクト非依存でないと「おかしい」という
考え方は、なんか変です。コンポの便利さを使える場面が
限定されてしまうってのは、技術的必然では無いはず)
あれって、最近では改善されましたか?
851 :
デフォルトの名無しさん :2001/06/16(土) 12:45
複数のプロジェクトで使うコードだからライブラリにコードを 移動するんじゃないの?ここのプロジェクトのみで使うだけなら コンポーネントとして独立させる必要は無いでしょ? 便利さとのトレードオフだと思うけど。 一つのプロジェクト内の複数のフォームで使い回すだけなら フレームを使ったら?
852 :
デフォルトの名無しさん :2001/06/16(土) 12:48
ようは、プロジェクトファイル(グループ)開いたときに、 そのプロジェクトで使用されるコンポーネントが自動で組み込まれ、 プロジェクトを閉じたときにアンインストールされる、 みたいな感じだよね? 確かに今のままだと不便なんだよな。 delphiで作られたツールのソース拾ってきても、 プロジェクト開く前に付属されてるコンポーネントを先にコンパイル、インストールして 自分の環境汚さなきゃいけない。うーむ。 自分でつくるものも、組み込む(人に渡すときには組み込ませる)手間が別途かかるので、 コンポーネント化しても、FormCreate時に動的生成ですませちゃう・・・。
853 :
デフォルトの名無しさん :2001/06/16(土) 13:04
個人的にはコンポーネントの登録などしないで uses(かusescomponent)すれば パレットに並ぶようにして欲しいね。 ユニットはuses myunit in '..\old\myunit.pas'できるんだから。
854 :
:2001/06/16(土) 13:05
>>851 constでもいいんですが、オブジェクトインスペクタで初期値を指定する
のも捨てがたいんですよ。
855 :
デフォルトの名無しさん :2001/06/16(土) 13:08
>>854 >オブジェクトインスペクタで初期値を指定する
>のも捨てがたいんですよ。
つーか、コンポーネントの利点ってこれにつきるような
自分でCreateしたらただのクラスじゃん
856 :
turbo type D :2001/06/16(土) 13:47
>>852 -853
使ってると不便に思う事はみんな同じなんだな。
usescomponent案サンセー
Create時に自分で生成するの反対。面倒すぎ
既存コンポーネントとの
名前空間のぶつかりが気になるけど
Borlandなら出来るだろうし。
opentoolsApiも使いにくぃ。
857 :
デフォルトの名無しさん :2001/06/16(土) 14:04
>uses(かusescomponent)すれば >パレットに並ぶようにして欲しいね。 これができればコンポーネントの開発・デバッグもかなり楽になるね。 Delphi6にこれ実装しないとC#に移るぞ、ゴルァ!! > Borland
858 :
デフォルトの名無しさん :2001/06/16(土) 14:11
>>851 >コンポーネントとして独立させる必要は無いでしょ?
まさか。
コンポをパレットに並べたい(ぽとりぺたりするために)という欲求と
コンポを「常に」パレットに並べた(くな)い という欲求とは
全然別モノなんですよ。そこを理解できますか?
あなたの説が正しいとすると、同じことはコンポ以外にも言えるはず。
つまり、1つのプログラムの中のサブルーチンを
プログラマが自由にProcedure/Functionにする(分割する)
こともまた、駄目だってことになりますよ?
いちいちライブラリ化してProjectから追い出す必要がある、
という話になっちゃいますよ?
それ、受け入れられますか?コンポだって同じです。
>便利さとのトレードオフだと思うけど。
それ、違う。
トレードオフになっちゃうのは、たまたま今のDelphiの実装が
そういう風になっているせいに過ぎないっしょ。
Project従属コンポという概念は、どう考えても
「実装不可能」ではナイよね?
>フレームを使ったら?
フレームも悪くないけど、あれ「だけ」だと足りないんだよね。
あくまでコンポのサブセットだよあれって。
ん?そういや最近使ってないんで忘れたが、
Frameって自分でプロパティを追加できたっけか?
俺ぁ他のコンポへのポインタをプロパティとして持たせる
(DBコンポみたいな感じで)のが好きなんだが…
あと細かい話だけどFrameがWinControlっていうか
OSに直接認知されるObjectっていうか
Java畑でいうところの重量コンポーネントなので、
リソース食いすぎるという悩みも。
こないだFrame作って
いい気になってInstanceを100枚くらい貼ったら
win9xで動かなくなった(藁
まぁこの話はVCL全体のアーキテクチャの問題なんで
自作コンポの話とはちょっとズレルけど。
delphiの設計時コンポーネントパッケージって Projectごとに取捨選択できないのか?
コンポーネント(のソース/DCU/パッケージ)の所在pathを delphiの設定画面の一箇所で集約的に書かないとならない。 あの設計だと、プロジェクトごとに分散するという構成は とりにくいと思われ。 直せ。きぼん>某陸 それからこの案で特許取るなよ(藁)>某陸
861 :
デフォルトの名無しさん :2001/06/16(土) 14:21
糞VCの、「プロジェクト間の依存関係」という考え方は よかったと思う。 VCLコンポ自作の場合、その自作自体がプロジェクトにはならず ソースが単体で存在するだけだよね。 あれやめて、VCLもProjectにするようにして、 VCみたいに依存関係を設定できるようにする、と、 きっと開発デバッグとかも楽になると思われ。 トレース実行が依存関係に基づいて隣のProjまで 飛んで行ってくれたりするし。 で、依存関係といっても一対多じゃなくて多対多にすると 幸せになると思う。コンポProjとアプリProjが 互いに複数どうしの依存関係を持つっていう。 幸いにしてコンポとアプリの依存関係は一方通行だから、 アプリ側を関係の終端とすることで、循環依存とかの問題は 解決できるんじゃないかと。
862 :
デフォルトの名無しさん :2001/06/16(土) 15:00
>>861 なんかいろんな事をぶちまけているので主張が読みとりづらいが
>トレース実行が依存関係に基づいて隣のProjまで飛んで行ってくれたりするし。
これ、当たり前にできるでしょ?
コンポーネントもパッケージという形のプロジェクトなんだが。
みんな同じところで不便に思ってるもんだなあ。ほっとしたような(スンナ つーわけで、Borland様お頼み申し上げます。 C#がネェティブコンパイルできたらそっちにうつっちゃうよぉー。
... しかし某MLなんかより、よっぽど建設的な意見が並ぶやね。
>864 あそこはただの人工無能搭載FAQ検索エンジンだよ 知らなかった?
867 :
デフォルトの名無しさん :2001/06/16(土) 15:27
IDE に登録されているパッケージ(のリスト)は IDE 全体で一つなので 入れたり抜いたりはグローバルな動きをしますが、どのパッケージを使うか はプロジェクト単位でコントロールできますから、たとえば Project1 は Pack1.bpl の TButtonX をつかい Project2 は Pack2.bpl の TButtonX を 使う事ができます。 ってことではだめ?
>>863 >C#がネェティブコンパイルできたらそっちにうつっちゃうよぉー。
そのころにゃ CLR で動く Delphi があるんだろうよ。
870 :
デフォルトの名無しさん :2001/06/17(日) 17:59
OpenToolsAPIの詳しくてわかりやすい解説ないですかage
871 :
デフォルトの名無しさん :2001/06/17(日) 18:32
Delphiってもう新バージョンが出ないって本当でしょうか? VCかBCBをやったほうがいいのでしょうか?
>>871 がいしゅつ。
せめて検索掛けようね?
お馬鹿さんじゃないんだからさ。
>>871 よくこの話題でるけどさ、ソースどこよ?(w
874 :
名無しのDelphi使い :2001/06/17(日) 22:47
>869 うちの会社の仕事は半分くらいはDelオンリーだから 自分がそのチームに回されたら、たっぷり向こう1年くらいは 「Delのみで飯食う」状態になるね。俺も何度もそのプロジェクト (のサブプロジェクト)に居たんで、該当する。 ちなみにそれ以外はUnixが多いかな。Linux+Kylixの出番が 来るかどうかはかなり怪しいけど、CUIも嫌いじゃないから、いいや。 むしろGUIでもVBやらされる(以前はそういう仕事もあった)よりは ずっとマシだし。 個人的な好みだが、Delのみで飯食うとなると、やっぱり しばらく後には自力でComponent書くくらいになって欲しいな。 BOCだかなんだかにお世話にならずに済むわけだわな。 安上がりだしスキルも上がるし。いいことづくめ。わーい。
>>875 ちょっと気になるんですが…
Del厨房なリアル工房なので愚問とは思いつつ質問
させてください。
コンポーネント作るのにも難易度あると思うんだけど、
どの程度まれ作れれば大丈夫なのでしょうか?
目的にマッチしたメッセージハンドラとかを作って
プロパティ化、イベント化する程度でも大丈夫で
しょうか?
>>876 その程度の事はマニュアルに載っているのだけれども。
>>875 >うちの会社の仕事は半分くらいはDelオンリーだから
ほんとにそんな会社があるの?
あ、「半分くらいはDelオンリー」がポイントかな?
社員二人とか?
>>879 Delphi を貶めることが生き甲斐ですか?
882 :
turbo type D :2001/06/18(月) 10:08
>>880 相手にしない方がいいんじゃない?
>>876 とりあえず、そこまでわかれば
人の作ったコンポのソースが
読めるようになるので、よろしいのじゃないでしょうか。
マニアルには載ってるけどコンポ作成が出来ない
Del使いってのも沢山いらっしゃるでしょう。実際。
>>867 ユーザーフレンドリーではないような気が....
883 :
デフォルトの名無しさん :2001/06/18(月) 11:54
delphiがもうバージョンアップされないという話は本当なのでしょうか? VCかdelphiをやろうか迷っているのですが
884 :
名無しさん :2001/06/18(月) 12:36
>>883 (゚Д゚)ハァ?
そういう話は聞いたことがありません。
とでも答えたらいいんでしょうか?
>>876 です。
>>882 氏
なるほど、ありがとうございます。
人のソースを読むことももっと勉強して置いて
損はなさそうですね。
もっと精進しておきます。
>>883 の様な愚問(wが多いので、
次のスレを建てるときは
>>1 か
>>2 あたりに
FAQとして入れておくのはどうでしょう?
delphiがもうバージョンアップされないという話は本当なのでしょうか? VCかdelphiをやろうか迷っているのですが
>>888 あなたの会話の中味はこれ以上バージョンアップされないという話は本当なのでしょうか?
890 :
883 :2001/06/18(月) 15:50
どうしてdelphi使いの人は不親切なのでしょうか? ただ知りたかっただけなのに.....
はぁ? みんな親切です。 マジレスしちまった(ぉ
>>882 >ユーザーフレンドリーではないような気が....
文章で書くとめんどくさそうに聞こえるけど実際にやってみればわかるよ。
デフォルトのプロジェクトはほんとに最低限のコンポーネントしか
現れないようにして、必要に応じて追加していけばらくちん。
プロジェクトごとにユニット検索パスも変更できるし。
そりゃ、同名のユニット、パッケージをまぜこぜにするのはつらいけど
現状で不満はないが。
893 :
デフォルトの名無しさん :2001/06/18(月) 18:01
>>881 >>882 つい反応しちゃった,すまんこってす.
話を変えて,ショートカットキーで判らんことがあるんだけど,
`Ctrl+/' はショートカットキーとして無効なんすかね.
TMenuItem.ShortCut に割り当てても OnClick が呼ばれないんすよ.
これは Windows と,Delphi のどちらの仕様なんでしょう.
話題の,OpenToolsAPI でアンドゥに割り当てたかったんですけどね.
>>893 できるけど?すっぴんのフォームでやってみな。
897 :
D使いβ :2001/06/18(月) 20:51
>>896 俺もスラッシュだけは出来ない。他にセミコロンも駄目だった。
カンマやピリオドでは出来た。
キーボードが旧PC98のせいかなあ?
898 :
デフォルトの名無しさん :2001/06/18(月) 21:53
>>897 NEC98 キーボードでもできるけど?
----
Form に HotKey1, Memo1, Menu アイテムとして N1 をおいて
HotKey の OnChange に
N11.ShortCut := HotKey1.HotKey
MenuItem の OnClick に
Memo1.Lines.Add('test')
とやって、実行時に CTRL-/ を指定してみたら?
それでうまくいったら、プログラムに何かある。
それもだめならきっと OS に。
あ、ShortCutプロパティに'Ctrl+/'って直書きしてました。 そのせいかあ?
おれんとこはそれ(直書き)でも動くけど?
会社のPC98 NT4.0では駄目だったけど 自宅のDOSV Win95ではうまく行った??? あ、900行っちゃったね。次はしばらく相談室1本で行く?
Delphi 専用の空間とか作れないのかな。さすがに閑古鳥かな。 ボーランドも、ニュースサーバーなんかやめて、2チャンネル風のユーザーインターフェースを 持った Web 会議室を作ると面白いかな? どうせ、匿名性という点ではメール、ニュースも似たもんだし。
>>898 の通りやってみたけどやっぱ駄目.
最後の手段かと RegisterHotKey で試してみた.
procedure TForm1.FormCreate(Sender: TObject);
var
key: Word;
shift: TShiftState;
begin
ShortCutToKey(TextToShortCut('Ctrl+/'), key, shift);
if not RegisterHotKey(Handle, $00FF, MOD_CONTROL, key) then
ShowMessage('fail');
end;
procedure TForm1.Hotkey(var H: TWMHotkey); (* message WM_HOTKEY; *)
begin
ShowMessage('on Hotkey');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, $00FF);
end;
これも駄目.キーボードか,Windows の問題かな?
一応環境,
DOS/V
OS WinNT 4.0
Keyboard PFU HHK Lite
904 :
デフォルトの名無しさん :2001/06/19(火) 20:05
>Delphi 専用の空間とか作れないのかな。 作っちゃえばいいじゃん。 monazilla掲示板みたいなのただでできるんでしょ。 さびれたって誰も損しないだろうし。
専用空間だったら2chじゃなくてもいいのに(ワラ 2chで他の言語とも気軽に交流できる所がよいと思われ。 気軽過ぎてVBと争う事もしばしば? あとーーー Dマガの中村氏、髪伸ばしすぎだよ。 記事はinterfaceについてわかり易くてよいです。 ただinterface、っつう仕様が物事を複雑化しようと するような方向であまり好きじゃない。 駄文だ............ウツ....