1 :
デフォルトの名無しさん :
04/02/13 03:14
「くだすれ」に戻したのか.... 戻したかったんだね... ま、俺はスレに関係なくコメント/回答をつけるからいいけど。
Thread.Terminate;
6 :
デフォルトの名無しさん :04/02/13 04:19
Thread.WaitFor; Thread.Free; Thread:=TThread.Create(False);
かぶった… TThreadは抽象クラスだし(´・ω・`)ショボーン
mutex使わないから重複するんだよ
・煽り荒らし騙りは放置しましょう。 超初心者向けなんだからさ。普通に使おうよ。
先に1000取ったほうが正当な後継すれということでFA?
リンク張り忘れたので失格 *** 終 了 ***
12 :
デフォルトの名無しさん :04/02/13 09:36
キー入力待ちの状態(アイドル)から処理中になった場合、ある一定時間のうちに アイドル状態にならなかったら、キャンセルボタン付きのメッセージのフォームを出したいのですが、 どのようにしたらいいのでしょうか?
13 :
ずぶしろうと :04/02/13 09:45
>>7 別に、TThreadを継承したクラスのインスタンス変数名に"Thread"と命名した、と
考えれば矛盾はないけど・・・判りにくいな。
18 :
ずぶしろうと :04/02/13 09:57
19 :
デフォルトの名無しさん :04/02/13 09:58
フォームを開いたときに、フォーカスをセットしたいのですが、どこに記述すればいいのでしょうか?
あ、フォームじゃなくてフレームでした。
23 :
ずぶしろうと :04/02/13 11:22
打ち込み作業がラクチンになるエディタは sakuraエディタが一番なんでしょうか?
エディタは好みだからなんとも言えないのでは。 漏れはDelのエディタで十分だけど。 開発環境以外では秀丸つかってるが。
印刷部分を作る時、今はQuickReportじゃなくて、RaveReportでするのがいいのかな? 文字化けとかよくきくけど、ここの方はRave派?それともQuickReport派?それともその他?
27 :
デフォルトの名無しさん :04/02/13 15:55
TPrinterしか使ったことない・・・
フリーコンポーネントに手を加えて改良して使ってるんですが 改良中、急に挙動が変になったのでそのファイルを破棄して バックアップしてある正常に動いていたファイルに戻したのですが何故か元に戻りません。 コンポーネントの削除等したのですが変なままです。 こんな事ってあるのでしょうか? そういえば前にもなったような気がします。そのときは多分DEL再インスコしました。
パッケージ切り離せ
改良
なんか「優しくコメント」って感じじゃなくなってきたね
重複で少し殺伐とした空気になったから
今まで「デルフィ」と思っていました。 「デルファイ」なんですね。
緊急事態用のHDDに入っているOSとdelphiで試してみました。 完全に前の時とはOSもdelも別物のはずなのでまともに動くはず・・・ 何故か同じ症状・・・もはや呪としか思えん
プロジェクト再構築してみれ
いや、呪じゃ無かったよ、たぶん。 現存のexeも別マシンでもみんななってる。 コンポの問題のようですた。 失礼おば
それは日付関係のやつで、今日あたりにたまたま発生するバグのようです。 あーつかれた
日付?Half2038年問題?TDateTimeは関係ないような気が・・・
39 :
デフォルトの名無しさん :04/02/13 23:16
スレたてる前に「これから新スレたてます!」と宣言すればいい。
40 :
デフォルトの名無しさん :04/02/13 23:19
これから新スレたてます!
あれ?せっかくタイトルを統一したのに何でくだすれに戻すわけ?
>>1 おまえは関数や変数宣言するときに適当に名前つけるのか?
プログラマに向いてないからやめちまえ!
誘導し忘れてスマンカッタ。
>>43 > 何でくだすれに戻すわけ?
過去ログからコピペしたんで、深い意味はないですよ…
> おまえは関数や変数宣言するときに適当に名前つけるのか?
整数はiとかnとか。適当かも?
integer「オレにiって付けるの、よせよー!」 string「そうそう。sってなんだよ!」
>>44 >過去ログからコピペしたんで、深い意味はないですよ…
おまえは継承したクラス作るときに深い意味を考えずに適当に継承先見つけるのか?
関数「hogeって何だよ!hogeって!」
ttp://heim.ifi.uio.no/~mortehu/files.txt 4133 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/ddemlsvr.c
1536 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/ddemlsvr.h
77805 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/ddetrack.c
4172 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/debug.c
172841 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/desktop.c
51 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/dirs
12953 07-26-00 22:00 win2k/private/ntos/w32/ntuser/kernel/dragdrop.c
本物なのかな?
49 :
デフォルトの名無しさん :04/02/14 15:46
age
>>43 プログラマ以前に人間なので、ソースコード以外では必要以上の合理性は
求めませんが何か?
TEditの文字列を全角スペースや半角スペースを区切り文字と見なして語句ごとに分割するのはどうするんでしょうか? DelimitedTextでDelimiter:Char;に複数の文字指定できませんし(できるなら教えてください そもそも2バイト文字は無理だし 正規表現を使うしかないんでしょうか?
52 :
デフォルトの名無しさん :04/02/14 19:17
URLの半角スペースを%20とかにするエスケープは Delではどうすればよいでしょうか。
var c: Char; s: String; c := ' '; s := '%'+IntToHex(Ord(c),2);
54 :
デフォルトの名無しさん :04/02/14 21:25
Delphiでa^(b/c)とかを計算するにはどうすればいいの? べき乗の使い方を教えてください。
exp?
RichEdit1.SelAttributes.Style := [fsBold]; とすると [エラー] Unit1.pas(78): 未定義の識別子 : 'fsBold' になってしまいます。 選択部分のスタイルを変更するにはどうすればいいのですか?
>>57 ウチでは通るよ。
Graphics を uses してる?
>>59 Graphics を uses したら通りました。
どうもありがとう御座います。
「それはe^n」 「知ってますが、」
>>63 Powerで事足りるし、ExpならLnも必要だし、
>>54 の質問に対する回答ならPowerが適切だと
思いますが、何か問題がありますか?
>>64 昔のDelphiのStandard版(現在のPersonal版)では、Mathユニットが無かったから、
対数表で対数を二回引いて、計算尺で足し算して、対数表で二回指数を調べてたんだよ。
>>65 Pro版しか使ったことがなく、Std版にMathがなかったのは知ってましたが
それは知りませんでした。
計算尺は部屋のどこかにあるはずだけど、使ったことないし。
>>67 >>60 のリンク先には、計算尺だの対数表だのとは書いてないと
思うけど、どこのリンク先ですか?
>>68 洒落が通じない奴だな…
>>65 は下半分はジョークですよ。
ちなみにカキコしてから気づいたのですが、計算尺は乗算をする道具なんで、
対数表は一回だけ使えば十分でした。
計算尺が無いときは、基数は二回、指数は一回対数表を引いて、算盤で加算を・・・
つーか、対数表なんて最近の人間は知らないのかな?
計算ツールとしてのマニアック度は
電卓<算盤<<<計算尺<<対数表<手回し計算機
だからなぁ・・・
>>69 >>65 ≠67だと思ったから
>>68 でマジレスしたんだけど・・・。
計算尺は転職した時に初めて一緒に仕事をした人にもらった。
対数表はそういうものがあるということだけ知ってる。
タイガー計算機が有名だということは知ってるけど実物は
みたことない。
例外処理について質問があります。 特定のブロック内での例外処理は、try...finally...endやtry...except...endで できますが、プログラム全体にわたる例外処理はどのようにすればよいのでしょう? 具体的には、たとえば、プログラム全体で使うメモリストリームがある場合、 グローバル変数としてvar MStream:TMemoryStream;と宣言し、 フォームのOnCreateでメモリストリームのコンストラクタを呼び、 フォームのOnDestroyでメモリストリームのデストラクタを呼ぶような場合、 プログラムの中でいつ何どき例外が発生しても、MStream.Freeを呼ぶように したい場合、どのようにすればよいのでしょうか・・・? 当然、複数のブロックにまたがってしまうので、try...finally...endは 使えないと思います... initialization・finalizationを使うのかなあとも思ったのですが、 ヘルプを読んでも、これらのブロックが例外処理として実行されるような ことは書かれていなかったので・・・。 どなたかご存知の方、よろしくお願いします!
>グローバル変数としてvar MStream:TMemoryStream;と宣言し、 >フォームのOnCreateでメモリストリームのコンストラクタを呼び、 そのフォームのインスタンスを2個作ると、有効なメモリストリームのアドレスを 上書きしますよ。 フォーム一つにつき一つのインスタンスを持つなら、フォームのフィールド変数に ストリームを持たせて、プログラム一つにつき一つのインスタンスとするなら、 initialization・finalizationでストリームの生成、破棄をすべきでしょう。 で、問題解決ですけど、Forms.pasのメッセージループの所を書き換えないと 無理なのでは・・・? 多分設計変更すべきだと思うけど・・・
>特定のブロック内での例外処理は、try...finally...endやtry...except...endで try...finally...endでは例外処理はできません。 というか、try...except...end は例外処理のためだけに存在しますが、 try...finally...end は例外対策のためだけに存在するのではありません。
74 :
デフォルトの名無しさん :04/02/15 08:03
>>71 確か、Application.OnExceptionだっとおもう。
> try...finally...end は例外対策のためだけに存在するのではありません。 例外対策以外になんにつかうって言うんだ?w
こんな使い方もあるよ。 Screen.Curosr := crHourGlass; try ... // 重い処理 if Foo then Exit; // 処理を中断 ... finally Screen.Cursor := crDefault; // Exitしてもしなくても実行される。 end;
>>76 別に、重い処理じゃなくてもいいような気が・・・
つーか、俺はいつ自分が気まぐれを起こしてBreakとかExitとか呼んでも開放し忘れの
無いようにfinally節は書いているが。
特に、Threadでは、どこに "if Terminated then Exit;" と書いても安全に停止できる
ように書くのは重要だと思う。
>生成された例外がfinally で処理されない場合,その例外はtry...finally 文を >越えて伝わり,try 節で既に生成されている例外は失われます。したがって,ほかの >例外の伝播の妨げにならないよう,ローカルに生成された例外はすべてfinally 節で >処理するようにしてください。 なんでDelphiのヘルプにはこんな間違いが堂々と記述されているんだろ??
なるほど...よく理解できました。 また、finallyは例外対策以外にも使えると初めて知って、とても参考になりました。 本当にありがとうございました!
80 :
デフォルトの名無しさん :04/02/15 14:25
delphiでWindowsを再起動するにはどのようにすればよいのでしょうか?
82 :
デフォルトの名無しさん :04/02/15 14:47
メインのUNIT内でサブのUNITにあるオブジェクトをクリエイトで生成した場合 メインで破棄しないといけませんが サブのUNIT内で更に別UNITを生成した場合 サブを破棄すればそれらも全部破棄されますか? それとも破棄するための手順が何か必要ですか?
設計をやり直せ。無茶にもほどがある。
ラジャー
>サブのUNIT内で更に別UNITを生成した場合 >サブを破棄すればそれらも全部破棄されますか? >それとも破棄するための手順が何か必要ですか? 「UNITを生成」の意味がわかりませんが・・・
UNIT1をメイン BORDUNITをサブ CPUAIUNITを更にまた下として UNIT内で、BORDUNITの宣言にあるオブジェクトをクリエイト。 PLAYUNIT内のプロシージャでCPUAIUNITのオブジェクトをクリエイト という具合です。 複数の盤面とそれに対応するCPUを別UNITで作りたかったのですが やっぱり設計を変えたほうが良さそうですね。
カキミス UNIT内で、BORDUNITの宣言にあるオブジェクトをクリエイト。 BORDUNIT内のプロシージャでCPUAIUNITのオブジェクトをクリエイト という具合です。
オレも思った。
スペルが間違ってるな
各種クラスインスタンスはTGameApplicationで一括して生成して その参照を必要なオブジェクトに渡すようにするとか。
>メインのUNIT内でサブのUNITにあるオブジェクトをクリエイトで生成した場合 >メインで破棄しないといけませんが そもそも、こういう決まりが存在するのか?
ないだろ
しかし、OnCreateで生成したらOnDestroyで、constructorで生成したらdestructorで、 initializationで生成したらfinalizationで開放するのが望ましい。 思いついたところで開放したり生成したりしていると破綻する。
TPopupMenuについて質問。 タスクトレイにアイコンを表示し、それを右クリックでポップアップした場合、 普通ポップアップメニュー以外の場所をクリックすればポップアップメニューは消えますが、 消えずに残ってしまいます。(画面上にゴミが残るのではなくウィンドウが消失しません) 右クリックを感知したら GetCursorPos(Point); PopupMenu1.Popup(Point.X,Point.Y); としているのですが、きれいな動作をさせる為には他に何か必要なのですか?
SetForegroundWindow(Handle); GetCursorPos(Point); PopupMenu1.Popup(Point.X,Point.Y);
レビュー嫁
>>99 レビュー読んで買って失敗したことあるんす
関係者とかが印象よくするために捏造してることとかがあって・・・
買ってみたら酷い本で8000円損してしまった
>>98 巧く動いてくれました。
ありがとう御座います。
>>97 駄目駄目。金の無駄だから買わないほうがいい。
>>104 金の無駄ですか・・・
では、もうちょっとネット上のDelphi関連サイトで勉強してから、
何らかのリファレンス本を購入するかどうか考えることにします。
ども。
106 :
デフォルトの名無しさん :04/02/15 23:44
Delphiを覚えたいのですけど、本自体少ないし いったいどういう手順で覚えればいいのかさっぱりわかりません。 ヘルプもVBのように簡単ではないし・・・ これから学習していくうえでの参考にしたいので教えてほしいの ですが、皆さんは基本構文とかアクティブXの使い方とか どうやって覚えたのでしょうか?
webで
108 :
デフォルトの名無しさん :04/02/15 23:51
>>105 無駄っつーか、「色々分かるようになった頃」には
多分「別に買わんでも良かったかなー…」って思うようになってるかも。
オレは「オフィシャルコース」買ったけど、そう思ってる(藁
TIPS本なんてのは、何冊買っても無駄にはならないかと。
ネタが被ってなければ。
>>106 何度も書いてるけど、「自分の欲しいツールなどを作ってみる」。
で、分からないことが出てくるから検索する。
これの繰り返し。
>>108 ご意見ありがとうございました。
たいへん参考になりました。感謝。
110 :
デフォルトの名無しさん :04/02/15 23:54
複数のフォームで同じ変数を扱いたいのですが どこ変数宣言に書けばいいんでしょうか?
DataModule
>>109 いや、感謝されるほど大したこと書いてないけど(^^;。
図書館利用も有効だやね。金使いたくなければ。
そこそこあるもんだよ。あるっつっても、1館1冊くらいだろうけど。
>無駄っつーか、「色々分かるようになった頃」には
>多分「別に買わんでも良かったかなー…」って思うようになってるかも。
レファレンス本は必要です。いろいろ分かるようになるためにも。
>>97 の本はよい本です。超初心者には最適です。VCL 全体をざっと眺めて見通しよく
するためにもよい本だと思います。「無駄だ」と感じることができるようになるためにも。
> TIPS本なんてのは、何冊買っても無駄にはならないかと。
これこそ無駄。WEB で検索した方が100倍まし。
WEB でも優れた入門サイトはあるよ。どこかにリンクがあったような。
>>106 personalだったので付属のPDFのドキュメント
115 :
デフォルトの名無しさん :04/02/16 00:26
106です。どうもありがとうございます。 こうしてみるとWEBで検索が一番多いようですね。 なんか感心してしまう・・・VBの次に簡単っていうイメージが あるけど果たして自分にできるのだろうか・・・
煽りじゃなくVBやってりゃいいじゃん。 今から乗り換えるメリットはかなり少ないぞ。
117 :
デフォルトの名無しさん :04/02/16 01:22
>>116 煽りじゃないですよ。
自分のキャパが簡単なのしか受け付けてくれないから
「できるだけ簡単なのを」っていう意味です。
※お馬鹿な私からしたら「言語」は思いっきり難しいです。
メリットは以下を考えています。
★VBと比べて
・実行速度が早いって聞いたので・・・
・ランタイムいらないし・・
・無料だし・・・
★将来性について
・netはPerlが少しできるので今のところ必要性を感じない。
・趣味程度なので大規模なコードは組まない。
>>115 の
なんか感心してしまうっていうのは
釣りでも煽りでもなく本気でそう思ってます^^;
よくフリーソフトとかでDelphi使ってますってありますよね。
そういう人達って実際、少ない資料の中で覚えていった
わけですよね。なかなか凄くないですか?
>>116 の「煽りじゃなく」ってのは、
「オレの、このレスは煽りじゃなくて」って意味だと思うがどーか。
120 :
デフォルトの名無しさん :04/02/16 01:36
123 :
デフォルトの名無しさん :04/02/16 09:08
>>123 さらにそのスタッフロールの視点を十字キーで動かせる。
Use the Source, Lukeって隠しメッセージもある。
125 :
デフォルトの名無しさん :04/02/16 17:27
126 :
デフォルトの名無しさん :04/02/16 18:27
変換したほうが無難と思われ。
テキストボックスから入力した数字をLavel.Captionに表示するのに、 例えば、iを2倍したのを表示するとすると e1 := Edit1.Text; i1:=strtoint(e1); i1:=i1*2; e1:=inttostr(i1); いちいちstringに変換しないとだめなのはどうしようもないんでしょうか?
128 :
デフォルトの名無しさん :04/02/16 19:03
あたりまえ
融通きかん言語ですね ソースだらだら。。。
>>127 Label1.Caption := Variant(Edit1.Text) * 2;
> 融通きかん言語ですね ははははは、おまいはセンスなさすぎ。 融通きく言語に乗り換えることをつよくすすめるよ。
>>129 ストロングタイピングだからね。
不満ならVBにすることだね。
ちなみにC/C++はもっと融通が利かないから
近づいちゃ駄目だよ。
>>132 スマソ。ストロング・タイピングてなに?
ぐぐったけど分からんかった。
>>133 タイプってキー入力のことじゃなくて、型のことだぞ。
強い人が好き・・・
>>134 ごめん、それでもわからないや。
ググッたら下のような記述があるから言語関係の言葉なんだろうけど・・・おせーてください。
Python と Java
Java は、あらゆるタイプ、スレッド・サポート、ストロング・タイピング、および必要とされるその他の機能を網羅している、フル機能プログラム言語です。Python はスクリプト言語です。
>>133 型チェックが厳しいということさーね。
曖昧さのないプログラムが要求されるため
コンパイルの段階で直ぐに間違いが分かるという利点がある。
VBのように型チェックが緩いと実行してみないと間違いが分からない場合も出てくるでしょ。
(VBもOption Explicitを使えば大分ましになるようだけど)
あ、Option Explicitでましになるのは 「未宣言の変数をVariantとして認める」 という無茶がなくなるだけだっけ?
>>137 そうなのか、勉強になりました。ありがど。
>>140 Pascalらしいのは127の方だけど130もちゃんと動くので、まあ好き好きかと。
あとEdit1に入っている文字列が数値を表しているという保証がない場合は
StrToIntDefを使ったり、例外処理をしたりする必要があるよね。
Variantはクソ遅いからあんまり使わないほうがいいんじゃないの。
>>141 漏れPascalはじめたばっかだから
try
e1:=Edit1.Text;
i1:=StrToInt(e1);
except
i1:=-1;
end;
ってやってたよ・・・
俺自身はVariantは使わないけど、試しに書いてみたら動いたので。
>>142 確かにCOMとか以外ではほとんど使わないよね。
でもユーザーの入力に応答する処理ならたかが知れてるから、どっちでもいいかと…
あの、 Cで言う if((a==b) && (c!=d)) はどうすれば・・・ if(a=b) and (not (c=d)) でいいのでしょうか?
if(a=b) and (c<>d) でもよろし。
>>148 (not (c=d)) は (c<>d) の方がすっきりしてるけど、それでも桶
>>149 ありがとうございます。「<>」なんてあったんですね
(not (c=d)) は (c xor d = 0)でもOK c,d共に整数なら。
var内で初期化ってできないのでしょうか? n:=0 : Integer; だとエラーが出るんです・・・ それと、 n=m=k=0;(n,m,kに0を代入)ってのはどうすればいいでしょうか? n:=m:=k:=0; ではできなくて・・・ Delphi難しいです。。
>>154 グローバル変数以外では初期化は無理。
残念ながら逐一書いてください。
まとめて代入も無理。
残念ながら逐一書いてください。
長らくPascalに触れているけど、やはり面倒に感じることが多い点ではあるな・・・
ただ、代入演算子が値を返すと、とんでもなく可読性の悪いコードが書けてしまうから、
これはこれでいいのかも。
>>155 そうですか、ありがとうございます。
Cを1年やってるのでDelphiは不慣れな部分が多そうです。。。
ともあれがんばってみます。
∩( ´Α`)< 先生、pasとかdprとかプロジェクトとか、ファイル多すぎでよく分からないのですが、その辺の関係のこと教えてください。プロジェクト保存して、名前をつけて保存、をすれば次回からも編集の続きができるんですか?
*.dprはmain()関数がある*.cに相当。 *.pasは、それ以外の*.hと*.cが組み合わさったものに相当 (implementationより上が*.h、下が*.cに相当) ポトペタしたコンポの情報は*.dfmに保存される。 *.dcuは*.objみたいなもの。 その他の設定は*.cfgとかに保存される。
>>158 うーん、よくわからないです・・・
まずは、新規作成→アプリケーション
で作成しますよね?
そして、今日は終わり、ってときはどうするんですか?
プロジェクトを保存、すればいいんですか?
>>159 まぁそれでOKです。
プロジェクト名=dprファイル名=exeファイル名になります。
あとはプロジェクト内で、ユニットを複数持つのが普通です。
ユニット名=pasファイル名です。
最初のうちは、一つのプロジェクトのファイルは一つのフォルダに
まとめておけば、それで良いのはないでしょうか?
手の込んだことをしだすと、複数のプロジェクトで共有するpasファイルとかが
出てきますが・・・
>>160 うぉ、ありがとうございます。
名前をつけて保存→プロジェクトを保存
だったら同じ名前で保存できないとか出てこまってたんです・・
多次元配列の代入方法が分かりマセン var myarray: array[0..2] of array[0..3] of Integer; myarray[0][0]:=2; myarray[0][1]:=3; myarray[0][2]:=4; をしたいのですが myarray[0]:=(2,3,4); ではできませんでした・・・ どうしたらいいですか?
var myarray: array[0..2,0..3] of Integer; って指定できるよ。
>>165 彼が知りたいのは代入の方法らしいぞ。大丈夫か?あんた・・・
400,3の多次元なので、定数で宣言しました。。・
>>166 彼は質問に答えたつもりではないらしいぞ。大丈夫か?あんた・・・
>>126 回答ありがとうございます。
スレをずっと読んでいたのですが皆さんとても優しい方ばかりですね。
またお世話になる事があると思いますがよろしくお願いします。
ボーランドさんの方で標準の漢字コード変換ユニットを用意して欲しい ってのは、贅沢ですか? 某ユニットのサイトは閉鎖してるそーだし…。
>>172 漢字コード変換なんて、そんなに難しい作業じゃないだろ。
EUC〜SJISなら20行程度、JIS絡みでも40行程度、
半角かなを意識しても、それぞれ+20行程度で書けるよ。
後学のためにも、一度書いてみるといいと思うけど。
n := (EUC1 - $A1) * 94 + (EUC2 - $A1); SJIS1 := n div 188 + $81; if SJIS1 >= $A0 then SJIS1 := SJIS1 + $40; SJIS2 := n mod 188 + $40; if SJIS2 >= $7E then SJIS2 := SJIS2 + 1; ほい、昔書いたEUC→SJISの核の部分。EUC1とかは、EUCの日本語2バイト文字の 1バイト目に相当。 これに、文字全体をまわすループとか、アルファベットやら改行やら・・・を 意識すると、20行くらいになる。
176 :
デフォルトの名無しさん :04/02/17 08:57
>>173 変換のためにいろいろ調べないといけないのは 大変。
それに作ったものがちゃんと動くのか、すべてテストするのも大変。
自分で作るのは 大変だよ。
変換のためのルールに例外はないの? このルールってちゃんとした規格で定められているの?
こんちわ。 ちょっとおききしたいんですが、 グローバルな変数宣言はDatamodule使うと言うことになっているようですが、 単なるUnit使うのと比べてなんかメリットはあるんでしょーか。。 いままで、Unitを新規作成して、必要があれば自分でClassを書いてやってました が、このスレでDatamoduleと言うのを知ってしまい、夜も眠れませんw ヘルプを見ると非ビジュアルコンポーネントをを配置でき、自動作成に入れられる ようですが、なら非ビジュアルコンポーネントを使わずに、自分でCreate、 Destroyする場合は今まで通り、じぶんでClass作ってやってもかわらないん でしょーか。 その他にDatamoduleを使うメリットなどがあればお教えください。 ではでは
メリットといえば、ほら、あれだよ。あれ。
>>178 自前でCreateしてもいいけどプロパティとかの設定が面倒じゃね?
面倒じゃなければ好きにしとけ。
新規作成メニューから簡単に継承できる、とか。
>>178 設計中にデータを診ることができるちゅうのは、どうだい?
>>178 DataModuleって
基本的に非ビジュアルコンポーネントを使いやすくするためのものだと思ってたけどな。
非ビジュアルコンポーネントを使わないんなら必要ないんじゃない?
こんちわ。
>>179-183 いろいろご意見ありがとうございます。参考になりました。
いまいちぴんとこないところもあったりしますが、これからは、DataModuleも
使い倒していこうと思います。
使い倒していくウチに何か見えてくるだろうと思いますしね。
ではまた質問が出来たときにおじゃまいたします。
ごきげんよう
バージョンの付け方を教えてください。 マイナーとか、ビルドとか、どうすればいいのでしょうか
186 :
デフォルトの名無しさん :04/02/17 18:44
BDEで新しいエリアスを作るのを、コードから実行できないでしょうか? やりたい事は、 ユーザーがテーブルのあるフォルダを指定するだけで、 BDEに登録され、アプリから使用できるという事です。 ユーザーにBDEアドミニストレーターを起動させて、エリアスの設定をさせるのは 嫌ですし、複数のPCのネットワークフォルダを指定する必要があるので、 InstallShieldでは無理なんです。 宜しくお願いします。
>>185 プロジェクト < オプション < バージョン情報
>>185 プロジェクト>オプション(O)...
その中に「バージョン情報」ってページがあるはず。
ところで、「リポジトリ」って機能使ってる人いるの?
ケコーンしちゃった(*´Д`)
>>187 >>188 すいません、言い方悪かったです。
バージョンの付け方の、”定義”みたいなもんが知りたいです。
桁が4つあって、どうしたときはどれを数上げるとか、
バージョンを決める時の基準、インターネット関連でいうとRFCみたいな、きまりごとはないのですか?
t,s:WideStringで、sにはEUCの文字列が入っています。 for i:=1 to Length(s) do t:=t+widechar(EucToSJis(word(s[i]))); でそれっぽいかな?と思ったんですが化けてしまいます。 もしお時間ある方がいましたら、お答え頂けたら幸いです。
194 :
デフォルトの名無しさん :04/02/17 21:33
>>190 決まりはないけど、一般的に
・メジャーは、ソフトの機能ががらっと変わったときに使う
・マイナーは、ソフトの機能が多少増えたり、大バグを直したときに使う
・それより下の桁は、機能をちょこっと増減したり、小さなバグを直したときに使う
あんまし細かく考えるとバージョン管理に悩むから、3桁程度でいいと思うけどね。
気分の問題や戦略的にバージョンを上げる場合もあるし。
>>193 WideString型には、普通EUCじゃなくてUTF-16の文字列が入っているんですけど。
nkfでも使っとけ
>>195 基本的な事でしたね。すいません。。
>>196 検索で出てきたnkf32.pasを使ったらできました!ありがとうございます。
>>194 ありがとうございます。
でも、Delphiだと絶対4桁になりませんか?
>>194 何の変化もなく、
ちょこっとしたバグ修正で
1.1〜1.9まで行ったら、次はメジャーを1あげて2.0でいいんですか?
自分で作成したDLL内で宣言している集合型(Record)を EXEから使用することは可能でしょうか?
>>200 dllで、Recordの宣言を独立したUnitにして、それをexeにも取り込めば、可能。
でも、安易にRecordの構造は変更できなくなる。
cとかでexeを作るなら、Recordとまったく同一構造のstructを定義すれば可能。
>>199 ルールなんて無いと思うよ。好きにしなされ。これ以上聞くのは愚問だと(略)
>>199 1.10でもいいと思う
別に小数ではないのだし
まあ、好きにすればいいんだが
タブ文字って#9ですよね?実行した時に while (stl[1]<>' ')or(stl[1]<>#9) do Delete(stl,1,1); の文でエラーが出るようなのですが、どうしたら解決できますか?(stlはString型) 行頭の空白かタブ文字を削除したい(飛ばしたい)のです。
orじゃなくてandでしたね…スレ汚しすいません。。
not ((stl[1]=' ') or (stl[1]=#9)) 当然ながら一緒
#32と#9以外を削除するコードに見えるが…。 エラーは文字が無いからでしょ。
#32以外、もしくは#9以外だから、結局全部削除か・・・。
copy(stl,1,1)
Length(str)>0の時はどうなるの? いずれ、str[1]=#0 になるけど、これも Delete 出来るのかな?
Length(stl)=0 なら Deleteされないが、 少なくとも範囲チェックが有効なら stl[1] でエラーになる。
>>208 あはは…そんな便利な関数があるとは。ちょっとショックです。
便利なのに知らないっていう関数が多くて。
>>209 あはは…その通りでした。道理で変な空白が…
>>186 Borland Database Engine オンラインリファレンス
└ BDE関数リファレンス
└ 環境関数
└ DbiAddAlias
uses に Bde を追加すると BDE関数が使えるようになります。
Socketで文字列をやりとりしたいのですが その時に文字列を転送時だけ圧縮したような状態に できないのでしょうか・・・ Packed recordとか近い気がするのですが 圧縮されている状態を取り出せないみたいなので・・・
>>216 packedはメモリ上の圧縮で、そういうことは出来ないんじゃないかと
想像してみる。
もしやるとしたら、ポインタとサイズ(これができるかどうか不明)を
取得して圧縮データを得てSocketで転送。受信側でも同様にその
構造体に対してデータを入れてやるとか?←できるかどうか不明
それより、1回の送信(DelphiのTIdTCPServer等で指定する送信
サイズ)ごと、または一つのまとまりのデータ(送信すべきデータ
すべて)ごとTMemoryStreamに格納し、自作の圧縮コンポで圧縮後に
送信、受信側ではそれを解凍すればいいかと。
フローとしては、
送るべきデータ→一括して圧縮→数kバイトずつ取り出して送信
すべての圧縮データ受信→一括して解凍→受信データ
または
送るべきデータ→数kバイトずつ取り出す→その数kを圧縮→送信
データ受信→解凍→解凍したデータを追加格納していく→受信データ
圧縮についてはDSPのCompression、Encryptionあたりにたくさん
あるので、みてみるといいかも。
>>218 返事ありがとうございます
>圧縮についてはDSPのCompression、Encryptionあたりにたくさん
>あるので、みてみるといいかも。
やはりZIPやLZH形式が大半で・・・ (´Д`υ)
独自ロジックで圧縮してる人いないのかな・・・
>>219 なんでZipやLzhじゃだめなのかと小一時間
つか、こんなんあったよ
TCompressionStream
TIdCompressionIntercept
TIdConnectionIntercept
すいません ミスしてあげてました /_;) >>なんでZipやLzhじゃだめなのかと小一時間 Zip、Lzhでも問題ないのですが配布時に別にDLLをつけないと いけなくなると嫌だなと思ったもので・・・ わざわざコンポーネントまで調べてもらって (TдT)/ ありがとうございます 早速、TCompressionStream から調べてみます
あーまた上げてる・・・ (TдT)すいません・・・
cabならWindows標準でDLLありそーだから、
それでもいけるかも。
>>223 不用謝
procedure TForm1.Timer1Timer(Sender: TObject); begin Iconno:=Iconno+1; if Iconno >= 3 then Iconno:=0; SpinEdit1.Value := Iconno; // test case Iconno of 0 : Form1.ImageList1.Draw(Image1.Canvas,1,1,0); 1 : Form1.ImageList1.Draw(Image1.Canvas,1,50,1); 2 : Form1.ImageList1.Draw(Image1.Canvas,1,100,2); end; end; とするとSpinEditは0 1 2 0 1 2 と変わるのにアイコンは最初から 2 : Form1.ImageList1.Draw(Image1.Canvas,1,100,2);が表示されて止まってます。 どうすれば〜
Refreshしてみたら? ていうか最近描画関連の話題多いな 描画イベントの中にコード書けばいい
重複スレのほうに書いてしまったのでこちらに書き直します 自分のオブジェクト名がNameプロパティと違う場合ってどういう場合が考えられますか? プロシージャのパラメータとしてSelf.Nameを渡していたら挙動がおかしかったので ブレイクポイントを設定してSelf.Nameを確認したらXX(名前)_1とかって入っていたのですが・・・
>>227 動的(実行中)にオブジェクトのインスタンスを作成した場合とか。勝手に番号が振られる。
×勝手に番号が振られる。 ○この場合Nameプロパティは空
230 :
デフォルトの名無しさん :04/02/19 01:02
ちょいと助けておくれよ。Memo4には6行入っててそれをMemo3にまるまる移したいんだけども、 Memo3.Clear; for i:=0 to Memo4.Lines.Count do Memo3.Lines[i]:=Memo4.Lines[i]; showmessage('Memo4は'+IntToStr(Memo4.Lines.Count)+'行あるよ'); showmessage('Memo3は'+IntToStr(Memo3.Lines.Count)+'行あるよ'); ってやるとMemo3は1行しかないらしいんだ。Memo4は6行あるんだけども。 Memo3:=Memo4; ってやるとその後Memo3を書きかえるとMemo4が変わっちゃうんだ。 基本的な事かもしんないけどわかんないんだ。解決策を聞かせておくれよ。
>>230 Delphiのオブジェクト変数は、実はポインタなンだ。
よってMemo3=Memo4をやると、Memo3が指し示すオブジェクトはMemo4の物になるンだ。
Memo4の内容をMemo3にコピーするには、Assignというメソッドを使い、
Memo3.Assign(Memo4)とやる必要があるンだッ!
232 :
デフォルトの名無しさん :04/02/19 01:13
233 :
デフォルトの名無しさん :04/02/19 01:14
>>233 ほんでもって、お前は池上遼一か、それともガフガリオンか?
(1)↓たぶん何か足りない Memo3.Lines.Add(Memo4.Lines[i]) (2)単純なの Memo3.Text := Memo4.Text;
>>231 せんきゅう!
でも'TMemoをTMemoに代入する事はできません'風なエラー出たぞ!
>>235 蝶センキュー!
単純なのでできた!
あと俺をジョニー呼ばわりするな!てか誰だ?
>>230 Indexなんたらエラーが出るはずだが。
>>234 オブジェクトブラウザってもうついていないの?
>>230 大人なんだから、敬語使ってください。
大人じゃないんだったら、寝なさい。
>>238 申し訳ありませんでした。反省してます。
>>237 レスありがとうございまし
もう好奇心より眠気が勝ってきたので起きたら使い方調べてみます。
オブジェクト・インスペクタとは別物ですよね?
241 :
デフォルトの名無しさん :04/02/19 01:52
>>230 Memo3.Lines.Text := Memo4.Lines.Text;
とか。
>>234 ロシア語読めば、詳しく載っているんだが...
翻訳ソフト/サービスを使いなさい
245 :
重複スレの44 :04/02/19 09:01
テキストエディタからソースをカット&コピーしたらソースが result:=false; filename:=ChangeFileExt(application.exename,'.ini'); selfini:= TIniFile.Create(filename); と言うように1行おきに書いているのにF8でステップ実行させると 空白行も実行したり中身がある行を飛ばしたりしてしまいます。 これを元に戻す方法を教えていただけないでしょうか。 [プロジェクト]-[オプション]-[コンパイラ]-[最適化]のチェックボックスをクリア。 をやってみたのですが、それでも変わりません。 ソースに@@@等と書いてもえらーになりません。
テキストデータを保存する時に、保存した物を直接テキストエディタ で見られたくないのですが、どうすればいいか教えて下さい。 TFileStreamとか型無しファイル形式での保存とかやってみたのですが、 エディタで開くと普通にデータが読めてしまうので、どうしたらよいのでしょう?
>>245 重複スレを見ましたが、デレクトリーの中にあるdskファイルを
削除してからコンパイルするとどうなるか。。。
>>246 簡単な暗号化をしてみれば?
シーザー暗号とかバーナム暗号とか。
>>248 レスありがとうございます。
あ、暗号ですか?
もちっと簡単なのないですか?
簡単な暗号化なら、そんなに難しくないが・・・ソースも公開されてるし、 作っておくと便利。 イヤなら、上の方ででてた圧縮するのを利用してみたり、データをビット シフトしてスクランブルかければいいんでないのかねぇ。 暗号、VCL、Delphi、スクランブルの組み合わせで検索すべし。
>>249 わざわざ簡単な暗号まで書いたのに・・・。
了解しました。 暗号という言葉に、びびりました。 ぐぐってきます。
253 :
デフォルトの名無しさん :04/02/19 11:54
SynchronizeってExecute内でしか使えないんでしたっけ? でも、そうなると、Execute関数がすごくながーくなって不便じゃないですか? 普通はどうやってこの問題を回避するんでしょうか?
>>253 まず自分でコードを書いてみてください。
たぶん勘違いをしてるのではないかと。
>>254 下記を実行したらDelphi自体が死亡しました。
procedure TTestThread.Execute;
begin
{ ToDo : スレッドとして実行したいコードをこの下に記述してください }
while not terminated do begin
Method;
Suspended := true;
end;
end;
procedure TTestThread.Method;
begin
Synchronize(Method_1);
end;
procedure TTestThread.Method_1;
begin
form1.button1.OnClick;
end;
Suspended := true; ?????????
>>255 form1.button1.OnClick の定義は?
>>257 ごめんなさい。
再起動したら直りました。
259 :
デフォルトの名無しさん :04/02/19 13:25
>>234 コンパイルして エラーが出ないんだったら
その単語を Ctrlを押しながら マウスで下線をクリックして
定義元へいけばよい。
sndPlaySound(Pchar('sound.wav'),SND_ASYNC); これでサウンドを鳴らせましたが連続再生(無限に続ける)にはどうしたら良いのでしょうか?
>>230 >>241 遅レスだが、
Memo3.Lines.Assign(Memo4.Lines);
たぶん、これが一番効率の良いコード。
Textで渡すと、内部で一度改行を挟んだ文字列を生成し、改めてそれを改行で
切り分ける作業が発生するので非効率かと。
>>260 sndPlaySound(Pchar('sound.wav'),SND_ASYNC or SND_LOOP);
間違えて重複スレに書きこんでしまったようなのでもう一度質問します TStringGridで特定の個所だけ文字の色を変えたいのですが どうやればできるでしょうか?
>>261 ありがとうございます。効率が良いということなのでそちらでやらせていただきます。
266 :
デフォルトの名無しさん :04/02/19 16:00
>>264 OnDrawCell で 自分で表示しなおすしかない。
267 :
デフォルトの名無しさん :04/02/19 20:39
DataModuleにグローバル変数持たせるやり方がいまいちわかりません。 検索してみたのですがなかなかいいページが見つからないので どなたか参考になるページ紹介してもらえませんか?
DataModuleにグローバル変数を持たせるのではなく、 DataModuleをグローバルなクラスとして扱おうという話。 普通にフィールドなりプロパティなりを定義して、他のユニットからusesすればいいだけ。
DataModuleはフォームの一種ですから、DataModuleにグローバル変数を持たせるというのは今ひとつ意味判りません。
>DataModuleはフォームの一種 これも意味わかんねーよw
意味がやっとわかりました。 ありがとございました。
非ビジュアルなコンポーネントのコンテナの役目 を持つ不可視なフォームと考えればいい。 ところでグローバル変数ならユニットのInterface部に書けばどこでも 定義できるのだが。
> TStringGridで特定の個所だけ文字の色を変えたいのですが こんな感じ procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(StringGrid1.Objects[ACol,ARow]) then begin StringGrid1.Canvas.Font.Color := TColor(StringGrid1.Objects[ACol,ARow]); StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol,ARow]); end; end; procedure TForm1.Button1Click(Sender: TObject); begin StringGrid1.Objects[3,3] := TObject(clRed); end; procedure TForm1.Button2Click(Sender: TObject); begin StringGrid1.Objects[3,3] := nil; end;
275 :
重複スレの44 :04/02/19 22:03
>>247 きちんと出来ました。
出先のマシンのエディターでソースファイルを改変してカット&ペースト
を良くしていてするたびにエラーになったのですが、回避策が分かったので
助かりました。ありがとうございました。
276 :
重複スレの44 :04/02/19 22:07
もしかしたら前のエラーと関連があるかもしれないのでコテハンで。 integer型の配列変数を使っているのですが、初期値0からいきなり1072941865等に 変わってしまいます。 その変数を使っているところすべてにブレークポイントを設定して確認したのですが、 どこでも初期値の状態から変更していないでした。 このような症状って聞いたことありますか? もしご存知でしたら対策を教えてください。
>>266 ,273
うまくできました。ありがとうございます
>>276 最適化オフはやってたと思うので、別の配列等で範囲外に書いてるとかしか
思いつかないな。
>>278 最適化をオフにしたところで、動かないプログラムが動くようになることなんて、
(基本的に)ありえない。最適化の責任にしないように。
最適化オフなんて、デバッガで変数の中身をいじるときくらいしか使わんでしょ。
>>279 最適化ONの場合、デバッガで変数を見ると意図しない値になってたりするとがあるけど
重複スレの方で最適化をOFFにしろという話が出ていたので、あれからONにしてない
よね?という確認ですが。
>最適化をオフにしたところで、動かないプログラムが動くようになる
誰もそんなことは言ってない。
俺への指摘はどうでもいいから、
>>276 にアドバイスしてやれよ。
>最適化ONの場合、デバッガで変数を見ると意図しない値になってたりするとがあるけど >重複スレの方で最適化をOFFにしろという話が・・・ 何故そこで最適化が出てくるのか・・・
自己レスだが、もしかしたら最適化ONにしていると、代入しても 使われない値は、代入処理自体がパスされるのかもしれない。 でも宣言した変数に、まったく無関係な値が保存されるのは無いと思うが…
>>276 デバッガのウォッチの値がおかしいのか実際の値と実際の挙動がおかしいのか?
284 :
重複スレの44 :04/02/19 23:25
最適化はONにしています。 デバッガのウォッチ値と実際の値、両方ともおかしいです。
じゃあ普通に純粋なバグだ。 デバッグしろ。質問するならもっと具体的かつ簡潔にコードを示して聞け。
わけわからんことが起こったときには最適化切ってみれってよく聞くのだが どうしてなのか、あんまりわからん
>>286 最適化をオフにすると、
・無用な代入がパスされる→デバッグしにくい。
・ローカル変数がメモリ上ではなく、レジスタ上に確保され、デバッガから
見難くなる→デバッグしにくい。
・でも、オフにしたから正常に動作するなんてありえない。
・ステップ実行が見かけ上おかしくなる。 >・でも、オフにしたから正常に動作するなんてありえない。 潜在的なバグの挙動が変わって結果的に正常に動作する可能性はありえるな。 とかいってみたり。
>・でも、オフにしたから正常に動作するなんてありえない。 オフにして正常に動作するなら「最適化」とは言わない罠。確かに。
290 :
重複スレの44 :04/02/19 23:39
すみません。ではソースを貼り付けます。 filename:=ChangeFileExt(application.exename,'.ini'); selfini:= TIniFile.Create(filename); for i:=1 to comboBox2.items.count do begin WC1[i] :=selfini.Readinteger('anal','WC1['+inttostr(i)+']',0); end; 別の処理が色々と・・・ただしWC絡みは一切無し。 for i:=1 to comboBox2.items.count do WC:=WC+WC1[i]; ↑ ここで0でなくなっています。 inifileから読み取ったところでデバッガから覗くときちんと0になっています。
>>289 Delphiは知らないけど、他のコンパイラでは最適化バグは聞くよ。
>>291 Delphiはある時期からコンパイラが停滞しているのでその心配はありません。
293 :
重複スレの44 :04/02/19 23:40
あっ、ずれた。 WC:=WC+WC1[i]; ↑↑↑ ここで0でなくなっています。
> Delphiは知らないけど、他のコンパイラでは最適化バグは聞くよ。 最適化のバグの有無はどっちにしても2chでは解決できん罠。
WC は初期化してるんか?
for抜けたらiの値は出鱈目だぞ。参照すんな。
WCとかanalとか変な変数名
WC1の宣言がおかしいんだな
>>294 コンパイラはソースが公開されてなければ直せないけど
アプリの方は最適化オフというアドバイスができると思うんだけど
そういう意味でなくて?
まずソースを疑え!というのはデバッグの基本
最適化のON/OFFで挙動が変わるのもデバッグするための 情報のひとつになるでしょ
303 :
重複スレの44 :04/02/19 23:55
>>295 はい。0に初期化しています。 >>299 宣言がおかしいって言うのはどういうことでしょう? でも、一時的にでもWC1に0がきちんと代入されているので宣言は関係ないと思いますが。
範囲チェックをONにすれば分かる
関係ないことばっか言ってみる >'WC1['+inttostr(i)+']' ここ一瞬何だ?って思った。スペースないと見難いね それと、添字は0からにして欲しいね。 WC1の型はどうなってる? この例なら動的配列になると思うけど WC1: array[1..comboBox2.Items.Count] of Integer; とかなってない? WC1: array of Integer; SetLength(WC1,combobox2.Items.Count);
プロジェクトオプションのコンパイラタブで、範囲チェックをオンにして再構築してみるのはどうかな?
>for i:=1 to comboBox2.items.count do 0オリジンにしとけ
> 最適化のON/OFFで挙動が変わるのもデバッグするための > 情報のひとつになるでしょ 最適化なんぞはリリースバージョンまでオフにするもんじゃないのか?
>>308 そしてリリース直前になって最適化オプションで不具合がでるw
>>310 じゃ、最適化のバグだとすぐわかるでしょ?
>最適化なんぞはリリースバージョンまでオフにするもんじゃないのか?
これって常識じゃないのか?オレは先輩から教わったんだけど?
313 :
重複スレの44 :04/02/20 00:18
>>305 WC1はarray[1..10]にしています。 >>306 今、手打ちで元バージョンのソースから変更しています。 コピペを使わなかったらきちんと動作するのか確認したいので。 その後にやってみます。 >>308 最適化はオフが基本なのでしょうか?
>>312 最適化をOffにするのはVC++使ってたからじゃないの?
Delphiは昔からデフォルトでONだよ。
そのセンパイは昔からのDelphi使いじゃないでしょ
> そのセンパイは昔からのDelphi使いじゃないでしょ そうかもしれない。Delphi使いはデフォルトで非常識なんだね
お前ら最適化しないと駄目なようなアプリなんて作ってないだろ。 へたれはリリースもOffにしとけ。
>Delphi使いはデフォルトで非常識なんだね Delphiつかってる時点で(ry
最適化オフにしてる。 MLでループ変数が逆回り(いい表現が浮かばない)することもあるというのを読んで デバッグしにくそうと思ったから。 リリース時もそのままなわけだがw
リリースと違うオプションでコンパイルして何か意味あるの? そんなバイナリをテストしても意味ないし バグを追いかけるときに便宜的にわざわざ切り替える程度 まあ、Delphiはそのあたりを気にしなくても大して意(ry
>>313 コンボボックスのCountでループまわしてるのは何で?
WC1の値が全部0になってるとかじゃないの?
0は何回足しても0
IniFileの中に [ ] この括弧を使うのも激しく疑問
誤認されてるんちゃうか?
括弧部分をなくして
WC1[i] :=selfini.Readinteger('anal','WC1'+inttostr(i),0);
でどう?
>そんなバイナリをテストしても意味ないし 開発・テストが渾然一体となってる零細企業勤務ですか?
x:Integer; y:Expanded;として y:=7.777;とします。 で、xに7(整数をyの少数切り捨て)でいれたいんだけど…いろいろやってみたがだめでした。 どうしたらよいでしょうか?
> そんなバイナリをテストしても意味ないし 最適化on・offを切り替えられるようにする必要はない、と主張しているように聞こえるな。
trunc()
Expandedという型はない
Extendedだった。
「少」数ではない いろいろって何か他にやるようなことあるの?w 思いつかないw 公開きぼんぬ
x := StrToInt(FloatToStr(y)); 超初心者が・・・。
ワラタ
イイと思ったんだが・・・_| ̄|○
Trunc()津カット家 procedure TForm1.Button1Click(Sender: TObject); var x:Integer; y:Extended; begin y := 7.777; x := StrToInt(Copy(FloatToStr(y),1,Pos('.',FloatToStr(y))-1)); Label1.Caption := IntToStr(x); end;
メニュー項目別じゃなくて、メニューのポップアップそのものをオーナードローしたい。 そうしないと、一瞬メニュー色で塗りつぶされた後にオーナードロー色になる。 メニューバーも塗りつぶしたい。 オーナードローでは文字の背景しか塗りつぶせない。 というわけで何か知ってる人はいないですか?
なんか難しいねぇ。y:=7.000とかだとエラーになるし。 ってことは、タイマー使ってy:=y-0.1;ってやっていくとエラーになるってことだよなぁ。 y := 7.777;もy := 7.000;もOKなようには出来ますか?
どこかにいる
>>323 だからTrunc()つかえって
条件は後出しするなよ
小数点以下が3桁に限られるのなら1000倍した値を保持し、 必要に応じて1000分の一して使えばいいのに。
>>335 どうしてもTrunc()使いたくないなら
x := StrToInt(Copy(Format('%.3f',[y]),1,Pos('.',Format('%.3f',[y]))-1));;
x := Trunc(y);でよかったのか。
>>333 の下のやつはなんだよぅ(ノ∀`)ありがとう。
>>340 なんだよう、325でレスしただろ。
てっきりジョークかと思ってつきあったのに。
以前、小数点以下2桁で四捨五入という主旨の質問で、100倍して整数化して 100で割るという回答したら、ダサいと言われた。 今日、SimpleRoundToという関数を見つけた。 俺ってまだまだやね。
アヒャヒャ function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double; var LFactor: Double; begin LFactor := IntPower(10, ADigit); Result := Trunc((AValue / LFactor) + 0.5) * LFactor; end;
関数を発見するのもいいが、自分の頭で考えるのもいいと思うよ。
>>345 みると、うふふ、となるね。
数学(というか算数)の知識に乏しい俺でもSimpleRoundToは考えれば 作れるかもと思ったけど、その中のIntPowerはのアルゴリズムは すげーと思った。知識のある人にはなんのことはないのかも知れないけど。
ここで、何のことはない、と思っても書き込んだ奴は負けだ!
つまり俺は負けている!
ただ君
>>350 、君には負けて欲しくないのだ!
自作コンポーネント作っています。 それをフォームに2つ以上置いた時、1つ目のコンポのある変数が 2つ目以降のコンポに引き継がれてしまっているのです。 なぜ1つ1つのコンポ自体独立してないのでしょうか? それを考慮したプログラムを組まないといけないのは普通の事なんでしょうか? どうも何かコンポのありかたが違う気がします。
>>350 一つ目のコンポの変数? って部分が良く判らないのだが、
その変数は そのコンポ(クラス)のどういう場所で宣言したメンバーなんだい?
普通にpublicとかprivateなメンバーなら、当然Createされる都度に独立してるよ。
>>350 どう考えても、グローバル変数を見ているような気が・・・
その「ある変数」の前に「Self.」という文字を付けてもコンパイルできますか?
ここらでもう一回アピールしておきます
>>334 某所にそれを実現したコンポがあるけど、1から作ったほうが簡単であるのも事実。
メニューは実は単なるウィンドウなんですよ。
なるほど。簡単ですか。 ありがとうございました。
>>351 出来たコンポを設計時に複数貼り付け、実行時に1番目にアクティブになった
コンポの変数の値の事です。
もともとimplementationの下のvarで宣言してたのですがprivateに移動しても
変わりませんでした。
でもどっちにしても、同じコンポを複数貼っても
それぞれ影響しあわないような気がするのですが。
>>352 すいません、修正を加えて無理やり正常にしたので
さっきのがどうやってたのか再現できなくなりました・・・
グローバル変数って影響し合うんですか?
例えば設計時にフォーム上に貼り付けた自作コンポのcompo1とcompo2は
グローバル変数共用ってな感じに動いたのですが。
357 :
重複スレの44 :04/02/20 13:56
ソースを手打ちで打ち直したのですが、やっぱりエラーが出ます。 なんかの設定を引き継いでいるのかもしれません。 余計なファイルをすべて削除してから再コンパイルやってみたいのですが、 コンパイルに必要なファイルはpas,dpr,dfmと他に何が無いといけないのでしょうか? >>306 やってみましたが駄目でした。 >>321 >コンボボックスのCountでループまわしてるのは何で? 追加する場合があるためです。 >WC1の値が全部0になってるとかじゃないの? はい。0にしているはずなのですが、とんでもない数字になってしまいます。 >誤認されてるんちゃうか? 読み取りのときに誤認されているのは絶対にありえないです。 デバッガで毎回確認しています。
>>358 ええっ!そうだったのかぁ・・・
どうもです。
360 :
デフォルトの名無しさん :04/02/20 14:25
dbExpressってDBGridとか使えないんでしょうか? もし使えるなら、接続の仕方を教えて下さい。 宜しくお願いします。
>>361 レスありがとうございます。
TSQLClientDataSetが見つからず、出来ませんでした。
kylixしかないのかも。
(TClientDataSetは見つかったんですが、SQLConnectionと接続できませんでした。)
開発環境はDelphi7でWindowsXPです。
var x: Integer; begin で、宣言した直後のxの値は常に0なのですか? 配列で宣言した場合も全部0になりますか?
ローカル変数は初期化されない。
ってそのまま使えばそういう警告が出るよね。
変数は宣言した時点では不定だよ。 ちゃんと初期化しないと。 これはローカル変数でもグローバル変数でも関係なし。
367 :
重複スレの44 :04/02/20 15:35
>>358 ファイル名を別の名前に変えて確認しましたが大丈夫でした。
>>366 >明示的に初期化されていないグローバル変数はコンパイラによって0 に初期化されます。
>>357 誤認されてるにしろ、されてないにしろ
IniFile中に[]を入れるのは喜ばしくない
IniFile開いて見たことある?
1オリジンも気持ち悪い。
別の処理中にも逐一止めて値を確認してみれ
>追加する場合があるためです。
だったら動的にしとけ
自己解決しました。必要ないかもしれませんが、一応やり方を書いておきます。 TSQLConnection TSQLQuery TDataSetProvider TClientDataSet TDataSource TDBGrid これらを上から順番に接続していって、 TSQLQuery.SQL にSQL文を書いて、 TClientDataSetのActiveをTrueにすれば 表示されました。
SendMessage(Handle, WM_LBUTTONUP, 0, 0) のような感じでマウスをクリックした事にしたいのですが SendMessageのパラメータの 0, 0 部分をどう指定してよいのか解かりません。 クリックした事にしたい座標の指定の仕方を教えてください。
クライアント領域だから、その窓ハンドル相対で与えてやればいいよ。 でも、相手がボタンなら BM_CLICKでいいんじゃないの?
パラメータに座標を指定する方法自体が解からないんですが。 どんな書き方をすればいいのでしょうか?具体例をくだちゃい。
数字入れればイイだけ 左上が0、x軸が右向き、y軸は下向き 座標はピクセル単位
きっと、 PointToSmallPoint が見当たらなかったんだと思うよ。 windows.pasにあるからさ 座標を var POINT:TPoint ; としたらさ Longint( PointToSmallPoint(POINT) )
>RSA1.DecryptStringFromT(, ToT); ワラタ
WM_LBUTTONUP fwKeys = wParam; // key flags xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor なんだから SendMessage(Handle,WM_LBUTTONUP,0,MakeLParam(xPos,yPos)); だろうさ。ヘルプ読めよなぁ
ヘルプ読めとかいいながら、サンプルまで書いてしまう
>>378 萌え
関数を抜けるのはendですか? 何かあるのですか?breakとか もしくはResultに値が代入されたら関数を抜けるのですか?
> 関数を抜けるのはendですか? ふつうはそう > 何かあるのですか?breakとか exit; とすると途中で抜ける > もしくはResultに値が代入されたら関数を抜けるのですか? ちがう。たんなる戻り値への代入
そう で、Exitは手続きって所がpascal系の面白いところかもね。
haltが手続きはいいんだけど、 exit も break も手続きってのがねえ。
c のreturnより、戻り値の設定が自由に出来るだけ柔軟なんじゃないかな? まぁ、こんなこというと「宗教戦争」とかになるけど
あ、breakはループを抜けるのでしたね・・・
>>382 >> 関数を抜けるのはendですか?
>
>ふつうはそう
これは、関数の最後にend;って書くんですよね?
ifで分岐させて、途中で終了するときはexit;ですよね?
begin end が、とか言うヤツがきっとあらわれるぞ(藁
ヘルプを読めないとか?
読むのが面倒臭いのです。 このスレは辞書みたいで便利なんです。 特に週末は即答辞書代わりになりますので
TeditのText、TlabelのCapiton、ComboBoxのTextを初期化する命令ってありますか? ある処理をした場合は、今までの入力をすべて破棄したいのですが
>>390 まさか
Edit1.Text :='';
Label1.Caption :='';
ComboBox1.Text := '';
という意味じゃないだろうね?
もうちょっと詳細を書け。
>>389 悪いがそういうやつには2度と来てほしくないな。
>>391 それです。
やっぱりそう書くしかないですか?
> やっぱりそう書くしかないですか? うふっ、ほかにどう書くのかこっちが訊きたい
週末は「くだすれ」どおりになって愉快。ふ、愉快。
397 :
デフォルトの名無しさん :04/02/20 21:44
ExitWindowsEx(EWX_REBOOT,0); でリブートするときにFormCloseやDestoryは実行されるのでしょうか? 確実に実行させるにはどこに書けばいいのか教えてください。
>>393 例えばEdit等が大量にあるならそれ相応の対処方法があるから詳細を書けと言ってる。
3行程度で文句言ってるならプログラムなんてやめた方がいいと思う。
関係ないけど、おまいら
>>389 に釣られてはいけない。
>>395 Procedure FormReset;
begin
Edit1.Text :='';
Label1.Caption :='';
ComboBox1.Text := '';
end;
こんなの書いてみたのですが、定義されてないとか出ます・・・
なぜでしょう・・・
メソッドになってないから Form1.Edit1.Text :=''; とか書かないと
>>399 メインフォームがForm1だとすれば
interface部にある
TForm1の宣言内に
procedure FormReset;
を書いて
implementation部には
procedure TForm1.formReset;
begin
…
end;
とならなきゃ駄目だよ。
>>398 Teditが7つあって、そこに数字を入力します。
そして、25個のTlabelに処理結果を出力します。
で、もしTeditの1個目(Tedit1)が0なら、何も表示しない、という処理をしたいのです。
>>400 メソッド・・・
難しそうな言葉です。たしかオブジェクト指向とかいうやつですか?
メソッド、インスタンス、クラスって言葉で拒否してたので、これを気にじっくり勉強しようと思います・・・
> メソッド、インスタンス、クラスって言葉で拒否してたので、これを気にじっくり勉強しようと思います・・・ そうそう、これを知らずに Delphi をさわるなら、コンソールアプリしかつくってはいけませんよ。 是非、入門サイトで勉強してください。必須です。
なるほど、type部に
procedure Formreset;で
procedure Tform1.formReset;
begin
・・・
end;
って書くと、メソッド省略時に、Tform1のコンポーネントに向くってことですね?
>>403 やっぱり必須なのですね。これには時間をかけて確実に理解します。
>>404 >って書くと、メソッド省略時に、Tform1のコンポーネントに向くってことですね?
意味がよく分からないんですけど…
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
…
private
procedure FormReset;
public
end;
に対して
procedure TForm1.FormReset;
begin
…
end;
という感じになります。
>>406 やはり全然理解できてないみたいですね・・・
勉強しなおしてきます。
流れちゃった(´・ω・`) 文字列を一文字ずつ見ていって空白じゃなけりゃバッファに溜めて 空白だったらTStrings辺りに溜まったバッファを追加するのでいいのかな?
どうも釣りの臭いがしないでもないような…。 とりあえず「メソッド」だけは、そんなに深く考えるほどの言葉じゃないと思う。
>>408 ダサめなアイデアとして、
半角スペースと全角スペースを統一しちゃったらどう?
StringReplaceあたりを使ってさ。
つーか、「流れちゃった」って限度を超えてる気がする(藁
> どうも釣りの臭いがしないでもないような…。 いや、週末はメソッドと関数の区別がつかないのとか、Trunc() つかえないやつとか break と exit の違いが分からないのとか、ほんとにくる。どうも、そのあたりは 「くだすれ」なんだからしょうがないんじゃないかと
書き込み不可プロパティと、引数の無い関数って、どう違うのですか? クラス設計のとき、変数を読むだけのプロパティなら作るのが楽、という以外に。
くだすれだからある程度許容してあげようよ。 そこまで排除すると「くだすれDelphi(超初心者にも達しない厨房向け)」スレが できてしまい、それもPart5くらいになると、そこも知らぬ間にレベルが上がってしまい、 「くだすれDelphi(箸にも某にもかからない香具師向け)」スレができてしまい 以下… でもまあ、質問するときの最低限のルールはどっかで教えなきゃな。
readのみでfunction呼んでるものは、property書く必要ないよね。 でも、両方書くなら、functionの名前はGetHoge、propertyの名前はHogeだ。 それから、protectedのプロパティにしておけば、後々良いことあるかは知らん。
>>408 全角スペースを半角に変換して、それから
TStringでも、自作split関数でも何でも使えばいいのでは。
例えばYahooなんかの検索エンジンだと、全角スペースを
半角スペース2個に変換してる。
>>414 書き込み不可プロパティは
property Nullpo: String read GetNullpo;
のようにSetするメソッドそのものがないし、もし書込プロパ
が設定されていたとしたら、それは
procedure SetNullpo(Nullpo);と同義なので引数がある。
引数の無い関数は単純に
procedure NullpoExecute();
というだけの話。
スレ違いだけど一応お約束だから
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>417 (_フ彡 /
>>416 プロパティにしてprotectedにGet関数を書いても、最初からvirtualの引数無し
関数にしても、得られるメリットは同じような気がしますが。
>>417 聞いておいて失礼ですが、その程度のことは100も承知です。
んなこといったらプロパティはいらないべw 属性や性質を参照するものをプロパティ、 オブジェクトの機能をメソッドとして判断するしか ないんでないの? publishedでインスペクタでみれるという利点はあるかも。 あと、オーバーロードもオーバーライドもできない。
functionじゃなくてpropertyをプロテクトにするのさ。 それを継承したクラスでどのプロパティを公開するか決めるのが楽になる。
継承してwriteを付け加えることができる
424 :
デフォルトの名無しさん :04/02/21 14:24
delphi6 personalをDLしてエディターを作ろうと思うんですけど メニューバーとステータスバーが無くて、ツールバーだけという 形でもOKなんでしょうか?
そんなエディターは使いたくないが、自分が好きなら作ればいいんじゃないの? あと、D6パーソナルのチュートリアルはめちゃくちゃだから先にどっかで情報仕入れといてね。
るるとん@K 2004/02/21(土) 09:47:05 procedureってなんて読むんでしょうか? プログラムが読めないんです るるとん@K 2004/02/21(土) 09:57:20 [[解決]] すみません、プロシージャでした
相手してください。。。
>>427 それは答えの出ない質問だと思うよ。 どうなるかどこにも書いてないからその質問なんでしょ?
実験してみて結果を調べるか、Win2000のソース追いかけて調べるか。
ありがとうございましたー
>>397 OnCloseQueryだったかな。いや、逆かも
OnCloseQueryかOnCloseのどちらかが確実に実行されるものだったと思う。
実験してみたほうが早いと思うよ
便乗的な質問なんですが、Form1からForm2を Form2 := TForm.Create(Self); と作成したとき、Form2のOnCloseで Self.Release; とすれば、Form1でForm2.Releaseなり、Freeなり してあげなくても大丈夫ですか?
Form2のメソッド実行中にForm2を破棄できるかどうか 流しそうめんで流してる途中にレール(?)をぶった切ったらどうなるか if Assigned(Form2) then 〜
>>431 form.Create( 親 ) としたら、親が死んだら子も死ぬ。
でも、子が自分で死んでも親はそのままさ。
Self.Release;とすればそれで十分。
Self.Releaseを選んだのは賢明。 Self.Free と違ってSelf.Release は、その時に開放するわけじゃないから安全
ごめんなさい。
test.txt という文字列を test という拡張子を外した文字列にするには どのようにすればよろしいのでしょうか。。 ヘルプミー(;´Д`)
>>436 ExtractFile って打って、F1 押して探したら見つかると思うよ。
ぬるぽ
∧_∧
( ;´∀`)
人 Y /
( ヽωつ ο°o。
(_)_) ∩ _, ,_
⊂⌒( `Д´)
>>440 `ヽ_つ ⊂ノ
>>260 本筋と関係ありませんがリテラル文字列(変数や定数ではない文字列)はPCharでキャストしなくても大丈夫ですよ.
>>402 『メソッド』はコンポやその他のオブジェクトに専属の関数または手続きの事です.
ちなみに『オブジェクト』はモノ(物),『クラス』はオブジェクトの型,『インスタンス』はオブジェクトの実体のことです.
TLabelにファイル名を表示しているのですが、 ファイル名に&が含まれていると下線になってしまうのを禁止できませんか?
ShowAccelChar
一発的確な回答ありがとうございました
>>430 CloseQueryが確実に実行されると思った。
MLの過去ログにあると思う。
自分では検索しようともしないのだがw
>>434 Self.Releaseを選んだのは賢明。
OnClose なんだから
Action := caFree;
がベストでは?
最大化や最小化から戻ったときというのをどうやって感じればいいですか?
目で見る
450 :
デフォルトの名無しさん :04/02/22 03:14
>>448 セブンセンシ…
もとい。
wm_syscommand、SC_MAXIMIZE、SC_MINIMIZE、SC_RESTORE
あたりを検索しなはれ。
>>450 どうでもいいけど、セブンセンシズって、どう考えても訳すると「七つの感覚」だよな・・・
「第七感」なら、セブンスセンスだろうが・・・>クルマダセンセ
452 :
デフォルトの名無しさん :04/02/22 05:31
すいません初心者です。 これからDelphiをはじめようと思うのですが バージョン6,7,8、。NET版といろいろあって よくわかりませんどれを使えばいいのでしょうか。
>>452 自分に出来るかどうか、確かめてからにするなら、
「タダの6(いわゆるパソナル)」が一番でせう。
フリーなんで、死ぬほどいじりたおしてから製品版の7か8を買えばよろし。
他は知りませぬ。
まじめに質問しているので、まじめにレスしてくれる人だけレスしてくれればよいです。
まじめにレスしているので、まじめに質問してくれる人だけ質問してくれればよいです。
なんかすげー失礼な奴が来たな
454は別人です! 453さんレスありがとうございます。 6を使ってみます。
MessageDlg('削除しますか?', mtConfirmation,[mbYes,mbNo],1) ; これだとなぜかNoにフォーカスがあったっていないのですが、 何故でしょうか。。教えてくださいまし_| ̄|○ |||
削除しませんか? にすると解決
ワロタ
>>458 あれ?次の引数にデフォルトフォーカスボタン指定するんじゃなかったっけ? と思ったらVCLではまだそうなってないのか。
じゃさ、 CreateMessageDialog で作成してフォーカスボタン指定したらいいんじゃないの?
Application.MessageBox('削除しますか?', '確認', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2);
var res:Integer; begin with CreateMessageDialog('削除しますか?', mtConfirmation,[mbYes,mbNo]) do try HelpContext := 1; with FindChildControl('No' ) as TButton do begin Default:=True; TabOrder:=0; end; res := ShowModal; finally free end;
>>463 おをををを。ありがとうございます
その場合は変数resにmrYesかmrNoが代入されるんですよね。
Integerでも例外があるなんて知らなかった。。
どうもありがとうございます。
>Integerでも例外があるなんて知らなかった。。
???
>>462 にもお礼を言っておいたらどうなのよ
464は偽物です
未来人キター
うぉい!先週始めたばかりでさっぱりわからん。助けてくれぃ!! Delphi7を起動してプログラムを書く(修正)→実行を繰り返しているわけですが、 実行して修正点をみつけ、またプログラムを書く画面に戻る際になぜかエラー「ビジー状態です。応答がありません。」 と出て、しばらく待つか強制終了かと聞いてくるので強制終了を選ぶと今度は不正な処理を行ったので強制終了します。 と出たまま固まって動きません。 毎回エラーが出るわけではなく確立は1/3くらいです。あと今のところ特定のプログラムを実行した時にだけ出るようです。 プログラムの問題だとしたらどんな事が考えられるでしょうか?
> あと今のところ特定のプログラムを実行した時にだけ出るようです。 うんじゃ誰にも分からないと思われ
>>468 おおかた、条件によって無限ループになることがあるのでしょう。
>>468 メモリーの解放忘れとか。
つい最近同じようなことが起きて、
原因は解放忘れだった。
delで.Netって、JavaとJBilみたいな関係?
VB と VB.NET みたいな関係
>>474 今からいろいろやってみる。だめぽならうpしてもいいが…
477 :
おしえて下さいU :04/02/22 23:04
Delphi相談室(超初心者用)その11で質問させて頂いたのですが、 CSVファイル以外の既存のエクセルファイルを開き、内容をStringGridに移したいのですがどうやれば 良いのでしょうか? CSVファイルの場合に関しては教えて頂けたのですが、普通のエクセルファイルを開きたかったものですから。。。 色々検索掛けたのですが”TExcelApplication”による新規作成以外見つからなかったんです。 宜しくお願いします。
オレオレ
Delimiter
>>477 セルに値をセットする方法がわかればゲットもできるだろ。
詳細はExcelのリファレンス嫁。
483 :
デフォルトの名無しさん :04/02/22 23:32
ちょっと板違いのようなきもするのですが・・・ 計氏のSusie Plug-in 読込コンポの今のバージョンはD5に非対応になっていてインスツールがで きません。専用のHPもないようです。どこを修正すればいいのか、あるいは以前のバージョンをが アップされているところを知らないでしょうか?
484 :
おしえて下さいU :04/02/22 23:34
478・479・480さん回答ありがとうございます。 Excelのリファレンスを読んでみます。
∧,,∧,,,,,, ) (´⌒(´ ⊂ミ゚Д゚⊂ `つ≡≡(´⌒;;;≡≡≡ ズザーーーッ """"" (´⌒(´⌒;; var Excel: Variant; WorkBook: Variant; WorkSheet: Variant; procedure TForm1.Button1Click(Sender: TObject); begin try Excel := CreateOleObject('Excel.Application'); except on EOleSysError do begin ShowMessage('Excelが起動できません'); Excel := Null; Exit; end; end; Excel.Visible:= True; end; procedure TForm1.Button2Click(Sender: TObject); begin WorkBook := Excel.WorkBooks.Add; WorkSheet := WorkBook.WorkSheets[1]; WorkSheet.Activate; end;
∧,,∧,,,,,, ) (´⌒(´ ⊂ミ゚Д゚⊂ `つ≡≡(´⌒;;;≡≡≡ procedure TForm1.Button3Click(Sender: TObject); begin// WorkBook := Excel.WorkBooks.Open(C:\Temp\test.xls'); WorkSheet := WorkBook.WorkSheets[1]; WorkSheet.Activate; end; procedure TForm1.Button4Click(Sender: TObject); var i, j: Integer; x, y: Integer; begin x := 1; y := 1; for i := 1 to 3 do begin for j := 1 to 3 do begin WorkSheet.Cells[x+i-1,y+j-1] := IntToStr(i) + '-' + IntToStr(j); end; end; end;
+ '-' + かわいい
>>476 明日みてみるから、そのままおいといてくり。
つか、どうせあげるなら、pasやプロジェクトごと
圧縮してくれよん。
マンドクセーよ
バグ入りコンポ登録しただけだろ
>>476 D7終了時ブラクラは、認証クラック版の使用をやめれば解決するよ。
ワレザだってば
初めて1週間でACT作るというのが気に食わんな だから把握できなくなるんだろ
オリジナルのコンポーネント製作中なんですが、 それをフォームに乗っけて起動時に2回keyDownイベントを通ってるんです。 それでそのイベントの中のコードのVK_LEFTに反応してるんです。 別に意図してそのような事はしてないのですが何故なのでしょうか?
>>495 パーソナルでないなら、誰が呼んでるか、トレースしていってみたら?
TCustomMaskEditを敬称して使ってるんですが、 どうやらEditMaskを設定した時に飛んでるようです。 またEditMaskを設定した後にTEXTを設定しても飛ぶようです。 それがどうKeyDownを呼んだりVK_LEFTにだけ反応するのか理由がわからない・・・
ShowModalで表示させたフォームを右クリックで閉じようとしております。 表示させたフォームからカーソルが外れても、メインフォームの範囲内にある場合は 右クリックで閉じたいのですが・・・ とりあえずApplicationのOnMessageで右クリックを掴もうかと思ったんですけど、 表示したフォーム上でしか反応しないんですね。 こういう場合、どうすればいいんでしょう。 ご存じの方いらっしゃいますか?
TPoint TRect
ボタンとかをLunaスタイルにするにはどうすればいいですか? 何か内部で記述するのでしょうか? .face??なんとかってファイル作ってやるソフトを使わずに、初期の状態からLunaスタイルにしたいんです。
Label1.Caption:=IntToStr(Length(Edit1.Text)); なんでコンパイル通らへんのや(´・ω・`) 教えてエロい人 他のアプリのLabel1.Caption:=IntToStr(Length(Memo1.Text)); はちゃんと通ってるのに(´・ω・`) 演算子またはセミコロン(';')が必要です
ぁ、ごめ。 他のところでlengthって名前使ってしまってた(´・ω・`)
503 :
デフォルトの名無しさん :04/02/23 19:24
>>501 SysUtilsを usesに 加えてないだけかと思われ。
ちゃんと コンパイルは通るぞ。
504 :
デフォルトの名無しさん :04/02/23 22:34
質問させてください。 PageControlを継承してコンポーネントを新しく作りました。 このコンポーネントはPageControlでタブを生成すると、そのタブ上に最初からパネルが置かれている状態のものが作られます。 タブを増やすのは作ったプログラムの実行時ではなく、プログラムの開発中にタブを作り、パネル上にコンポーネントを配置していきます。 実際にタブを作ってパネル上にコンポーネントを配置するまでは出来たのですが、保存が出来ません。 自分なりに調べたところ、タブが作られたという情報が保持されないので、このことをiniファイルかレジストリに書き込む必要があることが分かりました。 しかし、iniファイルやレジストリへの書き込みは今までにやったことがありません。 もし宜しければ、解決手段か分かりやすく解説してあるHPを教えて頂けないでしょうか?
コンポーネントレベルで設計時の情報を ini やレジストリに保存する、というのは ヘンじゃないかな? そのコンポーネントを使って、また違ったアプリを作りはじめたら 前の情報はどうなるの?
>>504 publishedでプロパティを設定して、
インスペクタの内容を参照できるように
したら?
>505 作るアプリごとにiniファイルを用意しなければいけないということですか?
ちゃんとコンポーネントのインストールという手順を踏んでるんだろうか? 自作のコンポーネントは自分のパッケージに入れるのが普通だと思うけど。 コンポーネントなんていくつ作ったか知れないけど そのためにiniファイルやレジストリをいじったことは一度もないよ。
もう少し質問させてください Iniファイルへの書き込み方法の基礎は過去スレからリンクされていたHPで解ったのですが タブが作られたという情報は、単純にタブの数を書き足せば良いのでしょうか? それと、タブで作られたパネル上にどのコンポーネントが置かれたかと そのコンポーネントのプロパティはどうなっているのかも保持しようと思えば WriteStringで一つずつプロパティを書き込んで、次に開く時にiniからReadIntegerや ReadStringで 読み込めば良いのでしょうか?
>>511 いや、パッケージ云々と設計時の情報保存は関係ないだろうと。
>>512 ちゃんとした手順を踏んでないからじゃないか、と思ったんだけど…
今、試しにPageControlを継承したコンポーネント(色を変えただけだけど)
を作ってやってみたけど、何も問題は起きないよ。
もう一度説明させてください PageControlを継承して、新しくコンポーネント(ItemControl)を作成し、このコンポーネントをフォーム上に置いて新規ページを作ると TabSheetを継承したItemSheetが作られ、その中にScrollBoxを継承したItemPanelが動的に作られます パネル上には自作のビジュアルコンポーネント(仮にNewItemとします)が配置され、別のNewItem型のコンポーネント名を指定します そして、指定した順番通りに次々とコンポーネントの色を変更していきます パネル単体で上の処理を行った時には何の問題もなく動作するので、ItemControlかItemSheeかのどちらかが原因だと考えました オブジェクトツリーはこのような状態になっています ItemControl TabSheet ←半透明で表示されています ItemPanel NewItem1 NewItem2 ItemControlを使わずに ItemPanel NewItem1 NewItem2 という状態なら問題なく動作しました 解りにくい説明でごめんなさい
そもそもパソの低スペックが関係しているらしいのでした…… Application.ProcessMessages; でなんとか防げたカモ。コンポは何1つ利用してないし、メモリ開放忘れも多分ないし。
低スペックであるかどうかと Application.ProcessMessages; で防げるかどうか は全く無関係だと思うよ。
>>515 マジレスするけど、もすこしいろいろ体験してからレスした方がいいと思うよ。
このままだと釣りじゃないなら、お祭りになっちゃう予感。
知識広げれ。
>>514 既にくだすれレベルじゃないと思いますし
自分にレスする資格があるかも定かではありませんが…
継承して新規ページ作成部分をoverrideしようとしても
肝心のところがprivateになってませんか?(毎度おなじみの)
例によってソースをまるごとコピーするパターンでしょうか?
オブジェクトツリーでは
ItemPanelがTabSheetを継承しているようには見えないのですが…
自分ならTItemPanelをパレットに登録しておしまい、にしちゃいそうですね。
>>499 PtInRect(Rect, Point)
…でしょうか?
範囲内にあるかよりも前に、ClickなりMouseDownなりのイベントが掴めないわけで。
一応メインフォーム上での事ですけどねぇ…。うーむ。
>>516 別のところで聞いたら
>非力なマシンで、ループ処理なんかの時に起きますね。
>Application.ProcessMessages;をかましておけば、終了メッセージの処理がされるはずですので固まることは少なくなると思います。
っていう答えが返ってきたんで…そうかなとおもったんですが。
>>517 もすこしいろいろ体験・・・どんな体験の事をいってるのでしょう?
いや、だから…。 もちっと「根拠ある予想が出来る程度」まで、自力でがんばれ言うとる。
>>498 WM_LBUTTONDOWNメッセージが届いているか確認してみては?
>>522 う…どの部分で確認すればいいんでしょ。
メインにしてもモーダルのやつにしても、フォーム内だけでメッセージ来ますし…うーむ。
>>520 >非力なマシンで、ループ処理なんかの時に起きますね。
>Application.ProcessMessages;をかましておけば、終了メッセージの処理がされるはずですので固まることは少なくなると思います。
誰だ、そんな無責任な事教える奴は。
安易にApplication.ProcessMessages;は使わない方が良い。
長い処理させるのに、Application.ProcessMessages;を噛ませるのは、そもそも
間違った用法だし。スレッド使ってください。
Application.ProcessMessages=お気軽スレッド ではない。
525 :
デフォルトの名無しさん :04/02/24 12:53
Application.ProcessMessagesって 画面を再描写させるのに使うのかと 思ってたけど、ちゃうのかな?
なかなか超初心者らしい質問が出てきていい感じ
527 :
デフォルトの名無しさん :04/02/24 13:26
SampleページにTTrayIconっていうコンポーネントがありますけど、 これを使うと何ができるのでしょうか?
。・゚・(ノД`)・゚・。
529 :
初心者 ◆28s26Q7ss2 :04/02/24 13:49
Delphi6 Personalを使っています。(WinXP Home上) プログラムから他のプロセスを停止させたいのですが、 どうすれば出来ますでしょうか。 ぐぐってみて、実行はWinExecやShellExecuteを使えばよい、 というのは分かったのですが、停止はさっぱりでした。 今はタスクマネージャで停止しているのですが、効率が悪くて・・・ 宜しくお願いします。
ListViewコンポーネントのvsReportモードにおいて、Winnyみたいに 項目の中にプログレスバーを入れるのはどうしたらよいのでしょうか?
間違いなく塗ってる。作者は超初心者じゃないからな。
536 :
デフォルトの名無しさん :04/02/24 14:51
TCopyModeのヘルプで、 ・「キャンバス上のイメージ」とは、すでにキャンバスに描かれている画像 ・「コピー元のビットマップ」とは、キャンバスに描こうとする画像 という意味だと思いますが、「コピー元の模様」とはどういう意味でしょうか? 2つのTBitmapの一方に背景、もう一方にキャラクタを用意してTPaintBoxに 重ね合わせて表示したいと思っているのですが、CopyModeに何を指定すれば よいかでつまっています。
>>537 すでに全部やってみましたが、cmSrcInvertやcmSrcPaintでは背景が透過表示
されてうまく表示できているように見えますが、キャラクタの色が変わってしまいます。
>>536 表示用TBitmapを作って、そこに背景をコピーして、
キャラクタを透過でDrawか自前でコピーして
その表示用bitmapをCanvasにDraw
>>540 >キャラクタを透過でDraw
ここをお聞きしたいのですが・・・。
>>539 CopyMode は無理に使わなくていい
TransparentColor TransparentMode
を設定して普通にDraw
Memoコンポーネントの中の文字を検索したい場合はどうやってするんですか?
Memo1.Lines.IndexOf('文字列')
>>542 Readmeしか読んでないですけど、すごく高機能そうですね。
参考にさせていただきます。
>>543 そんなプロパティがあったとは・・・すみません、ヘルプを読み足りなかったです。
Drawすることで普通に透過できました。
ありがとうございました。
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (ord(Key)<=8) then if not ( Key in ['0'..'9']) then key:=#0 else if Length(InputLv.Text)>=7 then key:=#0; これなんですが、ord()って順序値を返すそうですが、keyはChar型なので、初めの1文字しか入ってないんじゃないんですか? 解説お願いします。ちなみに、これはTEditに7文字以内の数字しか入らないという制限を
>>548 それはキーボードを押されたときに呼び出されるもので
Keyにはそのときに押されたキーしか入ってませんよ。
>>549 なるほど、1文字入れるごとに呼び出されるんですね。
しかし、ord(key)<=8ってどういう意味ですか?
>>548 OnKeyPressでなく、OnChangeで制限すれば?
8文字以上の非数字をコピペできるようですが?
>>550 アスキーコードの8以下
ということは制御キーでしょ。
>>551 OnChangeですか・・・
僕がしたいのは
・入力値は数字3文字まで
・Delete、Backspaceキー等も有効
・ドラッグして数字を反転させて、その状態で数字を入力したい。(123と数値がある状態で、ドラッグさして、4を押すと、値を4にしたい)
procedure TForm1.InputLvKeyPress(Sender: TObject; var Key: Char);
begin
if not (ord(Key)=8) then
if not ( Key in ['0'..'9']) then key:=#0
else if Length(InputLv.Text)>=3 then key:=#0;
これで、一番下の条件以外はできたのですが・・・
どうしましょう
>>553 すいません。
ord(key)=8だったようです。
あのー、文字入れるコンポーネント(Teditってやつです)にフォーカスをあわせたとき、 Tabキーでフォーカスを合わせると入力されている文字が反転しますよね? これを、マウスでフォーカスあわせたときに同じことできませんか?
>>555 手続き名と問題になっている話からすればTEdit型でしょう。
>>557 これでどうよ?
procedure TForm11.Edit1Click(Sender: TObject);
begin
Edit1.SelectAll;
end;
>>532 ありがとうございます。
でも、超初心者には難しすぎるかも・・・
もっとAPIの勉強をしなきゃいかんですね。
>>559 そりゃヘルプ読まないとわからんだろうな・・・
>>559 DelphiヘルプでTMaskEditのプロパティEditMaskを読むよろし。
>>560 それだと、2回目のクリックでも全部反転しますよね。2回目はカーソルを表示させたいのですが・・・
あのー、勝手にイベント名変えたら反映してくれるのはうれしいんですけど たまに関係ない部分も一緒に変わるんですよねぇ・・・ TeditのOnClickのイベント名変えたらTbuttonのイベント名もそれと同じになったりするんですよ これなんでですかねぇ?全然関係ない場所のはずなんですけど
>>565 に便乗して素人なこと聞きますが
procedureの後に書くのって
TForm1 = class(TForm)こうすると
TForm1.(イベント名)ですよね?
これだったら、同じイベントがいくつもあったら、edit1Onclick、edit2Clickみたいに名前が重複しないようにしないといけませんよね?
Edit1(←これってオブジェクトでしたっけ?)
TForm1.(オブジェクト).(イベント名)とすれば、重複考えることもなく、イベント名なんか変える必要ない、とか思ったりしてるのですが
思いっきり的外れなこといってたらスイマセン
>>565 不思議だねぇ〜
普通はそうならないよね〜
>>566 イベントというのは面白い発明だよね。委譲っていうのかな。
>>565 普通、イベントハンドラの名前は変えないんですよね。
変えるならコンポーネントの名前の方。
意味が分かりやすい名前のメソッドを作って
それを呼び出すというのはよくやりますけど…
Delphi6PersonalとDelphi7Professionalの違いってコンポーネントの数ですか? あと、トレース? 2chブラウザを作るのにはPersonalでも十分可能でしょうか? どの辺から7が必要になりますか?
クラスとかユニットとか何のことやらサパーリなんですが、お勧めの入門書教えてください
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure test(Sender: TObject); end; procedure TForm1.FormCreate(Sender: TObject); Button1.OnClick := test; procedure TForm1.test(Sender: TObject); ShowMessage(''); procedure TForm1.Button1Click(Sender: TObject) //ShowMessage表示する procedure TForm1.Button2Click(Sender: TObject) //ShowMessage表示されない ちゃんとできまつな。begin end は省きました。
>>557 俺だけの内緒だったけど教えてやる。
TEdit使うのやめて、TComboBoxをドロップダウンなしで使えば反転する。
工エエェェ(´д`)ェェエエ工工
高さが指定出来ないのがネックだけどな
OnClickかOnMouseUPでEdit1.SelectAll;すれば いいんではないかとおもわれるがどうだろかいな
もうでてるぢゃん 重複すまん
しかもそれじゃダメだってさ、ほんとトホホだね
>>569 PerよりProの方が使い勝手がいいが、6より7は使い勝手が悪い。
XP対応を謳っているが実際は中途半端。
6Perで十分。
シェアウェア配布禁止なのでそれが不自由になったとき。
ガックシ AA(ry しょーがねーな procedure TForm1.Edit1Click(Sender: TObject); begin if fIsSelText then begin Edit1.SelectAll; fIsSelText := False; end; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not(Edit1.seltext = Edit1.Text) then fIsSelText := True; end; これでどうよ。
(≧∇≦)b
>>578 ふむふむ。じゃあPersonalで十分ですね。
583 :
デフォルトの名無しさん :04/02/24 20:44
大文字と小文字を区別しないで2つの文字列を比較したいんだけど 便利な関数とかクラスとかありませんか?
AnsiCompareText
うまくいきました。thx!!
587 :
デフォルトの名無しさん :04/02/24 21:25
くだすれってどういう意味?
そういう「くだらない質問OK」のありがたいスレのことです。
成歩堂
当方サブウィンドウを開きたいのですが、 Application.〜で作るとフリーズしてしまいます。 CreateWindowEXを使い、自前でウィンドウを作成し、 メッセージループ無しにすると上手くいきますが、 ボタンとかも置きたいので、VCL以外でのボタン等の置き方を 知らない自分には、この方法を採るのもツライところがあります。。。 もしもどなたか良い知恵がございましたら、ご伝授いただけると幸いです。 変な質問ですみません。。。
Cからの転校組かな?
理由があるなら、いざ知らず。 ちょっと焦りすぎじゃない? 「クラス」とか「ユニット」とか、いじってればすぐ分かるようになるって。 自分で探ろうとかゆー気にはならんかえ? そりゃ、サイトの説明を読むのが一番簡単だとは思うが。
VCL使えよ
VCL使わずに? 新規作成->フォームじゃだめなの?
(´-`)。o ○ (また「ユニットを使う」の予感)
>>595 まず理由はいらないから、VCLを使ってもいいのか使いたくないのか、はっきりさせよう。
VCLを使いたくない場合は、このスレの守備範囲ではない。Halbow氏の資料を読んで
茨の道をすすめ。茨の道をすすむからには覚悟を決めろ。その程度の質問なら
「VCL使えよ」というレスがつくだけ。
VCLは使えるものなら使いたいです。 が、自分のコーディングが悪いのか、 エラー(強制終了、たまにRuntime Error 216…が出ます) が出て先へ進まない、と言う状態です。 そもそも自分はVCLに関する理解が浅いので、もう少し良く探してみます。
ていうか… 余計なことはしない。 まずはDelphi立ち上げて、実行ボタン押してみれ。 それでダメなら再インスコ。
脱糞しそうなくらい脱力。 単独で動かして問題ないならDelphi再インスコ、そうでないならおまいさんが悪い・・・かな?
>当方サブウィンドウを開きたいのですが、 >Application.〜で作るとフリーズしてしまいます。 つまりメインフォーム以外のウィンドウを作りたいだけだろ? それはMDI子フォームなのかい?それとももう一つの独立したウィンドウ? ダイアログボックスか? どれもApplicationとか使わないよ。 どれをやりたいのかでちがうけど、 Form2.Show; これだけだよ。
まぁまぁ。「くだすれ」なんだし。 そんなにツッコミ入れるのもアレだよ。 質問者はやっぱり軽くでもいいから、検索するなりなんなり努力してから の方がいいってこったな。
>>604 このスレでは最初に検索しろとは言わないけど、回答しても何も調べず再質問されると
それをキーワードに調べろよとは思う。
今度のことは、最初から背景を書いてくれればなぁと。
ローレベルに向かうのも一つの手だけど、Delphiを使うなら最終手段でいいじゃん?
まずは目の前の問題を解決できるかどうかから見極めるべきだったんじゃないかな。
エラーが出るのはIDEじゃなくってアプリのことだろ。 お前らも偉そうにしてないで最低限人並みの読み書き能力を身に付けろ。
いや、今まで高度な技術を要求する開発環境でやってきた人が 馬鹿チョソのDelphiにかえって戸惑ってるだけと見たが…
>>606 もっと早く、お前が適切にアドバイスしてやれば良かったのにな。
別に Applicationで開いても問題ないけどなあ var MyForm:TForm; procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm, MyForm); with TButton.Create(MyForm) do begin Parent:=MyForm; Caption:='Button'; end; MyForm.Show; end;
610 :
デフォルトの名無しさん :04/02/25 08:42
文字を置き換えるにはどういう風にすればいいんですか? 文章の中の指定した文字だけ違うものに置き換えたいんですが・・・。
>>610 文章を複製しながら、頭から検索してゆく。
検索しては一致しない部分をコピー
一致したら置換文字列の方をコピー
という処理を書けばいいのです。
>>610 StringReplaceはダメかな?
ヘルプ > VCLリファレンス > ルーチン一覧(カテゴリ別) > 文字列処理ルーチン
まさにDelphi入門を読まなければならないって事態か
ありがとうございました。
616 :
デフォルトの名無しさん :04/02/25 09:00
クラスってのはな、わかりやすく言うと教室だ。 1年1組 だれそれ クラス分けってのは、それぞれのクラスにわけるってことだな。
フォームを作るのは、俺はだいたい「新規作成」から「フォームを作成」して、 新しく作ったUnitからvar form1: TFormを消去して、実行するprocedureに Form1 := TForm1.Create(Self); Form1.Visible := True;で、 作ったフォームのOnCloseにForm1.Release;って書くだけがほとんどだけど、 みんなどうしてる?
どんなフォームが必要かでそれぞれだから一概にはいえない。 procedure HogeClick(Sender:TObject); var dlg:TDialogForm; begin dlg:=TDialogForm.Create(self); try finally dlg.Release; end; end;
プロジェクト > オプション > フォーム
620 :
デフォルトの名無しさん :04/02/25 13:10
dbExpressを使って、テーブル名の取得ってどうやるのでしょうか? そのDBのテーブルをすべて一覧表示したいんです。
621 :
デフォルトの名無しさん :04/02/25 13:27
数字を0001とか表示するにはどうやってするんですか? ループで、0001.txtから0100.txtっといった、連番のファイルを作りたいんですが。 IntegerとIntToStrを使うと、0001.txtとしたいファイルが1.txtとなってしまいます。
>>621 Format('%.4d', [n]);
Format('%.4d', [nNumber])
∧_∧
( ・∀・) | | ガガッ
と ) | |
Y /ノ .人
/ ) .人 < >_∧∩
_/し' < >_∧∩`Д´)/
(_フ彡 V`Д´)/ / ←
>>624 / ←
>>625
おめでとうございます
>>529 です。
WinExecだとプロセスのハンドルの取得方法が分からなかったので
CreateProcessで起動して、TerminateProcessで終了する
方法で上手くいきました。
>>532 さん、ありがとうございました。
二つのTRectが、それぞれ重なっているかどうか判断する 簡単な方法を教えて下さい。
>>630 自分が作りたいなら
片方の4隅の点が片方のRect内かどうかを調べてゆく
大量にあるなら、その前処理として収まる円同士の中心距離を求めてハジク
633 :
デフォルトの名無しさん :04/02/25 17:17
共用体についてわかり易い例題はないものでしょうか?
>>631-632 なるほど。
ありがとうございます。自作と、IntersectRect両方挑戦してみます。
ごめん 点だけじゃダメだ。 輪郭が交わる条件も入れないと。 1、Rectに収まる円同士が交わる=中心距離が半径輪以下なら確実に重なる 2、Rectが収まる円同士が交わらないなら、確実に重ならない
>>635 それだと、ちょっとしたグレーゾーンがでてきませんか?
例えば上下に1pixだけ離れているときは判断できないですよね。
あ、ごめん、下のは無視して。刈り取りの手法を説明しようとしたんだけど、先にアルゴリズムのミスに気付いたものだから IntersectRect のように、領域を小さくする方式の法がいいですね。
640 :
デフォルトの名無しさん :04/02/25 19:16
Memoの内容を印刷するにはどうすればいいんでしょうか?
簡単にやりたいならフォームのPrintメソッドだけど、これは綺麗には印刷されない 自前で印刷するなら、 uses Printers; procedure TForm1.Button1Click(Sender: TObject); var i,y:Integer; var s:string; begin if PrintDialog1.Execute then with Printer do begin begindoc; for i:=0 to Memo1.Lines.Count-1 do Begin s:=Memo1.Lines.Strings[i]; Canvas.TextOut(10,y,s); y:=y+Canvas.TextHeight(s); end; EndDoc; end; end; 実際にはフォントを設定した位置を設定したり
今ヘルプ見て気づいたんだけど、TRichEditにはPrintメソッドがあるね。
壁紙にカレンダーを表示するやつを作りたくて、参考にしようと 2,3ダウンロードして使ってみたのですが、表示させた後 位置を変更できるということは、透明なフォームとかを使って カレンダーを表示させておけばいいということでしょうか?
>>644 あんまり好ましくないと思うな。
カレンダーを入れた絵を作って壁紙として作っておいた方がいいんじゃないの
>>645 あんまり好ましくないと思うな。
ほんとに壁紙にしたら低機能過ぎるし拡張性も皆無だし
初心者用サイトみると NULL → nil と書かれていますけど WinAPIで使おうとするとできないことがあります。 NULL = nil と考えてはいけない? 具体的にちょっと困っている件をあげます。 以下のような場合どう対処したらよいのか教えてください。 WinAPI CreatePopupMenu()は失敗したときの戻り値はNULLです。 そんなわけでnilを使ってみたところエラーになりました。 hPopup := CreatePopupMenu; if (hPopup = nil) then Exit; [エラー] この型には指定した演算子は使えません よくHPにおいてあるソースを眺めるとハンドルを返すAPIのとき 失敗の戻り値を0と想定されてる方が多いようで nilを型キャストしているという方は少ないみたいです。 この場合はどっちが適切なのですか? APIの戻り値NULLって確実に0が戻ってくるのですか? hPopup := CreatePopupMenu; if (hPopup = HMENU(nil)) then Exit; hPopup := CreatePopupMenu; if (hPopup = 0) then Exit;
Windowsに限って言えば NULL は値0の事。 ハンドルの場合、実際にはポインタではないので、NULLと書かれていれば無条件に0でいい。 気になるなら NULL という定数を定義しとけばいい。 一般的にAPIが帰り値をポインタを返す事はないと考えていい。(それだとVBから使えないから) アドレスを渡す場合はnilだ。
即レスありがとうございます 0 で書いておきます。
もしかして、将来 HMENU型がポインタ型派生にでもなった場合の事を考えると if (hPopup = HMENU(0)) ) then Exit; が一番正解だろうな
イミネー
Delphiのバージョンアップに伴ってAPIが-1を返す場合に if XX=-1 then がダメになった事があった。 だから、やっぱり定数はその型にキャストしておいた方が安全だよ。
プッ 自分でやってもいないことを他人に勧めるのはいかがなものかと。
>645-646 カレンダーを入れた絵を作って壁紙にする 1.カレンダーの位置をユーザーが変更しようとするのを どう察知すればいいのかな。 2.絵になっているのにどうやって位置変更しよう。 透明なフォームにして表示しておく 1.移動とかは簡単だけど、カレンダーの位置に他のプログラムの アイコンとかを持ってこれる? 2.カレンダーコンポーネントも透明にして、見た目数字だけにできるの? と、いう疑問が出てくる程度のレベルなんですが、やる気の問題だけですか?
655 :
デフォルトの名無しさん :04/02/26 10:28
質問です。 Delphiのインラインアセンブラでアセンブラの勉強をしたいと考えているんですけど、 お勧めの参考資料などありましたら教えてください。 アセンブラ自体は経験はありますが、x86を含むCISCのアセンブラは未経験です。
他にはHTMLを吐き出すとか
659 :
デフォルトの名無しさん :04/02/26 12:37
nil って ニルって 読むの?
う〜ん、今の自分には訳わからん。・゚・(ノД`)・゚・。 レスくれた人ありがとう。
661 :
デフォルトの名無しさん :04/02/26 16:30
空白か改行で区切られている文字列をTStringListに読み込みたいのですが どうすればよいでしょいか?
662 :
デフォルトの名無しさん :04/02/26 16:49
空白や改行で 区切って 入れたいのか? それなら 空白や改行を調べて 区切ればいいだけの話。
>>662 空白はposで' '(←空白を'で囲っている)で調べられたのですが改行はどうすればいいでしょうか?
よろしくお願いします
>>663 改行の文字コード #13#10 を指定
改行は特に意識しなくてもTStringListに入れれば自動で二行に分けられる
668 :
デフォルトの名無しさん :04/02/26 18:52
初デルファイでこんな事をしたいです。おねがいします。 Delphi7でXMLサーバーの機能を持たせたアプリから FlashのActiveScriptのMyXML_socketの関数でXMLオブジェクトを取得したい。 Delphi側ではXMLのテキストをもたず、すべてメモリー上操作、 変数をXMLに変えてFlashからのアクセスを受付てXMLを渡す一連のロジックを delphiのコードで教えてください。 またDelphiではフォームを持たない物で、コンポーネントをフォームに置くような 事ができなくて、コード上で生成??するみたいなタイプをお願いします。 ほんとにド素人で、やり方すらさっぱり。困っております。 (今日DELPHIという物を触りました。XMLもなに?状態です。)
669 :
デフォルトの名無しさん :04/02/26 19:04
動的変数を SetLength で要素数を増やした場合、 既存の要素のアドレスが変化することはありえますか? TTreeNode.Dataに格納したアドレスへアクセスする際に 一部の要素だけ EAccessViolation になるんですが
>>668 うーむ、やりたいことは分かったが、
>>670 の気持ちも理解できる。
多少迂回することになるにしても、ちゃんと基礎から始めた方がよいです。
> XMLもなに?状態です。
このような状態なら Delphi 以前の問題です。プログラミングより、
したいことの内容を自分で理解する方が重要なのでは?
>>669 既存の要素のアドレスが変化することはありえますか?
要素のアドレスってなに? メモリ上のアドレスなら変化すると思わないと
いけません。「動的変数」ってのもよく分かりませんが、動的配列のことなら
アドレスではなくインデックスを記憶させるといいのでは?
674 :
デフォルトの名無しさん :04/02/26 22:55
メモ帳などのファイルの、あるアドレスの値を読むにはどうしたらいいのですか?
>>668 方法論を考えるより、まず何をしたいのか
具体的なことをいってみたら?
別にXMLを利用しなくても通信する方法は
いくらでもある。
デスクトップに直接文字とかを描画したいのですが、 MLの過去ログを見てもいまいちわからないのですが、 素人でもわかるHPとか、教えて下さい。
Delphiとは直接関係無いのですが、 ツールバーやメニューなどに使われるBMPは皆さんはどこで仕入れているのでしょうか?
アドレスって何だろう? 話はそこからだ。
682 :
デフォルトの名無しさん :04/02/27 00:10
TssSimpleIPCを使いたくてJVCL210をDelphi7に導入でつまずいています。 そもそも、JCLを導入してからJVCLを導入する必要があるのでしょうか。 JCLの導入でも再構築でエラーがでて導入できません。だた、TssSimpleIPCを 使いたいだけなんですが、困っています。詳しく説明してあるHPとかご存知ないですか? お願いします。
深読みしてみると エクスプローラーの アドレス欄かな・・・
>>678 おかげさまで見つかりました。
ありがとうございます。
685 :
674です :04/02/27 06:21
アドレスとは、バイナリエディタで見たときのアドレスなんですけど、これでわかりますか?
ファイルが巨大ならメモリマップファイル。 そうでなければ普通のファイル処理関数。 sl: TStrings; c: Char; sl := TStringList; sl.LoadFromFile('foo.txt'); c := sl.Text[n+1]; // nバイト目を取得
>>679 すんません。私の質問の仕方が悪かったです。
こんな大げさじゃなくていいんです。
MLの過去ログ見てたら、Windows.Canvasでデスクトップに
字が書けることはわかったんですが、そのレスのやりとり
を読んでいたらアクティブデスクトップだとだめだとか
なんかややこしそうで、結局結論がないようだったので
お聞きしました。
再描画とかでフックは必要でしょうが、その前に確実に
かける方法が知りたいのです。
透明なフォームにして表示しておく 1.移動とかは簡単だけど、カレンダーの位置に他のプログラムの アイコンとかを持ってこれる? 2.カレンダーコンポーネントも透明にして、見た目数字だけにできるの? 1は他のウィンドウの下に隠れるようにはできるがアイコンはたぶん無理。仮にできても見づらいだけのような。 2はC#のフォームの標準機能にある。Delは標準じゃ無理だな。
X Windows.Canvas O Windows.TextOut
690 :
デフォルトの名無しさん :04/02/27 09:23
実行時にTToolBarへボタンを追加するにはどうすればいいでしょうか?
>>687 MLよりくだすれが上だとでも思ってるんだろうか
692 :
デフォルトの名無しさん :04/02/27 09:41
ZLibを使用した場合は別途DLLを配布する必要があると どこかで見たのですが本当でしょうか?
>>691 思ってるけど、違うの?
ていうか、MLって結論出ずに終わるレスが多いなと思ってるので
私としては、こっちがいい
695 :
デフォルトの名無しさん :04/02/27 10:11
DLLを配布する必要があるのは、DLLを使ったときだ。 ZLibが DLLを使うかどうかは 知らん。 っていうか、作るときに DLLがあるかないか わかるだろ。 DLLを削除しても動くようならば、いらないんじゃない?
696 :
デフォルトの名無しさん :04/02/27 10:21
>>690 TToolButton.Create(ToolBar1).Parent := ToolBar1;
>>694 なるほど ZLibCソースから作ったobjを直接呼び出してるからDLL不要なんだ
どうせ必ず文字かアイコン指定するんだから無駄なコードだよ
MHT/MHTMLを扱うにはどうしたらいいですか?
バラバラのファイルをまとめて保存したいです。
IEのお気に入りの並び順どおりにIEのお気に入りを表示させる方法をお教えくださいませ。 donutのソース見てるんですが、どうにもこうにも。
706 :
デフォルトの名無しさん :04/02/27 18:20
>>702 Delphiでどうしたいのよw
超初心者スレだからといって舐めていないか、お前
707 :
デフォルトの名無しさん :04/02/27 18:28
radiogroupの項目名をstringに代入できませんか? radiogroup.itemsかと思ったのですが「stringとTstringには互換性がありません」と言われます。
radiogroup.items.Textならどうだ?
>>707
>>708 駄目でした・・・全部の項目名が出てしまいました。
追加 最初の項目だけとかなら RadioGroup1.Items[0]
Delphiでそういうことが出来るソフトをと思いましたがなにか変ですか? すみませんでした。 忘れてください。
>>712 「MHT/MHTMLを扱うプログラムを作ってよこせ」と言ってるようにしか見えん。
どこまで作ってどこでつまづいているのか具体的に質問してくれ。
サイトの宣伝したかっただけか、そうじゃなきゃ、たんに小学生みたいだな
あっ、191はフサギコすれのものです。すみません。
よくわからないので教えてください procedure TForm1.Button1Click(Sender: TObject); var fs:TStream; begin //'hoge'は存在しない try fs:=TFileStream.Create('hoge',fmOpenRead or fmShareDenyWrite); except On Exception do showmessage('hoge'); end; fs.free; end; free すると例外が出るんですけど コンストラクタの中で例外が発生した場合は解放しなくていいってことですか?
>>718 コンストラクタで例外が起きると、すぐにデストラクタが実行される。
(そのため、デストラクタは不完全なインスタンスに対しても正常に対処できるように
設計されなくてはいけない。)
で、例外が発生すると、インスタンスのポインタがfsに代入されることは無い。
コンストラクタ?
procedure TForm1.Button1Click(Sender: TObject); var fs:TStream; begin //'hoge'は存在しない try fs:=TFileStream.Create('hoge',fmOpenRead or fmShareDenyWrite); try //いろいろ finally fs.free; end; except On E: Exception do showmessage(E.Message); end; end; こんな感じかな・・・書き換えるとすると。
>>719 なるほど、よくわかりました。
さんきう
723 :
デフォルトの名無しさん :04/02/28 00:36
ひとつ伺ってよろしいでしょうか。 数値入力フォームが2つあって、その二つの数字に対して計算した結果を3つめのフォームに書き出す プログラムを作っています。 このときに、右クリックしてポップアップメニューをだし、演算方法を選択するのですが、 左と右を足す 左から右を引く 右から左を引く 左と右をかける 左を右で割る 右を左で割る があります。 そこで、右のフォームの中身が0のときは、「左を右で割る」を実行させたくないのです。 逆の割り算も同じで、引き算は大きい方からしか引けないようにしたいのです。 「左を右で割る」のときは if (RightForm=0) then MnuDivLtoR.Enabled := False; として選択できないようにしたのですが、表示自体をけすにはどうやったらいいのでしょうか。 また、できれば、ポップアップメニューを右クリックじゃなく左クリックにしたいのです。
>ひとつ伺ってよろしいでしょうか だめ フォーム1枚に数字が1個? やたらとムダ多くね?窓移動したら左右変わるし っていうか、何の表示を消すの?フォーム? Form2.Hide; 左クリックにすると既存のアプリと違いすぎてかえって使い勝手悪そう そうするくらいなら足し算ボタンとか引き算ボタンとか置くほうがマシ
725 :
デフォルトの名無しさん :04/02/28 00:54
>>724 ええ、ボタンのほうが使い勝手がいいのも、右クリックのほうが使いかってがいいのは
分かっています。
練習で作っているので、無駄は承知の上なのです。
フォームじゃなくてエディットの間違いだ、ということを本気で
想像できていないとしたら、
>>724 は人間的に超初心者以下。
727 :
デフォルトの名無しさん :04/02/28 00:59
すいません。何を消すのかについてです。 たとえば、左に3 右に0がはいっていたら、 ポップアップメニューの選択肢を 左と右を足す 左から右を引く 左と右をかける 右を左で割る としたいのです。
Visible
Visible := True or False
>if (RightForm=0) then MnuDivLtoR.Enabled := False; MnuDivLtoR.Enabled := RightForm<>0; こう書いたほうがすっきり・・・多少意味が違うけど。
不細工な実装 function Waru(i1, i2: Integer):Integer;//i1:割られる数字,i2:割る数字 function IsWareru(i :Integer):Boolean; begin if i = 0 then Result := False else Result := True; end; begin if IsWareru(i2) then Result := i1 div i2 else Result := KekkaForm;//値を変えない end;
>>726 いや、そのくらい想像できるけどな。
プログラマとしてそんなことあり得ないと思う方が強かっただけさ
右クリックを左でとか言ってたから、意味不明な実装は十分にあり得ると思ったんさ
ユーザーとしてフォームに数字1個なんてあり得ないと思うべきだったな
visibleをFlaseにするだけでできるのですね。 いろいろ考えすぎました。 ありがとうございます。
735 :
デフォルトの名無しさん :04/02/28 17:26
メモ帳など縦スクロールバーがあるコンポでつまみ(マウスでドラッグするときのやつ)の位置が 一番上にきた、あるいは下にきたことを感知するにはどうすればよいのでしょう。 マウスのドラッグだけではなく、メモ帳ならカーソルキーなどでスクロールして上端(下端)にき たときでも感知したいのです。 スクロールバー+メッセージハンドラで検索しましたが適当な例を見つけることはできませんでした。
先生! 最近バックアップファイルを作らないようにしたんですか、 バックアップをしていた時のプロジェクトには当然バックアップが残っています。 そこで質問なのですが、~これがついているファイルはバックアップファイルだから全部消していいんですか?
>>736 多分大丈夫だと思うが、念のためにファイルのバックアップとっておくことを
お勧めする。
>>737 あ、それは、バックアップファイルのバックアップ、を取るのでなく
プログラミングをするときは、バックアップを取りながらやるべき、ってことですよね?
でも、フォルダが汚くなっちゃうんだよなぁ・・・
Delphi終了したらバックアップファイルを消すとか、隠しファイルにするとか、できないんでしょうか・・
>>783 ハードディスクのクラッシュ以外に、修正が失敗したときを考えて、
元に戻れるように、大きな変更をする前に一式バックアップとっているよ。
というか、VisualSourceSafe使っているがw
いまどき、ハードディスクに余裕が無いわけじゃないし。
万が一考えたらたいしたこと無いだろ。
>>740 何のためにペイントイベントとクリップリージョン関数があるのかと
小言を言いたい。
> BitBltとかPaintToを使って画面に字は書けるのですが はぁ? なんかさぁ、デスクトップカレンダーとかの前に知る必要があることが一杯あるんじゃね?
そんなにいじめることないのに…。
つーか、
>>740 のサイトつながらない気がするのはオレだけか?
検索したら違うサイトがあったが…。
グリッド配置でコンポーネント位置を調整してくれるいいレイアウト マネージャの誰かしらねえか?
忘れてた。あと、ばりゾウゴンリージョン関数が2chにあるのを 忘れないように。
> あと、ばりゾウゴンリージョン関数が2chにある
さすがぁ、たしかに
>>693 のいうとおり ML よりいいかも!
>>743 そんなにいじめることないのに…。
ならちゃんと教えてやれよ
749 :
デフォルトの名無しさん :04/02/29 07:27
ListBox1.AddItem(Str, ListBox1); の第二引数をnilにしても正常に動作するのですが、 その存在意義がよくわかりません。ヘルプ見ましたが 英語でしたので・・・。どうか教えてください。
>>751 レジストリいじるよりAPI使ったほうがよくね?
窓の手もWindowsのバージョンをデスクトップに 描画するオプションがあるよね。 壁紙とかいじってる様子がないのよね。 漏れもやり方知りてぃです。
少なくとも
>>750 のリンク先アプリは直接描画してるんじゃなくて、
アプリ実行中 アプリがマーカを表示させて、その位置をレジストリに記録
アプリ終了後 単なるBmp壁紙=Windowsの壁紙機能にまかせる
という戦略みたいだよ。
>>754 「デスクトップ 描画 デバイスコンテキスト」とかでぐぐってみては?
あとはW32APIスレで聞くか。
>>755 Windowsの壁紙機能ってどういうの?
今の壁紙のBitMapと合成させるて、レジに登録じゃなくて
他のやり方があるってこと?
>>758 いや、そのやり方の事だよ。
なんか自前で描画してると思ってる人がいるみたいだから
SystemParametersInfo API 画面のプロパティで壁紙が変更された場合は Windows が WM_WININICHANGE メッセージで通知してくれる。 (書き換えたビットマップを反映させる時に再帰呼び出しにならないように注意) 画面の右下にバージョンを表示する機能は Windows の機能。 確か Windows 2000 の RC 版はこれが消せなかった記憶がある。
>>759 自前で描画してるとおもた。
壁紙合成なら、元の壁紙をどこかに待避させて
ると思って調べて見たのですが、そんな感じじゃ
なかったもんで。(調べ方も悪いとは思いますが)
ありがとうございました。
壁紙と合成させるのはいいけど、 ビットマップの小さいのを並べて壁紙にしてるときは どうすんの?
小さいの並べて合成するんでは?
((≡´Д`≡))
Delphi5のEnt版もってますが、付属のSQL-Linkは Oracle8までしか対応してないようです。 Oracle9に接続したい場合、Updateする方法は あるのですか?
業務プログラムについてくだすれで質問するのかー。なんかなー........
>>765 Dyrect Oracle Accessを使ってみれば?
いいぞあれは。至れり尽せりって感じで。
>>767 DOAですか。なかなか安くてこんなの欲しかったん
です。情報ありがとうございます。
なんかなー、コマーシャルくせー
>>767 なんかわざとスペル間違ってるシー
>>748 何でお前は教えてやんないの?
「オレは教える気が無い」なんて返すなよ。
糞味噌一緒だから。
>>767 が社員かどうかは置いといて、本当にいいよあれは
>>769 某全国チェーンのシステムでも使ってるし。
でも別にDBが9iでも特殊なことをしてなければ問題なく使えるはずだけどね
>>765
わざと間違ったんじゃないんだけどな… しかもCMと思われてるし…ショボーン
774 :
デフォルトの名無しさん :04/03/01 09:39
変数Aのアドレスってどうやって取得するんでしたっけ?
@
うまくいきました。thx!!
777を頂くとしよう。
String 型の変数から Array Of Char 型の変数に代入するにはどうすれば?
short string以外、区別ないだろう。 文字列操作関数使えば全く同じく扱えるだろうし。意味わかんない。
StrPCopy
カレンダーにweeknunberってあるでしょ。 プログラムでこの日は何週目って言うのを求めたいんだけど、 どうすtればいいの? MSC_WeekNunberが怪しいと思うんだけどこれって、API?
783 :
デフォルトの名無しさん :04/03/01 22:42
うーむ…。 なんで自由にフォームの作成、消去ができないんだ? form.destroyってやるとエラー起こすし。
formはReleaseで消すのが礼儀なんだ。
785 :
デフォルトの名無しさん :04/03/01 23:14
おお、消えたよ。ありがとう。 消えたんだけど前のフォームが出てこない…。 簡単に表示ってできるのかな。 それとも結構な行数必要な高度なテクニック?
>>781 Week Year The Of
パーツを教えてや(ry
ちなみにReleaseしちゃったFormをShowするとエラーになるのは特に言わなくても解るよな。
おそらく、「消す」ってのは初心者スレ的に「画面から消す」と想像可能。 HideとShowがお求めのメソッドかと思われます。
質問してる人をメチャクチャ初心者であると決めつけてOKだよ。 「そこまで初心者じゃない」とか言い返す人はスレ違いだし。
確かにその通りですね.
>>749 リストボックスの項目情報には項目を示す文字列の他に任意のオブジェクトの場所を記憶することができます.
(その項目に関連づけられたオブジェクトとの場所を記憶するのに使います.
無関係なオブジェクトの場所を記憶する事もできますが無意味です)
よって ListBox1.AddItem(Str, ListBox1) というコードは意味がありません.
実害はないでしょうがソースコードを読む人(未来の作者自身を含む)が誤解するおそれがあるので
関連づけたいオブジェクトがない場合は ListBox1.AddItem(Str, nil) あるいは ListBox1.Items.Add(Str) とします.
>>780 配列のインデックスが0以外から始まっている場合には使えませんが,
>>778 さんは多分0ですよね.
>>785 フォームを消すといっても破棄する(ぶっ壊す)場合と隠すだけの場合とふたつあるのです.
>>791 > よって ListBox1.AddItem(Str, ListBox1) というコードは意味がありません.
いろいろな状況が考えられる。フォーム上のコントロールの一覧とか。
なぜ意味がないと言い切れるのか
> 配列のインデックスが0以外から始まっている場合には使えませんが
で、0以外から始まっているときはどうするの?
<Array Of Char 型の変数> って動的配列なんじゃないの?
ガ━━━(゚Д゚;)━━━ソ! カレンダーのソースを調べてたよ。 サンクソ
>>793 TDateTime型の整数部は連続した日になっているから
その年の正月
Trunc(EncodeDate(xxxx,1,1))
DayOfWeekで求まる正月の曜日-1
求めたい日から、これらを減算して整数化して 7で割れば?
>>794 つーか
>>786 がヒントを出してるけどWeekOfTheYearという関数があるんだけどね。
>>792 書き方が悪かったかもしれませんが
>>749 のさんの書き込みを見るに
『AddItemメソッドの第二引数にそのリストボックス自身を指定しなければならない』
ように誤解されているように思えたのでその指定は無意味ですといいたかったのです.
第二引数にオブジェクトを指定する事に対して意味がないという意図ではありません.
array of char型についてはこちらの勘違いです.
勝手に静的配列の事だと脳内変換してしまいましたが確かに動的配列の事ですね(ツッコミに感謝します).
ヘルプ(Delphi 5ですが)には『動的配列の添字は常に整数であり,0 から始まります。』とあるので
配列のインデックスが0以外から始まっている場合の事は考慮しなくても大丈夫ですね.
そういえばstring型の値をchar型の動的配列にコピーするならこんな感じにあらかじめコピー先領域を確保しないとまずいのでは?
var ca: array of char; s: string;
(中略)
SetLength(ca, Length(s) + 1); // コピー先領域の確保.『ヌルで終わる文字列』は末尾にヌル文字(#0)が付くので1個余分に必要
StrPCopy(@ca[0], s);
797 :
デフォルトの名無しさん :04/03/02 09:07
リリースしちゃったら クリエイトしなおしじゃん。 一時的に隠すなら ヒデ したらいいな(w
array of Char のバッファを使うよりも PChar で宣言したポインタに AllocMem して StrPCopy するほうが実体の存在を気にしなくて済む分わかりやすいんじゃない?
普通 var p:PChar で文字列を扱うなら、 文字列 str:String を p:=PChar(str); とするのが、普通の手法だと思う
渡すだけのパラメータならもちろんそうだけど、API から文字列を受け取る場合は PChar を使う方が一般的じゃないの?
array of Char というのはCプログラマ的発想だね。 ネイティブなDel(Pascal)プログラマなら string が普通で API等を使う際だけやむなく PChar をかますという感じかな。
つうか、stringは何もしなくても、コンパイラが必要に応じて変換関数 とかを自動的に補完してくれるんだが。PChar(s)でいいんだよ。 逆アセンブルしたコード見てみな。ANSI->UNICODE変換まで自動でやってくれるし。 逆に大きなお世話というのもあるがw
APIから文字列貰う時も SetLength して PChar(str)だと思う
TTreeView.AlphaSort はすべてのノードのソートをするようですが、たとえば指定したノード(子 ノードを持つ)だけソートというのはできないのでしょうか? CustomSort がそうではないかと思ったのですが、違うみたい。自前でコーディングするしかないの かな。
残念ながら出来ない。自前でしる。
ちなみにCustomSortはソートの順序をカスタマイズするためのもの。 (たとえばノードのObjectプロパティの中身を使って並べ替えるとか)
customSortは正直未だにわからん
Customだからアレなんだな、きっと
>>787-789 ,791
ありがとう。できたよ。
こんなに簡単に消したりできるんだなぁ。
1年くらいかけてゲーム作るんで、できたらウプするよ。
楽しみにして待つてまつよ。カツカレ〜
レジストリのどこかで色のデータが 0 0 128 とか 書かれている場合に、この色をフォームの色にする方法なのですが、 スペースで文字列分解してから var myColor:TColor; begin Form1.Color:=RGB(0,0,128); みたいにするしかないですか? 他にもっと簡単な方法とかってないですかね?
質問が変なので訂正。 文字列分解とかしなくても、簡単にできないかってことです。
簡単にする関数を用意すればよろしいかと
関数書くのメンドクセーから教えろ!っていう質問なんじゃないの
816 :
デフォルトの名無しさん :04/03/03 22:43
>>812 正規表現ライブラリが標準で搭載されているまともな開発環境なら簡単にできますが
Delphiでは簡単にはできません。アホみたいに文字列分解してください。
>>816 >正規表現ライブラリが標準で搭載されているまともな開発環境なら簡単にできますが
簡単なら書き込むより早くコードを見せてくれるんだろうな。頼むぜ。
嘘じゃないだろう。ほら、もう、書き込んでから10分以上経ってるから
すぐ貼り付けられるよな?
そんなこというとまた変な煽りがくるぞ つーか正規表現ライブラリくらい自分のDelphiに導入するだろ?
レジストリを簡単に圧火炎の会!
D8.NETなら標準で…
>>817 puts $1, $2, $3 if "0 0 128" =~ /^(\d+)\s*(\d+)\s*(\d+)$/
Cでやってみろよ。
823 :
デフォルトの名無しさん :04/03/03 23:19
算術代入演算子や3項演算子ある?
ない
825 :
デフォルトの名無しさん :04/03/03 23:41
>>817 puts "0 0 128".split /\s+/
Delphiは他の言語と比べて文法が違いすぎる。 初心者には取っ付き難く、馴れた人は離れられない 排他的な言語だと思います。 諦めます。(移植が大変そうなので・・)
レジストリからとってくるところがないので駄目
>>812 が晒している(質問している)部分に対応してるので十分だろ
> Delphiは他の言語と比べて文法が違いすぎる。 他の言語がなにかにもよるけど、C# C C++ Basic なんかの手続き言語には きわめて近いと思うけど? Pascal は日本ではマイナーなのでオタっぽく 見られがちだけどね。もともと教育用につくられたので初心者にはやさしい と思う。
そもそもレジストリから取れないような開発環境では問題外です。
puts Win32::Registry::HKEY_LOCAL_MACHINE.open('Software\YourApp')['Color'].split /\s+/
>>830 TRegIniFileというクラスが完備されているのでモーマンタイ。
こっちの方がもっと簡単? TRegistryIniFil
eが抜けた〜
実はそのレジストリ値がそもそも文字列型でなかったというオチ
みなさまご協力ありがとうございました。 正規表現を勉強します。
しかしアホみたいに文字列分解してもたいしたことないんだけどね
そのたいしたことのなさが積もりに積もってDelの生産性を落としているわけだが。
812の質問はそれ以外、ということだよね
正規表現がないと駄目って場面がつもりつもって、という場合はそんなにたくさん あるもんなの? そのほかの Delphi の生産性の高さを帳消しにするくらいの
正規表現がないと駄目ってことはないだろう 非常に不便なだけ 公開されてるライブラリ使えばいいだけ
ま、しかし標準でついてないのはマイナスだよな
uses RegExpr; var re: TRegExpr; begin re := TRegExpr.Create; try re.Expression := '(\d+)\s+(\d+)\s+(\d+)'; if re.Exec('0 0 128') then ShowMessage(Format('%s,%s,%s', [re.Match[1], re.Match[2], re.Match[3]])); finally re.Free; end; end;
そら単機能なラッパーかませばなんだって一行になるだろ
そら便利なライブラリをつかえば簡単にできる、というのと大差ないよね
もとに戻って
>>812 の質問にたいして
>>814 の回答は的を射てるね。
その関数に正規表現ライブラリを使おうと単機能な関数を探してこようと
問題は解決する。自分で書いてもいいし。
>>848 全然射てないね。
ラッパーを作ることの欠点はラッパーを作らないといけないこと。
全体での複雑さはまったく低減していないし、
柔軟性に欠けるのでラッパーの再利用性も低い。
それを簡単とはいえない。
>>849 >ラッパーを作ることの欠点はラッパーを作らないといけないこと。
あたりまえだろう。特定の問題について正規表現ライブラリをつかっても
特定の正規表現を書かなければならないだろう。
今回の問題では、
>>816 のように正規表現を使わなければ簡単じゃない、と主張
するのもいるし、オレみたいに正規表現より関数書く方が何倍も簡単とおもうのも
いる。
> 柔軟性に欠けるのでラッパーの再利用性も低い。
'(\d+)\s+(\d+)\s+(\d+)';
これがほかの問題にどのくらい再利用できるのよ。正規表現自体は汎用性に優れている
ことはもちろん認めるが、特定の問題を解くためには特定の正規表現を利用する
わけだろう? 簡単かどうかはそれぞれの分野での習熟度によるので、ひとぞれぞれ
だろうさ。おれには正規表現のほうが何倍もむつかしい。
812です。 単純に関数を自分で作れば良いんですけどね。 私が疑問に思ったのはレジストリから色データを読むと、 '0 0 128' みたいになる訳ですよ。 これくらいなら、TStringListとかのコンマテキストにしてやれば良いんで、 わざわざ正規表現ユニットとかを入れなくても済みます。 しかし、レジストリのデータ形式が'0 0 128'みたいなっているのは、 当たり前のことなので、何故、標準で関数を用意してるんじゃなかろうかと 探していたのです。 ここ数年、某のやる気の無さには・・・
年寄りと言われるんだろうけど、Delphiは一応構造化+OO+コンパイラだからさ 構造化言語というのは、概念を"自分で"積み上げてゆくもんなんだよ。 その手続きの中で何度か出て来る部分は、関数内関数にする。 ものユニット内でよく出てくればユニット内関数にする。 その外でも使うならグローバル関数にする。 そういう事を通して抽象化を実現するのが構造化言語だと思うんだけどなあ。 そこがしっかりしてないとOOの使う側 --> インタプリタ的にシフトしちゃわない?
>しかし、レジストリのデータ形式が'0 0 128'みたいなっているのは、 >当たり前のことなので 色をレジストリに保存するとそういう形式になるの? $00000080でなくて?
くだすれDelphi(超初心者用)その11
http://pc2.2ch.net/test/read.cgi/tech/1076609666/852 >>852 >当たり前のことなので、何故、標準で関数を用意してるんじゃなかろうかと
>探していたのです。
>ここ数年、某のやる気の無さには・・・
そういう批判の仕方はちょっとないんじゃないかと思うよ。
# スペース区切りの値はコンマ区切りの値ほど一般的ではないので
それを極限まで推し進めると「標準であらゆる便利なアプリを用意していないWindowsはやる気がない」
ってことになってさすがにそれはナンセンスでしょ?
'0 0 128', '0,0,128', '<li>0</li><li>0</li><li>128</li>'等々を分割できる関数の集まりを前もって用意することより、
任意のルールで区切られたデータを効率的に取り出す機能の方が便利じゃない?
任意の目的のためのアプリを効率的に作り出す機能(=プログラミング言語)が便利なように。
標準で正規表現クラスが提供されていないので食わず嫌いが増えてしまったのはなんとも残念な話だな。
>>854 たぶん、
HKEY_CURRENT_USER\Control Panel\Colors
の事を言ってるんだよ。
Borlandは整数型を使ってる
TMemoの3文字目だけ色を変えるとか出来るでしょうか?
TMemoはTEditと同じWindows EDIT コントロール だから3文字目だけ色を変えたいなら、そこを選択状態にする以外は、まあ無理だと思った方がいい。 それよりTRichEditや Web上に公開されてるエディターコンポを使う事を考えた方がいい
>>855 >ってことになってさすがにそれはナンセンスでしょ?
極論をいってそれをナンセンスというのは、それこそナンセンス。
正規表現ライブラリを標準装備している環境もあるんだから、そうでないのは
開発元の怠慢、という批判はナンセンスではない。
って、おなじ結論か。スマソ
いちおう、「くだらないスレ」じゃなくて、 「くだらない質問スレ」なので、そろそろ控えてね。
正規表現ライブラリを後から導入することなんて面倒でもなんでもないんですけど、 皆さんはどのライブラリを使ってますか? なんか、色々あって、どれがいいのかわからんのですけど。 一応、自分自身の希望としては・・・ ・ソース公開(いつのまにか開発停止、というのはイヤなので) ・ライセンスが緩い(明記さえすれば有償ソフトにも組み込める程度で) ・Perl互換がいい ・Perl程度の性能で十分 ・日本製じゃなくてもいいから、ユーザが多い方が良い ・日本語を意識した処理は自分としては不要 何がお勧めでしょうか?
>>858 ありがとうございます。やっぱりTMemoだと出来ないんですね
他のを使ってみることにします
865 :
デフォルトの名無しさん :04/03/04 11:41
>>826 他の言語をやったことがない初心者ならば、どれをやっても同じだと思う。
Delphiしかやったことがない初心者が他の言語をやるならば、とっつきにくいのは 当たり前なのでは?
>>812 まだやってたのか、 正規表現使わなくても、スペース区切りは簡単にパース可能
function RegColorText2Color(s:string):TColor;
procedure MyRaise;
begin raise Exception.Create('正しい レジストリ色データでない'); end;
var p:PChar; maxlen:Integer;
function get:string;
var i:Integer;
begin
SetLength(Result,maxlen);i:=0; // パースして元の文字列の長さより増える筈がないから
if ( p^ in[#0..' ']) then MyRaise;
while not ( p^ in[#0..' ']) do begin
inc(i);
Result[i]:=p^;
inc(p);
end;
while p^ =' ' do inc(p);
Setlength(Result,i);
end;
var r,g,b:Integer;
begin
maxlen:=length(s)+4;
p:=PChar(s);
r:=StrToInt(get);if p^=#0 then MyRaise;
g:=StrToInt(get);if p^=#0 then MyRaise;
b:=StrToInt(get);
Result:=RGB(r,g,b);
end;
これが、正規表現より1桁速度も速いし、普通に使われる手法だと思うよ
使い方
Form1.Color:= RegColorText2Color('0 0 128');
初心者スレだから解説しておくと 文字列処理は
1、基本的に1文字単位にまで条件を分割する
スペース区切りなら、
[制御文字以外の文字の連続] [スペースの連続]
というふうに分解して、それをそのままコードに書けばいい
2、移動、複製は少ないように考える事、
移動、複製が入っていると、文字列処理はO(n^2)になってしまう事が多い
・ホントは
>>866 のコードはパースしながら10進変換したいんだけど、余計にわかりにくくなるから我慢した
(パースしながら変換すれば、帰り値への複製も必要なくなる)
3、長い文字列になる可能性があるなら先にバッファを取っておいて後で文字数を設定
2と同じなんだけど、文字列の加算は複製が発生する可能性があるから遅くなる。
・文字数が30文字以下と判ってる場合は文字列同士を+で加算してもそう変わらない
さらに、解説 正規表現からパーサを作る場合 例:'(\d+)\s+(\d+)\s+(\d+)'; (〜) は返り値の単位 get みたいな関数内関数が返す単位と考える \d は0〜9迄の文字だから ['0'..'9'] と置き換える。 後ろに + が付いて if not (p^ in ['0'..'9'] ) then MyRaise; //0〜9でなければいけない。 while ( p^ in ['0'..'9'] ]) do begin //0〜9が連続する というふうに分解する。 これは(〜)で囲まれているから、このループ内を帰り値にすればいい。 で最後に \s+ は空白が連続するという事で while p^ =' ' do inc(p); となる。
スペース区切りの数値を分割? 正規検索も外部ライブラリもまったくいらない。 function RegColorText2Color(s:string):TColor; var Split: TStringList; begin Split := TStringList.Create; try Split.CommaText := s Result := RGB(StrToIntSplit[0]), StrToInt(Split[1]), StrToInt(Split[2])); except {EConvertErrorやEListErrorを捉えて好きにエラー処理や例外生成} end; Split.Free; end;
ごめん例外生成したらリークだ。try finallyが要るな。
それはDelimiter=' ' と DelimitedTextを使ったつもりだと思うが・・・・
>>866 汚いコードだ。しかもレジストリから一回読み出すだけのコードに一桁早いも糞もないな。
正規表現ライブラリを標準装備していないとどうなるか
>>863 (ライブラリが) 色々あって、どれがいいのかわからん
>>870 自分で書いてリーク発生
>>812-871 無駄な時間を浪費する
もうみんな System.Text.RegularExpressions 使ってるぜ
>>871 Del7は知らんけど5,6ならこれで動くよ。commatextの仕様。
そのために困ることもよくあるけど。
>>875 そなの? そんでもって誰も使ってくれないアプリをつくってるんだよね!
コントロールとかを気にせず、 単純に、今マウスを動かしたりクリックしたりするのと同じ結果を得るには どうすればいいんでしょうか?
System.Text.RegularExpressionsよりはBoostRegex++を使った方が早かった(C++でしか試してないけど)
Boostだもんな
>>812 var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Delimiter := ' ';
sl.DelimitedText := '0 0 128';
Form1.Color := RGB(
StrToInt(sl[0]);
StrToInt(sl[1]);
StrToInt(sl[2]);
);
とかはどうか。
しつこ杉。812はコードの書き方がわからないわけじゃないだろ。
>>816 でFA
上に誰かが書いてるやん・・・・・
Indy9.0+Delphi6personalでBase64ためしてるんだけど、 どうも IdEncoerMIME1.Encodeのあたりで アプリケーションが応答なしになる。 何か決定的に見落としてるのだろうか。 var fs: TFileStream; begin if SaveDialog1.Execute then begin fs := TFileStream.Create(SaveDialog1.FileName, fmOpenRead); try Memo1.Text := IdEncoderMIME1.Encode(fs); finally fs.Free; end; end; end;
SearchBuf 関数 はどのユニットを Uses すれば使えるのですか? ヘルプには書いてないし、そのままでは使えない…
Source\*.int以下をgrepしとけ
>>885 Memo1.Text := が怪しい
ファイルサイズが大きすぎるという事はない?
>>885 Indyをアップグレードしる。もしくは自分で直せ。
下のプログラムを実行すると アクセスバイオレーションが出るんですが。 var b:PAnsiChar; begin GetWindowsDirectory(b,MAX_PATH); ShowMessage('1'); end; 何がいけないのでしょうか?
>>891 それをC言語にすると
char *b;
GetWindowsDirectory(b,MAX_PATH);
ね? ダメでしょ?
だから、こうしなさい。
var b:string;
begin
SetLength(b,MAX_PATH+1);
GetWindowsDirectory(PChar(b),MAX_PATH);
>>892 おぉぉぉぉ 神だ
ありがとうございます。
だ、だれかGetGlyphOutlineのフォーマットが GGO_GRAY4_BITMAPを指定しているサンプル をお持ちの方はおりませぬか…
>>879 一日たってしまいましたが・・・・・・
つまり、マウスの操作を擬似的に再現するにはどうすればいいのでしょう?
カーソルを(500,500)のとこに持ってく、みたいな。
>879 SendMessageかmouse_eventでだいたい再現できると思う。
ビットマップにドットを打つ場合、 一番高速に処理できるものってどれなんでしょうか ScanLine? それともAPIから?
レジストリから REG_BINARY を読み込んで 文字列にして表示する方法はどないすればよかとですか? ReadBinaryData や APIの RegQueryValueEx を使ってもどうにもうまいこといかんのです。
バイナリデータを文字列にして表示する方法は知ってるの? それともレジストリから取るのができないの?
901 :
デフォルトの名無しさん :04/03/05 22:46
誘導されたので、こちらで質問よろしいでしょうか。 バージョン6のパーソナル使ってます。 MP3を鳴らそうとして、コンポーネント、ActiveXからWindowsMediaPlayerを追加しました。 ここで、繰り返し再生させたいのですが、WMPの設定で連続再生のボタンにチェックをいれても 1回しかならずに止まってしまいます。 どのようにすれば繰り返し再生できるのでしょうか。 なお、通常のTMediaPlayerを使用すると富士通のパソコンだと動くのですが、 vaioだと鳴らなかったりしたんで、WMPをインストールしました。
902 :
デフォルトの名無しさん :04/03/05 23:45
D6 Proで組んだプログラムなのですが、 Keybd_eventでキーの模擬をしているのですが、Win2000では何の問題も無いのに XPではたくさんエラーが出てしまいます。 XPをクラシック表示にしても同じです。 この症状の回避策ってご存じ無いでしょうか? 他のスレが良ければ誘導してください。
とりあえず、「エラーが出ます」って場合は そのエラーを書くのが(略)
>>903 keybd_eventを使って100回ぐらいキーを入力させているのですが、
Win2000マシンではなんの問題も無いのに、XPマシンだと模擬したキーが抜けるとか、
全くキーコードが送出されないときがあるんですよ。
NT系のOS は何故かキーをロストする妙な現象が昔からあったからね。 (キーボード端子から10mS以内に2つのキーを送ると2つめが無視される) とりあえず時間を置いてみたら?
keybd_event は物理的なキー押し下げをエミュレートしているわけではないから 関係ないんじゃないかな? >10mS以内に2つのキーを... ってのも、単にキーボードが壊れているかドライバがタコか... 906 の思い込みだと思う。 どこかにこの件について公開された資料ある?
釣りではないし、マジな話だよ。 PS2キーボード端子用バーコードリーダのソフト作ってたからね。 ドライバがタコなのか、OSがロスとするのかは判らなかったけどな。
なるほど。キーボード入力をキーボード以外の用途に使う。って話だね? 905 さんは、keybd_event API に関して、MSDN をよく読むこと。 現在の WIndows では、非推奨 API になっている。sendinput か何か代替 API が あるのでそれを確認。 たぶん、テキストサービスあたりの問題ではないかなと思う。
皆さんレスありがとう。 910殿の書いた代わりのAPIに非常に興味があるのですが、 それはどのようなAPIでしょうか? 解決策が分からないので、今日秋葉を徘徊した時にWin2000の ライセンスを探し回ってた・・・ APIが分からなかったらOSをVersion Downするしかないのかな?鬱
ListViewをvsReportで表示しているとき、キャプションが表示しきれないと ぴこっとキャプション全体が表示されるのを止めたい。 だけど、カーソルを合わせたときにはInfoTipを表示したい。 これを実現する方法があったら教えてください。
ん?カラム幅って表示されるもんの長さによって自動的に変わったっけ? デフォルトで ... になったと思うんだが カーソル合わせれば内容出るし 質問読み間違えてるのかな
>>914 びろーんと横一本になるのが気に食わないのですよ。
OnInfoTipでテキスト突っ込めばInfoTipで改行表示できるので
カーソル合わせのときのキャプション自動表示だけを切れないかな、と。
ショートカットで使うアイコンと フォームの左上に出てくるアイコンを 違うのにするのはどうやるの?
ショートカット? ショートカットなら IShellLink::SetIconLocation で変更可能 32x32と16x16でデザインを変えたらいいという話?
918 :
デフォルトの名無しさん :04/03/07 08:58
901なのですが、まだできません。 どなたか教えていただけないでしょうか。
誘導した人が書いてくれるんじゃないの?
920 :
デフォルトの名無しさん :04/03/07 09:04
わかりにくい質問ですみません。 プログラムを起動させるときにクリックするアイコンと、 フォームの左上に出てくる絵を違うものにしたいという 質問なんです。
>>921 プロジェクトオプションのアプリケーションのアイコンと、
フォームのIconプロパティをそれぞれせってー
今はAccessを使ってます。これからDelphiを習得したいのですが、 デスクトップ用データベースを選ぶとするなら何が良いのでしょうか? DbaseとかParadoxとかバージョンも複数有りますが何が違うのでしょうか?
>>923 何を選んでも、Delphi側のコードは殆ど直さなくても良いので、あんまり考えなくていいと思うけど
目的は何ですか?
>>924 1万から10万件程度のテーブルを検索更新する程度で、作成したプログラムと
ファイルを配布したいのです。Accessだとバージョンが複数あり検証が難しし、
配布先にAccessが無い事もあるのでDelphiで作り直そうと考えています。
927 :
デフォルトの名無しさん :04/03/07 16:39
プログラムが、スタートアップから起動したのか どうかを知る方法を、教えて下さい。
>>928 ホントに難しい問題だね。
まずスタートアップにショートカットがある事、
そして、GetTickCountが一定値以下である事(ただし49.7日で一周する)
くらいかなあ
>>928 スタートアップのショートカットにそれとわかるような引数を指定すればいい。
ファイルの名前を変えてコピーしたいのですが、 var Name: String; FileTo,FileFrom: TFileStream; begin (中略) FileFrom := TFileStream.Create(FilePlaceLE.Text , fmOpenRead + fmShareDenyWrite); FileTo := TFileStream.Create(Name , fmCreate + fmShareExclusive); Try FileTo.Write(FileFrom,FileFrom.Size) Finally FileFrom.Free; FileTo.Free; end; とやると、FileTo := TFileStream.Createの行で「定数式が範囲を越えました」とエラーが出ます。 解決策をお教え願いませんでしょうか。
>>931 fmCreate or fmShareExclusive
933 :
デフォルトの名無しさん :04/03/07 20:17
Setforegroundwindowで目的のWindowを表に出したいのですが、 Windows2000だときちんと動作するのにXPだと、該当のソフトのタスクバーが 茶色に点滅するだけで表に出てこないことがあります。 この症状を回避する方法があったら教えてください。
936 :
デフォルトの名無しさん :04/03/07 21:22
>>934 素早い的確なレスありがとうございます。
Cの使い方が分からないので意味半分しか理解していないのですが、
nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
nTargetID = GetWindowThreadProcessId(hWnd, NULL );
AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0);
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0);
SetForegroundWindow(hWnd);
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0);
AttachThreadInput(nTargetID, nForegroundID, FALSE ); // FALSE で切り離し
この中のどの部分にFindwindowで見つけた目的のWindowのHandleを入れれば
良いのでしょうか?
hWndでしょう
938 :
デフォルトの名無しさん :04/03/07 22:46
>>937 今試しているのですがなかなか、うまくいきません。
もうちょっとやってみます。
939 :
933=936 :04/03/07 23:09
やっているのですが、どうしてもエラーが回避できません。 nForegroundID := GetWindowThreadProcessId(GetForegroundWindow(), NULL); 未定義の識別子NULLとなってしまいます。 nTargetID := GetWindowThreadProcessId(hWnd, NULL ); 指定された引数で呼び出すことのできるオーバーロード関数'GetWindowThreadProcessId'が定義されていません AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0); 不正な文字が入力ファイルにあります:'&' SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0); 未定義の識別子 LPVOID SetForegroundWindow(Wnd); SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0); 'Cardinal'と'Pointer'には互換性がありません となってしまいます。 たぶんCのソースをDelphiに置き換えられていないのが原因だと思うのですが、 どのようにすれば良いのでしょうか?
NULL → nil &sp_time → @sp_time (元記事の最後のsp_timeは&sp_timeの間違い) (LPVOID)0 → nil
ありがとうございます できました
>>925 ありがとうございます。
もしBDEを利用するのであればどれが良いのでしょうか?レコード件数やデータ容量
の制限等でDbaseとかParadoxの資料が探せませんでした。
>>927 ADOを利用してMDBを使う、と言う事でしょうか?
Access2000のMDBは更新していくとファイル自体が増加し2Gの所でエラーが
発生してしまいす。そこでMDB以外を検討してます。DbaseとかParadoxについては
知識が無いのですがこれらのファイルでも2G位が上限でしょうかね?
943 :
933=936 :04/03/07 23:41
偽者まで出てきた。俺って人気者?
>>940 教えていただいた方法で出来ました。ありがとうございました。
>>941 お前ってエスパー?
単純に「質問者はトリップ付けろ」って話。
945 :
デフォルトの名無しさん :
04/03/08 00:14