1read 100read
2011年12月2期プログラム16: くだすれDelphi(超初心者用)その53 (966) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
17: ATL/WTL Part6 (904)
18: ニートの俺が何か開発して食いつなぐスレ (811)
19: Pythonのお勉強 Part45 (657)
21: 関数型プログラミング言語Haskell Part16 (828)

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


1 :11/06/27 〜 最終レス :11/12/24
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を
勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが
お礼はDelphiの布教と初心者の救済をお願いします。
<前スレ>
くだすれDelphi(超初心者用)その52
http://hibari.2ch.net/test/read.cgi/tech/1279506667/
<過去スレ>
DelWiki避難所(Delphi 関連の過去スレッド)
http://delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89

2 :
<関連スレ>
delphiで作った有名ソフトって何があるの?
http://hibari.2ch.net/test/read.cgi/tech/1135654787/
【Delphi互換!?】FreePascal/Lazarus その2【GPL】
http://hibari.2ch.net/test/read.cgi/tech/1261676778/
ネットワークゲーム作成のお勉強(Delphi専用スレ)
http://hibari.2ch.net/test/read.cgi/gamedev/1028278884/
Delphiでアクションゲームが作りたい!! Part2
http://hibari.2ch.net/test/read.cgi/gamedev/1027482533/
delphiでMMO
http://hibari.2ch.net/test/read.cgi/gamedev/1072515100/
では質問どうぞ。

3 :
あ、立ってた
>1乙

4 :
>>1


5 :
質問です:ファイル選択ダイアログ何かが他のウィンドウの下になったりした場合、回避策はありますか?
ウィンドウハンドルとか取れるんだろうか?

6 :
Delphi のバージョンが分からないのとファイル選択ダイアログが隠れた経験はないけど
http://www.freeml.com/delphi-users/1416
https://groups.google.com/group/delphicbuilder-ml-archive/browse_thread/thread/c1ad817181b0d82c?hl=ja
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200406/200406_04060079.html

7 :
つ [d] >>6
順番に試してみます。
普通に開発する分には隠れないのですが、TFormのCreateParamをオーバーライドして属性弄ってるので。。。

8 :
低速PCでクリック連打やるとわりとどんなソフトでも起こり得るんじゃないの?
タスクマネージャ→実行タスク→手前に表示でダイアログが一番上に来るからこれをコードにして
間に噛ませば回避できそうだけど。

9 :
delphimm.dllとborlndmm.dllって何ですか?

10 :
メモリマネージャ

11 :
>>7
そこを最初に書いてくれなきゃだわw

12 :
デルファイに付いてる TeeChart (Standart 4)で聞きたいのですが、
Y 軸のスケールをソース上で指定するにはどう書くのでしょう?
スケールの
最大/最小値の自動調整 : Boolean
最大値 自動調整 : Boolean
最小値 自動調整 : Boolean
最大値、最小値
Chart1.
識者の方おねがいします

13 :
何書いてあるのか読めないけど適当に書いたらできた
ttp://www.programfan.com/club/showtxt.asp?id=345826
Chart1.BottomAxis.Automatic := False;
Chart1.LeftAxis.Maximum := MaxY;
Chart1.MaxYValue(Chart1.LeftAxis);

14 :
TScrollBox上に乗せたコントロールが範囲外か判定したいです。
Control.Left > ScrollBox.Width
で判定しようとすると、スクロールが有る場合、上手くいきません。
どういう判定式になるのでしょうか?

15 :
ふと気がつくと、実行ファイルのサイズが18Mになってたんですが、普通ですか?

16 :
>>15
リソースでクソでかい画像など入れてんじゅあねーの

17 :
>>14
Control.Left > ScrollBox.ClientWidth

18 :
つ [d] >>17
TScrollBoxで、スクロールバーが表示か非表示か判定難しいですね。
ScrollのVert/HorzにVisibleで問い合わせてもtureのみorz

19 :
じゃあTScrollBoxを派生させて自分でコントロール作れ

20 :
>>18
IsScrollBarVisible

21 :
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
var
ScrollBarActive:Boolean;
begin
Done:=True;
with ScrollBox1.HorzScrollBar do
ScrollBarActive:=(IsScrollBarVisible) and (ClientWidth < Range);
if not ScrollBarActive then
with ScrollBox1.VertScrollBar do
ScrollBarActive:=(IsScrollBarVisible) and (ClientHeight < Range);
Caption:=BoolToString(ScrollBarActive);
end;

22 :
仕事でDelphiやることになったわ
糞言語さんよろしく

23 :
skypeの設定ウィンドウで使われている、TOptionsPanelって、カスタムコンポーネントですか?
TListBoxとか使って同じようなの作ろうとしたが、あの動きは難しい

24 :
つ orz >>20 >>21

25 :
orzを感謝に使うやつ初めて見た

26 :
C#で言うところのHttpWebRequestのような、
Http接続関係のライブラリって、Delphi 2010やXEで標準装備されますか?
昔と同じくIndyでやるしかないですかね?

27 :
Del7からIndyが標準装備でわ?

28 :
Del7時代と違って、今ならサードパーティ製でなく標準で
ネット系ライブラリが用意されてるかもと思ったんですか、
やっぱりないんですね。
調べてみたらXEでIP*Works!も付けたみたいですが、
これSSLさえ対応してないし(別売)。。微妙

29 :
Indyってサードパーティじゃなくてオプソでは?
メモリマネージャーもオプソのもの取り込んだし。
ソースとして取り込んで、製品に組み込むときにソース制御(確認だけとしても)してるわけだから、
標準と言えるんでわ?

30 :
>>29
そうですね。
ただ、Del7のときにIndyのバグで散々な目にあったので、
Indyはあまり信用してないんですよね。
Indyが微妙だからIP*Worksも取り入れたような気もしますし・・

31 :
indy以外でありますか?

32 :
は? Indy自体オープンソースだから、バグは自分で直して使うんだよ。

33 :
>31
商用ならいくつか

34 :
ドイツもこいつも役立たねぇ奴らゔぁあじやのぉ

35 :
UnicodeString s = L"\t";
C++Builderでこう書くようなのって、Delphiだとどうするのでしょうか?
Unicodeのエスケープ文字をソース内で指定したいのです

36 :
s: UnicodeString := #9
http://docwiki.embarcadero.com/RADStudio/ja/%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E6%A7%8B%E6%96%87%E8%A6%81%E7%B4%A0#.E6.96.87.E5.AD.97.E5.88.97

37 :
>>36
ありがとう

38 :
最近知ってちょっとショック受けてるんですが(プロじゃないってことで何卒ごかんべん)
ユーザーって、なんかダブルクリックの癖がついてるんですね。
職場でつかってる自作のソフトのことなんですが、ボタンダブルクリックに対するプロシージャは何一つ書いてません。
ダブルクリックされた場合に、シングルクリックの命令が2回実行されてしまうなんて可能性はありますか?
もしそうだとしたら、すべてのボタンに対して、ダブルクリックにexitとか書く必要が出てきたりしますか?

39 :
>>38
> ダブルクリックされた場合に、シングルクリックの命令が2回実行されてしまうなんて可能性はありますか?
あるでしょうなぁ。ってぇか試してみればいいじゃない、自分で。OnDblClickがないコントロールは
OnClick-OnClickとイベントが発生するでしょう(ObDblClickがあればOnClick-OnDblClickになる)。
> もしそうだとしたら、すべてのボタンに対して、ダブルクリックにexitとか書く必要が出てきたりしますか?
さぁ。あなたのプログラムの作り次第でしょう。必要なら必要だろうし、不要なら不要。OnClickの
処理をしている間はコントロールやフォームのEnabledをFalseにするだけでも十分かもしれないし。

40 :
シングルクリックとダブルクリックを判定するしきい値の設定=
コントロールパネルのマウス|ボタン|ダブルクリックの速度の
設定が「速く」になっているとか。

41 :
>>39,40
ありがとうございます。
>>試してみればいいじゃない
まったくそのとおりでした。
procedure AllBtnDblClick(Sender: TObject);
begin
exit{何も書かなくても一緒か};
end;
な感じの、虚しすぎる関数つくって全てのボタンのOnDblClickにあてがう
みたいなやり方しか思いつきませんが、取りあえず根性で修正します

42 :
ごめんなさい
sage書く場所間違えた

43 :
?そんなのいらないじゃん。

44 :
>>43
無根性でやりとげられる何か楽な方法があるんでしょうか。
ヒントだけでもいただければ幸い

45 :
>>38を見る限り、何の問題も起きてないと読み取れるんだけど
ダブルクリックされるとどんな問題が発生したのか書いてないし、
そもそも当該のコントロールがなんなのかも明らかにしてないね

46 :
こゆこと?
private
{ Private 宣言 }
ClickedTime:Double;
procedure TForm1.Button1Click(Sender: TObject);
begin
if GetTickCount-ClickedTime<=GetDoubleClicktime then exit;
ClickedTime:=GetTickCount;
Memo1.Lines.Add(IntToStr(Tag));
Tag:=Tag+1;
end;
ClickedTime の処理しない場合Wクリックされたら確かに二つずつ増えてくね

47 :
Delphiで作ったプログラムはC#やVBみたいに何かランタイムをインストールしてもらう必要はありますか?

48 :
普通は不要

49 :
ボタンのOnClickに「ボタン自身のEnableをFalseにする」でダメなの?
処理が終わったらEnableをTrueにすればいいし
基本的にボタンはそうやってるけど
何か勘違いしてたらスルーしておくれ

50 :
>>41
>49 の例
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
// 処理中
Button1.Enabled := True;
end;
わざわざ Button1DblClick(Sender: TObject); を書く意味が分らない。

51 :
俺ならTrueにする前にApplication.ProcessMessagesを挟んじゃうね。

52 :
いらんだろ。.NETならともかく。

53 :
まぁ、例外はちゃんと処理しないと二度と押せなくなるがw

54 :
なんのためのtry...finallyだよ

55 :
delphi6を使っています。
FindDragTargetでAllowDisabledをTrueにしているのですが、
Enabled=FalseやVisible=Falseの状態のボタンを見つけられません。
何が間違っているのでしょうか?
よろしくお願いします。

56 :
ちゃんとスクリーン座標に変換している?
AllowDisabledはVisibleには効果なし
Visible=FalseだとAllowDisabledに関わらず引っ掛からない

57 :
>>56
ありがとうございます。visibleに関しては了解いたしました。
スクリーン座標は試してみたのですが、やはりダメです。
enabled=trueのものはスクリーン座標、クライアント座標に関わらず見つかりますが、enabled=falseのものがやはり見つかりません。
GetCursorPos(pntXY);
target_component := FindDragTarget(pntXY, True);
if target_component <> nil then
begin
HelpMessage.Caption := target_component.Name;
end
記述はこうなっています。
引き続きよろしくお願いします。

58 :
Enabled=Falseのボタンだとうまくいかないみたいだね
TWinControl.ControlAtPosを使えば?

59 :
target_component := FindDragTarget(pntXY, True);
これだと確かにダメだね(うちのD6Per)
target_component := ControlAtPos(ScreenToClient(pntXY), True, True);
これならEnabled=FalseでもOk
バグかね?
そもそもDisableなコントロールにドロップすることなんか無いから気付かないよなあ

60 :
TList.Add(Nil)とTList.Count:=TList.Count+1は同じこと?

61 :
何に着目しているかにもよるねぇ
データの数なら同じだけど、処理速度はAddの方が速い
ちなみにAddを1000回繰り返すのとTList.Count:=TList.Count+1000では
後者の方が速くなる

62 :
>>59
できました。ありがとうございます。

63 :
連続ですいません。
1.ボタンをクリックすると、メッセージ表示用ラベルのcaptionを変更。
2.その後、画面のどこでもいいからクリックすると続きを表示。
3.表示するメッセージがなくなったらイベントを終了。
というonclickイベントを作ろうとしたのですが、
ラベルの変更がイベント終了まで適用されないようで困っています。
イベントの途中でcaptionの変更を適用する方法はないのでしょうか?

64 :
>>63
Boolean の変数を作っておいて
procedure TForm1.ボタンクリックで
変数:= not 変数;
if 変数 then ボタン.caption:= '変更' else ボタン.caption:= 'もと';
procedure TForm1.全体クリック
if 変数 then 続き
分けちゃだめなの?

65 :
>>63
Label1.Update;
Label1.Repaint;
Label1.Refresh;
好きなの使え
しかし>>64も指摘してるように、ちょっと作りが変な気もする
どうせならイベントハンドラを全部ここで見せてみたら?

66 :
【概要】ゲーム(RPG)の戦闘シーン。
 ボタンの1個1個が装備・魔法などのコマンドに対応している。
 ボタンを押すと敵の行動も決定され、互いに選択したアクションを実行。
 BattleMain関数の中でLabel1.Repaintを使って解決しましたが、普通はこういう風にはしないのでしょうか?
procedure TForm1.Item1Click(Sender: TObject);
begin
case game_state of
//(中略)
BATTLE_ACTION_CLICK:
begin
if Item1.Tag = character[0].action then begin
   // 同じボタンを2回クリックすることで行動決定
game_state := BATTLE_ACTION_EXECUTE;
BattleMain;
// BattleMain関数の中で戦闘を処理する。
// 攻撃⇒命中、回避などをメッセージ用のcaptionで表示、プレイヤーのクリックを待つ。
// 同様に敵キャラクターの行動もcaptionで表示してプレイヤーのクリックを待つ。
// 一通り終わったら行動選択に戻る。
game_state := BATTLE_ACTION_CHOISE;
end else begin
character[0].action := ( Sender as TComponent ).tag;
end;
end;
end;
end;

67 :
>>61
いきなりCount:=1000でもいいんですね。
どうもありがとう。

68 :
DelphiのライブラリにC++のstd::mapみたいなクラスは存在してますか?
キーは文字列、値はTObject派生型です

69 :
TStringsのStings[]とObjects[]で似たようなことはできるが。

70 :
Application.ProcessMessagesでいいだろ

71 :
bmp及びjpegファイルをTimage1に読み込むにはどうすればいいでしょうか。
ファイルをOpenDialog1で
一種類の拡張子(bmp)で読み込むことはできるのですが、
jpegのファイルを読み込むのがうまくいきません。
どちらでも読み込めるようにしたいのです。

72 :
uses Jpeg;

73 :
TForm1以外のクラスから、TForm1内のTImageやTLabelを操作しようとすると
"メソッド識別子が必要です"と言われてコンパイルできません。
TForm1.ImageList1.Draw
といった形で指定しているのですが、何がいけないのでしょうか?

74 :
Form1.ImageList1.Draw
が正しい。
T付きじゃインスタンスではなく型に対して
操作しようとしてるからエラーになる。

75 :
事実上ヌルポインタ操作だものな

76 :
>>74
なるほど、考えてみればそのとおりですね。ありがとうございます。

77 :
レスありがとうございます。
最初の質問ですが、さらに質問です。
Image1でbmpを表示させるときは下記でできたのですが、
procedure TForm1.Button4Click(Sender: TObject);
Var
 BitMap : TBitMap;
begin
if OpenDialog1.Execute then //オープンダイアログボックスの呼び出し
begin
BitMap := TBitMap.Create;
//ビットマップにファイルをロードする。
BitMap.LoadFromFile(OpenDialog1.FileName);
//イメージにビットマップを渡す。
Image1.Picture.Bitmap := BitMap;
//解放する
BitMap.Free;
end;
end;
これをbmpでもJpegでも読み込みできるようにするにはどうすればいいでしょうか。

78 :
Image1.Picture.LoadFromFile(OpenDialog1.FileName);

79 :
例えば画像処理にGDIPLUS.DLLを利用する
これをDELPHIで操作するのがGDIPAPI.PAS GDIPOBJ.PAS ググればどこかにある
BMPとJPGとPNGに対応するはず 画像処理用のDLLだから縮小拡大とかいろいろできる
bmp: TGPBitmap;
bmp := TGPBitmap.Create(filename); こんな風にビットマップを作れる

80 :
>>78
できました。
ありがとうございます。

81 :
>>79
こちらの方法でもできました。ありがとうございました。

82 :
クラス内にコンポーネントを作成する方法を教えてください。
constructor TestClass.Create;
begin
TestLabel := TLabel.Create(Form1);
TestLabel.Caption := 'test';
TestLabel.Enabled := true;
TestLabel.Visible := true;
TestLabel.Top := 400;
TestLabel.Left := 550;
TestLabel.Refresh;
end;
このような形で宣言しているのですが、TestClassを作成してもラベルが画面に表示されません。

83 :
試してないけどTestLabel.Parentを設定してみて

84 :
すいません、実はtwincontrolが何だかわかっていません。
parentに設定するtwincontrolはどうやったら調べられるでしょうか?

85 :
Form1でいいんじゃね

86 :
>>84
Parentには、張付け先の変数名を指定する。
フォームに直張りするなら、TestLabel.Parent:=Form1;
TPanelとか、TGroupBoxならその変数名。
Createに渡している変数(今回の例で言えば、Form1)は、自動でそのTLabelを後片づけしてくれる人。通常は、張付け先のルート(大抵はTFormか)を指定する。
諸事情により、後片づけを自分でやるときは、Createの引数にnilを渡す。ただし画面に表示するオブジェクトを自分で後片づけすることは、まずないと思う。

87 :
たぶんコンストラクタじゃなくてActiveになったときに処理すべきか
コンストラクタだとFormとの作成順がおかしくなるんじゃないの

88 :
>>83-87
みなさんありがとうございます。Form1を指定でうまくいきました。
しかし今度は、TestClass.FreeをしてもForm1に表示したラベルが消えなくなってしまいました。
TestClassのデストラクタでTestLabelも解放してるのですが、画面に残ったままです。
どうか消し方をお教えください。
>>87
Formが作成され終わった後にしか作成されないクラスなので、
その点は多分大丈夫じゃないかと思います。

89 :
>>88
LabelのParentにnilは指定して見たかい?

90 :
これは設計からして間違ってるだろ・・・

91 :
間違ってるけど、本人がやりたいんならほっとけ、という気も
普通はFrameとか使うだろうが

92 :
>>88
「FTest := TestClass.Create;
 の後にFTestを解放せずに
 FTest := TestClass.Create;
 を実行してしまって
 TestClass型の実体を間違えて二つ作ってしまったので
 一つを解放してもう一つが残っている」
に一票。

93 :
オブジェクト指向を根本的に勘違いしていると思われ

94 :
DLLでフォームを扱うときって、Application.Handleだけ渡すのと
ApplicationとScreenを変数ごと渡す方法があるらしいけど
どっちが正解?

95 :
Packageにする

96 :
>>93
でもオブジェクト指向設計とか
オブジェクト指向プログラミングってむずかしいですね。
C++でも一緒でしょうけれど
漠然とオブジェクト指向言語に触れても
全くオブジェクト指向プログラミングは出来ませんし、
オブジェクト指向プログラミングの書籍って難解なのが多くて…
もっと簡単になればいいのにって今でも思います。

97 :
どこが難解なんだ...

98 :
くだらないんだけど、
PString、@String、PChar(String)は同じ?

99 :
型が違うんじゃまいか?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
17: ATL/WTL Part6 (904)
18: ニートの俺が何か開発して食いつなぐスレ (811)
19: Pythonのお勉強 Part45 (657)
21: 関数型プログラミング言語Haskell Part16 (828)