1 :
デフォルトの名無しさん :
04/01/19 23:50
2 :
デフォルトの名無しさん :04/01/19 23:51
このスレは、以前「くだすれDelphi Part○ (超初心者向け) 」とされていましたが、 タイトルを中・上級用相談室と統一しました。
6 :
デフォルトの名無しさん :04/01/20 00:20
87 :___ :03/09/28 22:25 Delphiスレは多すぎです。人気なんか全然ないのに。 スレッドの数をもっと減らしてください。
>>6 コピペへレスするのもなんだけど、中傷スレもあるからな〜
このスレとフサギコスレがあれば十分だ〜ね。
8 :
デフォルトの名無しさん :04/01/20 00:31
>>4 のとこの、
VCLを使わない〜Halbowさんのページが参考になります
↑これ、どーすんだろう?
(´-`)。o ○ (今更で既出しまくりだけど、 「チュートリアルから始めよう!アクションマネージャーが無い!?」 って大ポカは誰のせいだったんだろう?つーか、チェック漏れたのがスゴイな…)
そういやHalbowのページはどこへ移動したんだ。契約が切れるとかなんとかは聞いてたけど。 Delphi以外にも便利だったのに。
移動?移動なの?閉鎖じゃなくて?やめたんじゃなかったの?
閉鎖された
イラネ
14 :
デフォルトの名無しさん :04/01/20 06:17
ほかのアプリケーションのListViewから項目をとりだしたく SendMessage で LVM_GETITEM ($1005) を送りたいのですが Delphi でいうところの LVITEM構造体ってどんな名前 or あるのでしょうか?
>>14 他プロセスへポインタを送っても駄目だよ。
>>15 GlobalAllocで確保しても駄目?
17 :
デフォルトの名無しさん :04/01/20 08:55
19 :
デフォルトの名無しさん :04/01/20 10:09
Form1をメインフォームとして、Form1のCreate時に Form2上に置かれているチェックボックスの状態を知りたいのですが、 Form1がCreateされる前にForm2をCreateしたいと プロジェクトのソースを以下の順のように変更したら、 Form2がメインフォームになってしまうようです。 Application.CreateForm(TFrom2, Form2); Application.CreateForm(TForm1, Form1); プログラムの起動時にForm2の生成が終了してから Form1をCreateして、かつForm1がメインフォーム ということはどのようにすればよいでしょうか。
>>19 その前に、Form1がCreateされる前にForm2の状態を知りたいという
理由が知りたい。
20 に同意。あまりよくないスタイルである。 が、 Form1 := TForm1.Create(Application); Application.CreateForm(TFrom2, Form2); とすればよし。
22 :
デフォルトの名無しさん :04/01/20 10:31
CM_MOUSELEAVE というメッセージを捕まえて、コントロールからマウスが 離れた時の処理でバグがあるようなんです。 自作コンポでバグが発見されたので、自分のミスかと思っていたのですが、 Delphi自体でも同じ事が起こります。 どんなバグかを説明します。 コントロール上にマウスがある時にグラフィックに変化があるもの (IDEの「ファイル」「編集」とか)で再現できます。 「編集」メニューの上にマウスを移動させると、色が変わります。 この状態で、マウスポインタを素早く下に移動します。 この時、マウスの左クリックをします。 すると、かなりタイミングはシビアですが、色が変化せずにそのままの状態になります。 これ、なんとかならないでしょうか? フォームのアイドルで検出するのは嫌なんです。
23 :
デフォルトの名無しさん :04/01/20 10:35
>>20 ,
>>21 ありがとうございます。
Form2は設定画面で、Form2のCreate時にINIファイルを読み込んで
自身のコンポーネントの設定をしているからです。
こういう設計はあまりよくないのでしょうか。
>>23 良いか悪いかは別にして、俺のやり方。
・Iniの読み書きは1つのDataModuleにまとめる。
・起動時、Form1はそのIniModuleから読む。
・設定の場合、Form2のOnShowでIniModuleから読む。
・Form2でOKがクリックされたらIniModuleへ設定保存。
・Form2で設定が保存されたら、Form1はIniModuleから読み直す。
なんか無駄なことしてる気もするけど、ずっとこれで通してる。
少なくともForm1とForm2の起動順を入れ替える等、トリッキーな
ことはしなくていいし。
TMainMenuコンポーネントではこのバグ(?)は起こりませんでした。 そこで、このTMainMenuのマウスイン、アウト(エンター、リーブ)のイベントを まねしようかと思うのですが、VCLをいくら見ても分かりませんでした。 TMainMenuのマウスイン、アウト部分はどこに記述されているのでしょうか?
>>25 想像だけど、Windowsに記述されてるんじゃないの?
>>22 つまり altキーを1回押したのと同じかね?
>>26 げ。それじゃあマネしようがないですね。
>>27 そうです。その状態になります。
自作コンポの方はAltキーに対応してないので、
マウスが乗ってないのに画像が変更されるのは具合が悪いんです。
>>23 オブジェクトの生成順序に依存するようなコードは読みづらいのでメンテしづらい。でバグが出る。
コメントをたっぷり入れるか、順序に依存しないようにコードを書き換える。
もちろんプログラムには何らかの「順序」が存在するわけだけどね。
20 さんの用に .INI 読み出しをそれぞれのクラスの生成から分離/独立させるのが
わかりやすいでしょう。
データモジュールはフォームのように扱えるけど MainForm にはなりませんから、こういった
用途にはうってつけ。
シングルトンになるように配慮したグローバル変数(の用に見える関数/プロパティ)というのも
よく使われる技法です。TPrinter の Printer あたりが例。
>>25 TMainMenuはWindows側で処理されてるのでいくら探してもみつからないはず。
CM_MOUSELEAVEは既にIdleで処理されているよ。
TApplicaitonのPeekMessageでメッセージキューが空の場合(即ちIdle時)に
ControlにCM_MOUSELEAVE、CM_MOUSEENTERは送られる。
そのあたりを見てたらなんかわかるかも。
>>30 有益な情報ありがとうございます。
なるほど、CM_MOUSELEAVEはTApplicationが飛ばしているメッセージなんですね。
ふむふむ・・・
え〜っと・・・・
わかりませんでした。_| ̄|○
コントロール自体にOnIdleを実装して、そこでマウスがコントロール上になかったら
CM_MOUSELEAVEを投げるようにしてやろうかと思ったけど、
OnIdleって実装できませんよね?
(実装できても、コントロール上のマウスのあり、なしを判定する方法が不明だし・・)
Application.OnIdle
>>32 constructor TMyCompo(AOwner: TComponent);
begin
inherited Create(AOwner);
Application.OnIdle := Idle;
end;
ってやるんですか?
でもこれだと、フォームのクリエイトで
Application.OnIdle := Form1OnIdle;
ってやると、無効になりませんか?
constructor TMyCompo.Create(AOwner: TComponent);
36 :
デフォルトの名無しさん :04/01/20 17:53
>>20 iniファイルを読み込んでFormに表示、Formでその内容を変更できる。
そんな汎用のコンポーネントを作ろうとして、同じ問題にぶつかりました。
>>36 そういったことを扱うために DataModule があるんだよ。
もっともっと使いなさい。
別にINIファイル扱うのにDataModuleなんていらないだろ。 unit化しておくだけで十分。
>>37 Formも含めて汎用のコンポーネントにしたかったんですが
Form1のOnCreateでIniから読み込まないと支障のあるプログラムを 書いてるんですか? 俺はOnShowで読めば済むようなプログラムばかりなんですが。
>>36 無くても作れると思うよ。
プロパティに iniファイルの名前、Memoコンポーネントを指定したら
TMemo.OnChangeを勝手に設定するコンポーネントだよね?
>>41 例えば、シリアル通信のコンポーネントでCreate時にdefault値を読み込んでおいて
プログラムで変更修正するようなものをつくるとか。
↑いざ、パッと書いてみてアレって思ったけど、 たしかそんな事をやろうとしてひっかかったです。
じゃ、こうしよう。 Form1.Createでiniを読み込む。 そのデータをForm1のパブリックで宣言したレコード型の構造体に、 がんがんいれてく。Form2は、Form1.Create時にCreateして構造体 のデータを参照する。
>>43 コンポーネントはCreate時に基本的に動いちゃいけないよ。
せめてLodedを待て
>>44 保存もするし、Form上で変更した値も使う。
でも最初に読んだiniの値をあちこちの各FormでCreate時に使いたいみたいな感じだったと思います。
で、
>>21 さんのようにやればOKだったのですが、
各FormのCreateの順番を意識させることになる汎用コンポはダサイな
と思ってやめたように思います。
>各FormでCreate時に使いたいみたいな
ぉ〜ぃ
>>41 の答えになってないぞー。
>>50 ShowしないFormもあったりShowの度では困るし、意味としてはCreateなので一番最初のShow時だけってするのもカコワルかなとか。
ほんとにそうだったかなと自問してました。
よく考えたらそんなに問題なくできそうな。。。。
アレ?最初のFormのCreate時にCreateされていればよさそうな。。
ただ、
>>20 さんと同じ問題をかかえたのがそんなようなことだった気がしただけですので
流してください。
54 :
デフォルトの名無しさん :04/01/20 19:41
特定の処理をきちんと待たせて処理させるにはどうしたら良いのでしょうか? FormにTimerとmemoを1個ずつおいて Procedure TForm1.Timer1timer begin memo1.lines.add('a'); sleep(1000); c(self); memo1.lines.add('c'); end; procedure TForm1.setC begin memo1.lines.add('b'); sleep(1000); end; aの表示の後、1秒待ってb、また1秒待ってcを表示させたいのにabcが同時に 一瞬で表示されてしまいます。 これを1秒ずつ待って表示させるにはどうしたら良いのでしょうか? Application.Processmessagesも試したのですが、うまくいきませんでした。
>>19 たぶんForm2をコンポとして使いたいということで、
悩んでるのかな?
この手は、たぶんソースと、何をしたいかを公開
しないと解決法はでなさげ。
そういう呼び出し時の問題うんぬんは、たぶん設計
が間違ってるからのような気がする。
だから、ソースとか、仕様が欲しいわけだが。
ほんとだ!! procedure TForm1.Button1Click(Sender: TObject); begin Self.Label1.Caption := 'test'; Sleep(1000); Self.Label1.Caption := 'test2'; Sleep(1000); self.Label1.Caption := 'test3' end; いきなりtest3が表示されてびっくりした。 1秒ごとにタイマーイベントを呼び出して、 次に表示する内容を生成すると同時に、 以前の内容を表示するようにしたら?
TTreeNodeを簡単に保存する方法ないでつか?
59 :
デフォルトの名無しさん :04/01/20 20:01
>>54 1秒のタイマーを作って、その中で フラグをもち
そのフラグによって 表示するものを変えればいい。
>>58 TTreeView.SaveToFile?
>>56 すみません、これは分かりやすくする為に単純化したのですが、実際は
スプラッシュウィンドウを表示している間は他の処理をさせたくないのに
他の処理が実行されてしまいます。
何か良い方法は無いでしょうか?
>>59 すみません、これはどういうことでしょうか?
>>58 オンメモリで退避するだけなら
SavedTreeNode := TTreeNodes.Create(nil);
SavedTreeNode.Assign( CurrentTreeNode )
フラグを使ってためしにやってみたら無限ループに陥ってしまいました。 Procedure TForm1.Timer1timer begin memo1.lines.add('a'); sleep(1000); while setsleep=false do begin sleep(100); end; c(self); memo1.lines.add('c'); end; procedure TForm1.setC begin memo1.lines.add('b'); sleep(1000); end; procedure TForm1.Timer2timer begin setsleep:=false; sleep(3000); setsleep:=true; end;
なんで、そんなわけわからんことするのか、 ちと悩むけど、フラグを持つってのは、だいたい ↓みたいな感じ。 procedure TForm1.Button1Click(Sender: TObject); begin fStatus := 0; Self.Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Self.Label1.Caption := IntToStr(fStatus); Self.fStatus := fStatus + 1; end;
66 :
デフォルトの名無しさん :04/01/20 21:52
便乗質問 Procedure AからProcedure Bを呼び出したときに Bの処理が終わるまで待たずにAが始まってしまうけど、Aに行儀良くBの処理が 終わるまで待たせるにはどうしたらいいの?
Windows API で使用するLVITEM構造体などはDelphiであらかじめ用意されて
いるのでしょうか? それとも自前で構造体を定義するのが普通なのでしょうか?
>>15 他プロセスに有効なメモリを確保して、そこのポインタ送るので大丈夫です。
あと、完全に処理が終わるのを待ちたいなら HogeResult := Hoge.Hoge(); HogeResult := Hoge2.Hoge(); とか、メソッドを実行した結果を待ってやって、 順番にこなしていけばいいんじゃないの? つか、一つのprocedureや、functionは 上から順番に実行されていくから、こんなこと しなくても処理が終わるまで待たされると想う けど。なぜ、sleepでまって表示されないかは 不明。TThread.executeでSleepしてsynchronize で表示させれば表示されるかも。 つまり、TThread以外でsleepって、実はそれほど つかっちゃいけないのかもしれん。
PBitデータをどうにかしてTImageに格納する方法はありますか? 逆のやり方も教えていただけると嬉しいです。
70 :
デフォルトの名無しさん :04/01/21 00:04
procedure TForm1.Button1Click(Sender: TObject); type TMyRecord = record Data1: Integer; Data2: Integer; end; PMyRecord = ^TMyRecord; TMyArray = array[0..9]of Integer; PMyArray = ^TMyArray; var r: PMyRecord; a: PMyArray; begin New(r); New(a); r.Data1 := 123; r^.Data2 := 234; a[1] := 345; a^[2] := 456; ShowMessageFmt('%d %d %d %d', [r^.Data1, r.Data2, a^[1], a[2]]); Dispose(r); Dispose(a); end; こののような場合、^を付けても付けなくても動くんですけど、どちらに統一すればいいのですか?
>>61 Form2をスプラッシュウィンドウ"風"にして
Form1のOnCreateで
Form2:=TForm2.Create(Self);//自動生成は外しておく
Form2.showmodal;
すればForm2が表示されている間はForm1の処理は停止する
ただ、スプラッシュウィンドウってのは初期化処理が長いときに
待ち時間の苦痛を緩和させるためのもののはず。
処理停止させたら意味ないような
>>55 私がやりたいことはForm1内では設定の読み出し以外の一切の管理はしないで
設定に関するもろもろの操作はForm2内ですべてまかないたいと思ったのです。
73 :
前スレ936 :04/01/21 00:46
前スレでQuickReportについて質問していた者です。 わからないことがでてきたのでまた質問させてください。 現在、 グループヘッダー(Enabred:=False) サブディティール(金額) グループフッター(金額の計) と配置しています。(グループ化は正常にできています) グループ条件の値によって、グループフッター.Enabled:=Falseにするコードを OnStartPageとOnEndPageに書きました。 しかし、最後のグループにだけ、条件が適用されません。 OnEndPageの該当行は通っています。 書くイベントを間違えているのでしょうか?
>>72 Form2で読み出せばいいんじゃないのか?
Form2からForm1のプロパティも操作して
>>22 その現象の本質は「クリック・ドラッグ中はMouseEnter,MouseLeaveといった
イベントは発生しない」ことによるものです。
(Menuは知らないが)そのコンポーネント上でクリックしてカーソルをそのまま
引きずってコンポーネントの外で指を離すと問題の現象が再現できるかと
思います。
で、その対処ですが、MouseEnter用フラグ、Mouse左ボタンDown用フラグを
用意しておき、MouseEnter,MouseLeave,MouseDown,MouseUp,MouseMoveの
各イベントメソッドをOverRideしてフラグを各自適切に制御しつつ描画を行って
ください。中でもMouseMoveのイベントメソッドが最も重要になるかと思います。
これ以上詳しい話になるとソースを見ないとちょっと難しいのでご容赦を。
77 :
デフォルトの名無しさん :04/01/21 10:16
デフォルトのプロジェクト名(Project1)で開発を進めていて、 途中からプロジェクト名(というか実行ファイル名)を変更したい時は どうすれば良いのでしょうか? 今は、Project1.exeという実行ファイル名を手作業で一回一回変更して 配布しているのですが、面倒です。
ファイル - プロジェクトに名前をつけて保存
Delphiを使ったオブジェクト指向の解説書ありませんか?
Delphiオブジェクト指向プログラミングって本
>>79 ソースを読むのが一番勉強になったりする。
82 :
デフォルトの名無しさん :04/01/21 16:12
EnableがFalseだと、 OnMouseMoveとかのイベントが呼ばれなくなりますが、 その動作を書いているのはどこなのでしょうか? (if Enable then begin FOnMouseMove; みたいにしてる部分です) おそらくTControlのどこかだと思うのですが見つかりませんでした)
トレースしろよ
呼ばれてないのか中身が空っぽなのか
>>84 EnabledがFalseになるとWindowsからのメッセージを受け取らなくなる=呼ばれていない
(ソースを追っかけるのはしんどそう)
試しにメインフォームのOnClickイベントハンドラになにかそれと分かるものを書いておいて
メインフォームにボタンを貼り付けて、そのボタンのEnabledをFalseにすると
ボタンをクリックしてもメインフォームのOnClickが呼び出されるよ。
86 :
デフォルトの名無しさん :04/01/21 23:58
メインメニューでショートカットキーが設定されてない項目に (Z)とか(Y)が勝手に割り振られないようにするにはどこの設定を変えればよいのでしょうか?
87 :
デフォルトの名無しさん :04/01/22 00:14
CriticalSectionはアプリケーション内で 必要な時点でその都度生成するものか、 グローバル変数にして、アプリケーション内で ひとつだけにして使いまわすものかどちらですか? またどちらでもよいのですか? その都度生成していたらパフォーマンスが 多少落ちるのでグローバルにしたほうがいいとか の意見もありましたら教えてください。
ちょっと愚痴なんだが聞いてくり このスレ(旧くだすれ)で、いろいろためになったので、 DelのMLにも期待して入ってみたんだけど、そうでも なかった・・・ なんか殺伐としてるけど、こっちの人のほうが答えが 明確だし、いろいろな意見が帰ってくるし勉強になるん だけど。 ちょっとMLにはがっかりだけど、ここで教えてくれる 皆さんには改めて感謝でつ。
89 :
デフォルトの名無しさん :04/01/22 01:00
>>86 AutoHotkeys→maManual
検索するとか、自分でいじくってみる癖を付けませう。
>>88 ML も 2ch も Nifty も。どれも器であってそれ以上のものではない。器を生かすのは
中に入っている人たちだ。(結構、回答者はオーバーラップしているはず)
2ch の殺伐さは社会の厳しさと同じもの。その代わりに活気と勢いがある。
今の Delphi-ML は、雑談すら許さぬ停滞した場だがそういった生ぬるい空気がよい人も多いのだ。
>>87 まず「排他制御のコントローラーを使いまわす」という行為は危険だと思う。一般論として。
意味的には管理対象スレッドが一つでも存在するならクリティカルセクションが必要となる。
スレッドはクラスの外側に位置するものなのだから、クラスの外側すなわちグローバルな
スコープにクリティカルセクション(管理クラス)がおかれることが多い。
アプリケーション起動時(スレッド作成の準備が整った時点)でクリティカルセクション作成。
終了時(すべてのスレッドが停止し、かつ新規にスレッドが作成されないように設定したあとで)
クリティカルセクション破棄。
これが簡単/確実では?
クリティカルセクションを保持することによるオーバーヘッドが気になる(こまめに破棄しなければいけない状態)って
ちょっと考えられないんだが。何千何万ものクリティカルセクションを作っているとか?
92 :
ちょっとまったぁ!!! :04/01/22 08:15
ちょっとケンカを売るようで申し訳ないけど
>>1 過去ログを整理して利用している人のことを考えたことある?
「Delphi相談室」は以前にもあっただろ?だから、前スレはそのスレッドを
参照してナンバリングするのがマナーではないかい?
「くだすれシリーズ」の名前を使わないなら、「その10」をつける意味がない。
かえって整理するとき混乱のもとになって、はっきり言って困ります。
以前の「相談室シリーズ」を継承しないなら「真(新)delphi相談室2004(その1)」
みたいなタイトルにして、「このスレッドは〜・・」のくだすれの巻頭言を
流用すべきではないとおもいます。前スレつくった人に失礼だよ。
スレタイごときでグダグダ言う奴は厨の証拠
94 :
デフォルトの名無しさん :04/01/22 08:22
仕事なり趣味なり、真剣に情報を収集している人以外を「厨」なり 何なり言ってください。
その程度、簡単な文字列処理で対応できないか? 2ch のメカニズム上、スレタイが揺らぐことは当たり前と考えるべきで それを考慮したシステムをとっとと作れ。よい勉強になるとおもうよ。
97 :
デフォルトの名無しさん :04/01/22 10:11
>>88 MLとはUsersGroupのDelphiMLのことかな?
かなり専門的でほとんどついていけないけど過去ログとか検索すると
色々ためになってる。質問して怒られでもしたの?
過去ログ嫁。 または Delphi とは無関係です。帰れ。 または お前の質問は間違っている。こうすればできる(と言って、たいてい Delphi を使わない、プログラムとは関係ない話が始まる) じゃないかな?
100 :
デフォルトの名無しさん :04/01/22 10:31
子windowにあるボタンを押すことはできないでしょうか? なんかenumなんとかっていうAPIを使ったらボタンのハンドルが取れるから ボタンと子windowのcaptionさえ分かれば出来ると聞いたのですが。 親windowのcaptionはMain,子windowのcaptionはstop、ボタンのcaptionはOKです。 親Windowを終了させたりとかはなんとか自分で調べてできるようになった のですがこれはどうしてもできないのでどなたか教えてください。
子window は自前のアプリ? ボタンを押す。と考えずに、そのボタンに関連付けられたイベントプロシージャを呼び出したら? 親/子window とも、他人のアプリ/ソースコードがないのであれば、 ボタンのハンドルに対して BN_CLICKED あたりを SendMessage で送り込めばよい。かな? 記憶で書いているので、後半は不正確。 まずは状況がどちらかはっきりさせてくれ
>>99 文字化け。ってどんな?少し詳細を教えてくれ。
.zip はダウンしたYo,
>>99 mysql_test_main ユニットを開いて、オブジェクトインスペクタで Report を選択。
それの Font プロパティが Courie New になっている。これは(WindowsXP 以前だと)
欧文しか表示できない固定幅フォントなので、これを
Name : "MS ゴシック"
Charset : Shift_JIS
に設定しなおす。
これで日本語が表示できるようになる。
これ以外の問題かな?
う〜んそれでも表示されない・・ 下が実行結果です。 (ここから) * Selected 10 rows (max.) from table "tb_02a0aa89" using SQL query "SELECT * FROM tb_02a0aa89 WHERE value >= 128 ORDER BY value LIMIT 10": id string val ------------------------ 019 9zOw4WuF=fh,C=}| 128 127 T0$1n%Iu\Z! 131 009 -(Qu4.K> 133 107 RXMal$ISs 134 (ここまで) perlで言うjcode.pl見たいな処理が必要とか?
>019 9zOw4WuF=fh,C=}| 128 これが Report に表示されるの? ほんとは何が出るはず? 一見、8ビット目をかっ飛ばしたように見えますが。
あのさ。 mysql_test_main.pas の294行目前後で、 テスト用のデータベースをつくり、128個のデータを挿入しています。 string 用のダミーデータは 8 から 16 文字までのランダムな英数字。 文字化けじゃなくて、ランダムなデータが入っているテスト DB に対する正しいクエリー結果 としか見えない。 すまんな。MySQL いれずにソースを読んだだけだ。
107 :
デフォルトの名無しさん :04/01/22 12:28
はてな? DDECilentConv でSetLinkで VisualBasicで書かれたDDE鯖とDDE通信を確立し DDEClientItem のDDEItemに代入LinkItemを設定する んだが代入されない。 DDEClientItem.DDEItem:='Linkitem'; を各所にばら撒いているんだが、ぜんぜんダメボ ddeman.pasとかddeml.pasみて DDEML???でJPHELP\win32api.hlpみたが泥沼にはまっていく もしかして、LinkitemのDDE鯖のマニュアルの誤植かナノカー
>>107 具体的なコードは?後、VB と Delphi のバージョン.
110 :
デフォルトの名無しさん :04/01/22 12:43
>>108 レスありがたやです。
with DdeClientConv1 do
begin
ConnectMode := ddeAutomatic;
ServiceApplication:=execpath;
if not SetLink('hogehoge','hogetopic') then
ShowMessage('hogehogeとのリンクができません')
end;
DDELinkItem1.DdeConv:=DdeClientConv1;
// リンクアイテムを定義
DDELinkItem1.DdeItem:='hogeitem';
ShowMessage('hogeitem is '+DDELinkItem1.DdeItem);//<-からっぽ
DDE鯖はVB6 で Delphiは5 ですた。
111 :
デフォルトの名無しさん :04/01/22 12:51
MLと2chを比較した場合、2chの欠点 スレが 埋まってしまった場合、datオチすると お金を払わないと開けない。 過去ログを読めといっても、読める過去ログが少なすぎる。 MLだと 入った時点では何もないが、それから蓄積していけば いくらか役に立つ データーベースとなる。
>>111 2ch や、US Borland Newsgroup では過去ログシステムが無いから、だれも
過去ログを読め。とはいわない。
同じ質問でも繰り返し答えがつく。異なる人が、さらに別の人から教わった知識に
新しい、その時代時代の知識を付加して伝えていく。
たまに書籍になったり、まとまって Web ページが出来たりするのだ。
115 :
デフォルトの名無しさん :04/01/22 13:05
Users Groupの場合、過去ログの検索があるので 入ってすぐでも使えるかと。
116 :
デフォルトの名無しさん :04/01/22 13:10
>>115 過去ログ検索はMLに入らなくても使えると思うが..
117 :
デフォルトの名無しさん :04/01/22 13:13
>>110 とりあえず Excel とつなげてみました。
Excel 2000 / Del7 / W2K
procedure TForm1.Button1Click(Sender: TObject);
begin
with DdeClientConv1 do
begin
ConnectMode := ddeAutomatic;
if not SetLink('Excel','[Book1]Sheet1') then
ShowMessage('Excel とのリンクができません')
end;
DDELinkItem1.DdeConv:=DdeClientConv1;
DdeLinkItem1.DdeItem :='R1C1';
ShowMessage('hogeitem is '+DDELinkItem1.DdeItem);
end;
DDELinkItem1.DdeItem は R1C1 のまま。
text は R1C1 セルの値がリアルタイムに入ります。
確認だけど、DDEClient の場合、値の変更をクライアントに伝えるのはサーバーの役目です。
サーバーにそういう機能がない場合、クライアントから RequestData なり ExecuteMacro を
呼び出して値を取り出さないといけないよ。
ddeman.pas読みまくり中です。
>>118 ありがとさんです。
基本的にddeclientitemのOnChangeイベントで戻り値を取ろうとし
DDEITEMプロペティでコケてますた。
VBでの呼び出しサンプルがくっついてるんですが、Object.Linkexecute
を使ってます。この辺はワケワカラン
ddeman.pasですが、ConvなんかのプロパをいじればDdeItemを''したり
してますが、とりあえず
ExecuteMacro かPokeData送って
RequestData で受ける方向で模索してみます。
あかんかったら、またきます。
120 :
デフォルトの名無しさん :04/01/22 14:34
うわ。1997 年。Delphi2 ! 古すぎてかびてるね Delphi2 の DDE にはバグがあるんで、適切なパッチを当てるか D3 以降を使うか。
VB の Linkexecute が Delphi の TDDEClientConv.ExecuteMacro だよ。 そのマクロ文字列が鍵かな?
124 :
デフォルトの名無しさん :04/01/22 15:02
内部コンポーネントを作る時(SetParentでうんぬん) 中村氏の本には、SetSubComponent(True);をいれろとあるけど DelphiWorldのコンポを見る限り、これ入れてない人多いね。 別に入れなくて支障ないのかな?
125 :
デフォルトの名無しさん :04/01/22 15:09
TEditにコンボボックスの▼を追加する時 type TDownButton = class( TSpeedButton ) constructor Create( AOwner:TComponent ); override; procedure Paint; override; end; 見たいなのを作って TEditの横にペタンとくっつける方法が一般的なのでしょうか?
SpeedButton
>>126 SpeedButtonですね
ありがとうございます
でも、XPのスタイルに対応するにはどうするのだろう?
TSpinEditで使用しているTSpinButtonは下記のような
感じで画像をロードしているようですが・・・
procedure TSpinButton.SetUpGlyph(Value: TBitmap);
begin
if Value <> nil then
FUpButton.Glyph := Value
else
begin
FUpButton.Glyph.Handle := LoadBitmap(HInstance, 'SpinUp');
FUpButton.NumGlyphs := 1;
FUpButton.Invalidate;
end;
end;
>>101 子Windowは他人のアプリです。
ハンドルが取れなくて。。。
▼の代わりに Marlett の '6' または 'u' を使うと、ビットマップより遙かにきれいだぞ
>>124 入れないと、サブコンポーネントの Published プロパティがオブジェクトインスペクタに
出てこなくなる。その場合親コンポで対応するプロパティを用意する必要がある。
そんだけ。
131 :
デフォルトの名無しさん :04/01/22 15:41
D6でMemCheckつけてTIdHTTP置いてコンパイルするだけ 種類: 不明 サイズ: 28 バイト バイナリ: D492450020711400FFFFFFFF00000000000000000000000000000000 不明なファイル : @System@@StartExe 関数 てなエラー吐きます。 ActiveXから取り込んだコンポーネントも同じようなエラー吐くんですが、 これはMemCheckがD6に対応してないだけと考えてOKですか?
>>129 すばらしいです!
これならコントロールのサイズが変わっても
綺麗に表示出来そうですね!
ありがとうございました!
気にしなくていいんじゃないの? バグがあると MemCheck に引っかかることがあるけど MemCheck に引っかかったからといってバグがあるわけではない。 System/StartExe ってことだから、MemCheck のメモリ監視ルーチンが停止した後に Delphi RTL がメモリを破棄しているんでしょう。で、MemCheck ではチェックできない。と。 MemCheck も Delphi でかかれているため、自ずと制限があることを忘れずに。
>>130 なるほど、そういうことでしたか・・・
その説明を受けて中村氏の本の一文
"内部コンポーネントのプロパティ/イベントを隠す必要になる。 "
"それはとてもめんどくさい"
の意味が理解できました
ありがとうございました
なんか、超初心者用。って感じじゃ無くなってきたなぁ... 各自、他のスレも使うようよろしく。回答者はどのスレも見てるよ。
137 :
デフォルトの名無しさん :04/01/22 16:22
TImageの画像データのバイナリデータにはどうやってアクセスできるのでしょうか? image1.LoadFromFile('test1.jpg'); とJpgファイルをロードして、そのデータをバイナリダンプしたいんです。 よろしくお願いします。
138 :
デフォルトの名無しさん :04/01/22 16:27
Pointer型変数のデータの両端にシングルクォーテーションを付けたいのですが、 どうすれば良いでしょうか? 現在は下記のようにやっていますが、StrCopyのところでアドレス違反が出ます。 GetMem(p,fsize); GetMem(pp,fsize + 4); fs.Read(p^,fsize); StrCopy(pp,PChar('''')); StrCopy(pp,p); StrCopy(pp,PChar('''')); SendData(pp);
139 :
デフォルトの名無しさん :04/01/22 16:38
>>135 質問者のレベルに合わせて回答しないと意味ないだろうね。
質問は、初心者もそうでない人も同様にするだろう。
ただし、回答は、初心者にわかるような回答をしないと意味がない。
質問のレベルに 初心者も何も無い。
>138 PCharにキャストしてるのがダメ。 あとStrCopyじゃなくてStrCatだろうね。 StrCopy(pp, ''''); StrCat(pp,p); StrCat(pp, '''');
>>137 今、手元ではテストできないのだが。
image1.SaveToStream( aMemoryStream );
For ind := 0 to aMemoryStream.Size do
aMemoryStream[ind];
って感じでうまくいくでしょう
143 :
デフォルトの名無しさん :04/01/22 18:03
ポインタのポインタって宣言できるよね。 あれと同じようにオブジェクト参照型の参照型って出来るかな?無理ぽ?
>>142 aMemoryStream[ind]
とやると「このクラスはデフォルトプロパティを持っていません」
と言われました。
ClientDataSetでXMLを扱うときにデータの検索方法は ループで回すしかないのでしょうか?
バイナリファイルの先頭に1バイトだけデータを追記したいのですが やっぱり下記手順でやるしか無いですか? ファイルのサイズが何十メガもあって、たった1バイト追加したいだけなのに つらいなぁ・・・ 手順 @作業用ファイルを開き1バイト書き込む Aバイナリファイルを全て読み込んで作業用ファイルに書き込む Bバイナリファイル削除 C作業用ファイルリネーム
>>144 var
Buffer : PByte;
Buffer *= PByte(aMemoryStream);
Buffer[Ind];
*= -> := です。
>>147 配列型が必要ですと言われました。
それと
aMemoryStream := TMemoryStream.create;
image1.SaveToStream( aMemoryStream );
Buffer := PByte(aMemoryStream);
としたら、aMemoryStreamインスタンスの先頭のアドレスが入ってこないですか?
>>146 OS のファイルシステムが途中にデータを追加するようなオペレーションを
サポートしていないからねぇ。
ひとつのファイルに複数のファイルを格納して管理したいのですが… サンプルになりそうなものはありますか? もしくはコンポーネントとか。 よくある、ゲームのアーカイブ形式みたいな感じでしょうか。 作ってるのはゲームじゃないんですけど。
こりはどうだ type TByteArray = array of byte; PByteArray = ^TByteArray; var a : TMemoryStream; b : TByteArray; begin a := TMemoryStream.Create; b := PByteArray(a.Memory)^; b[1] := 1;
>>145 ClientDataSet の XML って, 読み書き時のフォーマットが XML になっただけでしょ?
ClientDataSet に読み込ませれば普通の TTable の Find とかのメソッドが使えます。
そいういう質問ではないのかな?
>>143 ポインタは、ほかの何かを参照するポインタであると同時に、普通の型でもある。だから
>ポインタのポインタって宣言
できます。
type
PPointer = ^Pointer;
クラス参照型は、他のクラスを参照しているけれども自分自身はクラスではありません。
だからクラス参照型の二段重ねはできません。
もちろんクラス参照型をさすポインタ型や、クラス参照型の配列などは自由に定義できます。
type
cref = class of TForm;
pcref = ^cref;
う〜ん、やっぱりオブジェクト変数とポインタを組み合わせて使うしかないのかな。 考えてみればそんな構文用意されてないしね。 ありがと。
>>149 Buffer := PByte(aMemoryStream.Memory);
の間違いでしょう。
OnMouseMoveって、そのフォームやコンポーネントでしか効きませんよね。 アプリ共通のマウスイベントって無いんですか? ある領域に差し掛かったら特定の処理をさせて、 その領域を抜けたらまた別の処理、ということをやりたいので。
TApplicationEvents.OnMessageとか。
159 :
デフォルトの名無しさん :04/01/22 23:32
TTabControlをフォームに配置したのはいいのですが 2つ目以降のタブを編集することができないんですがどうすればいいんですか?
>>159 そのような場合はTPageControlを使ってください
>>159 おまいが使いたいのはTPageControlではないか?
負けた_| ̄|○
163 :
デフォルトの名無しさん :04/01/22 23:39
32*32のビットマップファイルの拡張子をICOに変えてアイコンにしようとしても アイコンイメージが不正です、と言われてエラーになってしまいます。 アイコンに登録するにはどうすれば良いのでしょうか?
ありがとうございます。 御指摘の通り使いたいのはTPageControlでした。 ややこしい名前つけてんじゃねーよ ヽ(`Д´)ノバーヤ
165 :
デフォルトの名無しさん :04/01/22 23:45
>>163 うわー…。
マジレスしていいんだよね?
アイコンエディタでアイコン作ってくれ。
アイコンとビットマップは違(略)
>>165 あの、イメージエディタってどうやって起動するの?
ヘルプにはイメージエディタのアイコンをクリックしろ、と書いてるけど
イメージエディタのアイコンなんてどこにも無いよ。
スタートメニューからDelphi関係は全部削除しててショートカットでDelphiは
起動してるんだけど、Image***って感じの実行ファイルはどこにも無かった。
Delphi立ち上げて「ツール」メニューの中を見ろ。 そこのまで削除してあったら、真の漢だ。
>>166 imagedit.exeがなければ、再インストール。
アイコンとビットマップの違いを知らん香具師がメニューを削除するなよ
という気もするが、まあ個人の自由だからな。
>>167 ネタじゃなくて無いっす。漢なのかな?(汗)
フリーのアイコンエディタを使って解決しますた。
でもいいのかな?(汗)
一行が256文字を超える文字列の配列を使いたいのですがどうしたらいいですか? var hairetu : array[1..20] of Ansistring; としてもhairetuに256文字以上代入しようとするとこれ以上入んねーよヴォケと 言われてエラーとなってしまいます。
>>170 Tstringlist じゃだめでつか
ごめんダメだね_| ̄|○
AnsiStringなら2GByteまで大丈夫なはずだが?
たしかstringもデフォルトで2Gじゃなかったっけか? でも試したけど確かに怒られるなぁ。何故だ
怒られる理由がわからないな・・・ pcharではどうだろう
>>158 さんくす。通りました。
でも「1 秒あたり何千ものメッセージを〜」って書いてあるんですが、大丈夫でしょうか。
全てのメッセージでカーソル位置比較してますけど…。
' ←これでHELPをひけば理解できる模様。 ''で扱える文字列の限界が255文字との事。
procedure TForm1.Button1Click(Sender: TObject); var a :array[0..1] of string; var b,c:string; begin b:='123456780 100桁略 1234567'; c:='8901205678 150桁略 901234567890'; a[0]:=b+c; memo1.Lines[0]:=a[0] end; たしかにこれは動いた。。。
ひとつの文字列リテラルの長さは最大 255. それより大きな文字列定数は、 s := 'xxxxx .... xxxxxxx' + 'xxxxx .... xxxxxxx' + 'xxxxx .... xxxxxxx' + 'xxxxx .... xxxxxxx'; って感じに並べる。 コンパイル時にひとつの文字列定数として処理されるので、オーバーヘッドはない
つまり配列なのが問題じゃなかったってことか?
''で囲むことが間違いなら、コンポを作って回避することも ムリってこと? つか、そんな長い文字列を代入することってあんまないけど、 それにしても・・・・
>>182 長くしてもコンパイラの負担になるだけだしね。たいていのコンパイラは何らかの制約を持っている。
C# では1行の最大は 2046 文字でした。
>>146 (2) のファイルを書き込む時に先頭1バイトにダミーを
いれておいて、後からそこに書き込む…じゃだめ?
それとも (2) は読み込むだけのファイルなのかな。
何10メガなら中間ファイルを作るより、ファイルマッピングしてメモリ上で移動した方が多少は速いんじゃないの? 昔なら、ブロックread して、1バイトシフトしながら書き込むような事をしたけど
>>185 最初から、1バイトだけ追加することがわかっているならね...
>>186 ファイルマッピングしても、結局やることは同じだから。
OS がやるか自分でやるかの違い。2G の壁を越えられないしね。
>>187 あっと
>>187 だけ読んで勘違いしたみたいだな。
>>146 のようにすると 1G のファイルなら作業用にもう1G必要になる。
ファイルのアロケート処理は結構重い処理だ。
だから昔は、移動するならブロックRead/Writeして移動していた。
1バイトなら、
1,Read/WriteでOpen
2, 1セクター読む(ブロックサイズはセクター単位にあわせた方がいいけど、別に2のべき乗ならかまわない)
3 1バイトブロック内のデータをズラす (余りバイトを入れて最後のバイトを余りバイトに移す)
4 1セクター書く
5 最終セクターの1つ前まで2,3,4繰り返す
6 最終セクターだけサイズを考慮して処理する
今でもこれは有効だけど、2G以内ならファイルマッピングしてまるでメモリのように
単純移動した方が楽だろうねという話。
189 :
デフォルトの名無しさん :04/01/23 10:24
レスありがとうございます。
>>156 ↓配列型が必要です。
for i := 0 to aMemoryStream.Size do begin
Buffer := PByte(aMemoryStream.Memory);
StrCat(p,PChar(Buffer[i]));
end;
>>152 type
TByteArray = Array of Byte;
PByteArray = ^TByteArray;
var
Buffer : TByteArray;
p : pointer;
for i := 0 to aMemoryStream.Size do begin
Buffer := PByteArray(aMemoryStream.Memory)^;//←実行時にアドレス違反
StrCat(p,PChar(Buffer[i]));
end;
う〜む。バイナリデータを扱うのってすごく難しいんですね〜。
190 :
デフォルトの名無しさん :04/01/23 11:58
ファイルからバイナリデータをロードして、それを加工したいのですが、 どうしても4バイトまでしか読み取れません。 var ms : TMemoryStream; p : pointer; ms := TMemoryStream.Create; try ms.LoadFromFile(FileName); ms.Seek(0,0); GetMem(p,ms.size);//ここで確保したサイズは64089 ms.ReadBuffer(p^,ms.size); finally ms.Free; end; size := SizeOf(p);//←なぜかここでは4になる。 どうすれば、64089バイトを変数pに接続できるでしょうか?
× ms.ReadBuffer(p^,ms.size); pointer型だからそういう事になる。 64089と決まっているなら buf: array [0..64089-1] of byte; とか buf:string; にして setlength(buf,ms_size); ms.ReadBuffer(PChar(buf)^,ms.size); とかの方が楽だと思うよ
センセー 他のアプリのエラーを自動で閉じるソフトを作りたいのですが ソフトそのものの終了は出来たのですがエラーだけを閉じる事が出来ません 誰かご教授お願いします。 //今の状態 var WinHnd,Hnd : Integer; count : integer; begin WinHnd := FindWindow(nil ,PChar(app)); if flag = 0 then begin if WinHnd <> 0 then begin Hnd :=GetProcByName(ExtractFileName(app2)); //if count > 50 then TerminateProcess(Hnd, 0); PostMessage(WinHnd, WM_CLOSE, 0, 0); PostMessage(WinHnd, WM_DESTROY, 0, 0); PostMessage(WinHnd, WM_QUIT, 0, 0); Application.ProcessMessages; Sleep(2000); TerminateProcess(Hnd, 0); Sleep(2000); end; end; end; //こんな感じ ソフトのタイトルとエラーウィンドウのキャプションは同じでした。
>>191 ご回答ありがとうございます。
ポインタ型を返す関数の中での処理なので、できればPointer型で対処したいのですが、
そうすると、すごく難しいのでしょうか?
教えて頂いた方法で試してみたのですが、
buf := 問題の関数;//ポインタ型で返ってくる
(処理)
FreeMem(buf);
↑開放した時にアドレス違反になります。
194 :
デフォルトの名無しさん :04/01/23 13:13
Formに乗っかっている全てのコンポーネントの OnMouseMoveのみをフラグで殺したいのですが、遣り方が分かりません。 たぶんWM_MOUSE_MOVEみたいなメッセージを無効に出来れば良いのだと思いますが、 遣り方を教えて下さい。 宜しくお願いします。
まず、Delphiとポインタに関する勉強をしたほうがよくないか? Delphi ポインタで検索するといろいろでてくるけど。 ポインタ型を返す関数の処理なら、使用した配列のポインタを 返してあげればいいだけのような気がするが・・・・ あと、varで配列としてすでにメモリを確保しているんだから、 解放不要だと思うのだが・・・
>>194 なんでそんなことを....
Application の OnMessage で WM_MOUSEMOVE の時に Handled に Trueをセットする。
これでアプリケーション全体で WM_MOUSEMOVE が止まる。
簡単に設定するには TApplicationEvent を使うとよい
便乗質問
>>197 CM_MOUSELEAVE
だったらどうやればできます?
>>199 TApplication.OnMessageはWindowsからメッセージが届いた場合に呼ばれる
イベント。
CM_MOUSELEAVE、CM_MOUSEENTERの場合はTApplicationがコントロール
に対して直接発行(Perform)する。メッセージキューを介さないので
OnMessageでCM_MOUSELEAVEを捕まえることは出来ない。
TApplication.HandleMessage
TApplication.Idle
TApplication.DoMouseIdle
あたりを参照。CM_MOUSELEAVEの発行を停止したりすることは無理だろう。
問題はCM_MOUSELEAVEが正しく発行されていない為に発生すると仮定すると、
TApplication.OnIdleで自前でCM_MOUSELEAVEを発行するしかないんじゃない
のかな。
>>202 _| ̄|○
詳細な説明ありがとうございます。
非常に分かりやすいです。
こうなったらVCLを直接改造し(略
SDKに関する質問です。
ウィンドウのクラスを作ろうとしていますが、
ウィンドウプロシージャをクラスのメソッド(wc.lpfnWndProc:
[email protected] )として
処理するとウィンドウを生成することが出来ないのですが、Delphiでは無理なのでしょうか?
Halbow氏のサイト(現在はMr.XRAY氏のサイトにあります)のコメントは既読です。
C++でやれ、と言われればそれまでなのですが...
C++ でのやり方がわかるのなら、Delphi でもできると思うけど? あなたの知識と理解度を知るために。 Halbow はなんと言っているのか(あなたの理解する言葉で)まとめなさい。
206 :
デフォルトの名無しさん :04/01/23 18:47
スレッドからフォームに文字列を送ろうとしています。 その文字列は、フォーム上のリストボックスに表示したいです。 という場合、WM_COPYDATAで送っても構わないでしょうか? やはりSynchronizeした手続きで送るべきなのでしょうか? よろしくおねがいします。
>>206 ?ひとつのアプリケーションの中で WM_COPYDATA?
しかも文字列?
なぜ WM_COPYDATA を使うという判断をしたのかしら?
Delにはstaticメンバは存在しない Delのクラス型変数は、実はポインタ。 varで宣言しても実体は作られない。
WM_COPYDATA は異なるプロセスにデータを送るための専用メッセージです。 現在の Windows の実装では、実はほとんどのメッセージを異なるプロセス(のウィンド)に 送ることができるのですが、WM_COPYDATA だけが動作を保障されています。 プロセスを越えるとメモリポインタが意味をなくすため(Win32 ではメモリ空間はプロセスごとに存在する) WM_COPYDATA で送ることができるデータはポインタを直接的にも間接的にも含んではいけません。 逆に同一プロセス内のスレッド間ならメッセージを使わなくても、豊富な排他制御オブジェクト(クリティカルセクションとか) で排他処理できますしメモリ空間も同一ですからポインタを直接渡すことができます。 なお、Synchronize メソッドは内部的にメッセージを送ることでスレッド間排他処理を行います。 これはプロセス内ではメッセージキューがシリアライズ(排他管理されているということ)されている ことを利用しています。 Synchronze で送っても性能的には大差ないと思いますよ。 それに、リストボックスは WM_COPYDATA を直接は処理できませんから結局ハンドラを 書かねばいけないわけで、それをやるくらいなら自分でクリティカルセクションでも作って 排他管理をしたほうが簡単ではないかな?
クリックした位置がある範囲にあった場合の処理で少々質問 (範囲はleft,topからright,bottomまでの四角形) OnMouseDownで、以下のコードよりもスマートな記述方法はありますか? if ((left <= X) and (right >= X)) and ((top <= Y) and (bottom >= Y)) then begin //処理 end;
>>Delにはstaticメンバは存在しない class procedure WndProc; >>Delのクラス型変数は、実はポインタ。 varで宣言しても実体は作られない。 それは C++ も同じ。継承によるメリットを前提にするからクラスを使うという流れで見れば C++ のインスタンスを静的に確保する意味はないでしょう?
Types.pas function PtInRect(const Rect: TRect; const P: TPoint): Boolean;
>>211 >継承によるメリットを前提にするからクラスを使うという流れで見れば
>C++ のインスタンスを静的に確保する意味はないでしょう?
これ、よくわからないので解説してもらえないですか?
すみません、わかりました。
>>208 自分へのレスと捕らえてよろしいでしょうか?
ということは、コンストラクタでウィンドウ生成(CreateWindow)した場合は
クラスメソッド(THoge.WndProc)の呼び出しよりWM_CREATEの発生が先ということですか。
Halbow氏のコメント通り、WM_CREATE(orWM_NCCREATE)は別のルーチンで捕まえて、
それ以後、メソッドで処理するということになりますね。
有難うございました。
>207 >なぜ WM_COPYDATA を使うという判断をしたのかしら? WM_COPYDATA で良いのなら procedure TMyThread.SendLog(Message: string); begin <色々> SendMessage(WM_COPYDATA, 〜); end; の1つで済むのですが、これがSynchronizeしなくてはならない場合 procedure TMyThread.SendLog(Message: string); begin FMessage:=Message; Synchronize(DoSendLog) end; procedure TMyThread.DoSendLog; begin if Assigned(FOnLog) then fOnLog(Self, FMessage); end; という感じで、Synchronize用の手続きが1つ増える上にログのイベントまで作らないといけないので、スレッドの作成時にイベントハンドラをセットしなきゃならないなら、WM_COPYDATAを受け取るハンドラを書いておくだけの方が少しは楽かなと思ったのです。
>209 ありがとうございます。勉強になりました。 リストボックスを、クリティカルセクションを持つコンポーネントとしたのですが、 procedure TMyThread.SendLog(Message: string) begin LogListBox.Lock; // <<--ここ try fLogMessage := Message; Synchronize(DoLogOut); finally LogListBox.UnLock; end; end; procedure TMyThread.DoLogOut; begin LogMessage(fLogMessage); end; スレッドがLockで待たされているときにスレッドのTerminateがおこなわれた場合どうなるのでしょうか?
訂正 procedure TMyThread.DoLogOut; begin LogListBox(fLogMessage); end;
219 :
デフォルトの名無しさん :04/01/23 20:12
ポインタAから10バイト読み出して使いたいのですがmemcpyみたいな関数ありませんか?
TerminateしてもTerminated変数がTrueになるだけなのはわかっていますが、 どうやってLockから抜け出せばよいのかがわかりませんという質問です。 たびたびすみません。
>219 PChar(ptrA)にキャストすれば、後はいかようにでも。
そんな心配しなくても処理を終わらせればいいんですよね。 杞憂でした。ありがとうございました。
>>193 関数内で確保したメモリをポインタ型で返すの?
>>190 のコードで
p : pointer; -> p : Pbyte; //pointer より PChar か PByte が良い
にすれば大丈夫だと思うよ。 PByteでもPCharでもPShortIntだったか PSmallIntだったかでも
で、もしかして
>>190 のコードでも動いてるんじゃないの?
SizeOf(p) は4 だけど 読み込んだサイズとこれとは関係ないよ
>223 未初期化・解放済みでゴミになってるポインタと 正しく構築されたオブジェクトを指してるポインタを区別したいんだろ。
228 :
デフォルトの名無しさん :04/01/23 22:19
前スレの終わりの方で232Cコンポを教えてもらったのだが、 Delの3.1とかには232Cコンポって入ってないですか? まだ、3.1使ってる人教えて下さい。
無料で使える音声認識ライブラリはありませんか? [いち]とか[に]とか数字だけ認識できればいいのですが・・・
Win32APIスレで今ちょうど誰かやってるよ。音声の
本当ですね!!誘導ありがとうございます。 ....でもDelphiで使うには難しそう(´・ω・`)
>>229 大学の卒研に使ったプログラムで良ければ…
>>228 Delphiに標準で232Cコンポが付いたことは一度もない。
接続してきたPCのMACアドレスを調べるソフトを作りたいんだけど、無理かな?
スレのキャプションが変わったからか、進行が速くなったか?
>>234 MACアドレスが必要なレベルの人なら無理じゃないと思いますが、
無理な人ならMACアドレスなんて必要ないような。。。
238 :
デフォルトの名無しさん :04/01/24 04:21
全角の文字を指定の半角に置き換える方法を教えてください。 CSV形式のファイルがあり、ファイルには、半角の文字がほとんどで 一部に全角の文字が混ざっています。 この全角の文字を取り除きすべて半角にしたいと考えています。 全角には、規定されている文字と規定外の文字があり 規定内 (例)全角 → 置き換える半角文字 パソコン → PC プリンタ → PRN 規定外 規定内以外 → すてべスペースに置き換える(全角1文字に半角スペース1文字) に置き換えたいと考えています。 やり方として、 1. ファイル読み込み 2. 規定内の文字を上から検索して置き換える。 (エディタのすべて置き換えと同じ処理ができれば・・・) 3. 全角の文字を探して、半角スペースに置き換える。 4. ファイルに保存する のようにしようと思いましたが、2. 3.のやり方がわかりません。 どのようにすれば良いか教えてください。 自分なりに調べましたが、全角の数字を半角の数字に置き換えるなどの処理はありましたが、 自分が使用したいものは見つかりませんでした。 今日はもう寝てしまいますが、よろしくお願いします。
>>238 TStringList.CommaText 使って置き換えるなり、半角スペースにするなりしろ。
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; というのがある。 この処理だけだったらCSVはTstringlistで読み込んでしまえば楽かとおもう。 これを使って行毎にループさせてやればよろし。 へたくそなので冗長かもしれんがちょっと書いてみた for i:= 0 to stringlist1.count-1 do begin stringlist1[i] := stringreplace(stringlist1[i],'パソコン','PC',[rfreplaceall]); end; これで2は出来た 3はオレには無理。
2 が出来るなら 3 も出来ないか? > 240
すべての「規定外」文字を 0x20 にするのか。 これは一文字ずつ判定していくしか無いでしょ。 例示されている「規定」文字列を見るに、複数の全角文字列のようだから規則性はなさそうで 正規表現も使えない。
パソコンみゅ! は'PCみゅ!'か全部#32にするのかあいまい。
>>241 ansicomparestr 使ってがんばったけどだめだった_| ̄|○後の人頼む
一行ずつ CommaText へぶち込め!
ByteType 関数で 1 バイトずつ調べるしかないんじゃないの?
248 :
デフォルトの名無しさん :04/01/24 10:22
めんどうくさいのでTemo.Tstringsで組んだ。 DDEの時にお世話でしたので procedure TForm1.Button1Click(Sender: TObject); var i,l:integer; tbuf:string; begin memo2.Lines.Clear; for i:=0 to memo1.Lines.count-1 do begin tbuf:=''; for l:=1 to Length(memo1.Lines[i]) do begin case ByteType(memo1.Lines[i],l) of mbSingleByte:tbuf:=tbuf+memo1.Lines[i][l]; mbLeadByte:tbuf:=tbuf+' '; end end; memo2.Lines.Add(tbuf); end; end;
Delで使えるアプリケーション間通信の方法は、どんな物があります?
なんでも。つかWin32APIスレ池
>>233 遅レス、スマソ
そうなんですか。
3.1の頃ならまだ、232c当たり前だから
有るかなと思った。
人の質問を真摯に聞かないばかりか嘘の情報を教えますか。 まったくDel厨は程度が低いですねぇ(藁
>>254 煽りをする人間は程度が高いかどうかについてどう思われますか?
256 :
デフォルトの名無しさん :04/01/24 23:07
Form1にPageControl1を置いてTabSheet1とTabSheet2を作ったまではよかったんだけど TabSheet2に置いたコントロールにアクセスできません。 Form1.〜 じゃダメなんですか?
>>256 tabsheetの上にbutton1を置いて試して見ましたが問題なくできました。 謎ですね。
再起動したら直りました。お騒がせして申し訳ない
259 :
デフォルトの名無しさん :04/01/25 10:35
QuickReportで、条件によりページフッターバンドを非表示にしたいのです。 しかし、非表示にしたバンド以降のページフッターバンドの計算結果に 非表示にしたページフッターバンドの計算結果がプラスされて表示されしまいます。 非表示の方法としては、 @Enabred=False AHeight = 0 の2通りを試してみたのですが、どちらも同じ結果でした。 非表示にしても、正しい計算結果を表示する方法はないでしょうか?
260 :
デフォルトの名無しさん :04/01/25 10:56
エディットボックスを100個くらい配置したのですが Edit1.text := data[1]; 〜 Edit100.text := data[100]; なんて力技じゃなくてもっとスマートな方法ありませんか?
FindComponent('Edit'+IntToStr(i)) as TEdit
262 :
デフォルトの名無しさん :04/01/25 11:09
他の起動中のアプリケーションのprocedureに文字列を渡したいのですが どのようにすればよいでしょうか。
>260 EditArr:array[1..100] of TEidt; みたいな配列を作っておいて、最初にセットしておくと、後々の処理が 楽になるよ。
264 :
デフォルトの名無しさん :04/01/25 13:52
しかしその前にエディットボックス100個って使う人の事考えているのかと・・・ StringGridで済むんじゃないのかと・・・
265 :
デフォルトの名無しさん :04/01/25 13:56
a = 1のときに001 a = 2のときに002... とするにはどうすればいいんでしょうか? 検索キーワードが思いつかないので困ってます
>>264 自分一人で使うなら問題なし。
俺、Formのサイズが249x637、一つのタブにTLabel128個(各々
ダブルクリックで状態を変える)、別のタブでTCheckBox64個、
共通のTListViewには100万行が表示される可能性もあるという、
他人には絶対使わせられないアプリを作って使ってる。
>>262 そのアプリにメッセージ(WM_COPYDATAかWM_SETTEXT)を送りつける。
添字が1からって違和感
今ServerSocket,ClientSocketを使ってチャットを作っています。 for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[i].SendText(Message); 多人数がルームに入って、全員への送信は上記の方法で出来たのですが、 ルーム内で特定の人だけにメッセージを送る方法が分かりません。 「ActiveConnections」の値を使用し場合、誰かが切断(退室)したら 変わってしまうし・・・どなたかご教授よろしくお願いします。
Connectionの中にRemoteAddressがあるけど、 それで判別するってのはどうよ? 同一IPの可能性がある場合には、SocketHandle でもいいんじゃないの?
>>265 FormatFloat('000', a);
>>264 グリッドにせずあえてコンボボックス200個置きましたが何か?
が、前にこのスレ見てる時WIN98では10個ほどで重いとか見て、げっ!98忘れてた!
で、試してみると起動の気配すらせずってのがありましたよ。
まさに馬鹿すぎですが2000専用となりました。
274 :
デフォルトの名無しさん :04/01/26 11:48
文字列を文字コードで扱うにはどうすれば良いでしょうか? 例えば"abcd"という文字列がある時、文字コードが61の時は41に変換すると いった事をする時、 s := 'abcd'; for i := 0 to 3 do if s[i] = 61 then s[i] := 41; こんな感じでやりたいのですが、どうすれば良いのか分かりません。 宜しくお願いします。
>>274 s := 'abcd';
for i := 1 to length(s) do
if s[i] = #61 then
s[i] := #41;
1、#64 は char(64) とも書ける
2、文字列を配列として使う時の添え字は1から
>>276 >1、#64 は char(64) とも書ける
>2、文字列を配列として使う時の添え字は1から
思いっきり知りませんでした。
ありがとうございます。
279 :
デフォルトの名無しさん :04/01/26 13:53
>>270 特定の人だけってどういうことよ。
送信先の情報のヘッダーをつけてやって 自分のところにきたかものかどうかを
そのヘッダーで判断して 違ったら捨てればいい。
280 :
デフォルトの名無しさん :04/01/26 14:12
binalyデータをjpeg画像として表示するにはどうすれば良いでしょうか? var p : pointer; begin p := LoadAndConvJpeg(FileName);//ここでjpeg画像をロードして、加工したデータへのポインタが返ってくる image1.picture.assign(p);//こんな感じで表示させたい。 end; 宜しくお願いします。
自作アプリのインストーラーを作成できるフリーソフトとかありませんか?(スレ違いかもしれんが) InstallShieldを使うほど大したアプリじゃないので、簡単に済ませたいんです。 自作のexeファイルをProgram Files以下のフォルダへコピーしてファイルの関連付けしてくれるだけでいいんです。
>>280 usesへjpegを追加する、だったかな。
>>283 それのjpegユニットのpng版ってないの?
独自にload/saveするのならみたことあるんだけどそれ面倒なので。
285 :
デフォルトの名無しさん :04/01/26 17:52
TThreadを継承したクラスを作って、デバッグしているのですが、 ブレークを貼ると30分ぐらい返って来なくなります。 Delphi7 Professionalです。 この問題は解決できないのでしょうか? (もしかして、こんな症状が出ているのは自分だけなのでしょうか?)
>>285 スレッドを使っていて、そのスレッドをデバッグしているときだけ?
スレッドを使っていて、メインスレッドにブレークポイントをおいた場合も?
それともスレッドを作っていなくても?
CPU は HyperThread を含むマルチスレッド対応ですか?
OS はなに?
ほとんど常に三つくらいのスレッドが動くプログラムを Pen4/HT と Pen2 Dual でデバッグしていますが
問題を感じたことはないです。
>>286 レスありがとうございます。
OSはWindowsXP HomeEditionで
CPUはPentium4 2.4G (not HT)です。
重くなるのはスレッドの開発をしている時に、ブレークポイントを置いた時(にそこを通った時)のみです。
ブレークはスレッド内の時のみで、関係のない部分にブレークを置いても問題ありません。
Form1にボタンが一つ、
スレッドはShowMessage('');(ちゃんとSynchronizeしてる)を表示したら終了する。
という簡単なものでも止まります。止まるというか超重くなるという感じです。
プログラムを終了させる為に、Delphiのメニューの「実行」をクリックすると
5〜10分後ぐらいにやっとメニューが開くので、「プログラムの終了」を押すと
終了します。その後ブレークを取って普通に開発できます。
(あたふたと、他の動作をすると、更に重くなりCtr+Alt+Delを押してもなかなか反応しません)
もしかして、こんな症状が出ているのは自分だけ?(^^;
>>287 某所や談話室でも出てたけどXPのバグ。
コントロールパネルから[地域と言語のオプション]-[テキストサービスと入力言語]-[詳細設定]の
[詳細なテキストサービスをオフにする]を有効にすると回避できる。
オフにしちゃうとアプリ切り替えのZオーダーが動きが変になっちゃうが、XPで安定したデバッグが行いたいなら仕方ないしなあ。
Delphi8でもこの問題が起きるかどうか気になる。
289 :
デフォルトの名無しさん :04/01/26 21:26
>>271 単純に下記のようにしていいのでしょうか?全然違ってたらすみません。
コネクトがあった時に
User[1].Address := RemoteAddress;
送信時
for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
if ServerSocket1.Socket.Connections[i].RemoteAddress = User[1].Address then
ServerSocket1.Socket.Connections[i].SendText(Message);
>>279 >特定の人だけってどういうことよ。
いわゆる耳打ちです。
クライアント側でデータを破棄する方法だと、数百人が同じ部屋にいた場合
無駄なデータ送信量が増えると思うのですが。
ダウンロードクリックすると404になるよ
>>274 StringReplace('abcd', #61, #41, [rfReplaceAll]) じゃだめかぇ ?
(uses SysUtils がいるけど。)
s := 'abcd'; for i := 1 to 3+1 do if s[i] = #61 then s[i] := #41; // #xxはChr(xx), Char(xx)でも可
>>289 TServerSockerは使用したことないので、下記のようにしていいのでしょうか?
と言われても正直わからん。
だけど、それでうまくいけばいいんじゃないの?
Connections[SocketHandle].SendText
Connections[IPAddress].SendText
とか、そういう送信の方法がなければ、そのアドレスから判別して送信する
しかないと思うんだけど。
当然、、現在の接続してるユーザに関する情報を持っているだろうから、
(User[1].AddressというRecord型を持っていることからもわかるけど)、
それでいいと思うけど。
ただ、そのiとTUserの配列の数字が一致してれば楽だよね。
295 :
デフォルトの名無しさん :04/01/26 23:41
二つのバイナリファイルを結合して1つのファイルにしたいのですが 以下のような処理だと速度が遅いです。何か他にいい方法はありますでしょうか? ファイルAとBを結合してファイルCを作成する場合 1.FileOpen関数でファイルA,B,Cを開く 2.バッファを4096バイト用意 buf:array[1..4096] of char; 3.以下処理 repeat rsize := FileRead(fileA, Buf, sizeof(Buf)); filewrite(fileC , Buf, rsize); until(sizeof(Buf) <> rsize); repeat rsize := FileRead(fileB, Buf, sizeof(Buf)); filewrite(fileC , Buf, rsize); until(sizeof(Buf) <> rsize);
f1 := TFileStream.Create('file1',fmOpenRead); f2 := TFileStream.Create('file2',fmOpenRead); f3 := TFileStream.Create('file3',fmCreate); f3.CopyFrom(f1,f1.Size); f3.CopyFrom(f2,f2.Size); f1.Free; f2.Free; f3.Free; じゃ駄目?
>>296 ありがとうございます。ちょっとやってみます。
>239-248 ありがとうございます。 理解するのに時間がかかりましたが、 希望通りのものが出来ました。
299 :
デフォルトの名無しさん :04/01/27 00:01
DelphiでF9を押すとごくたまに EINOUTERRORの例外を発生しました。I/Oエラー(32)と表示されてしまいます。 OKボタンを押すと stlist:=TStringList.create; stlist.loadfromfile(kk); s:=Fileage(kk); ←この行がブルーバック表示になっている 上記の状態で帰ってくるのですが、これはLoadFromFileの行で共有違反の エラーが発生していると言うことでしょうか?それともFileAgeの行で エラーが発生していると言うことでしょうか? プログラムを走らせていると2時間に1回ぐらいのペースでしか発生しないエラー なので原因が分からずずっと悩んでます。
FileAge でしょ。 Flushしないと駄目なのか?
301 :
デフォルトの名無しさん :04/01/27 00:12
質問です。 舶来品のアプリでも、時々ダイアログの「キャンセル」ボタンや、ウィザードの「次へ」ボタンが 日本語になっていることがありますが、あれはどのようなカラクリになっているんでしょうか? Delphiであのようなダイアログやウィザードは作れないのですか?
>>300 レスありがとうございます。
Flushしないと駄目と言うのはどういう意味でしょうか?
303 :
デフォルトの名無しさん :04/01/27 00:48
窓をリサイズするとき、 (1)リサイズ中の処理(ドラッグ中)と (2)リサイズ後の処理(ドラッグをやめたとき)を 別々に記述したいのですが、、、、、、 (1)はOnResizeを使用すれば実現できることがわかりました。 (2)をやる方法がいまいちよくわかりません。 (2)を行うイベントは無いのでしょうか?」 (1)は荒くてもよいから画面のサイズに合わせて高速に描画して、 (2)で綺麗に再描画しなおすってな処理をやりたくて質問しました。 よろしくお願いします。
MFCのアプリならそういうのもあるけど、Delの場合だと無理だな。 ただし、代替手段ならいくらでもある。ヘルプの国際化対応の項目をみれ。
305 :
デフォルトの名無しさん :04/01/27 01:04
function func(): Integer; begin with FindComponent('Edit1') as TEdit do text := 'test'; Result :=0; end; procedure TForm1.Button1Click(Sender: TObject); begin func(); end; って感じでやりたいんですがFindComponentが未定義の識別子って 言われるのを解決するにはどうやればいいんでしょうか?
メソッドにするかオブジェクトを指定してください。
「未定義の識別子」って始めたばっかりの頃に「何?」って思うよな。 オレもそうだった(藁
>>303 type
TWMExitSizeMove = TWMNoParams;
TForm1 = class(TForm)
procedure FormResize(Sender: TObject);
private
procedure WMExitSizeMove(var Message: TWMExitSizeMove); message WM_EXITSIZEMOVE;
public
end;
WMExitSizeMoveにリサイズ後の処理を書くといいと思うよん。
TFileStreamで指定バイト目から指定バイト読み込んでMemo1に貼り付けようとしてるんですが… とりあえずできてはいるんですけど、もう少しなんとかならないものかと。 buffer : array[0..65535] of Byte; FileStream.Read(buffer,count); と、これで読み込んでTMemoryStreamに放り込んでます。 それからMemo1.Lines.LoadFromStream(MemoryStream) もっと簡単にできますか?
何を作っているのかによって教えてあげる
>>288 おおおお!!直ったぁああ!!
ありあとうございます!!
MS-IME 使わない。という選択肢もあるかと思う。 けど D7 で起きるんだよね.... おかしいなぁ。
313 :
デフォルトの名無しさん :04/01/27 11:48
オルトキーの設定したボタンと ストリンググリッド(何も設定しないでそのまま)をFormに貼り付けて実行した場合、 ストリンググリッドにフォーカスを移動させて 対応するオルトキーの オルトを 押さないで キーだけ 押すと 反応するのですが、これは仕様でしょうか?
>309 こーゆーんではダメなの? MemoryStream.Position:= 0; MemoryStream.Size:= count; MemoryStream.CopyFrom(FileStream, count);
315 :
デフォルトの名無しさん :04/01/27 14:54
TCustomControを継承して その内部にTEdit等のコントロールを複数作ったコントロールを作っています そこで、親のプロパティのHintが書き換えられた時 子のプロパティのHintも書き換えたい(親のコントロールと同期をとりたい) のですがプロパティの継承はどのようにするのでしょう?
>>310 295とは違いますけど、同じことをしようとしてます。
ふたつの以上のファイルを結合して、それを分解。
>>314 ありがとうございます。
やっぱりこれでも大丈夫ですよねぇ。
でもMemo1にLoadFromStreamとしても…って。
あー…ボケてました。TStreamに読み込んだらposition変わるんだった。
seekなりpositionなりしないといかんですよ…。
ごめんなさいー…。
317 :
デフォルトの名無しさん :04/01/27 16:16
Editに複数行表示させたいのですが、 どうすればよいでしょうか。 まさにくだらない質問ですいません。
Memoをつかう
319 :
デフォルトの名無しさん :04/01/27 16:28
8bit bitmapを32bit bitmapにコピーしようとしています。 例えば、8bit bitmapの$100に指定されているパレットの色にアクセス するためにはどうすればよいのでしょうか?
間違えました。 $100 -> 100
>>296 やってみましたが速度的には変化なかったです・・・。
同じ機能を持ったTOOL、おそらくVCで作られた物だと
かなり高速に処理されるんですが。。
Delphiだと駄目なのかな〜。
iostream
ごめんなさい、自己解決しました。 ----- pal: TPaletteEntry; GetPaletteEntries(BMP.Palette, 100, 1, pal);
325 :
デフォルトの名無しさん :04/01/27 19:55
IncDayというのはありますが、DecDayのようなものは ないようです。 1日前の日付とその日付が実際に存在するかどうか調べるには どのよようにしたらよいでしょうか。 どうかお知恵をお貸しください。
>>325 1日前があるもなにも、TDateTime の整数部は日付、小数部は時刻 じゃなかった?
>>325 そこまで知ってるならヘルプ読めば書いてあるんだけどな。
IncDay(hoge, -1);
328 :
デフォルトの名無しさん :04/01/27 20:16
>>308 ありがとうございました。
リサイズ後にだけ実行する処理を記述することができましが。
が、、、画面の最大化ボタンを押してリサイズした時は、ダメなんですね。
トホホ。。。
Windowsの仕様なのかDelphiの仕様なのかわかりませんが
きたない仕様です。。。
>>305 FindComponentってのはForm1のメソッドだ(Form1.FindComponent)。
しかし「function func()」は、Form1の関数ではない(Form1の管理下にない)。
だから、FindComponentが未定義だと怒られるのだ。
これを解決するには、funcをForm1の管理下に置いてやればいい。
すなわち、
function Form1.func(): integer;
と定義する。ただしこれだけだとまだエラーになる。ずっと上の方に
private
{ Private 宣言 }
てのがあるから、そこに
private
{ Private 宣言 }
function func(): integer;
と付け加えてやる。これで完璧。
ま、今は理由がよく分からなくてもそのうち分かるようになるから、
とりあえず上の方法で乗り切れ。
>>330 ある時、目の前のモヤがはれるように
わかるようになるんだよね
不思議なもんだ。
>>322 差し支えなければ、速いってソフトはどんなソフトなのか教えてちょ。
Delのファイル処理は遅いと聞いたことがある。 全部APIだけで書けば改善されるかも。
ファイル結合なら、コマンドラインで copy /b file1+file2 file3 でおーけー。
こういうゴッソリとファイルを読み書きするのでも バッファの有無って効いてくるのかなあ? あまり大きいファイルは読み書きしたことがないので。
シーケンシャルリードライトならバッファはむしろ要らない。 BlockRead/Write使っとけ。
読み書きの始め/終わりが軽くなるだけだがでかいファイル相手でも MSCDEX → MSCDEX+SMARTDRV 程度には効く。
ファイルの読み書き速度は、APIを呼ぶ回数が多ければ遅くなる。 それでバッファは2KBあたりから増やしても変化がなくなる。 というベンチマークの結果があったとさ。 どのくらい遅いか質問者は具体的に何にも書いてないけど 実は自分のコードに原因があることはよくあるので確認してみては? 高速化は実際に遅い部分をいじらないと速くなりませんよ。
341 :
デフォルトの名無しさん :04/01/27 23:47
他のファイルからソースをカット&ペーストしたのですが、するとコンパイル しようとすると行が長すぎます。最大1023文字 と言うエラーが起きます。 その行を削除して、再度その行の内容を手打ちして再コンパイルしても同じです。 これの回避策は無いでしょうか?
改行にCRが無いだけなので 他のエディタで開いて保存しなおせばいい
シーケンシャルの場合 バッファリングは余計な処理なので絶対に遅くなる
>>342 エラーの起きている行を秀丸にコピーしてみたのですが、CRはきちんと入ってます。
念の為、リターンキーを押した上で再コピーしてみたのですが、NGでした。
その行を削除して再度手打ちで打ち直しても駄目です。
var s: string; begin fs := TFileStream.Create(...); try SetLength(s, size); fs.ReadBuffer(PChar(s)^, size); Memo1.Lines.Add(s); finally fs.Free; end;
バイナリエディタで見てみなさいよ
>>346 何度もどうも。
見てみたけどちゃんと0D 0Aが入ってました。
何ででしょ?
>>347 そのソース、ここに貼るわけにはいかないのか?
なるべく小出しにした方が スレが盛り上がってるように見えるだろ?
>>349 そいつは気がつかなかったよ。
おまい、頭いいな。
これぐらいで勘弁してください。
>>299 エクスプローラーから実行したときは問題無いの?
>>343 まとめて読み書きするより、1バイトずつのほうが速いのかい?
353 :
デフォルトの名無しさん :04/01/28 04:04
korekara
これからDelphiのPersonal6ダウソするんですが、アップデートファイルは Delphi 6 RTL アップデート #2のDelphi 6 Personal del6_per_rtl2_jp.exe と Delphi 6 Update Pack 2のDelphi 6 delphi6update2.exe で いいんでしょうか?
情報を小出しにしているつもりは全く無いんですけどね。 そのときに必要な情報はすべて出しているつもりです。 ということでコピペします。 Case dayofweek(now) of 1:begin if (runningflag=false) and (time>Encodetime(05,0,0,0) then begin runningflag:=true; Setquit(1); keybd_event(VK_ESCAPE, 0, 0, 0); keybd_event(VK_ESCAPE, 0,KEYEVENTF_KEYUP, 0); Wnd:= FindWindow(Nil,'J''s'); if Wnd =0 then begin Richedit1.Lines.Add(FormatDateTime('yyyy/mm/dd hh:mm:ss',NowTime)+',Program is Not Found'); errorflag:=true; exit; end;
>>355 わからんなあ。
「end;」が足りないんだけど、その辺は大丈夫かい?
>>356 はい。endはきちんと入ってます。
該当するソースを手打ちしてもエラーが出るってのがどうしても、理解できなくて・・・
>if (runningflag=false) and (time>Encodetime(05,0,0,0) then thenの前に「)」が足りないけど、それでもダメなら全然違うところにエラーの 原因があるはず。そのコピペ部分より前を丹念に調べてみたら? たぶん文字列の定義周りじゃないかな?
359 :
デフォルトの名無しさん :04/01/28 11:26
//gomi.dpr program gomi; {$APPTYPE CONSOLE} uses sysutils; type janken=(goo,choki,pa); var aj:array of Janken; ai:array of integer; procedure moge (harry:array of janken); begin end; procedure hoge(harry:array of integer); begin end; begin {このコードは実行可能だが setlength(ai,0); hoge(ai); } //これはEAccessviolation setlength(aj,0); moge(aj); readln; end. オープン配列パラメータには要素数0の動的配列は渡すな ということですかね。 なかなか突き止められなかった…
そんなコードもかけないんならさっさとやめとけ。おまいにはHSPがおにあい
361 :
デフォルトの名無しさん :04/01/28 12:27
オープン配列パラメータは値パラメータ渡しの時は High()とLow()をみてその間にあるやつをスタックに 積もうとしてそれでHigh()が-1なんでとんでもないところの値を スタックに積もうとしているのかと思ったけど あってるだろか var とか constつけたら出なくなった。 まあHSPでもやってるわ
少しわからないことが…… 例えば function TForm1.Load(F: String): TBitmap; var bmp: TBitmap; begin bmp := TBitmap.Create; bmp.LoadFromFile(F); Result := bmp; end; これを F := Load('hoge.bmp'); として呼び出した場合、Load関数内で使ったbmpはどうなるのでしょうか。 Createして、不要になったら解放、ですよね…… それともこのままで構わないとか?
363 :
デフォルトの名無しさん :04/01/28 18:36
画像を加工したいなと思い、試しに下記コードを書いたのですが、画像が崩れてしまいます。 PicxelFormatによってfor文以下を何か変えないといけないのでしょうか? ちなみにPicxelFormatはpf24bitです。 宜しくお願いします。 Image1.Picture.BitMap.width := Image.Width div scale; image1.Picture.BitMap.height := Image.Height div scale; image1.Picture.Bitmap.PixelFormat := Image.PixelFormat; image1.Picture.Bitmap.HandleType := Image.HandleType; image1.Picture.Bitmap.Palette:= Image.Palette; for y := 0 to (image1.Picture.BitMap.height * scale) -1 do begin P := image1.Picture.BitMap.ScanLine[y div scale]; for x := 0 to (image1.Picture.BitMap.width * scale) -1 do begin i := y* image1.Picture.BitMap.Width +x; P[x div scale] := PByteArray(pImage)^[i]; end; end;
あ、しまった。
>>363 のコードの変数scaleは無視して下さい。
これが無くても同じように画像は崩れています。
>>362 Fを使い終わったらF.Freeをするべき。
F.Freeとすれば、関数内でCreateしたものも解放されるということでしょうか。 Fは一時的な保存場所として確保したので、bmpはLoadで何度も呼ばれることになります。 F := Load('hoge.bmp'); BMP := F; F := Load('hoge2.bmp'); BMP2 := F; 例えは悪いですが、こんな感じに。 それともあらかじめ宣言しておいて、フォームのOnCreateあたりでLoadに使うbmpをCreateしたほうがいいのでしょうか? Fが使い終わったら、F共々解放、と。
>>366 >F.Freeとすれば、関数内でCreateしたものも解放されるということでしょうか。
される。
>F := Load('hoge.bmp');
>BMP := F;
>F := Load('hoge2.bmp');
>BMP2 := F;
この場合はBMPとBMP2をFreeすればおk。
>それともあらかじめ宣言しておいて、フォームのOnCreateあたりでLoadに
>使うbmpをCreateしたほうがいいのでしょうか?
BMP、BMP2がアプリ起動中ずっと必要ならば、OnCreateでTBitmap.Create。
OnDestroyでBMPどもをFree。
368 :
デフォルトの名無しさん :04/01/28 19:43
Fileを読み込もうとしてそのファイルが使用中だった場合、 サブルーチンを抜けるにはどうすれば良いのでしょうか?
>>368 Exit
では、なくて「ファイルが使用中かどうか知りたい」ではないのか?
{$I+}
中途半端な書き込みで失礼しました。 今はloadfromfileでファイルを読もうとするとファイルが使用中だったときに エラーでプログラムが停止してしまいます。 このようにファイルが使用中だったときにエラーを出さずにただサブルーチンから 抜け出すようにしたいのです。
try lfm except error!! end
>>373 Delphi上で実行してみるとやっぱり、ファイルを開けませんでした。と言う
エラーが出てしまいますけど、これはどうしようもないのでしょうか?
>>375 ツール→デバッガオプション→言語固有の例外
「追加」押して無視したい例外に追加
378 :
デフォルトの名無しさん :04/01/29 14:58
D5とD6やD7、D8ではメールの読み書きをするコンポーネントの 機能や使い易さは違いますか? それとも同じでしょうか?
379 :
デフォルトの名無しさん :04/01/29 15:37
raveデザイナってなんでしょうか?
380 :
デフォルトの名無しさん :04/01/29 16:51
aryは動的配列 aryAは静的配列 静的配列から動的配列に要素をコピーするにはどのようにするのでしょうか? 以下の用にするしか方法はないのでしょうか? SetLength(ary, High(aryA)); for i:=Low(aryA) to High(aryA) do //なんたらこうたら・・・配列に列挙型があると不便 ary := Copy(aryA)というような、文を望んでますが・・・
Move(aryA, ary, SizeOf(aryA)); でもうまくいかないなぁ〜 forで回すしかないのかな?
Safenyというソフトのログファイルを読み込もうとして気がついたのですが、 メモ帳では普通に読み込みできるのに、TFileStreamで読もうとすると、 別のプロセスで使用されてるというメッセージがでて読めません。 メモ帳で可能なのだから何か手段はあると思うのですが、 こういうファイルを読み込む手段を教えてください。
>>382 CreateでfmShareDenyNoneはどうよ?
>>380 点字を丹生売れれば埋けるようデス。
Move(aryA[0],ary[0],SizeOf(AY1));
↑0出なくとも言い。
×AY1
いまからDelphi始めようかと思ってたんだけれども 正直どうなのよ?
引数の三つめ、 SizeOf(Ary) じゃ駄目じゃない? SizeOf(Ary) * Length(Ary)かな?
>>386 趣味なら好きにしろ。
仕事につくためなら他の言語。
>>389 そーか..
まだ工房だからどうでもいいけどね、ってことでデル使います。
>>388 いえ、SizeOf(Ary)でうまくいってるようですよ
SizeOf(Ary) * Length(Ary)だと例外発生しましたです
>>388 SizeOf(AryA)でした(^^;
>>390 趣味でも、他の言語を知っておくことは大事だぞ。
Delphiだと、書けなくてもいいからC++を読めるようにしておくと
さまざまなサンプルを自分のものにできる。
>>381 Delphi6では、そのコードでうまく行ってますが。
>>394 type
TRec = record
RecA: String;
RecB: String;
end;
const
aryA: array[0..10] of TRec = (なんたらこうたら);
aryB: array[0..6] of TRec = (なんたらこうたら);
aryC: array[0..15] of TRec = (なんたらこうたら);
とした時
var
ary: array of TRec;
begin
SetLength(ary, Length(aryA));
Move(aryA, ary, SizeOf(aryA));
end;
でもうまくいきますか?
aryにアクセスすると、例外が飛んでくるのですが・・・
当方Delphi7Proです
>>395 失礼、テストしたコードが間違って多。前言撤回。
動的配列のaryは実はポインタだから、aryをvar引数として渡すと
型不一致になるのか
ary[0]を渡すと、Delphiがちゃんと参照渡しで処理してくれる訳だ
397 :
デフォルトの名無しさん :04/01/29 20:01
Del使いにオススメのWin32APIの本を教えて
Delphiでマウスクリックさせる事できるのでしょうか?
>>397 Cくらい読めるようになれ。
Halbow氏のページをとりあえず熟読せよ。
>>398 mouse_event
>>397 「Delphi Win32 API リファレンス」アスキー出版
ではどう?
MSDN Libraryで十分
402 :
デフォルトの名無しさん :04/01/29 23:01
Statusbarに statusbar1.Color:=clBtnFace; statusbar1.SimpleText:='正常処理中です。'; statusbar1.Update; と書いているのですが、最初のうちはきちんと表示されているのですが、 1分以上処理をさせているといつのまにか何も表示されないようになってしまいます。 ブレークポイントを設定してきちんと上に書いた行を処理していることを確認済み なのですが、どうしても表示できません。 何かチェックすること、あるいは表示する方法を知っていたら教えてください。
403 :
デフォルトの名無しさん :04/01/29 23:35
>>402 Refresh メソッドにしてみてもダメかね?
普通ならUpdateとかRefreshは不要だろ。 何のイベントでその処理をやらせているのか? エラーが起きたときだけ更新すれば良いととも思うし。
>>404 ループさせてると「不要」とは言い切れないと思うが。
ちょっと書き方が違ったかな? 「ループの中で表示させてる」のではないかと。
>>402 ステータスバーに限ったことではないが、
VCLでキャプション書き換えを繰り返すとそうなっちゃうよ。
だから、
if statusbar1.SimpleText<>s then statusubar1.SimpleText:=s;
などと、なるべく書き換え回数を減らす工夫をしてみなよ。
409 :
デフォルトの名無しさん :04/01/30 11:27
2つ教えてください。 1、NMPOP3でメールを受信すると日本語のメールが文字化けしてしまいます。 これをきちんと表示するにはどうしたら良いのでしょうか? 2、NMSMTPで日本語のメールを送る時にはcharsetを何に設定すれば良いのでしょうか?
検索したらNMPOP3は添付ファイルを必ず開いたり、日本語がまともに使えない などの問題があるみたいなので諦めました。 ほかにお薦めのメール受信コンポーネントがありましたら教えてください。
411 :
デフォルトの名無しさん :04/01/30 14:59
検索したらNMPOP3は添付ファイルを必ず開いたり、日本語がまともに使えない などの問題があるみたいなので諦めました。 ほかにお薦めのメール受信コンポーネントがありましたら教えてください。
412 :
デフォルトの名無しさん :04/01/30 15:00
2重カキコスマソ
TIdSMTP、TIdPOP3
>>402-407 返事がないけど勝手にフォロー。
XP は、アプリケーションが一定時間メッセージループに反応しないと「反応なし」と扱います。
そうなったアプリケーションに対して GDI を停止します。
勝手に暴走扱いにして、GDI に対するリソース消費を食い止める、お節介機能です。
そのため画面更新が行われなくなったように見えます。
>>414 そんなんじゃないよ。
やってみりゃわかるけど。
とりあえずフォームにステータスバーおいて、 タイマーで毎秒10回くらい statusbar1.SimpleText:='正常処理中です。'; statusbar1.Update; をやらせて丸一日ほっといてみな。 OSはXPでなくてもいい。 もっと速く結論出したきゃタイマーを細かくすればいい。 これならメッセージループがどうのこうのという話にはならない。
SimpleTextだと再描画してくれなかったような ためしにstatusbar.SimpleTextに文字列代入して表示させて他の窓で半分くらい隠してみれ 窓を取り除くと文字が切れちゃってるわな StatusBar.Panels[0].Text := '文字列'; なら再描画される
Repaintで解決。つーか、スレッド使えよ。今時GUIがロックするアプリなんて手抜きのツールぐらいだぜ。
>>393 一応C,HSP,RUBYと本を読んでみたけれども
Delphiが一番そそられたんで..
人気なかったのか(´・ω・`)
420 :
デフォルトの名無しさん :04/01/30 17:59
既にある色いがいにかえるにはどうしたらよいでしょうか?
TEdit のオブジェクト「edtHoge」には、OnKeyPress などのプロパティが あります。コードでこのプロパティを設定すれば、その内容のイベントハンドラ が動く、みたいな使い方はできるのでしょうか? もしそういう使い方ができるならば、簡単なサンプルなど見せて頂けると助かります。
イイタイコトがわからん edtHoge.Onclick := FormClick; こうでいいのか?
例えばですが、 function hander(???: ???): ???; begin // hoge end; というような、イベントハンドラを書いて、 edtHoge := TEdit.Create(Self); edtHoge.OnKeyPress := hander; というように設定して、イベント動かしたいのです。
procedure TForm1.hander(Sender: TObject; var Key: Char);
begin
// hoge
end;
edtHoge := TEdit.Create(Self);
edtHoge.OnKeyPress := hander;
>>420 Self.Color := $00??????;
オブジェクトインスペクタなら項目をダブルクリック
>>424 ウホッ、ありがとうございます。
型が TKeyPressEvent とかあったので、もう少しごちゃごちゃするのかと
思ってました。
426 :
デフォルトの名無しさん :04/01/30 21:36
エクセルのファイルの中身を取り出したいんだけど、 エクセルのファイルを解説しているホームページとか本とか知らない? 英語のページなら見つけたんだけど、英語苦手で。 スレ違いなら無視してくれ。
>>426 中身を取り出したいとは?
TExcelApplicationではダメなのか?
428 :
デフォルトの名無しさん :04/01/30 22:11
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin j:=0; for i:=0 to 10000000 do begin statusbar1.SimpleText:=(inttostr(j)); inc(j); end; end; 試しにやってみたら正常動作してるけど、Updateした回数じゃなくて時間で不具合が出るのか?
429 :
デフォルトの名無しさん :04/01/30 22:48
厨な質問で恐縮ですが。。 VBからdelphiで作成したdllを呼び出そうとしてます。 helpにある「dllの作成」のMinmaxを、そのままminmax.DLL として作成し、 vbで Private Declare Function DelfMin Lib "minmax.dll" (x As Long, y As Long) As Long で宣言して Function hogehoge MsgBox DelfMin(3, 2) end function とやってみたところ、 13232 と意味不明な数値が表示されます。 引数もわたってないようです。 何が間違ってるのでしょうか?
よう知らんけど呼び出し規約とかあってんの?
stdcall呼び出し規約をつけれ。
432 :
デフォルトの名無しさん :04/01/30 23:01
>>430 これがサンプルなのですが、そう思って、
library MinMax;
function Min(X, Y: Integer): Integer; stdcall;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; stdcall;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min,
Max;
begin
end.
stdcallを削除し、デフォルトのregisterにしてみたり、削除
してみたりしましたが変わりません。
うーん・・・悩んでます。。。。
433 :
デフォルトの名無しさん :04/01/30 23:08
あ!できた。。。 ByBalが必要だったのですね・・・ でも何でこんな物つけなきゃいけないんだろ?
index
なぜそんなにSimpleTextに固執するのかわからない
>>432 Del側の引数にvar が付いていない、またはVB側の引数にByValが付いていない。
Del(CやC++もだけど)の関数はデフォルトで「値渡し」だけど、VBの関数はデフォルトで「参照渡し」
先ほどの意味不明な数値は、変数の中身ではなく、変数があるアドレスです。
437 :
デフォルトの名無しさん :04/01/31 00:29
>>436 一つ勉強になりました。
VBで作成した共有関数を少しでも高速化、共通化したく
delphiに移植中です^^
また、教えてくださいね。
エクセルのファイル(ブック)から貼り付けてある図を 取り出したいのですが、TExcelApplicationってOLEを 簡単にする為のもので、エクセルが入ってないとだめですよね。 相手のPCにエクセルが入ってなくても、できるんですか? できるならTExcelApplicationを使いたいです。
Excelの入っていないマシンには Excel Viewerをダウンロードしろとメッセージを表示する。 だがこの手もバージョン違いですぐ使えなくなりそうだな。 OpenOfficeもOLEでの操作ができればいいんだが。
TWebBrowserコンポーネントの詳細を調べたいのですが、ドキュメントなどはどこを 探せばよいでしょうか。
またまた厨の質問で恐縮ですが、 VBからdelphiのDLLへ配列の受け渡しはできないのでしょうか? delphiのdllは配列宣言し type TarryWord = array[0..10] of pchar; function hogehoge(strWord :TarryWord;a,b,c;pchar):pchar; stdcall; で問題ないのですが、 VB側から配列に入れようと、バリアント型でも入れると落ちます。 hogehoge(ByVal arWord As Variant,・・・・・ 他の型もやってみましたがうまくできません 何が間違ってるのでしょう?
>hogehoge(ByVal arWord As Variant,・・・・・ ByRefでやってみたら通りました。 もう少しやってみます。 失礼しました。
>>443 これはActiveXだからなのか知りませんがヘルプにはありませんでした。
また、Googleで探してもごく1部についての説明しかしてないものがほとんどなため、
大本となるDocumentの所在がしりたいのですが・・・
やっぱりだめでした。。 hogehoge(ByRef arWord() As string,・・・・・ に変更し、配列を入れてみましたが、エラーで落ちます。 方法はないのでしょうか?
バリアント渡すなら受ける側もバリアントで作らなきゃ。 procedure HogeHoge(var Any : Variant); stdcall; var I : Integer; begin if VarIsArray(Any) then for I:= VarArrayLowBound(Any, 1) to VarArrayHighBound(Any, 1) do ShowMessage(Any[I]); end;
449 :
デフォルトの名無しさん :04/01/31 14:46
Win2000で、パラレルポートを1bit単位でON/OFFできる方法ってないでしょうか。 ちょいと制御用に使いたいので、PCの外部に向けて喋る機構が必要なのです・・・。
>>448 おおっ!
できました、ありがとうございます。
variant型なんてdelphiにあったんですね。型に厳しい
とのことだったので、全く頭にありませんでした。
また一つ勉強になりました。
仏の顔も三度まで ↓ Tread on a worm and it will turn ↓ 一寸の虫にも五分の魂
455 :
デフォルトの名無しさん :04/01/31 18:41
dlphiで、全半角を区別せずに置換するにはどのように すればいいのでしょうか? StringReplaceを使用してみると、大文字小文字は区別せずに できたのですが、半角全角の場合困ってます。 全部変換すればできますが効率が悪すぎます。 たとえば、2ch,2chは同じに扱いたいのです。 どのようにすればよいのでしょうか
>>442 DLL間で配列を受け渡しは非常に制約が多い。
Del同士ならともかく、それ以外の言語では出来ないと考えておいた方がよい。
こういう時はCの関数ライクにして、
第一引数を配列のポインタ、第二引数を配列のサイズにしる。
//コード霊 library dlltest; procedure Test(lpByteArray:PBYTE; nSize:BYTE);stdcall; var I:BYTE; begin for I:=0 to nSize - 1 do begin lpByteArray^ := I; Inc(lpByteArray); end; end; exports Test; begin end. --------------------------------------------------------------------------------------- Private Declare Sub Test Lib "dlltest.dll" (ByVal lpByteArray As Long, ByVal nSize As Byte) Private Sub Command1_Click() Dim A(0 To 9) As Byte Dim I As Integer Test VarPtr(A(0)), 10 For I = 0 To 9 Debug.Print A(I) Next I End Sub
>>455 効率が悪いのは変換コードに問題があるのでは。
try except文がちゃんと機能しているかどうか、確認してみると(StrToIntのところを何も入力しない) デバッグ時はエラーがでます・・・ コンパイルして実行ファイル動かすと、ちゃんとexceptが働いているのが分かりますが・・・ debagだから、例外時はエラーですか、そうですか
460 :
デフォルトの名無しさん :04/01/31 20:31
Googleでドラッグ&ドロップについて調べたのですがForm全体にドロップが有効になる奴ばかりサンプルとして転がってます。 フォームに貼り付けたテキストボックスとかリストボックスにだけドロップを有効にするにはどう書けばいいんでしょうか?
オーバーライドしたDestroyデストラクタで、inheritedを呼んだ後になんらかの 処理をするというのは、やらない方が良いことなのでしょうか?
>>462 普通に考えればその方が無難だと思うが?
スタティック領域だけで自インスタンスに全く関係無い
部分ならアクセスしてもいいかもしれないが
そういうコード見ると一抹の不安が残るよな。
>>417 Panels[0].textを使おうとしてもリストの範囲がインデックス・・・のエラーが出てしまいます。
>>418 >スレッド使えよ。今時GUIがロックするアプリなんて手抜きのツールぐらいだぜ。
スレッドを使えと言うのはどういう意味でしょうか?
良く分からないです。初心者でスマソ
>>454 。・゚・(ノД`)・゚・。アリガトー!!
>>163 TListを継承したクラスなんですけど、Clearをオーバーライドしていて、
そこで追加したフィールドオブジェクトもクリアしています。
でもTListのデストラクタ内でClearを呼んでいるので、デストラクタで
inhetritedする前にフィールドオブジェクトを開放してしまうとエラーが
でてしまいます。
回避策として、Clearをオーバーライドするときにフィールドオブジェクトが
有効か否かをチェックするのと、Destroyでinheritedをした後に
フィールドオブジェクトを開放するのと、どちらが良いのか迷ったので。
>>465 ヘルプのキーワード「ステータスバー」
ヘルプのキーワード「マルチスレッドアプリケーション」
469 :
デフォルトの名無しさん :04/01/31 22:11
a:=now; とするとaの中には1.669e-304という値が代入されますが、 外部のTDatetime変数からデータを受けると38067.916167 と言う値が返ってきます。 どちらもnowからデータを取っているはずなので今日の日付にならないといけないと 思うのですが、38000の方は1899年になってしまいます。 これを変換する方法がありましたら教えてください。
>>460 フォームのハンドルを指定している場所があると思うが、
それをテキストボックスとかリストボックスのハンドルにしてやればよい。
>>470 38000の方はIndyのTIdMessageのDate変数です。
1.6e-304の方はTDateTime型の変数aにnowを代入しただけです。
>>467 Destoryをオーバーライドして、そこにオーバーライドしたClear()と
inherited Destroyを書くんじゃだめなの?
38000とか1.6e-304というのは、どうやって確認した? デバッカか?
>>465 StatusBarをクリクリクリックしてみれ
>>474 デバッガでカーソルを変数に当てて確認しました。実際に
showmessage(datetimetostrで表示させてみると38000のほうは1899年に
1.6e-304の方は今日の表示になります。
>>473 inherited Destroy;を呼ぶと、内部でoverrideしたClearがもう一回呼ばれてしまうんですよ。
>外部のTDatetime変数からデータを受ける って何すか?
>>477 overrideでなくreintroduceではダメか?
>>478 スマソTDatetimeの型のプロパティっす。
>>474 逆じゃない?
TDateTime型は、1899年12月30日からの経過日数を実数型であらわしたものだから、
105年×365日=約38000日。
だから、38000の方が正常でちゃんと表示されているはず。
TIdMessageの使い方に問題はないか?
>>479 そすると、TList型の変数に代入してClearを実行すると、追加したオブジェクトが
クリアされない…。
Clearを実行するときCountが0にセットしておけは、 2回呼んでも問題ないんじゃないか? もしくは、inherited Clearすれば。
>>481 なんどもありがとう。
試しに
a:=now;
showmessage(datetimetostr(a));
ってコードを実行してもらえますか?
そしたら、aに1.6e-306が入ってるのにきちんと表示されるのが分かると思いますので。
>>484 おまい、a=nowにブレークポイント仕掛けてるだろ。
それは実行前に止まる。
showmessageに仕掛けてみ。
var a:TDateTime; begin a:=now; Beep; showmessage(datetimetostr(a)); end; を実行してBeepのところでaを調べたが、値は約38000だし、 今日の日付・時刻がちゃんと表示された。
えっえっ? Showmessageにブレークポイントは設定してないです。 試しにbeep;も入れてその行にブレークポイントを設定しましたけど同じです。
念のため、全く同じですが、ソースです。 procedure TMainForm.StartClick(Sender: TObject); var a:TDatetime; begin a:=now; beep; showmessage(datetimetostr(now)); end;
>>488 (datetimetostr(now));
はぁ?
490 :
デフォルトの名無しさん :04/01/31 23:31
>>465 張り付けたStatusBarをダブルクリック
↓
「StatusBarの編集」が出てくるから、「新規追加(Ins)」でPanels[0]を作成
ヘルプよく読めば分かるのに…。
最近、本当に読まない人多いなぁ。
あっ、ボケてた。 showmessage(datetimetostr(a))にしなきゃいけないのに。 おかしいと思って、OSを再起動したらうまくいったみたいです。 もうちょっと精査してみます。
>>489 でもカーソルをaに当てたら変な値になったのは間違いないんですよ。
OSかDelphiが悪さしていただけだったらいいのですが。
>>488 お前の目は節穴か
>>491 何がおかしいと思って、なぜ再起動したらうまくいったのか書いて見れ
とにかく問題を把握する努力をせよ
>>492 ×OSかDelphiが
○OSかDelphiか喪前が
>>487 >Showmessageにブレークポイントは設定してないです。
しろって言ってんだろ!
ブレークポイントが設定された行は実行する前に止まるんだよ。
つまりa:=nowに設定しても代入される前の値しか読めねーんだよ!
>>493 ×OSかDelphiが
×OSかDelphiか喪前が
○喪前が
>>493 馬鹿な間違いをしたnowの部分をaに変えて、
ブレークポイントを再設定しただけでDelphiが無反応になってしまったのですよ。
それでWin2kを再起動しました。
けど今も同じ症状っす。鬱
>>494 いや、だからbeep;に設定しています。
ぶっちゃけ俺はブレークポイントなんて使ったこと無い 使わずにどこがエラー吐いたか当てる これが最高 に効率悪い俺のやり方
卓上デバッグが最高だね。 最近の若い者ときたらまったくだらしない。
499 :
質問があります :04/02/01 11:27
最新バージョンに当たるDelphi8って.NET対応プログラムしか作れないのでしょうか?
DelphiはどこでDLすればいいのでしょうか? またそれはデモ版ですか? どなたか教えてください・・・
502 :
デフォルトの名無しさん :04/02/01 13:07
>>494 まあまあ。F8キーを押せば一行実行されるわけだし。
>>495 >>488 のソースを
a:=Now;
ShowMessage(DateTimeToStr(a));
ShowMessage(FloatToStr(a));
として実行したら、
'2004/02/01 12:56:00'
'38018.53〜'
となったけど、これが何かおかしいですか?
そのaって変数が、いろんなところで 使われてそうだなw
>>467 TList.NotifyをOverride。
第2引数がInDeletedの場合に追加したオブジェクトをFreeする。
TObjectList使った方がラクチンかもしれない。
505 :
デフォルトの名無しさん :04/02/01 14:51
TStringsのX番目の要素を取得するにはどうすればいいんですか? Getは抽象メソッドで実装がない云々〜と書かれていてよく分からないんですが… 具体的にはコンボボックスのX番目の文字列を取得したいです。
sl[X] sl.Items[X]
>>505 もしかしてTStrings.Createをしている?
508 :
デフォルトの名無しさん :04/02/01 17:26
ちょっと質問です。画像をスクロールさせようと思い 以下のようなコードを拾ってきました。 Bmp := Image1.Picture.Bitmap; W := Image1.left + Bmp.Width; H := Bmp.Height; LineBytes := Abs (Integer (Bmp.ScanLine [1]) - Integer (Bmp.ScanLine [0])); Line := AllocMem (LineBytes); Move ((Bmp.ScanLine [Bmp.Height - 1])^, Line^, LineBytes); for J := H-2 downto 0 do begin Move ((Bmp.ScanLine [J])^, (Bmp.ScanLine [J+1])^, LineBytes); end; Move (Line^, (Bmp.ScanLine [0])^, LineBytes); しかし、これでは処理が重く、実用的な速度になりません。 多分、1ラインずつデータを移動させているのが問題なのかと思い for文の箇所を次のように変更するとエラーとなりました。 Move ((Bmp.ScanLine [1])^, (Bmp.ScanLine [0])^, (LineBytes*(H-2))); 何か俺は致命的な勘違いでもしてるんでしょうか?
ありえないぐらい初歩的な質問で恐縮ですが、 自分が作ったプログラムをexeファイルに変換するには どうすればいいんですか? ヘルプを探したりはしたんですが見つからなくって…
実行する。 実行した瞬間(デフォルト設定なら)プロジェクトファイルを保存したディレクトリに出来上がっている。
>>504 私もTObjectListの方がいいように思います.
>>506 ItemsじゃなくてStringsですね.
>>508 キャンバスのCopyRectメソッド.もっと速くしたい場合はBitBlt APIかな?
>>509 [F9]か再生ボタンで実行するときに作られます.
VBと違いexeファイルを作らずに実行する事はありません.
>>508 TImage は Picture の内部データがわずかでも変更されるとコントロール全体を
再描画しようとするからじゃない?
単にスクロールしたように見せるだけなら、TPanel の上に TImage を配置して、
TPanel のウィンドウのクライアント領域からはみ出すように TImage の座標を
移動させるというのはどうでしょうか?
どうもありがとうございます。
TurboPascalのIDEはオンメモリで実行できたね。
>>502 どうも私のマシンが悪いみたいなのでOS再インスコしてきます。
皆さん、ありがとうございました。
どうしてもOSのせいにしたいのか
それだけなんか、自信があるんじゃないの? たぶん、どこか些細なことで間違ってるに1億人。
こういうタイプが一番厄介なんだよな 自分は正しいと盲信してる香具師 私的コトですが 「自分は以前惣菜屋でバイトしていたから料理は得意」とか言ってるパートのババァは見てらんない。 おにぎりなんて目分量で大きさバラバラですよ。量ってみろよ。 商売だってこと分かってるのかと。問いたい、問い詰めたい、小一時間問い詰めたい。 天ぷらなんかもうベチャベチャですよ。 さつまいもの天ぷらとイカの天ぷらの区別つきませんよ。 えび天なんて丸くなってもう何がなんだか。 お前な、ほんとに料理できるんかと。(略) そのくせ他人の悪口言ってんじゃねぇよ、ババァ。 他のパートのオバチャンいじめてんじゃねぇよ、ババァ。
IEから、画像や表を含む範囲選択し、Wordにコピペしたら出来ちゃいました。 これの中身を取得したいと思っています。 まず、クリップボード形式に何を指定すればいいかわからないので、 EnumClipboardFormatsでリストアップしてみたら、 C009、C10E、C299、C1D7、0001、000D、C297、C298、C00B、C004、C003、 C00E、0003、C013、0010、0007、000E と、いっぱいありました。 というところまでは自力で来ましたが、もうどうも出来ません。 詳しい方、なにか教えてください!
IDataObjectについて調べたほうが幸せになれるかも
//CF_HTML RegisterClipboardFormat('HTML Format');
522 :
デフォルトの名無しさん :04/02/02 14:30
背景透過できるラベルコンポーネントってないでしょうか? 例えば、Form1にImage1が貼ってあり、その上にラベルを貼り付けて 文字を表示すると、普通なら文字以外の背景は四角く塗りつぶされますが、 それを文字以外の場所には背景の絵が表示されるような事がやりたいです。 宜しくお願いします。
>>522 TLabelのTransparentをTrueじゃ駄目なの?
>>522 Transparent:=Trueでどうよ?
ちょっとは調べてほしかった
>>525 このスレでは回答・提案・ヒント等と「ヘルプ読め」「ぐぐれ」がよいかと。
ぐぐれカレー
529 :
デフォルトの名無しさん :04/02/02 15:23
StringGridにCheckboxを入れたいのですがどうすればいいでしょうか
・「すくすく」を使って短文を作りなさい。 僕はいつもお腹がすくすく。 ・「ぱっと」を使って短文を作りなさい。 あいつ絶対パット入れてるよ〜。 ・「ぐっと」を使って短文を作りなさい。 まぁまぁぐっといってくださいよ。ところで、例の話ですが…
>>529 //home1.infonia.ne.jp/~delphian/delphi/compo/LE0059.cgi/pldateedit.lzh?df=LE0059
これ落として02_StringGridのソースを見るべし
>すくすく 無理がある >ぱっと 答えの予想がつく >ぐっと それであってるのでは?
533 :
デフォルトの名無しさん :04/02/02 18:18
1年以上使ってて、さっき初めて気が付きました。 Delphi7です。 コードエディタの下のタブに「ダイアグラム」というタブがありますよね? これってなんなのでしょうか? 使いこなしている人っていますか? UMLではないし、どう使うんだろう・・・。
535 :
デフォルトの名無しさん :04/02/02 22:03
536 :
デフォルトの名無しさん :04/02/02 23:43
他のソフトのUpDownを制御したいのですが、SendmessageでWM_Lbuttondownを 送信するとUpはするのですが、Downさせることが出来ません。 Downさせるにはどのようにすればよいのでしょうか?
何のUpDownだ?
538 :
デフォルトの名無しさん :04/02/02 23:49
>>537 Win32のTABにあるUpDownです。
>>538 TUpDownと書いてほしい
わかんねーけど、wParamにbtPrevでどうだろ?
TreeViewで特定のノードを開きたい場合はどうすればよいのですか?
開きたいノードを探してSelected:=true お好みに応じてMakeVisible, Expand
Delphi使い始めたら彼女が出来ました
543 :
デフォルトの名無しさん :04/02/03 09:53
厨で申し訳ないんですが、メモリーストリームのお勉強中です。 サンプルに、 procedure TForm1.Button1Click(Sender: TObject); var TempStream : TMemoryStream; begin TempStream := TMemoryStream.Create; ListBox1.Items.SaveToStream(TempStream); // ストリームに書き出す TempStream.Position := 0; RichEdit1.Lines.LoadFromStream( TempStream); TempStream.Free; end; があって、RichEditに表示はできたのですが、単にString型 の変数に入れ込むにはどうすれば、よいのでしょうか?
>>543 ストリームサイズでString変数をSetSizeしたやった後で、Stringの先頭アドレスに
全バイト数をWriteBufferしてあげる。
または一度TStringList型インスタンスを作り、それでLoadFromStreamを呼んで、
TextプロパティからString型変数に代入。
SetSizeじゃないや、SetLengthだった。
あ、あと.netになると、StringやCharはワイド文字が標準になる?らしいので、互換性を考えて、 var s:String; m:TMemoryStream; m.Seek(0,soBegining); SetLength(s,m.Size div SizeOf(Char)); // SizeOf(Char)で除算! m.WriteBuffer(PChar(s)^,m.Size); としておいた方が無難かも。
ストリーム使ってる時点でドトネト移植する気などないだろう
.netだと、ストリーム使った過去の大量の資産が使えなくなるの? だとしたら某は終わってるな。
>>544 レスありがとうございます。
早速やってみましたが、
>m.Seek(0,soBegining);
ここで未定義の識別子となって通らなかったので、
soFromBeginningに修正してみましたが、
Stringの戻り値が帰らなかったので見てみると
s=#0#0・・・・・とかいう文字が入っておりました。。。
うーん厨で申し訳ないのですが、どうしてなのでしょう?
>>547 ストリーム以外でどのような方法があるのでしょうか?
550 :
デフォルトの名無しさん :04/02/03 11:54
>>548 .NETに過去の資産なんかありません。
未来があるかは判りませんが。
ExtractFilePathとExtractFileDirって使い分けとかってあるんでしょうか?
.NETは今までの資産をつかえる。 C/C++のソースからCOMまで。 Javaとは違う。
.NETにかかればDelphiの資産も.NETの資産。 Delphi8もそう宣伝している。
ソースファイルや実行ファイルが入っているフォルダ名によって 実行しようとした時にエラーが出るのは何故ですか? 例えば「新しいフォルダ (2)」だと実行できなかったのですが。
>>536 もしかしたら、勘違いかもしれないけど、
WinAPIのGetForeGroundWindow, SetForeGroundWindowでやってみるのは?
保存ダイアログってなんでこんなに馬鹿なんだ。 hoge.pas.txtに補完するなんて信じられん。 拡張子があるときは補完しない、ないときは補完するか確認する、 ぐらいの配慮があっても良いだろうに。
>552 使い分けてますが?
>>544 もしかして、わざと間違ったんですか?
非常に悩んで、勉強にはなりましたが(w
561 :
デフォルトの名無しさん :04/02/03 21:05
>>560 なにか間違ってる?
敢えて言うなら、546でBeginningのスペルが間違っていることくらい?
563 :
デフォルトの名無しさん :04/02/03 21:33
Delphi6パーソナルで 右クリックしたときにでてくるようなポップアップメニューを作ってます。 右クリックしたときにポップアップメニューがでてくるところまではつくれたんですが、 そのポップアップメニューのデザインを変えることはできますか? たとえば背景を灰色から白色にかえるとか、 マウスカーソルを乗せたときに青くなるのを水色に変えるとかなんです。 できれば、サブメニューのあるときに右向き三角も変えたいのです。
>>558 俺もつい数ヶ月前に同じ気持ちになりました。
で、サポート的な処理を追加した気が汁ですが、うpする?
565 :
デフォルトの名無しさん :04/02/03 21:57
>>563 君にはまだ無理。
どうしてもやりたけりゃ、オーナードロー(OwnerDraw)で検索しなはれ
566 :
デフォルトの名無しさん :04/02/03 22:10
>>562 >m.WriteBuffer(PChar(s)^,m.Size);
ここは、
m.ReadBuffer(PChar(s)^,m.Size);
じゃないのですか?
ここだけで非常に悩みましたが(w
569 :
デフォルトの名無しさん :04/02/04 00:08
「Delphi相談室(超初心者用)その11『出来ますか?は禁句だよ!』」 ↑ 次、コレよろしく。
571 :
デフォルトの名無しさん :04/02/04 02:16
>>570 そっか(藁
いや、スレタイにでも書いとかないと、「出来ますか」を阻止出来ないかと
思ったんだが。
タイトル下に書いても、「詳しくは
>>2 以下」つっても、読まんだろうし。
>>563 こんなんでどうよ。あとは自力でがんばれ。
procedure TForm1.MenuItem1AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState);
var
Text: String;
begin
with ACanvas do
begin
Brush.Style := bsSolid;
if odSelected in State then
Brush.Color := clAqua
else
Brush.Color := clWhite;
FillRect(ARect);
Brush.Style := bsClear;
Font.Color := clBlack;
Text := TMenuItem(Sender).Caption;
OffsetRect(ARect, 6, (ARect.Bottom - ARect.Top - TextHeight(Text)) div 2);
DrawText(Handle, PChar(Text), Length(Text), ARect, 0);
end;
end;
超初心者用のスレじゃなくなってしまった
「Delphi相談室(超初心者用)その11『仕切り厨はご遠慮ください!』」
「Delphi相談室(超初心者用)その11 ┐('〜`;)┌」
578 :
デフォルトの名無しさん :04/02/04 09:03
「Delphi相談室(超初心者用なので何でもあり)その11」
579 :
デフォルトの名無しさん :04/02/04 11:16
「Delphi相談室(ム板のオアシス)その11」
「Delphi相談室(←なぜか相談できない)その11」
「Delphiバファローズその11」
「Delphi相談室(初心者叩き)その11」
Delphi相談室(でるぽい)その11
585 :
デフォルトの名無しさん :04/02/04 16:10
「Delphi(←なぜか使うのは信者のみ)相談室その11」
脱初心者にはVCLソースが丁おすすめ。 プロ買う前はネットで検索したりあちこちで聞いたりするのが面倒で、 なかなか新しいことができなかった。 プロにはソースが付いてくるから、そこからパクってるうちに力が身に付く。 初めて使うAPIでもソースをGREPすれば使い方の例が見つかったりする。
確認させてください windows上で作動させるようにしたのがObject Pascalで Object Pascalの統合開発環境がDelphi こんな感じですよね?
TListで多重ソートをさせたいのですが、スマートにやる方法はないでしょうか? 具体的には、 type PMember = ^TMember; TMember = record Name : String; Age : Integer; end; このようなレコードをTListで管理して、Age順にソート、同じAgeに関してはName順にソート、です。 Age順だけでソート、はすでにできています。
Name→Ageの順でソートすれば?
>>591 今のところ、TList.sortを使ってソートしているのですが、Name→Ageの順でソートしても
Ageソート後にNameの並び順がそのまま保証されないんです。
function Compare(Ietm1, Item2: Pointer):Integer; begin Result := 0; if PMember(Item1)^.Age = PMember(Item2)^.Age then Result := CompareStr(PMember(Item1)^.Name, PMember(Item2)^.Name) else Result := PMember(Item1)^.Age - PMember(Item2)^.Age; end;
↑Sortに渡す関数はこんな感じ?
>>588 ObjectPascalはLinux上でも動いてます。
さらにObjectPascalへの改良前のPascalもWindows上で動きます。
しかも最近ではObjectPascalとは呼ばないらしい。
>>592 >Name→Ageの順でソートしても Ageソート後にNameの並び順がそのまま保証されない
TStringList の使っている QuickSort は直前の並び順を保存しないソート。
594 で紹介されているように、二つの基準を連結して一つの基準を作る。のがセオリー
598 :
デフォルトの名無しさん :04/02/04 19:58
DLLを作成中です。 問題なく作成していたのですが、 自作のfunction内で、他の自作functionを呼び出すコード をつけたところ、 exportsのところで exportsはローカルスコープ内に置くことはできません。 とエラーが出てコンパイルできません。 原因は何なのでしょうか?
勘違いでしたスマソ
>>594 ありがとうございました。このソースで思うような結果が出せました。
>>597 そうですね。QuickSortの性質上、続けてソートをかけてもうまくいかないのはわかっていましたが、
2つの基準を連結して1つの基準を作る、というのはわかりませんでした。
Delphiってのは元々神殿の名前でしょ? 信者が集うのは当然。
マイナーっぽさというかマニアックっぽさがいい感じなのでデルファイはじめました。 なんか標準から離れてる感じでいいです。 マッタリ出来そうな感じ。
603 :
デフォルトの名無しさん :04/02/05 09:07
標準って 何だ?
UCSD PASCAL
>>603 常に格納領域の大きさを意識しながらプログラミングする「(たとえ間違っていても)プログラマーの行うことを妨げない」言語か
ランタイムのバージョンを考えたり、コマンドなるものが存在した言語のことかと思う
たぶん数値計算やデータ処理しかできなかったり、印刷しか能のない言語とかプログラミングの必要のない言語ではないということと。。。
Windowsというソフトで動くから、MSが提供するツールを 標準と思ってるんじゃないかと Delphiはワープロで言うと一太郎、表計算だと123、 ブラウザだとNNというように捕らえているものと思われ。
UCLA PASCAL CSUCLA PASCAL
Turbo Pascal
610 :
デフォルトの名無しさん :04/02/05 15:55
*.dbファイルを*.csvに変換したいんですが、ソース書かずに ボタン一発でする方法ってありますか? *.dbfならBatchMoveで出来たんですけど、*.csvをBatchMoveで やるとExcelで読めないんです。
611 :
デフォルトの名無しさん :04/02/05 16:52
メニューでショートカットキーをF5にしたいのですが、 (&F5)ではだめでした。どうするのでしょうか
Action, ActionList使っとけ
TEditのOnExitで未入力の時自分自身にフォーカスを設定してるときに checkboxをクリックしても変わらないんですがどうすればいいでしょうか。 D5Pro+Win2Kです。
いくらなんでも一太郎と比べられたら。。。。可哀想。
615 :
デフォルトの名無しさん :04/02/05 19:19
ホント、Delphiがかわいそう。
Delphiのinheritedてのは親のprivate関数まで呼べてる? C++Builderの本がないからDelphiの本見て勉強してるんだけど。
>>616 その親子クラスが同じユニットにあるなら呼べたような。
>>617 同じユニットにはないやつ。
>>618 自分はDelphiでプログラム書かないから超初心者向けのスレで質問したけど
疑問にぶつかったのは本に載ってたDelphiのコンポーネント作成のプログラムをC++Builderに移植しようとしたとき。
message指令のついたメッセージ処理メソッドの中でinheritedが使われてたのをC++のプログラムで書くと
呼び出せないと言われて調べてみるとprivateで宣言されてた。
スレ違いだったかな。
#include <stdio.h> class test{ public: virtual void vrfunc(){}; test(); }; class test1:public test{public: void vrfunc(); }; class test2:public test{public: void vrfunc(); }; test::test(){ vrfunc(); } void test1::vrfunc(){ printf("TEST1 VRFUNC"); } void test2::vrfunc(){ printf("TEST2 VRFUNC"); } int main(int argc, char* argv[]){ test* t; t = new test1; delete t; t = new test2; delete t; return 0; }
>>619 コンパイル通らず。
unit Unit2;
interface
uses windows;
type
TA = class
private
procedure A;
end;
implementation
procedure TA.A;
begin
OutputDebugString('call TA.A');
end;
end.
unit Unit1;
interface
uses unit2;
type
TB = class(TA)
public
procedure B;
end;
implementation
procedure TB.B;
begin
inherited A;
end;
end.
program test; {$APPTYPE CONSOLE} type TTest = class procedure VRFunc;virtual;abstract; constructor Create; end; TTest1 = class(TTest) procedure VRFunc;override; end; TTest2 = class(TTest) procedure VRFunc;override; end; constructor TTest.Create; begin vrfunc; end; procedure TTest1.VRFunc; begin writeln('TEST1 VRFUNC'); end; procedure TTest2.VRFunc; begin writeln('TEST2 VRFUNC'); end; begin TTest1.Create.Free; TTest2.Create.Free; end.
privateは、あくまでprivateだから呼び出せないでしょう。 さらにその上のメソッドを継承しているか、同名のプロパティ が設定されているのでは。 じゃないと、protectedとprivateの意味がない。 でも、同じユニットから見れるって説明があるんだよねぇ。
>>623 friendがないからじゃないかな<同ユニット
>>621 わざわざDelphiで実験してくれたの?どうもありがとう!
じゃあ自分の本のソースの読み方がおかしいのかな。
Delphiはまったくの初心者だから。
よく見直してみます。
626 :
デフォルトの名無しさん :04/02/05 21:48
>>613 全くやりたいことが分かりません。
落ち着いて、やりたいことを複数行に分けて書きましょう。
>>623 message指令のついたメッセージ処理メソッド中のinheritedはちょっと特別で
メソッド名には無関係で同じメッセージを処理する上位クラスのメッセージ処理メソッドを呼び出すと書かれてるのを見つけたのでそれが関係したのかもしれなかった。
でもC++Builderでは明示的にメッソド名を指定しなくちゃいけないからどうしてもコンパイルできないけど。
やっぱりコンポーネント作ったりするのは資料の豊富さと言語の便利さからDelphiがいいみたいだね。
新語の予感。
Delphi Personalでは商品開発は無理らしいですが、シェアウェアという形ではなくカンパウェアとしての開発はどうなのでしょう。 販売とは違うと思うのですが。
こればかりは某に聞いた方がよい。マジで。
信号無視もバレなければ大丈夫です
>>629 公式に聞いたほうが良い。マジで。
自分や他人の常識に基づいて判断するのは勝手だが、
もし、万が一にでも企業側と逆を選んでいて、
それが発覚すればしゃれにならないことになりますので。
カンパウェア=試用期間無期限のシェアウェア ゆえにNG
Delphiで使用可能なメール送受信コンポーネントの中で できるだけCPU負荷の低いものを探しているんですが、 何かおすすめのものはないでしょうか?
635 :
デフォルトの名無しさん :04/02/05 23:23
当然カンパウェアもダメだろ。聞くまでもないと思うが。
636 :
デフォルトの名無しさん :04/02/05 23:28
ちゃんとソフト買って、 シェエウェアで回収すればいいだろ。 俺はいつもそうだが。
文字にアンチエイリアスかけたいんですけど、 背景色と文字色の中間(かそれ以下)の色を取って、 各方向一ピクセルずらして描写→本命を真ん中に描写、 という方向性で大丈夫でしょうか。 やったことある方います?
子ウィンドウのTWebBrowser内で押されたショートカットキーを 親に送るかTWebBrowserに送るか判定する方法はありますでしょうか。 一応、環境は Delphi6 Personal UpdatePack2 Windows2000 SP4 です。 宜しくお願いします。
>>611 たとえばメニューの名前がOpen1なら
【設計時】
1)Open1を選ぶ.
2)オブジェクトインスペクタでShortCutプロパティに『F5』と入れる.
【実行時】
Open1.ShortCut := VK_F5
>>637 画像処理スレに言って聞いた方が良い.
>>638 そんな方法はない。
だがTWebBrowserの親コントロールでショートカットを横取りし
それをTWebBrowserに渡すことは可能。
すいせません、脳みそ沸いてました。
明らかに聞き方がまずいのでそれなりに詳しく書いてみます。
タブブラウザです。
親には以下の処理がしてあります。
・メインメニューの新規作成にショートカットCtrl+Nを割り当て。
・
ttp://www.swissdelphicenter.ch/en/showcode.php?id=1055 ・procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := Handled or MainMenu1.IsShortCut(Msg);
end;
子には以下の処理を
procedure TFrame.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
var
New: TFrame2;
begin
New := TFrame2.Create(nil);
New.Parent := Form1;
New.Align := alClient;
Form1.TabControl1.Tabs.AddObject('Loading...',TObject(New));
ppDisp := New.WebBrowser1.DefaultDispatch;
Cancel := False;
end;
作成した子のWebBrowserにフォーカスがあるとき Ctrl+N を押すと、IEが開いてしまいます。
親の二番目の処理の中でコントロールキーが押されていたら
子に処理を渡さないようにしてみたりしたんですが、うまくいきませんでした。
>640
出来れば触りだけでもご教授願います。
すいませんボタンを押したときの処理で 例えばa.exeを/aと/bというオプションを付加して起動させる というのはどのように書けばいいのでしょうか。。教えてくださいまし。。_| ̄|○
644 :
デフォルトの名無しさん :04/02/06 05:51
質問です。 クラス参照型変数に代入された値が、特定のクラスから継承されたクラスか否かを調べる方法ってありますか? 一度インスタンスを作ってis演算子使えばわかるんですけど。インスタンス作らずに。
645 :
なんででしょ(゚_。)? :04/02/06 06:30
以下は壁紙でスクリーンサイズより縦か横のどちらかの長さが大きいとき、縦横比を維持したまま全画面を表示できる比率と描画位置を求めるための関数です。 function GetCenterPosRatio(var w,h: Integer): TPoint; var dw,dh,ds: Extended; begin Result.X := 0; Result.Y := 0; dw := w; dh := h; if (h <= Screen.Height) and (w <= Screen.Width) then begin ds := Screen.Width-w; Result.X := Round((ds/2)); ds := Screen.Height-h; Result.Y := Round((ds/2)); end else begin if h >= w then begin h := Screen.Height; w := Round(Screen.Height*(dw/dh)); ds := Screen.Width-w; Result.X := Round((ds/2)); end else begin // こういうサイズがおかしい w = 815,h = 800 の場合 w := Screen.Width; // w = 800 h := Round(Screen.Width*(dh/dw)); // h = 800*(800/815) = 786 if h >= Screen.Height then // h > Screen.Height begin h := Screen.Height; // h = 600 w := Round(Screen.Height*(dw/dh));// w = 600*(815/800) = 611 ds := Screen.Width-w; Result.X := Round((ds/2)); //明らかに Result.Y = 0 のはずだがこの手続きを抜けた時点で Result.Y にResult.X と同じ値が入ってしまう。ところがさらにおかしなことに //ds := Screen.Height-h; Result.Y := Round((ds/2)); //こうすればいい (実は ds := Screen.Height-h; だけでもいい end else ds := Screen.Height-h; Result.Y := Round((ds/2)); end; end; end;
DELPHI8は.NET対応のみのプログラムしか作れないのでしょうか?
>>645 なんかよくわからんが。
以前書いた、フォームのクライアント領域にあわせてBitmapを
拡大縮小表示するためにPaintbox1の位置・サイズを決定するコード。
procedure ResizePaintBox;
var
OrgWidth, OrgHeight: Integer;
Scale: Double;
Rect1: TRect;
begin
OrgWidth := Bitmap.Width;
OrgHeight := Bitmap.Height;
Scale := Min(ClientWidth / OrgWidth, ClientHeight / OrgHeight);
Rect1.Right := Floor(OrgWidth * Scale);
Rect1.Bottom := Floor(OrgHeight * Scale);
Rect1.Left := IfThen(ClientWidth > Rect1.Right
, (ClientWidth - Rect1.Right) div 2, 0);
Rect1.Top := Ifthen(ClientHeight > Rect1.Bottom
, (ClientHeight - Rect1.Bottom) div 2, 0);
PaintBox1.SetBounds(Rect1.Left, Rect1.Top, Rect1.Right, Rect1.Bottom);
end;
649 :
デフォルトの名無しさん :04/02/06 12:15
Indy使ってメール送信すると X-Library: Indy 9.00.10 というヘッダがつくのですが、これを表示しないようにはできるのでしょうか
651 :
デフォルトの名無しさん :04/02/06 12:52
>>645 ひまなんで見てたんだが
たぶん↓コレ×
end else
ds := Screen.Height-h; Result.Y := Round((ds/2));
たぶん↓○
end else
begin
ds := Screen.Height-h; Result.Y := Round((ds/2));
end;
解らなかったら変なのが再現する最小のコードを作ってみると
特定しやすい
・TEditのOnExitイベントでTEditが未入力なら自分自身にフォーカスを設定している。 ・そのTEditにフォーカスがあるとき、checkboxをクリックしてもCheckBoXがOn/Offしない。 これを回避するにはどうしたらいいでしょうか。
自分自身ってのはTEdit?Form?
自分でフォーカスを奪っているのだから CheckBox にフォーカスが移動しないわけだね。 結果としてマウスクリックが捨てられているわけだ。 そんな変な UI を止める。というのが一つの答え。
655 :
デフォルトの名無しさん :04/02/06 14:26
>>610 です。お助けがないので、調べてソースを書いてみました。
var
S1: WideString;
F1: TextFile;
i: Integer;
begin
AssignFile(F1, CSVPath + 'CSVFile.CSV');
Rewrite(F1);
with DataSource1.DataSet do begin
First;
while not Eof do begin
S1:= '';
for i:= 0 to DataSource1.DataSet.FieldCount - 1 do
S1:= S1 + DataSource1.DataSet.Fields[i].AsString + ',';
Writeln(F1, S1);
Next;
end;
end;
CloseFile(F1);
end;
という感じで作ったCSVに書き込んでExcelで開いてみたら、
文字で送ったはずの数字が普通に数字となっているんです。
数字を文字扱いで送るにはどうすればいいでしょうか。
うわぁしまった。半角スペース無効を忘れてました。 すんごい見にくくなってしまった。(´д`lll)
657 :
デフォルトの名無しさん :04/02/06 14:32
なかなか答えが見つからないのでここで質問させていただきます。 先日delphi7 personalを買ったのですが、 コードエディタで 「式評価」と「識別子定義の表示」が ポップアップ表示しないのです。 サイトの説明を見る限りは、できるはずなのですが、 (delphi6 personalでは出来た) そういう仕様なのでしょうか? どこかに設定でもあるのでしょうか? それとも何かのバグなのでしょうか?
dbファイルってのが曖昧
>>658 俺っすか?
dbはParadoxです。
あと CSVPath にはCSVFile.csv
を作る場所のパスが入ってます。 スレ汚しすいません、途中で書き込んでしまいました。
>>654 変ですか、そうですか。
では、入力しない限り先に進めないようにしたいんですけど他にはどうゆうやり方があるでしょうか。
>>610 ExcelでCSV形式を読み込むときに拡張子がcsvときとtxtでは動作が違います。
txtで読み込むと数値か文字かを選択して読み込めます。
> 数字を文字扱いで送るにはどうすればいいでしょうか。
Excelは先頭に半角クォートが有るデータは全て文字と認識したはずですが...
>>662 先に進もうとした時にチェックして警告を出し
先に進ませない。ってこりゃMFCのまんまだが
>>663 ありがとうございます。
異様に長い数字列なので、Excelで開くと「2.33211E+89」こんな感じで
勝手に置き換わっているので困ってます。
csvをtxtに変換して、メモ帳で開いてみたところ、普通に入ってました。
半角クォートというのは「"」これのことですよね?
Excelで開いたときに、セルの先頭に入ってしまうので、ちょっとマズイ
のですが、なしでは無理なんでしょうか。
>>655 お助けなくてもできてるじゃん・・・・
んで、Excelで数字と文字としての数字をExcelの機能を
使って、CSVにはき出してみたりした?
そして、それをまたExcelで読んだりしてみた?
もし、それで数字が文字として認識されるとしたら、CSVで
はき出す以上、Excelでは文字列として判断されてしまうの
で仕方がないような気がする。
Excel のセル書式を変えるだけだと思うけど。
>>657 >先日delphi7 personalを買ったのですが、
>コードエディタで
>「式評価」と「識別子定義の表示」が
>ポップアップ表示しないのです。
ML で埒があかないからといってこっちに持ってくるか?
670 :
デフォルトの名無しさん :04/02/06 16:11
Del7がインストできなくなりました。 以前はこんなことはまったく ありませんでした。CDの盤面もキレイです。 ウチにはPCが2台あるのですが、2台ともにインストできないようです。 この2台は昨日Windowsアップデートしたのですが、アップデートを行うと、 一部のプログラムが動作しなくなったと苦情があるとのニュースを読んで、 もしかしてDelも関係あるのかな、と、いちおう疑っています。 どなたか情報しりませんか? IEで投稿すると"ERROR:ブラウザ変ですよん。"がでてくるし。 念のため今からCDをコンパウンドで磨いてみます。
インストーラーを動かすとなんと言ってくるのかな? なんかウィルスくさいけど?
672 :
デフォルトの名無しさん :04/02/06 16:19
>668 購入したばかりだっただけに、どうしても気になったのです。 MLでもだめ、他のところでもだめ。最後に思い出したのが ここでした。 マルチポスト批判も覚悟のうえでした。 >669 ありがとうございました。これですっきりしました。 MLで解答してくださった方々にもお礼とお詫び申し上げます。
>>669 4つ下のToolTip Symbol Insightかな?
>>666-667 むしろ文字列としてしまうと「2.33211E+89」になってしまう
みたいですね。勘違いしてました。
どっちにしろExcelの表示の問題だということも分かりました。
とりあえずコレで行ってみようと思います。ありがとうございます。
675 :
デフォルトの名無しさん :04/02/06 16:28
>>671 こんな表示が出ます。
ファイル自体のアクセス、コピー、解凍は正常にできます。
別のCD-ROMドライブでもインストしてみましたがダメでした。
>Error 1311, ソースファイルが見つかりません:
>D:\INSTALL\DELPHI~1.cab。ファイルが存在していてアク
>セスできることを確認してください。
>>670 のーとんいんたーねっとせきゅりてぃ入れてない?
ぶらうざ変ですよん
>675 (yoya) なんで Borland に聞かないの?
>>676 なにか変だということはわかるが、インストーラーが動かない。ってのは Delphi 以前のもんだいだよな?
Windows アップデートが OS / WindowsInstaller に影響を与えたとは思わないけど。
OS は何?
OSって何ですか。
681 :
デフォルトの名無しさん :04/02/06 18:09
>>678 まだユーザー登録のはがき昨日出したばっかりだから。
電話かけたらユーザーIDが云々言われたので。
682 :
デフォルトの名無しさん :04/02/06 18:31
>>676 ノートンは入れていないのですが、マカフィーは入っています。
ただ、いままで全く問題なく書き込みできていました。
OSはWindows2000 5.99.2195 ServicePack4です。OS自体も
数週間前にインストしたばかりです。今までまったく正常に
動いていました
インストの問題はCDを盤面を超極細のコンパウンドで磨いたり、
バックアップを焼いてインストしてみましたが同じ表示が
でてインストできませんでした。
エラーはインストの途中の"処理実行用スクリプト生成中"の
次に"コンポーネントの登録を更新中"となり、その次に
"ファイルをコピー中"で起こります。
ウィルスチェックは今行っています。これから他のあまり
使ってないVisualStudioなど開発ソフトをアンインストして
みてから再びDelをインストしてみます。
インストできるとよいのですが・・・・
スレ違いかもしれないけど、PC2台それぞれの問題という ことはないのかな。 前にいろんな会社のマシンをみてて、 1)電源が不安定 2)クーリングがうまくいってない ことがあると、電源容量不足、CPU使用率上昇でCDから ファイルが読みとれないことがあった。 2台同時にということだと、あり得ないかもしれんが、参考 までに。
Del8もVCL,.NET.CLX全部対応だったら神だと思ったけどな。
>>642 スパムとかじゃなくて、とにかく軽いメーラを作りたいんです。
>>651 ありがとう。やはり単なるケアレスミスだったか(^^;)。
>>685 それぞれ試して、CPU使用率のログを取ってみるしかないんじゃないの?
1000件送信、1000件受信してみればいい。
688 :
デフォルトの名無しさん :04/02/06 22:28
Delphiで作ったアプリは、起動中にWindowsの設定でスクロールバーの幅を
変更しても変わらないんですけど、こんなモンなんでしょうか?
再起動すると幅が変わるんですけど。
ただ、TScroolBarは再起動しても変わりませんが。
あと
>>644 に答えてくれる方がいると嬉しいです。
690 :
デフォルトの名無しさん :04/02/06 23:09
( ^^)
TObject.InheritsFromとか。
693 :
デフォルトの名無しさん :04/02/07 01:15
フサギコー! 新しいスレたてろ!
695 :
デフォルトの名無しさん :04/02/07 02:38
すんまそん。 Delphi6パーソナルから7Proにやっとお金ができて乗り換えたんですが、 ショートカットの設定できるコントロールでオブジェクトインスペクタのプルダウンから、 Alt+*がなくなってるんですが、環境設定などで使用できるようになるんでしょうか? それとも仕様変更でなくなっちゃったのでしょうか? Ctrl+Alt+*はあるんですが。。。 よろしくです。
>>697 ぃゃ、6Personalにも無いんだが…?
あれ?そうでしたか。勘違いかもしれません。ありがとうございました。 直接叩いて入力したらAlt+*も使えました^^; すんまそんでした。
MenuItem と Action 以外にショートカットを設定できるコンポーネントてあったっけ? ふつうに ALT+A と書けば処理されますよ。 ただ、ALT+A をショートカットに使うと &A 等のアクセスキーと紛らわしくなるので 気を付けて
701 :
デフォルトの名無しさん :04/02/07 12:27
ボタン押したらform2が表示されるようにしたいのですが、 どうしたらいいですか。 これが解決すれば、超級SLGが作れそうな予感がします。
stringのメモリって何時破棄されるのでしょうか。例えば type MyType = record I :integer; S:string; end; var MyTypeArray : Array of MyType という風に宣言したとします。後で SetLength(MyTypeArray,10) をすると、新しく調達した MyTypeArray[9].S は即座に使えますが、MyTypeArray がスコープから外れた後は内部の string群(が参照しているメモリ)はどうなるのでしょう。 また、SetLength(MyTypeArray,10) した後にSetLength(MyTypeArray,9) したら、MyTypeArray[9].S は どうなるのでしょう。予め MyTypeArray[9].S := '' ; するべきなのでしょうか。
そういうのは気にするな。
>>701 Form2.Show;
結構奥が深いので気を付けて。
たとえば、この例だと Form1 も画面に残っているのでマウスでクリックできてしまう。
ある程度の規模になるのなら、ちゃんと設計をしましょう。
>>702 厳しく書くと、そういうことが判断つかないうちは、そういうことを気にするな。ということ。
構造体のメンバーでなければ、いつ文字列型が解放されるのかわかるのかな?
procedure Test;
var
s : string
begin
s := 'test';
end;
とあった場合の、文字列変数 s に実際に割り当てられているメモリはいつ解放されると理解している?
706 :
デフォルトの名無しさん :04/02/07 13:55
>>705 それじゃプロシジャが終わった時点で開放されなきゃ困る。
じゃなきゃ、そんなところで変数宣言する意味ないしね(w
エラーでprocedureから出るときは解放されてるのかな? ずっと前に何かのユニット組み込んで調べたとき、 finallyでs:='';しないとリーク起きたんだけど。
>>705 >文字列変数 s に実際に割り当てられているメモリはいつ解放されると理解している?
変数 s 自身は s がスコープから外れる時に失われると思われます。具体的に考えると、
s の実体はprocedure Test; 中ではスタック、或いはレジスタ上にあるでしょうから,end; の後に呼び出し元に
戻る際にESP等が復帰し、 s は失われるのではないでしょうか。
問題はポインタ s が指すヒープ上のデータなのですが・・・参照を元にガベージコレクションで回収されてたりしますか???
>結構奥が深いので気を付けて。 >たとえば、この例だと Form1 も画面に残っているのでマウスでクリックできてしまう。 >ある程度の規模になるのなら、ちゃんと設計をしましょう。 ちゃんとも糞も、ShowModal使えばいいだけの話のような気が。 あとForm2というグローバル変数を使うのが気持ち悪いので、いつも with TForm2.Create(Self) do try ShowModal; finally Free end; って書いてますが。 もちろんForm2は自動生成解除で、Form2グローバル変数自体も削除。
>>709 >ちゃんとも糞も、ShowModal使えばいいだけの話のような気が。
Form1での処理が停止してもいいならそれでOK
固まると不都合がある場合はForm1.Enabledをいじる
711 :
デフォルトの名無しさん :04/02/07 16:11
皆さんワープロ検定何級ですか
計算結果をmemoコンポーネントに表示させるにはどうすればよいのでしょうか? こんなことで1時間詰まってます…。
Memo.Lines.Add('String');
>>708 半分正解。実際には
procedure Test;
var
s : string
begin
s.Allocate;
s := 'test';
s.Free;
end;
と、こんな感じで文字列領域のためのメモリ領域の確保と開放コードが自動的に挿入されている。
これはリファレンス(参照)カウンタによる寿命管理とは別の作業なので混ぜて理解しないように。
で、コンパイラがこういった細工をすることがわかれば、構造体のメンバに対しても同じことが
できることがわかるでしょう?
>>707 714 は擬似コードなので Helper 関数の名前は実際とは異なります。
エラー処理も考慮に入れると
begin
s.Allocate;
try
s := 'test';
finally
s.Free;
end;
end;
相当のコードが自動生成されているので、通常は文字列メモリのリークは起きません。
ただし、Free する前にこの文字列が他から参照された場合、参照カウントが増加するため
s.Free の位置で実際にメモリが開放されるとは限りません。
それは同一のメモリ領域(に格納されている文字列データ)を他のところでも参照している
からです。メモリブロックを共有している文字列型変数がすべて開放されたとき、そのメモリブロックは
開放されるでしょう。
ということで、707 さんのコードには文字列の参照カウンタを増加させるコードが入っていたとか
例外オブジェクトそのものにその文字列が渡っているとか。
そんなところだったのでは?
>>704 ありがとう。
form1は消してしまいますので、だいじょぶです
>>716 >form1は消してしまいますので
それはそれでまた違うコードになる予感
うい。 うまくいかない…。 form1にボタンひとつ貼り付けて form2.show; form1.Destroy; form2にボタン貼り付けて form2.destroy; form2.Close; form1.close; これでうまくいくと思ったんだけどいかないなぁ。 なんででしょ
>>718 ツッコミどころ満載だが、酔ってるので他人にまかせて一つだけ。
Destroyは直接呼出しちゃだめ。
大変勉強になりました。ありがとうございました。 asmを追って見ましたところ、string型に対する操作を行う際にコンパイラが暗黙にメモリ参照のリストを 作ってるようですね。なのでメモリ解放は特に気にしなくていいということ、了解できました。 stringからstringへ単に代入しただけの場合は参照先を共有したり、その片方を変更した際に参照の 共有を解除して新しくメモリ領域を調達したり、メモリ管理の妙を垣間見られて興味深かったです。
Delで構造体のアライメントを揃える設定はどうやるんでつか?
>>721 TMyRecord = packed record
iroiro: LongWord;
end;
arrayにも使える。
>>718 uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
AForm: TForm2;
begin
Hide;
AForm := TForm2.Create(Application);
try
AForm.ShowModal;
finally
AForm.Free;
end;
Show;
end;
>>719 ,723
ありがとう。
そのまま貼り付けるだけでは動かないみたいなので
ちょこちょこ変えつつ動くようにしてみます
でけたー、でけたで母ちゃん。 >640 ありがとうございました。 ローカルフックでいけました。
726 :
デフォルトの名無しさん :04/02/08 00:02
TrueTypeフォントで描画した画像の著作権は誰のものになるのでしょうか? フォントデータの著作権者でしょうか? それとも描画プログラムの作者でしょうか? はたまた、描画操作をして画像を作った人でしょうか?
うごいた。 字下げ用のタブは入れちゃいけなかったのね…。
>>726 TrueTypeフォントの情報 = ソースプログラム
描画プログラム = コンパイラ
描画操作する人 = コンパイラを起動した人
普通に考えて、著作権はフォントデータの著作者にある。
ただ、その描画プログラムが特殊なフィルタ機能 (=アンチエイリアシング等) を持ってたりするとか、描画操作する人が配置とか色使いを工夫するなどした場合はまた別の話となる。
(この手の質問は、
***すれ立てるまでもない質問はここで 第50刷***
http://pc2.2ch.net/test/read.cgi/tech/1075637619/ あたりでやって欲しいなぁ...。)
>>727 ,729
ごめんなさい。
そちらへ書き込もうとしてエディタで文を書いていたんだけれども、
貼り間違えてしまった。
移動します。
731 :
デフォルトの名無しさん :04/02/08 00:47
ジャンケンゲームを作ってます。 グーチョキパーのボタンにそれぞれ、 procedure TForm1.ButtonGClick(Sender: TObject); var i : integer; begin i := random(3); case i of 0 : Panel1.Caption := 'グー'; 1 : Panel1.Caption := 'チョキ'; 2 : Panel1.Caption := 'パー'; end; if Panel1.Caption = 'チョキ' then ShowMessage('きみのかち!') else if Panel1.Caption = 'パー' then ShowMessage('きみのまけ') else ShowMessage('あいこ'); end; って書いたのですが、3つのボタンをまとめて書く方法があるような気がしてなりません。 もっと効率のいいプログラムの書き方ってあるでしょうか。
732 :
デフォルトの名無しさん :04/02/08 01:02
(´♀`)
>>731 三つのボタンに同じ手続きを指定すればいいんじゃないの?
こんなのはどぉ? 三つのボタンでイベントを共有します。 procedure TForm1.ButtonGClick(Sender: TObject); var i, j: integer; begin i := random(3); case i of 0 : Panel1.Caption := 'グー'; 1 : Panel1.Caption := 'チョキ'; 2 : Panel1.Caption := 'パー'; end; if Sender = ButtonG then // グーボタン j := 0 else if Sender = ButtonC then // チョキボタン j := 1 else // パーボタン j := 2 if i = j then ShowMessage('あいこ') else if ((i < 2) and (i = j + 1)) or ((i = 2) and (j = 0)) then ShowMessage('きみのかち!') else ShowMessage('きみのまけ'); end;
>>734 どうせ乱数で結果をCPU側の手を決めるなら、
押したボタンに関わらず、1/3の確率で勝負とあいこを決めちゃえばいーじゃん。
同じイベントハンドラで、何を押したかを簡単に識別したかったらTagプロパティを使うと良し。
test
やっと書き込めた… >733-735 どうもありがとうございます。 >734 その方法でうまくいきました。 Senderと言う言葉は知りませんでした。 ヘルプで見ると、“イメージリストが…”とか書いてあったんですが、 この場合は、“もしボタンBが押されたら…”って解釈していいのでしょうか? この“押されたら”が出てきませんでした。 >735 その方法のほうがぼく向きかも… 早速やってみます。
では、Tagを使うとして。 procedure TForm1.ButtonGClick(Sender: TObject); const s = array[0..2] of string = ('グー', 'チョキ', 'パー'); var i, j: integer; begin i := random(3); j := (Sender as TButton).Tag; case i of 0: begin if j < 2 then Panel1.Caption := s[j + 1] else Panel1.Caption := s[0]; ShowMessage('きみのかち!'); end;
1:
begin
if j > 0 then
Panel1.Caption := s[j - 1]
else
Panel1.Caption := s[2];
ShowMessage('きみのまけ');
end;
2:
begin
Panel1.Caption := s[j]
ShowMessage('あいこ');
end;
end;
end;
よけいややこしくなると思うけど。
>>373 Sender パラメータ
の方を見て。
ActionListを使え すべて同じ関数に飛ばして、乱数で勝ち、負け、あいこを決定。 押したボタンによって、勝ち、負け、あいこからCPUの出した 手を計算して表示しれ。
大げさすぎ
もっと簡単になった。 procedure TForm1.ButtonGClick(Sender: TObject); const s = array[0..2] of string = ('グー', 'チョキ', 'パー'); var i, j: integer; begin i := random(3); j := (Sender as TButton).Tag; case i of 0: if j < 2 then Inc(j) else j := 0; 1: if j > 0 then Dec(j) else j := 2; end; Panel1.Caption := s[j] case i of 0: ShowMessage('きみのかち!'); 1: ShowMessage('きみのまけ'); 2: ShowMessage('あいこ'); end; end;
Tag を使うのなら、
>>734 と量は変わらないから、734の方がいいのでは?
s: array[0..2] of string = ('グー', 'チョキ', 'パー'); でしたね。
皆さんありがとうございます。 気軽にはじめたジャンケンゲームなのに、こんなにいろいろなアプローチの仕方があるんですね。 今から一つ一つ勉強していきます。 一つのお題で、いろんな人のプログラムの書き方を見られるスレがあれば、すごく勉強になるかも… >739さん Senderパラメータ見ました。 頭に叩き込んでおきます。
間違えてるじゃん! 正しくは… procedure TForm1.ButtonGClick(Sender: TObject); const s: array[0..2] of string = ('グー', 'チョキ', 'パー'); var i, j: integer; begin i := random(3); j := (Sender as TButton).Tag; Panel1.Caption := s[i]; if i = j then ShowMessage('あいこ') else if ((i = 0) and (j = 2)) or ((i > 0) and (j = i - 1)) then ShowMessage('きみのかち!') else ShowMessage('きみのまけ'); end;
Senderは.NETにも取り入れられた、Delphiの誇るべき機能だ。 覚えておきたまえ。
間違えにくいコードを考えてみました。 procedure TForm1.ButtonGClick(Sender: TObject); const gu = 0; choki = 1; pa = 2; s: array[0..2] of string = ('グー', 'チョキ', 'パー'); var cpu, man: integer; begin cpu := random(3); man := (Sender as TButton).Tag; Panel1.Caption := s[cpu]; if cpu = man then ShowMessage('あいこ') else if ((cpu = gu) and (man = pa)) or ((cpu = choki) and (man = gu)) or ((cpu = pa) and (man = choki)) then ShowMessage('きみのかち!') else ShowMessage('きみのまけ'); end;
皆さんのものを参考に、今の自分なりに判りやすく作ってみました。 procedure TForm1.ButtonGClick(Sender: TObject); const s : array[0..2] of String = ('グー','チョキ','パー'); var i,j : integer; begin i := random(3); Panel1.Caption := s[i]; j := (Sender as TButton).Tag; if i=j then ShowMessage('あいこ') else if ((i = 0) and (j = 2)) or ((i = 1) and (j = 0)) or ((i = 2) and (j = 1)) then ShowMessage('きみのかち') else ShowMessage('きみのまけ'); end; 計算が面倒だったので、全部イコールです。w 今日は、Sender と、as をおぼえました。 いろいろありがとうございました。
Randomって0からじゃなかったっけ?
グー・チョキ・パーは、互いに関係してるから s : array[0..4] of String = ('グー','チョキ','パー','グー','チョキ'); t : array[0..2] of String = ('あいこ','勝ち','負け'); i := random(2); ShowMessage(t[i]);//結果 ShowMessage(s[j + i]);//PCの手 jは押したボタンにより数値決定→ 0:グー 1:チョキ 2:パー でいいんじゃん?
752 :
デフォルトの名無しさん :04/02/08 14:52
Delphi6 Personalで勉強開始しました。 そこで質問なんですが・・・ Delphiって予約語を全部小文字で打った場合、頭文字を自動的に大文字に できないんですか?
作って見た グー、チョキ、パーそれぞれのボタンのタグを0,1,2に設定。 それぞれのOnClickイベントを下のprocedureを実行するよう設定。 Label1に結果を、Label2にCPUの手を表示。 計算がいらないから、これのほうが楽かも。 procedure TForm1.Button1Click(Sender: TObject); const CPU : array[0..4] of String = ('グー','チョキ','パー','グー','チョキ'); Kekka : array[0..2] of String = ('あいこ','勝ち','負け'); var RndNum: Integer; BtnTag: Integer; begin Randomize; RndNum := random(3); BtnTag := TButton(Sender).Tag; Label1.Caption := Kekka[RndNum]; Label2.Caption := CPU[RndNum + BtnTag]; end;
| 漏れも車もってきたぬるぽ |___ ____ ,.=====, V / ∧∧ /i, ∧_∧ q _/ (゚ー゚*)p./ |(´∀` )二i .,-'"/ ̄""-三 ̄i ̄ ̄三.i~ ,二\ 0 、。 , 0 / ヽ.i |/./ ヽ[i (i二□二iiニiii); ○ i:ヽ________/ _i; ○ iニ) ゞー―――ゞ_ノー―――-ゞ_ノ"==3  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ああーん 間違えたw ごめん
757 :
デフォルトの名無しさん :04/02/08 17:05
質問させてください。 グローバル変数で A, B, C, D : Integer とあるとします。 ここで、ローカル変数、x,y がIntegerであります。 Aにはx+2*yを Bにはx+3*yを Cにはx+5*yを Dにはx+7*yを 入れたいので enzan(x,y)というのを procedure TMainForm1.enzan(x: Integer, y:Integer) A := x+2*y; B := x+3*y; C := x+5*y; D := x+7*y; end; と作ったらちゃんと動きました。 ここでこのenzanのようなのがいくつかあり、一度作ったらあまりいじることがないので、 別のenzan.pasにまとめてusesから使いたいと考えています。 なのですが、直接main.pasのグローバル変数をいじることはできるのでしょうか? 関数みたいな形で引数をとらないとダメなのでしょうか。
>>757 Main.pas の interface と implementation の間で A,B,C,D を宣言
Main.pas の implementation の下に uses enzan; と記述。
enzan.pas の interface の下に uses main; と記述。
とすれば出来る。
でもグローバル変数は使うべきではない。
A,B,C,Dも引数で渡すか、演算クラスのインスタンス変数にするべき。
あとユニット名と関数名は(同一スコープ上では)同じにはできない。
>>752 予約語は小文字、というのがスタンダードみたい。
VCLのソースやヘルプの中のサンプルもそうなってる。
あと気になるのだが、DEL6->DEL7で、Longword->LongWordに変わっているのは何故?
Longintはそのままなのに。
>>757 4つも引数を渡すのはウザイゼ!という貴方には、ABCDを要素に持つrecordを宣言して、
それを渡してしまう、という方法もアリ。
>>752 VBとは違って、全部小文字です。
ちなみに大文字で打っても小文字に変える機能はありません。
762 :
時間を稼ぐ :04/02/08 20:50
起動に時間がかかるソフトで、そのソフトが立ち上がるまでソフト名などのダイアログを 表示するような処理はどうしたらいいのでしょう? Delphi-ML の過去ログで「起動 時間 フォーム」などで検索してみましたけど、適当な 例を見つけることができませんでした。
世間ではあれをスプラッシュウィンドウと呼ぶらしいぞ。検索しなおしてみれば?
>>759 >>761 ありがとうございます。
予約語が小文字なのはヘルプ見てなっとくしましたが、プロパティや関数
なんかはVBみたいに自動的に大文字にして欲しいですね。
>>765 補完機能使ってれば、プロパティやメソッドは自動的に
元が大文字なら大文字になるよ
今は、逆に大文字になると違和感があるけどね。
統一するという部分では大文字になるのがいいんだろうけど、
自由度が高いという部分では、これでもいいのかもね。
○リー○ー○ルにも、その設計思想が反映されてるんでしょ。
>>765 あれはあれで便利だけど、上下の行を見比べるために桁揃えで
不要なスペースを入れたのに勝手に削除してくれるExcelVBAに
ぶち切れた覚えがあるから、余計なことはしてくれない方がいいなと。
Tagとイベント共有を使わず、CPUの手を乱数で求めました。 procedure TForm1.Jyanken(Man: Integer); const JyankenStr: array[0..2] of String = ('グー','チョキ','パー'); KekkaStr: array[-2..2] of String = ('勝ち','負け','あいこ','勝ち','負け'); var Cpu: Integer; begin Randomize; Cpu := Random(3); Panel1.Caption := JyankenStr[Cpu]; ShowMessage(KekkaStr[Cpu - Man]) end; procedure TForm1.Button1Click(Sender: TObject); begin Jyanken(0); // Button2Click で Jyanken(1); // Button3Click で Jyanken(2); end;
>>768 こういう手もある。
KekkaStr: array[0..2] of String = ('あいこ','勝ち','負け');
ShowMessage(KekkaStr[(Cpu - Man+3)mod 3]);
Caption := ['あいこ','勝ち','負け'][n]; がとおればすごい楽なんだけどな。 'abc'[n]が通るんだから対応してくれよ。
>>769 のでこんなのやってみた。
ShowMessage(KekkaStr[(Cpu + Man * 2) mod 3]);
多次元配列を使ってみた。 KekkaTable: array[0..2, 0..2] of Integer = ((0, 2, 1), (1, 0, 2), (2, 1, 0)); ShowMessage(KekkaStr[KekkaTable[Cpu, Man]]);
たかがじゃんけんに必死になるスレはここですか?
>>771 なるほど、こういうことか。
Cpu-Man+3≡Cpu-Man+3+Man*3≡Cpu+Man*2 (mod 3)
あ、2つ目の合同記号は等号でよかった。
>>773 たかがじゃんけんゲームを諳で書けるようになったら超初心者卒業だな。
最低限覚えないといけないこと結構あるし。
タイマー使って遅出しを許容すると反応速度で勝負が決まって楽しいYO。 先に出すと絶対負けるの。
そんなこと言ったら人間なんて所詮誰かのマネして生きてるさ
香具師も(ryも二番煎じ
>>778 いいアイデアだったでそ
ただ個人的には結果を1/3で求めるんじゃなくて、
PCの手をランダムにして、結果を求めた方が
確率は1/3としてもボタン選択の意志が反映される
ような気がするので、768のがいいと思った。
>>781 「香具師は(ry」な。煽りの誤字ははずかしいな。氏んだほうがいいかも。
香具師も二番煎じだし、
(ryも二番煎じだし、
氏んだも二番煎じだし、
極論言ったら大概二番煎じな上、
極論抜きでプログラミングは二番煎じなので、
>>768-772 に二番煎じとつっこむ必要なし。
にばん-せんじ 4 【二番▼煎じ】 (1)一度煎じたものを、再び煎じること。また、そうしたもの。 「―の薬」 (2)何度か行われ、新味のないもの。 「―の出し物」
786 :
デフォルトの名無しさん :04/02/09 14:36
StringGridでコピーに関する質問です。 エクセルと同じような動作をさせたく セルの中身を選択状態でコピーを押したら選択部分のみ どこも選択してない状態ならカーソル位置にあるセルの中身を全てコピー といった動作をさせたいのですが 選択中か否かってどうやって判定するのでしょうか?
セルの中身が 「ABC」だった場合 「BC」部分を選択してるならクリップボードに「BC」を 選択状態に無く「ABC」と書かれたセル上にカーソルがあるだけなら 「ABC」をクリップボードに。 といった動作がさせたいのです。
SendMessage使って自己解決しました。
私はいまだにDelphi5を使っているのでフォルダーをアクセスするようなソフトには
http://www.bekkoame.ne.jp/~itotaka で公開されている伊藤 隆志氏のShell Component Libraryを使っています。
このコンポを使えば簡単なファイラーもどきが簡単にできるのですが、たとえば
A: (フロッピー) C: D:(ハードディスク)E:(CD-ROM)
というドライブ構成の時 Eドライブを開閉したとき TShellTreeView のカレントフ
ォルダーがデスクトップに勝手に移動してしまいます。開閉前のカレントフォルダー
がEドライブにあるのならまだ納得がいくのですがCドライブやDドライブにあっても
そうなってしまいます。これを避けるには(つまりカレントフォルダーを変更しない)
TShellTreeView の OnChange イヴェントで対策を講じればいいのでしょうが全く見当
がつきません。どうすればいいのでしょ?
ソースがあるなら自分で治せ。
792 :
デフォルトの名無しさん :04/02/09 20:29
VBで言うところのイミディエイトウィンドウってあるの?
DELPHIもいいけど、今日からVCをはじめてみます。
794 :
デフォルトの名無しさん :04/02/09 22:36
アプリケーションでTABキーを押すとフォーカスがどんどん移っていきますよね。 このフォーカスが今どこにあるかを調べるAPIって無いでしょうか? 何か方法があったら教えてください。
TForm.ActiveControl
>>774 証明してみた。
x >= 0 かつ y >= 0 なら、x mod 3 = (x + 3y) mod 3 である。
Cpu → a、Man → b とすると、
a - b + 3 >= 0 なので、
(a - b + 3) mod 3 = (a - b + 3 + 3b) mod 3 = (a + 2b + 3) mod 3
(a + 2b) >= 0 なので、
(a + 2b + 3) mod 3 = (a + 2b) mod 3
797 :
デフォルトの名無しさん :04/02/09 23:22
>>795 レスありがとうございます。
Activecontrolを使ってみたのですが、自分自身のアプリのフォーカスのあるものが
返ってきます。
他のアプリケーションのフォーカスがある場所を取得するにはどうすれば良いのでしょうか?
GetGUIThreadInfo
799 :
デフォルトの名無しさん :04/02/09 23:57
嘘八百
801 :
デフォルトの名無しさん :04/02/10 07:31
外部プログラムを起動する方法はいろいろありますけど、終了させるには どうしたらよいのでしょう?
シグナルを送る
入力された文字列の幅を求める方法を探しているのですが、 プロポーショナルフォントの場合がめんどくさいみたいです。 MLにあったのですが、見えないラベルを用意して そこにコピーして幅を求めるのが、一番お手軽です?
>>803 Canvasが使えるならTextWidthとかはどうよ?
>>801 TerminateProcessを使う
>>804 それだと GetTextExtentPOint32 API のバグ的仕様により、フォントがイタリックだったりボールドだったりすると
右端が切れちゃうのだよ。
次の関数を定義して使ってみなさい >> 803
Var
R : TRect;
begin
DrawTextEx(Canvas.Handle, PChar(Text), -1, R, DT_CALCRECT, NIL);
result := R.RIght;
end;
すまん。間違えた。806 は忘れてくれ...
お知恵を拝借させてください。 現在、TThreadを利用して、TIdHTTPでHttpdからデータを 取得し、フォームに表示させようとしています。 TThreadは定期的に実行されhtmlを読み込み、データを フォームに表示させます。 Threadが実行され、データを取得するまでには、ネットの 具合によってある程度の時間差が生じるものと考えられま すが、この時、フォームを閉じられてしまった場合、 取得したデータを表示する場所がなくてエラーが発生する ことはありますか?実験では、デバッガ上では発生するも のの、exeからの実行では、発生しないようです。 また、いちおう対処しておきたいのですが、この場合、 synchronizeしたフォームにデータを表示させるprocedure でForm閉じられているかどうかを判断し、描画を停止する というのが普通のやり方なんでしょうか。
>>808 閉じられる時にフォーム側でスレッドを止めるのはどうだろ?
漏れは、スレッドはデータを溜め込むだけにして、適当な区切りで
スレッドからフォームにメッセージを投げ、そのメッセージハンドラから
スレッドに溜め込まれたデータを取ってきて描画というのを最近作ったけど。
いいか悪いかはわかんないけど、今のところ不具合は起きてない。
ありがとうございます。 なるほど、メッセージを投げ、フォーム側のprocedureでThreadの データを引き出すというのは思いつかなかったですね。 同様に閉じられようとしているときに、フォームのpublicな変数、 例えば、普段はTrueなfClose:Boolean等にFalseを入れてやって、 Thread側でFalseだったら描画しないというのも可能そうですかね? しかし、フォームがReleaseされるタイミングと描画のタイミングが どんぴしゃだと、やっぱりエラーになるのかしら・・・不安
>>810 フォーム側に作ると、スレッド側はSynchronizeでその変数を読むことに
なるんじゃない? それだとフォーム側の負荷が高くなるとスレッドが
待ち続けることになってしまう。だからスレッド側にその変数を置く方が
いいと思う。プロパティにしてread writeのアクセスメソッドでクリティカル
セクションを使えば同時アクセスも回避できるし、フォームが閉じられ
てもその変数が消えてしまうこともないし。
描画を全部フォーム側に持っていけば、スレッドが存在しないフォームを
触ることはなくなる。ただ描画できなかったデータをどうするかという
問題はあるけど。
812 :
◆Waf/3ZF3wg :04/02/10 13:38
98se delphi6 パーソナルをインストールしたら ウィンドーズが win.com が見つからないという表示が出て 止まってしまいました。 で、コマンドで直接 win.com を指定して実行したら無事起動しました。 autoexe.bat を開いて以下の命令を削除したら無事起動するようになりました。 SET PATH=C:\PROGRA~1\BORLAND\DELPHI6\BIN;C:\PROGRA~1 \BORLAND\DELPHI6\PROJECTS\BPL その後、うえの命令を TEST.BAT として実行したところコマンドまたはファイル名が違うと出てしまい ました。 一応DELPHI6 は動きますが、このままでも問題ないでしょか?
;%PATH%
>>812 ウィンドウズインストーラーが古かったんだね...
OS に最新のパッチ、あててる?
>>808 フォームが閉じていても、デストラクタが呼ばれていなければ見えないだけでエラーには
ならんでしょう。
OnDestroyイベントでスレッドをterminateしてwaitforすれば、スレッド停止前に
フォームが破棄されることは無いので安全です。
もちろんスレッドが自己消滅しない設定なら、waitforの後でfreeしてあげる。
>>811 ,816
ありがとうございます
書き方が悪かったです。
TThreadが動作していて、かつ描画される側のTFormがDestroyされてしまった
ときのことを考えて心配していました。実際、デバッガ環境ではエラーがでますし。
811さんのようにTFormのメソッドでTThread内のバッファを読みとる形で検証して
いましたが、WaitForがありましたね。これで終了を待てばいいわけだ・・・・
Threadは自己消滅するので、それでいけそうです。終了ボタン後にVisible:=False
してあげれば、時間差による終了の鈍さもユーザに伝わらないですしね。
ありがとうございました。ちと、実験してみます。
>>792 OutPutDebugString(PChar('文字列'));
をコード内に指定し、メニューより
表示(V)-デバッグ(D)-イベントログ(E)でウォッチすることは可能。
ただし、イベントがぜんぶ出てきてしまうので、拾い上げるのは簡単じゃない。
VBと比べて型が厳しいので、Integerをそのまま書けない(StrToIntが必要)。
いずれにせよ、VBとはイメージがだいぶ異なる。
このあたりはVBの方がだいぶやさしい(コンパイルしてしまうので、仕方が
ないんだけどね)。
そういえばどっかにメモ帳に文字列を書き出すサンプルがあったような気が。
>>818 >ただし、イベントがぜんぶ出てきてしまうので、拾い上げるのは簡単じゃない。
表示されたイベントログウィンドウを右クリックしてオプションを表示。
出力メッセージにだけチェックを入れて他のチェックを外せば
OutputDebugStringの出力だけ表示できるよ。
ところでVBのイミディエイトウィンドウって、旧来BASICのコマンドモード?
みたいなのじゃないの? PRINT 4+2[Enter]で6と表示されるような。
いや、VBは2.0の頃に3時間ほど触っただけだから全然知らないんだけど。
ふんいき→雰囲気 自分は「ふぅいき」呼んでたりする。
>>816 WaitForを見逃してて、適当にSleepしてたw
早速書き直しました。元質問者じゃないけどありがとう。
824 :
デフォルトの名無しさん :04/02/10 20:15
ファイルを開こうとするとそのファイルが使用中で開けなかったときに EFOpenErrorの例外が出てしまいます。 この例外を出したくないのですが、ファイルが開けるかどうか試す方法か ファイルが使用中がどうか確認する方法があったら教えてください。
ない exceptして理科張りし溶け
今は try 開いて処理 finally stringlist.free end ってやってるんだけど、 try try 開いて処理 except 開けなかったときの処理 end; finally stringlist.free; end; ってやらないと駄目なの? それとも今あるfinallyの場所に処理を書けばexceptしなくても大丈夫?
function IsFileBusy:Boolean; begin Result := False; try //開く動作 except //エラーキター---- Result := True; end; end;
>>826 開けなかったときに何もするつもりがないならfinallyのみでいいんじゃないか?
何度もありがとう。 どうしてもtry..finallyは外せないのですがtry..finally文の中にtry..except文を 入れて入れ子の常態にしてもきちんと処理できるのでしょうか? たくさんの変数を使う長い処理をしていてそこだけをfunctionにすることは できないもので。
>>826 >ってやらないと駄目なの?
駄目
>>827 それじゃ駄目
関数抜けた後に開ける保証はないし
仮に保証されてたとしても冗長杉
831 :
デフォルトの名無しさん :04/02/10 20:50
>>828 finallyだけだとfinallyの処理が終わったあとで例外が再育成されるから駄目
>>829 入れ子でも大丈夫だよ。
関数またいだtry/except/finallyのネストは全体で何重にもなってるし。
>>828 開けなかったときには何もするつもりはないです。
>>828 さんの回答のようにすればよいのでしょうか?
それとも
>>830 さんが言われたようにfinally文の中にexcept文を入れ子にすれば
大丈夫ですか?
自分で試せればよいのですが、めったに出ないエラーなので試せなくて、
なんでもかんでも聞いてばかりですみません。
ファイルを外部からいじれなくする方法がわかれば自分でテストプログラムを
作るのですが。。。
>>829 >try..finally文の中にtry..except文を
普通逆だと思う。
>>833 >めったに出ないエラーなので試せなくて
なぜ最小限のコードでテストしてみない?
適当なファイルを作れば出来るだろ?
>>834 おまいの普通は異常だな。
sl := TStringList.Create;
try
try
・・・
except
sl.Add('あぼ〜ん');
end;
finally
sl.Free
end
_| ̄|○ し(・∀・ ) ヨシヨシ .
>>836 のやりかたでやってみます。
皆さんありがとうございました。
840 :
デフォルトの名無しさん :04/02/10 21:49
TServerSocketとTClientSocketを使ってWinnyみたいなソフト作れますか?
>>840 パフォーマンスチューニングできないからWinInet直接使っとけ。
>>840 Winsock直叩き
nyソースはasm2cpp版がある
分かりました。でも、C++触ったことないんですけど、大丈夫でしょうか?、
cpp2pasという頼りないツールがある Winsockの基礎から学ぶとなるとものすごい大変だと思うから参考程度にすればよいかと …参考にできるレベルなら苦労しない罠(´・ω・`) TServerSocketとTCientSocketで最初はチャットくらいから始めるほうがいいかも
何でロシア人はDelphiが好きなんだ?
848 :
デフォルトの名無しさん :04/02/10 23:26
他の実行されているプログラムのMemoから 文字列を取得するにはどうすればいいんでしょうか?
>>847 オレも前から不思議に思ってた。
ググるとロシア語のヒット率が高い。
>>827 それだと、ファイルオープン以外のエラーでもtrueが返るから、
except on Eファイル開けねぇError do Result := True; end;
とすべし。
>>831 >finallyだけだとfinallyの処理が終わったあとで例外が再育成されるから駄目
finallyは、再生成も糞も、例外オブジェクトにはノータッチ。
ただ、「確実に後始末する」ためだけに存在する。
つーか、ファイルオープンエラーだけifで分岐させてエラー処理するより、
一括して例外として扱ったほうがプログラムの可読性、保守性が上がると
思うんだが。
サンクス。無事できました
昨日からDelphi始めたんでものすごい初歩的なことなんですけど。 ComboBoxにListを入れるためにはどうしたらいいんですか? ヘルプにはイベントのOnCreateを使ってみたいなことが書いてあったんですけど イベントにOnCreateの項目がないんですが・・・。 もうひとつ、Buttonをクリックすると違うFormに飛ぶってのを作りたいんですけど どうやるんですか? ホント初歩的で申し訳ないんですけど、どなたか教えて下さい
Formをダブルクリックしてみれ。基本中の基本 ポトペタすらままならないようなら、いくらここが超初心者用と言っても掲示板で世話しきれるようなものではない。 一通り入門サイトの説明をこなすべき。 飛ぶってのは何が飛ぶのでしょうか? Message?それとも一般ユーザ的な言い方だと考えるとActiveWindowが変わるということでしょうか? 質問の意図するところが漠然としていて分かりにくいのも問題があります。
そのHNはいったいなんだw
コンボボックスの中身の事か? ・設計時にItemsプロパティを編集する ・フォームのOnCreateで、Itemsを編集 好きな方を選べ。
ほんとすいません。 ActiveWindowが変わるということです。 明後日までにやらなきゃいけない課題が今日出たんで、ここで質問させてもらいました。 もうひとつ質問すいません。 Itemsプロパティってどこにあるんですか? どのHP見ても知りたい事が分からなくて。
宿題、かっこわるい。
>>856 ユーは昨日Delphiを始めた初心者に課題を出す人に教わっているの?
教わっていないです。 アルゴリズムを習って、次の日にいきなりDelphiで 文字を翻訳するプログラムを作ってこいとのことでした。 なのでこんな状況なんです。
>>856 基礎的知識から全部質問するつもりか?
違法コピーしてないんならチュートリアルがついてるからそれ読みなよ。
すいませんでした。 一人でがんばります
>違法コピーしてないんならチュートリアルがついてるからそれ読みなよ。 D6パソナルは無視?
パソナルの事言うと例のアクションマネージャの質問がくるし。
864 :
デフォルトの名無しさん :04/02/11 02:34
質問です。 TMemIniFileで設定情報を管理しているんですけど、ストリームから設定を得たいので、 TStringList.LoadStreamで読み込んだ後、TMemIniFile.SetStringsを呼ぼうと思うん ですけど、この場合、TMemIniFileのコンストラクタには何を指定すればいいのですか?
T(Mem)IniFile クラスなんだから、何か *.ini ファイルと関連付けることを前提にしています。 質問内容のように、物理的なファイルとは独立して .INI ファイル風のデータ管理をしたい。ということであれば 自前でクラスを作るしかないでしょう。 TMemIniFIle を元に作ればよいかな?
コンストラクタに 'nul' デバイスを割り当てる。という手もあるね。
>ComboBoxにListを入れるためにはどうしたらいいんですか? var List : TStringList; begin List := TStringList.Create; List.LoadFromString('文字列リストの初期値データ.txt'); ComboBox1.items := List; end; >ヘルプにはイベントのOnCreateを使 OnCreate は Form のイベント。各種データを初期化するときに使うタイミング/イベント。
>Buttonをクリックすると違うFormに飛ぶってのを作りたいんですけど Form2.Show; では足りないか?
>>865 T(Mem)IniFileはファイルに依存しているから
TCustomInifileからの継承でしょ。
テンポラリファイル経由にしてTInifile使うのが無難だと思うけどね。
下回りはストリーム読み書きのみで、上部インターフェースは INI ファイル互換。ってのは 悪くはないと思うぞ。
ストリーム使うなら永続化した方がいいし。 INIもREGも時代遅れ。
俺もそう思う部分はあるが、元質問者がそう思うかどうかとはまた別の話であることよ。 時代遅れの一言でくくってしまうようでは、まともな技術者にはなれないぞ。
どうも。Iniファイルのストリーム読み書きの件の言い出しっぺです。 Iniファイルの利点として、設計時に設定を試行錯誤するのがエディタで 簡単にできる、というのがありますが、逆にユーザが不適な設定にして 暴走させる、という可能性があるんで、設計時にはプレーンテキストで 保存して、実用では一度ストリームを介して、エラーチェック機構も噛ませて 簡単には編集できないような形式で保存できるよう、パラメータで分岐 させたかったんですよ。 ・・・で、なんかいい方法無いですかね・・・
出だしからしてなんかおかしいし。
ローカルファイルを編集不可にするなんて全く無意味。
ドキュメントにいじるなと明記しておけばいいだけ。
ゲームデータ等でチートを禁止したいならINIではなく
スクランブルかけたバイナリファイルにするしかない。
ストリームに固執したいなら
>>869 しかない。
だから、設計時は生のiniで、実際にはスクランブルかけたバイナリファイルに したいわけさ。 中身は同じ物で。大部分のコードが共用できて楽でしょ。
877 :
デフォルトの名無しさん :04/02/11 10:33
>>874 の事なんか聞かずに、俺の Create('nul') の方法でできるぞ。
878 :
ホイールマウス :04/02/11 13:05
ホイールマウスでたとえば5行分だけ上下スクロールさせるにはどうしたらいいのでしょう? procedure TForm1.WMMousewheel(var Msg: TMessage); begin if (Msg.WParam > 0) then Sendmessage(Memo1.Handle, WM_VSCROLL, SB_LINEUP, 0) //ページスクロールの場合はSB_PAGEUP else Sendmessage(Memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0); //ページスクロールの場合はSB_PAGEDOWN end; end;
変数の中の文字列を変数名として利用したい場合、どうすればいいんでしょうか…。
>>879 変数の名前はコンパイル前に決定される物なのでそういうことはできません。
ただしTStringListといったリストオブジェクトと、
データ保持用オブジェクト(用途に合わせて自分で作る)を組み合わせれば似たようなことは出来る。
>>880 うむむ…やはりそうですか。
レコード型でrec.s101〜rec.s501みたいなのがずらっとあって、
ひとつひとつやるのは効率悪いなー、と思ったので。
配列にして組み直した方がよさそうですね。
883 :
デフォルトの名無しさん :04/02/11 15:19
コンボボックスで一つ目の文字列を選ぶと’あいうえお’、2つ目は’aiueo'とでるようにしたいんですが procedure TForm1.Katati_ListChange(Sender: TObject); var n : Boolean ; begin n := Katati_List.Items[1]; if n := Katati_List.Items[1]; then ShowMessage('aiueo'); end else; begin n := Katati_List.Items[2]; if n := Katati_List.Items[2]; then ShowMessage('あいうえお'); end; こう書きました。 エラーを見てもBooleanとStringをどう使ったらいいか分からないんですが どこを直したらいいんですか? 最終的には1つを選ぶと数値を入力する表を出したいんですが・・・
なぜ n は Boolean 型?
procedure Katati_ListChange(Sender: TObject); begin case Katati_List.ItemIndex of 0: ShowMessage('aiueo'); 1: ShowMessage('あいうえお'); end; end;
>>881 当に、そういうときには、ハッシュというデータ構造を使う典型的な機会。
データ構造関連の書籍で調べてみるといいですよ。
具体的には、リスト中の文字列を先頭から全比較するのは非常に効率が悪いので、
文字列から整数値を返すハッシュ関数を用意し、予めリスト中のどの辺に格納
されているか検討を付けてから検索する。
ハッシュ関数は、リスト中にデータが均一に分散するような物が良い。
for i := 1 to Length(s) do n := (n + Ord(s[i]) * 大きい素数) mod リスト長;
とかでいいと思う。
>>886 そういう話じゃないでしょ。きっと。
ハッシュは検索時のコストを平均的に減らすための手法であって、
881 がやりたいのは参照したい変数/フィールドを他の変数でコントロールしたい。という
間接アクセスの手法を尋ねているのだと思うぞ。
ありがとうございます。 面積を計算するプログラムを作ってるんですが、 コンボボックスで形を選ぶと、必要な数値入力欄が出てくるというものをつくりたいんです。 例えば、イメージしてるのは三角形だったら底辺と高さ、ひし形だったら対角線の長さの入力欄が出てくると いったものなんですが。 その表は新たなフォームではなく同じフォーム内で出力したいんです。 形を選択するたびにメインフォームにある数値入力表が切り替わるというものを目指してます。 そこで質問なんですが、数値入力するための表というのはどこで作り、 メインフォームとはどのようにつなげればいいんでしょうか? 質問の意味が分かりづらかったら申し訳ありません。
>>888 すごい可能性がたくさんありすぎて、なんともいえないけど
1)TEditとTLabelを設置して、選択されたコンボボックスに
従ってVisible:=Falseしたり、Label.Captionを変えたりする。
2)Edit可能なStringGridの項目をTComboBoxの選択によって
変更する
3)タブシートを使って、図形により切り替える。
個人的にはタブシートを使った方が、始めたばかりの人には
わかりやすいと思う。コンボつかわないけど。
とても親切にありがとうございます。 (1)の方法でやろうと思うんですが、 procedure TForm1.Katati_ListChange(Sender: TObject); begin case Katati_List.ItemIndex of 0: Button1.Caption := ('底面'); Button2.Caption := ('高さ'); Button3.Caption := (''); 1: Button1.Caption := ('縦'); Button2.Caption := ('横'); Button3.Caption := (''); end; という風に作ったんですが、これは何が間違っているんですか?
>1)TEditとTLabelを設置して、選択されたコンボボックスに > 従ってVisible:=Falseしたり、Label.Captionを変えたりする。 コントロールをTPanelの上において、TPanelごとVisibleを変えた方が楽ですな。
>>887 >881 がやりたいのは参照したい変数/フィールドを他の変数でコントロールしたい。という
たしかに通常の変数だったら、動的に変数名から参照は無理だけど、事前に変数名に
相当するものをキーとしてハッシュに格納するよう設計変更すれば良いのでは?
>>879 から察するに。
今まで
vat hoge: String;
hoge := '腹減った';
と書いていたところを
var myhash: TMyHash;
myhash['hoge'] := '腹減った';
Edit2.Text := myhash[Edit1.Text]; //Edit1に'hoge'と書かれていたら、Edit2に'腹減った'と表示される
とすれば、動的に変数名を指定するのと同等のことが擬似的に出来ると思うが。
TMyHashクラスは自作してもらう、ということで。
>>890 まず確認したいのだが、Buttonというものがどういうもので、
Labelというのがどういうものかということを理解してる?
すいません。 LabelとButton間違えました。 LabelとEditのコントロールをPanel上におくという、概念は分かるんですが、 いまいち知識がついていきません。 本当に失礼なんですが、具体的に一例を書いていただけませんか?
こりゃ、煽りだね。
>>894 調子に乗るのもいい加減にね。
>>894 TPageControlでTTabsheet使うことをお勧めする
一つ一つのページに三角形編集用、ひし形編集用、...とつくっていく
タブが見えてるのが気に食わないならTabVisibleをFalseにして
PageControl.TabIndex := PageControlComboBox.ItemIndex;
とでもすれば
>>894 Delphi歴何日?
そのプログラムは趣味?仕事?宿題?
899 :
デフォルトの名無しさん :04/02/11 19:45
for k:=1 to 10 begin ... end; と言う行をステップ実行するとkの値が10の処理が終わって最初のfor文に 処理が戻ってきたときにend行に処理が移らずにEAccessViolationエラーが出て しまいます。 これの回避策なんてご存じ無いでしょうか。 自分でもこんな簡単な処理でエラーが出るだなんて信じられないのですが。
実際はもちろん for k:=1 to 10 do です。スマソ
>>899 >これの回避策なんてご存じ無いでしょうか。
begin〜endの中身を捨てる。
for文を移動するとprocedureの一番最後でエラーが起きるみたいです。 で、TempYen[k,j]:=calcdoll(k,j);の行をTempYen[k,j]:=0;にすると エラーが消えます。 でもこのTempYenのfunctionはただ計算をしているだけでエラーが出るような要素は 何も無いのですが。しかもエラーが出るのはその行じゃないし。 こんなエラーの回避策を知ってたら教えてください。
>こんなエラーの回避策を知ってたら教えてください。 calcdollの中身を捨てる。 配列の添字範囲外を参照してたりとかしてないか? >エラーが出るのはその行じゃないし。 AVはボディーブローのように効いてくるから、エラー行と原因が 違うことは多々ある。
>>903 >配列の添字範囲外を参照してたりとかしてないか?
これビンゴでした。ありがと。
配列に定数代入 ↓ 空のforループ と順を追っていけば、呼び出している関数が原因であろうことに 辿りつくと思うんだが。 こういうデバッグの基本をまとめてあるようなサイトとかないのかねぇ?
エラーが出るような要素は何も無いのですが。
初歩的なことなんですが、 forループの中でLabel.captionを設定すると、ループを抜けるまでLabelが更新されず、 毎回Label.refreshを実行すると更新されるようになるのは何故なんでしょうか? あと、時間がかかるループ処理を行っているときにフォームを閉じようとすると「応答なし」に なってしまうのを回避する方法はないものでしょうか・・・。
>>907 >Label.refreshを実行すると更新・・・
Windowsのメッセージキューイングの仕組みを知ればわかる。
>時間がかかるループ処理を行っているとき・・・
そのためにスレッドというものが存在する。
>>908 あー、なんとなくわかります。
ということは、「ループ中にボタンを押すと後始末して中断」とかいう処理をさせたいときは、
スレッドを2つ用意してメッセージを飛ばして・・・とかいう方針なのかな。
>>909 そんなあなたにProcessMessages(ヘルプ読んでね)
(`・ω・´)ラジャ!!
ただProcessMessagesの前後では、ローカル変数以外はデータの整合性が失われる 可能性があることに注意。 スレッドみたいに、どのタイミングで整合性が無くなるか判らないよりは初心者向け?
>>899 範囲チェックを有効にすれば、この手のエラーは解るぞ!
>>512 をいをい
>ローカル変数以外はデータの整合性が失われる
一般論みたいに説明するな。
DB 関連でそういうことがおきる可能性があるけど、それは DB ライブラリが裏で
スレッドを作っているからであって、結局マルチスレッドの問題だ。
非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で
書き換わってしまう話の出典を教えてください。
916 :
デフォルトの名無しさん :04/02/12 05:57
var
hoge: Integer;
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,i: Integer;
begin
hoge := Random(100);
a := hoge;
for i := 1 to 100 do begin
Sleep(100);
Application.ProcessMessages;
end;
b := hoge;
ShowMessageFmt('使用前:%d 使用後:%d',[a,b]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
hoge := Random(100);
end;
>>914 の作ったプログラムは怖くて使えないな(w
注意すべきはデータの整合性って言うよりも シーケンスがおかしくなりやすいってことだな。 意図しないイベントの多重発生をきっちり禁止するのは結構大変。
それは、グローバル変数を異なる場所から書き換えていることが本質的な問題だろ? Hoge の内容を、Random ではなく時刻か何かで初期化しているとしたら「正しい」プログラム じゃないか。 916 は、単に設計が悪い。
いみふめ 流れ嫁
「意図しないイベントの多重発生をきっちり禁止」 きっちり禁止できる程度の規模のプログラムなら、最初から問題は起きない。 イベントが多重発生しても大丈夫なように設計するのが世の習いでは? まず UI / イベント系と実処理を分離し、間にシングルトンのオブジェクトをひとつかます。 中間オブジェクトが実処理の進捗状況を把握するようにしておけば、プログレスバーの実装も容易。
いみふめ 流れ嫁
まぁ超初心者用だから、921 が理解できないのも仕方がないかぁ
>>914 =
>>918 =>922
>非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で
>書き換わってしまう話の出典を教えてください。
>>912 >ただProcessMessagesの前後では、ローカル変数以外はデータの整合性が失われる
>可能性があることに注意。
>>914 >非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で
>書き換わってしまう話の出典を教えてください。
ま、可能性があることは
>>916 で証明できたわけだし、
>916 は、単に設計が悪い。
悪い例を挙げろ、といわれたから書いたまで。
負け惜しみにしても低レベル過ぎ。
>>924 ローカル変数だって整合性が失われ可能性はあるぞ!
どっちがレベルが低いかその少ない脳みそでよく考えるように。
問題はDelphiのTThreadのお手軽度が異常に低いってことだな。 だから安易にApplication.ProcessMessagesに逃げて破綻する。 しかもパフォーマンスも悪いし。
・論点のすり替え ・日本語の誤り 明らかに自分が劣勢だって自覚しているくせに、往生際が悪いんだな(プゲラ
928 :
デフォルトの名無しさん :04/02/12 07:27
>>920 >イベントが多重発生しても大丈夫なように設計するのが世の習いでは?
イベントが多重に発生しないように設計するのがDelphiの習いでは?
処理中はふつー無関係なコントロールやメニューを触れないようにするのが筋だろ。
このスレ朝になるとバトルが始まるな。どうなっdの?
930 :
デフォルトの名無しさん :04/02/12 07:49
ふつーはリエントラントにするだろ? 低レベルな突っ込みはよしてくれよぉ
>>931 もはや反論の為の反論だな。カコワルイ
ふつー開始ボタン押したら開始ボタンは無効にするだろ。
押せるようにしといて押しても何もしないなんてUIは糞。
よくわからない議論になってませんか? 916 の例示は意図的過ぎると思います。 ProcessMessage を呼ぶループが動いている間に Button2 をクリックした時だけ問題がおきるわけでしょ? ProcessMessage の問題ではないと思いますよ。 シングルスレッド/シングルタスクに慣れている人が陥りやすい問題。という話なら納得しますけど
すべては
>>912 の表現が悪い。
ProcessMessagesの注意点をデータの整合性とか言うからおかしくなるんだよ。
イベントの多重発生が起こるのでそれをうまく処理しとけって言うだけの話。
これはProcessMessages固有の問題。スレッド云々とは無関係。
誰も聞かないと思うけど、一応。 ここは相談室なので、そろそろ談話室に行きませんか?
俺が2chの好きな理由の一つに話がスレの趣向から簡単に反れてしまう所にある
> 916 の例示は意図的過ぎると思います。 916 は頭が悪いだけ。 「ローカル変数以外はデータの整合性が失われる」 Button2Click で Hoge が 変更されるのは、そのようにプログラムしているから。整合性ばっちり。 例になってない。
> だから安易にApplication.ProcessMessagesに逃げて破綻する。 安易に逃げるのは Delphi のせいではなく、DQN プログラマのせい。 そいつらが安易にスレッドつくるよりまし
>DQN プログラマのせい。 超上級者用スレへどうぞ
DQN者用スレもあるの?
>非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で >書き換わってしまう話の出典を教えてください。 こんな馬鹿な質問をしてしまったからってそんなに必死に弁解しなくても・・・ ここは犯罪起こさなきゃ匿名サイトなんだからさ。
StringGridの編集可能なセルで キャレットのある位置に文字を挿入したいのですが(SelTextのような感じで) どうすればできるのでしょうか。 お願いします教えてください(;´д⊂
Borlandからバージョンアップの封筒が来た。 早速、申し込もうかなぁ。
D6Per使ってます。 TListで項目を削除すると、そこはnilになって残りますが TListViewなどはItemをDeleteすると自動的に番号を詰めてくれますよね? これはTListViewでは削除時に自動でPackを行ってるということでよろしいのでしょうか?(たぶん違 Packというメソッドがないんですが・・・どういう仕組みなんでしょうか?
947 :
デフォルトの名無しさん :04/02/12 18:58
950 :
デフォルトの名無しさん :04/02/12 20:19
Delphiの最強の暗号化コンポーネントありまませんか?
952 :
デフォルトの名無しさん :04/02/12 20:42
record型でデータを定義してプログラムを作りました。 Newでいくつも作成して、ポインターをTListに登録して 使い回すのですが、これをclassに変えた場合、Createで いくつも作成するまではいいのですが、管理するには 何を使えばいいのでしょう? TStringListとかで、AddObjectですかね?
作製したクラスのポインタをTlistで管理。
954 :
デフォルトの名無しさん :04/02/12 21:02
【質問】 質問させてください。ある桁数を指定すると、 その桁まで総当たりで順番に処理するには、どうすればいいのでしょうか? 例えば3桁を指定した場合、 $00, $01, $02,・・・ $ff, $00 $00, $00 $01, $00 $02,・・・ $ff $ff, $00 $00 $00,$00 $00 $01,$00 $00 $02,・・・,$ff $ff $ff というように処理出来るようにしたいのですが。 n桁の場合どうしたらいいのでしょうか? 何か巧いやり方があったらご教授願いますm(_ _)m
955 :
デフォルトの名無しさん :04/02/12 21:04
>>945 > TListで項目を削除すると、そこはnilになって残りますが
ちゃんと詰められるはずだけど?
>>943 フォーカスを移さないように SpeedButton を使って
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if StringGrid1.ControlCount = 1 then
TInplaceEdit(StringGrid1.Controls[0]).SelText := 'AAA';
end;
>>954 > その桁まで総当たりで順番に処理するには
もうちょっと、やりたいことを詳しく説明して
>>952 TObjectListを使うと多少楽。
>>954 for 桁数 := 1 to 桁数の上限 to
for 値 := 0 to (1 shl (桁数 * 8))-1 do
色々な処理;
メインUNITと複数のCPUUNITを作って 一つのメインUNITから、複数のCPUUNITへ盤面情報として 配列を直接引数として渡したいのですがうまくいきません。 固定配列をメインとCPUで宣言しても共通が無いと言われますし USES節で片方向や双方向の参照を試してもうまくいきませんでした。 配列を引数にするには型宣言が必要。 メインのインターフェイスで配列型宣言する→CPUUNITのインターフェイスでプロシージャ宣言に型が使えない。 CPUUNITで配列型宣言する→メインのインターフェイスで型宣言ができる →が、CPUUNITが複数になりCPU1、CPU2、CPU3などに増えた場合、宣言が重複する。 こういうやり方がおかしいのでしょうか、それとも他にもっといいやりかたがあるのでしょうか?
宣言専門の Unit を作って、それを 各 UNIT から uses するという頭の 悪い方法もある。
>>961 俺はある程度プログラムサイズが大きくなったら、複数のユニットで共有する
型宣言や定数宣言だけをまとめて、DefinitionsUnit.pasとして、それを
参照するようにしてるけど。
>>962 なんで俺が頭が悪いこと知ってるんだ?おまえ何者?
>>963 VCLなんかもそんな風に処理してるんだろうけど、
スマートなようでスマートじゃ無い気がしてきて、
気になって気になってどうしようもない。
お答えありがとうございました。やっぱりそれが一番簡単ですね。 ・・・自分でも思いついてたけど、なんとなく それだけは止めておこうと思ったのに_| ̄|○ 素直にParamUnitを立ち上げることにします。
>>957 様
レスありがとうございます。こんな簡単にできるんですね・・・衝撃です。
早速やってみます。多謝です!
あと,947様。ご気分を害してしまって申し訳ありませんでした。
オブジェクトの解放のことで教えて下さい。 たとえば、レコード型のデータを複数のList系のオブジェクトに、 addobject等で入れた時、入れた分だけDisposしてやらないと いけませんよね? レコード型をclassに変えた場合って、Createした分Freeしてやるだけで いいんですかね?
>>968 そうだけど、TObjectListの利用も検討すれ。
>>969 TObjectListを使っては見たんですが、
CombBoxとかにAddObjectもしたんです。
で、ポインターの感覚でCombBox、TObjectList
両方Freeしようとしたら、エラーが出たんで。
片一方(TObjectList.Freeしか試してないですが)なら
そのまますんなりだったんで、レコード型との
違いを確認したかったんです。
ありがとうございました。
>>970 >で、ポインターの感覚でCombBox、TObjectList
>両方Freeしようとしたら、エラーが出たんで。
TObjectListなら、標準状態ならTObjectListから削除したときに、勝手にFreeしてくれるから、
*両方ともも* Freeする必要はありません。DeleteさえすればOK。
ともも、だって。すまん。
あと次スレよろしく。
「くだすれDelphi超初心者用 その11」で。
>>1 に、コードを全く書かずに、「○○○することは出来ますか?」という質問は
禁止する、とのことを書いてくれるといいっぽい。
あとは、現状の
>>1 のコピーでいいでしょう。現スレへのリンクの追加も忘れずに。
>>972 それ、オレが書いた時は「仕切るな」って書かれただけだぞ。
>>973 500くらいで言うか、970で言うかの違いだろ。
>>977 「どうせ『また騙されたのか?系』だろ」と思ったが…。
ワラタ。
>>977 なるほど、たしかに頭よさそうだね。
Delユーザにはほんと頭いいのが多いね。
(´-`)。o ○ (ユーモアの無いヤツはこれだから…)
>>981 Delユーザにはほんとユーモアがあって頭いいのが多いね。
勉強になるわ、マジで
うーん 二つできてるぞ。
ウザ
重複キター?
前スレに誘導レスもできないなんて、Delユーザはほんと頭いいね。 つーか、立てる前に宣言しろよ。
重複した奴も立てる直前で調べろよ。
990 :
デフォルトの名無しさん :04/02/13 19:23
よし たてるぞー(w
992 :
デフォルトの名無しさん :04/02/13 20:47
Del8のキャンペーン申し込んで、 日本語版来た人いる?
993 :
デフォルトの名無しさん :04/02/13 20:50
記念カキコ v(^-^*)
ageずに埋めれ
埋め
996 :
デフォルトの名無しさん :04/02/13 20:58
(゚д゚) <シメジ
あぼーん
良スレの予感
999 :
デフォルトの名無しさん :04/02/13 21:08
>>998 激しく同意
これからのスレッドの流れに期待だな。
1!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。