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

フサギコの *やさしい* Delphi質問スレ Ver.12

■ このスレッドは過去ログ倉庫に格納されています
0001フサギコNGNG
           __________________________
   ∧,,∧    /Delフサギコがどんな厨房疑問でもやさしく答えます。
  ミ,,゚Д゚彡 < Delフサギコは時に私であり、時には別の人。
   U  つ∀ \他のスレに書き込んで罵倒される前に、まずここで質問しよう。
 〜ミ  ミ ┴    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ∪''∪ 
前スレ モナーの *やさしい* Delphi質問スレ Ver.11
http://pc2.2ch.net/test/read.cgi/tech/1042421592/l50
0153デフォルトの名無しさんNGNG
>>152
Timerコンポーネントはできました

あとは関数でエラーがでます
GetXとGetYです
関数の宣言と実装をしかるべきところに貼り付けたつもりなのですが
エラーになってしまします。
宣言は、パブリックにはりつけました
実装は、Inprimentetion直下にはりつけました。

うーんどうすればよいのか、おかしいです
0154153NGNG
GetXとGetYの宣言はなんだろう?
TFormのメソッドでもなし、TTimerのメソッドでもなし
そういえば普通の関数ってどうやって宣言するのだろう、、
0155デフォルトの名無しさんNGNG
ListBoxを使っておりまして、項目をダブルクリックすると
その項目のTextを取得するにはどうすればよいのでしょうか?
0156153NGNG
関数の宣言は宣言部のtypeに書いたらあかんね、、
宣言部のvar以下に書いたらいけますた

すまそ
0157デフォルトの名無しさんNGNG
>>149
VBみたいな と言うのがどういうことかわからんけど Arc とか Ellipse とかじゃ駄目な理由があったら教えて
0158153NGNG
フォームを円形にしたのですが
フォームのタイトルバーがあるので時計の中心が変になります
タイトルバーをけすにはどうすればいいですか?

そうするとアプリの移動とかできなくなるけど時計らしいので、、
理想としてはクライアント領域でドラッグできたらいいのですが
0159デフォルトの名無しさんNGNG
>>158
BorderStyle と WM_NCHITTEST あたりかな?
0160153NGNG
>>159
クリックイベントの際にlParamがないのですが
どうやってメッセージを判断すればよいですか?
0161159NGNG
>>160
ん? オレへの質問か?
いまいち趣旨がよくわからん
0162153NGNG
>>161
すまそ
メッセージ処理はどうやったらいいかわかりません
0163デフォルトの名無しさんNGNG
>>162
キーワードを教えてもらったら
http://www.google.co.jp/search?q=WM_NCHITTEST+delphi

こうやって、自分で調べる事。

自分だって、そういう 「どうやったらいいか」なんて聞かれても、困ってしまうだろ?
0164153NGNG
>>163
サンプルをそのまま使ってもあれなので自分なりに解釈してみました
サンプルが難しいです、、、
ttp://www.borland.co.jp/qanda/delphi/d0002348.html
##サンプル##
{このメソッドはいつ呼び出されるのか?}
{Mの型はTFormにはないはず、、入れ子?}
procedure TForm1.WMNCHITTEST(var M: TWMNCHITTEST);
begin
 inherited;{ 継承されたメッセージハンドラの呼び出し}
 {TFormのメソッドを使うと思う。でもどのメソッドを継承したかわからない} 
if M.Result = htClient then { クライアント領域がクリックされたか? }
 M.Result := htCaption; { もしそうであれば,タイトルバーが }
{ クリックされたと Windows に思わせる }
end;
0165159NGNG
>>164
{このメソッドはいつ呼び出されるのか?}
WindowsからWM_NCHITTESTメッセージが送られたとき。


{Mの型はTFormにはないはず、、入れ子?}
Message.Pas で定義されている (右クリック→定義の検索 でみれるかも)


{TFormのメソッドを使うと思う。でもどのメソッドを継承したかわからない}
TFormの標準の動作を使う。メソッドになっているとは限らない。
TFormはWindowsのウインドウの動作を継承している。


{ クライアント領域がクリックされたか? }
クリックに限らずすべてのマウスイベントで発生していることに注意。


わからない単語はどんどん検索しよう。
0166デフォルトの名無しさんNGNG
protected
procedure WMNCHITTEST(var M: TWMNCHITTEST); message WM_NCHITTEST;

この定義で使ってる message をヘルプで調べてみたら?
ディスパッチを勝手に自動的にやってくれるとても便利な機構だよ
0167153NGNG
>>165
###{このメソッドはいつ呼び出されるのか?}
###WindowsからWM_NCHITTESTメッセージが送られたとき。
procedureの宣言をみるとprocedureがWM_NCHITTESTを返しているように見えるんです、、
CALLBACK関数みたいな感じでしょうか?

###{TFormのメソッドを使うと思う。でもどのメソッドを継承したかわからない}
###TFormの標準の動作を使う。メソッドになっているとは限らない。
メソッドや関数やAPIでないとすると、、理解が非常に苦しいです
0168デフォルトの名無しさんNGNG
Delphiで、エクスプローラーからファイルコピー & 移動 & 削除などを
管理できるようなソフトって作れるんですか?
これはディレクトリの指定とか無しで。
サンプルプログラムかソースがあったら嬉しいっす。
0169153NGNG
>>166
message指令がヘルプにあったので参考にしました
感想::どこでも実装できる機能だとわかった
  ::でもなぜに、継承するのか?謎
procedure WMNCHITTEST(var M: TWMNCHITTEST); message WM_NCHITTEST;
の宣言でWMNCHITTEST型はヘルプでありませんでした、システムで定義されている
ものなのでしょうか?
メソッド名称もWMNCHITTESTである必要はないのでしょうか?
メソッド名称は変更してもとおりました。
Mの型名は変更すると怒られました。

0170デフォルトの名無しさんNGNG
フォームのドラッグ
http://www.google.co.jp/search?q=cache:vbEbucp5V7gC:www.nifty.ne.jp/forum/fdelphi/faq/00137.htm+wm_syscommand+%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja
こんなもあったよ
0171153NGNG
>>170
ちょっとわかりやすいです。原始的な感じでOK
0172159NGNG
>>167
まあ、落ち着いてお茶でも飲め。

WM_NCHITTESTを返しているように見える? : と ; に注意。
[ウインドウメッセージ]とか[メッセージハンドラ]あたりがキーワード。


メソッドや関数やAPIでないけどWindowsの内部処理。
あえて言うならDefWindowProc APIの動作。

SDKでプログラムを書くとわかりやすいけど基本的な動作のかなりの部分はWindowsが面倒をみてくれる。
ウインドウを作れば基本的なウインドウの動作を、ボタンを作れば基本的なボタンの動作をWindowsが処理してくれるわけ。
で、プログラマは拡張した動作を記述すればすむ と。

基本的な動作
 キャプションでウインドウを移動できる
 ウインドウの枠でサイズ変更ができる
 ボタン上でマウス押下するとボタンがくぼむ
 
拡張した動作
 キャプション以外でもウインドウを移動させる
 ウインドウの枠でサイズ変更されたら中身の再配置
 ボタンがクリックされたら何かの処理を開始する

まとまりない文章でごめん
0173Move 手続きの引数NGNG
procedure Move(const Source; var Dest; Count: Integer);
 Move 手続きの第1、第2引数の型はいったい何なのでしょう? ヘルプファイルの例
var
 A: array[1..4] of Char;
 B: Integer;
begin
 Move(A, B, SizeOf(B)); { 安全のため,SizeOf 関数を使う }
end;
を見ると第1引数はポインタ、第2引数はIntegerと思いますが文字列をコピーするような使用例を見ると
var
 S: string;
 n,Count: Integer;
 p: PChar;
begin
 Move(S[1], n, Count);
 または
 p := PChar(S);
 Move(p^, n, Count);
end;
というような例があり、そうなると第1引数はChar型なのかと、第2引数はどうやらInteger型らしいと思いたくなりますが
var
 B, L: Byte;
 Buffer: array [0..1023] of Byte;
 P: PChar;
begin
 P := @Buffer;
 Move(L, P^, SizeOf(L));   // length of keyword
end;
というような例では第2引数はいったい何の型なのか(逆参照が示す型はChar型だと思いますが……)ますます訳がわからなくなってしまいます。
0174デフォルトの名無しさんNGNG
const Sourceは変更不可能な型無しパラメータ
var Destは変更可能な型無しパラメータ
Cのvoid*みたいなもんだ
0175デフォルトの名無しさんNGNG
Keybd_event(VK_SNAPSHOT, 0, 0, 0);

↑これでキーを押すのができるらしいですが、
Windowsのマークのキーを押すにはどういう文字を入れればいいんですか?
0176デフォルトの名無しさんNGNG
VK_WINDOWS
0177Delフサギコ ◆A6VzDeLphI NGNG
>>150さん
  ∧,,∧  どっかの有名などらどろコンポーネントを
 ミ,,゚Д゚彡 インスコ汁。
 ミつ日(ミ
海外製だけど英語全く出来なくても
インスコ&使用に問題なしでつ。

>>158さん
タイトルバはBorderStyle bsNoneだったっけ?
フォームを円形にできるオマイさんでしたら
[暗い餡と領域][ドラドロ]をキーにして
検索しると、答えはニフでもエムエルでも
見つけられると思われ。
0178デフォルトの名無しさんNGNG
ありがとうございます
0179デフォルトの名無しさんNGNG
<xml attr="hoge"> hogehoge </xml>


上のXML文書で、xml要素のattr属性の内容( この文書ではhoge )や、
要素の中身( この文書ではhogehoge )を調べるにはどうすればいいんですか
0180デフォルトの名無しさんNGNG
>>179
お金があるなら Entを買う。 
お金が無いならパーサを自分で作る

それもやりたくないならMSXML か Xerces を使う



0181デフォルトの名無しさんNGNG
C#なら只で簡単にできるよ。
0182デフォルトの名無しさんNGNG
VB.NETでも只で簡単にできるよ。君たちは認めたくないだろうけど。(大爆笑
0183デフォルトの名無しさんNGNG
まあdelでもmsxmlを使えばいいだけの話。
0184デフォルトの名無しさんNGNG
OpenXMLで検索してみ。それ以外でもフリーのXMLパーサなんて沢山あるから。
ちなみにEntじゃなくてPro以上。
0185デフォルトの名無しさんNGNG
どんな手使おうが、次のバージョンでVB.NETと同じAPIを後追いするわけだがな。( ゚,_・・゚)ブブブッ
0186デルファイの名無しさんNGNG
ええと、真面目に答えておくと、TXMLDocumentというのを使う。
ヘルプは何故かEntにしか無いみたいだけど、実はPro版以上に搭載されてる。
単純なのでXMLDoc.pasに書かれた宣言見ればすぐわかると思いますよ。

…金が無い場合は、>>180-185に習って
0187デフォルトの名無しさんNGNG
>181, 182, 185
いちいちこういう発言が出るまで見張ってるのか?
気持ちわる……
0188デフォルトの名無しさんNGNG
ExitWindowsEx(EWX_REBOOT,0);
これを使っても再起動しないんですが何故ですか?エラーも出ない
0189デフォルトの名無しさんNGNG
>>188
仕様です。再起動用BIOSが搭載されてないマシンでそうなります。
0190デフォルトの名無しさんNGNG
スレ毎にNGワード設定できる2ちゃんねるブラウザって無いのか?
0191お約束NGNG
>>190
PGなら作れ!
0192153NGNG
>>172
###WM_NCHITTESTを返しているように見える? : と ; に注意。
あーほんとだ。
メッセージ処理の構文だと覚えて、、、

###DefWindowProc
ウィンドウプロシージャにはすべてのメッセージが届くを思っていましたが
そうではないのですね、、、

###拡張した動作
なるほど。基本動作と拡張動作で切り分ければわかりやすいです
ということは、message処理等を行うということは
OSの提供する機能をカスタマイズして使う
そして、VCLは基本的にOSの提供する基本機能をAPIを
ラップしているということと、、、思いました
0193153NGNG
>>177
### 暗い餡と領域][ドラドロ]をキーにして
ドラドロはひっかかりました
0194bloomNGNG
http://www.agemasukudasai.com/bloom/
0195デフォルトの名無しさんNGNG
>>188
NT系だとそのコードだけだと動かんよ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/shutting_down.asp
0196デフォルトの名無しさんNGNG
TTabControl のタブの文字を縦書きにするにはどうしたら宜しいのでしょか?
0197デフォルトの名無しさんNGNG
>>196
TabPosition := tpRight で
Font に縦書きフォントを指定

tpLeft だと逆さになるのね ^^;
0198デフォルトの名無しさんNGNG
>>197
うわ、ほんとだ。縦書きフォントなんてあるんすね・・・
縦書き=#13を一個一個入れる になってました。
ありがとうございました。(tpLeftは使えないという事っすね)
0199153NGNG
演算子がわかりません

C言語みたいに
A += A;をしたいんですけど
A +:= A;だと怒られました

探してみましたが、こういうのはないみたいですね
0200デフォルトの名無しさんNGNG

>>199
どうせネタだろうけど・・・。

A := A + 1;
0201153NGNG
ある場所に文字を表示したいのですが
Canvas.TextOut(CX - int(let/2) ,CY - 20,str);
[エラー] Unit1.pas(134): 'Integer' と 'Extended' には互換性がありません
と怒られました
CXもletもintegerなのになぜでしょうか?
0202153NGNG
マジ質です、すいません、、、
0203デフォルトの名無しさんNGNG
>>200
それは違うだろ

A:=A+A;
A:=2*A;
inc(A,A);

じゃないのか?

>>201

実数の割算してるからだよ / じゃなく DIV にしなさいな

0204デフォルトの名無しさんNGNG
>>202
Delphiヘルプから
| x/y の値は,x と y の型に関係なく,常に Extended 型になる。

Canvas.TextOut(CX - (let div 2) ,CY - 20,str);

とかは?
0205デフォルトの名無しさんNGNG
>>201

function Int(X: Extended): Extended;


代わりにTrunc関数、もしくは"/"演算子ではなく、"div"演算子(整数除算)を使うのがよい

Trunc(X: Extended): Int64;

しかし、このケースではRound関数の方が良いかもしれない。

0206デフォルトの名無しさんNGNG
203-205 ジュウコーン
0207153NGNG
DivもRoundもいけました。
inc(A,A);がスマートで好きです
ありがとうございます
0208デフォルトの名無しさんNGNG
HTMLのソースの中から絶対パスのURLのみを抜き出す方法ってありますでしょうか?
0209デフォルトの名無しさんNGNG
ビット操作ってどうやるの?
0210デフォルトの名無しさんNGNG
>>208
http://やhttps://からURLに使われる文字だけで構成される部分を取り出す。
0211論理演算子(ビット演算子)NGNG
>>209
どんな操作がしたいの?
0212153NGNG
設定のダイアログ機能をつけたいのですが
コントロールはOpenDiarolを使うのがふつうですか?

ポップアップメニュの項目を選択→設定ダイアログボックスがでる
モーダレスででてOKボタンを押したら反映して消える、、、
0213デフォルトの名無しさんNGNG
>>210
なんとなくできました♪
どうもありがとうございました
0214元VBプログラマNGNG
昨日から見よう見まねでDelphi(Personal6)をはじめたのですが、
配列をfunctionの引数にするところで躓いています。

procedure TForm1.ButtonClick(Sender: TObject);
var
 wBuf: array of Byte;
 i: Integer;
begin
 SetLength(wBuf, 6);
 wBuf[0] := 1;
 FillArray(wBuf);
 wBuf[5] := 100;
end;

procedure TForm1.FillArray(Buf: array of Byte);
var
 i: Integer;
begin
 for i := 1 to 4 do
  Buf[i] := i * 5;
end;

を実行したときに、wBufの値は(1, 1, 10, 15, 20, 100)になってほしいのですが、
結果は wBuf(1, 0, 0, 0, 0, 100)となってしまいます。
ブレイクポイントで確認したところ、FillArray内では 1, 10, 15, 20を割り当てているようなのですが、
FillArrayから抜けた瞬間に 0が割り当てられているみたいです。

配列を引数にして、その配列に値を割り当てるのはこの方法は間違っているのでしょうか?
VB6で通っていたコードがそのままで通らない(厳密になっている?)のですが、めげずに何とかしたいです。
ご存知の方、わたし厨房で申し訳ないのですがお願いします。

0215デフォルトの名無しさんNGNG
ソースの中で ’ を使いたいのですがエラーが出てしまいます。
例えば、if t = ''' then のような
tが'と等しかったらというような事をしたいのですが
何がよい方法ないでしょうか?
0216デフォルトの名無しさんNGNG
>214
procedure TForm1.FillArray(Buf: array of Byte);
じゃなくて
procedure TForm1.FillArray(var Buf: array of Byte);
だよ。
ちゃんとvarつけないと代入できんです。

>215
アスキーコードで指定すればいいんじゃない?
0217デルファイの名無しさんNGNG
'''' でもいけます。
0218デフォルトの名無しさんNGNG
''''''''''''''''
0219元VBプログラマNGNG
>>216

ありがとございます。
ご教授いただいた方法でうまくいきました。
感謝しております。
0220デフォルトの名無しさんNGNG
オフィスXPで使われているような、
透明ぽいポップアップメニューのコンポーネントはありますか?
0221デフォルトの名無しさんNGNG
FormatSettings : TFormatSettings;
のようなのはDelphi7からしか使えないんですか?
0222デフォルトの名無しさんNGNG
TClientSocketを使って、
送信した時のエラーはどうやって取得すればよいのでしょうか?
0223デフォルトの名無しさんNGNG
一生懸命 レスしてたけど・・・・最近疲れちゃった・・・・タッチしてくれ
0224デフォルトの名無しさんNGNG
>>220
ペルソナルにはありません。
0225デフォルトの名無しさん NGNG
なんでモナーじゃなくなったの?
フサギコなんて嫌だ
0226デフォルトの名無しさんNGNG
モナーの中の人がフサギコだったのさ。
0227153NGNG
TForm1(Unit1)の記述の中でTForm2(Unit2)をShowModalさせたいのですがうまくいきません

Unit1
TForm2.ShowModal ソースコードの補完の段階で失敗します

Unit1とUnit2を関連づける方法はどうするのですか?
0228デフォルトの名無しさんNGNG
ゆーず汁!!
0229デフォルトの名無しさんNGNG
>>215

#$27
0230223NGNG
ふう、もう少しがんばってみるか

>>221 Yes
>>222 OnError イベントで ( もし取れないエラーがあるなら WSAGetLastError )
>>227 TForm2 は型名 Form2 が変数名だから Form2を使えば IDEが uses しますか?って聞いてくれる・・・かも
0231デフォルトの名無しさんNGNG
'''' { ' }

' でヘルプひけば出てくるはず
0232228&229NGNG
>>223

otukaresamadesu. sukoshiyasundekudasai.
0233デフォルトの名無しさんNGNG
>>216>>217>>218>>229>>231
こんなにも沢山のレスありがとうございます。
無事にできました♪

また質問なのですが、HTMLソースをCGIを使っているページから取得しよとするとエラーがでます
Memo1.Lines.Add(IdHTTP1.Get(Edit1.Text));
これは元々不可能なことなのでしょうか?
0234デフォルトの名無しさんNGNG
整数の桁数を得たい場合、(1000 = 4, 9999999 = 7 等)
わたしには if の連発か、文字列にしてしまうぐらいしか思いつきません
ほかに良い方法があったら教えてください。
よろしくおねがいします。
0235デフォルトの名無しさんNGNG
trunc(log10(n))+1
0236デフォルトの名無しさんNGNG
素朴なギモン。
変数定義って、ローカル変数よりグローバル変数のほうが全然便利に思えるんだけど
ローカル変数を使うメリットって何?
同じ変数名が使える(違う関数部で)とかメモリ領域とかに関係あんの?
0237デフォルトの名無しさんNGNG
>>236
全ての変数をグローバルにして10000行程度のプログラムを書いてみると分かると思うよ
もっともDelphiの場合、ループ変数をグローバルにすることは許されないけど
(仮にループ変数をグローバルにできたとして
 同じループ変数を使っている別の手続き・関数をループ内で呼び出したら
 どうなるか考えてみるといいよ)
0238234NGNG
>235
ありがとうございました。
勉強になりました。
0239223NGNG
>>236
人間は一度に そんなに大きなものを緻密に設計したり考えたり出来るように作られていません。

そこで、小さな単位に分割して、その機能や概念に名前を付けて ものを考えたり設計したりするわけです

その小さな機能に分割したものはその単位内で十分簡単でシンプルで独立していた方がいいでしょう?

グローバル変数を使うと、その単位は独立ではなくなります。
たとえば、複数のスレッドで同じ関数を使ったり出来ない訳です。

>>232
よし、任せたよ。
0240デフォルトの名無しさんNGNG
あなたが、とてつもない記憶力と管理能力の持ち主で、数百行のソースコードの
どこを読んでいるときでも、すべてのグローバル変数の用途を把握しており、
かつ、複数のスレッドが動いているときや複雑なイベント/メッセージのやり取りの
最中でも、すべてを自分で制御する自信があり、
かつ、そのソースを別の仕事/作業を終えた後、一月くらいしてから読み直しても
すらすらと理解できるほどの理解力とコメント記録能力があるのなら

すべてグローバル変数/関数でプログラムしても良いのではないか?
0241240NGNG
うわ。みんな親切..
0242デファルトの名無しさんNGNG
質問でゲス。

Delphi7で作ったコンポーネントがDelphi6で読み込めないのは気のせい??
初めてコンポーネントを作ってみようとしているのでワケがわかんないです。
もう少し調べてなんかわかったらまた書きます。

よろしくお願いします
0243デフォルトの名無しさんNGNG
>>242
Del6で使いたければソースをDel6でコンパイルしてインストールしる
0244236NGNG
>>237-241
なるほど、設計者の、設計のためなのね。親切なみなさんありがとう。
0245デファルトの名無しさんNGNG
>>243
それが、Delphi7にしかないコンポーネントを親コンポーネント(?:上位クラス?)にしたものを
インストールできるようにしたいんです。

と、確認してみようとしたら…あれ?
弄り回したせいかDelphi7から目的のコンポーネントが消えた!?
と、思ったらいじったときに作ったTemplatesにあった。
動作している模様。
一安心です…

コンポーネントの上位クラス(ここら辺もよくわかってませんが)の指定を変えればいくのでしょうかね?
調べていろいろ試してみます。

(初心者ですみません)
0246デフォルトの名無しさんNGNG
>それが、Delphi7にしかないコンポーネントを親コンポーネント(?:上位クラス?)にしたものを

…そりゃ無理っしょ。
Del6にも似たようなのがあるなら{$IFDEF}で切り分けるとかさあ
0247デフォルトの名無しさんNGNG
ttp://home1.infonia.ne.jp/~delphian/delphi/
ここ以外でコンポーネントが豊富にあるオススメ日本語HPを教えてください。
0248デファルトの名無しさんNGNG
>>246さん
やはりそうですか。
じゃああきらめます。

(☆∀☆)!(アイデアひらめきぃ)
Delphiにはじめからついているコンポーネントのソースって手に入らないのでしょうか?
手に入れば移植もできなくは…ないと思うのですが…
どうなのでしょうかねぇ?
その前にソース字体手に入るものなのか......?
0249デフォルトの名無しさんNGNG
>>248 お金出せば手に入るよ
0250デフォルトの名無しさんNGNG
>>248
Pro版買ってね。
0251デファルトの名無しさんNGNG
>>249
まさか、あなたに…

>>250
Pro版だとどうやればいいのでしょうか?
0252デフォルトの名無しさんNGNG
>>251
Pro版以上だとSourceというフォルダにほとんどのソースが入っていて(一部例外あり)
とても勉強になるのでし

メッセージループなどが実は昔ながらのスタイルでちゃんと実装されていて
Delphiが紛れもなくTurbo Pascalだということも教えてくれるのでし
■ このスレッドは過去ログ倉庫に格納されています