[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 02/07 11:17 / Filesize : 190 KB / Number-of Response : 625
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Delphi初心者のための寺子屋



1 名前:デフォルトの名無しさん mailto:sage [2005/11/23(水) 23:31:08 ]
Delphi初心者が問題をコツコツと解きながらレベルアップするためのスレです。


445 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:14:45 ]
D7En Pen3(966) MEM384MB
コード補完滅茶苦茶遅い。
数年前は大丈夫だったから多分原因はHDDだろうと勝手に思ってる。

446 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 03:44:18 ]
>>445
そのくらいのスペックで、Del6Pro つかってだけど、問題なかったぞ?

BDSの世代になって、死ぬほど重くて、マシン買い換えたが

447 名前:デフォルトの名無しさん [2007/12/31(月) 07:28:11 ]
職場のD7ENTでこちょこちょ書いてますがひたすらコピペしまくりでクラスも作った事がありません。
どこかのサイトにオプジェクト志向学ぶならC#やJavaで書かれた出来の良いコードをDelphiに移植するのが面倒だけど理解が早くなる、と言う意味の事が書かれてました。
とは言え、自分にオプジェクト志向の良いコードなのかどうか判別が出来るくらいならわざわざ移植には及ばない訳でして、適当なサンプル選びで途方に暮れています。
簡単なもの、ちょい重たいかなレベルで適当そうなコードを紹介して頂けませんか?


448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 07:30:10 ]
スミマセン
ageてしまいました。

449 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:10:07 ]
どこまでもコピペするつもりですか。

*頭をたたくと「いてぇ」、わきの下をくすぐると「わははは」と笑うクラスをつくて

まじめな課題です。


450 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:59:29 ]
自分用のコンポーネントを自作するのが近道だよ。

451 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:06:15 ]
>>447
何度も同じコード書いてるならそこを共通化するクラスなりライブラリなりを作ってみたら。
重複部分で呼び出しているAPIなり関数なりをJediVCLでGrepかけてどうラップしてあるかを見てみればいいと思う。
あのライブラリ郡の設計が美しいかどうかは微妙なところだけど。

一番手っ取り早いのはC#をやること。
C#、Delphi両面の利点と欠点が見えてくると思う。
もちろんよりリッチなクラスライブラリの使い方も習得できるしね。

452 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:50:50 ]
JCLのコンテナ使いにくすぎる。おすすめせん。

俺も、C#のライブラリを参考にするのがお勧め。
標準のでいい。
インターフェスだけならMSDNで見たい放題、クラス設計の参考になる。

中のぞきたかったら、Reflectorででも、使えばソース見られる。
Reflectorなら、Delphiでも見られるしなw


あとは、OOPなら、動的型言語のRubyもお勧め。
ほとんどが、オブジェクトなので、それを前提として、
どういった便利な使い方ができるか?というのがよくわかる。
ただ、ガーベジコレクション前提でオブジェクトを使い捨てまくるので、
そのままは使えないのだが、
勉強にはなる。

453 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 23:14:08 ]
2005を今更再インスコしようとして、鬱になる。

#さぽきれかあ



454 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:25:42 ]
あー、今頃出来やがんのorz

455 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:05:07 ]
ASMならジャンプテーブルを用意すれば簡単化と思いますがDelphiなら
以下の条件ならどんなコーディングをすればいいのでしょうか?
type
TSomeInts = 0..9;
IntSet1, IntSet2 = set of TSomeInts
の条件下で
if (0 in IntSet1) and (0 in IntSet2) then ...
if (0 in IntSet1) and (1 in IntSet2) then ...
...
if (9 in IntSet1) and (9 in IntSet2) then ...
のように、IntSet1且つIntSet2の組み合わせでcase文を使用したい場合です


456 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:08:54 ]
すみません
問題を単純化するのにミスしました
type
Int1, Int2 = 0..9;
の条件下で
if (Int1 = 0) and (Int2 = 0) then ...
if (Int1 = 0) and (Int2 = 1) then ...
...
if (Int1 = 9) and (Int2 = 9) then ...
でお願いします

457 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:15:33 ]
case を2重にして全部を列挙するか
0〜9と決まってるんなら単純に

case Int1*10+Int2 of
00:
01
...
とやったら?

458 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:29:47 ]
>>457
ども
実際ご指摘のとおり
type
Suit = (Club, Diamond, Heart, Spade);
var
card1, card2: Suit;
cardbits: BYTE
とあれば
cardbits := ($01 shl Integer(card1) + ($10 shl Integer(card2));
case cardbits of
$00, $01, $02: ...
$10, $11, $03: ...
end
みたいなことで実現しているのですが、実際は条件がもっと複雑で
単純にcase文でネストする場合三重になります
この場合可視性が悪いですし
Suit = (Null, Club, Diamond, Heart, Spade, Joker);
みたいに列挙型を変更する場合も困難を極めます

459 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 17:04:39 ]
var jumptable: array[0..9, 0..9, club..spade] of tjumpproc;
なジャンプテーブル用意したら。

460 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 17:16:45 ]
>>459
どもw
ジャンプテーブルが使えたんですね・・・

何やってんだ俺orz

461 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:54:22 ]
×可視性
○可読性

462 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 14:54:47 ]
Delphi6のFileSeekは多重定義されてますが
function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64; overload;

OffsetにInt64をあたえても上が呼ばれてるみたいなんですが
どうなんでしょう

463 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:45:19 ]
気のせいです



464 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:18:42 ]
Threadを使用してバックグラウンドで処理を行い、進行状況をForm1で表示する処理を行っています

Form1のLabelに表示するたびにSynchronize関数を呼び出すとそのオーバーヘッド
が凄まじく処理時間が数倍に跳ね上がってしまいます
VCLを使用する場合にはSync関数を使用して呼び出すべきとの話ですが
全てが全てSyncを使用しなければならないのでしょうか?
例えばInvalidate関数等はどのタイミングで呼び出すべきなのでしょうか

465 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:31:43 ]
スレッドセーフで無いコードはSynchronizeを使いVCLにスレッドセーフであることを保証してもらう必要がある。
初めからスレッドセーフなコードならばわざわざそんな事はしなくても良い。

466 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:33:02 ]
いろいろやり方はあるけどLabelの更新頻度を下げるのが手っ取り早い。
データがどれだけ変更されようが画面の更新は1秒に一回未満にするならこんな感じ

lastupdateview := GetTickCount;
while true do
begin
 処理
 if GetTickCount - lastupdateview > 1000 then
 begin
  lastupdateview := GetTickCount;
  Synchronize;
 end;
end;

467 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:05:17 ]
>>466
ども。
Invalidateの呼び出しはそれでやってます。

その方法では、例えば処理中のファイル名を表示しようとした場合
重い処理を行っている時は表示されているファイル名と処理している
ファイルが異なるような場面が発生しませんか?
かと言って”処理が長くなるようだったら強制的に表示する”って方法
を実現しようとするとタイマーを使用するなり手間がかかる気がするのですが・・・

468 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:30:48 ]
ファイルを処理する最初にlabel更新をしようとしたが、
全部のファイルを処理すると処理に時間がかかったということですよね?


> 重い処理を行っている時は表示されているファイル名と処理している
> ファイルが異なるような場面が発生しませんか?

それは仕方がないかと。
>>466では、1秒になってるけど、100m秒くらいにすればわからなくないかな?


ところで、VCLのスレッドセーフ周りはよく知らないのだが、
Labelの書き換え(Caption?Text?)は、メインスレッドから弄ってない場合でも、
他のスレッドどから書き替えたらダメなのものかね。

469 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:48:28 ]
>>468
ども。

>>466の例で言うならば、”処理”が重たい場合はLabelが書き換えられませんし
”処理”の前にLabelを書き換えようとした場合はLabelの書き換えがスキップ
された直後に重い処理が着ちゃうと対応できません

メインフォームにメッセージを投げて知らん振りしたほうが健全かな?とは
思いますが、Delphiっぽくなくなっちゃうんですよね

470 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 00:37:08 ]
>>469
処理するスレッドが重くてメインスレッドに反映されにくい場合なら、
スレッドの優先度変えればいけないかな・・・(未確認だが)

> メインフォームにメッセージを投げて知らん振りしたほうが健全かな?とは

いや、それもありかと思います。Delphiスレでもよく聞く話です。
VCL Formだとメッセージとりやすいですしね。

ただ、スレッドが重くてうんぬんの場合、この方法でも一緒かな?という気が

471 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 07:37:18 ]
Invalidate なら、ラベルの親ハンドルと、Rectをメインスレッドから用意しておいて
IntersectRectをスレッド側で発行すればいいでしょ。

472 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 07:39:04 ]
×IntersectRect
○InvalidateRect

473 名前:デフォルトの名無しさん mailto:age [2008/02/02(土) 22:21:03 ]
にゃあ



474 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 04:23:31 ]
if i < 0 then i := 0;
といったコードがあるとします
i := Max(0, i);
と書いたほうがスマートな気がしますし
i := Max(0, Min(i, count-1));
と書くと簡単に範囲を限定できます

しかし、冗長に思えるif分の繰り返しのほうがいいコードが生成されます
この場合どちらを使用すべきなんでしょうか・・・

475 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 05:20:29 ]
> しかし、冗長に思えるif分の繰り返しのほうがいいコードが生成されます

マシンスペックが高い今、そんなことはいまどき考える必要はない
わかりやすい方にしる

476 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:29:24 ]
Abs()なら組み込み関数で、マクロ的に展開されるんだけど
Maxはmathユニットの実関数だから仕方ない。

どうしてもというならアセンブラ使え

procedure TForm1.Button2Click(Sender: TObject);
 function LimitZero(d:Integer):Integer;
 asm
  CDQ ;//eaxが負数ならedx=-1
  not edx;
  and eax,edx ;//
 end;
var i:Integer;
begin
  AllocConsole;
  for i:=-10 to 10 do begin
   WriteLn( LimitZero(i));
  end;
end;


477 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:13:05 ]
くだらん。
どうしても転化したければ、inline使え

478 名前:デフォルトの名無しさん [2008/02/24(日) 05:53:01 ]
TImage に 上から半透明のセロファンがかかってるような
フィルタをかけたかったらどうすりゃいいですかね?

俺が思いつくのは同じ大きさのBitmapを用意して
それを一色で塗りつぶした上で半透明化とかなんですけど
これってすんげえ無駄にメモリ食いますよね?

もっといい方法ってあります?

479 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:02:23 ]
>>478
DIBにして、ScanLineでBITMAPのデータを直でいじくる

480 名前:デフォルトの名無しさん [2008/02/24(日) 06:18:28 ]
>>479
うわ、検索してみたけど難しそうだこれは
1時間ほど挑戦してムリポだったら>>478の方法使うことにします

481 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:37:09 ]
そんなに難しく考えるなよ

srcが元の色
colorがセロファンの色
destが書きこむ色
αが半透明のアルファの度合いだとしたら、

dest = color * α + src * (1 - α)
これをrgb各それぞれで計算してやるだけだぞ

こういうのは「αブレンド 計算式」ででてくればすぐにでてくるよ

482 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 14:47:50 ]
符号無し64bit、いわゆるulonglongを使用したいのですが何か良い方法
は無いのでしょうか?



483 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 16:55:55 ]
符号無し64bitで何がやりたいの? 加減算の結果は同じだよ
掛け算の場合も
(Amsb + A63)*(Bmsb + B63) = Amsb*Bmsb + Amsb*B63 + Bmsb*A63 + A63*B63

で、Amsb が符号付きだろうが符号無しだろうが、下位64bitの結果には影響しない。



484 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:52:05 ]
>>483
ulonglongを使用している構造体があったんでどう実装しようかと・・・
現状では下位32bitしか使用していないのでDWORDでも問題無いとは
思うのですが、手を抜いて将来トラブルと嫌だなぁ・・・と思った次第です


485 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 19:37:38 ]
単にInt64にしたらいいんじゃないの? 除算や右シフトをやらない限り問題ない

486 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:47:31 ]
ゴメン 算術右シフトってのがソモソモ無かった。
だから  SHR 演算は 符号無し右シフトと等価だった

487 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:01:28 ]
UInt64使えばいいだろ。

488 名前:デフォルトの名無しさん [2008/02/27(水) 20:44:10 ]
>>481
ありがとうございます
何をすればアルファブレンドできるかは理解できたんだけども

見つかったページがそれをシフト演算で行ってて
それの意味がわかんなくて困ってます

ページを貼らせてもらうと
www.sm.rim.or.jp/~shishido/delmono.html
> r:=cl and $ff; // RGB成分に分解
> g:=cl and $ff00 shr 8;
> b:=cl and $ff0000 shr 16;
必要な色成分以外を $ff なんちゃらでマスクして消しちゃってるんでしょうが
$の記号が何をするのかわからないのがひとつめ

> cl:=Round(r*0.3+g*0.59+b*0.11); // 明るさを計算
cl って RGB値じゃなかったでしたっけ? なんで明るさだけを入力できるかさっぱりなのが2つめ

> pp^:=cl+cl shl 8+cl shl 16; // (j,i)に明るさを書き戻す
さっきRGB値を明るさに変えたのになんでこんな処理ができるのか意味不明なのが3つめ

とわからないことだらけです。助けて

489 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:55:42 ]
>488
$は16進数のプレフィクス。C/C++の0xに相当。
明るさは人間の目のRGBに対する感度の違いを考慮して計算している。昔の白黒テレビで
カラー画像を見ているのと同じ。
その明るさを持つグレーの値を計算している。

490 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 04:03:23 ]
>>488
下の二つは輝度を計算するときの公式みたいなものでアルファブレンドとは全然関係ないよ

491 名前:478 mailto:sage [2008/03/01(土) 05:18:35 ]
ヤターできたよー!
もっともほんとにやりたい事は
フィルタの範囲指定したり戻したりなんで
これからもうひと頑張りいるけど、あとはなんとかなるでしょ。

ところでRGB値ってbgrの順で保存されてるんだね。変なの
>>489-490
dです

492 名前:749 mailto:sage [2008/03/01(土) 20:27:17 ]
>>491
BGRの順番で格納されているのはTColor

実際には速度の面からPixelでは無くScanLineでBMPに直接アクセスする
ことになるが、その場合の格納方法はまた違う

493 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:25:24 ]
バイト単位でアクセスしたら32bit色の場合、bgrだわな



494 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:12:38 ]
>>493
32bit DWORDだとrgbだな

>>478はメモリの格納順では無くて上位ビット->下位ビットで話してるからな

495 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 03:36:32 ]
>>494
何をわけの分からないこと言ってるんだ
同じことだろ

496 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:23:57 ]
サーセンw

497 名前:デフォルトの名無しさん [2008/03/04(火) 15:49:44 ]
こんにちは。
WriteProcessMemoryのAPIを使って値を書き込んだのですが、
おもう値が書き込まれません。以下がコードです。

GetMem(buf, 1);
buf^ := Chr($3D);
WriteProcessMemory(WindowHandle, ptr(Address), buf, NumberOfBytes, Write);

これを行うと、値が35901というのが書き込まれてしまいます。61という値を書き込みたいのですが、どのようにすればよろしいのでしょうか?


498 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:18:08 ]
>>497
35901 = $8C3D

正常に動いてるじゃないか

499 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:40:25 ]
>>498

いえ、普通に$3D(61)という値を書き込みたかったんですが、その場合はどうすればよろしいでしょうか?


500 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:35:44 ]
>>499
そりゃ1Byteしか書き込んでいないから。

501 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 18:29:49 ]
>>500
NumberOfBytes

を2という値に設定はしたのですが、これでは設定不足でしょうか?


502 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:08:37 ]
何で1バイトしか書き込んでいないのに読み込むときは2バイトになってるんだよ

503 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:04:31 ]
>>502
すいません、私のレベルが低くていまいちよくわかりません・・・。

WriteProcessMemory(WindowHandle, ptr(Address), buf, Sizeof(buf), Write);

上のようにすればいいという事でしょうか?
読み込む時というのがわかりません・・・。




504 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:47:00 ]
>>503
>値が35901というのが書き込まれてしまいます。
これが確認できたってことはその書き込んだアドレスから読み込んだんだろ?
その時35901だったってことは、少なくとも2bytes読み込んでいるということ。

505 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:55:22 ]
>>504
いえ書き込んだアドレスから読んだんではなくて、
表示されている値が変化したので確認できたという事です。

えとつまりは61という値にはできないという事でしょうか?

506 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 22:55:41 ]
>表示されている値が変化したので確認できたという事です。

意味不明なんだよ、質問が。なにをどうしたらなんの表示が変化したの?

WriteProcessMemory() の第一引数が WindowHandle って時点でどうかしてる。

507 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:48:37 ]
>>505
理解できてないから予期しない結果になるんだよ。
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdebug/html/_win32_writeprocessmemory.asp

508 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 07:13:00 ]
>>506
>>507

すいません、書き忘れていました。

OpenProcessでもってきたハンドルを第一引数に入れています。
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

質問をまとめると、
var
buf: PChar;
WindowHandle: Integer;
Write: Cardinal;

WindowHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
GetMem(buf, 1);
buf^ := Chr($3D);
WriteProcessMemory(WindowHandle, ptr(Address), buf, Sizeof(buf), Write);

で対象のプロセスの31という値を61に書き換えようとしたところ、35901という値に誤って(?)表示されてしまった。
というわけです。わかりにくくてすいません・・・。
たぶんbufの値に問題があると思いますが・・・。


509 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 08:04:08 ]
ヒント:bufのサイズをコンパイラが知れるわけがない

510 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 08:06:03 ]
初心者向けだからもう少しいえば
動的に確保されたバッファーのサイズをコンパイラが知ってるはずない

511 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 08:58:03 ]
>>509
>>510

bufのサイズを指定すればよろしいのでしょうか?
Sizeof(buf)
で行っている作業でサイズは取得できてると思うのですが、これとはまた別の話でしょうか?


512 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:29:57 ]
var buf:PChar つまりポインタなのだから、
Sizeof(buf)  は、ポインタのサイズを取得してるので、作業領域のサイズを得ているわけじゃない

513 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:39:40 ]
1、WindowHandleは適切な名前ではない。 hProces 等にする事
2、Writeも適切な名前でない。WriteSize とか cbWriteとか
3、Sizeof(buf)はポインタサイズで現在は4を返してる筈。

よって、
var
buf: string;
hProces : THandle;
WriteSize:DWORD;

WindowHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
SetLength(buf,1);
buf[1] := Chr($3D);
WriteProcessMemory(WindowHandle, ptr(Address), PChar(buf), length(buf), Write);

ただし、35901が表示されたという事は、ホントは書きたい値は1バイトではなく2バイトか4バイト
の可能性が大。



514 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:00:22 ]
>>495
TColorと32bitRGBじゃRGBの順序が逆だよ?
そのまんまキャストは不可

ごっちゃにしてない?

515 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:36:40 ]
?
メモリ上の並びとしては R,G,B で、それを32bitの変数に読むと
エンディアンの関係で [xx ,RR , GG , BB] となるだけで、同じだろ?

516 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 13:53:56 ]
>>512
>>513

こんにちは。
ご教授感謝致します。以下が修正コードです。
var
buf: string;
hProces : THandle;
WriteSize:DWORD;

hProces := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
SetLength(buf,1);
buf[1] := Chr($29A);
WriteProcessMemory(hProces, ptr(Address), PChar(buf), length(buf), WriteSize);
CloseHandle(hProces);

これで望む結果を出すことができました。ありがとうございます。
SetLength はメモリを再確保してくれる関数らしいですね、てっきりSizeOfで領域まで確保してくれているとばかり思っていました。
このような初心者に手を差し伸べてくださり本当にありがとうございます。
またこれでひとつ勉強になりました。それではm(_ _)m


517 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:02:16 ]
Delphiヘルプより
> TColor を Graphics ユニットに定義された定数で指定せずに,4 バイトの 16 進数で指定した場合,
> 下位の 3 バイトはそれぞれ青,緑,赤の RGB カラーの輝度を表します。
> $00FF0000 という値は最高の輝度,つまり純粋の青を示し,$0000FF00 は純粋の緑を示し,
> $000000FF は純粋の赤を示します。$00000000 は黒,$00FFFFFF は白です。

>>514
これ以上に何か意見があるなら聞こうか?(笑)

518 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:01:01 ]
>>517
痛いヤツだな
>>493=>>495=>>517なのか?

DIB32はメモリ上はBB GG RR 00って順番で並んでいる
コレをDWORDでアクセスすると$00RRGGBBになるだろ?
TColorの$00BBGGRRとは逆になるんだよ

初心者スレで無知を晒すのは恥じゃ無いが、学ぶ能力が無いのは恥るべき

519 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:55:23 ]
BSWAPして8だけRORして…

520 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 02:29:10 ]
>>518
なんか必死だけどちゃんと仕様見てきて言えよ

521 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 05:12:31 ]
>TColorの$00BBGGRRとは逆になるんだよ

????

522 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:27:41 ]
>>513

昨日メモリについて質問した者です。
気になる事がありましたので、お聞き致します。
仮に

SetLength(buf,1);
buf[1] := Chr($29A);
WriteProcessMemory(hProces, ptr(Address), PChar(buf), length(buf), WriteSize);
CloseHandle(hProces);

をbuf[1] := Chr($29A);としたい場合は、
function StrToByte(const s: string): byte;
var
i, n : integer;
begin
result := 0;

n := 1;
i := Length(s);
while (i > 0) and (n <= 128) do begin
if s[i] = '1' then
Inc(result, n);

n := n *2;
Dec(i);
end;
end;

を使ってbuf[1] := Chr(StrToByte('$29A'));を使って同様の結果がでないのはなぜでしょうか?


523 名前:522 mailto:sage [2008/03/06(木) 10:13:29 ]
質問間違えました、FF(250)以上の値を書くときは、
SetLength(buf,1);
buf[1] := Chr($29A);
WriteProcessMemory(hProces, ptr(Address), PChar(buf), 3, WriteSize);
CloseHandle(hProces);

こう書いたのですが、うまくいきませんでした。上の質問意味不明ですねOrz





524 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:40:08 ]
ええと、255=$FF 以上は1バイトで表現出来ません。
2バイトを書きたいなら $29A なら $02 と $9Aに分けて

SetLength(buf,2);
buf[1] := Chr($9A);
buf[2] := Chr($02);
WriteProcessMemory(hProces, ptr(Address), PChar(buf), length(buf), WriteSize);

または、
var
 SendInt:WORD;

として
SendInt := $029A

WriteProcessMemory(hProces, ptr(Address), @SendInt , SizeOf(SendInt), WriteSize);


525 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:17:08 ]
色んな理解が足りない。

どうして PCharではなくて string を使ってるかというと、
PCharだとメモリ確保した後、開放しなければいけないけど
stringなら自動開放されるからtry〜finally を使わなくてもいいから便利だから。

PCharやstringを使うのは、可変サイズに対応する為。
3バイトでも4バイトでも同じコードで対応出来るからね。

でも固定サイズなら、ポインタで処理する必要はない。
渡す時にポインタを渡せばいい。
byte,WORD,DWORDのそれぞれの引数用の関数3つを作る方がスマートだよ


526 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:50:39 ]
>>524
>>525

ご回答ありがとうございます。
必要な事はできたのですが、純粋に疑問になったので思い切って質問してみた所存です。
二つに分けてやるのは知りませんでした。

Stringは自動開放されるのを知っていましたが、Pcharも自動で開放されるかと思ってました(汗

私はbyte,WORD,DWORDとかの三つの関数作るなんて思わないでがつがつ書いていましたOrz
あとこれは余談ですが、GetMEMとSetLengthとは同じなんですかね?
私がGETMEMで確保してましたが、回答してくださった方はSetLengthでやっていました。
これはアセンブラのCMPとTESTみたいな感じで好みによってでしょうか?
別にこれには答えてくださらなくても構いません。

回答者のお二人ありがとうございました、目からウロコです><



527 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:38:22 ]
>>526
ヘルプを読めばGetMemとSetLengthの違いがわかります

528 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:07:30 ]
>>527
ほんとだ・・・いつもメモリ扱う時はPchar使ってたから、意識しないで使ってたけど、
違いあったんですね・・・。
どうもでした。


529 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:01:59 ]
Fizz-Buzz 問題:
ttp://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
 1から100までの数をプリントするプログラムを書け。
 ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ヒント
 GUIアプリでも AllocConsole; を入れておけばコンソールを出して write/wrilteln を使う事が出来ます
 TMemoを貼ってLines.Add をプリント代わりとしてもいいです。


530 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:51:19 ]
>>517-521
結局どっちなんだよw


531 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:04:56 ]
bitmap.PixelFormat := pf32bit;
bitmap.Canvas.Pixels[0,0] := TColor($0000FF);
PDWORD(bitmap.ScanLine[1])^ := DWORD(TColor($0000FF));
PDWORD(bitmap.ScanLine[2])^ := DWORD($0000FF);
で試してみた
結果




嘘つきばっかだなw

532 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:39:54 ]
もう放置したら?

533 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:40:34 ]
>DWORD(TColor($0000FF));
>DWORD($0000FF);

意味ねぇーー



534 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 12:35:55 ]
>>533
「意味が無い」ことを説明してるんでは?

TColorが上位、下位逆なのを説明されても理解できていない&認めようと
しないのが多数居たのが驚き。
いや、それだけ初心者向けの言語ってことなんだろうな。

535 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:38:44 ]
多数じゃなくて、一人だけだろw

536 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:15:36 ]
DLLを1つだけ LoadLibrary で読んでGetProcAddressして動かしてるプログラムがあります
このDLLをリソースには入れれたのですが実行時にDLLをHDDに書き込まずに動かす方法があれば教えてください
環境は、WinXP,Delphi6です。。。ファイルをEXE1つだけにしたいだけなのですがお願いします

537 名前:536 mailto:sage [2008/03/15(土) 16:18:06 ]
わざわざファイルに書き込まなくてもそのままでいけました。。。

538 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 20:09:45 ]
GPL逃れですか?

539 名前:デフォルトの名無しさん [2008/03/27(木) 17:33:47 ]
ほしゅ

540 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 06:48:24 ]
>>534
間違っています。
以上。
↓次どうぞ

541 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 15:44:57 ]
ビルドした日付を埋め込むにはどうしたらいいですか?
BCBの__DATE__みたいな奴です。

542 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:47:59 ]
できないので手動で埋め込んでください。

543 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:01:18 ]
$Iで埋め込んだらどうかな。
実験コード
procedure TForm1.FormCreate(Sender: TObject);
begin
with TStringList.Create do try
Add(''''+formatDateTime('yyyy/mm/dd',now)+'''');
SaveToFile('Test.dat');
finally free end;
Caption:={$I test.dat};
end;

名前付きパイプで、日付データを返すようなのを作って走らせて
{$I \\.\pipe\DatePipe } とか



544 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:30:32 ]
名前付きパイプは上手くゆかなかった。
APIで読めば読めるけど、LoadFromFileでは読めない。
たぶんLoadFromFileではサイズを先に読んでから処理するからなんだろう。

だから $Iでも読めないかも

545 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:58:18 ]
フォームに並べた10個のラベル
(名前が label1,label2..label10 とかだとして)
それぞれのラベルのCaptionにループを使ってアクセスするにはどうしたらいいんでしょう。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<190KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef