[表示 : 全て 最新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初心者が問題をコツコツと解きながらレベルアップするためのスレです。


382 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:12:41 ]
何を作りたいかだろ
ファイラ作りたいとか、MMO作りたいとか(スレがあっったりするが)

383 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 08:44:22 ]
ドトネトみたく環境設定も要らないし、コンポーネントも要るものはあるし。
いきなり始めて、躓いてから質問してみたら?

384 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 15:17:32 ]
VB2005はヘルプがすごく使いやすい

385 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 15:30:47 ]
ヘルプだけかよw

ネイティブアプリが作れるようになったら試しに触ってやるよ。

386 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:24:20 ]
ま、C#からやったらいいよ。DelphiもIDEは.NETが必要だし。
C#は良い本もヘルプもMSDNもWEBサイトも腐るほどあるし。

387 名前:デフォルトの名無しさん [2007/11/09(金) 01:23:20 ]
Del5。XPで、

Ctrl+Alt+Delを無効にする方法。
右クリックを無効にする方法。

教えて。


388 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 01:40:40 ]
>Ctrl+Alt+Delを無効にする方法。
マルウェアでも作るつもりですか?

389 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 05:38:41 ]
そーゆーことしたいなら自分で調べろww

390 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 06:47:53 ]
>>387
いちばん簡単なのは、DirectXのフルスクリーンモードで、そういうモードがある。
やり方は自分で調べろ



391 名前:387 [2007/11/09(金) 06:48:48 ]
いや、調べてもわからないから聞いてるんで。

ちなみに、会社のIT担当委員ってのをやってて、社員にサイバーテロの対処について教育するんだが、
本物のウィルスを使うわけにはいかないんで、ジョークウェアを作ろうと思っている。


392 名前:387 [2007/11/09(金) 06:49:39 ]
書き忘れた。

一定の時間が経過したら自動的に終了させるつもりだ。

393 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:31:11 ]
Ctrl-Alt-Deleteのキーストロークは最優先でシステムが捕捉するので、これを
無効にすることはできない。無理。不可能。Deleteキーの軸を折っちゃえ。
右クリックはマウスの右クリックのスイッチを(ry

394 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:56:12 ]
無理ではない。教えたいところだけど、>>391が本当か分からないし
教える立場だったら自分で調べて欲しいところ。

ヒント:海外

395 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 07:35:04 ]
ソフトウェア板の各所でも、キーロガーとか、スパウウェア用途に使われるものは紹介しないというルールだしな
おしえる側も、最低限のことは守らないと

396 名前:デフォルトの名無しさん [2007/11/10(土) 08:46:07 ]
391だけど、不正ソフトばらまくのは犯罪だってことくらい知ってるよ。
けどまぁ、信用してもらえないのも仕方がないからなんとかするわ。

397 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 07:10:16 ]
2chで信用しろといわれても・・・

398 名前:delphi初心者 [2007/11/12(月) 13:48:03 ]
ご質問いたします。

1.コンマ区切りの文字列をばらして配列にセットしてくれる関数はありませんか?
2.functionで配列は返せないのですか?





追伸: 「そんなこと自分で調べろ!」 と云う罵倒はおことわり。

399 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:50:46 ]
TStringList.CommaText

400 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:51:22 ]
それかTStringList.Textに入れれば、バラしてくれたかも



401 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:10:08 ]
>398
配列の型を宣言してそれを戻り値の型にすればおk


402 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 14:33:42 ]
>>401
それ、何てTStringList?

403 名前:デフォルトの名無しさん [2007/11/13(火) 18:48:49 ]
【Borland Delphi 6 Personal日本語版 入手先】
www.vector.co.jp/soft/dl/win95/prog/se205882.html
【Delphi 6 導入手順 】
www.wikihouse.com/DelphiVIP/index.php?%C6%B3%C6%FE%BC%EA%BD%E7
【インターネットダイレクト(Indy)コンポーネント導入手順 】
homepage3.nifty.com/KENCH/open/indy/delphi_indy.htm

動作確認は、メモとIdHttpコンポーネントを貼り付けて以下のコードを書いて実行してみる。
うまくいくとこのスレがメモにダウンロードされる。
Memo1.Lines.Text := IdHttp1.Get('live19.2ch.net/test/read.cgi/stock/1144395454/l50');

【デルファイの質問所】
hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi
leed.t.u-tokyo.ac.jp/~takeuchi/delphi/search.cgi
groups.google.com/groups/search?hl=ja&q=delphi+

404 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:01:32 ]
上げ荒らしうぜえ

405 名前:初心者++ [2007/11/18(日) 11:09:49 ]
UpdateSQLがうまくいきません。以下のようなコードで実行すると、例外エラー'アップデート失敗'がでます。
propertyの設定は
cachedupdate true /requestlive true /updateobject updatesql

updatesqlのsql設定文もできてると思うんですが、、、


begin
database1.open;
database1.StartTransaction;
query1.Open;
end;

procedure TSDIAppForm.Button1Click(Sender: TObject);
begin

if query1.UpdatesPending then begin
query1.ApplyUpdates;
end;
database1.Commit;
query1.CommitUpdates;
query1.Close;
database1.Close;

end;

どこが間違ってるのでしょうか?教えてください
Turbo Delphi for wind32
OS : wind2000です。


406 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:36:44 ]
残念、スレちがいです。

>Delphi初心者が問題をコツコツと解きながらレベルアップするためのスレです。

407 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:54:22 ]
糞なテンプレでスレ立てて必死に粘着交通整理してる奴ってなんなの?

408 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:45:04 ]
自分の居場所なんだから、そりゃ必死だろう。

自分の居場所をキチンとメインテナンスするのは、それは当然ではあるまいか?

409 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:32:32 ]
自分の居場所ならグダグダ「スレ違い」とか言ってないで、問題を出題すべきだと思うんだな。
問題と解答、それに議論が無いから、過疎ってスレ違いと基地外の巣窟と化してるんだな。
問題:おみくじ
randomを使って大吉、吉、凶のいずれかを表示するプログラムを作れ

410 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:36:13 ]
>>409

あまりにも簡単すぎるプログラム出題でワロタw

せめて、n回凶が出る確率を計算するプログラムとかにすればいいのに。



411 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:47:39 ]
>>405

Queryの更新エラーは、
query1.RequestLiveのtrue/falseが
結構関係している。

412 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 22:53:35 ]
Gandomを使って大吉、吉、凶のいずれかを表示するプログラムを作れ


413 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:05:26 ]
>>412
CGは専門外なんで無理ですw

414 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:21:52 ]
Gandom はすれ違い。

415 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 01:02:34 ]
問題:呼び出すたびに1と0を交互に返す関数を書け。グローバル変数を使っても良い。

416 名前:初心者++ [2007/11/21(水) 02:06:06 ]
UpdateSQLのエラーが解決しました。レスを下さった方ありがとうございました。
SQL文のキー違反でした。
 SQLの勉強をもっとしないと阿寒と思いました。
 Accessのビューで作ったSQL文を貼り付けたりしておったのですが、、、。
 エラー続出でした。

417 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 23:30:12 ]
問題:マウスクリックすると、クリックしたマス目とその上下左右のマスが反転する。
    マス目を全て塗りつぶしたらクリアとなるゲームを作る

□□□□□             □□□□□            ■■□□□
□□□□□             □□■□□            ■□■□□
□□□□□             □■■■□            □■■■□
□□□□□             □□■□□            □□■□□
□□□□□の真ん中を押すと  □□□□□左上クリックで   .□□□□□

■■□□□           ■□□□□
■○■□□           □■□□□
□■■■□           □□■■□
□□■□□           □□■□□
□□□□□ ○を押したら  □□□□□


全部塗りつぶしたらゲームクリア
■■■■■
■■■■■
■■■■■
■■■■■
■■■■■

418 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 23:43:16 ]
>>417
ライツアウト懐かしいな

419 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:58:06 ]
俺には作れねぇ

420 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:03:28 ]
頑張れば作れなくもなさそうだけど、とてつもなく無駄が多くなりそう・・。



421 名前:1/2 mailto:sage [2007/11/22(木) 01:33:44 ]
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    FTable: array[0..4, 0..4] of Boolean;
  end;

procedure TForm1.FormPaint(Sender: TObject);
const
  B2S: array[Boolean] of String = ('□', '■');
var
  x, y: Integer;
begin
  for x := 0 to 4 do
    for y := 0 to 4 do
      Canvas.TextOut(x*12, y*12, B2S[FTable[x, y]]);
end;

422 名前:2/2 mailto:sage [2007/11/22(木) 01:34:15 ]
procedure TForm1.FormClick(Sender: TObject);
var
  pt: TPoint;
begin
  pt := Self.ScreenToClient(Mouse.CursorPos);
  pt.X := pt.X div 12;
  pt.Y := pt.Y div 12;

  if (0 <= pt.X) and (pt.X <= 4) and (0 <= pt.Y) and (pt.Y <= 4) then
  begin
    FTable[pt.X, pt.Y] := not FTable[pt.X, pt.Y];

    if 1 <= pt.X then FTable[pt.X-1, pt.Y] := not FTable[pt.X-1, pt.Y];
    if pt.X <= 3 then FTable[pt.X+1, pt.Y] := not FTable[pt.X+1, pt.Y];
    if 1 <= pt.Y then FTable[pt.X, pt.Y-1] := not FTable[pt.X, pt.Y-1];
    if pt.Y <= 3 then FTable[pt.X, pt.Y+1] := not FTable[pt.X, pt.Y+1];
  end;
    
  Invalidate;
end;

423 名前:2/2 ver.2 mailto:sage [2007/11/22(木) 01:40:47 ]
クリア判定忘れてた。

procedure TForm1.FormClick(Sender: TObject);
var
  pt: TPoint;
  x, y: Integer;
  Clear: Boolean;
begin
  pt := Self.ScreenToClient(Mouse.CursorPos);
  x := pt.X div 12;
  y := pt.Y div 12;

  if (0 <= x) and (x <= 4) and (0 <= y) and (y <= 4) then
  begin
    FTable[x, y] := not FTable[x, y];

    if 1 <= x then FTable[x-1, y] := not FTable[x-1, y];
    if x <= 3 then FTable[x+1, y] := not FTable[x+1, y];
    if 1 <= y then FTable[x, y-1] := not FTable[x, y-1];
    if y <= 3 then FTable[x, y+1] := not FTable[x, y+1];
  end;

424 名前:3/2 mailto:sage [2007/11/22(木) 01:41:18 ]
  Clear := True;
  for x := 0 to 4 do
  begin
    for y := 0 to 4 do
      if not FTable[x, y] then
      begin
        Clear := False;
        Break;
      end;

    if not Clear then
      Break;
  end;

  if Clear then
    ShowMessage('おめ');

  Invalidate;
end;

425 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:02:47 ]
すげー!参考にさせて頂きますm(_ _)m

426 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 11:33:40 ]
implementation
{$R *.dfm}

//スペースの都合上ここに記述本当ならTForm1のprivateが望ましい
var
BTable:array of array of Boolean; 

procedure CheckComplete();
var
X,Y:Integer;
begin
for X:=1 to High(BTable)-1 do
for Y:= 1 to High(BTable[X])-1 do
if Not BTable[X,Y] then Exit;

ShowMessage('Mission Complete!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(BTable,DrawGrid1.ColCount+1,DrawGrid1.RowCount+1);
end;


427 名前:修正1/2 (426は放置推奨 ) mailto:sage [2007/11/23(金) 11:43:25 ]

//●最初にDrawGridを貼り付け、プロパティを以下のようにセット
  Align = alClient
  DefaultDrawing = False
  ColCount = 6
  RowCount = 6

//●FormのPrivateに以下のフィールドとメソッドを追加
  BTable:array of array of Boolean; //動的二次元配列
  procedure CheckComplete();
  
//●CheckComplete関数を書く
procedure TForm1.CheckComplete();
var
  X,Y:Integer;
begin
  for X:=1 to High(BTable)-1 do
    for Y:= 1 to High(BTable[X])-1 do
      if Not BTable[X,Y] then Exit;

  ShowMessage('Mission Complete!');
end;

//●FormCreateを書く
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(BTable,DrawGrid1.ColCount+1,DrawGrid1.RowCount+1);
end;

428 名前:修正(2/2) mailto:sage [2007/11/23(金) 11:43:59 ]
//●DrawGrid1DrawCellを書く
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
const
  COLORPALS:array[Boolean] of array[Boolean] of TColor = ((clWhite,clBlack),(clSilver,clSilver));
begin
  DrawGrid1.Canvas.Brush.Color := COLORPALS[(gdFixed in State) , BTable[ACol,ARow] ];
  DrawGrid1.Canvas.FillRect(Rect);
end;

//●DrawGrid1SelectCellを書く
procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;var CanSelect: Boolean);
begin
  BTable[ACol-1,ARow] := Not BTable[ACol-1,ARow];
  BTable[ACol ,ARow] := Not BTable[ACol ,ARow];
  BTable[ACol+1,ARow] := Not BTable[ACol+1,ARow];
  BTable[ACol,ARow-1] := Not BTable[ACol,ARow-1];
  BTable[ACol,ARow+1] := Not BTable[ACol,ARow+1];
  DrawGrid1.Invalidate;
  CheckComplete();
end;


429 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:34:16 ]
>>417
7行スレで盛り上がりそうな内容だなw

430 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 17:46:32 ]
25ボタンの処理を全部書くことで初心者でも作れてしまうが、まじめにやれば7行に・・・・なるな多分



431 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:00:38 ]
>>157
D6からそうなったのか?
パスなしだとWINDOWSフォルダにつくられるんじゃなかった?

432 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:01:27 ]
未読位置を間違えてロングパスを放ってしまったorz

433 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 01:31:13 ]
>>417
作れたは良いんだがクリアできない
なんかコツとかある?勿論クリアするね

434 名前:デフォルトの名無しさん [2007/12/13(木) 23:00:31 ]
TMEMOの任意の行を削除するにはどうしたらいいの?

435 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 23:09:52 ]
>>434
TMemo.Lines.Delete

436 名前:434 [2007/12/14(金) 06:52:10 ]
>>435

ありがとう。

ごめん、質問間違えた。
あるデータと一致する行を削除 だった。
listboxだったらitems.indexとかで簡単にできるけど

437 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 22:58:42 ]
>>436
TMemo.Lines.IndexOf

438 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 19:30:52 ]
BDS2007を使っているんですが、コード補完機能って、すごーく
時間がかかるものなのでしょうか?
HDアクセスしまくりで、VS2005のそれとは比較にならない程遅いのですが。
それとも何か設定等が悪いのでしょうか?

OSはWinXP, メモリは2Gです。よろしくお願い致します。


439 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 18:36:32 ]
コンポを大量インスコしてるとか

440 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:47:31 ]
普段使わないコンポはチェック外しておくとロード時間が劇的に短くなる。



441 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:13:59 ]
普段使うコンポはチェック外さないでおくとロード時間がものすごく長い。

442 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:06:02 ]
最新式マシンに変えるとロード時間が劇的に短くなる。

443 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:49:05 ]
ちょっと前のマシンだとロード時間がはげしく長い。

444 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 02:11:10 ]
BDS2006で、PenD(3.0GHz) メモリ2G WinXPマシンでつこーてるが、
コード補完は、特に遅くないな。
ちなみに、起動時は、起動オプションで、Delphiのプロファイルのみ読み込み、
あと余計なDB周りのコンポなどもはずしてる。

しかしメモリ2Gで、ハードディスクカリカリは感がられんな
BDS2007が遅いということあるのかね

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を使用したいのですが何か良い方法
は無いのでしょうか?








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

前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