1 :
前スレ1000 :
2005/11/05(土) 14:23:19
2 :
前スレ1000 :2005/11/05(土) 14:24:51
8 :
デフォルトの名無しさん :2005/11/06(日) 00:11:07
質問です。 例えばTHogeを継承したTHogeExというクラスを作って、 hoge: THoge; hoge := THogeEx.Create; とした場合、hoge.Freeで呼ばれるのってやはりTHogeのFreeですか? その場合、THogeExのサイズが継承元より大きい時、メモリリークしたりします?
Free内で呼ばれるデストラクタDestroyはvirtualだから overrideしてればちゃんとTHogeEx.Destroyが呼ばれる。 hoge: TObject;であってもちゃんと開放される。
Free は仮想メソッドじゃないから override できないはず。 10さんの説明のとおりなんだが、これが多態性の一側面。
12 :
9 :2005/11/06(日) 02:24:32
>>10-11 なるほど、thxです。
ということは、継承後のメンバを使いたい時にいちいちキャストしないといけないってこと以外は
特にデメリットはないと考えて良いですか?
>>11 overrideできないって、overrideするのはFreeじゃなくてDestroyなんだが。
>>12 まあそうなんだけど、メンバを参照するためにアップキャストが必要というのは
その時点ですでにあまり好ましくない。
まず、hogeにTHogeExしか代入されないならhoge: THogeExにするべき。
そうではない場合、
if hoge is THogeEx then THogeEx(hoge).HogeHoge;
なんて書き方が必要になる。
このような呼び出し側がオブジェクトの中身を気にする書き方はよくない。
あらかじめTHogeでカラのHogeHogeを定義してTHogeExでoverrideするなど、
オブジェクトの側で違いを吸収するのが正しい。
まあ、よくないと言いながらも他人の作ったアプリやコンポーネントの改造を
するときには思わずやってしまう手ではあるのだけれどもね。
>>13 >>11 は分かって書いてると思うよ。
そもそも、きっとTHogeのFreeは存在しなくて、TObject.Freeが呼ばれている事も。
なに書いてんだ俺。 アップキャストじゃなくて、ダウンキャストね。
> そもそも、きっとTHogeのFreeは存在しなくて、TObject.Freeが呼ばれている事も。 いやだから、仮想メソッドじゃないんだから Free は TObject.Free しかないでしょ。
ごちゃごちゃ書いてるのは、多態性をちゃんと理解してないからだろう。
俺の彼女のオマンコはFreeできません。
俺の彼女のおまんこはFreeですよ。
>>19 以前確保した彼女を開放(Free)したという事は、つまり振られたわけか。
能動態なんだから「振った」になるわけだが
僕の時はFreeしたら例外が発生しました
>>16 間違い。静的メソッドにも隠蔽される可能性がある。
procedure THoge.Free; reintroduce;
どーでもよすぎる
> 静的メソッドにも隠蔽される可能性がある。
で、
>>9 質問にはどう答えるつもり?
なんだシッタカか、つまらん。
31 :
9 :2005/11/06(日) 21:23:04
つまり、静的メソッドはアドレスがコンパイル時に決定するので、変数の型のメソッドが、 仮想や動的メソッドは実行時にアドレス決定するので、インスタンスの型のメソッドがそれぞれ使われる、 という認識に至ったのですが、これで大丈夫ですか?
どうやってポリモーフィズムが実現されているか、なんかはどうでもいい。 ポリモーフィズムとはなんぞや、ってことが重要。
重要、なんて言いつつ特に説明しないのは単なる知ったか 多態性と言わずポリモーフィズムなんて言うのも知ったかによくある例
↑ 自己紹介乙
くだすれで多態性を説明するのはつらすぎ。ま、33は知ったかじゃなさそうだから 説明してくれるだろうけどね。
↑こいつ馬鹿
またアスペ共の集団発作か
↑ こいつら馬鹿 ↓
うっぴょろげ〜!
33の口先男は、素早く逃げますた。残念〜!
32が自演してるように見えるw あ、32と33が2人で頑張ってるのかな?
俺も33から多態性の説明ききたいな。ちんちん
>>23 Freeに失敗した例外が暴れてるぞ。早くデバッグ作業に戻るんだ。
46 :
33 :2005/11/07(月) 17:53:16
お前ら暇だな(プ
シッタカ口先男あらわる!
>>33 ポリモーフィズム説明まだぁー? チンチン
お前ら何してんの? 死ねよ
50 :
デフォルトの名無しさん :2005/11/07(月) 20:38:03
すみません質問です。 プログラム実行中にコンポーネントのプロパティをいろいろ変えた後、 全部初期値に戻したいのですが、可能でしょうか? 初期値はどこかには保存されていると思うのですが、引っ張り出す 方法がわかりません。 よろしくお願いします。
変える前に自分で記録しておくんだよ
そんな方法はない。 削除してもう一度配置するか もう一個配置してフォームをエディタで表示してプロパティ部分をコピペ。
>実行中に
54 :
50 :2005/11/07(月) 20:53:47
>>51 ということは、プロパティエディタで設定しておくよりも
コード中に初期化部分を用意して呼び出したほうが楽ということですね。
>>52 設計中ではなくアプリケーション実行中に、起動時の初期設定値に
戻したいのです・・・
MemoryStream.WriteComponent/ReadComponent
56 :
50 :2005/11/07(月) 22:17:06
>>55 ありがとうございます。
FormをRead/Writeすると、載ってるものも全部再生してくれるのには
ちょっと困りましたが。
こんな感じでなんとかなりそうです。
procedure TForm1.Button1Click(Sender: TObject);
var
n:integer;
ms:TmemoryStream;
begin
ms:=TmemoryStream.create;
ms.WriteComponent(self);
for n:=ComponentCount-1 downto 0 do Components[n].Free;
ms.Position:=0;
ms.ReadComponent(self);
ms.free;
end;
牛刀を以て鶏を割くって感じだな
58 :
デフォルトの名無しさん :2005/11/07(月) 22:57:31
try...finally...end;
try...again...finally...seconde;
質問です。 Delphi2005ではデフォルトでC#言語をサポートしているようですが、 Delphi言語(Object Pascal)とC#言語は共存させることができますか?
61 :
デフォルトの名無しさん :2005/11/08(火) 08:42:14
上級者スレは立たないのか?
>>60 IDE 共有だけでコードは混合できない。
そうなんだけど、某さんは重くして高価にしたいみたいです。 ばら売り希望のユーザの要望はD2005発売以前からあったけど、無視されつづけています。
いや融合に意味があるならいいんだけど。
融合に意味を見出すひともいるだろうし、そういう人は統合版を買い、 Delphi.NET だけ使いたい人は、個別ばら売り版を買い、となぜ選択できるように しないのか謎。手が足りない、とかいう人がいるけど、実際そうだとしたら、 そんな製品は品質も信頼性も疑わしい。
雑談は不買スレで
初心者にも有用な情報
個々が見出すとかじゃなく一般的に意味があるならいいよ
買うのは個々の決断
DBGridを使っています。 以下の機能を実現したいのですが、どうやったら可能でしょうか?? (前提条件) 列A=ドロップダウンリスト(0,1) 列B=小数点以下含む数値データ ・列Aの値が0の場合、列Bの数値は整数で表示・編集 ・列Aの値が1の場合、列Bの数値は小数点以下含む数で表示・編集 ただしこれは同じ行のみ、そうしたいのです。(以下イメージ) 列A 列B 行1 0 112 行2 1 212.5 行3 0 312 苦し紛れの方法として、OnDrawColumnCellイベントで TextRectして表示だけ少数点以下表示・非表示を切り替えることはできたのですが 編集状態に入ると小数点表示のままです。 いい方法はないでしょうか? よろしくお願いいたします。
VS2005は製品版Expressを無料配布なのにDelphi2006は無料配布しないのですか?
貧乏人は麦を食え
金持ちは有料VSをどうぞ
>>74 それがプロフェッショナルも3000円(旧Spokeから無料アップグレード)らしいですよ
なに! なになになに! Del 終わった・・・・
.NETも終わってるからまあいいじゃん。
名前が変わるだけ。まだ始まってない感じ
Delphiも.NETじゃないの? それともネイティブ64bit対応すんの?
80 :
デフォルトの名無しさん :2005/11/08(火) 17:44:10
素人が2chブラウザを作れるようになるのに最適なサイトを教えて下ちい。
質問させてください。 DDEコンポーネントを使って、 300のトピックを扱おうと思っています。 アプリでは不可視なコンポーネントですが、 開発時はフォームデザイナにコンポーネントを300個おかなければならないのでしょうか? ソースで書くだけで実現する方法はありませんか? また、アプリ実行時に任意の数だけコンポーネントを配置することはできないでしょうか?
Createすれば良い。
>>84 最初はそう思ったんですが、
未定義の識別子とか怒られたりしたもんで・・・
ソースでCreateすることで動的にインスタンスを作成できるということですよね?
ちょっと勉強してきます。
ありがとうございました。
自問自答乙
誤爆してやんの(藁
FormのOnKeyDownで Ctrlキーと Shiftキーを押した状態でDeleteキーを押した 状態を実現するために procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift in [ssCtrl,ssShift]) and (Key = VK_DELETE) then //エラー! if (Shift = [ssCtrl]) and (Key = VK_DELETE) then //これはOK ・・・・・・・・ end; としたのですがエラーになってしまいます。なんででしょ? type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); なので問題ないと思うのですが。
ssctrl in shift
>>88 in のオペランドは順序型と集合型。
Shiftは集合型、[ssCtrl, ssShift]も集合型。
ヘルプの集合演算子を嫁
91 :
デフォルトの名無しさん :2005/11/09(水) 20:19:30
英語読むも糞もないだろ 適当に個人情報を入力して適当に某に登録すんだよ その程度気合で解読しろ
94 :
91 :2005/11/09(水) 21:06:32
気合って言われても無理です 「英語が読める」方いませんか?
辞書も引けないの? それでは今後が思いやられる
英語教えろって書いてないが? 96が教えろ
関係あったね。スマソ。
>>91 をチラッと見たが小学生でもわかる英語じゃん
101 :
デフォルトの名無しさん :2005/11/09(水) 22:41:36
背伸びって・・・ Delphi6 Personalをクリックして New Userをクリックして 赤項目(氏名と住所など)を入力。 State/ProvinceにはN/Aを入力。 Registerをクリック。
ありがとうございます。ライセンス入手できました しかしインストール中に Error C\WINDOWS\デスクトップ\program 〜 .damの読み込みエラー ファイルが存在していてアクセスできることを確認してください と表示され「再試行」「無視」もできずに「キャンセル」しかできません。 どのような問題が発生しているのでしょうか 解決方法を教えてください
よく分からんが、デスクトップだと駄目なのかも。
c:\program files\borland\delphi6 にインストールしろよ
英語どころかコンピューターの基本的なところも怪しそう。 まあ、楽しんで。
デルファイ6パーソナルのインストールキー取得のアンケートのアドレスを教えてとうだい
Delphi6Personalで関数ってどう作るんですか? Del5Entだとctrl+shift+cで簡単に作れた気がするんですが・・・
Pro/Ent買え
そういうコード支援機能を削るところが某クォリティー
でもperのチュートリアルの間違いは放置するんだよね
BCB6のはちゃんと修正されてるのにね
>>108 1. Ctrl + J
2. 自分で書く
115 :
デフォルトの名無しさん :2005/11/12(土) 08:48:25
buraブラウザのサンプルってどっかにないですか
116 :
デフォルトの名無しさん :2005/11/12(土) 12:38:33
質問があります。 i: Integer; というのがあってこれを文字列にしたとき 0001 っといった感じで4桁にするにはどうすればいいですか? IntToStr(i); だと一桁になってしまいます。よろしくお願いします。
s := Format('%04d', [i]);
118 :
116 :2005/11/12(土) 13:03:52
自分の環境ではスペースが入ってしまいます。 スペースではなく0を入れるにはどうしたらいいですか?
119 :
116 :2005/11/12(土) 13:07:21
Format('%.4d', [i])
121 :
デフォルトの名無しさん :2005/11/12(土) 17:38:24
BitBlt で TImage の画像をメインフォームに転送しているんですけど、 他のアプリを前面に出した部分の画像だけちょん切れるんです。 FAQ かもしれませんが原因、対策のおわかりの方がいましたら、お願いします。
質問です 複数のスレッドからform1にあるCheckBox1.Checkedを参照する時って Synchronize使わないとダメですか?
>>121 FAQ 以前に当たり前。ウィンドウの再描画はコードで行われる、って当然のことを
さぼってるだけ。普通は TPaintBox の OnPaint で画像を描く。TImage にすると
再描画が自動的に行われる。それから BitBlt を使うんじゃなくて 普通は
TCanvas.Draw() などのメソッドをつかう。そのために Canvas があるんだから。
>>122 VCL はスレッドセーフじゃないから、メインスレッドのコントロールを操作するときは
Synchronize をつかってください。読むだけでもそうすべきです。
>>121 RefreshとかApplication.ProcessMessageを挟むといいかも
>>122 TControlはスレッドセーフじゃないから駄目
何がスレッドセーフかはヘルプでSynchronize引けば載ってるよ
127 :
121 :2005/11/12(土) 19:30:48
回答ありがとうございます。BitBlt を使ったのは、実は簡単なアニメーションの 練習をしておりまして、参考にした某書籍のコードをそのまま実行させてみたのです。 PaintBox でできるか、試してみたいと思います。
パフォーマンスが問題になりそうならCheckedを毎回参照せずに OnClickで普通の変数にコピーして参照したり ThreadのプロパティにセットするようにすればSynchronize不要になるな。 まあForm自体無駄の塊だからあまり気にする必要ないんだけど。
それでどうして Sychronize 不要なるのかな。たんに変数にコピーしただけじゃ 排他制御になってないし。
あたまわるいね
第一書き込めないし
delphiのイベントハンドラの仕組みってどうなっているのでしょうか? 気になっているのは、 イベントが同時に起こった時の優先度は? イベント処理中にイベントが起こった時は? どなたか教えてくれませんか
133 :
デフォルトの名無しさん :2005/11/12(土) 22:56:06
>>128 が正解。
Checkedを読むのは、実際にはメソッド呼び出しになる。
たんに変数にコピーしただけだけだけど、Checkedを参照したいだけなら、これで十分
>>132 イベントは割り込みじゃないから、そのスレッド実行中に勝手にイベントが挿入されるわけじゃない。
134 :
132 :2005/11/12(土) 22:58:53
>>133 ほー、ということはイベント処理中に違うイベントが起こったときは、
その処理が終わってから次のイベントの処理を始めるってことでしょうか?
136 :
デフォルトの名無しさん :2005/11/12(土) 23:45:23
TMediaPlayerって2倍速再生とかできますか?
>>133 >Checkedを参照したいだけなら、これで十分
何言ってるの? 参照して変更することもあるでしょ。ウィンドウズのコントロール
なんだからメソッドっていってもメッセージ処理だよ。
>>134 >ほー、ということはイベント処理中に違うイベントが起こったときは、
>その処理が終わってから次のイベントの処理を始めるってことでしょうか?
イベントは割り込みではないってこと。メッセージポンプっていって、メッセージ
があるかどうかを見にいってはじめてイベントが起こるかどうか決まる。
だからイベント処理中にイベントが起こることはない。わざとメッセージ処理を
するようにコードで記述することはできるけど。
無理に話し広げて反論しなくていいよ。 参照は参照。
CheckBox1.Checked := ture; ってコードは CheckBox1 を参照してるんですけど。
参照を読み込みだけって思うのはOOPを知らないんだろなぁ
君達、話が噛み合ってなくね? Delphiより日本語の勉強しろ
143 :
132 :2005/11/13(日) 00:14:08
>>138 なんとなくわかりました。
周期的に拾うってことですね。
ありがとやんした。
145 :
83 :2005/11/13(日) 00:50:22
すいません。やっぱりわかりません。 コンポーネントを配置して、宣言しないと使えないんですが・・・ 宣言しないでcreateするにはどうしたらいいんですか?
147 :
83 :2005/11/13(日) 01:32:03
>>146 ありがとうございます。
これでいけそうです!
148 :
83 :2005/11/13(日) 03:06:34
すいません、新たな問題が・・・ コンポーネントを大量に作成することはできたのですが、 それぞれのOnChangeイベントに同じ処理を加えたいのですが何か方法を教えてください。 おねがいします。
>>144 で、Checked が変更されて、変数にコピーするまえに参照されたらどうなるの?
>>148 それぞれのOnChangeに同じイベントハンドラを設定する。
ユーザがクリックして、親が WM_COMMAND を受け取ってから、コントロールの OnClick が 呼び出されるまで VCL のなかでは結構長いコードが実行される。その間に、コピーした 変数を読むと、同じタイミングで Synchronize して読むのとでは結果が異なる。 排他制御はまさにこのようなことが起こる確率をゼロにするためにある。
timerは一つのフォームにいくつまで使えるんですか? 環境に依存するらしい事はわかったのですがそれがどのくらいの単位での話なのかわかりません
何個使うつもりですか? リソースについて明言するのは難しいですが、10個くらいならOKでは
>>153 最大6個になります。ありがとうございました。
delphiのインデント幅ってみなさんいくつぐらいに指定してますか? 8でいいんでしょうか?
全エディタで4に統一してる。 telnet経由でいじるエディタだけ2。
2
2とかでやってる奴って、そうとう頭がいいんだろうなァ。 一般人は4で、年寄りや目かビーンズページが弱い人が8なんだろうなァ。
159 :
158 :2005/11/13(日) 12:54:03
勘違いだった。 Delphiのコードエディタは見やすいから、馬鹿や弱視でも2で十分実用可能だ。
161 :
83 :2005/11/13(日) 16:02:13
>>150 オブジェクトインスペクタ以外で、ソースコードで登録することってできるんですか?
動的にコンポーネントを作成した後、onClickメソッドに結びつける hoge.onChange := onChangeProc; onChangeProcはpublic節に定義しておいて onChangeイベントでやりたい内容を記述する
163 :
83 :2005/11/13(日) 16:29:05
よくわかりました。 ありがとうございます。
164 :
83 :2005/11/13(日) 17:04:33
すいません、そのonChangeProcに引数を渡すことってできませんか? 例えば、100個のDdeClientItemのonChangeで100個の対応するLabelに表示するってことをやりたいんですが・・・
onClickイベントをオーバーライドすればいいじゃない
167 :
83 :2005/11/13(日) 17:20:35
あざーす。 勉強してきます。
scanlineって画像の一部の領域だけを対象にして使うこともできるんですか? BMP画像で指定の範囲のRGB値の平均を取得するってことをやろうとしてるんですが。
>>168 単に画像のメモリアドレス指してあるだけだから当然出来る
32bitフォーマット、左から10ピクセルなら+4*10バイト
ロキュータス乙
>>170 漏れもあっちから誘導されて来ました。
まだまだ駆け出しなので、よろしくお願いします。m(_ _)m
>>173 このソースでしたらたとえば以下のようにすればOKです.
if (X < Image1.Picture.Width) and (Y < Image1.Picture.Height) then
(既存のコード)
else
(画像外の時のコード);
このソースではイメージコンポのStretchがFalse(拡大縮小しない)でCenterがFalse(画像を左上に配置)ですので
Image1MouseMoveイベントハンドラのX,Yパラメータの値は画像のX,Y座標と一致します.
そのため上のような単純なコードでOKになります.
175 :
デフォルトの名無しさん :2005/11/13(日) 23:53:53
前スレ968です
http://pc8.2ch.net/test/read.cgi/tech/1062422335/968 ヒントをいただいたのですがまだわかりません
今やってることをまとめました
・ResetやReadlnで発生した例外をexceptで処理する
・発生する例外はどちらもEInOutErrorなので
ErrorCodeで例外の内容を判断
・ErrorCodeが2(ファイルを開けない)の場合はwriteln(filename);のあと
例外を再生成して外側のexceptに同じ例外を渡す
・ErrorCodeが2以外の場合はException.Create('読み込めねー');を
外側のExceptに渡す
ファイルがない場合や読み込めない場合を試したところ問題の通り動いています
どこが悪いのか検討もつかず、とっかかりが無い状態です
言語ガイドやKodersで色々なソースを読んでるのですがどうにもわかりません
ヒントの追加をお願いします
176 :
173 :2005/11/14(月) 00:05:10
>>174 できました!原因がわからなかった別のエラーもでなくなったようです、ありがとうございました。
例えばImageを10個作るとするよ? img1:=TImage.Create(Self); img2:=TImage.Create(Self); (以下繰り返し) って書いてたら、for文使いたくなってきたのさ で、ヘルプの真似して for i:=1 to 10 do begin TImage.Create(Self).Name:='img'+IntToStr(i); end; と書いて、ここまではいいんだけど、その後に img1.Visible:=false; ってやったらものすごい勢いで怒られました。 どうやったらうまく行くの?
Name プロパティーは単なる文字列。インスタンスの変数名じゃないよ。 この違い分かる? TForm1 の public のところに img: array[0..9] of TImage; と手書きで書きくわえて for i:=1 to 10 do img[i] := TImage.Create(Self); としてつくっておき、アクセスするときは img[1].Visible := false; とかにする
× for i:=1 to 10 do img[i] := TImage.Create(Self); ○ for i:=0 to 9 do img[i] := TImage.Create(Self);
ああぁん…なんとなくわかりました ImageにはNameのほかにもTopとかVisibleとかいろんな性質があるけど、 その入れ物を作らずに、名前だけ作ってたってことですかね? なんか無理矢理納得して直しておきます。 答えてくれてありがとう いや、あれか。Nameってのはただの名札であって、本名じゃないと
修正したら無事、怒られないですみました 1時間試行錯誤してた問題がすっきり解決。本当にありがとうございました いやいや、とりあえず入れ物込みでImageを作っておいて、そいつの名札だけは決めておいたと… ということは、TImage(FindComponent('img'+IntToStr(i))).Visible とかにすれば怒られないですむのかな? でも、こんな長いの入力するの面倒なんで教わった方法でこの先もやっていきます
Delphiのことを調べているうちに "Why Pascal is Not My Favorite Programming Language" という論文の存在を知りました 読んでみたいのですが日本語訳はないでしょうか?
Image1 := TImage.Create(self); Image1.Name := 'HogeHoge'; とした場合、 HogeHoge.Visible := true; という文が馬鹿げていることは明白でしょう。 Image1.Visible := true; が正しい。名前はオブジェクトのプロパティーの一つにすぎない。 オブジェクト自体の参照は Image1 という<変数>に代入してる。 変数なんだから、変数名はなんだっていい。 var Honyarara: TImage; と予め宣言してあれば、 Honyarara := Image1 と代入できるし、以後 Hanyarara.Visible := true; としてもOK。
あぁ、そう言われると納得しますねぇ あれっすか? Image1って変数は実は本当のImage1そのものじゃなくて、本当のImage1の性質を記録した箱(って言うかタンス?)に過ぎないってこと? なんていうか、伝えにくいんだけど、そんな気がしてきた。 ShowMessage(Image1.Name);ってやると、Image1って名前のタンスのNameっていう引出しの中身を見せろ ってこと? で、TImageという型式の設計図でHonyararaってタンスを作って、 変数Honyararaの中身は変数Image1と同じですよー つまりHonyararaに記録されているのは"本当のImage1"のいろんな性質なんだよ と あれ?なんだか意味不明になってきた
Image1 := TImage.Create(self); をどう解釈するか。これで混乱してるっぽい イメージコンポーネントを作って、そいつのいろんな性質を変数Image1に関連付けますよ って感じですか? 次に、Honyararaの関連付け先はImage1と同じにしてるってこと?
>>184 Image1という変数は箱どころか
イメージコンポーネントがどこにあるかを書いた紙切れに過ぎません.
ですから
>>183 の
> var
> Honyarara: TImage;
は場所を記憶しておく紙切れを用意したに過ぎませんし,
> Honyarara := Image1
は場所を書き写しているに過ぎません.
クラスを新しく記述する時、その中の一部のメソッドを 別のユニットにて定義するとかできないすか? 長いのがいくつかあるので、分けて書きたいのです。
できない
メソッドから別ユニットの関数を呼んだらいいんでないの
.NET2.0にフル対応したDelphi.NETでないと無理だな
邪道だけどインクルードファイル {$include foo.pas}
メールサーバからUIDLを取得する方法を教えてください。
193 :
デフォルトの名無しさん :2005/11/14(月) 11:55:57
すいません
http://pc8.2ch.net/test/read.cgi/tech/1062422335/ でも質問した者ですが
IEコンポーネントを表示することはできたのですが、
そこにHTMLを追加するにはどうすればいいんでしょう?
の質問に対してWebBrowser1.Navigate('URL');との回答が得られたのですが、
これはHTMLファイルを表示するための方法ではないでしょうか。
私がやりたいのはIEコンポーネント内のHTMLを追加したりしたいんです
どうすればできるのでしょうか?
194 :
デフォルトの名無しさん :2005/11/14(月) 12:48:43
Delphi7 で作っているアプリケーションがあるのですが、英語 Windows 環境 で動かす必要が出て気ました。メッセージ等は英語に変えられたのですが、 MessageBox の「はい」や「いいえ」の文字がそのまま表示され文字化けします。 日本語OS なら日本語で、英語OS なら英語で表示されればベストなのですが、 できないようであれば、YES や NO に固定でかまいません。 どなたかアドバイスください。 よろしくお願いします。
ちょっと恥ずかしいのですが、よろしく。 この関数をPascalで書くとどうなるのでしょうか? void f(int i) { for( ; !t[i]; i++) if(43<=i) { return; } if (3==t[i]) { t[i]-=3; f(i); t[i]+=3; } if(t[i+1]&&t[i+2]) { t[i]--,t[i+1]--,t[i+2]--; f(i); t[i]++,t[i+1]++,t[i+2]++; } }
自分で調べろよ
>>195 Voidの関数はprocedure、i++はi := i + 1、for文はwhileに展開、!a はa=0、
i-=3はi:=i-3、if(a&&b)はif a and b thenで良いかな。
問題は標準Pascalにはreturnに相当する文がないこと。labelとgoto文を
使うか、フラグで処理しなくちゃならない。Turbo PascalもしくはDelphiなら
exitが使えるんだけど。
あとは頑張れ。私はCは嫌いだから、必要に迫られない限り読む気はしない
けど。
>>187 メソッドがやたら長いことが問題です.
他人(あるいは未来の自分)がソースコードを見たときに
何がなんだかさっぱりわからないコードになるからです.
そのメソッド内の処理の一部を別のクラスやメソッド,
あるいは汎用の関数や手続きに切り分けられないか検討してみて下さい.
(ちなみに私は過去に700行近くあるメソッドを書いたことがあります…手が付けられない)
>>193 「IEコンポーネント内のHTML」って何? それにHTMLを追加って何をする
つもりなの? 何がしたいかよく分からないから、どう答えればいいかも
分からない。
>>199 すみません、書き足すという意味です。
>>200 ここに書き込む前にそこを読みましたが
>uses に SHDocVw_TLB, MSHTML_TLBを追加して
の意味がわかりません・・・
まだDelphiはじめて5日なんです。
202 :
199 :2005/11/14(月) 19:00:37
>>201 だから「IEコンポーネント内のHTML」が何を指していて、「HTMLを追加」
ってコンポーネントの何にどう追加(書き足す?)ってことなのかさっぱり
分からないんだけど。
こっちはそっちの状況が見える訳じゃないし、何をしたいのかも、何が出来
ないのかも、どうすれば目標が達成されたか(どういう方向に目標があるか)
も何も分からないんだから、分かるように細かく書いてくれないとどうしよう
もないぞ。
わからないなら黙ってればいいのに。
>>201 ファイルUnit1の上の方に
uses Windows, Messages, SysUtils, ...
というのがあるので
uses
Windows, Messages, SysUtils, ...,
SHDocVw_TLB, MSHTML_TLB;
と書き足す。
>>201 まずはDelphiの基礎から勉強した方が早いと思う
usesも分からないようだと先が思いやられるし
ヘルプで見るだけでいいから、まずはその辺理解してから来なよ
>>205 解かりました!そういうことだったんですね。
しかし ファイル 'MSHTML_TLB.dcu' が見つかりません となってしまいました
が、そのメッセージで検索してみるとActiveX取り込みから
Microsoft HTMLなんとかをインストールするといいそうでした。
何とかエラーなく思い通りの事を出来ました。ありがとうございました!
>>207 前スレ(【Delphi初心者】今から始めるDelphi Part01)で紹介したけど、
このサイトを一通り実際に入力しながらやると、やりたいことの参考になると思うよ。
実際、漏れはこれで実地に学んでコーディングのやり方を学べたから。初めは怒られたけど。(w
・Delphi はじめの一歩(ブラウザを作ってみよう)
ttp://delphi.sakura.vg/index2.html
210 :
176 :2005/11/14(月) 21:31:01
http://www.uploda.org/file/uporg237673.zip あれからちょびちょび追加してるんですが、RGB値を全部格納した配列から画像全体のRの合計値を表示させるつもりが微妙に数値がおかしいみたいなんです。
640×480の真っ白の画像で計算すると本来は640×480×255=78336000になるはずなんですが、78337330になります。
それだけならいいんですけど、画像を読み込むとエラーが出たり出なかったりで・・・。
どこをどう修正すればいいですか?
>>210 あんまりよく見てないけど、recordをpackedにするとか
213 :
デフォルトの名無しさん :2005/11/14(月) 22:54:41
>>214 でも、予想していた通り、あっちに比べてレベルが高いね。orz
>>211-212 すごく単純なことでした・・数値は取得範囲がおかしかったようです
エラーは画像が表示されてない部分の座標を取得しようとしてたからっぽいです
217 :
デフォルトの名無しさん :2005/11/15(火) 00:05:43
>>195 > ちょっと恥ずかしいのですが、よろしく。
> この関数をPascalで書くとどうなるのでしょうか?
t[i] というのが何なのかわからないので、答えようがないと思われ。
実際にコード書かなくてレベルアップなんかするか。
>>215 昔はそうでもなかったけど、スレの主旨を理解してくれない人が増えた。
222 :
デフォルトの名無しさん :2005/11/15(火) 01:31:58
質問です。自分なりにがんばってみましたが、できなかったので 教えてください↓ 円単位で与えられたお金を紙幣(千円、二千円、五千円、一万円) 貨幣(1,5、10,100,500)を使い最も紙幣や貨幣の合計数 が少なくなるようにして表示せよ。 というプログラムをつくらなければなりません。本当にどうしたらいいか わかりません。助けてください
大きい方から割ってくだけじゃだめなのかな
一桁ずつ分けて考えればいいじゃない
相変わらず質の低い回答者だな
>>222 給与計算で常に必要になる金種表計算だね
ぐぐってみたら多分あるからそれをdelphiにしてみ
(ただ個人的には2000円に対応にしたものは見たことないな)
大きいのから順にごり押しで作ろうとしてる自分がいる
>>222 プログラムで考えようとせず、手動でやるならどういう手順になるか考えれ
それをうまく手順としてまとめられたら、あとはそれをコード化するだけだ
分かりませんじゃこっちもどうしようもない
自分でまずやってみて、つまづいた箇所で聞け
大きい方から割っていく意外にどんな解き方がありますか?
総当り
じゃ、どうやって総当りしようって考えると・・・ やっぱ大きい方から総当りしちゃうなw
総当りなんだからどうやっても何もないじゃん 全部やるんだから
総当りするならループの速度を最適化すべきだろう
単純化して三種類あるとすると、 procedure Calc(Money: Integer; var Y1, Y1000, Y10000: Integer); var A1, A1000, A10000: Integer; MinSum: Integer; begin MinSum := MaxInt; for A1 := 0 to 999 do begin for A1000 := 0 to 9 do begin for A10000 := 0 to Money div 10000 do begin if A1 + A1000 * 1000 + A10000 * 10000 = Money then begin if A1 + A1000 + A10000 < MinSum then begin MinSum := A1 + A1000 + A10000; Y1 := A1; Y1000 := A1000; Y10000 := A10000; end; end; end; end; end; end;
procedure Calc(Money: Integer; var Y1, Y1000, Y10000: Integer); var A1, A1000, A10000: Integer; MinSum: Integer; begin MinSum := MaxInt; for A10000 := 0 to Money div 10000 do begin if A10000 * 10000 > Money then Exit; for A1000 := 0 to 9 do begin if A10000 * 10000 + A1000 * 1000 > Money then Exit; for A1 := 0 to 999 do begin if A1 + A1000 * 1000 + A10000 * 10000 > Money then Exit; if A1 + A1000 * 1000 + A10000 * 10000 = Money then begin if A1 + A1000 + A10000 < MinSum then begin MinSum := A1 + A1000 + A10000; Y1 := A1; Y1000 := A1000; Y10000 := A10000; end; end; end; end; end; end;
if A10000 * 10000 > Money then Exit; は有り得なかった。
馬鹿麦価
>>241 ちょっとみてきたけどキモイAAとかいっぱいあったので合流は遠慮しときます
お前の好みで糞スレ乱立させるなと
“くだすれ” の限度は知らないけど、ここどうでもいい質問ばかりなのは気のせい? Google検索すればすぐヒットしそうな質問を何時間〜何日〜何週間も待ってる弱小開発者ばかりなのはくだすれクォリティかしら
VCLや主要APIのカプセル化等小学生にも優しい機能を備えてるDelphiはそれが長所で短所なんだろうなぁ。 まともに情報収集(検索)も出来ない頭の弱いボウズが食い付いてくるし。 別に初心者はやるなとは言わないけど、最低限の事はしてほしいねとチラ裏でしたpwq 板汚しすまそ
くだすれの質問者の前提条件を求めるのはスレの趣旨を理解してない証拠だな
ちょっと上級者って振りをしたいだけだろ。どうせろくな回答もできないんだよな、こういうヤツ
248 :
デフォルトの名無しさん :2005/11/15(火) 12:26:37
RichEditで右クリックしたときにメニューが出ないんですが Memoコンポで標準で出る右クリックメニューを出すにはどうコードを書けばいいのでしょうか?
>>248 古いログにこういうのがあったけど・・・。
65 名前: デフォルトの名無しさん 投稿日: 02/09/30 13:06
TRichEditを右クリックしたとき
TMemoを右クリックしたときと同じように
ポップアップを表示させるのにはどうしたらよいのでしょうか?
TPopupMenuで作成するしかないのでしょうか?
66 名前: デフォルトの名無しさん 投稿日: 02/09/30 17:04
>>65 他に方法があるなら教えてくれ。
251 :
222 :2005/11/15(火) 17:34:42
友達の協力もあり、完成しました。 本当にありがとうございました^^!!
>>251 折角だから、そのコードも貼っていってよ。
自分の書き方のどこが悪いか、添削してくれると思うよ。
EditコントロールのWindowProcにRichEditのハンドルとWM_CONTEXTMENUを送っても駄目だった
普通に TPopupMenu つかってメニューをつくり RichEdit の PopupMenu プロパティー にセットするだけ
>>248 PasteFromClipboard
CutToClipboard
SelectAll
あたりを使って、それぞれ「Memoのメニューと同じ動作」を考えて
コーディングしていく作業は、そんなに難しくないし
ある意味逆に楽しいかもw
random関数の乱数の周期はどのくらいでしょうか?
精度が気になるならMT使っとけ
258 :
256 :2005/11/16(水) 12:36:31
>>257 使ってますが、random関数の周期が知りたいです。
vbのrndの周期は2^24らしいですが、
randomはどの程度でしょうか?よろしくおねがいします。
259 :
デフォルトの名無しさん :2005/11/16(水) 12:45:42
TWebBrowserなのですが、表示されたhtmlの文字列を範囲選択して コピー操作(Ctrl+C or 右クリック->コピー)しても文字列がコピーされません。 VBでは何もコード書かなくてもWebBrowserコントロールで選択文字列のコピーが出来たのですが DelphiでTWebBrowserに表示された文字列を選択コピーするにはどうすれば良いのでしょうか? コード書かなくちゃならないんだとしたら、文字列変数の値をクリップボードに格納する方法は解るのですが TWebBrowser上で範囲選択した文字列を取得する方法がわからないので その辺の具体的なコードも教えてください。 WinXP Delphi6Personalです。よろしく御願いします。
261 :
デフォルトの名無しさん :2005/11/16(水) 14:24:06
僕に聞かないで下さい。迷惑です。
>>258 Randomのソースが見つからない・・・@D7
あるアプリを実行中に、そのアプリの実行ファイルに
何らかのファイルをひとつD&Dしたら、既に実行されてるアプリに
そのパスを渡すってものを作りたいんだけど簡単なサンプルとか無いですか?
ttp://forum.nifty.com/fdelphi/faq/00191.htm にサンプルはあったんですが、コマンドラインの制限文字数を
限界まで使って複数の引数を渡すことを考慮していてなんか面倒
ParamStr(1)をひとつ送るだけでいいので
そのために必要な最低限のコードを教えてください
現在、二重起動を防止あたりは出来てます
Del6Personalです
>>261 > プログレスバーをつけたのですが全く動作しません。
その書いたコードを貼らないと、エスパーじゃないからわからないよ。
エスパーの人だけでいいので答えてください
僕はエスパー 一千年の未来から時の流れを超えてやってきた Delphi5応答せよ
このアプリは応答していません。すぐに終了しますか?
>>267 だから、それじゃわからないんだってば。
恐らくフォームに貼っただけじゃないの?
コードを書かないと駄目だよ。
何をどう表示するか、流石のDelphiちゃんにもわからないよ。
>>268 うまい!座布団1枚
というか、こんな雑談を書きたいんじゃないんだけどなあ・・・。
な あ / ___ \ 、 m'''',ヾミ、、 /,) 竜 え い ま L_ / \ \、_,r Y Y ' 、 /';,'', ヽ 騎 | 方 り / | ^ ^ | 、 ,\ヽ, | | y /、 ,;;,,'';, i 士 マ が 私 / | .>ノ(、_, )ヽ、.| \、\::::::::::/, /,, ;;, ;;く !? ジ い を i __! ! -=ニ=- ノ!___ ヽ\ o 、 ,o / { ;;;;;;;,,//⌒l /` い 怒 l´ ̄ ̄ |\`ニニ´/ `ソ [ \|:::|/ ] >"''''' !/ よ ら _ゝ |__  ̄ ̄ヾ >、.>ノ(、_, )ヽ、,, <,.< ね せ 「 r---イ /|,、_,, ,',;:ノ ! ! -=ニ=- ノ! ト l ヽ } /;\ / ヽ /''"L \\`ニニ´// ⌒レ'⌒ヽ厂 ̄ } ./;;;,, \ / ;;;;;;ヽ ,,;;','i _人__人ノ_ 人_,、ノL_,iノ! / /;;,',';; ノ--, ',',;;::',',゙i ,,';';i 「 キ L_ ハ キ /'; /./,',',';;" / \ ',',',;;,'i ,;',i ノ モ 了 ハ ャ { / i 、 / ヽ ',;::'、| ) | | ハ ハ ヽ ヾ丿 〈 ヽ'' {//く イ >
273 :
261 :2005/11/17(木) 00:00:16
>>270 すいません。
>>267 は自分じゃないです。
プロパティのpositionを増やしていけば良いと思うのですが、
その数値をどこから持ってくれば良いのかわかりません。
宜しくお願いします。
>>273 何をしたいのか分からないので、
エスパーじゃないとどの数値を使えばいいか分かりません
つーか学習しろよ、小出しにするんじゃねボケ
>>275 てめえには聞いてねえ。
偉そうな口きいてんじゃねボケ。
277 :
デフォルトの名無しさん :2005/11/17(木) 00:49:24
Delphiの仕事ってあるの?
あるけど俺が独占してる
DelphiのIDEはDelphi製
>>278 バグ大杉だザケンナ。
Delphi2005も引き続きDelphi製なの?
>>252 >>237 を添削してくれないのだから、期待出来ない。
因みに>237は、小さすぎる場合は Continue できる。
ループのネストも必要無い。
こうなると総当たりとは言わず、割り算の替わりにループと掛け算で
求めることになる。
>>261 漏れもブラウザ作った事があるんだけど、プログレスバーを実装しようと
色々調べてるうちに結局めどくなったのでやめた。
んで、改めて気になってぐぐってみたら、簡単に実装できる方法を発見。
TWebBrtowserのOnProgressChangeイベントに次のように記述するだけ。
//Progress ダウンロードの進行状況のバイト単位での数値、完了時に-1を返す
//ProgressMax ダウンロードするデータの大きさ(バイト単位)
if ProgressMax > 0 then //Progressが0で除算されるのを防ぐ
ProgressBar1.Position := Round(Progress / ProgressMax * 100);
ただしこれだとプログレスバーが100%表示されたままになっちゃう場合があるので、
後は自分で工夫するべし。
横から質問なんですがステータスバーにプログレスバーを入れるにはどうすればいいでしょうか…
dfmファイルに手書きという手も有る。
286 :
261 :2005/11/17(木) 08:59:17
>>282 おお!
ありがとうございます。
早速やってみます。
>>286 釣りじゃなかったのか…。
煽るワケじゃないけど、あのページにプログレスバーのことは
書いてないじゃん。今、確認してきたけど。
ってことは、「(貼っただけで)動きません」って主張してたんだよね?
ちょっとそれはどうだろう…。
貼っただけで動かないことは知ってたんだよ。たぶん。でもどうコードを書いたらいいか まるっきり見当がつかなかったと。だから、ああいう書き方になっても、まぁ、 仕方ないかと。くだすれだし。
プログレスバーで、なにかリアルタイムでの進行状況を表示するって、けっこう難しいことなんだよな、一般に。
>>289 MS製品のプログレスバーなんて9割ぐらいでピタッと止まって、
その後物凄く待たされたりするなんてことも良くあるしな
進捗を示すにあたって何を基準とするかが重要
バックすることもあるし(藁
>>287 チャント答えてくれた人がいるってのにごねるなよ。
自分は読解力のない馬鹿ですって告白してるようなもんだぞ。
使用するプリンタ、用紙サイズ、向きなどを保存して次回起動時に再現したいんですが、 どのようにするといいのでしょうか。
>>295 プリンタ関連は面倒なんで、NkPrinterとかのコンポーネント使ったほうがいいと思います。
Writelnで出力する内容にtabをいれるにはどうすればいいのでしょうか?
#9
Writeln('hoge' + #9 + 'hoge');
ありがとう
>>301 ついでに、これらもまとめておきますね。
・DELPHIで良く使用する制御文字
改行コード CR: #13
改行コード LF: #10
改行コード CRLF: #13#10
タブ: #9
演算子付けない書き方もあるよ。 Writeln('hoge'#9'hoge');
>>303 ということは、以下はどっちも通るってことですか?
Writeln('hoge'#9'hoge');
Writeln('hoge' + #9 + 'hoge');
違いがあるのは、他の言語からの移行性の考慮?
>>304 どっちでも通る。漏れは付けない(すっきりする)。
移行性云々はシラネ。
単に見た目の問題と考えても良いのではないかと思います. Writeln('hogehoge') と書いても Writeln('hoge' + 'hoge') と書いても 同じ結果になるでしょう? それと同じ.
でも Writeln('hoge''hoge') とは書けないが
>>307 それは書けるよ
もちろん意図したものとは異なることになるが
いや306の例が不適切なことをいいたいだけなんだが
知ったかぶりを発揮したら間違っていたので真っ赤になってる307萌え
>>309 ではこんな感じではどうでしょうか?
------------------------------------
・ 'hoge'#9'hoge' これはひとつの文字列
・ 'hoge' + #9 + 'hoge' これは2つの文字列と1つの文字をつないだ式(式の値がひとつの文字列になる)
'hoge'#9'hoge' はあくまでひとつの文字列なので
たとえば文字列変数 s1, s2 をタブ文字でつなごうとして
s1#9s2
と書いてもダメです.この場合は s1 + #9 + s2 と書いてください.
------------------------------------
※ちなみにWriteln手続きなら Writeln('hoge', #9, 'hoge')と書けますね(すっかり忘れていました).
312 :
デフォルトの名無しさん :2005/11/21(月) 05:34:23
C++で作られたDLLの func( int *a ) と言う整数配列ポインタ指定を引数とした関数にアクセスしたいのですが Delphi側からは何を渡せばいいのでしょうか? 下記の感じで適当に配列を作って渡したみたのですが例外が出て動きません。。。。 var a: array[0..100] of integer; begin func ( int a ); end; @で試しても例外にて停止しました
313 :
312 :2005/11/21(月) 06:02:16
自己レス 動作確認はまだですが 宣言時にstdcall;追加でエラーはでなくなりました
関数宣言の引数パラメータにvarが付いてないのが原因では 配列ポインタが引数ならちゃんと参照渡しにしないとダメ 静的配列だから@付ける事で参照渡しになるけど 動的配列だったら暗黙で参照渡しだから@付けると参照の参照で 悲惨な目に会う予感
どっちでも @a[0] でOK
>>314 おまいさんは基本をやり直した方が良い感じ
配列に格納された値の中から”ある値”に最も近い値を探して返す というのをやりたいのですが、ヘルプを見るとEnsureRangeというのがありますけど、この場合(配列から探すという場合)使えるんですかね?
EnsureRange は全く関係ないような・・・ ループ回して "ある値" との差の絶対値が最も小さい値を見つければいいんでね?
>>317 ほらよ('A`)ノ
function hoge(foo: Integer; bar: TIntArray): Integer;
var
i: Integer;
begin
i := Low(bar);
Result := bar[i];
Inc(i);
while i <= High(bar) do
begin
if Abs(foo - Result) > Abs(foo - bar[i]) then
begin
Result := bar[i];
end;
Inc(i);
end;
end;
つーかこれくらい自分で作りやがれボケ
添字の範囲チェックや高速化くらいは自分でやれよ
文面では別に答えを求めていた訳じゃないのに、 何故か勝手に答えを提示した319に罵倒されてる317カワイソス
ヘルプを読んだ上で、配列で使える?って質問する
>>317 もどうかと思うが。
もっとも Del のヘルプは信用できんから実は使えたり…と思ったのかもしれんが。
たぶんツンデレだなw 文句言いつつエラーチェックや高速化を教えてくれてる辺り
答えもなく罵倒されるよりはいいんじゃね? 正しいかどうかは別にして
319の人気に嫉妬^^;
警告(320-323): スレ密度が低下しつつあります。
>>325 くだすれでそれを言ってもねえ。
燃料でいいんじゃね?落ちるよりもさ。
近頃は過疎すぎ。さびしいねぇ。たそがれ時は。
>>327 あっちでマターリしていればいいし。
だけど、上級スレが落ちたのはショックだったなあ。
続かせないと、どんな形であれ。Delphi、未だここにありって感じで。
329 :
320 :2005/11/21(月) 22:49:08
何がツンデレだカスが 罵倒されるよりはいい?は? そんなのやられるくらいなら無い方がいいっつーの 勘違いしてんじゃね
まあモチツケ 大人の話をしようじゃマイカ
質問させてください。 DDE通信関連のアプリを作っているのですが、 1トピックの150アイテムでOnChangeイベントを使っています。 ログを取るためにOnChangeイベント内でファイル操作(開いて閉じる)をしたところ、 かなりデータに抜けが出てしまいました。 (値が変わっているのに、OnChangeイベント内の処理が行われない) 処理が重くなるかもとは思いましたが、抜けるとは思っていなかったのでびっくりしました。 そういうもんなんでしょうか? アプリが動いている間、ずっとファイルを開いていていいもんでしょうか? プログラムとしてあまり望ましくないですよね?
>>331 DDEは触ったことないんで、その動作が正常なのかどうかは知らないんで置いておいて。
onChangeではキューにログを追加するだけで、後はTTimerのonTimerなり
TApplicationEventsのonIdleでキューから取り出してファイルに書き込むとか。
もっとクリティカルな状態であれば、キューから取り出してファイルに書き込む部分を
別スレッドにするとかでいいんでないかい。
333 :
331 :2005/11/21(月) 23:42:54
やっぱ貯めて書くって感じになりますよね。 別スレッドにするとどんな感じになるんでしょうか? やっぱり一回の値の変化でファイル操作をするとかなり重くなって 本スレッドの処理を圧迫してしまいますよね・・・ ちょっと教えて欲しいのですが、 DDEで最終的には300トピック、10000アイテムくらいを監視したいと思ってるんですが、 300スレッドに分けてしまったらさすがにまずいですよね・・・ そもそも別スレッドにしたものでOnChangeイベントを拾う方法ってあるのでしょうか?
タイムアウト時間がどれぐらいなのかさっぱり知らんけど、 DDEも通信である以上は拾い損ねもあるよ。
…ていうかDDEで300とかやめれ。 DDEはSendMessageで実装されてるぐらいなんで、いくらなんでも限度あるだろ。
自作アプリの通信ログを表示するためにTMemoを使い、 行数制限をするために、一定行数を超えたらMemo1.Lines.Delete(0)としてるのですが、 内部で配列を再確保、コピー、解放とやってるようで、かなり負荷があります。 また、ログの追加も頻繁なので、Addのコストもあります。 これらを解決する(負荷コストを下げる)良い方法ってあるでしょうか?
337 :
331 :2005/11/21(月) 23:50:39
>>334 エクセルで値を監視してるとかなりきっちり拾ってるんですよ。
プログラムをうまく作れば、千アイテムくらいならきっちり拾えるはずなんです。
OnChangeイベント内で重い処理ができないとなると、
考えているアプリを実現するのは結構難しいです・・・
>>335 しょうがないんです・・・
宿命なんです。
DDEで300トピック監視せざるを得ないのです・・・
自分で描く いやまじで。 メモ帳でちょっとでかいファイル開いてみてもわかるように Windowsのエディットコントロールはあんま性能良くない。
>>336 ListViewのカスタムデータ表示に切り替える。
Memo.Linesは重すぎ。
取りこぼしがマズイであれば何らかのプロトコルを実装しないと どうしようもないんぢゃないの?
>>337 宿命ですかそうですか。
んー…。
DDEコンポーネントもメインスレッドのメッセージキューを使ってる筈なんで、
いくらマルチスレッド化してもメインスレッドが耐えられなくなったら終わりそうなんで…
であればDDEコンポーネント使うのやめて、各スレッドでDDEML APIでも使って
通信まで別々にやっちまうぐらいしか?
しかも通信相手の都合もあるし、DDEの開始メッセージはブロードキャストされるしで、
自分の側だけどうにかして果たして効果が出るものなのかもわからん…。
すまんね。
>>338-339 つまりデータの追加削除にかかるコストより、
描画処理の方が重いってことですか?
てっきりTMemoStrings内での配列のコピー周りで時間食ってると思ってました
>>342 それで合ってるよ。
そして、TMemo(エディットコントロール)の内部構造なんかTMemoを使う限りどうしようもないっしょ?
だから、そもそもエディットコントロールを使わない、という選択肢が出てくるわけだ。
あ、フォロー。 合ってる、というのは、データの移動が描画より重いってあたりで。 あとエディットコントロールはUnicodeの合成文字とか 右から左へ書く言語とか全部サポートしてるので 重いのはそれなりの理由が合ったりする。 でも今回の役にはたたんでしょ? 自分で中身も管理するなら、追加と削除が高速なリンクリストにするなどの データ構造への工夫を凝らすことができる。
>>331 なにが問題なんだ。
DDEがからの通信が拾えてないのか、ログ書き込み時のファイル操作に失敗しているだけなのか。
後者ならいちいち閉じずにファイルハンドル使いまわして書き込めばいいだけ。
CreateFile/WriteFileはスレッドセーフだから一行単位で書き込む限り破綻しない。
>>344 なるほど。
リンクリストとなるとスクロール時とかの表示がめんどくさそうですけど、
とりあえずそれで何とか頑張ってみます。
ありがとうございました。
347 :
331 :2005/11/22(火) 00:31:55
>>345 拾えてないんですよね・・・
OnChangeイベントが発生したら、Editの値を変えて、
ファイルを開いて、一行書き込んで閉じるってことをしてるんですが、
Editの値からして変わらないんです・・・
おそらく、ファイル操作してる時にイベントが起こって、
破棄される(?)かなんかしてるのかな
ファイルハンドル使いまわしてってのは、
一度開いたら閉じないで置くって意味ですか?
ファイル操作ってかなり重いですよね?
ファイル操作の代わりにそこそこの演算しても平気な可能性ありますよね?
ファイルへの書き込みやめたらちゃんと拾えるのか?
いちいちオープンクローズは重い。 開きっぱなしで書き込んでいけばバッファリングされるからフォーマンスはかなり上がるはず。
350 :
331 :2005/11/22(火) 00:39:50
>>348 おそらく拾えると思われる。
色々事情があって、
そのテストをするのが明日の朝か明々後日の朝になる・・・
同時にイベントが起こったりしたら拾えない仕様だったりするんですかね?
処理が遅れるのはしょうがないと思ってたけど、
イベント自体はしっかり拾って保持してくれると思ってたんで、
ちょっと想定外。
どうやってプログラミングすればいいんだろ・・・
351 :
331 :2005/11/22(火) 00:41:01
>>349 フォーマンスUP!!
アプリが何時間もファイル開きっぱなしにするのは、
別にいいことなんですかね?
気にしすぎかな?
てかExcelならCOM使えばええやん
>アプリが何時間もファイル開きっぱなしにするのは、 >別にいいことなんですかね? 運用方法による。 tail -fなんかで外部から閲覧できればいいならFILE_SHARE_READすればいいし フルコントロールしたいなら一定間隔でファイル名変えたりopen/closeするとか。
354 :
331 :2005/11/22(火) 00:49:13
>>352 私のことですか?
ExcelのVBAだと重いかなと思いまして、
複雑な処理がしたいこともあってdelphiでアプリを作ってます。
COMってのを使うとどんなことができるんでしょ?
速度的な話したら同プロセスで動くVBAがかなり速いと思うんだが
356 :
331 :2005/11/22(火) 01:00:39
どのスレだよw
先にログの書き込みなしで抜けるかどうかチェックしろよ。 それで駄目なら100万倍高速化しても無理だぞ。
359 :
331 :2005/11/22(火) 01:11:08
>>359 それは単体動作する場合だろ
どんなに凄い速度で動く言語があっても、
別のプロセスとやりとりするならかなり意味が無い
なんかこの人基礎がダメ過ぎる気がしてきた。
362 :
331 :2005/11/22(火) 01:23:53
す、すいません。 意味が分からなくなってきてます! 単体動作が早いのが重要じゃないんですか? DDE通信で得た値で結構複雑な演算をしたいと思っているので、 VBAだと重いのかなと思ったんです。 複雑な処理はしづらいのかなとも思って。
そんな、何十年もまえのPCじゃ有るまいし
364 :
331 :2005/11/22(火) 01:38:07
>>363 いや、可能なら毎秒変化する数千の値で演算しまくりたいもんで・・・
366 :
331 :2005/11/22(火) 01:44:52
同一メソッド内でraiseしてexceptなんてやらせ臭いな
同一プロセスのメモリを参照できるものと、 間接的にも読まずメッセージでやり取り、 しかも通信に失敗する可能性のあるものと、 普通の人間が考えたらどっちが良いと思う?
369 :
331 :2005/11/22(火) 02:26:16
すいません、理解できてきました! あらぬ誤解を招いてしまったようで・・・ DDEServer側は全く違うアプリです。 そのアプリを通してしか、インターネット上のサーバにアクセスできません。 DDEClient側をExcelにするかDelphiでプログラミングしたアプリにするかって話です。 わかりづらくてすんません。
言ってることがコロコロ変わる奴の質問に誰が答えるよ? ちゃんとまとめろアホ
371 :
デフォルトの名無しさん :2005/11/22(火) 09:00:31
↑ こいつはなんで威張ってるんだ?
回答者の心の声を大便
373 :
331 :2005/11/22(火) 09:16:51
す、すいません・・・ ファイル操作なしでも抜けまくりでした・・・ OnChangeイベントって同時に起こると拾えないのでしょうか? DDEコンポーネントの問題でしょうか? どうしたらいいかなぁ
だから詳細書けっての エスパーは滅多にいないんだよ
375 :
メ力名無しさん :2005/11/22(火) 16:26:16
わからないので教えてください。 以下のような設定ファイルから「SLOPE」の行だけを読み出してDouble型のvolt[1]とDouble型のvolt[2]に代入し、 それをInt型の値と乗算しDouble型をString型に変換して出力することが解らずに悩んでいます。 ---------------------------- STORAGE_MODE interlaced FILE_TYPE INTEGER SLOPE 1.87500E-04,1.87500E-04 X_OFFSET 0.00000E+00 Y_OFFSET 0.00000E+00,0.00000E+00 ---------------------------- ~~~~~~C 言語での例~~~~~~ for(ch=1;str[0]!='S' || str[1]!='L';ch++)fgets(str,60,fp2); /* SLOPE確定 */ sscanf(str,"%s %le,%le",&word,&volt[0],&volt[1]); ~~~~~~Delphiでやった部分~~~~~~~ while not Eof( hdrfile ) do // ファイルの終端までループ begin Readln( hdrfile, s ); if s[1]='S' then if s[2]='L' then Memo1.Lines.add(s); // SLOPE確定 // volt[1] volt[2] に読み込む end; まとめると解らないのは以下の2点 ○ C言語でいう #le 型の読み込みがわからない ○ Double型をString形式にできない 是非教えていただきたく、お願いします。
そのファイルそのまま使いたいならStringlist使えばいいのかな DoubleからStringはFloatToStrの事かな 馬鹿でごめんなさい><
配列をその要素数をプログラム実行中に決定(ファイルから読み込み等)した上で その配列を動的確保したいのですが、どういう風にしたら良いのでしょうか? Cでの経験から自分なりにやってはみたのですが、コンパイラに弾かれます・・・
s: array of string; setlength(s, 10); s[1] := 'hello';
setlengthじゃだめかな
>>375 こんなんでいかがでしょうか?DelphiらしくTStringListを使ってみました。
procedure TForm1.Button1Click(Sender: TObject);
var
fp: TextFile;
s: String;
sList: TStringList;
begin
AssignFile(fp, 'C:\test.txt');
Reset(fp);
try
while not Eof( fp ) do
begin
Readln( fp, s );
if (s[1]='S') and (s[2]='L') then
begin
Memo1.Lines.Add(s);
sList := TStringList.Create;
try
sList.CommaText := s;
Edit1.Text := sList.Strings[1]; Edit2.Text := sList.Strings[2];
finally
sList.Free;
end;
end;
end;
finally
CloseFile(fp);
end;
end;
必ず0から、だろ
「始まる」と「使える」は別。
別だから書き込んだんだろ、変なヤツ
385 :
375 :2005/11/22(火) 20:56:38
>380さん ありがとうございます。 その方法だと「SLOPE」の文字が残りそうなので「SLOPE」をDELETEしておけばいいんですね。 さっそく組み込んでみたいとおもいます。 >>Double型をString形式にできない というのは「Str(X,S)」を用いることで解消できました。 そのままCSV形式で書き出したらExcelで読み込めたので、それでOKとしておきます。 デジタルオシロの出力ファイル(中身はバイナリ)を卒業研究用に変換するソフトでした。ありがとうございました。
既に結論が出ている話題ですが…
>>336 > 内部で配列を再確保、コピー、解放とやってるようで、かなり負荷があります。
メモコンポのテキストはWindowsのMEMOコントロールが持っているのがすべてで
VCL内部では何も持っていません.
たとえば TMemoStrings.Delete(インデックス) では
以下の各処理でMEMOコントロールにメッセージを送っています.
・インデックスで指定された行の先頭位置を調べる
・次の行の先頭位置を調べる
・両者の間を選択する
・選択範囲を空文字列で置き換え(=削除)
あの、コードエディタで100行目から200行目までの全ての行の文字列を2マス左にずらす みたいな裏技は無いんですか? 頼む!「有る」って答えて!
逆インデントか?100~200行を選択してCtrl+Shift+Uだ 反対はCtrl+Shift+Iな
うお!マジ!すげー!
>>388 さんありがとう! とても興奮してます
いままで1行ずつSPACEとBSをチマチマ押してたのがアホだった
この時間帯にはレベル高い方が常駐してるのかな? 俺も以前質問して即レスもらった
いや、ほとんど常識だと思うが
「どうしてこんなあほらしいことしなくちゃいけないんだよ!」と疑問を感じられればOK. (まぁこんなもんだろう)とか(しかたがないよ)とか思ったらなんの進歩もありませんから. プログラミングの進歩も「どうすればもっと楽になるか」の繰り返しです.
395 :
デフォルトの名無しさん :2005/11/23(水) 04:13:47
とあるホームページのhtmlファイルの最終更新日やサイズやファイルサイズをTidHTTPで調べたいのですが 具体的にどういったコードで知る事ができるのでしょうか? 環境はindy9、Delphi6Personalです。
「ソース出せ」と?
>>387 フリーカーソル無効化アドイン入れればTabでインデント、Shift+Tabで逆インデントできるよ
へたれが多くなりまつたね
きみがVBやってればよかったのに。一気にDel厨のレベル低下。
exeファイルの更新日時からいろいろ判定してるんだけど、 普通に使ってればアプリのexeファイルの更新日時って変化しないよね?
普通じゃない使い方…??
>>402 バイナリエディタで書き換えたりする人もいるかも。
>>399 へたれが多くなったのではない。残っているユーザの中のへたれ比率が高まっただけ。
>>401 漏れは良くリソースを書き換える
特にアクセラレータあたり
407 :
401 :2005/11/24(木) 21:36:36
401です いろいろ情報ありがとです むーん、変わっちゃう事もあるんですか。まいったなぁ…
408 :
デフォルトの名無しさん :2005/11/25(金) 08:16:20
Delphi5 です。 DelphiのMainForm.exeから 同一フォルダにあるVBで作ったEXEを、 コマンドライン引数を渡して起動させる方法をお教え下さい。
ExtractFilePath Application.ExeName ShellExecute
同一フォルダにあるときはファイル名だけで起動してたんだけど、だめなのかな?
411 :
デフォルトの名無しさん :2005/11/25(金) 09:16:11
>>408 会社名丸出しでKylix-MLに投稿して、Delphi-MLで聞いたら?と言われたのでしょ。
それをスルーして、2chにカキコですか。。。大胆でつね。
後、VBのスレとマルチはおやめ。
>>408 別Exeの起動はCreateProcessAPIを使う。参考までにDelphiの例を
aExeの部分にExeのfフルパスと引数を入れる
var
Si: TStartupInfo;
Pi: TProcessInformation;
begin
FillChar(Si, Sizeof(TStartupInfo), 0);
FillChar(Pi, Sizeof(TProcessInformation), 0);
GetStartupInfo(Si);
CreateProcess(nil, PChar(aExe), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
>>409 駄目じゃないけどカレントパスが変わると
やっかいな事が起こりそうだからフルパス指定の方が安全
414 :
デフォルトの名無しさん :2005/11/25(金) 09:42:43
411 反省します
>>410 誤爆の可能性があるから、
自分でパスを扱うときの基本は絶対パス
ここにCreateProcessの使い方があります。
ttp://www.wwlnk.com/boheme/delphi/tips/tec0260.htm PChar(aExe)のところはシングルクォーテーションでくくらないと
コンパイルできませんでした。。
procedure TForm1.Button1Click(Sender: TObject);
var
Si: TStartupInfo;
Pi: TProcessInformation;
begin
FillChar(Si, Sizeof(TStartupInfo), 0);
FillChar(Pi, Sizeof(TProcessInformation), 0);
GetStartupInfo(Si);
CreateProcess(nil, PChar('test.exe'), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end.
417 :
410 :2005/11/25(金) 11:19:53
ショートカットの作業フォルダを変更して起動してみたら、だめでした。 全然おけって思い込んでた。Windows の基本から勉強し直します…
こんなレベルでも仕事になるんだね いいなぁ
キモいのが一匹常駐してるな
いつものことだよ
メモリマップドファイルのStreamってないですか?
あとどうでもいいがメモリマップ「ト」ね
どうでもよくないよ。 検索で引っかからなくなるから、 そういう指摘は貴重であり重要。 初心者にとってはありがたい。
GNU Pascal や Free Pascal などの 非Borland製Pascalコンパイラを、 Delphi 搭載のBorland製コンパイラに置き換えて使うことってできます? Borland製のコンパイラと同じことができて、安定しているならそっちにしてみたいななんて思っています。 できた人、できた事例をご存じの人、やり方を知っている人がいましたらヒントをください。
つうか、ボーランドのコンパイラってそんな不満あるか? クソ重くて安定していないのはIDEのせいでコンパイラはまた 別物と思っていたけれど。ちがうの? あのIDEをつかったままコンパイラだけ入れ替えてもあまり 意味ないような気がするけど、違うならぜひ教えて下さい。
非BorlandのPascalコンパイラは、それはそれで別の過激な拡張があるので、 (演算子オーバーロードなんかとっくの昔からあるし*=とかもある) Delphi IDEの解析機能なんかも通用しなくなるとおもわれ …というかDelphi IDEはその手の解析にもdccxx.dll使ってるわけだが。
厨房がちょっと思いついただけ。ほっとけ
>>429 お前みたいな香具師が居るから、技術が進歩しないのが分からないのか?
>>426-427 遅レスすまそです。
不安定なのはIDEのせいなんですか・・・
2005とかは使ったこともないので安定性うんぬんのことは分かりませんが、
当方のDel 6 Per でコンパイルしたプログラムと WinXPは相性が悪いみたいなので、
非Borland 製コンパイラで原因不明のエラーとか64ビットへの対応が現状よりも改善できるようなら入れ替えも考えていました。
単純にDelphi 製ソフトが不安定 -> 自作ソフト以外でも起こるからコンパイラに原因ありか? -> コンパイラを変えたら直る? ->
IDEが使えないのは不便そうだ。 ->じゃあIDEはそのままでコンパイラだけ入れ替えられないか?
ってことで質問させてもらった次第です。
なにか改善の参考になるようなものがあれば教えてください。
>>430 本人乙
今回の件は技術の進歩とは何の縁もないと思うが
ちょっと調べれば言語としても別物だと分かるし
> 当方のDel 6 Per でコンパイルしたプログラムと WinXPは相性が悪いみたいなので、 これはDelphiのせいじゃないと思うぞ。 コンパイラを疑うより、自分のプログラムを疑えっていうのは言語にかかわらずFAQ。
> 当方のDel 6 Per でコンパイルしたプログラムと WinXPは相性が悪いみたいなので > -> コンパイラを変えたら直る? 典型的な厨房発想。言語、IDE、結果として出来るEXE、なんにも知らないらしい。
>>434 これでも一応趣味グラマの端くれですから、自分のプログラムを疑うというのは当然のことというのは理解しているつもりです。
自分で作った以外のDelphi 製プログラムでも強制終了がかかる時があります。
現物を出せと言われたら困りますが、OpenJaneのソースを拾ってきて自分のところでコンパイルしてもエラーが出ることもあります。
(いつもいつもじゃないのでやっかいなんですが)
コンパイラを置き換えることが不可能に近くて、あんまり意味がないのは分かりました。
ありがとうございました。
>>435 レスしてもらっておいて悪いですけど、ちゃんと読んでください。
"自作ソフト以外でも起こるから" って書いたでしょ?
437 :
デフォルトの名無しさん :2005/11/27(日) 00:46:36
D6 Personal+MSXMLでXMLを操作する方法をご教授願えませんか? COM使えってどこかに書いてあったけど、どうやって使えばいいのか 分からないっす><
439 :
デフォルトの名無しさん :2005/11/27(日) 02:09:29
delphi→Javaの勉強順番ってどう思います? delphiは初心者用らしいので、ゆっくりプログラムを覚えるために Javaは将来食うためです 最初にdelphi覚えたいって言ったら叩かれる事なんか多い
>>436 なんだか、実行時のエラーの事を言ってるみたい。
単にメモリが不良だったりして(w
TFileFormatsListにアクセスしたいんですけど、良い方法はないでしょうか? TPictureで登録されてるフォーマットを拡張子から探したいのです。
444 :
デフォルトの名無しさん :2005/11/27(日) 08:18:06
>>436 Delphi6をアンインストールして別のフォルダで再インストールして、さらに
一度、フォルダーの dcuとか再構成可能なファイル全部消してみたら?
del /S *.dcu
del /S *.~*
del /S *.dsk
del /S *.dsm
del /S *.tds
>>436 おまえのパソのハードかOSが不良なだけじゃねw
446 :
sage :2005/11/28(月) 13:35:15
>>436 こういった場合、往々にしてOSの不具合、または、他のアプリとの関係による
場合が多いと思います。
できるのでしたら、一旦OSを入れ直し、まず初めにD6をインストールして
試されたら良いかと思います。
無理なようでしたら、別のPCで試したり、VMWAREで試したり、色々やってみて、
問題となっているPC+OSとの差を調べるのが良いかと思います。
>>436 漏れはDelphi6Personalで作ったコードをWindowsXPでコンパイルしてるけど
出来上がったプログラムがXP上で問題を起こしたことは無いな。
ついでに言うと、Windows9xでの動作も問題ない。
というか、最初は問題出まくりだったんだが、コードを弄りまくったおかげで
Windows9xとXPでの互換性はバッチシだす。
で、そのプログラムを自分のHPで公開してるんだが、つい最近になってWindows2000で
実行すると妙な挙動をするのが判明した。
ホント 互換性は地獄だぜ! フゥハハハーハァーorz
if リターンキーを押したら then をDelphi語に訳すとどうなりますか?
リターンキーが押されたことを検知するのは何処なんだ TEdit?TListBox?TForm?
if key = #13 then
VK_RETURNを使おうぜ
452 :
デフォルトの名無しさん :2005/11/28(月) 17:11:11
教え方のへたくそな奴らだな。 ちょっとはGotDotNetを見習ったらどうだ。
>>452 何も教えない無知の貴方よりよっぽどマシです
説明不足スイマセン。検知するのはTFormです
自分で作ったフォームを表示させて、 リターンキーを押したら閉じるというのをやろうとしてました OnKeyDownのところに if Key = VK_RETURN then close; て書いたらできました ありがとうございました
procedure TForm1.onKeyPress(Sender: TObject; var Key: Char); begin if Key = Chr(VK_RETURN) then begin なんたらかんたら〜 end; end;
数字を入力してその数だけ円を右にずらしながら表示する(for文を使用)という プログラムをつくっているのですが、全ての円がいっぺんに表示されて しまいます。 0.5秒にひとつ、といったように表示するのはどうすればよいのでしょうか。
458 :
デフォルトの名無しさん :2005/11/28(月) 22:34:44
関数でTry〜Exceptでエラーを抜ける際、 自分自身の関数名を返したいと思っています。 関数がたくさんあるので、全関数抜けるコーディングを同じにしたいのですが、 自分自身の関数名を取得する方法はあるのでしょうか?
459 :
デフォルトの名無しさん :2005/11/28(月) 22:50:52
>>457 前の円を消す
移動した円を表示
sleep(500);
あぁ前のは消さなくてもいいのか
Sleepだとアプリが固まってしまうだろ この手の場合、TTheadかTTimerを使うべき
463 :
デフォルトの名無しさん :2005/11/29(火) 01:21:15
>>458 適当な値を抜けるコードに引数として渡したらどうだろう
例えば procedure hoge1(a: THoge); overload; procedure hoge1(a: THoge2); overload; があった場合、hoge1(nil) で呼び出したら(THoge, THoge2ともTObjectから継承ね) どっちが呼び出されるか決まってる?
後で定義したほうが呼ばれるようだがアホっぽい挙動だな。 あいまいな〜でエラーとしてハネとけよ。
別々のユニットに同名の関数があって両方usesした場合も、 何も言わずに後にusesしたほうを使うからな。
全然全くこれっぽっちも関係のない話だな
>>458 こんなんどうでしょう
function hoge1; Integer; begin
try
なんとかかんとか
except
raise Exception.Create('hoge1');
end
end;
function hoge2; Integer begin
try
なんとかかんとか
except
raise Exception.Create('hoge2');
end
end;
procedure Main;
begin
try
hoge1;
hoge2;
except
on E: Exception do begin
ShowMessage(E.Message);
exit;
end;
end;
end;
469 :
デフォルトの名無しさん :2005/11/29(火) 08:24:27
>>465-466 まともな言語ならエラーにしますよねーww
さすがですねDelphiってw
BCBならエラーが出るお( ^ω^)
Delphi7でもあいまい〜でエラーでるお
処理を何秒か止めたいんですがどうすればいいんでしょうか Edit1.Text = ''; (ここで10秒くらい待つ命令を書く) Edit1.Text = '1'; みたいにしたいんですが。
Sleep(10000);
474 :
472 :2005/11/29(火) 11:07:26
すんません、自己解決しました sleep()ですね。おさわがせしました。
475 :
472 :2005/11/29(火) 11:08:52
ああ〜473さん、ありがとうございます。 ホント申し訳ない。許してください。
477 :
472 :2005/11/29(火) 11:22:09
>>476 切れ痔なんでごめんなさい、勘弁してください
Personalってそんな所も削られてんのか
まあタダだからしょうがないけど
>>469 は恥ずかしいなw
>>472 その10秒の間にウィンドウ動かしたりアプリを終了させることができないから
Sleepはあまりいいやり方とはいえない。
Timerコンポーネント使っとけ。
>>480 それだったらその10秒待たなきゃ行けない処理全体を別スレッドでやったほうが‥
別スレッドでビジーループか? CPU無駄使いするぐらいならタイマー使っとけ
>>462 回答ありがとうございました。TTheadとTTimerについて、調べてみますね。
っつーか何で待ちたいのか、の目的によってもやり方変わるでしょん。
> 別スレッドでビジーループか? ワーカスレッドなら安心して Sleep() 使えるからビジーループにならない
何でスレッドネタ振るやつってアホばっかりなの?
ここがくだすれだから
488 :
デフォルトの名無しさん :2005/11/29(火) 21:54:31
DLLからoverloadした関数を呼びたいのですが、引数にかかわらずexportsで 最初に指定した関数が自動的に呼ばれてしまいます。 delphi5なんですが、どういった原因が考えられますでしょうか?
別々にコンパイルしたもので、overload していることをなぜ exe 側が知ることが出来ると期待しますか?
無知だからです
TShellTreeViewでCD-ROMドライブを選んで、 TShellTreeView.Pathでフォルダパスを取得しようとしたんだが、 階層が深くなるとちゃんと取得できん! そうゆうもん? おしえてエロい人。
知ってるがエロくないからなぁ・・・
エロいが知らないからなぁ・・・
エロくない上に知らないからなぁ・・・
>>488 別名の関数も用意したら?
>>491 IShellFolder::GetDisplayNameOf で取得してるのだけど
フルパスはMAX_PATHで260バイトとかに制限されている
>>472 //指定時間待関数
procedure pWaitMiliSec(lwMiliSec: Longword);
{
lwMiliSec: 待ち時間(単位:ミリ秒)
}
var
StartTime, WaitTime: TDateTime;
begin
WaitTime := lwMiliSec/1000/24/60/60;
StartTime := Now;
while True do begin
Application.ProcessMessages;
if StartTime + WaitTime < Now then Break;
end;
end;
別に無理して珍回答をひねり出す必要はありませんから
自分に対してだろ。独り言。レスするだけ損。
人生、損得だけじゃないのさ
>>469 は
・無駄にビジーウェイト
・ウェイト中にフォームを閉じられない
という2点で没だな。
回答者の添削コーナーじゃないんだから粗悪なコード貼らずに 最初に張ればいいのに
>>504 とりあえず誰に言ってるのかハッキリしような
何をどう勘違いしたら超初心者スレで472のコードごときに 超基本のTTimerを勧めるべきじゃないなんて考えちゃったんだろう
TTimerは472が求めているものではない 設計が悪いのでそれを変更すべきかもしれないが 質問の答えとしては適当でない
解決したと本人が言ってるんだからそれでいいだろ
> 解決したと本人が言ってる 何番?
timerでもsleepでも出来ればどっち使ってもいいだろうがアホかお前等
>509 >508
本人が納得しても質問が解決してなければスレの財産にならない
麌がましいこと言ってんじゃねぃ
本人があれだから、あれなんだな。まったくあれじゃどうしようないな、あれ。
くだすれで財産とか言ってんじゃね 過去ログ見るようなやつばかりならそもそもこんなスレなくていい
516 :
デフォルトの名無しさん :2005/12/01(木) 00:05:01
10秒間固まるのが嫌なら適当に t := GetTickCount; while (Now-t)<10000 do begin Sleep(16); Application.ProcessMessages; end; こんなかんじでいいんじゃね?
517 :
デフォルトの名無しさん :2005/12/01(木) 00:05:33
すまん、Nowはちげぇな
固まらないけど、再起動されてしまうので、他の機能を殺したくて t := GetTickCount; Enabled:=false; try while (GetTickCount-t)<10000 do // GetTickCount-tは片方がオーバーフローしてラップアラウンドして来ても 大丈夫 begin Sleep(33); Application.ProcessMessages; end; finally Enabled:=true end; としたら、やっぱり固まるのと変わらなかったと
こんな話題で盛り上がっていいのは前世紀までだろ
なあに、かえって免疫がつく。
522 :
デフォルトの名無しさん :2005/12/01(木) 15:45:12
質問です。string 変数に代入した文字列って連続してるのでしょうか。 実験すると連続っぽいのですが、どなたかご存知でしたら教えてください。 (ポインタで参照したいと思ってますので)
>(ポインタで参照したいと思ってますので) PCharでキャストすりゃぁいいじゃん
もちろん連続してる
525 :
デフォルトの名無しさん :2005/12/01(木) 15:54:20
うわっ 回答早杉ありがとです。
>>523 はい、そうしますです。
>>524 安心しました。どっかで違う場所にリンクしてる、何てしてないかと
心配だったので。
またまたカワイイのが現れたな やらないか
String型のstrに'Button1'と入っていて フォームにButton1というTButtonのコンポーネントが張ってあったとして ソースに直接Button1と書かずにstrを使ってButton1を操作する方法ないですか?
tbutton(findcomponent(str)).unko
530 :
デフォルトの名無しさん :2005/12/02(金) 14:57:18
Windowをフラッシュしたり出来ますか?
FlashWindowAPIでどうよ
532 :
デフォルトの名無しさん :2005/12/02(金) 16:38:47
midiを再生したいのですが、半角スペースがあると再生できません。 mciSendString('play "C:\test A\test.mid"',nil,0,0); "で括ってるのに、これじゃダメなんでしょうか? mciSendString('play "C:\testA\test.mid"',nil,0,0); だと再生できます。
ファイル名を8.3のショート形式に変換して渡してやるとか
535 :
532 :2005/12/02(金) 17:18:30
素早いレス有難うございます。
>>533 ExtractShortPathNameを使っても、C:\test~1\test.midとしてもダメでした。(TT)
>>534 リンク先の記事を見たんですが、やっぱりフルパスを"で括るんですよね??
だと、532の内容で再生できると思ったのですが。
mciSendString('play ' + "C:\test A\test.mid",nil,0,0);
537 :
532 :2005/12/02(金) 18:15:03
解決しました! openしてからaliasをplayに渡してやったら鳴りました!! 直playは半角スペースが無い時のみ有効なのでしょうか。 だったら最初から鳴らせないようにして欲しいヨ。・゚・(ノД`)・゚・。 //--ソース-- name:='C:\test A\test.mid'; mciSendString(Pchar('open "'+ Name +'" type sequencer alias midifile'),nil,0,0); mciSendString(Pchar('play midifile'),nil,0,0);
参照のリストにMicrosoft VBScript Regular Expressions 5.5が表示されないんですが・・・・。
WSH最新版入ってるか?
543 :
デフォルトの名無しさん :2005/12/03(土) 21:43:54
Delphiでトリップ検索ソフトつくりたいのですが、 画面にエディットボックス1個とボタンが1個だけあって ボタンを押すとトリップが表示されるような簡単なやつを とりあえず作ってみたいのですが、どっかにいいサイトとか ないでしょうか? それを見てあとは勉強しながら進めていきたいので。
545 :
デフォルトの名無しさん :2005/12/03(土) 21:52:12
>>544 それが俺があほだからかもしらんけど、
Delphiとcrypt3ではよくわからんのしかでてこないのよね。
ここはsageてるのか。。。 すんません。
同じソースコードをDel6PerとDel6Proでコンパイルした場合、何か違いは出てくるのでしょうか?
>>548 ありがとです。
ソース公開してくれてるのは勉強になるなぁ。
で、中身みたけどわけわからねーorz
トリップの部分だけでいいのに、いっぱいあって混乱中。
550 :
547 :2005/12/03(土) 23:53:50
>>550 たびたびありがとうございます。
そこに面白いページがあったので参考にしたいと思います。
janeのソースの中にあったような
TEdit に全角文字を入力させないために以下のようにコーディングしたのですが (効果を確認するためにIMEをオンにする)エンターキーを押した瞬間に Edit1.Text に変換された文字が残り警告が何度も出てしまいます。これを避けるにはどうした らいいのでしょう? procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var C: Char; begin C := Edit1.Text[1]; if Key in [#$81..#$9F, #$E0..#$FC] then //全角文字の処理 begin MessageDlg('全角文字は入力できません',mterror, [mbok], 0); Edit1.Text := ''+C; end; end;
意味がよくわからんけど 最後にedit1.text := ''+c;するからいつまでも入力されたkeyが残るんじゃないの? procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key in [#$81..#$9F, #$E0..#$FC] then //全角文字の処理 MessageDlg('全角文字は入力できません',mterror, [mbok], 0) else edit1.text := edit1.text + key; end; こんな感じでどう?
ImeModeをimDisableにするんじゃ駄目なのか
ごめんelseの処理間違えてるな
どっち道それじゃコピペを防げないし。 そこであまりがんばらずにOKボタン押したときに入力のチェックをして 2バイト文字が入ってたらエラー出してFocusをEdit1に移すとか OnChangeでチェックしてOKボタンを無効にして押せないようにするのが定石。
558 :
デフォルトの名無しさん :2005/12/04(日) 15:00:36
delphiでユーザーから与えられた時系列データ(気温や湿度等)を元に以下の機能を提供するソフトを作りたい ・与えられた時系列データからグラフを描画。 ・与えられた時系列データから出来たグラフの線の長さを表示する。 開発環境delphi6 どなたかご教示お願いします・・・!
stringgridのセルに文字列を表示させるために以下のように書いたんですが・・・ procedure TForm1.FormCreate(Sender: TObject); begin with stringgrid1 do begin cells[1,0]:='X座標'; cells[2,0]:='Y座標'; cells[0,1]:='始点'; cells[0,2]:='終点'; end; end; 何にもエラーはでませんが実行してもセル内に文字が表示されません(当然ながらstringgrid自体は表示されてます) 文字を表示するために何か追加しないといけないことがあれば教えてください。
全角文字はこんな感じで防げるか? uses Clipbrd; var OldEditProc: TWndMethod; MultiByte: Boolean; procedure TForm1.FormCreate(Sender: TObject); begin OldEditProc := Edit1.WindowProc; Edit1.WindowProc := EditProc; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if MultiByte then begin Key := #0; MultiByte := False; end else begin if WORD(Key) >= $80 then begin Key := #0; MultiByte := True; end; end; end;
procedure TForm1.EditProc(var Message: TMessage); var i: integer; s: string; begin if Message.Msg = WM_PASTE then begin if Clipboard.HasFormat(CF_TEXT) then begin s := Clipboard.AsText; for i := 1 to Length(s) do if WORD(s[i]) >= $80 then Exit; end; end; OldEditProc(Message); end;
563 :
560 :2005/12/05(月) 00:51:41
565 :
デフォルトの名無しさん :2005/12/05(月) 01:27:43
『3×3型の二つの行列A=[aij],B=[bij]を読み込み、積ABとBAを 求めるプログラムを作成せよ。また一般的にはABとBAが等しくならない ことを確認せよ。』ですがどなたか教えてくれませんか?お願いします。
宿題は自分でやって下さいよ
567 :
560 :2005/12/05(月) 03:13:43
procedure TForm1.FormCreate(Sender: TObject); begin stringgrid1.cells[1,0]:='X座標'; stringgrid1.cells[2,0]:='Y座標'; stringgrid1.cells[0,1]:='始点'; stringgrid1.cells[0,2]:='終点'; end; あれこれ調べましたけど、こうやってかくだけで本来は文字表示されるはずですよね いったい何が原因なんだろう・・・
>>567 最小限のプロジェクト作って少しづつ足していくとか、
逆にプロジェクトごとコピーして少しづつ削っていくとかして確認。
569 :
568 :2005/12/05(月) 03:25:04
と、その前に Cells に代入後、参照してみたら値はちゃんと入ってる?
>>570 オブジェクトインスペクタのForm1.OnCreateを確認してください。
>>571 で、出来ました・・・物凄く初歩的でしたね(汗
ありがとうございます
573 :
デフォルトの名無しさん :2005/12/05(月) 08:06:12
>>565 二次元配列と、行列の基本的演算で試合終了じゃないか?
TMemoのKeyDownでCtrl+Eとかに 独自のキー操作を拵えたいのですが、 Ctrl+Vのような既に用意されている以外のキー操作では ポンというビープ音が鳴ってしまいます この音を抑制するにはどうすれば良いのですか?
TPopupMenuか、TAction でコマンドつくって それの ShortcutKey に Ctrl+V を割り当て。
Key := 0じゃだめなん?
#0
ああ、本当だ KeyPressに#0したらポンが消えました ありがとうございました
実行時にポップアップメニューを生成しているのですが, メニューアイテムのショートカットキーが働きません. 働くようにするにはどうすればよいでしょうか.
晒しなさい。
質問する側は情報を出し惜しみするなといつも言っているではないですか。 出せる情報を全て出すことが早期解決への近道です。
全バージョンのどんなコードでも再現するんだよバカ 試してから言えよ糞が
584 :
デフォルトの名無しさん :2005/12/07(水) 00:00:16
Delphiでポインタを表示させるにはどうすればよいでしょうか? ShowMessageとIntToStrで表示できないか試してみたけどダメでした
ShowMessage(Format('Pointer=%p', [p]);
>>585 ありがとうございます
うまく表示されました
>>580 function ShortCut(Key: Word; Shift: TShiftState): TShortCut;
??
>>580 ∧ ∧
ヽ(・∀ ・)ノ <ソース出しなよー!
(( ノ( )ヽ ))
< >
590 :
デフォルトの名無しさん :2005/12/07(水) 21:02:20
フォームにフレームを貼り、エラーが出たときに フォームにあるラベルにエラーメッセージを表示しようとしています。 フレーム側で、エラーが発生したときに [TClass型変数].ClassParent; をループし、フォームを探し出す処理を入れました。 通常のフレームだとこれで表示されるのですが、 フレームの中にフレームを貼った場合、親フレームでクラスのループが終わってしまい、 そのまた親のフォームを探し出すところまで進みません。 フレームだったときにそのまた親にループを進めるにはどうしたらいいでしょうか。
>>590 GetParentForm
ValidParentForm
592 :
デフォルトの名無しさん :2005/12/08(木) 03:02:53
例えば1,2,3などの数字の中から3桁の組み合わせを表示するソフト 例 123 132 213 231 312 321 ってどういう感じで作れば良い?教えて
label randomize random()
inttostr() labelがイヤならShowMessage( )
595 :
592 :2005/12/08(木) 03:24:38
ありがたまきん。コンポネントはわかったけど肝心の数式がわからんぽ
596 :
デフォルトの名無しさん :2005/12/08(木) 03:25:10
>>592 n個の場合
1個目の数字を選ぶ
選ばれていない数字の中から2個目を選ぶ
選ばれていない数字の中から3米を選ぶ
・
・
・
選ばれていない数字の中からn-1個目を選ぶ
n個目はガチ
表示する
選ばれたかどうかのフラグは配列で持つ
もっと速い方法もあるけど簡単なのはコレ
597 :
592 :2005/12/08(木) 03:26:41
なるほど!イメージつきました!サンキュウ!
初心者ゆえか、さっぱりわかんなくなってきたので質問させてください。 環境:Delphi 6 Personal unit1とunit2の2つのフォームを用います。 unit1には、Doubleの配列形式(3列500行)のデータがあります。 Unit1側のButton1ClickでUnit2のImage1にそれをグラフ化させようと考えてなんとかUnit2の呼び出しまでは完成しました。 ですが、ポインタが上手く渡せてないみたいで悩んでしまいました。 ---[unit1]---- use unit2; public //大域変数です。 gyouretu : Array [ 1..3,1..500] of Double; procedure TTrance.Button1Click(Sender: TObject); begin form2:=Tform2.create(@gyouretu); form2.show; end; ---[unit2]---- use unit1; procedure TForm2.FormCreate(var gyouretu : Array of Double); var s: String; begin s:=floatTostr(gyouretu[2,2]); Label1.Caption:=s; end; ------------ [エラー] 配列型が必要です。 とりあえず、unit2に数値を一個でも表示させようとしています。 教えてください・・・m(_ _)m
ヘルプで [オープン配列パラメータ] の説明を読みなされ.
無理に引数で渡さなくてもいいんじゃないの unit unit3 interface gyouretu : Array [ 1..3,1..500] of Double; implementation end. としてuses unit3;とすれば gyouretuを両方のフォームからアクセスできる。
引数で渡したい場合は type tgyouretu = array[1..3,1..500]of double; procedure foo(var g: tgyouretu);
>>598 TDoubleArray = Array [ 1..3,1..500] of Double;
TpDoubleArray = ^TDoubleArray;
THoge = class(TObject)
constructor Create; virtual;
destructor Destroy; override;
private
gyouretu : TDoubleArray;
function getHoge : TpDoubleArray;
public
property Hoge : TpDoubleArray read getHoge;
end;
603 :
602 :2005/12/08(木) 17:17:45
つづき constructor THoge.Create; begin inherited; gyouretu[2,2] := 100; end; begin whith THoge.Create do try ShowMessage( Format('%f', [FHoge.Hoge[2,2]]) ); finally free; end;end;
Delphiの記述における慣習を無視した素晴しいコードですね
605 :
602 :2005/12/08(木) 17:19:59
つづき function THoge.getHoge: TpDoubleArray; begin Result := @gyouretu; end;
606 :
602 :2005/12/08(木) 17:22:24
ポインタ渡すならpublicにするかアクセス用のプロパティにするな。 つうかvarで十分なんだろ。
608 :
602 :2005/12/08(木) 17:33:23
>>607 varで十分ならなんでもどんな型でもvarやconst渡しで十分だろ
プロパティも内部はprocedureだろ
なぜプロパティ化していけないのか?
おしえろ
varとかproperty以前の問題だな THoge = class(TObject) constructor Create; virtual; destructor Destroy; override; private public end; とりあえずオレの環境ではコレではコンパイルすら出来ないわけだが
610 :
602 :2005/12/08(木) 17:40:27
>>609 なぜコンパイルできない?
こっちはDel7で動いているが...
おしえれ
609は普通に釣りだろ 少し落ち着け
612 :
602 :2005/12/08(木) 17:47:00
602は半年ROMっとけ
614 :
598 :2005/12/08(木) 18:12:04
つたないコードのために知恵をありがとうございました。 上記のコードを元にいろいろ弄ってみます。 609はどうみても釣りです。 ありがとうござ(ry
あえて言うなら、 >TpDoubleArray = ^TDoubleArray; は PDoubleArray = ^TDoubleArray; にしようぜってくらいか
>>581-582 すいません,一日休みになってしまいましたが,一部晒します.その1.
procedure TPM01Form.AddMenuItem(aShortCut: TShortCut;
const aCaption: TCaption; ClickEvent: TNotifyEvent);
var
NewItem: TMenuItem;
begin
NewItem := TMenuItem.Create(self);
try
NewItem.ShortCut := aShortCut;
NewItem.Caption := aCaption;
NewItem.OnClick := ClickEvent;
FPopupMenu.Items.Add(NewItem);
except
NewItem.Free;
end;
end;
procedure TPM01Form.Build_FPopupMenu;
begin
AddMenuItem(ShortCut(ord('V'), [ssCtrl]), '貼り付け', Menu_Paste);
AddMenuItem(ShortCut(VK_DELETE, [ssCtrl, ssShift]), '全削除', Menu_DeleteAll);
end;
constructor TPM01Form.Create(AOwner: TComponent);
begin
inherited;
FPopupMenu := TPopupMenu.Create(self);
Build_FPopupMenu;
end;
(つづく)
(その2(完)) procedure TPM01Form.Menu_DeleteAll(Sender: TObject); begin ListBox1.Items.Clear; end; procedure TPM01Form.Menu_Paste(Sender: TObject); var LinesToAdd: TStringList; begin LinesToAdd := TStringList.Create; try LinesToAdd.Text := Clipboard.AsText; ListBox1.Items.AddStrings(LinesToAdd); finally LinesToAdd.Free; end; end; procedure TPM01Form.Action_ExitExecute(Sender: TObject); begin Close; end; procedure TPM01Form.Action_PopupExecute(Sender: TObject); begin FPopupMenu.Popup(0, 0); end; (以上) バージョンはDelphi 5 (Update2適用)です
あれ?なんでこんなコード書いたんだろう? なんか凄い初歩的な間違いをしてるかも…汗
いや想像していたのはあってました.
効くぞ。
調べて頂いてありがとうございます. なんでこっちは駄目なんだろう….
FormがbsDialogとか、
直りました.
コンストラクタに以下の行を追加.
PopupMenu := FPopupMenu;
または
ListBox1.PopupMenu := FPopupMenu;
実行時,設計時にかかわらず,
どのコントロールとも関連づけられていないポップアップメニューでは
ショートカットキーが働かないようです.
>>622 BorderStyleは影響しませんでした.
というわけで皆様ありがとうございました.
procedure hoge; begin ShowMessage('hoge'); end; procedure TForm1.hoge; begin ShowMessage('TForm1.hoge'); end; procedure TForm1.FormClick; begin hoge; // (1) end; とすると (1) で TForm1.hoge が表示されますが、 hoge の方を明示的に呼び出す方法はありますか? (C++ での ::hoge のように)
625 :
624 :2005/12/08(木) 23:26:23
自己レス Unit1.hoge; のようにユニット名付けたら呼び出せました
整数/実数 の答えを整数型の変数に代入したいのですが不可能でしょうか? divやRoundやTruncも 指定した演算子は使えません と怒られます。
627 :
デフォルトの名無しさん :2005/12/10(土) 13:28:16
×整数型の変数に代入 ○実数型の変数に代入
ただ代入するだけ
わり算は / を使う。整数と実数との演算は実数の演算になる
>>624 勘だけど ユニット名.hoge; でどうかな?
632 :
デフォルトの名無しさん :2005/12/11(日) 22:32:20
嘘か真かわからんが、QualityCentralにQC#21940で、「Delphi2006 ハング」との事です。時々、ハングアップするとの事です。んー。今まで、Qualityを無視しつづけたツケだな。 -- 2005-12-07 05:54:52 (水) New 2005なんか 最初 吹っ飛んで消滅していたじゃん。 消滅からハングに 大差ないしおどろくことではないかと 先行バグ取り隊の情報引き続きよろしく -- 2005-12-07 09:14:09 (水) New >「消滅からハングに 大差ないしおどろくことではない」 どっちにしろ、真面目につかうものではなさそうですね。 「どっちにしろ、真面目につかうものではなさそうですね」 しらずに2005のときせっかく数時間かけて書いたコードが消滅して悲しい思いしたよ -- 2005-12-07 15:22:52 (水) New
633 :
デフォルトの名無しさん :2005/12/12(月) 00:18:54
クラスの変数を使って、別のクラスを指定する方法ってどうすればよいですか? 下のサンプルをつかって具体的に言うとsiteiを使って別のクラスのiの値を求めたり、 あるいは変更させたりしたいのですが。 Ttest = class; sitei :string; i : integer; end; Ttest1 :=Ttest.create; with Ttest1 do begin sitei :='Ttest2'; i := random(100) end; Ttest2 :=Ttest.create; with Ttest2 do begin sitei :='Ttest3'; irandom(100) end; Ttest3 :=Ttest(略 ・・・
Ttest1, Ttest2, Ttest3を他のクラスのpublishedに置いてFieldAddress
TStringList の Objects を使って連想配列かな
if Nameプロパティが'hoge'のコンポーネントがCaptionプロパティを持ってたら then ってどうやって表現すればいんでしょうか 1日考えたんですけどFindComponent('hoge')ぐらいまでしか出てこないです
よく意味がわからないが if tbutton(findcomponent('hoge')).caption <> '' then ってこと?
フォームにたくさんコンポーネントを張りました 張ったコンポーネントのCaptionまたはTextプロパティを自動で変更したいんですけど、どうやったらいいのかわからないです 例えばラベルだったらCaptionを、エディットボックスだったらTextを変えたいんです
if FindComponent('hoge') has Property('Caption') then hoge.Caption := '新しいキャプション'; みたいな感じです
random関数ってかなり偏りがある気がするんですがなんとかなりませんか
メルセンヌツイスターでも使いなさい
> random関数ってかなり偏りがある気がするんですがなんとかなりませんか 気がするだけ。偏りがあるかどうかを評価するプログラムがあるらしいよ。 あまり詳しくは知らないんだが、Delphi の Random() のアルゴリズムは それなりに数学的には認められたアルゴリズムらしいよ。
643 :
デフォルトの名無しさん :2005/12/12(月) 11:20:07
マウスドラッグでコントロールのサイズを変更したいのですが、どうすればよいのでしょう。 if GetKeyState(vk_LBUTTON)<0 then begin img.Width:= img.Width-???; end; end;
設計時のフォームデザイナと同じだけ、面倒。
Delphiの乱数組成って確かM系列乱数だっけ? まぁ仮に線形合同法でもC標準のrandomと同じ程度の 質の乱数が生成されるはずだし、何も問題ないな
最近Delphiを始めた初心者なんですが、ClientSocketでファイルストリームを作成して SendStreamすれば簡単にファイルを送信する事ができると知ったんですが、MSN Messengerみたいに 送信側が今どのくらい送信が完了したか進行度をTProgressBarで表したいのですが、OnWriteも反応してくれず、 どうやればいいのか分かりません・・(´・ω・) どうか知恵をお貸し下さい。
>>639 ランタイムソースの中のTypInfo.pasを見てみ
650 :
デフォルトの名無しさん :2005/12/12(月) 20:15:23
小さめのフォームをボタンを押したら指定の座標まで移動させたいんですけど どうしたらいいでしょうか?
LeftとTopに代入
TopとLeft
TopとLeftに代入でも、SetBoundsでも。
>>651-653 ありがとうございます
実行した直後の位置は指定できたんですけど
ボタン押した後の代入の仕方がわからないのです
どうかお願いします
OnClick×3
これがなんでわからんの procedure TForm1.Button1Click(Sender: TObject); begin Left := 10; Top := 10; end;
D8 発売直後に、海外でもDelphi関係の個人サイトがバタバタ閉鎖された。 当時つくったリンク集をクリックしてみたら、半分以上がリンク切れだった。 結構有名どころだったのに・・・
で、何が聞きたいの?
誤爆です。失礼しました。
661 :
デフォルトの名無しさん :2005/12/13(火) 04:51:34
EXEのアイコンを書き換えようとしています。UpdateResourceを使って書き換えようと思うのですが、 どうもよくわかりません。参考文献などを教えていただければうれしいです。英語もおkです。
>>661 そのソフト、知らないけど
どうしてもソレじゃないとダメなの?
日本製のでフリーなのもあるけど。
663 :
662 :2005/12/13(火) 04:57:08
失敬w
UpdateResourceは関数です。
右上のxボタンを押した時に、アプリケーションを終了せずに メインフォームを非表示にするにはどうすれば良いのでしょうか。 子フォームを作成すれば似たような事は可能なのですが。。
>>638-639 TControlクラスのSetTextBufメソッドを使うと良いでしょう.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
NewCaptionOrText: string;
begin
for i := 0 to pred(ComponentCount) do
if Components[i] is TControl then //※1
begin
NewCaptionOrText := format('%d番目のコンポ', [1 + i]);
(Components[i] as TControl).SetTextBuf(PChar(NewCaptionOrText)); //※2
end;
end;
ラベルコンポやエディットコンポなど,実行時に目に見えるコンポーネントは基本的にTControlの仲間で,
SetTextBufというCaptionまたはTextを変更するメソッドを持っています.
そこで※1でis演算子を使ってフォーム上の番号iのコンポがTControlの仲間かどうかを調べ,もしそうなら,
※2でas演算子を使ってTControlの仲間として解釈し,SetTextBufメソッドを実行しています.
>>666 レスありがとうございます。おかげ様で解決できました
>>636 を書き込んだ時点で、
フォーム上に貼り付けたコンポーネントの全てのメソッドのヘルプを見ていたのですが、(もちろんSetTextBufも含む)
読解力が足りずにそのような事ができるとは読み取れてませんでした
自分のレベルに合わせて詳細な例文までつけてくれてとても助かります
RTTIバージョンplz
>>665 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Canclose := false;
Hide;
end;
でできたっぽいけど、これだと他の手段で終了させようとしたときも隠れるだけで終了しないので、
もう一工夫必要っぽいです
ちなみに本当に終了させたいときは CanClose := true; にすれば終了します
>>669 レスありがとうございます。
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
h : HWND;
begin
h := GetForegroundWindow;
if h = Form1.Handle then
begin
CanClose := False;
Hide;
end
else CanClose := True;
end;
のようにしてみたら、理想の動作をさせることができました。
ありがとうございました。
CanClose := GFW <> Form1.Handle; if not CanClose then hide; でいいやん
>>671 なるほど。。そんな書き方ができたとは^^;
どうもありがとうございます。
673 :
デフォルトの名無しさん :2005/12/13(火) 12:55:10
ボーランドへのご意見・ご要望の窓口→ feedback mailto 効き目ありません。連絡してもどこかに消える模様。 Quality Central 公式窓口はこちら こちらに報告してもみてないふりをされます。 数え切れないくらいたくさん放置されているから、みにいけばわかります。 そのつけがどんどんのしかかってお粗末なバグがおおいソフトへと成長するのです。 ※12月末出荷予定のBorland Developer Studio 2006に含まれるBorland C++Builderは「テクノロジープレビュー」版となります。 年末にご提供予定のアップデートを適用するまではサポートの対象になりません。
i::::::::/'" ̄ ̄ヾi |:::::::| ,,,,,_ ,,,,,,| |r-==( 。);( 。) ( ヽ :::__)..:: } ,____/ヽ ー== ; ほほうッ ほうほう、それでッ!? r'"ヽ t、 \___ ! / 、、i ヽ__,,/ / ヽノ j , j |ヽ |⌒`'、__ / / /r | {  ̄''ー-、,,_,ヘ^ | ゝ-,,,_____)--、j / \__ / | "'ー‐‐---''
フォームとボタンを透明(半透明)にするにはどうしたらいいですか?
>>675 オブジェクトインスペクタをじっくり見なさい
てすと
きちっとした英語を使える人だけがDelphiユーザと認められる、ってか? 日本では絶滅するね。
きちっとした英語を使える人が少ない事自体、問題だと思うのだがどうか。
>680 You is big fool man! ha ha ha!
>>683 be 動詞の2人称現在活用形は are です
ネタにマジレスって久々に見ました いやー、いつ見ても恥ずかしいものですね^^;
いやー、マジレスにもいろいろあるが今回のはかなり恥ずかしいな。
実はマジレスに見せかけた釣りだったんだよ! なんだってー ΩΩΩ
釣りかどうかは本人にしか分からない・・・このもどかしさを改善するソフトをDelphiで作っていただけませんか!?
「実は釣りだった」の半分以上は負け惜しみ。ほんものの釣りはいちいち注釈入れない。
"You is big fool man" の検索結果 約 351 件
"You are big fool man" の検索結果 約 9 件
696 :
デフォルトの名無しさん :2005/12/16(金) 06:31:31
>>696 うざいとかスレ違いとか以前に、
そうやって貼りまくってると、猫も杓子もダウンローダーにかけてサーバー重くして
本当に熱心にVSを使おうとしてそれを落とそうとしてる人の迷惑にならないか?
698 :
デフォルトの名無しさん :2005/12/16(金) 07:00:44
シェア奪還の決め手を欠く某社員は焦りの色が隠せない様子だなw
700 :
デフォルトの名無しさん :2005/12/16(金) 08:59:59
>>696 MFCを使ったVC++6のプロジェクト、上の2005 Express Editionだとビルドできず。
C++Builder 6 Proffesional Editionだとビルドも実行もできたのに。
スレが閑散としてるなぁ みんなVB.NETスレに移っちゃったのかな?
2chは荒らしが暴れてるのでQ&A掲示板に避難してます。
なるほど。だからひどいことになってるのか、あそこ。
704 :
デフォルトの名無しさん :2005/12/16(金) 14:00:50
●問題2 エディットボックス(Edit1)に入力した数字までの合計値を、ボタン(Button1)を押したら、表示(Label1に表示)させよ。 なお変数は、エディットボックスの入力値(a)、合計値(Sum)、ループのカウンタ(i)とする。 procedure TForm1.Button1Click(Sender: TObject); var i,Sum:□□□□□□□; a:integer; begin a:=StrToInt(Edit1.text); Sum:=0; for i:= □ to □ do begin Sum:= □□□+□ end; Label1.Caption:=IntToStr(Sum); end; 教えて!↑
>>704 Integer, 0, a, Sum, i
答えた代わりとして、その問題集みたいな奴をください。
ループなんかいらんわね Sum := a*(a+1) div 2;
707 :
デフォルトの名無しさん :2005/12/16(金) 14:26:35
●問題3 ボタン(Button1)を押したら、サイコロを600回振り、それぞれの目が出た回数を数えて表示(Label1に表示)しなさい。 なお変数は、1次元配列(Ary)、発生した乱数(n)、ループのカウンタ(i)とする。 【必須条件】要素数が6の1次元配列(Ary)を宣言し、RandomizeとRandom関数を使って乱数を発生させ、1〜6の目が出た回数を記録。 procedure TForm1.Button1Click(Sender: TObject); var n:Integer; i:Integer; Ary:array [1.. □] of Integer; begin Randomize; //Aryの初期化 for i:= □ To □ do Ary[□]:=0; //出た目を数える for i:= □ to □□□ do begin //Randomは、0<=X<Rangeの範囲にある乱数を返す n:=Random (□)+ □; //Label2.Caption:=Label2.Caption+IntToStr(n)+#13; Ary[□]:=Ary[□] + 1; end; //結果の表示 for i:=1 To □ do Label1.Caption:=Label1.Caption+IntToStr(Ary[□])+#13 end;
Random() とサイコロとは違う。ちゃんと、石鹸でも削ってつくれよ。
//Label2.Caption:=Label2.Caption+IntToStr(n)+#13; コメントアウトしてるところが微笑ましい。
1,6 0,600 i 0,600 6,1 n,n 6 i
馬鹿が湧くからりちぎに回答するな
間違った、0,600じゃなくて1,600だった
どっかの小学校のパソコンクラブの課題か何かか? えらく程度低いが。
717 :
デフォルトの名無しさん :2005/12/17(土) 07:45:48
最初の□は6で無くても良いのでは? 6以外の答えを許さない問題を考えないと。
>>717 >【必須条件】要素数が6の1次元配列(Ary)を宣言し
6 以外の答えって何?
720 :
デフォルトの名無しさん :2005/12/17(土) 16:38:09
Delphi6 PersonalにThemeManagerをインストールしたいのですが、Delphi 6 Personal.txt通りにやってもパッケージを追加できません。 どなたか詳しく手順を教えてください
DelWiki嫁ば分かるだろ
722 :
720 :2005/12/17(土) 16:55:29
sageわすれてました^^;
>>721 見れませんよ?<DelWiki
Delphi 6 Personal.txt通りにやればできます。
724 :
720 :2005/12/17(土) 18:43:38
すいません適当にやったらインストールできちゃいました(ゲラ
Delphi.NETでWindowsサービスを作ろうと思ったら、 新規プロジェクトにWindows Serviceがないんですが、 Unitファイルからガリガリ作れってことですか? orz
Delphiやってみようと思ったがまともな入門サイトがないな
Delphi2005日本語版、WinXP日本語版で作ったアプリが、 英語XPに持っていくとレイアウトが崩れます。 ボタンとかMemoコンポとかがウィンドウからはみ出すかんじ。 日本語フォントは使っていないし、まあそれでもフォントの 問題は一応疑ってみたけど、到底フォントのせいでボタン がでかくなったとかそういうレベルのずれ方じゃないんです。 どなたか解決策わかるかたいましたら教えてください。
Delphi2005英語版、WinXP英語版で作ればよし
>>726 そうそうあんまないね。
本買うしかねーな
おれも最近delphiやりだしたんだけどネットだけじゃだめだね。
基本の本と、Tips系の本を5冊買ったらなんとかなったよ。
本買わずにネットだけで今までやってきたんだが、今特に不自由してない。 まぁ、急ぎで英語読めないなら本買うのがいいかもな。
練習にメモ帳を作ってみようかと思ったのですが・・・ インデント機能を追加しようとしたときに procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_RETURN then begin Memo1.lines.Add(' ');//エンターキーが押されたときに次のラインの先頭にタブを追加したい end; if Key=VK_TABthen begin Memo1.lines.Add(' ');//タブ押したら' 'を先頭に追加したい end; end; と、言うふうに書いてみたのですが、実行すると エンターキーを押したときは aniki //一行目、ここでエンターを押した //二行目、「' '」が追加されている //三行目、ここにカーソルが来てしまう タブを押したときに至っては全く反応無しという有様なのですが、どのように書けばいいのでしょうか?
>>733 ApplicationEvents を Form1 の置いて、その OnMessage イベントを使うと良い。
public
procedure WMApp(var Msg: TMessage); message WM_APP;
end;
....
procedure TForm1.WMApp(var Msg: TMessage);
begin
case Msg.WParam of
VK_RETURN: Memo1.SelText := #13#10'RET';
VK_TAB : Memo1.SelText := 'TAB';
end;
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message = WM_KEYDOWN) and (Msg.hwnd = Memo1.Handle) then
case Msg.wParam of
VK_RETURN, VK_TAB: begin
PostMessage(Handle, WM_APP, Msg.wParam, 0);
Handled := true;
end;
end;
end;
>>734 おお!ありがとうございます。しっかり動きました。
では、中身を理解する作業に戻ります
736 :
デフォルトの名無しさん :2005/12/18(日) 18:42:38
イベントハンドラ無しにイベントを処理させるにはどうすればいいですか??
>726 オフィシャルコースウェア買えカス
BDS2006はNECのMC-MK22で動きますか?
談話室スレと間違えたorz
粘着の言論統制がキモいので閉鎖しました。
>>742 フォームを起動した瞬間にイベントが起こるようにしたい
ちょっと的はずれ的な考えだと思うが
フォームにチェックボックスをひとつ
チェックが入ってる状態だと常に最前面
入ってない状態だとノーマルにしたい
Onkeypressだと思ってやってみたがそれだと一度チェックつけてからチェックはずしても常に最前面の状態のままになってしまう。
それってチェックボックスのOnClick使えばいいんでね? ちなみにフォームが起動する瞬間ってのはOnCreateかOnActivate? どっち使うかは書き方次第だが。
>>744 >>Onkeypressだと思ってやってみたがそれだと一度チェックつけてからチェックはずしても常に最前面の状態のままになってしまう。
OnClickと間違えたかも
で、OnClickを使うと一度チェックつけてからチェックはずしても常に最前面の状態のままになってしまう。
今作ってみたけど普通にできたよ procedure TForm1.cbformstyleClick(Sender: TObject); begin if CheckBox1.Checked then Form1.FormStyle := fsStayOnTop else Form1.FormStyle := fsNormal; end; procedure TForm1.FormCreate(Sender: TObject); begin CheckBox1.Checked := False; end;
あぁ悪い procedure TForm1.CheckBox1Click(Sender: TObject);
748 :
デフォルトの名無しさん :2005/12/19(月) 19:06:23
Del6Perなんですが、VBのDir関数のようなものは無いですか? ディレクトリパスと拡張子を指定して、あるディレクトリにある 任意拡張子のファイルのファイル名のみを列挙したいのです。
FindFirst,FindNext ファイル名のみはChangeFileExtで取得してる
すんません、誘導されてこちらのスレにきました。教えてください。 TPopupMenuに動的にメニューを追加する方法なんですが、サブメニューも追加したくて・・・ 例えば MenuA -SubMenuA -SubMenuB MenuB -SubMenuA -SubMenuB -SubC こんな感じでサブメニュー含めて動的に追加するにはどうしたらいいですかね?
>>751 TMenuItemを動的に生成してAddしてやる
配列に関して基本的なことですが、教えてください。 文字列型二次元配列を宣言して代入した文字列をTMemo.Lines.Addで出力したいのですが Addでの出力で StringとArrayには互換性が無い と言われます。宣言と代入は words: array [0..9,0..29] of String words[0] := '文字列1' words[1] := '文字列2' words[2] := '文字列3' : みたいな感じで記述したのですがどこが悪いのでしょうか。
words: array [0..9,0..29] of String と宣言したのなら、 words[i]は要素数30のStringの配列じゃん
>>751 MenuItem := TMenuItem.Create(Self);
MenuItem.Caption := 'MenuA';
PopupMenu1.Items.Add(MenuItem);
SubMenuItem := TMenuItem.Create(Self);
SubMenuItem.Caption := 'SubMenuA';
MenuItem.Items.Add(SubMenuItem);
SubMenuItem := TMenuItem.Create(Self);
SubMenuItem.Caption := 'SubMenuB';
MenuItem.Items.Add(SubMenuItem);
MenuItem := TMenuItem.Create(Self);
MenuItem.Caption := 'MenuB';
PopupMenu1.Items.Add(MenuItem);
SubMenuItem := TMenuItem.Create(Self);
SubMenuItem.Caption := 'SubMenuA';
MenuItem.Items.Add(SubMenuItem);
SubMenuItem := TMenuItem.Create(Self);
SubMenuItem.Caption := 'SubMenuB';
MenuItem.Items.Add(SubMenuItem);
SubMenuItem := TMenuItem.Create(Self);
SubMenuItem.Caption := 'SubC';
MenuItem.Items.Add(SubMenuItem);
>>754 つまり宣言の仕方が違うのですか?
とりあえず自分でもう少し調べてみます。
ちなみに↓と同じ様なことを実現したかったのです。
int i;
char words[10][30] = {
"文字列1", "文字列2", "文字列3",…
};
for (i = 0; i < 29; i++) {
printf("%s\n", word[i]);
}
>>740 >>722 さんも指摘していますが確かに File not found になっていますね.
>>743 別解.アクションオブジェクトを使う方法.
・フォームにアクションリストコンポを置く.
・アクションを追加(ここでは名前をAction_StayOnTopとする)
・アクションのCaptionを「最前面に表示」とでもする
・チェックボックスのActionプロパティにこのアクションオブジェクトを指定.
・起動時にフォームを最前面に表示する場合はフォームのFormStyleにfsStayOnTopを指定.
・アクションオブジェクトのOnExecuteとOnUpdateイベントのイベントハンドラを以下のように書く.
procedure TForm1.Action_StayOnTopExecute(Sender: TObject);
begin
if FormStyle = fsStayOnTop then
FormStyle := fsNormal
else
FormStyle := fsStayOnTop;
end;
procedure TForm1.Action_StayOnTopUpdate(Sender: TObject);
begin
(Sender as TAction).Checked := (FormStyle = fsStayOnTop);
end;
758 :
デフォルトの名無しさん :2005/12/20(火) 00:05:35
クリックするだけでweb上のエディットボックスに貼り付け作業を行うにはどうすればいいですか?
web 上にエディットボックスなどない
760 :
753 :2005/12/20(火) 00:20:24
HelloWords[0,0] := 'TEST1'; HelloWords[1,0] := 'TEST2'; HelloWords[2,0] := 'TEST3; として for i:=0 to 2 do Form1.TMemo1.Lines.Add(HelloWords[i,0]); で出力できましたが、これは正しいのでしょうか?
>>756 Delphiのstringは可変長。
固定長にしたいなら、array[0..9] of string[30];とか、array[0..9, 0..29] of Char;とか。このふたつもちょっと違う。
>>756 Delphiのstringは、文字列の長さに応じて動的に確保してくれるので
Cのように長さを指定する必要はありません。
(長さを指定する事も可能ですが、あまり使われません)
もし、Cの文字列を同じものが欲しいのなら、
array[0..9] of AnsiChar とすると、要素数10のchar配列と同等になります。
stringの配列を作るのなら、単純に
words: array[0..29] of string;
とすれば要素数30のstring配列を宣言でき、
words[0] := '文字列1';
words[1] := '文字列2';
・・・と代入できますし、
Memo1.Lines.Add(words[0]);
で、Addに渡すこともできます。
>>761-762 とてもよく分かりました。
固定だと何かと不便そうなので指定なしのStringでやることにします。
ありがとうございました。
Lines.Addだと1行ずつ追加していきますが 1行ずつではなく、1文字ずつ横に追加する方法はないでしょうか?
text := text+ch
SelText := ch
>>765 それなら簡単ですね。(なぜ気づかなかったのか・・)
でも文字列が長くなっていくと、画面がちらつく感じがしました。
>>766 まさに求めていたものです。
お二人方ありがとうございました。
>>755 MenusユニットのNewItem,NewSubMenuあたり使うともちょっとすっきり書けるよ
769 :
デフォルトの名無しさん :2005/12/20(火) 10:12:15
Timerの切り替えでTrueとFalseで一時停止するんじゃなく リセットする(最初からカウント)にはどうしたらいいですか?
いまいち意味不明だけど カウントする変数をEnable := Trueのタイミングで初期化するしかないのでは
>>770 レスありがとうございます
Interval内でボタン押したらタイマーを初期化したいんですけど
TrueFalseの切り替えだと間隔がまちまちになってしまい困ってます
TTimerを動的に生成して初期化したい時に解放してからまた作ったらどうだろう
>>772 どう見ても超初心者向けの回答じゃないみたいですね
ありがとうございました
精度を気にするならTTimerは使えない timeSetEvent辺りをググレ
>>771 初期化はTimer.Createで調べてみよう
腐らないで頑張れよ
> Timerの切り替えでTrueとFalseで一時停止するんじゃなく Enable を true/false で切り替えるのは API で見ると一時停止じゃないよ。
Timer1.Enabled := False; Timer1.Enabled := True; でInterval分がリセットされる つう話か?
たんに質問者が勘違いしてるだけだろ。
779 :
769 :2005/12/20(火) 16:37:55
解決しました。 いろいろとありがとうございました。
780 :
デフォルトの名無しさん :2005/12/20(火) 21:50:51
ToolBar に ToolButton を追加して、そのボタンに PopupMenu を割り当てました。 この状態で ToolButton を右クリックするとポップアップメニューが表示されました。 で、今度は PopupMenu の TrackButton プロパティを tbLeftButton に変えたのですが、 左ボタンには反応しません(右クリックには反応します)。ご存知の方が いましたら教えてください。(D7 Pro ,WinXP です)
>>780 PopupMenuじゃなくてDropdownMenuに割り当てればいいって話?
782 :
780 :2005/12/21(水) 08:57:16
>>781 正解でした。目的の動作になりました。ありがとです。
TPopupMenu の TrackButton プロパティにかかわらずに、
DropdownMenu に割り当てると、左ボタンでメニューが表示
PopupMenu に割り当てると、右ボタンでメニューが表示
となりました。
win2000 sp4 del6per Sell_NotifyIconを使ってタスクトレイに登録すると、アイコンの色がちゃんと出ません かすれたようになってしまいます。どうにかして色を出したいのですが、ご教示願います
>>783 そのアイコンはWindowsのアイコンファイルとして正しいのか?
エクスプローラは拡張子だけicoの中身ビットマップも正常に表示できるけど通常はそういったファイルは表示できないぞ。
あと、アイコンとして保存する際に16色で保存してるとかパレットが変とか‥・
小さいアイコンが16色しかないとかいうオチだったら相当笑う
つーかそのアイコンは16*16だよね、当然。
つーか、Delphi にまぁーったく関係無し
知識がない事と頭の良し悪しを関連付けてる奴も結構頭悪いと思うよw
あからさまな煽りを無視できず反応しちゃう奴も結構頭悪いと思うよw
プロジェクト→オプション→パッケージで実行時パッケージを使って構築にチェックを入れると 実行ファイルのサイズが極端に軽くなりますが チェックをいれる事によるメリット、デメリットってあるんですか?
メリット:小さなexe デメリット:実行時パッケージの配布
794 :
デフォルトの名無しさん :2005/12/21(水) 19:07:07
MainMenu(内のサブメニュー)をショートカットキーでドロップダウンさせたいのですが、 そのようなことはできるものでしょうか。 OnKeyDown で MainMenu1.Items[0].Items[0].Click; などとしてもだめでした。
たとえば、メモ帳の場合、エディット部分にフォーカスがあるとき Alt キーを押してから F キーを押すと [ファイル] メニューがドロップダウンする。 同様にして、コードでドロップダウンするときは、keybd_event() API でキー入力を シミュレートするとできるよ。
796 :
794 :2005/12/21(水) 20:39:27
>>795 なーる!その手がありましたですね。
(keybd_event って昔はよく使ってたんですけど、何だかで一切使わなく
なっちゃたんですよね。何でだっけかな?)
[ファイル(&F)]−[登録(&R)]のサブメニューを表示するイメージとしては
keydown(Alt)
keydown(F)
keyup(F)
keyup(Alt)
keydown(R)
keyup(R)
てな感じかな。どっかでApplication.何とかをはさむ必要もあるかも
試してみます。
797 :
794 :2005/12/21(水) 21:03:46
OnKeyDown 内ではうまくいきませんでしたので、Timerで処理したらうまくいきました。 ただ、Alt キーが押されている状態(メニューにフォーカスがいっている状態)では 開かない、という事象がありますが。とりあえずは良しとしたいと思います。 ありがとうございました。 OnKeyDown で Timer1.Enabled := True; Timer1 で Timer1.Enabled := False; keybd_event(VK_MENU, 0, 0, 0); // Altキーを押す keybd_event(Word('F'), 0, 0, 0); // 'F'キーを押す keybd_event(Word('F'), 0, KEYEVENTF_KEYUP, 0); // 'F'キーを離す keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); // Altキーを離す keybd_event(Word('R'), 0, 0, 0); // 'R'キーを押す keybd_event(Word('R'), 0, KEYEVENTF_KEYUP, 0); // 'R'キーを離す としました。
Alt は押してすぐ上げてもいいのでは?
それからタイマで非同期にするより、PostMessage() で WM_APP とかをフォームに ポストしておけば OnKeyDown イベントのあとで実行できるよ。
フォームの外枠をマウスでつかんでフォームの大きさを変更するのと同じような操作をパネルで再現させたいのですが、 TFormにはBorderStyleの選択肢にbsSizeableがありますが、TPanelにはありません 少ない脳みそで考えた結果、 OnMouseMoveでマウスがパネルのはじっこに乗ってるか判定して、 はじっこだったらマウスカーソルの絵を変えて、 その状態でマウスの左ボタンを押したらサイズ変更を開始させて、 ボタンを離したら左ボタンを押した時と離した時の座標の差を元にパネルのサイズを変更する という頭の悪い方法しか考えつかないです(しかも超面倒くさそう・・・) 他にもっと簡単な方法はありませんか?
802 :
デフォルトの名無しさん :2005/12/22(木) 08:10:15
DelWiki消えてるな 誰かwikiの後継ぎしてくれ
803 :
794 :2005/12/22(木) 09:04:05
>>798 >>799 ご回答ありがとうございます。PostMessage の方がより良いですね。
変更したいと思います。
>>800 自分は GetWindowLong ,SetWindowLong ,SetWindowPos などの API を使った
ことがあります。
DelWikiのミラーなんて取ってねぇよorz
いきなり消えるのは如何なものか
転送量か何かの問題で消されたんだろうか
807 :
デフォルトの名無しさん :2005/12/22(木) 12:43:36
0からn−1までの整数乱数を計算するrandom(n)という関数を使うにはどのように定義すればいいんでしょうか。 ロシアンルーレットのようなプログラムを作りたいんですが。
まず拳銃に1発だけ弾丸を入れる。
こめかみに当てて var i, n: Integer; begin Randomize; n := 100; i := Random(n); end;
RandomizeはFormCreateの際に一回だけ呼び出せば良い 関数で何度も呼び出す必要性はないな
必要性はないっつーか、1回しかやっちゃあかんのよ。
周期性を気にしてるんだろ? Randomize は、何度やってもいいんだよ。ランダムなんだから(藁
1日1回?、10日に1回?、起動時に1回?。 関数呼び出す毎に実行してなにが悪い?
>>812 いや、Delphiクイックリファレンスにも書いてあるんだけど、
Randomizeを毎回呼ぶことによってランダム性が崩れるんだとさ。
というわけで、Randomizeは、プログラム開始時に一回だけ呼ぶのが正しいらしい。
> というわけで、Randomizeは、プログラム開始時に一回だけ呼ぶのが正しいらしい。 なんで2回じゃ正しくないのかな?
Randomizeは、Randseed変数に、その時の日時にもとづいてセットするんだと。 あとはよくわからん。 とりあえず、俺は本を信じとくけど。
1回目と2回目の間で、Random() を使って、たとえばモンテカルロを実行するとか データの間でランダム性の相関が必要なときは、1回だけが正しい。 相関が無いときは、何度実行しても関係ない。
乱数って結構、奥深いのな
極端な話、毎回Randomize呼ぶと何回Random呼んでも同じ値になるなんてことが起こりうるわけよ 乱数の種がどういう意味持ってるか分からない人はそれ相応の入門書でも読むとよろし
プログラミングって、コードの間の一連の論理的なつながりが実行されることにより 一見複雑な結果が得られる。で、一様で長周期な Random() 関数の実装が、論理的な プログラミングと一見矛盾して見えるんだよね。乱数発生のアルゴリズムは、一生を かけて研究するに値する学問分野ではあるらしい。不思議な感じがするよね。
812や813には人を煽る前に最低限ヘルプぐらい読んで欲しいものだな
ヘルプの内容と関係してないだろ。意味分かって言ってる?
何この下らないスレ
「くだすれ」なんですけど・・・・
825 :
デフォルトの名無しさん :2005/12/22(木) 22:00:20
下らない人間は質問しろ。答えるな。
下らない人間は命令するな。
下らない人間は便秘
あ、「くだすれ」の意味がようやく分かった…(マジで)
マジでおもしろくないわ
まぁこの板ID出ないしね
832 :
800 :2005/12/22(木) 23:32:00
>>801 >>803 まんま望み通りの事がFAQっぽいところに載ってるとは・・・勉強不足すんまそん
でもイメージ的にはあってたみたいですね
提示してくれた物の方が比べ物にならないくらいスマートですが
ちょっと改造すれば解決しそうです。ありがとう
834 :
デフォルトの名無しさん :2005/12/23(金) 00:07:07
つか、何でDelWiki削除されたわけ?? 粘着のせい??
場所だけ確保してあと好きにしろって 管理する気あるのかよ
何もやってない無能がそんなこと言っても説得力ないですよ^^
キャッシュ残ってない(´・ω・`)ショボーン
838 :
デフォルトの名無しさん :2005/12/23(金) 07:43:12
Delphiを導入したいから早くDelWiki復活キボンヌ
導入もできない奴がDelphiやるなんて嘘だろ?
それをいっちゃあおしめえよ
復活まだ〜?チンチン
無料レンタルだからああなったんだろうね。
wikiのバックアップ取ってる奴いないのか?
いい加減スレ違い
845 :
デフォルトの名無しさん :2005/12/23(金) 11:20:17
スレ違いではないことをスレ違うと言うやつがスレ違い
俺がすれ違い
俺とお前が擦れ違い
848 :
835 :2005/12/23(金) 15:08:32
wikiなんて1度も見たこと無いから あっても無くてもどうでもいけどね^^
var S: String; begin SetLength(S, 100); lstrcpy(PChar(S), 'Hoge'); end; こういう使い方してもSは自動的に解放されるんですか?
var S: String; ←
そうなんですか、どうも 少し気になってたもので
type TRec = record aaa: Integer; case Byte of 0: (bbb: array[0..10] of AnsiChar); 1: (ccc: array[0..10] of Byte); ddd: Integer; <---未定義の識別子:'ddd' だって??? end; わし、なんか勘違いしてますか。
>>853 レコードの可変部分はレコードの最後でなければならない。
>>854 じゃー、構造体の中間は再定義できないの?
856 :
デフォルトの名無しさん :2005/12/23(金) 18:50:09
サンバディ
>>855 できない。 Windows.pasでは以下のように対処している。
TRec = record
aaa: Integer;
case Byte of
0: (bbb: array[0..10] of AnsiChar);
1: (ccc: array[0..10] of Byte;
ddd: Integer);
end;
858 :
デフォルトの名無しさん :2005/12/23(金) 21:28:34
Delphi7を利用しています。 リストビューでタスクマネージャーみたいに 列を非表示にしたいのですが、どうすれば いいでしょうか?
859 :
デフォルトの名無しさん :2005/12/23(金) 21:32:53
できるのかもしれんけど、 以前やったときはそんなプロパティ見つからなかったので、あきらめました。
ShowColumnHeaders を False
あ、ごめ、勘違い。 Width := 0 じゃ・・・だめだよね。
862 :
デフォルトの名無しさん :2005/12/23(金) 21:39:31
列って特定の一列の事じゃないんか?? それじゃ、列ヘッダだろ。
863 :
デフォルトの名無しさん :2005/12/23(金) 21:41:18
Width := 0で、いいかもね。MinSizeとMaxSizeも0にして。
なかなか情報はないけれど、特定の列だけ 非表示にするやり方ってあったような気が。
865 :
858 :2005/12/23(金) 21:54:18
書き忘れましたけれど、列全体ではなく特定の列です。 Widthを0にしても隠れているだけで境界をドラッグすると 列が表示されてしまいますし、MinSizeとMaxSizeを0にし ても駄目でした。 完全に非表示にするやり方が多分存在すると思います ので、いろいろと探してみます。 しっている方がいましたらよろしくお願いします。
>>865 俺も調べてみるけど、解決したらこのスレに書き込んでね。
867 :
858 :2005/12/23(金) 22:23:17
いっそのことコレクションから削除してしまうとか。
869 :
868 :2005/12/24(土) 00:10:25
2番目の列を消してみたが内容自体が3番目の列になってしまうためリストの内容全てを再生成する必要がありそう。 procedure TForm1.Button1Click(Sender: TObject); var LC : TListColumn; LI : TListItem; I : Integer; begin ListView1.Columns.Clear; LC := ListView1.Columns.Add; LC.Caption := 'One'; LC := ListView1.Columns.Add; LC.Caption := 'Two'; LC := ListView1.Columns.Add; LC.Caption := 'Tree'; ListView1.Items.Clear; for I := 1 To 10 do begin LI := ListView1.Items.Add; LI.Caption := '1'; LI.SubItems.Add('2'); LI.SubItems.Add('3'); end; end; procedure TForm1.Button2Click(Sender: TObject); begin ListView1.Columns.Delete(1); end;
列ごとに表示非表示を管理するフラグ変数を用意、 リストを仮想ビューにして、OnDataでフラグ見ながらAdd くらいしか思いつかない
871 :
870 :2005/12/24(土) 00:12:52
この場合一番左の列がAddじゃなくてCaption書き換えになり そこに対応しようとすると処理が煩雑になるが、 タスクマネージャ仕様でいくなら、そこは非表示にできなくなってるのでおkかな
それにしても、タスク マネージャの[表示]メニューの"列の選択"から CPU使用率とかメモリ使用量とかを非表示にするができるけど、どう いうふうに実現しているんだろうね。 恐らく無茶苦茶簡単な方法が用意されている予感がしてならない。
一瞬消えるので前面書き換えっぽい。WinSightでどのメッセージが飛んでくるか追っかければわかるだろうけどそこまでする気がしない。(w
×前面→○全面
そこまでやるくらいなら仮想リストビューで対応した方が楽だな これならカラムの並び順入れ替えも簡単に対応できるし
それならStringGridの方が楽でしょ
それならStringGridの方が楽でしょ 色もつけれるし
派生コンポにコード埋め込めばいいんじゃないの? そのためにVCLがあるんだし。
ListViewでやる方法聞いてるのに、 StringGridでやれば?ってどんな回答だよwww
それをいううなら VirtualLisView もいっしょ
文字も満足に打てない人に言われたくありません^^;;
仮想リストビューは柔軟性があるね StringGridはどうしても機能的に限界がある
そもそも用途が違う
> リストビューでタスクマネージャーみたいに > 列を非表示にしたいのですが、どうすれば > いいでしょうか? 875 で解決したんだから、議論の余地なし。
まだだ、まだ終わらんよ
876で解決だろ
DelphiのFree版はバージョン6が最新?使用前に登録しないといけないようだけど 登録用のサイトってどこ?
Delphi初めて約半年 超基礎事項を理解し、簡単なアプリ、ミニゲームを2〜3個作り、クラスの概念をなんとなく理解した このあと、何を学べばいいんだろうか。なんとなく自分としては オブジェクト指向的な設計、クラスの自作、コンポーネントの自作、Win32API、VCLの内部処理 とやっていこうと思うんだけど、脱・初心者を目的としたオススメの指南サイトありませんか?
>>894 DelphianWorld へいって、簡単なコンポをDLして、その動作とコードを研究する
ことを勧めるよ。OOP も Win32API も自然に身に付くと思うし。
開発者ガイド全部読みは基本だろう
それは面白くないな。>開発者ガイド全部読み
900 :
894 :2005/12/25(日) 17:25:26
レスとんクス
>>895 やっぱりそろそろ入門本を買うべきなのか
ここまで全部無料で済ませてきたからweb上の情報だけでやっていきたいけど、そろそろ限界なのかな
>>896 なるほど、その手は思いつかなかった
うまい(きれいな)コードの書き方とかも気になってたから、さっそく何か落としてみます
>>897 使ったコンポーネントのプロパティ、メソッドの全部読みはやったけど、開発者ガイドはやってなかった
けど、初心者にとってdelphiのヘルプってなんか読みづらいんだよね
>>900 大丈夫、開発者ガイドは誰が読んでも読みづらい。
せめて分冊くらいはして欲しい>開発者ガイド(BCB6)
カッターでちょん切ってテープで補強しろ
MessageDlgPosで表示したダイアログを閉じるにはどうすればよいでしょうか?
「OK」とか「はい」ボタン押せば閉じるだろ
MessageDlgPos部分のソース出せ なんか話が噛み合わない
>>907 MessageDlgPos('Are you there?',mtConfirmation, mbYesNoCancel, 0, 200, 200);
よろしくお願いします
ユーザーにはい、いいえ、キャンセルボタンを押してもらうのではなく プログラムで閉じたいってことか?
無理、そもそも使い方自体がおかしい ユーザーがはい、いいえ、キャンセル選んでもらうのに勝手に閉じるとかありえない
MessageDlgPosで表示されるフォームはモーダル付きだから ボタンが押されるまでプログラムはそこで止まる 別アプリか別スレッドでらFindWindowAPI使ってダイアログのハンドル取得して それにWM_Closeメッセージ送るとか? この場合戻り値は何が返ってくるのかわからん
Timer 使えば簡単ですが
概観そっくりの偽プログラムとかは?
>>904 ただ単にメッセージをMessageDlgPosみたいにポップアップで表示したいなら
新たなフォーム表示させてTimerで
if MsgForm.showing = true then MsgForm.Hide;
とかで消せばいいんじゃない?
関数の検索って出来ないんですか? TComponentのFindComponentみたいな感じで TForm1内に存在する関数を検索したいのですが
delphi6を使っています。 RestoreKey関数にてレジストリデータの上書きしたいのですが関数がTrueを返してくれません。 var Reg: TRegistry; begin Reg := TRegistry.Create; with Reg do begin try RootKey:=HKEY_LOCAL_MACHINE; Access:=KEY_ALL_ACCESS; if RestoreKey('\SOFTWARE\hogehoge\hoge', 'C:\hivefile') = True then ShowMessage('OK!') else ShowMessage('Err'); finally Free; end; end; end;
918 :
917続き :2005/12/26(月) 23:06:44
また、dwFlagsの値で未定義の識別子などと警告されるものがありました。 REG_FORCE_RESTORE, REG_NO_LAZY_FLUSH -> 何故か未定義と言われる REG_REFRESH_HIVE, REG_WHOLE_HIVE_VOLATILE -> 関数がERROR_INVALID_PARAMETERを返す var key: HKEY; begin if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('SOFTWARE\hogehoge\hoge'), 0, KEY_ALL_ACCESS, key) = ERROR_SUCCESS then begin try if GetSeRestorePrivileges = ERROR_SUCCESS then begin // SE_RESTORE_PRIVILEGE特権取得成功時 if RegRestoreKey(key,PChar(C:\hivefile),REG_WHOLE_HIVE_VOLATILE) = 0 then ShowMessage('OK!') else ShowMessage('Err'); end; finally RegCloseKey(key); end; end;
919 :
デフォルトの名無しさん :2005/12/26(月) 23:44:52
DVDISOをA12ROM化ってどうすればいいんですか? 板違いだったらすみません。誘導してください
みんな VS に行ってしまったようだ・・・・
>>916 関数をpublishedに置いてMethodAddress
>>917-918 Windows.pasくらい見ろ
Personalだからソースないは無しな、Personalでもパッチ当てればあるから
未定義って言われてなんでそのメッセージを疑うんだよ
未定義だから未定義って出てるわけ、分かる?
なんか嫌なことでもあったか?
personal でも Windows.pas はあるわな
まともなひとは みんな VS に行ってしまったようだ・・・・
VSってなんじゃらほい
.netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します .netは死滅します
なら Delphi のIDEもお陀仏だな
J# も使ってるらしいな > BDS2006 のIDE
すみません、Delphiの質問じゃなくてDelphi付属のインストールシールドの質問かもしれませんが… 簡単なアプリ(ボタンを押したら文字が出る)をつくって、インストーラーつくってみました。 すると、インストールはできるんですが、アンインストーラーがついていないんです。 インストールシールドExpress for Delphiの設定で「アンインストーラーをつける」みたいな設定項目がみつけられないんですが、 これって、自分でアンインストーラーを作成して(Delphiやなんかで)一緒に抱き合わせてインストーラーに仕立てるんでしょうか? Delhi アンインストーラーなどでググってみたんですが、意図したようなサイトがみつからなくて・・
> Delhi これじゃ・・・
>>931 とんでもない勘違いをしているので、
とりあえずヘルプよく読みなさい
>>931 特に何もしなくても「アプリの追加と削除」に普通に項目出てくるよ。
もう一回プロジェクト作り直してみたら?
そんなしょぼインストーラやめてMS製のインストーラ使えよ
>>935 Delphi のバージョンとか
OSくらい書かないと。
OpenDialogで 複数のファイルから1つを選択して処理をします 次に処理するファイルを選択するためにOpenDialogを開いたときに すでに処理したファイルは選択できないようにできるでしょうか。 できれば すでに処理したファイルだけ赤字とか赤の横線に表示できないかと…
UI として間違ってるような・・・
ListView使って自前でリストれ
941 :
931 :2005/12/28(水) 00:34:43
>>934 えぇ、「追加と削除」からは削除できます。でも、市販のゲームとか買うと、スタート→プログラム→○○(自作アプリ)のとこにアンインストーラーも出るでしょう?
ああいう感じのアンインストーラーを期待してたんですが・・
>>937 OSはWin2000、Delphiのバージョンは5proです。
Delphiは姉から譲りうけました。
>>904-915 実例を見せる方が勉強になるかもしれないと思ったのでとりあえず作ってみました.
ユーザーが混乱しないように残り時間が表示されるようになっています.
type
{ ●制限時間付きメッセージダイアログ風フォーム
◆使い方
CountdownFormのMsgにメッセージを書き込んでShowModal.
どれが押されたかはShowModalの戻り値でわかる.
◆主なプロパティ
Msg ... 表示したいメッセージ文字列を指定
TimeoutSeconds ... タイムアウトするまでの秒数(デフォルト:3)
TimeoutResult ... タイムアウトしたときにModalResultに代入される値(デフォルト:mrYes)}
TCountdownForm = class(TForm)
Timer1: TTimer;
YesButton: TButton;
NoButton: TButton;
CancelButton: TButton;
MsgLabel: TLabel;
CountdownLabel: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FTimeoutSeconds: cardinal;
FTimeoutResult: TModalResult;
FLeftSeconds: cardinal;
procedure UpdateCountdownLabel;
procedure ResetCount;
procedure CountDown;
function GetMsg: string;
procedure SetMsg(const Value: string);
(※しばらくつづく)
public constructor Create(AOwner: TComponent); override; property Msg: string read GetMsg write SetMsg; property TimeoutSeconds: cardinal read FTimeoutSeconds write FTimeoutSeconds; property TimeoutResult: TModalResult read FTimeoutResult write FTimeoutResult; end; ◆設計時にコンポに設定するプロパティ Timer1: Enabled: False YesButton: Caption: '&Yes', ModalResult: mrYes NoButton: Caption: '&No', ModalResult: mrNo CancelButton: Caption: '&Cancel', ModalResult: mrCancel ◆↓実装 procedure TCountdownForm.CountDown; begin FLeftSeconds := FLeftSeconds - 1; if FLeftSeconds = 0 then Timer1.Enabled := False; UpdateCountdownLabel; end; constructor TCountdownForm.Create(AOwner: TComponent); begin inherited; FTimeoutSeconds := 5; FTimeoutResult := mrYes; end; (※つづく)
procedure TCountdownForm.FormClose(Sender: TObject; var Action: TCloseAction); begin Timer1.Enabled := False; end; procedure TCountdownForm.FormShow(Sender: TObject); begin ResetCount; Timer1.Enabled := True; end; function TCountdownForm.GetMsg: string; begin Result := MsgLabel.Caption; end; procedure TCountdownForm.ResetCount; begin FLeftSeconds := FTimeoutSeconds; UpdateCountdownLabel; end; procedure TCountdownForm.SetMsg(const Value: string); begin MsgLabel.Caption := Value; end; (※つづく)
procedure TCountdownForm.Timer1Timer(Sender: TObject); begin CountDown; if FLeftSeconds = 0 then ModalResult := FTimeoutResult; end; procedure TCountdownForm.UpdateCountdownLabel; begin CountdownLabel.Caption := format('あと%d秒', [FLeftSeconds]); end; ◆呼び出し側(例) procedure TForm1.Button1Click(Sender: TObject); var s: string; begin CountdownForm.Msg := '内容が変更されています.保存しますか?'; {CountdownForm.TimeoutSeconds := 7; CountdownForm.TimeoutResult := mrCancel;} case CountdownForm.ShowModal of mrYes: s := 'mrYesが選ばれました'; mrNo: s := 'mrNoが選ばれました'; mrCancel: s := 'mrCancelが選ばれました'; else s := '???'; end; ShowMessage(s); end; (※終わり)
public flag:word; procedure TForm1.Btn1,Click(Sender: TObject); begin flag:=randomize(15); end; 例えばボタンを10回押してflagの値が8,4,6,8,15,1,5... コレをn回目の情報と一緒に格納して出し入れしたいのですが。 1-8,2-4,3-6,4-8,5-15,6-1,7-5...みたいに。
>>941 追加と削除へのショートカットをインストール時に作れ
作り方はぐぐれば分かる
>>946 flagを配列にすればいいじゃん
あと乱数初期化してどうする
949 :
946 :2005/12/28(水) 02:45:13
訂正 randomize; flag := Random(15);
>>946 そういう、「出来事」の数を数えることを「ヒストグラムをつくる」といいます。
こんな感じ。
procedure TForm1.Button1Click(Sender: TObject);
var
histogram:array[0..15] of integer;
i: integer;
begin
randomize;
for i := 0 to 15 do histogram[i] := 0; // 初期化
for i := 1 to 100 do inc(histogram[random(16)]); // 100回の「出来事」
for i := 0 to 15 do
Memo1.Lines.Add(Format('%.2d - %.2d',[i, histogram[i]])); // 表示
end;
質問者の意図とちょっと違うような気もするが
procedure TForm1.Button1Click(Sender: TObject); begin flag := Random(15); ShowMsg(Format('%d-%d', [count,flag])); Inc(count); end; こういうことじゃないのか?
>格納して出し入れしたい
エロス
955 :
950 :2005/12/28(水) 12:55:44
CheckBox1.Checked := True って値を入れると CheckBox1のOnClickイベントが発生しちゃいますよね OnClickイベントを通らずに、CheckBox1.Checkedの値を変更したいんですけど、 何か良い方法があればご教授おねがいします
CheckBox1がForm1に貼り付けられているとして、 メンバー変数にブーリアン値を用意する。 で、それを起動時にfalseにでも初期化して、 CheckBox1のChecked値を変える直前にそのブーリアンをtrueにして、 変更したらブーリアンをfalseに戻す。 OnClickイベント内では、最初に、ブーリアンをチェックして、trueならexitする。
>956 begin CheckBox1.OnClick := nil; CheckBox1.Checked := True; CheckBox1.OnClick := CheckBox1Click;
>>957-958 ありがとうございました。うまく動きました。
958さんの方法をお借りしました。
957さんの方法のほうが分かりやすいんですけど、あまり変数は増やしたくなかったんで。
でもいろんなものに応用は利きそうですね。
脳みそにしわが1本増えました。どうもです。
963 :
デフォルトの名無しさん :2005/12/28(水) 17:48:02
イラネ
もうどうでもいいです、はい
DelWikiのところは
>>833 に差し替えかな?
>>966 はイラネ、必要なときはいつでもVSのスレに見に行きゃいいし
966に反応するな
俺はたるんだ某へのプレッシャーになるから
>>966 はあったほうがいいな。
いや、かならず入れるべきだよ。
970 :
毛の生えたフサギコ :2005/12/28(水) 20:48:32
>>960 すみません。入力ミスで、その1からず〜っと気にしていたことですが・・・。
>何が何だが(×)
>何が何だか(○)です。
訂正をおねがいします。
ところでInternet Archive から本家 DelWikiってみられない気がするんだが。
ポート番号付けたら見られるよ。
同じxreaというか無料鯖にwiki作っても旧wikiと同じ末路を辿るとしか思えないんだが。 というわけで有料鯖か自鯖でよろしく。
wikiってログイン必須に出来ないの?
>>975 何もできない猿がよく言うよ┐(;´〜`)┌
MediaWikiなら編集者の履歴が残るが…マァ折角置いてくれたんだし、どうこう言うこともなかろう 問題は、Wikiは情報を溜める場所であって議論のための議論は他所でやれ、ってのがどこまで徹底できるか、かな
すきにやればいいじゃないの。やなら見なけりゃいいんだし。
ライブドアのwikiならログイン必須
乙。BDNも追加して欲しぃ 駅で階段見上げたら女子中学生がいてさ、スカートの中見ちゃったんだよ。 そんでその女子中学生にいきなり振り向かれて 「せ、責任とってお嫁に貰ってください・・・」 って言われちゃったんだ。 俺は慌てちゃってさ 「・・え?は、はぁ・・・」 みたいに返してそのまま通り過ぎようとしたら 俺のシャツをチョコンと指で掴んでずっとついてくるのね。 そんでとうとう家までついて来ちゃってさ 「はじめてですけど覚悟は出来てます・・・」 とか言うわけよ。 俺もう理性が吹っ飛んじゃって (全てを読むにはワッフルワッフルと書き込んでください)
ワッフルワッフル
すいません、THashedStringListの使用方法について教えてください。 やりたいことは「キー」と「値」をハッシュで管理したいのですが、使用方法が分かりません。 データを追加するときはAdd('キー=値')で登録するとして、データを取り出すときはどうするのでしょうか。 IndexOfName(キー)でインデックスは取得できるようですが、値は自分で分解するのでしょうか? もっとスマートなやりかたが有りそうな気がするのですがヘルプを見ても分からないし・・・ よろしくお願いします。
LoadFromFileじゃダメだった?
今年も残り少ないのですが質問です。動的配列にExtended型のデータを入れて いるのですが、これをファイルに保存したり読み出したりする方法をご存知の 方がいましたらご教授お願いします。(Delphi7Pro,WindowsXPです)
>>983 TMemIniFile.ReadStringのソース見ると
Copy(Strings[Strings.IndexOfName(キー)], Length(キー) + 2, Maxint);
って感じで取ってるからそーゆーことなんじゃ?
つーかTHashedStringListの代わりにTMemIniFile使った方が扱いは楽かもよ
>>985 やり方は山ほどある。
俺なら、TFileStreamを使って、
配列の中身を一個ずつ
filestream.write( ex , sizeof(ex) ) ; // ex : extended ;
とかするかな。
>>983 i := hoge.IndexOfName('キー');
Value := hoge.Values[hoge.Names[i]];
989 :
988 :2005/12/29(木) 17:04:10
ごめ、IndexOfNameに気を取られすぎてた('A`) Values['キー']で充分だな
ワッフル!
991 :
983 :2005/12/29(木) 17:49:07
>>984 プログラムの中でしこしこしたかったもので。
>>986 TMemIniFileなんてあるのですか。なんでIniFilesユニットなのかと不思議でした。
>>988 ,989
あ、なるほど。この様に使うのですか。
皆さん、有難うございました。やっと使えそうです。
>>987 ありがとうございます。TFileStream で検討したいと思います。
ただ、配列の要素数が数万件あるのです。試してみるつもりですが、
他の方法もご存知でしたら教えていただけますでしょうか。
1要素のサイズが分かっていて、個数も分かってるんだから一行で TFileStream に書き込めるでしょ。
そういやそうだな
>>993 あ、そうなんですけど、性能が心配だったもので…
でも試してみたところ、1件の動的配列の読み書きはほとんど一瞬で終わりました。
ですが実は数万件の配列要素を複数(ユーザー次第)同時にI/Oする処理が追加に
なる予定ですので、(ブロッキングみたいな?)他の方法を聞いた次第なのです。
と、ここまで書いてきて、TMemoryStream に書いといてから Write する、みたい
な方法も思いついたのでちょっと試したいと思います。
>>995 数が固定されてるならファイルマッピングとか
>>995 Delphiでファイル書き込みってのはさ、基本的に4つなのよ。
1 ファイル変数を使う
2 TStreamの派生クラスを使う
3 その他のクラスを使う
4 Windows APIを使う
3の場合ってのは、今回なら例えば、一項目を一行のテキストデータにしておいて、
TStringListで書き込むとかいう場合ね。
>>996 >>997 色々と情報、ありがとうです。要素数は固定されてないのです。
ファイルのI/Oもいろいろな方法がありますですね。小出しにしてすみませんが
将来は他のバイナリデータやテキストデータもいっしょくたにひとつのファイルに
書かなくてはならないので(さっき思い出しました)、TStream を使って進めて
行きたいと思います。
次スレは?
1000 :
デフォルトの名無しさん :2005/12/29(木) 21:17:52
ワッフルワッフル!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。