トップページ⇒tech
1001コメント277KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その16
http://pc5.2ch.net/test/read.cgi/tech/1089779142/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
0153142NGNG
>>152
よくわかんないけど、とりあえず、3≦a<b≦100をみたすものをすべて打ち出せ。
って問題だから、打ち出せればなんだっていいと思う。。。。
0154デフォルトの名無しさんNGNG
>>153

procedure TForm1.Button1Click(Sender: TObject);
var
Ia,Ib,Ic,SumSq:integer;
rt:Extended;
begin
for Ia := 3 to 99 do
for Ib := Ia+1 to 100 do begin
SumSq := Ia*Ia + Ib*Ib;
Ic := Round(Sqrt(SumSq));
if SumSq = Ic*Ic then
Memo1.Lines.Add(Format('a : %d b : %d c : %d',[Ia,Ib,Ic]));
end;
end;
0155デフォルトの名無しさんNGNG
>>154

rt はいらない
0156144NGNG
実はTListView内で棒グラフを表示したいので…
それをもとにAdvancedCustomDrawSubItemの部分に以下のようなコードを書きました。

ListView_GetSubItemRectマクロを使用して、棒グラフを表示させたい部分の
Rectを取得して。

Rect.Top = Rect.Top + 1;
Rect.Bottom = Rect.Bottom - 1;

として棒グラフの幅を調整
そして

//<注1>
Sender.Canvas.Pen.Color = clBlue;
Sender.Canvas.Rectangle(Rect);

とすることで、Rectの幅どおりに中が塗りつぶされていない四角形を書くことができました。

そして次に上記の<注1>の部分をそっくり以下のコードに入れ替えました

Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.Brush.Color := clBlue;
Sender.Canvas.Rectangle(Rect);

ところがRectを無視して、棒グラフが描画されるべき欄は真っ青になってしまいます…
Rect.Top = Rect.Top + 1;
Rect.Bottom = Rect.Bottom - 1;
をいくら調整してもその変更が反映される様子はありません…

いったいどうなっているのでしょう? どなたかアドバイスよろしくお願いいたします。

0157142NGNG
うわああああああ、できたあああああああ!!!(・∀・)
154さん、本当にありがとう☆☆☆
0158デフォルトの名無しさんNGNG
>>156
DefaultDrawがtrueだからでは。
変更されたBrushを使ってデフォルトの描画をされてしまうからね。
0159デフォルトの名無しさんNGNG
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.Brush.Color := clBlue;
Sender.Canvas.Rectangle(Rect);
Sender.Canvas.Brush.Style := bsClear; // これを加えてみるとか
0160デフォルトの名無しさんNGNG
>>158
なるほど、わかりました!

>>159さんのコードで解決することができました!
0161デフォルトの名無しさんNGNG
西暦年号を入力するとその年が平年か、閏年かを判定するプログラムが作りたいんだけど、
わかりません。。。
どなたか教えてください。
お願いします。
0162デフォルトの名無しさんNGNG
>>161
IsLeapYear 関数
0163161NGNG
IsLeapYear 関数を使わないでやりたいんですけど、
できますか?
0164デフォルトの名無しさんNGNG
できます
0165142NGNG
すいません、、、再び質問なんですが、
ピタゴラス定数を満たすa,b,cが何組あるか、
その総数を出力するプログラムを作るには、
どんな関数を使ったらいいんですか?
それと、総数もメモの欄に出力することはできますか?
何度も質問すいませんけど、教えてください。。
0166デフォルトの名無しさんNGNG
>>163

http://www.echizenya.co.jp/mini/colum/uruudosi.htm

1.西暦年が4で割り切れる年は閏年とする。
2.西暦年が4で割り切れる年でも、100で割り切れる年は閏年としない。
3.西暦年が4で割り切れ、100でも割り切れる年でも400で割り切れる年は閏年とする。

これをコードで表現する
0167デフォルトの名無しさんNGNG
>>165

procedure TForm1.Button1Click(Sender: TObject);
var
Ia,Ib,Ic,SumSq:integer;
count:integer;
begin
count := 0;
for Ia := 3 to 99 do
for Ib := Ia+1 to 100 do begin
SumSq := Ia*Ia + Ib*Ib;
Ic := Round(Sqrt(SumSq));
if SumSq = Ic*Ic then Inc(count);
end;
Memo1.Lines.Add(IntToStr(count)+'個ありますけど');
end;
0168142NGNG
>>167
たびたびありがとうございます。
本当に感謝感謝です!
0169161NGNG
>>166
なるほど、ありがとうございます。
えーと、これをコードで表現しようとして、EditとBottunを一つずつ作って、
ShowMessageで閏年かどうかを示そうと思ったのですが、Edit1に入力した数字を
Bottun1のif文で使うにはどうしたらいいかがわかりません。。。
どうしたらいいのでしょう?
それとも、別の方法のほうが良いのでしょうか?
よろしくお願いします。
0170デフォルトの名無しさんNGNG
>>169
>Edit1に入力した数字をBottun1のif文で使うにはどうしたらいいかがわかりません。。。

なんだか文章がピタゴラスの人と同じですね。宿題をこの際かたずけるつもりですか。
文字列から数値に変換するには StrToInt() を使う。
整数のわり算のあまりを求めるには mod を使う。以上、ヒント

0171142NGNG
断っておきますが、僕は169とは別人です・・・。
本当に・・・。
0172デフォルトの名無しさんNGNG
>>171
それは失礼。祈る健闘。
0173デフォルトの名無しさんNGNG
どうでもいいけど、日本語では「かた"づ"ける」だよ
0174デフォルトの名無しさんNGNG
どうでもいいけど、日本語では「かた"づ"ける」だよ"。"
017519NGNG
>>127
TTableのTableNameのドロップダウンリストを見ようとすると、Oracleに接続されていません。
と表示されてしまいます。

32bit Administratorではデータベースにきちんと接続できて色も変わっているのですがなかなか。
エリアスはドロップダウンリストから選択しているのでタイプミスなどは無いです。
0176デフォルトの名無しさんNGNG
>>175
テーブルへのアクセス権ってある?
0177ANGNG
>>150
そのページによると、

>2.FA-21,FA-11を意識させない透過的な接続:
>
>FutureNet FA-21,FA-11を使ってもPC上のソフトウェアに変更は必要ありません。
>RS-232を持つ装置とPCとの間の通信は透過的(ソフトウェアから見るとFA-21,FA-11は存在しない)に
>おこなわれ、PC上のソフトウェアは PCの COM ポートへアクセスするのと同じインタフェースで
>実現できます。

って書いてあるね。

てことは、PCからは、それはイーサネットではなく、RS-232Cとして見えているはずだから、
Delphiのほうも、RS-232Cとして、扱ってやればいいんだと思う。

とりあえず、Delphian World ( http://home1.infonia.ne.jp/~delphian/delphi/ )の、
Networkのコーナーに、「Delphi4用 RS-232C 通信コンポーネント」ってのがあるのは
見つけた。
こいつが、Delphi5でも動くかどうか、とか、どうやって使うのか、とかは、私にはわからないので、
あとは、がんばって自力か他の人に聞いてみて。
017836,41NGNG
>37

やっと出来ました。
ありがとうございます。

TBitmapで書いたイメージをTPaintBoxに書き込みことは出来たのですが
Tbitmapが大きなサイズのとき、TPaintBoxに一部が表示されます。
スクロールバーで表示されていない場所を表示するようにしたいのですが
どのようにやるのでしょうか
0179ANGNG
>>178
TPaintBox を TScrollBox に入れてみるとかかな?(未確認)
0180178NGNG
>179

色々やってみましたが、TPaintBox と TScrollBox はくっつかないような気がします。
間違えていましたらすみません具体的に教えてください。
0181デフォルトの名無しさんNGNG
>>180
ScrollBox を貼り付けて適当なサイズに調整し、その中に PaintBox を
貼り付ける。
Bitmap のサイズを決めるときに PaintBox のサイズも変更する。
PaintBox が大きくなるとスクロールバーが自動的に出てくると思う。

描画は PaintBox の OnPaint イベントの中だけで行うこと。
描き直すべき領域は ClipRect でわかるので (座標の原点は見えている
部分に関係なくクライアント領域の左上)、その部分だけ描けばいい。
0182デフォルトの名無しさんNGNG
delphiって2年後にはオープンソースになってる気がするけど。
0183デフォルトの名無しさんNGNG
TServerSocket で一定数以上のコネクションについて
拒否或いは受け入れをを遅延させるにはどうすれば良いのでしょうか
0184デフォルトの名無しさんNGNG
>>183
Close
0185デフォルトの名無しさんNGNG
TComboBoxのイベントにはMouseDownが無いのですが、上位クラスにはあります。
手軽にMouseDownを使えるようにするにはどうすればいいのでしょうか?
0186デフォルトの名無しさんNGNG
継承して、published にしたコンポを作るといいのでは
0187デフォルトの名無しさんNGNG
>>186
コンポーネントにすると大量に作り変えないといけないので、
現存のプログラムに追加する感じでコード上に書き足す程度の方法がいいのですが
そう言った方法ってないのでしょうか。
0188デフォルトの名無しさんNGNG
それなら、どんな方法でも大量に作り替えないといけないのでは?

そもそも TComboBox でどうして OnMouseDown イベントがほしいの? それも大量に?
0189デフォルトの名無しさんNGNG
いえ、Comboがマウスダウンを検知してくれればAPIとかでもいいんです。
ただ上位クラスから継承する簡単な方法があればいいなと思いまして。
0190デフォルトの名無しさんNGNG
ComboでMouseDownを検知する方法をググって見ると解決したらしい例が
1件だけあったけど今は見れないようで。
0191デフォルトの名無しさんNGNG
>>189
>Comboがマウスダウンを検知してくれれば

だから、なにをしたくて検知したいの?
0192デフォルトの名無しさんNGNG
>>191
あるのかないのか聞いてるんですよ。
ちょっとうざい。
0193ANGNG
TComboBoxを継承したTMyComboBoxを作って、
フォームをテキストで表示、ソースとフォームの
TComboBoxを全てTMyComboBoxに置換。とかは?
0194ANGNG
……191じゃないが、レスしないほうが良かったか…

何の為にやりたいのかがわかれば、
別の方向からの解決法があるかもしれない。

なんでわざわざ、不必要な情報隠蔽するんだ?
結局、損をするのは自分なのに。
前みたいに、「ある」とか「できる」だけの無意味なレスで埋まってるのがいいのか
0195デフォルトの名無しさんNGNG
>>192は元質問者とは別人だと思うが、最終的に何がやりたいかがわかれば
別回答が出てくる場合もあるから、詳細を書いた方がいいと思う。
0196195NGNG
うわ、かぶったorz
0197デフォルトの名無しさんNGNG
>>192
結論から言えば簡単ではないがやろうと思えばできる。

Style が csDropDown または csSimple のコンボボックスは複数の
ウィンドウで構成される複合コントロールなので継承クラスを作らずに
実現するのは非常に難しい。

複合コントロールでない場合は型キャストで OnMouseDown に手続きを
割り当てるだけで可能なはず。
019819NGNG
>>176
マシンを再起動したらできるようになりました。
スマソ
0199お馬鹿な回答者の為の回答フローNGNG
〜がありますか?

if あるなら then
 その方法を提示;

if ないなら or 現実的でないなら then
begin
 直接的な解はないと回答
 while さらに別の方法が必要か? do
  一段階上位の要求を聞きだして、その方法を提示
end;
0200真・お馬鹿な回答者の為の回答フロー NGNG
begin
バカな質問者は無視。
end;
0201デフォルトの名無しさんNGNG
>>199
>if あるなら then
> その方法を提示;

今回はここまでは行っている。でも、質問者はそれ以上に<簡単にできる>こと
を望んでいる。やりたいことがあるのは分かるけど、その目的を明らかにしない。
そういうのは無視が一番。
0202デフォルトの名無しさんNGNG
>今回はここまでは行っている。
行ってないだろ。いきなり別解に突入してる。
0203デフォルトの名無しさんNGNG
>>137-139 もお願いします。
0204デフォルトの名無しさんNGNG
>>203
上は標準のWebBrowserのバグ修正版みたいなの。下はMozilla版
http://www33.ocn.ne.jp/~takoyakusi/delphi/UIWebBrowser/
http://www02.so-net.ne.jp/~rando/mozilla/

海外制のもあって2chブラウザ(確かぞぬ)で使ってたはず。
興味あるなら調べてみたら。
0205デフォルトの名無しさんNGNG
>>202
継承してコンポ作れってかなり一般的で単純明快でまともな回答じゃねぇか
どこが別解なんだよ?
先のことを考えずに設計したのが悪いんだろ?
超初心者スレだから設計が下手なのは仕方がないが、
情報隠蔽しながら、より簡単な解を求められても対処のしようがない。



まぁ、何はともあれ
あとは>>202が引き受けてくれるそうです。よかったですね^^
0206デフォルトの名無しさんNGNG
DelphiとVB、どちらが可読性が高いですか?
0207デフォルトの名無しさんNGNG
Pascalの可読性は最高。
クラス派生による差分コーディングとthrowにより行数が少ないのに高機能安定動作。

VBのイベントハンドラコピペソースはサイアク。
0208デフォルトの名無しさんNGNG
>>207
オブジェクト・インスペクタ最高!!!
特にイベント
0209デフォルトの名無しさんNGNG
Del厨ってどうしてそんなに釣られやすいんですか?
どうして愛する自スレをこうも容赦なく荒らせるんですか?
初心者なので分かりやすく教えてください。
0210デフォルトの名無しさんNGNG
209はゲラ
0211デフォルトの名無しさんNGNG
502 :デフォルトの名無しさん :04/07/03 12:38
.NET 2.0 Betaを使ってみて、VCL.NETを使おうかと本気で検討中。
このスレにいる使ったこともなく語る人たちは信じられないだろう。

.NETライブラリの互換性って、クラス名、メソッド名が同じなだけで、動作はだいぶ違う。
いま1.1でできているものが、2.0でデザインが崩れたりチラツキが出たりしている。
修正したくてもクラスライブラリがsealedやinternal使ってて無理。
バージョンがあがるたびにこれほど変更されるくらいなら、VCLの方がマシ。
いや、VCLも.NET 2.0以降まで対応するという前提で。
0212デフォルトの名無しさんNGNG
>>211
VCL.NETヨサゲ
0213デフォルトの名無しさんNGNG
必死だな。(藁
0214デフォルトの名無しさんNGNG
>>213
砂漠で目玉焼きでも作ってろ(藁
0215デフォルトの名無しさんNGNG
聖火で焼いた玉子焼きってうまいのかな
0216デフォルトの名無しさんNGNG
Del厨って馬鹿ばっかり
0217デフォルトの名無しさんNGNG
MessageDlg('馬鹿でも使えるんだから仕方ないだろ!',mtWarning,[mbOk],0);
0218デフォルトの名無しさんNGNG
MsgBox "VBの方がはるかにマシ"
0219デフォルトの名無しさんNGNG
何だ、この糞スレは?

VB超初心者スレに変更だ。
0220デフォルトの名無しさんNGNG
>>219
VB使いの方が人口多いし、そうした方が有意義だね
0221デフォルトの名無しさんNGNG
>>217-218
どう見てもMessageDlgの勝ち。
0222デフォルトの名無しさんNGNG
>VB使いの方
氏にました。
0223デフォルトの名無しさんNGNG
Del厨荒らすなよ。(ゲラ
0224デフォルトの名無しさんNGNG
D7ProにあるSpinEditって右寄せできない?
TSpinEditのCreateParamでES_RIGHTを追加してもだめだったんだけど。
0225デフォルトの名無しさんNGNG
>>224
エンプラ版ではできるぞ。もっと貢げよ。(ゲラ
0226224NGNG
すみません。自己解決しました。
0227デフォルトの名無しさんNGNG
基地外が去るまで耐えよう。
0228デフォルトの名無しさんNGNG
227 = 基地外
0229デフォルトの名無しさんNGNG
アホアンチはほんと迷惑な奴だな。
0230デフォルトの名無しさんNGNG
228=229=手の内三重三重
0231デフォルトの名無しさんNGNG
いや、俺には229=230に見える
0232ANGNG
オブジェクトインスペクタに表示されなくてもいいなら、
別に継承だけでコンポーネントとして登録しなくてもいいけどね
それが一番簡単な方法だと思う

フォームソースの方の書き換えがいやなら、
生成後にインスタンスをすりかえるとか。

ただ、先祖が公開していた物を、わざわざ隠してあるってことは、
そこには触れて欲しくないってことだろうから、
何らかの副作用が有るかもしれないけど。

あと、どうしても、既存のソースをいじりたくない、いじるのが面倒ってのなら、
継承も置き換えもせずに、やる方法も有るには有る。
ただし、継承を使う方法よりもずっと面倒で遠回りだけど
0233デフォルトの名無しさんNGNG
type TMyComboBox = class(TCustomComboBox)
  public property OnMouseDown;
 end;

TMyComboBox(ComboBox1).OnMouseDown := ...

でいけるよ。動作保証も推奨もしないけど。
0234デフォルトの名無しさんNGNG
VBに比べると面倒だな
0235デフォルトの名無しさんNGNG
そもそもなんでDelphiスレにまでVB厨がくるんだよ。
0236デフォルトの名無しさんNGNG
>>186
前に俺も悩んだんだけどDelphi広場で検索すると似た様なのが見つかるよ。
確かHalbowがレスつけてて神を感じたような記憶がある。
0237デフォルトの名無しさんNGNG
(;^ิД^ิ) < レス下さった方ありがとう御座います。
荒れてたのでちょっとへこんでました。

テストしましたら>>233と>>236のサイト先のどちらの方法でも検知する事ができました。
0238デフォルトの名無しさんNGNG
夏らしい展開だったなw
0239178NGNG
>179,181
ありがとうございます、そしてごめんなさい
TScrollBoxとTScrollBarを勘違い色々いじくっていました。

>181
>描画は PaintBox の OnPaint イベントの中だけで行うこと。
>描き直すべき領域は ClipRect でわかるので (座標の原点は見えている
>部分に関係なくクライアント領域の左上)、その部分だけ描けばいい。

ここの部分がよくわかりませんでした。
TImageでPicture.Bitmapに代入することでとりあえず目的は達成しましたが
もう少し教えてもらえないでしょうか
0240デフォルトの名無しさんNGNG
ふー、やっとブビ厨が去ってせいせいした。w
0241デフォルトの名無しさんNGNG
>>233のやり方はオブジェクトのフィールドのメモリ上の配置がリファレンスで規定されている以上完全に合法。
TCustomComboBoxで定義されたフィールド・プロパティにアクセスしている限り正しい動作が保証される。
0242デフォルトの名無しさんNGNG
何をもって「正しい」とするかだな。
0243デフォルトの名無しさんNGNG
そういう場合はふつー反例一つでで済むんだけどな。
0244デフォルトの名無しさんNGNG
>>239
PaintBox が ScrollBox よりも大きくなると PaintBox のうち
見えてない部分が発生する。それでも PaintBox.Canvas の座標の
原点は PaintBox の左上になるということ。
OnPaint イベントは WM_PAINT の呼び出しによって発生するが、
PaintBox に来る前に古くなった領域と PaintBox のクライアント
領域が重なり合う領域だけにクリッピングされているので、
ClipRect の外側は描画しなくてもいいということ。別に描画しても
まったく問題はないが、時間のかかる描画を行う場合、その部分を
省略することで高速化が図れる。
TImage は Picture が変更されるたびに Invalidate を呼び出して
Image 全体が古くなったことにするので、ドットを 1 つ打つだけでも
全部を描き直すことになる。
0245デフォルトの名無しさんNGNG
ドライブが使えるかどうか判定したいんですが・・・
どなたかお願いいたします。
0246ANGNG
>>245
GetLogicalDrives APIを使うといいらしい。
詳しくはここに。
ttp://homepage1.nifty.com/MADIA/delphi/Win32API/GetDrives.htm
0247デフォルトの名無しさんNGNG
>>246
ありがとうございます!やってみます!
0248247NGNG
>>246うまくできました!本当にありがとうございました。
0249デフォルトの名無しさんNGNG
Delphiでコンポーネントを使わずソケット通信をしたいのですが
コピペで使えるようなサイトないでしょうか?
0250デフォルトの名無しさんNGNG
WinSock使え。
BSD互換APIなら山のように転がってるだろ。Cだけど
0251デフォルトの名無しさんNGNG
>>250
いや、だからCなら知ってるの。
それをDelphiで書いてあるのがほしいの。コピペしたいの。
0252デフォルトの名無しさんNGNG
またあれてたんだなここ。
寧ろ返答者側が夏真っ盛りだな。
■ このスレッドは過去ログ倉庫に格納されています