Delphi初心者のための ..
[2ch|▼Menu]
446:デフォルトの名無しさん
07/12/29 03:44:18
>>445
そのくらいのスペックで、Del6Pro つかってだけど、問題なかったぞ?

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

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


448:デフォルトの名無しさん
07/12/31 07:30:10
スミマセン
ageてしまいました。

449:デフォルトの名無しさん
07/12/31 11:10:07
どこまでもコピペするつもりですか。

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

まじめな課題です。


450:デフォルトの名無しさん
07/12/31 11:59:29
自分用のコンポーネントを自作するのが近道だよ。

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

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

452:デフォルトの名無しさん
07/12/31 19:50:50
JCLのコンテナ使いにくすぎる。おすすめせん。

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

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


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

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

#さぽきれかあ

454:デフォルトの名無しさん
08/01/03 15:25:42
あー、今頃出来やがんのorz

455:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/18 16:15:33
case を2重にして全部を列挙するか
0〜9と決まってるんなら単純に

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

458:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/18 17:04:39
var jumptable: array[0..9, 0..9, club..spade] of tjumpproc;
なジャンプテーブル用意したら。

460:デフォルトの名無しさん
08/01/18 17:16:45
>>459
どもw
ジャンプテーブルが使えたんですね・・・

何やってんだ俺orz

461:デフォルトの名無しさん
08/01/19 17:54:22
×可視性
○可読性

462:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/28 18:45:19
気のせいです

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

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

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

466:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/01 23:05:17
>>466
ども。
Invalidateの呼び出しはそれでやってます。

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

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


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

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


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

469:デフォルトの名無しさん
08/02/01 23:48:28
>>468
ども。

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

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

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

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

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

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

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

472:デフォルトの名無しさん
08/02/02 07:39:04
×IntersectRect
○InvalidateRect

473:デフォルトの名無しさん
08/02/02 22:21:03
にゃあ

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

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

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

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

476:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 18:13:05
くだらん。
どうしても転化したければ、inline使え

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

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

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

479:デフォルトの名無しさん
08/02/24 06:02:23
>>478
DIBにして、ScanLineでBITMAPのデータを直でいじくる

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

481:デフォルトの名無しさん
08/02/24 06:37:09
そんなに難しく考えるなよ

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

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

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

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



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

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

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


485:デフォルトの名無しさん
08/02/26 19:37:38
単にInt64にしたらいいんじゃないの? 除算や右シフトをやらない限り問題ない

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

487:デフォルトの名無しさん
08/02/27 19:01:28
UInt64使えばいいだろ。

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

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

ページを貼らせてもらうと
URLリンク(www.sm.rim.or.jp)
> 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:デフォルトの名無しさん
08/02/27 21:55:42
>488
$は16進数のプレフィクス。C/C++の0xに相当。
明るさは人間の目のRGBに対する感度の違いを考慮して計算している。昔の白黒テレビで
カラー画像を見ているのと同じ。
その明るさを持つグレーの値を計算している。

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

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

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

492:749
08/03/01 20:27:17
>>491
BGRの順番で格納されているのはTColor

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

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

494:デフォルトの名無しさん
08/03/02 13:12:38
>>493
32bit DWORDだとrgbだな

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

495:デフォルトの名無しさん
08/03/04 03:36:32
>>494
何をわけの分からないこと言ってるんだ
同じことだろ

496:デフォルトの名無しさん
08/03/04 04:23:57
サーセンw

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

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

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


498:デフォルトの名無しさん
08/03/04 16:18:08
>>497
35901 = $8C3D

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

499:デフォルトの名無しさん
08/03/04 16:40:25
>>498

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


500:デフォルトの名無しさん
08/03/04 17:35:44
>>499
そりゃ1Byteしか書き込んでいないから。

501:デフォルトの名無しさん
08/03/04 18:29:49
>>500
NumberOfBytes

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


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

503:デフォルトの名無しさん
08/03/04 21:04:31
>>502
すいません、私のレベルが低くていまいちよくわかりません・・・。

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

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


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

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

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

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

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

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

507:デフォルトの名無しさん
08/03/04 23:48:37
>>505
理解できてないから予期しない結果になるんだよ。
URLリンク(msdn.microsoft.com)

508:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/05 08:04:08
ヒント:bufのサイズをコンパイラが知れるわけがない

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

511:デフォルトの名無しさん
08/03/05 08:58:03
>>509
>>510

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


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

513:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/05 11:00:22
>>495
TColorと32bitRGBじゃRGBの順序が逆だよ?
そのまんまキャストは不可

ごっちゃにしてない?

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

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

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

518:デフォルトの名無しさん
08/03/05 20:01:01
>>517
痛いヤツだな
>>493=>>495=>>517なのか?

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

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

519:デフォルトの名無しさん
08/03/06 00:55:23
BSWAPして8だけRORして…

520:デフォルトの名無しさん
08/03/06 02:29:10
>>518
なんか必死だけどちゃんと仕様見てきて言えよ

521:デフォルトの名無しさん
08/03/06 05:12:31
>TColorの$00BBGGRRとは逆になるんだよ

????

522:デフォルトの名無しさん
08/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
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/06 12:17:08
色んな理解が足りない。

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

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

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


526:デフォルトの名無しさん
08/03/06 15:50:39
>>524
>>525

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

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

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

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



527:デフォルトの名無しさん
08/03/06 17:38:22
>>526
ヘルプを読めばGetMemとSetLengthの違いがわかります

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


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

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


530:デフォルトの名無しさん
08/03/07 13:51:19
>>517-521
結局どっちなんだよw


531:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/07 22:39:54
もう放置したら?

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

意味ねぇーー

534:デフォルトの名無しさん
08/03/12 12:35:55
>>533
「意味が無い」ことを説明してるんでは?

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

535:デフォルトの名無しさん
08/03/12 18:38:44
多数じゃなくて、一人だけだろw

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

537:536
08/03/15 16:18:06
わざわざファイルに書き込まなくてもそのままでいけました。。。

538:デフォルトの名無しさん
08/03/15 20:09:45
GPL逃れですか?

539:デフォルトの名無しさん
08/03/27 17:33:47
ほしゅ

540:デフォルトの名無しさん
08/04/11 06:48:24
>>534
間違っています。
以上。
↓次どうぞ

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

542:デフォルトの名無しさん
08/04/16 22:47:59
できないので手動で埋め込んでください。

543:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/17 11:30:32
名前付きパイプは上手くゆかなかった。
APIで読めば読めるけど、LoadFromFileでは読めない。
たぶんLoadFromFileではサイズを先に読んでから処理するからなんだろう。

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

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


546:デフォルトの名無しさん
08/04/17 21:02:21
(FindComponent('Label'+IntToStr(LabelNum))as TLabel).Caption

547:545
08/04/17 21:33:34
助かりました、ありがとうございました!

548:デフォルトの名無しさん
08/04/24 20:51:42
>>543
それを埋め込んだデルファイを起動するアプリを作っていいかんじになりました、どうも。

549:デフォルトの名無しさん
08/05/14 16:04:58
TDrawGridのColやRowプロパティが変更する場合の、
イベントハンドラを教えてくださいorz

550:549
08/05/14 16:16:32
OnClickでできますた。

551:デフォルトの名無しさん
08/05/17 13:45:07
Delphianが行方不明なのでこちらに質問させてください;;
Stringでなく数値で操作できるGridコンポ探しています。
どなたかご存じないですか?

552:デフォルトの名無しさん
08/05/18 02:03:35
>数値で操作できる

いみふめ

数値と文字列は相互可変なんだから TStringGrid でなにが不足なんだ?

553:デフォルトの名無しさん
08/05/18 10:57:12
セルの値を直接数値で入れたり出したりしたいんだろう。素人がしたがりたそうなことだ。

554:デフォルトの名無しさん
08/05/18 11:09:12
'0'..'9'のみ入れさせたいなら
StringGridKeyPressイベントで

if not (Key in ['0'..'9']) then Key := #0;
とかやって入力を潰してしまえばいい。

ペーストも含めて対策したいならSetEditTextでゴミを取り除いてCells[]にセットしてやればいい。
他にもなんか対策すべきだったと思うが忘れた。

まあそこらへんのノウハウ込みのコンポを探してるんだろうが。

555:デフォルトの名無しさん
08/05/20 12:02:23
はい、日曜ど素人でございます(T_T)
StringGridKeyPressとSetEditTextで新しいコンポを作れそうです。
ありがとうございました。

556:デフォルトの名無しさん
08/05/28 18:57:24
TFileStreamでファイルをオープンして、
別のストリーム、たとえば、TContentStreamにファイルの中身を設定しようとすると、
どういった記述となりますか?

557:デフォルトの名無しさん
08/05/28 19:55:36
Assignを使う。どちらもTStream派生だから。

558:デフォルトの名無しさん
08/05/28 19:59:25
LoadFromStream はないの?

559:デフォルトの名無しさん
08/05/31 02:17:47
グーグルマップに自分のブックマーク(っての?)残せるやん?

ローカルの地図画像であんな感じのアプリを、db連動で作ってみたいんだけど、何を参考にすればいい? グラフィック関係かと思って、ゲーム関係見たけど、あまり参考になりそうにない。

560:デフォルトの名無しさん
08/06/11 11:48:36
超初心者ですまん。

juni := member_suu + 1;

for t := 0 to member_suu - 1 do
begin
for k := 0 to member_suu - 1 do
begin
if StrToInt(ListBox1.Items[t]) >= StrToInt(ListBox1.Items[k]) then
juni := juni - 1;
end;
ListBox2.Items[t] := IntToStr(juni);
juni := member_suu + 1;
end;

上の関数で整数の特典に対して順位をつけたのだが、同点がおおくて1位等が重複してしまうので、
重複しないようにしたい。1位と2位の差はあまりこだわっていなく、名前順でいいしランダム(条件なし)でもいい。
アドバイスください。

561:デフォルトの名無しさん
08/06/11 14:38:25
・名前順なら得点と名前をソートのキーとする
・ランダムなら、得点とランダム値をソートのキーとする

562:デフォルトの名無しさん
08/06/22 03:10:21
Jane Doe Styleのスレッド本文の表示には何のコンポーネントを使っているのでしょうか?

563:デフォルトの名無しさん
08/06/22 03:11:13
すみません、他で聞きます。

564:デフォルトの名無しさん
08/07/23 17:05:00
Form に Formを貼り付けると、MainMenuが表示されませんねorz

表示させる方法はあるのでしょうか?
無ければ、Menuライクなコンポーネント?

565:デフォルトの名無しさん
08/07/23 19:25:23
何がやりたいの?

566:デフォルトの名無しさん
08/08/08 13:42:48
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet***\Enum以下の
レジストリを操作(キー・値の変更・削除)したいんですが
SYSTEMユーザーしか操作権限がない状態です

これらを操作する方法などありますか?

567:デフォルトの名無しさん
08/08/08 22:03:58
いやそれ操作したら駄目だろ。

568:デフォルトの名無しさん
08/08/10 11:06:01
やっぱりタブーなのね(´・ω・`)サーセンでした

569:デフォルトの名無しさん
08/08/10 14:37:09
なにしたいのよ?

570:デフォルトの名無しさん
08/08/10 14:57:37
テスト環境で設定したソフトの登録情報を
本番環境とごっそり置き換える作業をプログラム化したいんです。

今、それをするのに手作業(設定時なのでAdministrato)で
レジストリのアクセス権つけて不必要な登録を消したりとかしてます。

571:デフォルトの名無しさん
08/08/10 15:14:04
それにしてもHKLM\System以下を書き換えるなんてのはありえないと思うが?

572:デフォルトの名無しさん
08/08/10 16:17:13
Enum\LEGACY*のいくつかにマシン名やコンピュータの設定が
刻まれているので消しているということらしいんですが
(この辺がテスト環境と本番環境で変わってくるので変更したい)

実際には、その環境の情報を見てはいないんですが
消す必要がないのかな・・・

573:デフォルトの名無しさん
08/08/29 00:44:34
画像ファイル(bmp、jpg)をテキストデータとして扱うことはできませんか。
MIMEとか、ishのような感じで、当然、可逆変換で。

574:デフォルトの名無しさん
08/08/29 08:19:15
そのMIMEとかいshで変換すりゃあいいやん。意味不明。

575:573
08/08/29 19:31:44
ん〜と、簡易データベースみたいなのをつくろうとしてて、テキストフィールドに画像を「テキストデータとして格納」したいってことなんだけど、意味不明?

576:デフォルトの名無しさん
08/08/29 21:25:36
やっぱり意味不明かも。
まともなRDBMSならBLOB使うべきだし、
BLOB使えないなら別の名前を与えてファイルのまま保存、使うときは逆参照汁。

577:デフォルトの名無しさん
08/08/29 21:29:26
まあどうしてもやりたいなら止めない。

URLリンク(www.google.com)

この辺りでも参考にしてくれ。

578:デフォルトの名無しさん
08/08/31 01:49:12
あ、俺は逆のパターンを知りたい。
文字列フィールドに入りきれない文字列を画像に変換してBLOBに保存する、って無理?

579:デフォルトの名無しさん
08/08/31 11:22:22
>>578
使用してるDBが分からないけど、Delphiからということを考慮するとFirebirdか?

もしそうなら、難しいこと考えず、サブタイプが1(テキスト)のBLOG作ればいいんじゃないのかな?

ほかのDBだと、
PostgreSQLはTEXT型があるから、意識する必要なし
SQL Serverも、2005からVARCHAR(MAX)があるから、意識する必要なし
MYSQLもTEXT型があるみたいだ
ORCLE, DB2はシラネ


580:デフォルトの名無しさん
08/08/31 11:37:40
>>579

ローカルで火鳥かMSQLか何かの組み込みエンジン(まぁ、これは何でもよい。)、相手先はOracle。

Oracleにはあらかじめ定義された文字・数値項目と画像の入力ができる。
しかし、設計が追いついていないため、利用者で必要な情報を入力する文字項目が足りない。
画像なら何十枚でも追加可能。

そこで、ローカル情報を画像に変換してオラクル側に画像として保存すれば、当面は事足りるってこと。
もちろん取り出したら、ローカル側では文字情報に戻す。

その時の変換作業用っていうか、状態確認用みたいなので、ローカルでも同じものを保存しておきたい。

と言うことなんだけど。

581:デフォルトの名無しさん
08/09/01 07:15:35
EditでIMEがOn/Offで背景色を変えたいんだけど
そういったサンプルコードないですか?

582:デフォルトの名無しさん
08/09/01 19:27:39
無いな。だがヒントだけ教えてやろう。
IMEの状態が変わるときのメッセージ(WM_IME_NOTIFY)を受けたら
IMEの状態を取得して、ONの時はColorプロパティを適当な色に変えれば良いんだ。

583:デフォルトの名無しさん
08/09/02 01:05:42
処理が大まかに2つあってタイマーを使って繰り返したい(Intervalはどちらも同じで問題ない)場合
タイマーを一つだけ使うのと、処理それぞれでタイマーを作るのでどっちが一般的なんでしょうか?
また、どっちが軽くなるんでしょうか?
よろしくお願いします。

584:デフォルトの名無しさん
08/09/02 03:24:52
Intervalが同じならとりあえず一つで十分だろう。
タイマー二つまわすよりも一つの方が理屈としては軽い。
ただタイマーごときで重くなるようなPCは今時存在しない。

585:デフォルトの名無しさん
08/09/02 03:31:58
>>584
ありがとうございます!
助かりました


586:デフォルトの名無しさん
08/09/08 08:07:01
あの・・単純な質問なのですが、TChartコンポーネントを使って
凡例を表示させると、凡例がグラフの裏側へと隠れてしまいます。
(枠の端っこのちょっとだけ見えている状態です)

これをグラフよりも手前に表示させる方法を教えてください・・

587:デフォルトの名無しさん
08/09/08 20:01:27
ソフト公開所
スレリンク(mitemite板)
こういうスレつくってみた。

588:デフォルトの名無しさん
08/09/09 06:27:01
アップローダもなしに何をどう公開しろと・・・

589:デフォルトの名無しさん
08/09/10 14:49:55
板違いで失礼します。
Linux環境にてDelphi互換のLazarusをインストールして使いたいと思い
freePascal本体、Freepascalのソース、Lazarus本体をインストール致しました。
Lazarusは立ち上がり、ソース入力後
いざ実行というときに、コンパイラに弾かれてしまいます。

以下エラーメッセージです。
/usr/bin/ld: cannot find -lX11
project1.lpr(17,1) Error: Error while linking
project1.lpr(17,1) Fatal: There were 1 errors compiling module, stopping

リンク関係の設定を何かはじめに行なわないといけないのでしょうか?
もし、ご存じの方いらっしゃいましたらご教授ください。
よろしくおねがいします。

590:デフォルトの名無しさん
08/09/10 18:39:03
>>589
とりあえずこういうスレがあるからそちらで聞くとよいと思われ。

【Delphi互換!?】FreePascal【GPL】
スレリンク(tech板)l50



591:589
08/09/11 09:58:00
>>590
ありがとうございました。
教えていただいた、スレを拝見致しまして
無事解決することができました!

592:デフォルトの名無しさん
08/09/12 13:51:14
ウィンドウっとか、オブジェクトってフォームデザイナで作っておかないとだめなんでしょうか?
ユーザーの処理にあわせて、新しいフォームを作り、そこに画像を表示させたいんです。
元々用意しとくんじゃなくて、いくらでも増やせていけるように。

たとえばフォトショップでいくらでも画像ひらいて、どんどんウィンドウ増えるじゃないですか。
あーいう感じです。

593:デフォルトの名無しさん
08/09/12 13:59:37
インスタンスをどんどん作ればいいじゃね?

TForm1=class(TForm)
end;

forms: array of TForm1

SetLenght( forms, 10 );
for i := 0 to 9 do
  forms[i] := TForm1.Create( Self );

って感じで。

これだったら、デザイナで1つ作って、実行時は10個フォームが出きるが。


594:デフォルトの名無しさん
08/09/12 15:03:51
ありがとうございます。
このフォームの上につくるオブジェクトもこれでOKですかね。
いわゆる動的生成をやるってことですよね?

595:デフォルトの名無しさん
08/09/12 15:13:38
そうです。

フォーム上のObjectが同じなら最初にデザイナで作っておく。
フォームごとに変わるなら、それぞれ、動的作成するんだけど、
動的作成しなければいけないObjectが多数ある場合は、
デザイナで作った方が簡単だと思う。



596:デフォルトの名無しさん
08/09/12 15:49:30
ありがとうございました!

597:デフォルトの名無しさん
08/09/17 18:27:00
>>588
アップローダー作ったら公開してくれるの?

598:デフォルトの名無しさん
08/09/18 00:30:44
>>597
半年ROMれ

599:デフォルトの名無しさん
08/09/18 00:35:40
---------半年後----------

600:デフォルトの名無しさん
08/09/18 00:47:11
最終回か…。

601:デフォルトの名無しさん
08/09/20 21:18:10


602:デフォルトの名無しさん
08/10/11 15:50:00
>>529 3の倍数はアホになれ

603:デフォルトの名無しさん
08/11/18 23:02:01
十年ほど初心者やってるんですが、先ほどFastCodeを知り試してみました
D5にFastCode.Libraries-0.6.4入れたらStrUtils.pasなど新しいものが入っていないので断念して
某所さんの古い記事にあった「詰め合わせセット RTL Replacement Pkg v0.3」を入れました
>Delphi 4 以降に対応しています。私はまだ試していないのですが、Delphi 7 以前では特にお勧めだと思います。
とあったのですがやはりエラーの嵐でサンプルすらコンパイル出来ませんでした

どなたかD5で使っておられる方は居ませんでしょうか?
D2007も持ってはいるんですが起動時間や手軽さからD5は手放せないのです

604:デフォルトの名無しさん
08/11/18 23:27:22
すなおにD2007

605:デフォルトの名無しさん
08/11/18 23:29:02
>>603
D5持ってたらなんなの?

606:デフォルトの名無しさん
08/11/18 23:35:15
>>604
D2007ではFastCodeの効果ありますでしょうか?

607:デフォルトの名無しさん
08/11/18 23:35:47
>>605
いえ、FastCodeの話です

608:デフォルトの名無しさん
08/11/19 00:44:33
D2007はFastCodeもFastMoveもFastMMも採用済みじゃなかったっけ?

609:デフォルトの名無しさん
08/11/19 02:09:08
FastCodeのAnsiStringReplaceは「Ansi」って付いてるけど
マルチバイト非対応なんで気を付けてね


610:デフォルトの名無しさん
08/11/19 09:14:53
FastMMは使ってるから何か分かるが、
FastCodeとかFastMoveって何?

611:デフォルトの名無しさん
08/11/19 10:24:37
グーグレ

612:デフォルトの名無しさん
08/11/19 14:31:52
>>610
標準のシステムの関数を速いのにおきかえたものただし>>609の問題があったはず

613:デフォルトの名無しさん
08/11/22 11:32:01
バグ恐いからFastMMしか使ってないな

614:デフォルトの名無しさん
09/02/02 18:23:00
ちょうどCompareMemがネックになってたんでちょっと使ってみるかな。

615:デフォルトの名無しさん
09/02/05 13:17:57
>CompareMem
kwsk

616:デフォルトの名無しさん
09/02/19 15:08:18
TMemoryStreamの先頭3バイト削除したりできますか?

617:デフォルトの名無しさん
09/02/20 00:23:17
だめです
先頭3バイト以降を別のStreamにコピーするとか
MemoryをPCharにキャストして[3]とか

618:デフォルトの名無しさん
09/02/20 07:53:17
そもそもメモリを削除ってなによ

619:デフォルトの名無しさん
09/02/21 10:04:30
cのscanf相当の関数教えて

620:デフォルトの名無しさん
09/02/21 10:27:00
>>619
その前にそのscanfとやらが、Delphiでどの関数にあたるのかを説明してくれ。

621:デフォルトの名無しさん
09/02/21 15:21:45
>>619
ないはず

622:デフォルトの名無しさん
09/02/27 16:36:03
>>619 stdioはいまさらイランと仮定して、いっかい文字列に入れてから
strtoint strtofloat strtocurr他で一個づつ変換

623:デフォルトの名無しさん
09/03/24 14:32:45
TMemoryStreamでSizeを大きくしたら、大きくなった部分NULL埋めされるんでしたっけ?

624:デフォルトの名無しさん
09/03/24 15:18:41
>>623
試すのに1分もかからないと思うが、どうよ?

625:デフォルトの名無しさん
09/06/18 20:49:46
Delphi2009 を使っています。

VCLコンポーネントから派生したコンポーネントを
作るにはどうすればいいでしょうか?

626:デフォルトの名無しさん
09/06/18 21:05:12
ウィザード一発じゃねぇの?ファイル→新規作成→その他あたり。

627:デフォルトの名無しさん
09/06/18 21:10:00
>>626
ありがとうございます。
派生したコンポーネントを使いたいのですが
どうすればいいでしょうか?

フォームに派生クラスのコントロールをどうやって置いたら
よいのかわからなくて、適当なコントロールを置いた後に
dfm ファイルを直接書き換えてみたのですが、見つからない
と言われた挙げ句、関連している pasファイルを破壊されて
しまいました。



628:デフォルトの名無しさん
09/06/18 21:14:31
コンポーネント開発は開発者ドキュメントと適当な解説書買って読まないと辛いよ。
OOPの知識なんかも結構必要になるし。

629:デフォルトの名無しさん
09/06/18 21:17:15
>>628
ありがとうございます。

ただ単純に TRadioButton の CreateParams を
オーバライドしたいだけなのです。

630:デフォルトの名無しさん
09/06/18 21:26:52
以下のようなユニットを通常の手順で作ってあとはIDEからコンポーネント|インストールで登録。
2009は持ってないから変わってるかもしれないが。

unit cMyRadioButtonEx;

uses // todo:必要なユニットを列挙

type
    TRadioButtonEx = class(TRadioButton) // or TCustomRadioButton;
        ...
    end;
   
procedure Register;

implementation

procedure Register;
begin
    RegisterComponents('Samples', [TRadioButtonEx]);
end;

// todo: TRadioButtonExの実装

end.

631:デフォルトの名無しさん
09/06/18 21:31:53
>>630
メニューには、コンポーネント|インポートと
コンポーネント|新規VCLコンポーネントの
2種類しかなく、インポートはタイプライブラリと
ActiveXコントロール、.NETアセンブリの取り込み
の3種類しかありませんでした。

新規VCLコンポーネントで派生クラスを作れるような
雰囲気でしたが、実際に操作してみると内部エラー
らしきエラーが出て処理が進まないのです。

Delphi2009はバグだらけという事で諦めるしかないの
でしょうか?

632:デフォルトの名無しさん
09/06/18 21:36:29
いまさらデルピィやる意味あんのか?
gui作るならpythonで十分だろ

633:デフォルトの名無しさん
09/06/18 21:37:49
>>632
6万もしたのに、この有様です。
泣けてきます。

634:デフォルトの名無しさん
09/06/18 21:43:29
一人で舞い上がってないで操作手順とエラーメッセージくらい書けばいいのに。
CreateParamで具体的に何指定したいかとかさ。

635:デフォルトの名無しさん
09/06/18 21:45:56
>>634
ありがとうございます。

BS_PUSHLIKEスタイルを付けたいだけなのです。

636:デフォルトの名無しさん
09/06/18 21:52:31
モジュール 'coreide120.bpl'のアドレス 206B39D7で
アドレス 00000018 に対する読み込み違反がおきました。

というエラーです。

637:デフォルトの名無しさん
09/06/18 22:28:28
ウィザード使わなくたって手で書けばいいじゃん
できたユニットをパッケージにつっこんで
右のプロジェクトマネージャからパッケージを右クリック→
インストールを選択で終わりだろ


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4909日前に更新/241 KB
担当:undef