1 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 20:41:37 ] Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を 勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが お礼はDelphiの布教と初心者の救済をお願いします。 <前スレ> くだすれDelphi(超初心者用)その50 pc12.2ch.net/test/read.cgi/tech/1246340765/ <過去スレ> DelWiki避難所(Delphi 関連の過去スレッド) 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
237 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 04:32:50 ] なんで監視だけじゃだめなんだよ
238 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 06:32:00 ] >>237 何の監視ですか? プロセスの監視は、常駐機能のあるエディタだと、ファイルの編集が終了した後でも、 起動したままですし、ファイルの更新状況の監視は、そのファイルが編集継続中であるのか、 すでに編集が終わっているのかの判断がつかないからです。 エディタで編集中であるのに、管理ソフト側を終了してしまうと、保存されないデータが出てくると 思われます。確実にファイルの編集が終わっている状況というのを管理ソフト側で把握できないと 確実なデータの受け渡しは難しいのではないかと思っています。 以上の点から、プロセスの監視もファイル更新の監視も、今の私の知識では無理じゃないかと思って いるのですが、何か良い案をお持ちでしょうか?
239 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 09:22:56 ] 文字列型と違い動的配列はコピーオンライトじゃないとだけは認識してたが、 SetLengthで長さ変えるとコピーされるんだ・・・ var A, B: array of Byte; begin SetLength(A, 10); B := A; SetLength(B, 5); // コピーされて、AとBは別物 end; ずっと、コピーされないと思ってたよ・・・
240 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 09:35:21 ] メモリ確保するためポインタ使う代わりに動的配列使ってたけど、 TClassA = class FArray: array of Byte; procedure TClassA.Method; begin SetLength(A, 10); end; そうすると、FArrayが他の変数によって参照されてるか否か意識しなきゃいけんのか・・ 素直にポインタ使ったほうが安全なのかな。
241 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 09:48:42 ] まぁ、型にうるさい言語だから FArray: array of Byte; とか単独で宣言すれば、まちがっても他の変数によって参照されることはコンパイルエラーが でるからありえないけど、例えば、Typesユニットで定義されているTByteDynArrayとか使って FArray: TByteDynArray; とすると危険か。まぁ、いっか。普通に使うか。
242 名前:デフォルトの名無しさん [2010/02/19(金) 11:02:46 ] すいません質問です Delphi-MLの過去ログ検索のサイトが無くなっていたんですが 引き継ぎ先などの情報をお持ちの方おられるでしょうか?
243 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 11:04:57 ] 過去ログブラウザおすすめ C#はさらにおすすめ
244 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 11:07:42 ] サービス止まってるね 面白そうだし引き継ぎ挑戦してみようかな
245 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 11:28:30 ] 「私の投稿メールを削除していただけませんか」 メールが来るから覚悟しておいた方が良いぞ > 244
246 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 11:30:02 ] ならやめたw
247 名前:242 mailto:sage [2010/02/19(金) 11:42:15 ] あの過去ログは宝の山でした・・・ あそこで使っていた過去ログって2008/05が最終なんでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 12:15:25 ] google の方に過去ログ追加しようかねぇ
249 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 12:18:10 ] 2006/11 以降は groups.google.co.jp/group/delphicbuilder-ml-archive/about にもバックアップされている。
250 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 13:17:03 ] >>239-241 ジェネリクス利用したコピーオンライト配列使えば問題なし
251 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 12:07:40 ] TQueryに新規作成した参照項目を元に整列表示させることはできないですか? SQLのOrder節には入れられないし
252 名前:デフォルトの名無しさん [2010/02/23(火) 13:53:52 ] Delphi6 ProとDelphi7 Pro、今使うならどっちがいいと思う?
253 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 13:59:20 ] 7
254 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 14:15:25 ] 7は6のマイナーチェンジな感じだからあえて6を選ぶ理由は少ないと思う。 6はXPのマニフェスト対応にも難有りだし。
255 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 22:08:08 ] 難の前に未対応じゃん XP出る前なんだから
256 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 22:31:21 ] del7使いなんだけど、最新のDelにしたら マルチコアなCPUに対応したアプリって 簡単に作れるの?
257 名前:デフォルトの名無しさん [2010/02/23(火) 22:46:01 ] >>255 難ってのはTheme Managerのことだろ それにD2010はWin7出る前なのにWin7対応を謳ってますが >>256 マルチスレッドじゃあかんの?
258 名前:デフォルトの名無しさん [2010/02/23(火) 22:48:12 ] マルチスレッドなプログラム書けば特に意識しなくても複数のコア使うようになる。 簡単かは別。排他処理とかやらないと普通に死ぬ。
259 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:37:25 ] >>257 Del6の発売はXPの存在自体が発表される前なんですけど? Win7はDel2010開発の段階でβ出てるじゃん 頭悪いね
260 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:39:02 ] >>258 明示的にAPIで指定しない限り複数のコアを使うとは限らない 嘘書くのはやめよう
261 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:46:31 ] >>260 >>258 は別に嘘では無い。
262 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 03:11:00 ] 本当でもないだけ。
263 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 03:28:30 ] OpenJaneのソース、HogeTextView#1839行より Move(#13#10[1], result[Position], 2); とあるのですが、この1つめの引数にある『#13#10[1]』とはどういう意味なのでしょうか? ついでに、同じ意味になる別の表記方法もあるのであれば、教えて頂けると助かります。
264 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 04:13:54 ] VBでいうところの vbCR, vbLF 、 まぁ改行コードのことやね
265 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 09:26:24 ] 明示的にAPIで指定するとどのコアでスレッドを動かすかなどを細かくコントロールできる。 明示指定してない場合でも、複数のコアをプロセスに割り当てる。 いくつ割り当てるかは、OS の種類によって細かく違いがある。 ただし一般的なコンシューマ版(Vista とか Windows7) ではデフォルトですべてのコアが 利用可能となる。 そんだけだ
266 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 11:27:56 ] private function GetHoge(const Index: Integer; Idx: Integer): String; procedure SetHoge(const Index: Integer; Idx: Integer; const Value: String); public property hogeA[Idx: Integer]: String index 0 read GetHoge write SetHoge; property hogeB[Idx: Integer]: String index 1 read GetHoge write SetHoge; こんなPropertyが使いたいのですが read GetHoge で"互換性の無い型です"って怒られます。 hogeA,hogeB毎に read write の関数作らないと駄目なんですかね。 ちなみにfunction GetHogeとprocedreu SetHogeはCtrl+Shift+Cで自動生成したものです。
267 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 11:34:30 ] 266です。自己解決しました。 自動生成された function GetHoge(const Index: Integer; Idx: Integer): String; procedure SetHoge(const Index: Integer; Idx: Integer; const Value: String); を下記に書き換えたら通りました。 function GetHoge(Idx: Integer; const Index: Integer): String; procedure SetHoge(Idx: Integer; const Index: Integer; const Value: String); 自動生成だと、配列の添え字とインデックス値が逆になって、値の渡し方の問題でエラーになるみたいです。
268 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 14:12:06 ] 配列プロパティにはデフォルト値与えられない?? property Items[Index: Integer = 0]: Integer read Get....
269 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 14:30:48 ] そんなことをするような設計が悪い
270 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 15:14:41 ] 配列コピーの高速化って無理だよね インラインアセンブラでMMX命令で32bitコピーとかやってもちっとも速くならねぇ
271 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 15:21:32 ] fastcode projectにmoveがあったような
272 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 20:37:10 ] >>264 理解できました。 thx!
273 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 07:22:20 ] >>260 あほか
274 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 08:46:15 ] あほです このすれにまじめなこと書くはずないだろ
275 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 12:49:24 ] >>262 本当だし
276 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 14:36:43 ] はいはい知らなかったなら素直に言おうね
277 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 14:57:45 ] Windowsのスレッド配分アルゴリズムは同一プロセス内のスレッドは物理的に同じプロセッサに優先的に割り当てるようになってる。 これはダイ間の通信がコア間の通信に比べて顕著に遅延が発生する等、別個に割り当てると問題が生じるからで、 割当先候補が減っている分、その時の処理状態によっては同一コアに複数スレッドが割り当てられるという事態は普通に発生する。 つまり「明示的にAPIで指定しない限り複数のコアを使うとは限らない」は真。 Delphiには並列ライブラリがないからこういった情報の浸透が遅れているんだろうね。
278 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 15:45:17 ] それ、完全にお前の誤解。 スレッド A が Core 1 に割り当てられたときに、 タスク切り替えやスレッド休止後の再起床時に 同じ Core を「優先」して使う。 および同じプロセスに所属するスレッドは、できるだけ「有利」なコアを使う。 というだけ。 この場合の「有利」は、キャッシュを共有しているコアとかが選ばれる。 スレッドが二つ、A と B があったときに、 A と B が「かならず」物理的にひとつのコアしか使わない。のだとしたら マルチスレッドの利点なんか残らないだろう? それくらい実験すればすぐわかるのに...
279 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 16:01:25 ] Win32APIスレ池
280 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:49:09 ] こんなクズども寄越さないでください
281 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:52:40 ] >>278 必ずなんて一言も書いてないんだけど OSに任せると必ず分散するとは限らないってだけ お前はまず日本語を勉強してこい
282 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 18:03:22 ] その辺はMSDNにも 「スレッドの割り当ては考えてやってるから、分散してなくてもSetProcessAffinityMask使うのはあんまりおすすめしないよ」 みたいに書いてある XPにはあまり賢くないアルゴリズムが載ってたからある程度自分でやった方が良かったけど
283 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 18:04:04 ] SetThreadAffinityMaskだった
284 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 18:06:27 ] ノ´⌒ヽ,, γ⌒´ ヽ, // ""⌒⌒\ ) i /::::::::: ノ \ ヽ ) !:::::::::::(・ )` ´( ・) i/ |:::::::::::::::(__人_) | \:::::::::::::`ー' / チッ うっせーな… /:::::::::::::::::::::::::::\
285 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 18:07:18 ] 使うとしたらこっちだな。SetThreadIdealProcessor
286 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 18:21:52 ] みなさん。 実験すればわかることなので、煽りは無視して自分で検証してみましょう。 一般向けの CPU では、物理的に存在する CPU コアのすべてが プロセス内のスレッドに割り振られます。 個別にコントロールする API は別途ありますが、通常は OS に任せておいて 問題ありません。
287 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 19:58:17 ] >>286 何となく興味あったから実験してみたけど、 中でsleepするスレッド4つ作って動かしたら全部一緒になったよ 環境はXP SP3 Core2 Quad なんで?
288 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 19:59:32 ] ノ´⌒ヽ,, γ⌒´ ヽ, // ""⌒⌒\ ) i /::::::::: ノ \ ヽ ) !:::::::::::(・ )` ´( ・) i/ |:::::::::::::::(__人_) | \:::::::::::::`ー' / チッ うっせーな… /:::::::::::::::::::::::::::\
289 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:05:57 ] >>287 sleepしてるスレッドがどのコアで動いてるか分かるの?
290 名前:デフォルトの名無しさん [2010/02/25(木) 20:34:33 ] タロット占いをするソフトを作りたいと思います。(実際に当たるかどうかは別にして) TEditにタロットのカード名(魔術師とか、女教皇とか、愚者とか) を表示させようと思うのですが、 Edit1〜Edit6に表示させる際 それぞれが重複しない値にさせるに はどうすればいいでしょうか。 単純にrandom(22)を使うと 重複してしまう場合があります。
291 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:44:26 ] リアルでのやり方と同じ。 カード全部を配列に突っ込んでシャッフルして頭から6枚取得する。 配列 シャッフルで検索かければそのコードが見つかるからDelphiに書き直せばいい。
292 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:07:56 ] WinXp+D7で質問です。 trunc関数で誤差が出るようなのですが何がいけないのでしょうか。 フォームにEdit1,2,3とButton1を配置し以下の計算をしますとEdit3だけが769になります。 Trunc内で計算せずにEdit1のようにすれば大丈夫なのでしょうか。 procedure TForm1.Button1Click(Sender: TObject); var Su : double; Kin : double; kei : double; begin Su := 1.4; Kin := 550; kei := Su * Kin; Edit1.Text := Floattostr(trunc(kei)); Edit2.Text := Floattostr(trunc(1.4*550)); Edit3.Text := Floattostr(trunc(Su * Kin)); end;
293 名前:290 mailto:sage [2010/02/25(木) 21:12:22 ] >>291 アドバイスありがとうございます。 検索したらFisher-Yatesという方法も見つかりました。 これでやってみます。
294 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:31:36 ] >>292 参考になるかどうかわからないけど、過去ログからコピペ。 857 :826 :2008/03/02(日) 20:57:07 SimpleRoundToの個人的まとめ。 正解かどうかわからないので、必要な人は追試してください。 ・SimpleRoundToは意図した結果が得られない場合(ADigit<0 ?)がある。 ・Truncは引数に変数を使った式を与えると意図した結果が得られない場合がある。 ○a := 10; Trunc(0.25 * a + 0.5) / a; ○Trunc(0.25 / 0.1 + 0.5) * 0.1; ×a := 0.1; Trunc(0.25 / a + 0.5) * a; //SimpleRoundToの中がこれ ・引数に指定する計算式の結果を一度変数に代入してから、Truncに与えれば大丈夫そう。 ○a := 0.1; b := 0.25 / a + 0.5; Trunc(b) * a; ・Floorも内部でTruncを使ってるので同様。 ・Ceilは内部でTruncを使っているものの大丈夫そう??
295 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 23:01:02 ] >>289 APIも知らないの?
296 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 23:01:54 ] >292 おもしろいね。時間があったら追試してみたいけど、気になったポイントを。 Edit1は計算結果が一旦Double型に代入されてそれがTruncに渡されている。 Edit2は予めコンパイラが計算した浮動小数点数の定数値をTruncに渡している。 Edit3は式の値がおそらくExtendedで一時的に保持されてそれがそのままTruncに渡されている。 CPUウィンドウでコンパイル結果がどのようなアセンブル命令に展開されているのかを見ると違いが わかるのかも。
297 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 23:02:22 ] ノ´⌒ヽ,, γ⌒´ ヽ, // ""⌒⌒\ ) i /::::::::: ノ \ ヽ ) !:::::::::::(・ )` ´( ・) i/ |:::::::::::::::(__人_) | \:::::::::::::`ー' / チッ うっせーな… /:::::::::::::::::::::::::::\
298 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 23:29:53 ] >>295 どれ使うか分からんので教えて。
299 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 00:08:58 ] >>290 procedure TForm1.Button1Click(Sender: TObject); const CARD : array [0..5] of string = ('THE FOOL','THE MAGICIAN','THE HIGH PRIESTESS', 'THE EMPEROR','THE LOVERS','The HIEROPHANT'); function tekitou(a,b:integer):TPoint; begin result.X := b; result.Y := a; end; var CardNum: array [0..5] of Integer; i,r1,r2 : integer; p : TPoint; begin Memo1.Clear; for i := 0 to 5 do CardNum[i] := i; for i := 0 to 999 do begin r1 := random(6); r2 := random(6); p := tekitou(CardNum[r1],CardNum[r2]); CardNum[r1] := p.X; CardNum[r2] := p.Y; end; for i := 0 to 5 do Memo1.Lines.Add(CARD[CardNum[i]]); end; 駄目な例
300 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 00:44:44 ] >>298 msdn.microsoft.com/
301 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 06:39:48 ] OSに任せておけばいいだけやん。あほか。
302 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 07:10:59 ] >>287 GetCurrentProcessorNumberやCPUIDで調べる方法は知ってるけど、 Sleepしてる最中に調べるのは無理だろって話さ。 ThrreadIDと違って、コアは実行途中でも入れ替わるんだし、 SleepしてたらCPUはつかんでないだろ。
303 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 07:43:33 ] sleep したスレッドが1000個あったとして、それに意味があるの? それこそ「特殊な」プログラムだと思うのだが。
304 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 12:54:02 ] >>302-303 だからいい加減出て行けよ バカに噛みつくのもバカ 必死にしか見えない
305 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 12:54:45 ] はいはい本人乙
306 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 12:56:05 ] 馬鹿というのは鳩山のAAを張ってる奴だな いい迷惑だ
307 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 12:57:17 ] 即レスとかどんだけ張り付いてるんだよw そんなに悔しかったのか
308 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 12:59:29 ] >>302 そんなことしなくても外部からいくらでも観測する方法あるだろ… 必死になるあまり視野が狭くなってないか?落ち着けよ
309 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:02:13 ] 本日も質問者不在のままおっさん鬱病患者達が頑張っていますね
310 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:06:52 ] 必死必死うるせえんだよ 必死って言う方が必死なんだよばーーーーーーーーーーーーかwwwwwwwwwwwwwwwww もうこんな気持ち悪いところ来ないから一人で勝手に喋ってろwwwwwwwwwwきめえwwwwww
311 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:08:47 ] これで静かになるな ありがたやありがたや
312 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:16:25 ] TBase = class public class const Value: Integer; abstract; end; TBaseClass = class of TBase; TExtend1 = class(TBase) public class const Value: Integer = 1; end; TExtend2 = class(TBase) public class const Value: Integer = 2; end; var cls: TBaseClass; cls := TExtend1; a := cls.Value; //1が入って欲しい もちろんこんなコードは書けないんですけど、 上記のようなクラス定数(もしくはクラス変数)の継承みたいなことって何かで代用できますかね
313 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:38:23 ] 代替にはならないと思うがReadプロパティで対応するのが一般的だと思う。
314 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 18:44:42 ] 引数なしの関数は変数にも見えるから function Value : Integer; virtual; を使う手もある
315 名前:312 mailto:sage [2010/02/26(金) 19:01:32 ] >>313-314 ありがとうございます そうなんですよね、実装部に書くことを許容すればできるんですけど、 宣言部だけで継承先の振る舞いを変えられたらと思ったんですが、やはり仕様上難しそうですね…
316 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:52:20 ] Delphi、VisualStudioに付いてくるやつ以外で TAnimateで使えるようなAVIファイルを集めた 市販の素材集はないでしょうか?
317 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:56:51 ] TStringListの内容をINIファイルの一行データとして安全に書き込んだり読み込んだりするための変換処理ってどう書けばいいですか?
318 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:29:37 ] 具体的にどういう変換をしたいのかが見えない
319 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:37:10 ] ini[0] = TStringList.Parse(sl[0]); sl[0] = TIniFile.Parse(ini[0]);
320 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:41:10 ] >>317 例えば、iniファイルに key=aaa;bbb;ccc と書かれていた場合に、 その値を aaa bbb ccc と、変換して取得したい。 または、逆変換してiniファイルに書き込みたい。ってこと? 単純にTStrings#DelimitedTextプロパティを通せば、自動的に変換してくれる。 ただし落とし穴があって、スペースもデリミタとして扱ってしまう。(Del 7の場合。以降のDelphiは使用したことないのでシラネ) 厳密に指定したデリミタのみで分割したい場合、JCL(ttp://jcl.delphi-jedi.org/)に含まれる、JclStrings#StringsToStrやJclStrings#StrToStringsを使用してます。 iniファイルへの読み書きはTIniFile使えばいいじゃね?。安全にが何を指してるか知らないけど。
321 名前:デフォルトの名無しさん [2010/02/26(金) 23:42:39 ] mailto:sage てs
322 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:47:32 ] 正直な話、オレだったらTStringlistの内容をinifileに保存なんてしない。 何を目指してるのかは分からないけど。
323 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 03:53:55 ] >>320 個々にAnsiQuotedStr(読み込み時は逆にAnsiDequotedStr)を適用すれば外部ライブラリはいらない
324 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 09:18:11 ] マルチコアの話に便乗なんですが、要は1つのスレッドを OSが適当に割り振るからあんまり考えなくて良いよって解釈しました。 言い方変えると1スレッドを複数のコアで処理はしないってこと? マルチコア対応とか書いてあるアプリって、重い処理でも1スレッドに書いたほうが プログラムが簡単なのにマルチスレッドに出来るだけ分けてるって事?
325 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 09:44:07 ] >>323 TStringListの個々の要素であるStringは#0-#20(当然#13#10も)なんかも格納できるバイナリコンテナだからもうひとひねり必要だな。 標準でやるには例えばURL Encode/Decodeとかできっちり処理しないと破綻する。
326 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 10:26:53 ] だがほとんどの処理で #0 以降の文字は欠落するから もう忘れてもいいんじゃないかな?
327 名前:292 mailto:sage [2010/02/27(土) 14:37:50 ] どの程度誤差が発生するのかちょっと調べてみました。 memo1,2,3を配置して誤差が出たとき追加していきます。 procedure TForm1.Button3Click(Sender: TObject); var Su : double ; Kin ,sux : integer; kei ,ans : double; a1,a2,a3 : double; t :string; const sucon = 0.00000001; begin memo1.Clear; memo2.Clear; memo3.Clear; for Sux := 1 to 1000 do begin su := sux / 10; for Kin := 1 to 1000 do begin kei := Su * Kin ; a1 := trunc(kei); a2 := trunc( Kin * su); a3 := trunc( Kin * su+ sucon); ans := trunc((sux * kin / 10)) ;
328 名前:292 mailto:sage [2010/02/27(土) 14:40:31 ] if a1<>ans then begin t := Floattostr(kin) + ' , ' + Floattostr(su) + ' , ' + Floattostr(ans) + ' , ' + Floattostr(a1) + ' , ' + Floattostr(a2) + ' , ' + Floattostr(a3); memo1.Lines.Add(t); end; if a2<>ans then begin t := Floattostr(kin) + ' , ' + Floattostr(su) + ' , ' + Floattostr(ans) + ' , ' + Floattostr(a1) + ' , ' + Floattostr(a2) + ' , ' + Floattostr(a3); memo2.Lines.Add(t); end; if (a3<>ans) then begin t := Floattostr(kin) + ' , ' + Floattostr(su) + ' , ' + Floattostr(ans) + ' , ' + Floattostr(a1) + ' , ' + Floattostr(a2) + ' , ' + Floattostr(a3); memo3.Lines.Add(t); end; end; end; memo1.Lines.SaveToFile('c:\memo1.csv'); memo2.Lines.SaveToFile('c:\memo2.csv'); memo3.Lines.SaveToFile('c:\memo3.csv'); end; どうやら単に計算してからtruncしただけでは発生頻度が減るだけで完全な対策にはならなそうです。 小さい数を足してやって切り捨てるのが良いようです。
329 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 14:58:05 ] 問題の所在を理解していないような希ガス…
330 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 07:34:09 ] やべー、俺も>>292 の原因知りてぇ。 >>296 さんのExtendedになぜなるのかが知りてぇ。 こういう場合、Edit1の方法で計算しないと間違った答えが出ることもあるってことだよね。
331 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 07:47:13 ] homepage1.nifty.com/MADIA/delphi/delphi_bbs/200310/200310_03100025.html ↑ここに同じようなやりとりがあった。
332 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 07:52:04 ] つーことで、実数型使うときはdoubleを使わないでextendedを使えってこと?
333 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 08:02:36 ] おー、すまん。一人でとっちらかっていた。 homepage1.nifty.com/MADIA/delphi/delphi_bbs/200607/200607_06070011.html ここ読んでわかったけど、 Trunc(X: Extended): Int64; で型変換してる。 Trunc使うときは、Extended型で使わないと誤差がでるってこと。 もしくは小数点移動させて、整数にしてから処理すればいいね。
334 名前:330-333 mailto:sage [2010/02/28(日) 08:20:53 ] 浮動小数って、意味がわかりました。そういうものなんですね。 使ったことなかったものですから、、、今回よくわかりました。 332も違うつーことで。
335 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:43:16 ] それは不動少数
336 名前:デフォルトの名無しさん [2010/02/28(日) 20:36:04 ] すみません教えて下さい。 Form1 に直接 Image1 を置いていたのですが後から Panel1 を追加して Image1 の親コントロールを Panel1 に変更したいのですが、IDE でやる方法はありませんか?
337 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 20:53:34 ] floatとdoubleで結果が異なる例は見たことあったけど doubleとextendedで差が出る実例は初めて見た。 64bit厨はどうするのだろうか。