Delphi相談室(超初心者用)その10

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、お礼はDelphiの布教と初心者の
救済をお願いします。

<類似スレ>
Delphi相談室(中級者以上)その12
http://pc2.2ch.net/test/read.cgi/tech/1064420818/
Delphi相談室(上級者用)その12
http://pc2.2ch.net/test/read.cgi/tech/1064766880/
ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その11
http://pc2.2ch.net/test/read.cgi/tech/1068564708/
2デフォルトの名無しさん:04/01/19 23:51
このスレは、以前「くだすれDelphi Part○ (超初心者向け) 」とされていましたが、
タイトルを中・上級用相談室と統一しました。
ほとんど更新されてないけど、これも書けよ。
毎回書いてもらえない。

DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
Delphiの入手とインストール
http://onigiri.s3.xrea.com:8080/delphi/index.php?%5B%5BDelphi%A4%CE%C6%FE%BC%EA%A4%C8%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%5D%5D

どのバージョンを使えばよいか迷ったらこちら。
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
データベース的存在として
http://www.sakaki.keiaikai.or.jp/
もいいぞ。
>>16
1995年以降、時が止まってますか?
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ファイルを読み込んで
自身のコンポーネントの設定をしているからです。
こういう設計はあまりよくないのでしょうか。
2420:04/01/20 10:45
>>23
良いか悪いかは別にして、俺のやり方。

・Iniの読み書きは1つのDataModuleにまとめる。
・起動時、Form1はそのIniModuleから読む。
・設定の場合、Form2のOnShowでIniModuleから読む。
・Form2でOKがクリックされたらIniModuleへ設定保存。
・Form2で設定が保存されたら、Form1はIniModuleから読み直す。

なんか無駄なことしてる気もするけど、ずっとこれで通してる。
少なくともForm1とForm2の起動順を入れ替える等、トリッキーな
ことはしなくていいし。
2522:04/01/20 11:10
TMainMenuコンポーネントではこのバグ(?)は起こりませんでした。

そこで、このTMainMenuのマウスイン、アウト(エンター、リーブ)のイベントを
まねしようかと思うのですが、VCLをいくら見ても分かりませんでした。

TMainMenuのマウスイン、アウト部分はどこに記述されているのでしょうか?
>>25
想像だけど、Windowsに記述されてるんじゃないの?
>>22
つまり altキーを1回押したのと同じかね?
2822:04/01/20 11:39
>>26
げ。それじゃあマネしようがないですね。

>>27
そうです。その状態になります。
自作コンポの方はAltキーに対応してないので、
マウスが乗ってないのに画像が変更されるのは具合が悪いんです。
>>23
オブジェクトの生成順序に依存するようなコードは読みづらいのでメンテしづらい。でバグが出る。
コメントをたっぷり入れるか、順序に依存しないようにコードを書き換える。

もちろんプログラムには何らかの「順序」が存在するわけだけどね。
20 さんの用に .INI 読み出しをそれぞれのクラスの生成から分離/独立させるのが
わかりやすいでしょう。
データモジュールはフォームのように扱えるけど MainForm にはなりませんから、こういった
用途にはうってつけ。

シングルトンになるように配慮したグローバル変数(の用に見える関数/プロパティ)というのも
よく使われる技法です。TPrinter の Printer あたりが例。

>>25
TMainMenuはWindows側で処理されてるのでいくら探してもみつからないはず。

CM_MOUSELEAVEは既にIdleで処理されているよ。
TApplicaitonのPeekMessageでメッセージキューが空の場合(即ちIdle時)に
ControlにCM_MOUSELEAVE、CM_MOUSEENTERは送られる。
そのあたりを見てたらなんかわかるかも。
3122:04/01/20 13:36
>>30
有益な情報ありがとうございます。
なるほど、CM_MOUSELEAVEはTApplicationが飛ばしているメッセージなんですね。

ふむふむ・・・

え〜っと・・・・

わかりませんでした。_| ̄|○

コントロール自体にOnIdleを実装して、そこでマウスがコントロール上になかったら
CM_MOUSELEAVEを投げるようにしてやろうかと思ったけど、
OnIdleって実装できませんよね?
(実装できても、コントロール上のマウスのあり、なしを判定する方法が不明だし・・)
Application.OnIdle
3322:04/01/20 13:50
>>32
constructor TMyCompo(AOwner: TComponent);
begin
inherited Create(AOwner);
Application.OnIdle := Idle;
end;
ってやるんですか?
でもこれだと、フォームのクリエイトで
Application.OnIdle := Form1OnIdle;
ってやると、無効になりませんか?
constructor TMyCompo.Create(AOwner: TComponent);
>>34
うれしいか?
36デフォルトの名無しさん:04/01/20 17:53
>>20
iniファイルを読み込んでFormに表示、Formでその内容を変更できる。
そんな汎用のコンポーネントを作ろうとして、同じ問題にぶつかりました。
>>36
そういったことを扱うために DataModule があるんだよ。
もっともっと使いなさい。
別にINIファイル扱うのにDataModuleなんていらないだろ。
unit化しておくだけで十分。
3936:04/01/20 18:00
>>37
Formも含めて汎用のコンポーネントにしたかったんですが
>>38
Toy プログラムならね。
Form1のOnCreateでIniから読み込まないと支障のあるプログラムを
書いてるんですか?
俺はOnShowで読めば済むようなプログラムばかりなんですが。
>>36
無くても作れると思うよ。
プロパティに iniファイルの名前、Memoコンポーネントを指定したら
TMemo.OnChangeを勝手に設定するコンポーネントだよね?
4336:04/01/20 18:04
>>41
例えば、シリアル通信のコンポーネントでCreate時にdefault値を読み込んでおいて
プログラムで変更修正するようなものをつくるとか。
>>43
それをIniに保存するのは違うと思う。
4536:04/01/20 18:09
↑いざ、パッと書いてみてアレって思ったけど、
たしかそんな事をやろうとしてひっかかったです。
じゃ、こうしよう。
Form1.Createでiniを読み込む。
そのデータをForm1のパブリックで宣言したレコード型の構造体に、
がんがんいれてく。Form2は、Form1.Create時にCreateして構造体
のデータを参照する。
>>43
コンポーネントはCreate時に基本的に動いちゃいけないよ。
せめてLodedを待て
4836:04/01/20 18:11
>>44
保存もするし、Form上で変更した値も使う。
でも最初に読んだiniの値をあちこちの各FormでCreate時に使いたいみたいな感じだったと思います。
4936:04/01/20 18:14
で、>>21さんのようにやればOKだったのですが、
各FormのCreateの順番を意識させることになる汎用コンポはダサイな
と思ってやめたように思います。
>各FormでCreate時に使いたいみたいな
ぉ〜ぃ >>41の答えになってないぞー。
5136:04/01/20 18:21
>>50
ShowしないFormもあったりShowの度では困るし、意味としてはCreateなので一番最初のShow時だけってするのもカコワルかなとか。
5236:04/01/20 18:33
ほんとにそうだったかなと自問してました。
よく考えたらそんなに問題なくできそうな。。。。
アレ?最初のFormのCreate時にCreateされていればよさそうな。。

ただ、>>20さんと同じ問題をかかえたのがそんなようなことだった気がしただけですので
流してください。
5336:04/01/20 18:34
>>20じゃなくて>>19
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をコンポとして使いたいということで、
悩んでるのかな?

この手は、たぶんソースと、何をしたいかを公開
しないと解決法はでなさげ。
そういう呼び出し時の問題うんぬんは、たぶん設計
が間違ってるからのような気がする。

だから、ソースとか、仕様が欲しいわけだが。
>>54
Repaintはどうよ?
ほんとだ!!

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?
6154:04/01/20 20:05
>>56
すみません、これは分かりやすくする為に単純化したのですが、実際は
スプラッシュウィンドウを表示している間は他の処理をさせたくないのに
他の処理が実行されてしまいます。

何か良い方法は無いでしょうか?
6254:04/01/20 20:06
>>59
すみません、これはどういうことでしょうか?
>>58
オンメモリで退避するだけなら
SavedTreeNode := TTreeNodes.Create(nil);
SavedTreeNode.Assign( CurrentTreeNode )

6454:04/01/20 21:39
フラグを使ってためしにやってみたら無限ループに陥ってしまいました。
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の処理が
終わるまで待たせるにはどうしたらいいの?
6714:04/01/20 21:53
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のイベントメソッドが最も重要になるかと思います。

これ以上詳しい話になるとソースを見ないとちょっと難しいのでご容赦を。
>>70
^無し。
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
仕事なり趣味なり、真剣に情報を収集している人以外を「厨」なり
何なり言ってください。
>>92
スレ立てた人にも失礼だよ。
その程度、簡単な文字列処理で対応できないか?

2ch のメカニズム上、スレタイが揺らぐことは当たり前と考えるべきで
それを考慮したシステムをとっとと作れ。よい勉強になるとおもうよ。
97デフォルトの名無しさん:04/01/22 10:11
>>88
MLとはUsersGroupのDelphiMLのことかな?
かなり専門的でほとんどついていけないけど過去ログとか検索すると
色々ためになってる。質問して怒られでもしたの?
過去ログ嫁。
 または
Delphi とは無関係です。帰れ。
 または
お前の質問は間違っている。こうすればできる(と言って、たいてい Delphi を使わない、プログラムとは関係ない話が始まる)

じゃないかな?
誰かmysql.pas
ttp://www.fichtner.net/delphi/mysql.delphi.phtml
使ってるやつ居ないか?
mysql_test.zipが文字化けしまくってるんだけど直せねぇ
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
に設定しなおす。

これで日本語が表示できるようになる。

これ以外の問題かな?
10499:04/01/22 11:31
う〜んそれでも表示されない・・
下が実行結果です。
(ここから)
* 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 のバージョン.
>>98
+頓珍漢な答えがかえってくる
全部戸田
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だと 入った時点では何もないが、それから蓄積していけば いくらか役に立つ
データーベースとなる。
11299:04/01/22 12:54
>>106
 そうだったのか・・

            _| ̄|○
>>111
2ch や、US Borland Newsgroup では過去ログシステムが無いから、だれも
過去ログを読め。とはいわない。

同じ質問でも繰り返し答えがつく。異なる人が、さらに別の人から教わった知識に
新しい、その時代時代の知識を付加して伝えていく。
たまに書籍になったり、まとまって Web ページが出来たりするのだ。
>>106
がんがれ。
115デフォルトの名無しさん:04/01/22 13:05
Users Groupの場合、過去ログの検索があるので
入ってすぐでも使えるかと。

116デフォルトの名無しさん:04/01/22 13:10
>>115
過去ログ検索はMLに入らなくても使えると思うが..
117デフォルトの名無しさん:04/01/22 13:13
>>116
その通りでした。
参考:http://www2.big.or.jp/~osamu/Delphi/
>>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 を
呼び出して値を取り出さないといけないよ。
119110:04/01/22 14:23
ddeman.pas読みまくり中です。
>>118
ありがとさんです。
基本的にddeclientitemのOnChangeイベントで戻り値を取ろうとし
DDEITEMプロペティでコケてますた。

VBでの呼び出しサンプルがくっついてるんですが、Object.Linkexecute
を使ってます。この辺はワケワカラン

ddeman.pasですが、ConvなんかのプロパをいじればDdeItemを''したり
してますが、とりあえず

ExecuteMacro かPokeData送って
RequestData で受ける方向で模索してみます。

あかんかったら、またきます。
120デフォルトの名無しさん:04/01/22 14:34
じゃ 過去ログ検索してこい

http://www2.big.or.jp/~osamu/Delphi/

なんてのが できるのか
121110:04/01/22 14:41
>>120
過去ログはとっくに検索済み
ほぼ同じ質問があったが、
ttp://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=005592
誰も答えてない。
その分、118の情報は貴重、情報感謝!!>118
うわ。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
127125:04/01/22 15:24
>>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;
128100:04/01/22 15:30
>>101
子Windowは他人のアプリです。
ハンドルが取れなくて。。。
▼の代わりに Marlett の '6' または 'u' を使うと、ビットマップより遙かにきれいだぞ
>>124
入れないと、サブコンポーネントの Published プロパティがオブジェクトインスペクタに
出てこなくなる。その場合親コンポで対応するプロパティを用意する必要がある。
そんだけ。
131デフォルトの名無しさん:04/01/22 15:41
D6でMemCheckつけてTIdHTTP置いてコンパイルするだけ

種類: 不明
サイズ: 28 バイト
バイナリ:
D492450020711400FFFFFFFF00000000000000000000000000000000

不明なファイル : @System@@StartExe 関数

てなエラー吐きます。

ActiveXから取り込んだコンポーネントも同じようなエラー吐くんですが、
これはMemCheckがD6に対応してないだけと考えてOKですか?
132125:04/01/22 15:43
>>129
すばらしいです!
これならコントロールのサイズが変わっても
綺麗に表示出来そうですね!

ありがとうございました!
気にしなくていいんじゃないの?

バグがあると MemCheck に引っかかることがあるけど
MemCheck に引っかかったからといってバグがあるわけではない。

System/StartExe ってことだから、MemCheck のメモリ監視ルーチンが停止した後に
Delphi RTL がメモリを破棄しているんでしょう。で、MemCheck ではチェックできない。と。

MemCheck も Delphi でかかれているため、自ずと制限があることを忘れずに。
134124:04/01/22 15:46
>>130
なるほど、そういうことでしたか・・・

その説明を受けて中村氏の本の一文
"内部コンポーネントのプロパティ/イベントを隠す必要になる。 "
"それはとてもめんどくさい"

の意味が理解できました
ありがとうございました
なんか、超初心者用。って感じじゃ無くなってきたなぁ...

各自、他のスレも使うようよろしく。回答者はどのスレも見てるよ。
>>133
わかりました。ほっぽときます。
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, '''');
141138:04/01/22 16:57
>>140
ありがとうございます。
できました。
>>137
今、手元ではテストできないのだが。

image1.SaveToStream( aMemoryStream );
For ind := 0 to aMemoryStream.Size do
aMemoryStream[ind];

って感じでうまくいくでしょう
143デフォルトの名無しさん:04/01/22 18:03
ポインタのポインタって宣言できるよね。
あれと同じようにオブジェクト参照型の参照型って出来るかな?無理ぽ?
144137:04/01/22 18:17
>>142
aMemoryStream[ind]
とやると「このクラスはデフォルトプロパティを持っていません」
と言われました。
ClientDataSetでXMLを扱うときにデータの検索方法は
ループで回すしかないのでしょうか?
バイナリファイルの先頭に1バイトだけデータを追記したいのですが
やっぱり下記手順でやるしか無いですか?
ファイルのサイズが何十メガもあって、たった1バイト追加したいだけなのに
つらいなぁ・・・

手順
@作業用ファイルを開き1バイト書き込む
Aバイナリファイルを全て読み込んで作業用ファイルに書き込む
Bバイナリファイル削除
C作業用ファイルリネーム
>>144
var
 Buffer : PByte;

 Buffer *= PByte(aMemoryStream);

 Buffer[Ind];
148すまん:04/01/22 18:39
*= -> :=
です。
>>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;
155143:04/01/22 20:12
う〜ん、やっぱりオブジェクト変数とポインタを組み合わせて使うしかないのかな。
考えてみればそんな構文用意されてないしね。

ありがと。
>>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に変えてアイコンにしようとしても
アイコンイメージが不正です、と言われてエラーになってしまいます。
アイコンに登録するにはどうすれば良いのでしょうか?
164159:04/01/22 23:42
ありがとうございます。
御指摘の通り使いたいのはTPageControlでした。



ややこしい名前つけてんじゃねーよ ヽ(`Д´)ノバーヤ
165デフォルトの名無しさん:04/01/22 23:45
>>163
うわー…。

マジレスしていいんだよね?
アイコンエディタでアイコン作ってくれ。
アイコンとビットマップは違(略)
166163:04/01/22 23:55
>>165
あの、イメージエディタってどうやって起動するの?
ヘルプにはイメージエディタのアイコンをクリックしろ、と書いてるけど
イメージエディタのアイコンなんてどこにも無いよ。

スタートメニューからDelphi関係は全部削除しててショートカットでDelphiは
起動してるんだけど、Image***って感じの実行ファイルはどこにも無かった。
Delphi立ち上げて「ツール」メニューの中を見ろ。
そこのまで削除してあったら、真の漢だ。
>>166
imagedit.exeがなければ、再インストール。

アイコンとビットマップの違いを知らん香具師がメニューを削除するなよ
という気もするが、まあ個人の自由だからな。
169163:04/01/23 00:10
>>167
ネタじゃなくて無いっす。漢なのかな?(汗)
フリーのアイコンエディタを使って解決しますた。
でもいいのかな?(汗)
一行が256文字を超える文字列の配列を使いたいのですがどうしたらいいですか?
var hairetu : array[1..20] of Ansistring;
としてもhairetuに256文字以上代入しようとするとこれ以上入んねーよヴォケと
言われてエラーとなってしまいます。
>>170 Tstringlist じゃだめでつか
ごめんダメだね_| ̄|○
173143:04/01/23 00:30
AnsiStringなら2GByteまで大丈夫なはずだが?
たしかstringもデフォルトで2Gじゃなかったっけか?
でも試したけど確かに怒られるなぁ。何故だ
怒られる理由がわからないな・・・
pcharではどうだろう
176157:04/01/23 00:59
>>158
さんくす。通りました。
でも「1 秒あたり何千ものメッセージを〜」って書いてあるんですが、大丈夫でしょうか。
全てのメッセージでカーソル位置比較してますけど…。
' ←これでHELPをひけば理解できる模様。
''で扱える文字列の限界が255文字との事。
>>177
な、なんだってー
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;
//こんな感じ
ソフトのタイトルとエラーウィンドウのキャプションは同じでした。
193190:04/01/23 13:02
>>191
ご回答ありがとうございます。
ポインタ型を返す関数の中での処理なので、できればPointer型で対処したいのですが、
そうすると、すごく難しいのでしょうか?

教えて頂いた方法で試してみたのですが、
buf := 問題の関数;//ポインタ型で返ってくる
(処理)
FreeMem(buf);
↑開放した時にアドレス違反になります。
194デフォルトの名無しさん:04/01/23 13:13
Formに乗っかっている全てのコンポーネントの
OnMouseMoveのみをフラグで殺したいのですが、遣り方が分かりません。

たぶんWM_MOUSE_MOVEみたいなメッセージを無効に出来れば良いのだと思いますが、
遣り方を教えて下さい。
宜しくお願いします。
まず、Delphiとポインタに関する勉強をしたほうがよくないか?
Delphi ポインタで検索するといろいろでてくるけど。

ポインタ型を返す関数の処理なら、使用した配列のポインタを
返してあげればいいだけのような気がするが・・・・

あと、varで配列としてすでにメモリを確保しているんだから、
解放不要だと思うのだが・・・
>>192
エラーウィンドウのOKボタンを押す動作をしてみるのは?
>>194
override
>>194
なんでそんなことを....

Application の OnMessage で WM_MOUSEMOVE の時に Handled に Trueをセットする。

これでアプリケーション全体で WM_MOUSEMOVE が止まる。

簡単に設定するには TApplicationEvent を使うとよい
198194:04/01/23 14:08
>>197
ありがとうございます。できました。
便乗質問
>>197
CM_MOUSELEAVE
だったらどうやればできます?
>>199
上のほうにいた人でつか?
201199:04/01/23 14:38
>>200
そうでつ。
>>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を発行するしかないんじゃない
のかな。
203199:04/01/23 15:42
>>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++ のインスタンスを静的に確保する意味はないでしょう?

これ、よくわからないので解説してもらえないですか?
214213:04/01/23 19:45
すみません、わかりました。
215204:04/01/23 19:54
>>208
自分へのレスと捕らえてよろしいでしょうか?

ということは、コンストラクタでウィンドウ生成(CreateWindow)した場合は
クラスメソッド(THoge.WndProc)の呼び出しよりWM_CREATEの発生が先ということですか。

Halbow氏のコメント通り、WM_CREATE(orWM_NCCREATE)は別のルーチンで捕まえて、
それ以後、メソッドで処理するということになりますね。

有難うございました。
216206:04/01/23 20:09
>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を受け取るハンドラを書いておくだけの方が少しは楽かなと思ったのです。
217206:04/01/23 20:11
>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がおこなわれた場合どうなるのでしょうか?
218206:04/01/23 20:12
訂正
procedure TMyThread.DoLogOut;
begin
 LogListBox(fLogMessage);
end;
219デフォルトの名無しさん:04/01/23 20:12
ポインタAから10バイト読み出して使いたいのですがmemcpyみたいな関数ありませんか?
220206:04/01/23 20:15
TerminateしてもTerminated変数がTrueになるだけなのはわかっていますが、
どうやってLockから抜け出せばよいのかがわかりませんという質問です。
たびたびすみません。
>219
PChar(ptrA)にキャストすれば、後はいかようにでも。
222206:04/01/23 20:26
そんな心配しなくても処理を終わらせればいいんですよね。
杞憂でした。ありがとうございました。
TStringListがCreate済みかどうかを知る方法?
ttp://www.sakaki.keiaikai.or.jp/cgi-bin/ConvRoom/webconv.dll/alltree?No=19022

投稿者、何がしたいのだろう・・・
>>193
関数内で確保したメモリをポインタ型で返すの?
>>190のコードで
 p : pointer; ->  p : Pbyte; //pointer より PChar か PByte が良い

にすれば大丈夫だと思うよ。 PByteでもPCharでもPShortIntだったか PSmallIntだったかでも

で、もしかして>>190のコードでも動いてるんじゃないの?

SizeOf(p) は4 だけど 読み込んだサイズとこれとは関係ないよ

225210:04/01/23 20:56
>>212
できたー。ありがとうございます。
>223
未初期化・解放済みでゴミになってるポインタと
正しく構築されたオブジェクトを指してるポインタを区別したいんだろ。
>>219
Move関数。手続きだったかな?
228デフォルトの名無しさん:04/01/23 22:19
前スレの終わりの方で232Cコンポを教えてもらったのだが、
Delの3.1とかには232Cコンポって入ってないですか?
まだ、3.1使ってる人教えて下さい。
無料で使える音声認識ライブラリはありませんか?
[いち]とか[に]とか数字だけ認識できればいいのですが・・・
Win32APIスレで今ちょうど誰かやってるよ。音声の
231229:04/01/23 23:27
本当ですね!!誘導ありがとうございます。
....でもDelphiで使うには難しそう(´・ω・`)
>>229
大学の卒研に使ったプログラムで良ければ…
>>228
Delphiに標準で232Cコンポが付いたことは一度もない。
接続してきたPCのMACアドレスを調べるソフトを作りたいんだけど、無理かな?
スレのキャプションが変わったからか、進行が速くなったか?
>>234
無理/無理じゃない

好きなの選べ。

>>235
つーか、ヘルプ読め系が多いと思う。
>>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 バイトずつ調べるしかないんじゃないの?
247299:04/01/24 10:01
>>232
ぜひお願いします。
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スレ池
251229:04/01/24 11:17
ごめんなさい>>247>>229の間違いです。。。
252228:04/01/24 11:39
>>233
遅レス、スマソ
そうなんですか。
3.1の頃ならまだ、232c当たり前だから
有るかなと思った。
>>249
糸電話
人の質問を真摯に聞かないばかりか嘘の情報を教えますか。
まったくDel厨は程度が低いですねぇ(藁
>>254
煽りをする人間は程度が高いかどうかについてどう思われますか?
256デフォルトの名無しさん:04/01/24 23:07
Form1にPageControl1を置いてTabSheet1とTabSheet2を作ったまではよかったんだけど
TabSheet2に置いたコントロールにアクセスできません。
Form1.〜 じゃダメなんですか?
>>256  
tabsheetの上にbutton1を置いて試して見ましたが問題なくできました。 謎ですね。
258256:04/01/24 23:32
再起動したら直りました。お騒がせして申し訳ない
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万行が表示される可能性もあるという、
他人には絶対使わせられないアプリを作って使ってる。
>>265
Format()
>>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
Ord、Chr
>>274

s := 'abcd';
for i := 1 to length(s) do
 if s[i] = #61 then
  s[i] := #41;

1、#64 は char(64) とも書ける
2、文字列を配列として使う時の添え字は1から
>>275
thx
>>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以下のフォルダへコピーしてファイルの関連付けしてくれるだけでいいんです。
>>281
inno setup
>>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 でデバッグしていますが
問題を感じたことはないです。
287285:04/01/26 18:46
>>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;

じゃ駄目?
297295:04/01/26 23:50
>>296
ありがとうございます。ちょっとやってみます。
298238:04/01/26 23:59
>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であのようなダイアログやウィザードは作れないのですか?
302299:04/01/27 00:22
>>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)

もっと簡単にできますか?
何を作っているのかによって教えてあげる
311285:04/01/27 10:02
>>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も書き換えたい(親のコントロールと同期をとりたい)
のですがプロパティの継承はどのようにするのでしょう?
316309:04/01/27 14:59
>>310
295とは違いますけど、同じことをしようとしてます。
ふたつの以上のファイルを結合して、それを分解。

>>314
ありがとうございます。
やっぱりこれでも大丈夫ですよねぇ。
でもMemo1にLoadFromStreamとしても…って。
あー…ボケてました。TStreamに読み込んだらposition変わるんだった。
seekなりpositionなりしないといかんですよ…。

ごめんなさいー…。
317デフォルトの名無しさん:04/01/27 16:16
 Editに複数行表示させたいのですが、
どうすればよいでしょうか。
まさにくだらない質問ですいません。
Memoをつかう
319デフォルトの名無しさん:04/01/27 16:28
>>318ありがとう
8bit bitmapを32bit bitmapにコピーしようとしています。

例えば、8bit bitmapの$100に指定されているパレットの色にアクセス
するためにはどうすればよいのでしょうか?
321320:04/01/27 17:21
間違えました。
$100 -> 100
322295:04/01/27 18:29
>>296
やってみましたが速度的には変化なかったです・・・。
同じ機能を持ったTOOL、おそらくVCで作られた物だと
かなり高速に処理されるんですが。。
Delphiだと駄目なのかな〜。
iostream
324320:04/01/27 19:30
ごめんなさい、自己解決しました。

-----
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
>>326 >>327
おおっありがとう。逝ってきます。
329303:04/01/27 21:37
>>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
ある時、目の前のモヤがはれるように
わかるようになるんだよね

不思議なもんだ。
>>329
これのソースを参考にしてみそらーめん。
http://himagine.s20.xrea.com/soft/kinder.htm

リサイズ後のイベントは上に書いたとおりWMExitSizeMoveを使っていて、
最大化したときにWMSysCommandのSC_MAXIMIZEをキャッチして、
WMExitSizeMoveを再送することで解決している。
>>322
差し支えなければ、速いってソフトはどんなソフトなのか教えてちょ。
Delのファイル処理は遅いと聞いたことがある。
全部APIだけで書けば改善されるかも。
ファイル結合なら、コマンドラインで
copy /b file1+file2 file3
でおーけー。
Delphiのストリームはバッファ無
VC++のストリームはバッファ有
中村の里を参照
ttp://www.asahi-net.or.jp/~HA3T-NKMR/tips020.htm
こういうゴッソリとファイルを読み書きするのでも
バッファの有無って効いてくるのかなあ?

あまり大きいファイルは読み書きしたことがないので。
シーケンシャルリードライトならバッファはむしろ要らない。
BlockRead/Write使っとけ。
読み書きの始め/終わりが軽くなるだけだがでかいファイル相手でも
MSCDEX → MSCDEX+SMARTDRV 程度には効く。
ファイルの読み書き速度は、APIを呼ぶ回数が多ければ遅くなる。
それでバッファは2KBあたりから増やしても変化がなくなる。
というベンチマークの結果があったとさ。

どのくらい遅いか質問者は具体的に何にも書いてないけど
実は自分のコードに原因があることはよくあるので確認してみては?
高速化は実際に遅い部分をいじらないと速くなりませんよ。
341デフォルトの名無しさん:04/01/27 23:47
他のファイルからソースをカット&ペーストしたのですが、するとコンパイル
しようとすると行が長すぎます。最大1023文字
と言うエラーが起きます。
その行を削除して、再度その行の内容を手打ちして再コンパイルしても同じです。

これの回避策は無いでしょうか?
改行にCRが無いだけなので
他のエディタで開いて保存しなおせばいい
シーケンシャルの場合 バッファリングは余計な処理なので絶対に遅くなる
344341:04/01/28 00:03
>>342
エラーの起きている行を秀丸にコピーしてみたのですが、CRはきちんと入ってます。
念の為、リターンキーを押した上で再コピーしてみたのですが、NGでした。
その行を削除して再度手打ちで打ち直しても駄目です。
345310:04/01/28 00:03
var
s: string;
begin
fs := TFileStream.Create(...);
try
SetLength(s, size);
fs.ReadBuffer(PChar(s)^, size);
Memo1.Lines.Add(s);
finally
fs.Free;
end;
346342:04/01/28 00:04
バイナリエディタで見てみなさいよ
347341:04/01/28 00:23
>>346
何度もどうも。
見てみたけどちゃんと0D 0Aが入ってました。
何ででしょ?
>>347
そのソース、ここに貼るわけにはいかないのか?
なるべく小出しにした方が
スレが盛り上がってるように見えるだろ?
350348:04/01/28 01:08
>>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 で
いいんでしょうか?
355341:04/01/28 04:10
情報を小出しにしているつもりは全く無いんですけどね。
そのときに必要な情報はすべて出しているつもりです。

ということでコピペします。
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;」が足りないんだけど、その辺は大丈夫かい?
357341:04/01/28 10:09
>>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;
364363:04/01/28 18:40
あ、しまった。
>>363のコードの変数scaleは無視して下さい。
これが無くても同じように画像は崩れています。
>>362
Fを使い終わったらF.Freeをするべき。

366362:04/01/28 19:10
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
もう少し具体的にお願い致します。
>>368
Exit



では、なくて「ファイルが使用中かどうか知りたい」ではないのか?
{$I+}
372368:04/01/28 20:28
中途半端な書き込みで失礼しました。
今はloadfromfileでファイルを読もうとするとファイルが使用中だったときに
エラーでプログラムが停止してしまいます。
このようにファイルが使用中だったときにエラーを出さずにただサブルーチンから
抜け出すようにしたいのです。
try
 lfm
except
 error!!
end
374362:04/01/28 21:53
>>367
丁寧に解説ども。
375368:04/01/28 22:05
>>373
Delphi上で実行してみるとやっぱり、ファイルを開けませんでした。と言う
エラーが出てしまいますけど、これはどうしようもないのでしょうか?

>>375
ツール→デバッガオプション→言語固有の例外
「追加」押して無視したい例外に追加
377368:04/01/28 22:35
>>376
ありがとうございました。
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)というような、文を望んでますが・・・
381380:04/01/29 17:05
Move(aryA, ary, SizeOf(aryA));
でもうまくいかないなぁ〜

forで回すしかないのかな?
Safenyというソフトのログファイルを読み込もうとして気がついたのですが、
メモ帳では普通に読み込みできるのに、TFileStreamで読もうとすると、
別のプロセスで使用されてるというメッセージがでて読めません。
メモ帳で可能なのだから何か手段はあると思うのですが、
こういうファイルを読み込む手段を教えてください。
>>382
CreateでfmShareDenyNoneはどうよ?
>>380
点字を丹生売れれば埋けるようデス。
Move(aryA[0],ary[0],SizeOf(AY1));
↑0出なくとも言い。
×AY1
いまからDelphi始めようかと思ってたんだけれども
正直どうなのよ?
387380:04/01/29 17:40
>>384
ありがと〜
スマートに書けました!
引数の三つめ、
SizeOf(Ary) じゃ駄目じゃない?
SizeOf(Ary) * Length(Ary)かな?
>>386
趣味なら好きにしろ。
仕事につくためなら他の言語。
>>389
そーか..
まだ工房だからどうでもいいけどね、ってことでデル使います。
391380:04/01/29 17:51
>>388
いえ、SizeOf(Ary)でうまくいってるようですよ

SizeOf(Ary) * Length(Ary)だと例外発生しましたです
392380:04/01/29 17:55
>>388
SizeOf(AryA)でした(^^;
393389:04/01/29 17:59
>>390
趣味でも、他の言語を知っておくことは大事だぞ。
Delphiだと、書けなくてもいいからC++を読めるようにしておくと
さまざまなサンプルを自分のものにできる。
>>381
Delphi6では、そのコードでうまく行ってますが。
395380:04/01/29 18:32
>>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です
396394:04/01/29 19:52
>>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
ループさせてると「不要」とは言い切れないと思うが。
406405:04/01/29 23:51
ちょっと書き方が違ったかな?

「ループの中で表示させてる」のではないかと。
>>402
ステータスバーに限ったことではないが、
VCLでキャプション書き換えを繰り返すとそうなっちゃうよ。

だから、
if statusbar1.SimpleText<>s then statusubar1.SimpleText:=s;
などと、なるべく書き換え回数を減らす工夫をしてみなよ。
>>402
OS は XP ?
409デフォルトの名無しさん:04/01/30 11:27
2つ教えてください。

1、NMPOP3でメールを受信すると日本語のメールが文字化けしてしまいます。
これをきちんと表示するにはどうしたら良いのでしょうか?

2、NMSMTPで日本語のメールを送る時にはcharsetを何に設定すれば良いのでしょうか?
410409:04/01/30 14:52
検索したら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がロックするアプリなんて手抜きのツールぐらいだぜ。
419390:04/01/30 17:48
>>393
一応C,HSP,RUBYと本を読んでみたけれども
Delphiが一番そそられたんで..

人気なかったのか(´・ω・`)
420デフォルトの名無しさん:04/01/30 17:59
既にある色いがいにかえるにはどうしたらよいでしょうか?
TEdit のオブジェクト「edtHoge」には、OnKeyPress などのプロパティが
あります。コードでこのプロパティを設定すれば、その内容のイベントハンドラ
が動く、みたいな使い方はできるのでしょうか?

もしそういう使い方ができるならば、簡単なサンプルなど見せて頂けると助かります。
イイタイコトがわからん
edtHoge.Onclick := FormClick;
こうでいいのか?
423421:04/01/30 19:02
例えばですが、

 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??????;

オブジェクトインスペクタなら項目をダブルクリック
425421:04/01/30 19:42
>>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に移植中です^^

また、教えてくださいね。
438426:04/01/31 08:13
エクセルのファイル(ブック)から貼り付けてある図を
取り出したいのですが、TExcelApplicationってOLEを
簡単にする為のもので、エクセルが入ってないとだめですよね。
相手のPCにエクセルが入ってなくても、できるんですか?
できるならTExcelApplicationを使いたいです。
>>438
そういう用途なら無理だな。
がんばって英語を読むか、OpenOfficeのソースでも読むか。

検索したらこういうのが出てきたけど、図については書いてないな。
ttp://www.pleasuresky.co.jp/insidexl.php3
ttp://member.nifty.ne.jp/m-and-i/tips/tipspage.htm
Excelの入っていないマシンには
Excel Viewerをダウンロードしろとメッセージを表示する。

だがこの手もバージョン違いですぐ使えなくなりそうだな。
OpenOfficeもOLEでの操作ができればいいんだが。
TWebBrowserコンポーネントの詳細を調べたいのですが、ドキュメントなどはどこを
探せばよいでしょうか。
442437:04/01/31 13:05
またまた厨の質問で恐縮ですが、
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,・・・・・
他の型もやってみましたがうまくできません

何が間違ってるのでしょう?
>>441
ヘルプ
Google
444437:04/01/31 13:35
>hogehoge(ByVal arWord As Variant,・・・・・
ByRefでやってみたら通りました。
もう少しやってみます。

失礼しました。
>>443
これはActiveXだからなのか知りませんがヘルプにはありませんでした。
また、Googleで探してもごく1部についての説明しかしてないものがほとんどなため、
大本となるDocumentの所在がしりたいのですが・・・
446437:04/01/31 13:53
やっぱりだめでした。。
hogehoge(ByRef arWord() As string,・・・・・
に変更し、配列を入れてみましたが、エラーで落ちます。

方法はないのでしょうか?

>445
MSDN探せば一通りの情報は見付かるはず。
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/objects/webbrowser.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp
MSDN以外である程度まとまった情報があるのはここしか知らない。
http://www33.ocn.ne.jp/~takoyakusi/
http://www.euromind.com/iedelphi/index.html
あとはボーランドのサイトに置いてあるDelphi7のヘルプ。
バリアント渡すなら受ける側もバリアントで作らなきゃ。

 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の外部に向けて喋る機構が必要なのです・・・。
450437:04/01/31 15:04
>>448
おおっ!
できました、ありがとうございます。

variant型なんてdelphiにあったんですね。型に厳しい
とのことだったので、全く頭にありませんでした。

また一つ勉強になりました。
>>447
ありがとうございます。
MSDNも探しに行ったのですが見つけることができませんでした。
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/objects/webbrowser.asp
などはどうやって見つけるのですか?
>>450
ぉぃぉぃ・・・
仏の顔も三度まで

Tread on a worm and it will turn

一寸の虫にも五分の魂
>>449
色んなものがあるけど、簡単なのはI/Oをスルーしてくれるサービスを起動しておいて
直接 IN /OUT をインラインアセンブラで書く事かな


http://www.google.co.jp/search?q=gwiopm.pas
 アプリ単位にサービスを呼び出せる。
 パスカルソースがある

http://www.google.co.jp/search?q=giveIO
 皆が使ってる VB使いの人は特に好きみたい。


他には、国産の
http://www.otto.to/~kasiwano/newpage16.htm


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
普通に考えればその方が無難だと思うが?

スタティック領域だけで自インスタンスに全く関係無い
部分ならアクセスしてもいいかもしれないが
そういうコード見ると一抹の不安が残るよな。
>>459
無理しないで「デバッグ」って書けよw
465402:04/01/31 21:06
>>417
Panels[0].textを使おうとしてもリストの範囲がインデックス・・・のエラーが出てしまいます。

>>418
>スレッド使えよ。今時GUIがロックするアプリなんて手抜きのツールぐらいだぜ。
スレッドを使えと言うのはどういう意味でしょうか?
良く分からないです。初心者でスマソ


466449:04/01/31 21:15
>>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年になってしまいます。

これを変換する方法がありましたら教えてください。
>>469
型の説明をもうちょっと詳しく書け。
>>460
フォームのハンドルを指定している場所があると思うが、
それをテキストボックスとかリストボックスのハンドルにしてやればよい。
472469:04/01/31 22:24
>>470
38000の方はIndyのTIdMessageのDate変数です。
1.6e-304の方はTDateTime型の変数aにnowを代入しただけです。
>>467

Destoryをオーバーライドして、そこにオーバーライドしたClear()と
inherited Destroyを書くんじゃだめなの?
474470:04/01/31 22:28
38000とか1.6e-304というのは、どうやって確認した?
デバッカか?
>>465
StatusBarをクリクリクリックしてみれ
476469:04/01/31 22:43
>>474
デバッガでカーソルを変数に当てて確認しました。実際に
showmessage(datetimetostrで表示させてみると38000のほうは1899年に
1.6e-304の方は今日の表示になります。
>>473
inherited Destroy;を呼ぶと、内部でoverrideしたClearがもう一回呼ばれてしまうんですよ。
>外部のTDatetime変数からデータを受ける
って何すか?
>>477
overrideでなくreintroduceではダメか?
480469:04/01/31 22:51
>>478
スマソTDatetimeの型のプロパティっす。
481470:04/01/31 22:54
>>474
逆じゃない?
TDateTime型は、1899年12月30日からの経過日数を実数型であらわしたものだから、
105年×365日=約38000日。
だから、38000の方が正常でちゃんと表示されているはず。
TIdMessageの使い方に問題はないか?


>>479
そすると、TList型の変数に代入してClearを実行すると、追加したオブジェクトが
クリアされない…。
Clearを実行するときCountが0にセットしておけは、
2回呼んでも問題ないんじゃないか?
もしくは、inherited Clearすれば。
484469:04/01/31 23:00
>>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だし、
今日の日付・時刻がちゃんと表示された。
487469:04/01/31 23:24
えっえっ?
Showmessageにブレークポイントは設定してないです。
試しにbeep;も入れてその行にブレークポイントを設定しましたけど同じです。
488469:04/01/31 23:26
念のため、全く同じですが、ソースです。
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]を作成

ヘルプよく読めば分かるのに…。
最近、本当に読まない人多いなぁ。
491469:04/01/31 23:33
あっ、ボケてた。
showmessage(datetimetostr(a))にしなきゃいけないのに。

おかしいと思って、OSを再起動したらうまくいったみたいです。
もうちょっと精査してみます。
492469:04/01/31 23:34
>>489
でもカーソルをaに当てたら変な値になったのは間違いないんですよ。
OSかDelphiが悪さしていただけだったらいいのですが。
>>488
お前の目は節穴か
>>491
何がおかしいと思って、なぜ再起動したらうまくいったのか書いて見れ
とにかく問題を把握する努力をせよ
>>492
×OSかDelphiが
○OSかDelphiか喪前が
>>487
>Showmessageにブレークポイントは設定してないです。
しろって言ってんだろ!
ブレークポイントが設定された行は実行する前に止まるんだよ。
つまりa:=nowに設定しても代入される前の値しか読めねーんだよ!

>>493
×OSかDelphiが
×OSかDelphiか喪前が
○喪前が
495469:04/01/31 23:43
>>493
馬鹿な間違いをしたnowの部分をaに変えて、
ブレークポイントを再設定しただけでDelphiが無反応になってしまったのですよ。
それでWin2kを再起動しました。

けど今も同じ症状っす。鬱
496469:04/01/31 23:58
>>494
いや、だからbeep;に設定しています。
ぶっちゃけ俺はブレークポイントなんて使ったこと無い
使わずにどこがエラー吐いたか当てる
これが最高











に効率悪い俺のやり方
卓上デバッグが最高だね。
最近の若い者ときたらまったくだらしない。
499質問があります:04/02/01 11:27
最新バージョンに当たるDelphi8って.NET対応プログラムしか作れないのでしょうか?
DelphiはどこでDLすればいいのでしょうか?
またそれはデモ版ですか?
どなたか教えてください・・・
>>5
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 の座標を
移動させるというのはどうでしょうか?
513509:04/02/01 20:53
どうもありがとうございます。
TurboPascalのIDEはオンメモリで実行できたね。

515469:04/02/02 00:08
>>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でどうよ?
ちょっとは調べてほしかった
526522:04/02/02 14:49
>>523
>>524
はぁうっ・・!!
申し訳ございませんでした。
ありがとうございます。

>>525
恥ずかしいっす。
>>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
>>531
ありがとう。今から見てみます
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型変数に代入。
545544:04/02/03 10:11
SetSizeじゃないや、SetLengthだった。
546544:04/02/03 10:15
あ、あと.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だと、ストリーム使った過去の大量の資産が使えなくなるの?
だとしたら某は終わってるな。
549543:04/02/03 11:01
>>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もそう宣伝している。
>>552
ヘルプの通り
ソースファイルや実行ファイルが入っているフォルダ名によって
実行しようとした時にエラーが出るのは何故ですか?
例えば「新しいフォルダ (2)」だと実行できなかったのですが。
>>536
もしかしたら、勘違いかもしれないけど、
WinAPIのGetForeGroundWindow, SetForeGroundWindowでやってみるのは?
保存ダイアログってなんでこんなに馬鹿なんだ。
hoge.pas.txtに補完するなんて信じられん。
拡張子があるときは補完しない、ないときは補完するか確認する、
ぐらいの配慮があっても良いだろうに。
>552
使い分けてますが?
560543:04/02/03 18:52
>>544
もしかして、わざと間違ったんですか?
非常に悩んで、勉強にはなりましたが(w
561デフォルトの名無しさん:04/02/03 21:05
>>547-548
.NETにもストリーム扱うクラスがあるよ。
>>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
>>556
知らん。

>>558
コモンダイアログの仕様。
568544:04/02/04 00:07
>>566
ホントだ。スマン

>>562
ホントだ。ハズカシイ
569デフォルトの名無しさん:04/02/04 00:08
「Delphi相談室(超初心者用)その11『出来ますか?は禁句だよ!』」
  ↑
次、コレよろしく。
>>569
長すぎて立てられねーよ
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;
>>571
仕切るな。ってばさ。
超初心者用のスレじゃなくなってしまった
>>569のような人生初心者用のスレ
「Delphi相談室(超初心者用)その11『仕切り厨はご遠慮ください!』」
「Delphi相談室(超初心者用)その11 ┐('〜`;)┌」
578デフォルトの名無しさん:04/02/04 09:03
「Delphi相談室(超初心者用なので何でもあり)その11」
579デフォルトの名無しさん:04/02/04 11:16
「Delphi相談室(ム板のオアシス)その11」
「Delphi相談室(←なぜか相談できない)その11」
「Delphiバファローズその11」
>>580
ワラタ
「Delphi相談室(初心者叩き)その11」
Delphi相談室(でるぽい)その11
585デフォルトの名無しさん:04/02/04 16:10
初心者にはこの入門書がお勧めです。
TECHNICAL MASTER はじめてのObject Pascalプログラミング
http://www.shuwasystem.co.jp/cgi-bin/detail.cgi?isbn=4-7980-0531-2
Delphiビジュアルプログラミング秘密のテクニック150
http://home.impress.co.jp/reference/1617.htm

特に上のは今までほとんどなかったObjectPascalの文法に関する説明が載ってます
「Delphi(←なぜか使うのは信者のみ)相談室その11」
脱初心者にはVCLソースが丁おすすめ。
プロ買う前はネットで検索したりあちこちで聞いたりするのが面倒で、
なかなか新しいことができなかった。
プロにはソースが付いてくるから、そこからパクってるうちに力が身に付く。
初めて使うAPIでもソースをGREPすれば使い方の例が見つかったりする。
確認させてください

windows上で作動させるようにしたのがObject Pascalで
Object Pascalの統合開発環境がDelphi

こんな感じですよね?
>>588 真性バカ
TListで多重ソートをさせたいのですが、スマートにやる方法はないでしょうか?
具体的には、

type
 PMember = ^TMember;
 TMember = record
  Name : String;
  Age : Integer;
end;

このようなレコードをTListで管理して、Age順にソート、同じAgeに関してはName順にソート、です。
Age順だけでソート、はすでにできています。
Name→Ageの順でソートすれば?
592590:04/02/04 17:58
>>591
今のところ、TList.sortを使ってソートしているのですが、Name→Ageの順でソートしても
Ageソート後にNameの並び順がそのまま保証されないんです。
>>589
答えは?
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はローカルスコープ内に置くことはできません。
とエラーが出てコンパイルできません。

原因は何なのでしょうか?
599598:04/02/04 22:48
勘違いでしたスマソ
600590:04/02/04 22:54
>>594
ありがとうございました。このソースで思うような結果が出せました。

>>597
そうですね。QuickSortの性質上、続けてソートをかけてもうまくいかないのはわかっていましたが、
2つの基準を連結して1つの基準を作る、というのはわかりませんでした。
Delphiってのは元々神殿の名前でしょ?
信者が集うのは当然。
マイナーっぽさというかマニアックっぽさがいい感じなのでデルファイはじめました。
なんか標準から離れてる感じでいいです。
マッタリ出来そうな感じ。
603デフォルトの名無しさん:04/02/05 09:07
標準って 何だ?
>>603
Cとか?
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がかわいそう。
616C++Builderユーザー:04/02/05 19:47
Delphiのinheritedてのは親のprivate関数まで呼べてる?
C++Builderの本がないからDelphiの本見て勉強してるんだけど。
>>616
その親子クラスが同じユニットにあるなら呼べたような。
>>616
なんのためのprivate?
619C++Builderユーザー:04/02/05 20:10
>>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がないからじゃないかな<同ユニット
625 :04/02/05 20:53
>>621
わざわざDelphiで実験してくれたの?どうもありがとう!
じゃあ自分の本のソースの読み方がおかしいのかな。
Delphiはまったくの初心者だから。
よく見直してみます。
626デフォルトの名無しさん:04/02/05 21:48
>>613
全くやりたいことが分かりません。
落ち着いて、やりたいことを複数行に分けて書きましょう。
627C++Builderユーザー:04/02/05 21:53
>>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に渡すことは可能。
641638:04/02/06 01:07
すいせません、脳みそ沸いてました。
明らかに聞き方がまずいのでそれなりに詳しく書いてみます。

タブブラウザです。
親には以下の処理がしてあります。
・メインメニューの新規作成にショートカット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
出来れば触りだけでもご教授願います。
>>634
ウィルス?スパム?
すいませんボタンを押したときの処理で
例えば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;
>>643
CreateProcess
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
というヘッダがつくのですが、これを表示しないようにはできるのでしょうか
>>637
> スクリーンフォントの縁を滑らかに  2002.11.12 
> http://popup5.tok2.com/home/tikomosoft/src_delphi/delphi_tips030.html

> これで文字にアンチがかかります。
> SystemParametersInfo(SPI_SETFONTSMOOTHING, 1, NIL, 0 );
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;

解らなかったら変なのが再現する最小のコードを作ってみると
特定しやすい
652613:04/02/06 13:30
・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ファイルってのが曖昧
659610:04/02/06 15:00
>>658
俺っすか?
dbはParadoxです。
あと CSVPath にはCSVFile.csv
660610:04/02/06 15:01
を作る場所のパスが入ってます。

スレ汚しすいません、途中で書き込んでしまいました。
661613:04/02/06 15:08
>>653
TEditです。
662613:04/02/06 15:15
>>654
変ですか、そうですか。
では、入力しない限り先に進めないようにしたいんですけど他にはどうゆうやり方があるでしょうか。
>>610
ExcelでCSV形式を読み込むときに拡張子がcsvときとtxtでは動作が違います。
txtで読み込むと数値か文字かを選択して読み込めます。

> 数字を文字扱いで送るにはどうすればいいでしょうか。
Excelは先頭に半角クォートが有るデータは全て文字と認識したはずですが...
>>662
先に進もうとした時にチェックして警告を出し
先に進ませない。ってこりゃMFCのまんまだが
665610:04/02/06 15:29
>>663
ありがとうございます。
異様に長い数字列なので、Excelで開くと「2.33211E+89」こんな感じで
勝手に置き換わっているので困ってます。
csvをtxtに変換して、メモ帳で開いてみたところ、普通に入ってました。

半角クォートというのは「"」これのことですよね?
Excelで開いたときに、セルの先頭に入ってしまうので、ちょっとマズイ
のですが、なしでは無理なんでしょうか。
>>655
お助けなくてもできてるじゃん・・・・

んで、Excelで数字と文字としての数字をExcelの機能を
使って、CSVにはき出してみたりした?
そして、それをまたExcelで読んだりしてみた?

もし、それで数字が文字として認識されるとしたら、CSVで
はき出す以上、Excelでは文字列として判断されてしまうの
で仕方がないような気がする。
Excel のセル書式を変えるだけだと思うけど。
>>657
>先日delphi7 personalを買ったのですが、
>コードエディタで
>「式評価」と「識別子定義の表示」が
>ポップアップ表示しないのです。

ML で埒があかないからといってこっちに持ってくるか?
本家の PDF によると
ttp://www.borland.com/delphi/pdf/del7_feamatrix.pdf
の 9 ページ目。

ToolTip Expression Evaluation for easier debugging
とは Personal には無い。「式評価」は D7 Personal では出来ません。

「識別子定義の表示」はどれだろうね。
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かな?
674610:04/02/06 16:26
>>666-667
むしろ文字列としてしまうと「2.33211E+89」になってしまう
みたいですね。勘違いしてました。
どっちにしろExcelの表示の問題だということも分かりました。
とりあえずコレで行ってみようと思います。ありがとうございます。
675デフォルトの名無しさん:04/02/06 16:28
>669
日本サイト
ttp://www.borland.co.jp/delphi/del7/feamatrix/index01.html
Borland - Delphi7機能一覧(1/5)の
「デバッグを容易にするツールチップ式評価」
に○があるのは、間違いってことなんでしょうか。
676670:04/02/06 16:42
>>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
スパムとかじゃなくて、とにかく軽いメーラを作りたいんです。
686645:04/02/06 19:29
>>651
 ありがとう。やはり単なるケアレスミスだったか(^^;)。
>>685
それぞれ試して、CPU使用率のログを取ってみるしかないんじゃないの?
1000件送信、1000件受信してみればいい。
688デフォルトの名無しさん:04/02/06 22:28
Delphiで作ったアプリは、起動中にWindowsの設定でスクロールバーの幅を
変更しても変わらないんですけど、こんなモンなんでしょうか?
再起動すると幅が変わるんですけど。
ただ、TScroolBarは再起動しても変わりませんが。

あと>>644に答えてくれる方がいると嬉しいです。
>>688
ポインタで比較してもだめ?
690デフォルトの名無しさん:04/02/06 23:09
>>689
ポインタで比較とは?
( ^^)
TObject.InheritsFromとか。
693デフォルトの名無しさん:04/02/07 01:15
フサギコー! 新しいスレたてろ!
>>693
とりあえず上級者用へ逝けよ。
695デフォルトの名無しさん:04/02/07 02:38
質問です。今、タブブラウザを下のページを参考にして作っているのですが
http://delphi.sakura.vg/index2.html
タブを切り替えたときに、Edit欄を各々のページのURLに変更したいのですが
どのような方法でするとよいのでしょうか。アドバイスをいただけるとありがたいです。
よろしくお願いします。
新スレできてまつ

ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その12
ttp://pc2.2ch.net/test/read.cgi/tech/1076095856/
すんまそん。
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:='';しないとリーク起きたんだけど。
708702 ◆JolD7yxWKg :04/02/07 14:11
>>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 さんのコードには文字列の参照カウンタを増加させるコードが入っていたとか
例外オブジェクトそのものにその文字列が渡っているとか。
そんなところだったのでは?
716701:04/02/07 20:24
>>704
ありがとう。
form1は消してしまいますので、だいじょぶです
>>716
>form1は消してしまいますので
それはそれでまた違うコードになる予感
718701:04/02/07 20:59
うい。
うまくいかない…。
form1にボタンひとつ貼り付けて
form2.show;
form1.Destroy;

form2にボタン貼り付けて
form2.destroy;
form2.Close;
form1.close;

これでうまくいくと思ったんだけどいかないなぁ。
なんででしょ

>>718
ツッコミどころ満載だが、酔ってるので他人にまかせて一つだけ。
Destroyは直接呼出しちゃだめ。
720702 ◆JolD7yxWKg :04/02/07 21:32
大変勉強になりました。ありがとうございました。

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;
724701:04/02/07 23:47
>>719,723
ありがとう。

そのまま貼り付けるだけでは動かないみたいなので
ちょこちょこ変えつつ動くようにしてみます
725638:04/02/07 23:50
でけたー、でけたで母ちゃん。

>640
ありがとうございました。
ローカルフックでいけました。
726デフォルトの名無しさん:04/02/08 00:02
TrueTypeフォントで描画した画像の著作権は誰のものになるのでしょうか?
フォントデータの著作権者でしょうか?
それとも描画プログラムの作者でしょうか?
はたまた、描画操作をして画像を作った人でしょうか?
>>726 激しく擦れ違い。
728701:04/02/08 00:11
うごいた。
字下げ用のタブは入れちゃいけなかったのね…。
>>726
TrueTypeフォントの情報 = ソースプログラム
描画プログラム = コンパイラ
描画操作する人 = コンパイラを起動した人

普通に考えて、著作権はフォントデータの著作者にある。

ただ、その描画プログラムが特殊なフィルタ機能 (=アンチエイリアシング等) を持ってたりするとか、描画操作する人が配置とか色使いを工夫するなどした場合はまた別の話となる。

(この手の質問は、
***すれ立てるまでもない質問はここで 第50刷***
http://pc2.2ch.net/test/read.cgi/tech/1075637619/
あたりでやって欲しいなぁ...。)
730726:04/02/08 00:30
>>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プロパティを使うと良し。
736731:04/02/08 02:11
test
737731:04/02/08 02:12
やっと書き込めた…

>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 = ('グー', 'チョキ', 'パー');
でしたね。
745731:04/02/08 02:37
皆さんありがとうございます。
気軽にはじめたジャンケンゲームなのに、こんなにいろいろなアプローチの仕方があるんですね。
今から一つ一つ勉強していきます。
一つのお題で、いろんな人のプログラムの書き方を見られるスレがあれば、すごく勉強になるかも…

>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;
749731:04/02/08 04:17
皆さんのものを参考に、今の自分なりに判りやすく作ってみました。

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って予約語を全部小文字で打った場合、頭文字を自動的に大文字に
できないんですか?
753751:04/02/08 14:59
作って見た グー、チョキ、パーそれぞれのボタンのタグを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;
754 ◆Q8gIG/Xc5k :04/02/08 15:33
            | 漏れも車もってきたぬるぽ
            |___ ____
      ,.=====,  V
      / ∧∧   /i, ∧_∧
   q _/ (゚ー゚*)p./ |(´∀` )二i
  .,-'"/ ̄""-三 ̄i ̄ ̄三.i~ ,二\
  0 、。 , 0 /  ヽ.i     |/./  ヽ[i
 (i二□二iiニiii); ○ i:ヽ________/ _i; ○ iニ)  
  ゞー―――ゞ_ノー―――-ゞ_ノ"==3
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
755754:04/02/08 15:34
ああーん 間違えたw ごめん
>>753
賢いね。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 の過去ログで「起動 時間 フォーム」などで検索してみましたけど、適当な
例を見つけることができませんでした。
世間ではあれをスプラッシュウィンドウと呼ぶらしいぞ。検索しなおしてみれば?
764時間を稼ぐ:04/02/08 21:58
>>763
 ありました。ありがとうございます。
765752:04/02/08 23:29
>>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]]);
たかがじゃんけんに必死になるスレはここですか?
774769:04/02/09 04:08
>>771
なるほど、こういうことか。
Cpu-Man+3≡Cpu-Man+3+Man*3≡Cpu+Man*2 (mod 3)
775769:04/02/09 04:15
あ、2つ目の合同記号は等号でよかった。
>>773
たかがじゃんけんゲームを諳で書けるようになったら超初心者卒業だな。
最低限覚えないといけないこと結構あるし。
タイマー使って遅出しを許容すると反応速度で勝負が決まって楽しいYO。
先に出すと絶対負けるの。
>>768-772
所詮、おまいらは>>753の2番煎じだよw
そんなこと言ったら人間なんて所詮誰かのマネして生きてるさ
>>779
すぐに極論を持ち出す香具師は(ry
香具師も(ryも二番煎じ
782751:04/02/09 11:46
>>778
いいアイデアだったでそ

ただ個人的には結果を1/3で求めるんじゃなくて、
PCの手をランダムにして、結果を求めた方が
確率は1/3としてもボタン選択の意志が反映される
ような気がするので、768のがいいと思った。

>>781
「香具師は(ry」な。煽りの誤字ははずかしいな。氏んだほうがいいかも。
香具師も二番煎じだし、
(ryも二番煎じだし、
氏んだも二番煎じだし、
極論言ったら大概二番煎じな上、
極論抜きでプログラミングは二番煎じなので、
>>768-772に二番煎じとつっこむ必要なし。
にばん-せんじ 4 【二番▼煎じ】

(1)一度煎じたものを、再び煎じること。また、そうしたもの。
「―の薬」
(2)何度か行われ、新味のないもの。
「―の出し物」

786デフォルトの名無しさん:04/02/09 14:36
StringGridでコピーに関する質問です。
エクセルと同じような動作をさせたく
セルの中身を選択状態でコピーを押したら選択部分のみ
どこも選択してない状態ならカーソル位置にあるセルの中身を全てコピー
といった動作をさせたいのですが
選択中か否かってどうやって判定するのでしょうか?
>>786
Selection?
788786:04/02/09 15:15
セルの中身が
「ABC」だった場合
「BC」部分を選択してるならクリップボードに「BC」を
選択状態に無く「ABC」と書かれたセル上にカーソルがあるだけなら
「ABC」をクリップボードに。
といった動作がさせたいのです。
789786:04/02/09 19:16
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
>>792
残念ながらありません。
嘘八百
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;

807806:04/02/10 11:20
すまん。間違えた。806 は忘れてくれ...
お知恵を拝借させてください。

現在、TThreadを利用して、TIdHTTPでHttpdからデータを
取得し、フォームに表示させようとしています。
TThreadは定期的に実行されhtmlを読み込み、データを
フォームに表示させます。

Threadが実行され、データを取得するまでには、ネットの
具合によってある程度の時間差が生じるものと考えられま
すが、この時、フォームを閉じられてしまった場合、
取得したデータを表示する場所がなくてエラーが発生する
ことはありますか?実験では、デバッガ上では発生するも
のの、exeからの実行では、発生しないようです。

また、いちおう対処しておきたいのですが、この場合、
synchronizeしたフォームにデータを表示させるprocedure
でForm閉じられているかどうかを判断し、描画を停止する
というのが普通のやり方なんでしょうか。
>>808
閉じられる時にフォーム側でスレッドを止めるのはどうだろ?

漏れは、スレッドはデータを溜め込むだけにして、適当な区切りで
スレッドからフォームにメッセージを投げ、そのメッセージハンドラから
スレッドに溜め込まれたデータを取ってきて描画というのを最近作ったけど。
いいか悪いかはわかんないけど、今のところ不具合は起きてない。
ありがとうございます。
なるほど、メッセージを投げ、フォーム側のprocedureでThreadの
データを引き出すというのは思いつかなかったですね。

同様に閉じられようとしているときに、フォームのpublicな変数、
例えば、普段はTrueなfClose:Boolean等にFalseを入れてやって、
Thread側でFalseだったら描画しないというのも可能そうですかね?

しかし、フォームがReleaseされるタイミングと描画のタイミングが
どんぴしゃだと、やっぱりエラーになるのかしら・・・不安
811809:04/02/10 13:20
>>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 に最新のパッチ、あててる?
>>812
「Win.com が見つかりません」で起動できません
ttp://homepage2.nifty.com/winfaq/w98/boot.html#75
>>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の方がだいぶやさしい(コンパイルしてしまうので、仕方が
ないんだけどね)。

そういえばどっかにメモ帳に文字列を書き出すサンプルがあったような気が。
この掲示板もすっかりふいんき(←なぜか変換できない)悪くなったな
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200402/04020019.txt
>>818
>ただし、イベントがぜんぶ出てきてしまうので、拾い上げるのは簡単じゃない。
表示されたイベントログウィンドウを右クリックしてオプションを表示。
出力メッセージにだけチェックを入れて他のチェックを外せば
OutputDebugStringの出力だけ表示できるよ。

ところでVBのイミディエイトウィンドウって、旧来BASICのコマンドモード?
みたいなのじゃないの? PRINT 4+2[Enter]で6と表示されるような。
いや、VBは2.0の頃に3時間ほど触っただけだから全然知らないんだけど。
ふんいき→雰囲気
自分は「ふぅいき」呼んでたりする。
822809:04/02/10 20:06
>>816
WaitForを見逃してて、適当にSleepしてたw
早速書き直しました。元質問者じゃないけどありがとう。
824デフォルトの名無しさん:04/02/10 20:15
ファイルを開こうとするとそのファイルが使用中で開けなかったときに
EFOpenErrorの例外が出てしまいます。
この例外を出したくないのですが、ファイルが開けるかどうか試す方法か
ファイルが使用中がどうか確認する方法があったら教えてください。
ない
exceptして理科張りし溶け
826824:04/02/10 20:30
今は
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のみでいいんじゃないか?
829824:04/02/10 20:48
何度もありがとう。
どうしてもtry..finallyは外せないのですがtry..finally文の中にtry..except文を
入れて入れ子の常態にしてもきちんと処理できるのでしょうか?
たくさんの変数を使う長い処理をしていてそこだけをfunctionにすることは
できないもので。

>>826
>ってやらないと駄目なの?
駄目

>>827
それじゃ駄目
関数抜けた後に開ける保証はないし
仮に保証されてたとしても冗長杉
831デフォルトの名無しさん:04/02/10 20:50
>>828
finallyだけだとfinallyの処理が終わったあとで例外が再育成されるから駄目
>>829
入れ子でも大丈夫だよ。
関数またいだtry/except/finallyのネストは全体で何重にもなってるし。
833824:04/02/10 20:56
>>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
837834:04/02/10 21:04
>>836
すまん、俺が異常だった _| ̄|○
_| ̄|○ し(・∀・ ) ヨシヨシ

.
839824:04/02/10 21:27
>>836のやりかたでやってみます。

皆さんありがとうございました。
840デフォルトの名無しさん:04/02/10 21:49
TServerSocketとTClientSocketを使ってWinnyみたいなソフト作れますか?
>>840
余裕
>>840
パフォーマンスチューニングできないからWinInet直接使っとけ。
>>840
Winsock直叩き
nyソースはasm2cpp版がある
844840:04/02/10 22:41
分かりました。でも、C++触ったことないんですけど、大丈夫でしょうか?、
cpp2pasという頼りないツールがある
Winsockの基礎から学ぶとなるとものすごい大変だと思うから参考程度にすればよいかと
…参考にできるレベルなら苦労しない罠(´・ω・`)
TServerSocketとTCientSocketで最初はチャットくらいから始めるほうがいいかも
846840:04/02/10 22:53
>>845
どーもです。ありがとうございました。
何でロシア人はDelphiが好きなんだ?
848デフォルトの名無しさん:04/02/10 23:26
他の実行されているプログラムのMemoから
文字列を取得するにはどうすればいいんでしょうか?
>>847
オレも前から不思議に思ってた。
ググるとロシア語のヒット率が高い。
>>827
それだと、ファイルオープン以外のエラーでもtrueが返るから、
except on Eファイル開けねぇError do Result := True; end;
とすべし。

>>831
>finallyだけだとfinallyの処理が終わったあとで例外が再育成されるから駄目
finallyは、再生成も糞も、例外オブジェクトにはノータッチ。
ただ、「確実に後始末する」ためだけに存在する。

つーか、ファイルオープンエラーだけifで分岐させてエラー処理するより、
一括して例外として扱ったほうがプログラムの可読性、保守性が上がると
思うんだが。
851 ◆Waf/3ZF3wg :04/02/10 23:53
サンクス。無事できました
852YU:04/02/11 01:11
昨日からDelphi始めたんでものすごい初歩的なことなんですけど。
ComboBoxにListを入れるためにはどうしたらいいんですか?
ヘルプにはイベントのOnCreateを使ってみたいなことが書いてあったんですけど
イベントにOnCreateの項目がないんですが・・・。
もうひとつ、Buttonをクリックすると違うFormに飛ぶってのを作りたいんですけど
どうやるんですか?
ホント初歩的で申し訳ないんですけど、どなたか教えて下さい
853戸田:04/02/11 01:21
Formをダブルクリックしてみれ。基本中の基本
ポトペタすらままならないようなら、いくらここが超初心者用と言っても掲示板で世話しきれるようなものではない。
一通り入門サイトの説明をこなすべき。
飛ぶってのは何が飛ぶのでしょうか?
Message?それとも一般ユーザ的な言い方だと考えるとActiveWindowが変わるということでしょうか?
質問の意図するところが漠然としていて分かりにくいのも問題があります。
そのHNはいったいなんだw
コンボボックスの中身の事か?

・設計時にItemsプロパティを編集する
・フォームのOnCreateで、Itemsを編集

好きな方を選べ。
856YU:04/02/11 01:35
ほんとすいません。
ActiveWindowが変わるということです。
明後日までにやらなきゃいけない課題が今日出たんで、ここで質問させてもらいました。
もうひとつ質問すいません。
Itemsプロパティってどこにあるんですか?
どのHP見ても知りたい事が分からなくて。
857前園:04/02/11 01:37
宿題、かっこわるい。
>>856
ユーは昨日Delphiを始めた初心者に課題を出す人に教わっているの?
859YU:04/02/11 01:55
教わっていないです。
アルゴリズムを習って、次の日にいきなりDelphiで
文字を翻訳するプログラムを作ってこいとのことでした。
なのでこんな状況なんです。
>>856
基礎的知識から全部質問するつもりか?
違法コピーしてないんならチュートリアルがついてるからそれ読みなよ。
861YU:04/02/11 02:04
すいませんでした。
一人でがんばります
>違法コピーしてないんならチュートリアルがついてるからそれ読みなよ。
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も時代遅れ。
俺もそう思う部分はあるが、元質問者がそう思うかどうかとはまた別の話であることよ。
時代遅れの一言でくくってしまうようでは、まともな技術者にはなれないぞ。
873864:04/02/11 08:51
どうも。Iniファイルのストリーム読み書きの件の言い出しっぺです。

Iniファイルの利点として、設計時に設定を試行錯誤するのがエディタで
簡単にできる、というのがありますが、逆にユーザが不適な設定にして
暴走させる、という可能性があるんで、設計時にはプレーンテキストで
保存して、実用では一度ストリームを介して、エラーチェック機構も噛ませて
簡単には編集できないような形式で保存できるよう、パラメータで分岐
させたかったんですよ。

・・・で、なんかいい方法無いですかね・・・
出だしからしてなんかおかしいし。
ローカルファイルを編集不可にするなんて全く無意味。
ドキュメントにいじるなと明記しておけばいいだけ。
ゲームデータ等でチートを禁止したいならINIではなく
スクランブルかけたバイナリファイルにするしかない。

ストリームに固執したいなら>>869しかない。
875864:04/02/11 09:02
だから、設計時は生の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みたいなのがずらっとあって、
ひとつひとつやるのは効率悪いなー、と思ったので。
配列にして組み直した方がよさそうですね。
>>881
TListでポインタで持ったら?
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 がやりたいのは参照したい変数/フィールドを他の変数でコントロールしたい。という
間接アクセスの手法を尋ねているのだと思うぞ。
888883:04/02/11 16:47
ありがとうございます。

面積を計算するプログラムを作ってるんですが、
コンボボックスで形を選ぶと、必要な数値入力欄が出てくるというものをつくりたいんです。
例えば、イメージしてるのは三角形だったら底辺と高さ、ひし形だったら対角線の長さの入力欄が出てくると
いったものなんですが。
その表は新たなフォームではなく同じフォーム内で出力したいんです。
形を選択するたびにメインフォームにある数値入力表が切り替わるというものを目指してます。


そこで質問なんですが、数値入力するための表というのはどこで作り、
メインフォームとはどのようにつなげればいいんでしょうか?

質問の意味が分かりづらかったら申し訳ありません。
>>888
すごい可能性がたくさんありすぎて、なんともいえないけど

1)TEditとTLabelを設置して、選択されたコンボボックスに
 従ってVisible:=Falseしたり、Label.Captionを変えたりする。
2)Edit可能なStringGridの項目をTComboBoxの選択によって
 変更する
3)タブシートを使って、図形により切り替える。

個人的にはタブシートを使った方が、始めたばかりの人には
わかりやすいと思う。コンボつかわないけど。
890883:04/02/11 17:17
とても親切にありがとうございます。
(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というのがどういうものかということを理解してる?
894883:04/02/11 18:03
すいません。
LabelとButton間違えました。

LabelとEditのコントロールをPanel上におくという、概念は分かるんですが、
いまいち知識がついていきません。

本当に失礼なんですが、具体的に一例を書いていただけませんか?

こりゃ、煽りだね。>>894
調子に乗るのもいい加減にね。
本当に失礼なやつですね。>>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エラーが出て
しまいます。

これの回避策なんてご存じ無いでしょうか。
自分でもこんな簡単な処理でエラーが出るだなんて信じられないのですが。
900899:04/02/11 19:47
実際はもちろん
for k:=1 to 10 do
です。スマソ
>>899
>これの回避策なんてご存じ無いでしょうか。
begin〜endの中身を捨てる。
902899:04/02/11 20:25
for文を移動するとprocedureの一番最後でエラーが起きるみたいです。

で、TempYen[k,j]:=calcdoll(k,j);の行をTempYen[k,j]:=0;にすると
エラーが消えます。
でもこのTempYenのfunctionはただ計算をしているだけでエラーが出るような要素は
何も無いのですが。しかもエラーが出るのはその行じゃないし。

こんなエラーの回避策を知ってたら教えてください。
>こんなエラーの回避策を知ってたら教えてください。
calcdollの中身を捨てる。
配列の添字範囲外を参照してたりとかしてないか?

>エラーが出るのはその行じゃないし。
AVはボディーブローのように効いてくるから、エラー行と原因が
違うことは多々ある。
904899:04/02/11 21:21
>>903
>配列の添字範囲外を参照してたりとかしてないか?

これビンゴでした。ありがと。
配列に定数代入

空のforループ

と順を追っていけば、呼び出している関数が原因であろうことに
辿りつくと思うんだが。
こういうデバッグの基本をまとめてあるようなサイトとかないのかねぇ?
エラーが出るような要素は何も無いのですが。
初歩的なことなんですが、
forループの中でLabel.captionを設定すると、ループを抜けるまでLabelが更新されず、
毎回Label.refreshを実行すると更新されるようになるのは何故なんでしょうか?

あと、時間がかかるループ処理を行っているときにフォームを閉じようとすると「応答なし」に
なってしまうのを回避する方法はないものでしょうか・・・。
>>907

>Label.refreshを実行すると更新・・・
Windowsのメッセージキューイングの仕組みを知ればわかる。

>時間がかかるループ処理を行っているとき・・・
そのためにスレッドというものが存在する。
>>908
あー、なんとなくわかります。
ということは、「ループ中にボタンを押すと後始末して中断」とかいう処理をさせたいときは、
スレッドを2つ用意してメッセージを飛ばして・・・とかいう方針なのかな。
>>909
そんなあなたにProcessMessages(ヘルプ読んでね)
(`・ω・´)ラジャ!!
ただProcessMessagesの前後では、ローカル変数以外はデータの整合性が失われる
可能性があることに注意。
スレッドみたいに、どのタイミングで整合性が無くなるか判らないよりは初心者向け?
>>899
範囲チェックを有効にすれば、この手のエラーは解るぞ!
>>512
をいをい
>ローカル変数以外はデータの整合性が失われる
一般論みたいに説明するな。

DB 関連でそういうことがおきる可能性があるけど、それは DB ライブラリが裏で
スレッドを作っているからであって、結局マルチスレッドの問題だ。

非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で
書き換わってしまう話の出典を教えてください。
>>890
コンパイルエラーをなくすのが先決。
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
>>929
準備運動
ふつーはリエントラントにするだろ?
低レベルな突っ込みはよしてくれよぉ
>>931
もはや反論の為の反論だな。カコワルイ
ふつー開始ボタン押したら開始ボタンは無効にするだろ。
押せるようにしといて押しても何もしないなんてUIは糞。
よくわからない議論になってませんか? 916 の例示は意図的過ぎると思います。

ProcessMessage を呼ぶループが動いている間に Button2 をクリックした時だけ問題がおきるわけでしょ?
ProcessMessage の問題ではないと思いますよ。

シングルスレッド/シングルタスクに慣れている人が陥りやすい問題。という話なら納得しますけど
すべては>>912の表現が悪い。
ProcessMessagesの注意点をデータの整合性とか言うからおかしくなるんだよ。
イベントの多重発生が起こるのでそれをうまく処理しとけって言うだけの話。
これはProcessMessages固有の問題。スレッド云々とは無関係。
誰も聞かないと思うけど、一応。

ここは相談室なので、そろそろ談話室に行きませんか?
俺が2chの好きな理由の一つに話がスレの趣向から簡単に反れてしまう所にある
> 916 の例示は意図的過ぎると思います。

916 は頭が悪いだけ。

「ローカル変数以外はデータの整合性が失われる」 Button2Click で Hoge が
変更されるのは、そのようにプログラムしているから。整合性ばっちり。
例になってない。
> だから安易にApplication.ProcessMessagesに逃げて破綻する。

安易に逃げるのは Delphi のせいではなく、DQN プログラマのせい。
そいつらが安易にスレッドつくるよりまし
>DQN プログラマのせい。
超上級者用スレへどうぞ
DQN者用スレもあるの?
>非ローカル変数(グローバル変数およびヒープ上のオブジェクト)の内容が ProcessMessage で
>書き換わってしまう話の出典を教えてください。
こんな馬鹿な質問をしてしまったからってそんなに必死に弁解しなくても・・・
ここは犯罪起こさなきゃ匿名サイトなんだからさ。
>>941
おまい、必死すぎてあわれだぞ。(藁
StringGridの編集可能なセルで
キャレットのある位置に文字を挿入したいのですが(SelTextのような感じで)
どうすればできるのでしょうか。
お願いします教えてください(;´д⊂
Borlandからバージョンアップの封筒が来た。
早速、申し込もうかなぁ。
D6Per使ってます。
TListで項目を削除すると、そこはnilになって残りますが
TListViewなどはItemをDeleteすると自動的に番号を詰めてくれますよね?
これはTListViewでは削除時に自動でPackを行ってるということでよろしいのでしょうか?(たぶん違
Packというメソッドがないんですが・・・どういう仕組みなんでしょうか?
>>944 某社員か?

D8 買う前に
ttp://www.wwlnk.com/boheme/bbs/bbs.cgi
くらい読んでおきな。

俺はパッチが三つくらい出てから買うよ。
947デフォルトの名無しさん:04/02/12 18:58
>>943,945
空気嫁超初心者
>>947
バカか?ここは相談室だろ?氏ね!
>>947
下らんレスでageんな、ヴァカ。
おまいは空気読む前にこれでも読んどけ。
○2ちゃんねる初心者のためのページ
ttp://www.skipup.com/~niwatori/index.html
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
>>953
サンクスです。
>>945
> TListで項目を削除すると、そこはnilになって残りますが

ちゃんと詰められるはずだけど?
>>943

フォーカスを移さないように SpeedButton を使って

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if StringGrid1.ControlCount = 1 then
    TInplaceEdit(StringGrid1.Controls[0]).SelText := 'AAA';
end;
>>954
> その桁まで総当たりで順番に処理するには

もうちょっと、やりたいことを詳しく説明して
>>954
>>958に同意だが、たぶん再帰になるかなぁ。
>>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として、それを
参照するようにしてるけど。
964963:04/02/12 23:11
>>962 なんで俺が頭が悪いこと知ってるんだ?おまえ何者?
>>963
VCLなんかもそんな風に処理してるんだろうけど、
スマートなようでスマートじゃ無い気がしてきて、
気になって気になってどうしようもない。
966961:04/02/12 23:41
お答えありがとうございました。やっぱりそれが一番簡単ですね。

・・・自分でも思いついてたけど、なんとなく
それだけは止めておこうと思ったのに_| ̄|○

素直にParamUnitを立ち上げることにします。
967943:04/02/12 23:59
>>957
レスありがとうございます。こんな簡単にできるんですね・・・衝撃です。
早速やってみます。多謝です!

あと,947様。ご気分を害してしまって申し訳ありませんでした。
968952:04/02/13 00:15
オブジェクトの解放のことで教えて下さい。
たとえば、レコード型のデータを複数のList系のオブジェクトに、
addobject等で入れた時、入れた分だけDisposしてやらないと
いけませんよね?
レコード型をclassに変えた場合って、Createした分Freeしてやるだけで
いいんですかね?
>>968
そうだけど、TObjectListの利用も検討すれ。
970952:04/02/13 00:31
>>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で言うかの違いだろ。
>>974
お前は黙ってろ
>>962

是非、頭のいい方法も教えてくれ。
>>977 瞬発力のある笑いだなw
>>977
「どうせ『また騙されたのか?系』だろ」と思ったが…。
ワラタ。
980976:04/02/13 01:36
>>977

なるほど、たしかに頭よさそうだね。
Delユーザにはほんと頭いいのが多いね。
(´-`)。o ○ (ユーモアの無いヤツはこれだから…)
982976:04/02/13 01:51
>>981
Delユーザにはほんとユーモアがあって頭いいのが多いね。
勉強になるわ、マジで
次スレ立てますた。よろしく。

Delphi相談室(超初心者用)その11
http://pc2.2ch.net/test/read.cgi/tech/1076610073/
うーん
二つできてるぞ。
985別スレの1:04/02/13 04:33
あっ、しまった!
こっちに書いておくの忘れた、スマソ。

くだすれDelphi(超初心者用)その11
http://pc2.2ch.net/test/read.cgi/tech/1076609666/
ウザ
重複キター?
前スレに誘導レスもできないなんて、Delユーザはほんと頭いいね。


つーか、立てる前に宣言しろよ。
重複した奴も立てる直前で調べろよ。
990デフォルトの名無しさん:04/02/13 19:23
よし たてるぞー(w
>>990
勘弁して・・・というか氏ねよ。
992デフォルトの名無しさん:04/02/13 20:47
Del8のキャンペーン申し込んで、
日本語版来た人いる?
993デフォルトの名無しさん:04/02/13 20:50
記念カキコ v(^-^*)
ageずに埋めれ
埋め
996デフォルトの名無しさん:04/02/13 20:58
(゚д゚) <シメジ
997あぼーん:あぼーん
あぼーん
良スレの予感
999デフォルトの名無しさん:04/02/13 21:08
>>998
激しく同意
これからのスレッドの流れに期待だな。
1!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。