2
4様
5 :
デフォルトの名無しさん:04/11/27 22:10:08
5様
ゲームで、ハイスコアランキングを作りたいと思っているのですが、
肝心のソート方法がわからないです。
TStringList.Create
LoadFromFile
Add
ソート
SaveToFile
記録する内容は、スコア、名前、日付なんですが、
この3つをひとまとまりにして、
スコアで降順ソートというのはどういう方法が考えられるのでしょうか。
Addするときコンマ区切りにして、
ソートできる二元配列のようなものに読み込むのか
そもそもそういったものが存在するのかもわからないですが。
同じことをさせるのにどの手法が高速なのかを教えてくれるサイトありませんか?
caseとかinとかposとかforとかwhileとか汎用的なのを。
>>6 TStringList 使うよりも
スコア、名前、日付を扱うレコードやクラスを作って
TList や TObjectList で管理したほうがいいんじゃ?
ソートするならTListがいいっしょ。
あれのソートはピボットソートだから、速度も問題ない。
10 :
前スレ927:04/11/28 02:51:15
Memo1が未定義の識別子ってでるんですが
>>10 コンポーネントのMemoをフォームに貼り付ければ良いかと。
Memoの名前が「Memo1」なら、問題無いかと。
だから何だ。
問題あるなら定義すればいいじゃないか。
13 :
前スレ927:04/11/28 03:10:06
今度は「レコード、オブジェクトまたはクラスのいずれかが必要です」
がでました
一回フォームに貼ってから消したりしたんじゃないのか。
だったら、もう一回コンポーネントを貼って前のと名前を合わせろ
15 :
デフォルトの名無しさん:04/11/28 04:16:53
926 :デフォルトの名無しさん :04/11/27 21:02:25
>>923 違う。
例えば Delphi は VB.NET に比べてあらゆる面で極めて劣っており、
どんなに優秀なプログラマーであっても Delphi を使えばまともなアプリは作れず、
どんなに劣悪なプログラマーであっても VB.NET を使えばすばらしいアプリが作れる。
>1 乙鰈様
>前スレ968
私もちょうどそんなプログラムを作っているところです.
右も左もわからぬ素人で試行錯誤の連続という状態で答えるのなんですが,
FTPの仕様とFTPソフトの動作を参考にしてこんな感じで作っています.
・接続が確立したらサーバーがクライアントにパスワード要求メッセージを送信.
・クライアントはパスワード要求メッセージを受け取ったらユーザーにパスワードを入力させてそのパスワードを送る.
(あるいはあらかじめ用意してあるパスワードを送信する)
・パスワードが正しかったらうまくいった旨のメッセージを送信,違ったら失敗の旨のメッセージを送信して接続解除.
・サーバーは正しいパスワードを受け取るまではその他の命令は受け付けない.
>>7 そういうサイトは知りませんが,言語ガイドがある程度参考になると思います.
なお.一般的用途ならそれらの差は誤差の範囲なので気にする必要は無いと思います.
(ただし繰り返し処理の場合,ヘルプにあるように処理の前に回数が確定している場合はfor文を使うのがよいと思います)
むしろ時間のかかる同じ処理を無駄に何回も繰り返して実行しないかどうかを見たほうがよいと思います.
MSDOSのコマンドをDelphiで実行したいのですが… m(_ _)m
20 :
デフォルトの名無しさん:04/11/28 11:35:13
TStringListで、値を入れる際に、
'あ'のように文字が入っていると大丈夫なのですが
''のように文字が入っていないとエラーが発生してしまいます。
どうしてなのでしょうか・・・
ないものには代入できないでしょ。
項目を増やすには Add 、すでにある項目の内容を変更するには代入。
>>8-9 ありがとうございます。
TObjectListを使う方向で試してみます。
24 :
デフォルトの名無しさん:04/11/28 14:04:20
初めまして。Delphi 7 pro を使っています。
ExtListView について、どなたか教えて下さい。
ListViewに2万個のファイルを表示したところ、とても遅いので
ExtListView 3.72(改)
http://phxmail.sourceforge.net/comp/extlistv_d7.zip を落としてきて登録して使ってみたのですが、使い方がまるでわかりません。
上のzipはDelphi5用のものをDelphi7用に修正したものだそうで、ちゃんとコンポーネントの
登録はできたのですが、付属のデモはDelphi5用のままらしく, コンパイルすらできません。
どなたかこのzip付属の testvm の修正の仕方をご存じないでしょうか?
なぜか、Delphi5でもコンパイルできませんでした。
エラーメッセージは
「FileList.OnVMCacheHint が参照しているメソッドFileListVMCacheHintの
パラメータリストが一致しません。メソッドへの参照を削除してもよいですか?」
です。
>>22 レスありがとうございます。
>すでにある項目の内容を変更するには代入。
の際に、「'あ'」であらかじめ入っているところを「''」に置き換えようとすると
エラーになってしまうのです。
何かしら入らないといけないのでしょうか?
ListViewも自前でデータ管理すれば2万くらい軽くいけるぞ。
OwnerData=trueなら楽勝だな
Memo1はstringで定義すればいいんですか
30 :
デフォルトの名無しさん:04/11/28 15:41:31
なかさぁ、入門サイトで2,3時間勉強したほうがはやいよ
>>24 もし将棋板の某氏だったら(,,゚Д゚) ガンガレ!
33 :
デフォルトの名無しさん:04/11/28 17:21:41
Windowsのシステムに関するスレが無かったのでこちらで教えてください。
DelphiやVBからゴミ箱を空にしたり最近使ったファイルの履歴を空にしたいのですが、
こう言うことをやることは出来ますか?
もし出来るのでしたらやり方を教えてください。
WinFAQとかをゴミ箱やレジストリで検索したのですが見つからなかったので。。。
>>34 意味がわかってワラタw
そうか「パトラッシュの飼い主」は「おじいさん」だw
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
>>26 >>27 情報ありがとうございました。いろいろ調べてみます。
(ownerdataもやり方がよくわからないので)
ネロはパトラッシュの何なの?
x分の1の確率で、何かを実行するっていうのは、
こういう感じでいいんでしょうか。
例えば、1/1000(1000秒に1回)の確率で
ShowMessageでHELLO!と出すには、
procedure TForm1.Timer1Timer(Sender: TObject);
var
x: Integer;
begin
Randomize;
x := Random(999);
if x = 123 then ShowMessage('HELLO!');
end;
どうも偏りが出る気もするんですが、
精密さを上げるために方法はあるんでしょうか。
毎回Randomize呼ぶなよ。
最初に一回で十分。
毎回呼ぶせいで偏りが出ているのかもしれませんね.
あとRandom(999)では確率が999分の1になってしまいます.Random(1000)に.
>>44-45 それで試してみます
不勉強ですいません
ありがとうございます
47 :
デフォルトの名無しさん:04/11/29 04:09:47
DLLをリソースファイルでEXEに埋め込むことはできますか?
具体的にはどうすればできるでしょう。
未だ設定方法が分かりません。
よろしくお願いします。
51 :
前スレ:04/11/29 17:54:41
VBAだかEXCELのヘルプ読むかしかるべきスレで聞けって気もするが。
917 名前:デフォルトの名無しさん[sage] 投稿日:04/11/24 11:57:59
MDBからデータを読んでExcelファイルに書き込むPGを組んでるんですが、
書き込んだセルの文字色を変えるのは可能でしょうか?
52 :
デフォルトの名無しさん:04/11/29 19:18:26
>>49 XlsApp.Selection.Font.color= RGB(255,0,0)
でどうでしょう?文字は赤くなると思いますが。
RGB関数の使い方やcolorプロパティの詳細は、ビジュアルベーシックエディタのヘルプで見てください。
デルファイからエクセルをコントロールする場合、エクセルでマクロを記録して、
ビジュアルベーシックエディタを起動してコードを確認して、読み替えてディルファイに
コーディングしたほうが早いと思います。
>>27 どうもありがとうございました。OwnerData = true にしたら
10倍ぐらい速くなりました。
感謝感謝です。
∧,,∧ お茶どうぞ
ミ,,゚Д゚彡
ミ つ旦)~~
〜と,,,~),,~) 旦~~
]]]]]]]]]]]]]]]]]]]]]]]]]]]]
スマートクライアントていうのでしょうか。
Windowsに対するWindowsUpdateのように
アプリ自身で自分の最新版を取得してきて
自動でVerUpを行うような仕組みは
どのように作るのでしょうか。
実装したり、紹介していたりする所
教えてください。
自前でやるなら
1.更新のチェック
2.(あれば)差分のダウンロード・展開
3.本体(main.exe)の起動
を行う小さなexe(boot.exe)を用意すればいいだけ。
.NETFWやInstallShield最新版にその機能があったはず。
56 :
デフォルトの名無しさん:04/11/30 11:49:39
ごみ箱を空にする方法は無いでしょうか?
>>35で教えてもらったのですが、このリンク先の通りにやってもExplorerが
ファイルの削除の確認のダイアログを表示してしまいます。
何も表示せずに消すだけのプログラムを作りたいのですがうまくいかなくて。
これを回避する方法があったら教えてください。
あと、Formも何も表示せずにごみ箱を消すにはどうしたらいいのでしょうか?
今はForm1.OnCreateにごみ箱を空にするソースを書いて、Form1.OnActivateにClose
だけを書いているのですがうまくいきません。
どなたかアドバイスください。
del \RECYCLER\* /s /q
>>56 >ファイルの削除の確認のダイアログを表示してしまいます。
最後のパラメータに SHERB_NOCONFIRMATION をつまり 1 を設定する。
プログレスや音もなしにするなら7を設定
>あと、Formも何も表示せずにごみ箱を消すにはどうしたらいいのでしょうか?
コンソールアプリを作ったことないの? Hello,World! くらいやっとけば
59 :
デフォルトの名無しさん:04/11/30 14:43:43
>>56 コードをProject1.dprに直接記述。
Form1のFormCreatは、コメントアウト。
よくわからないなら、デザイン時にForm1のVisibleをFalseにして、
Form1.OnCreateでも念のため、VisibleをFalseにする。
>>59 フォームを一切使わないなら無駄に実行ファイルサイズが大きくなるだけじゃない?
コンソールアプリケーションでプロジェクト作って、APPTYPE CONSOLE を消せばよいのでは。
どうもdelphiの初心者です
delphiでMSのSQL2000のデータ型がncharの項目(たとえばtest)に
strX=qry1.FieldByName('test').AsString;
「項目’test’が見つかりません」とのメッセージが出てきて、
(ほかのnchar以外の項目は問題ありません)
どなたさんがdelphiからnchar型のデータを
アクセスできる方法をご存知でしたら、教えてください。
62 :
デフォルトの名無しさん:04/11/30 17:47:36
>>61 strX=qry1.FieldByName('test').As WideString;
だと思う。やったことないけど。
nchar型は、ユニコードの固定長文字列だよね。
>>58 > コンソールアプリを作ったことないの? Hello,World! くらいやっとけば
普通の初心者はコンソールアプリなんか作らん罠。地味だし。
やっぱりフォーム作ってグリグリ動かして〜 に行くのが人情。
そもそも「コンソールって何?」だったりするしな(w
>>63 そうだね。普通の初心者は文法もクラスのなんたるかも知らずに始めるんだよね。
だから、すぐ限界が来るんだけどね。コンソールアプリを一つくらいつくっておくのも
いいと思うけどね。
ボタンなどの上にカーソルを動かした際に、そのボタンについての説明が出てくるように表示したいのですが
これはどうすればいいのでしょうか?
Delphi 6 personalを使用しています。
作成途中ではなく、実行時の場合についての説明表示というのを書き忘れました。
69 :
デフォルトの名無しさん:04/11/30 22:04:35
メディアプレーヤーコンポーネントを使ってMID形式の音楽を流すことができるようになったんですけど、
このボタンを見えないように隠して、
たとえばビットマップオンクリックイベントを押した際にメディアプレーヤーコンポーネントを経由して
音楽を流す方法はないでしょうか?
仮にこれが可能だったとして、メディアプレーヤーコンポーネントボタンを隠す際も、
ただ何かの下に隠すだけでなく姿さえも見えなくして使う方法はないでしょうか?
>>69 MediaPlayer1.Play;
Visible:=False;
71 :
デフォルトの名無しさん:04/11/30 22:45:21
Delphiでモデムの設定を削除する方法はないでしょうか?
今はキーボードで模擬しているのですが、スマートに削除したいと思いまして。
ネットカフェでの使用を想定しています。
73 :
69,72:04/12/01 00:05:33
問題が発生しました。
友人のパソコンに音楽と一緒に圧縮ファイルを送信しても正常に動くかどうか確認してもらったところ
エラーが発生して聞けなかったそうです。
念のため、僕のほうにその圧縮ファイルを送り返してもらって実行してみたところ同じようにエラーが
発生して実行できませんでした。
最初に作ったものは正常に作動したので、たぶん音楽ファイルがどこにあるか参照できなくなったことが原因だと思うのですが、
どうやったらこの問題を解決できるかご存知ないでしょうか?
音楽ファイルは作成したプログラムと同一のフォルダに入れておきました。
>>73 ここで聞く質問じゃなくなってると思う。
そのブツを見れる人間じゃないと答えようがないと思う。
>>51 ヘルプ探しても分からなかったので……
>>52 ありがとうございます。
結局、
WorkSheet.Range[WorkSheet.Cells[m,n],WorkSheet.Cells[o,p]].Font.Color := RGB(255,0,0)
で対応しました。
あとはセンタリングと罫線を引く事…。
どうにもコード補完が効かないので困ってます……
わかりました。
他をあたってみます。
ExtractFilePath(Application.ExeName) + 'music.mid'
とかにすりゃいいんじゃないの。
ああ、最初のはパスが決め打ちってことか。
意味が分かった。
失敬。
ただいまです。
パソコン一般板でも同様の質問をしたところ追い返されてしまいました( ゚Д゚)・・・
なんというか・・・、Delphiの勉強をはじめて一ヶ月ほどなので、よくわからないことが多いです。
こんな感じの命令文を書きましたがエラーがでてきました。
音楽ファイル名もmusic.midに変更後、File Nameで参照しなおしておきました。
いじったところと言えば、再生ボタンを見えなくしたことと、
Auto Open プロパティをTrueにしたくらいです。
ここに何をつけたせばいいのかどうか教えてください。
参考書を読んでも書いてありません。。。
procedure TForm1.Button1Click(Sender: TObject);
begin
MediaPlayer1.Play;
ExtractFilePath(Application.ExeName) + 'music.mid'
end;
end.
[エラー] Unit1.pas(33): 文が必要な場所に 'String' 型の式があります
うーん。
これは困った(色んな意味で)。
ちょっと入門サイトをのぞいてこい
基本が全く出来てないぞ
>>79 もちっといじってから質問しような。なっ?
大丈夫。すぐ分かる。
がんばれ。
以上。
やっとのことでいろいろな数式を演算するくらいまでは勉強したんですけど、
計算関係分野から離れて、こういった分野に手を出したのは今回が初めてなので、
いまいち定義の仕方などがわかりません。
要注意人物として、今後ともよろしくお願いします。
しばらくチャレンジしてみて解決できなかったら、また質問させてください。
僕もかなりアホな初心者で、ここでは何度か助けてもらったことがあるんで。。。
MediaPlayer1.FileName := 'ファイル名';
MediaPlayer1.Play;
な感じで出来なかったっけ
if文や、セミコロン付け忘れ、文の順序などを検討した結果どれも失敗しました。
次はオンクリックイベント無しで検討してみたいと思います。
>>84 今やってみたところ音楽は流れましたが、
他の人に受け渡しても音楽が流れるかどうかまでは確認できてません。
Delphiというより一般的なオープン系開発の基礎。
相対パスと絶対パスについてぐぐれ。
そのうえで
>>77を読み返すのだ。
87 :
デフォルトの名無しさん:04/12/01 10:20:42
function hoge(): TStringList;やproperty foo: TStringList;と言ったものを作りたいんですが、
CreateやFreeはどこで呼び出せばいいのでしょうか?
Delphi6 Personalで制作しています。
> function hoge(): TStringList;
Create は関数の中、Free は呼び出した方で、ってなると思うけど、あんまりよい
方法ではないね。なにか操作した結果を TStringList で返したい場合は
procedure Nanika(... ; sl: TStringList);
のようにして、Create も Free も呼び出し側にさせるべきだと思う。
> property foo: TStringList;
この場合は、Create と Free はコンストラクタとデストラクタで。
private フィールドの Ffoo: TStringList という変数にインスタンスを格納し、
それを参照する。
89 :
デフォルトの名無しさん:04/12/01 11:15:01
>>87 オブジェクトを返り値とする関数は作らないほうがいい。
リソースのリークが起こりやすい。
プロシジャーで、値を設定する変数も引数で渡すようにする。
あるいは、カスタムクラスの作成。
1つのプログラムを複数起動させて、データの共有をしたいのですが、
MLの過去ログ見てたら戸田ちゃんがTCPを使った方がメモリーの共有より
簡単って事を書いてました。
これってどうやるんでしょうか?
Indyのデモとか見ててもサーバーが必要で、しかもメッセージは
サーバーに行くだけで他のクライアントには行かないようなのです。
長くなりましたが、誰か教えて。
function LoadFromFile(FileName: string): TStringList;
begin
Result := TStringList.Create;
Result.LoadFromFile(FileName);
end;
...
sl := LoadFromFile('foo.txt');
try
finally
sl.Free;
end;
92 :
デフォルトの名無しさん:04/12/01 15:43:34
TDatabaseのConnectedがtrueなんだけど接続してるSQL鯖が停止してる、
といった場合、どうやって判断できまつか?
アプリケーション起動時に、どこのディレクトリから起動されたかを知る関数ってありますか?
function ParamStr(Index: Integer): string;
>>93 ない
.dprの先頭ブロックでカレントディレクトリ調べるとか。
まだ相対パスと絶対パスがわからんのかよ
>>97 ParamStr(0)で取れるのはexeのパスであって
作業フォルダ(≒起動ディレクトリ)は取れないぞ。
exeのパスが知りたいんだろ
>>93 GetCurrentDirectory()
101 :
デフォルトの名無しさん:04/12/01 21:41:31
'%home%\bin\'
という文字列を環境変数展開して返す関数ってないの?
102 :
87:04/12/01 21:41:56
答えて下さった方々ありがとうございました。
String型の戻り値をもつ関数で代用できるようにしてみます。
こういうやり方もある。
unit MyLib;
interface
function Foo: TStrings;
implementation
var _Foo: TStrings;
function Foo: TStrings; begin Result := _Foo; end;
initialization _Foo := TStringList.Create;
finally _Foo.Free;
end.
104 :
デフォルトの名無しさん:04/12/01 21:53:24
質問があります。
TXPManifest コンポーネントを配置するとXPスタイルになりますが、
これを削除しても元のスタイルに戻らないのですけど、どうすれば
元のスタイルに戻すことが可能でしょうか?
uses XPMan削除とか。
>>105 ありがとうございます、スタイルが元に戻りました。
>>93のことだけど、
ExtractFilePath( Application.ExeName ) ;
じゃなダメなの?
>>107 実行ファイルがあるフォルダとカレントフォルダは別のものです。
111 :
デフォルトの名無しさん:04/12/02 11:49:48
ファイルを読み込んでそれを10110みたいに表示するにはどうしたらいいのですか?
おはようございます。
おひゃようございまふ
114 :
デフォルトの名無しさん:04/12/02 20:44:06
スペース区切りの数字をどうやって取り出せばいいんだ?
(例)
3 2 1
4 5 4
1 3 4
おたずねします。
メニューに項目のない機能にキーボートショートカットを割り当てるにはどうすればいいですか?
116 :
デフォルトの名無しさん:04/12/02 20:59:50
>>114 どういう風に取り出したいの?
>3 2 1
なら、’321’と認識したいのか’3’’2’‘1゜としたいのか。
いずれにしても、一行づつ文字列変数に読み込んで、スペースを探して、切り出してTstringlistにADDしていくのが、セオリじゃないか。
ロジックを考えるのが難しいなら、スペースを半角カンマにリプレースして、Tstringgridに流し込むという手もある。
SendMessage(RichEdit1.Handle,EM_SETOPTIONS,ECOOP_OR,ECO_VERTICAL);
これでスクロールバーをssBoth、ワードラップをFalseにするとスクロールバーが逝かれるんですが、
対処法とかはないですか?
>>117 お答えありがとうございます。
良さそう…な気もしますがよく理解できてないのでヘルプを読んで勉強します。
>>101 ExpandEnvironmentStrings
で事足りるかどうか…
>>79 そのままズバリ書くと
>>77 と
>>84 を組み合わせてこんな感じになります.
procedure TForm1.Button1Click(Sender: TObject);
begin
// ※実行は上から順に行われる.
// 演奏するファイルの指定(実行ファイルと同じディレクトリの'music.mid')
// ※プロパティの設定は代入式で行う.
// ※『実行時と同じディレクトリ』は ExtractFilePath(Application.ExeName) .
MediaPlayer1.FileName := ExtractFilePath(Application.ExeName) + 'music.mid';
// 演奏実行
MediaPlayer1.Play;
end;
>>121 偶然にも覗いてる最中にレスがきました。
さっそくためしてみます。
ありがとうございました。
>>122 あれだけ(ほとんど回答レベルの)ヒントが出てたのにできてなかったのか・・・
カンニングばかりしていると何も身につかないぞ。
すみません。
yahooで検索してそれらしきサンプルを落としたりして調べてはみたんですけど
動作しなかったり、見当違いだったり、レベル不相応でまだまださっぱり理解できませんでした。
>>123 カンニングってのは違う気がするが…。
>>124 謝らなくてもいいから。
いろいろ自分なりにコピペでもいいから試行錯誤してれば
段々分かってくるって。
焦らなくても良いかと。
もちっといろいろやってみてからにした方がいいって。
まずはメモ帳作ってみるのがいいような
まずは作りたいものを作ればいいだけだろ。
MIDI再生なんて題材として一番簡単だし
>>121で解決だろ。
質問スレでいちいち難癖つけるなよ。
いま学校から帰り着きました。
>>126さんの言われるとおり次はメモ帳を作ってみようかと思います。
試行錯誤法の問題でも解いて結果をメモ帳に出力するところまで進めてみようかと思います。
129 :
84:04/12/03 03:09:31
断るまでもなくアホな初心者です
タイマーってのを見つけて、思いついたやり方なんですけど
こういうのってPCの体力かなり消耗しちゃいますか?
つくったプログラムは取りあえず最小化状態のまま、
たとえば5秒おきに、ある特定のフォルダ中のファイル数をカウントさせ続ける。
何があろうと、静かにずーっとカウントさせ続けるんです
で、あるとき「そのフォルダ中のファイル数が増えたら」フォームが最大化状態で
ピョコッと飛び出してくる。
ためしたところ、最小化状態でもカウントは続けてくれてるみたいで、ほぼ期待通りの動作を
してくれました。
できればこれ、動画の編集をやりながら使いたいんですけど、PCの体力はもちますか。
(Cele1200MHz, 394MB)
実際に作業をするのは僕自身ではなく職場の女の子。
途中でPCこけたりすると、かなり頭いたいので、危険なら使うのやめます。
PC爆発するよ
133 :
84:04/12/03 04:41:18
>>132 ありがとうございます
コピペでそのまま試すことが出来ました。
何だか物凄いテク御紹介いただきまして( ゚Д゚)。。。
今晩はもうくたくたなので、明日あらためてこちらの都合に合わせて
書き換えて試してみます
134 :
デフォルトの名無しさん:04/12/03 06:51:47
>>127 リピート時に止まらないようにするのは大変だぞ!
135 :
デフォルトの名無しさん:04/12/03 12:42:35
ファイルを読み込んでそれを10110みたいに表示するにはどうしたらいいのですか?
ファイルの指定部分を読み込む→それをbitにして表示です
136 :
デフォルトの名無しさん:04/12/03 13:58:38
フォームが自分に遅延して処理させたいんですが、
PostMessage(WM_USER)
だと、
あまりにもWin32ベタ杉なんで、
VCLの中の人でやる方法無いで塚?
Timer使うかその処理の直前で
Application.ProcessMessages呼んでたまったメッセージを先に処理する。
>>135 一バイトずつ読み込んでこれで変換
function Bin2Str(b: Byte): string;
var i: Integer;
begin
SetLength(Result,8);
for i := 0 to 7 do if b and (1 shl (7-i)) = 0 then Result[i+1] = '0' else Result[i+1] = '1';
end;
138 :
136:04/12/03 14:10:42
サンクス
>>137 芋みたいに処理を連結したいんでつが、
その場合はどうしたら良いでしょ?
for i := 0 to 10 begin
Application.Processmessages;
case i of
0: // 0の処理
1: // 1の処理
...
10: // 10の処理
end;
end;
もっと柔軟にやりたいなら処理をオブジェクトにしてリンクでつないで
o := FirstObject;
while Assigned(o) do
begin
Application.ProcessMessages;
o.Execute;
o := o.NextObject;
end;
PostMessage(WM_USER) による遅延と Application.Processmessages; の実行は
違う意味だよ。そのイベントハンドラを抜けてからほかの処理を実行したい場合は、
タイマやPostMessage() じゃないとダメだろ。
141 :
135:04/12/03 15:34:31
>>137 ありがとん
家帰ったらためしてみますです
そうでつか。
では、とりあえずPostMessageで作って、他に変えれれば変えます。
Kylixでも大丈夫かな。
使う予定は無いんだけど。
フラグ立ててOnIdleとか
>>140 別に等価だなんていってないよ。
溜まったメッセージを先に処理するVCLでのやり方を紹介しただけ。
違う意味のものを紹介されても・・・
> フラグ立ててOnIdleとか
これは PostMessage() に近いね。自分でフラグ倒すことを忘れないようにすると。
> フラグ立ててOnIdleとか
1回だけ実行なら PostMessage に近いけど、連続での場合は、他のメッセージがキュー
に入らないと実行が止まるね。PostMessage も TTimer もメッセージベースの実装な
わけだが、TTimer はクラスでラップしてあるだけマシかな。PostMessage() の機構も
簡単にラップしたコンポを作れるけど。
使う予定がないそうだからレスするだけ無駄
>PostMessage() の機構も簡単にラップしたコンポを作れるけど
超キボンニュ。
今回使えなかったとしても、将来激しく使いまつ。
じゃそのときにまた書き込んでください。
ってか、ML の過去ログにあったはず。Asyncなんとかってやつ
スレ違いの感じもするがお許しを。
D7のアップデートってどこにあるの?
某のリンクたどっても見あたらない。
Pascal ファイル変数を使って開いたファイルに対してタイムスタンプを設定するには
どうしたらいいのでしょう? ヘルプを見たらFileSetDateというのがありますが、これは
Pascal ネイティブなファイル変数ではなく,ファイルハンドルを対象とするとなっているので使え
ないようです。
FindFirstFileしてハンドル取得じゃダメなのか
155 :
名無し:04/12/03 20:46:59
質問なんですが、Form1のImage1.OnMouseDownで
btnDraw(Sender);//独自関数
delay(200); //下記
Form2.Visible := not Form2.Visible;
delay(200);
btnDraw(Sender);
とすると、Visible:=Trueとなる場合に(Trueを代入する場合)
一度Form2のオブジェクトにフォーカスが当たるのですが、
その後またフォーカスがForm1に戻ってしまいます。
delay関数でインターバルを設定しているのが
悪いのかどうかは判断できませんでした。
procedure delay(T: Longint);
var
finish: longint;
begin
finish := LongInt(GetTickCount) + T;
repeat
Application.ProcessMessages
until LongInt(GetTickCount) > Finish;
end;
procedure GetStr(src: PChar);
・・・・
var
Buf: array[0..2047] of Char; //0から始まっているのがミソ!
begin
GetStr(buf);
end;
としていいんだよね?
158 :
& ◆s6EvxEmmnE :04/12/03 22:30:51
すいません肝心なこと書いてませんでした(汗)
Form2.Visible:=Trueとしたときに、
Form2(のList1)をアクティブにしたいんですけど…
上の書き方だとForm1がアクティブになってしまうんです。
>>154 それファイルハンドルと違う
FileOpen が簡単かも
>>158 btnDraw(Sender);
がなければ Form2 にフォーカスがあたるけど。
161 :
150:04/12/03 23:04:13
btnDrawは自力でボタン描画してるので外せないんです。。。
Form1.Image1.OnMouseDownでフラグを立ててForm2.OnDeactivateで
フラグが立っていればフォーカスをForm2に残したままにする、
みたいなことって出来ませんか?
(Form1.OnClose 内で Action:=caNone とすると終了キャンセルするように)
162 :
155:04/12/03 23:07:22
↑間違えた…150じゃなくて155です。
> btnDrawは自力でボタン描画してるので外せないんです。。。
はずせるかどうかは問題ではなく、フォーカスが移るなんらかのコードがあるかどうか
が問題
最後に Form2.SetFocus; したらいいんでは
>>153 テキストファイルならこんなな感じかな?
var
F: TextFile;
Age: Imteger;
begin
Age := 20;
FileSetDate(TTextRec(F).Handle, Age);
end;
型無しファイルだったらTTextRecをTFileRecに置き換えて試してくれ。
Yahoo! JAPAN にログインするプログラムを作りたいのですが
参考になるHPまたはソースってありませんか?
joudannkayo
167 :
デフォルトの名無しさん:04/12/04 07:52:53
>>167 一見胡散臭いけど、確かに参考にできる数少ないHPだよな。
多次元配列の要素数の取得
setlength(a,5,21,65);
high(a) //=4
high(a[0]) //=20
high(a[0,0]) //=64
>>156 var
S: array[0..6] of Char;
P: PChar;
begin
S := 'delphi';
P := S; //互換性があるので @ 演算子を使わなくて良い
end;
こういう例はOKだが関数や手続きの引数を渡すときは型違いでコンパイラがエラーを出すはず。
Delphiを始めたいのですが勉強にいい本を教えてください。
173 :
デフォルトの名無しさん:04/12/04 19:38:59
>>170 モナジラのページは、HTTPのGETメソッドやPOSTメソッドでサーバーにリクエストするときのコードの例が載っている。
そしてそこで開発されているソフトの多くはデルファイでかかれている。
フォームのボタンなどを配列のように扱いたいのですが、どのようにすればよいですか?
array of Tbutton
>>175さん
そこまではできるのですが、
for i := 0 to 100 do
arraybtn[i].caption:=inttostr(i);
とした場合、フォームに配置されたボタン1〜100に対応させる方法がわからないのです。
formbutton1:=arraybtn[1]
を100回繰り返さないとダメなのでしょうか?
FindComponent
>>165 まず、YahooのログインページのHTMLソースを見る。
すると、ログイン処理がHTMLのFormで記述されていることを理解する。
次に、Formの処理というものはHTTPではPOSTメソッドが使われることを
理解する。
最後に、DelphiでHTTP通信するときはIndyを使うのがもっとも簡単であり、
TIdHttpコンポーネントのPostメソッドを使うことを理解する。
jpeg.pasが見つからないんだけど、これはソースなし?
>>172 DelWiki (
>>1) には行ってみた?
あと、今なら「カンタン!Delphiプログラミング」がヤフオクに一冊だけ出てる。
結局それかぁ
タグブラウザを作っているんですが、WebBrowser及びUIWebBrowserでは
クッキーが働いてくれず、ホットメールなどのサイトが表示できません。
解決策か、もしくは他に代替となる良いブラウザコンポーネントがあれば
教えて頂けないでしょうか?同じIEベースであろうSleipnirでは正常に
表示できるんですが、そこらへんどうなんでしょう?
>>183 単に設定の問題じゃないのか?
クッキーにも対応してないブラウザコンポーネント・・。う〜〜ん。
∫,,,,,,,,,∧,,∧ オアヨ
⊂,,,,,,,,,つ,,゚Д゚ミつ
質問っす。
HDDの容量・空き容量を調べたかったりしますが
OSに依存しない&2GB以上もOKってコードを書くのは
DiskFree/DiskSizeをつかっててOKなのですか??
GetDiskFreeSpaceExとか使う必要はなし?
同様に、利用可能デバイス中から
フロッピーとリムーバブルDiskを区別する方法で
OSに依存しないコードはどう書くのでしょうか?
どちらも
MLを検索しまくったり、WEBを探してみても
情報がぐちゃぐちゃに散在していてわかりませんでした。
教えてください。よろしくです。
APIカリカリが確実な希ガス
Winのバージョン調べていけそうな(95OSR2以降な)場合だけ云々とか。
OSってWin系だよね。Kylixは関係ないよね。
ライブラリで抽象化されていなければ、OS依存な情報はOS依存な機能をつかって
取るしかないわけだが
質問があるのですが、
Delphi6 PersonalでFormを生成し表示するプログラムだけで、
exeのサイズが400kになってしまいます。
実行時パッケージを使って構築にチェックを入れると、
exeのサイズは小さくなりますが、この場合、外部のDLLも必要になってしまいます。
上以外の方法で、exeサイズを縮小する方法は何か無いでしょうか。
よろしくお願いします。
192 :
デフォルトの名無しさん:04/12/05 19:17:23
>>190 「小さいEXEの作り方」という解説ページがあるはず。ググッてみ。
基本的には、Tformクラスを使わずに、すべてコードで書くことになる。
Halbowさんのところで学べ。
彼の技法を使えば190のexeは10KB以下で作れる。
>>190 小さいサイズの実行ファイルを作ることが絶対必要なら VCL 使わずに SDK だけで書くこと。
でもそんな要求って滅多にないんだよね。
400KB なんてたいしたサイズじゃないと思う。
そうそう、問題はソフトの機能だ。
で、タグブラウザってどんなブラウザなの?
スレ違い
>>183に書かれてたから聞いてみただけでした。
すんまそん
タグブラウザってのは、ウェブサーバーから HTML を読み込んでHTML タグを表示するやつだ。
ちなみに画像ファイルの場合は 16 進表示をしてくれる。
まぁ、最近ではウェブデザイナ必携のツールだな。
200 :
デフォルトの名無しさん:04/12/05 21:12:30
質問です。フォーム上にCombobox1とButton1, Combobox2とButton2・・・というふうに
コンボボックスとボタンが1対1の関係になっていて、各ボタンをクリックしたときにそれぞれ対応する
コンボボックスの内容をフォーム上に唯一存在するラベル(Label1)に表示するようにしたいと考えています。
ここで下のようなコードを書いてみたのですが、<<ここがわからない>>の部分にどのように記入すればいいのか
わかりません。どなたか御教授願いします。
procedure TForm1.Button1Click(Sender: TObject);
begin
Dpy_ComboBox_Name(combobox1.Name);
end;
//<略>
procedure Dpy_ComboBox_Name(ComboName:<<ここがわからない>>);
begin
Label1.Caption := ComboName.text;
end;
190です。
皆さんありがとうございます。
教えていただいたことを参考に腕を磨いていきます。
ありがとうございました。
202 :
デフォルトの名無しさん:04/12/05 21:32:22
>>200 あなたのコードとちょっと違うけど、こんなのはどう?
前提条件としてデザイン時に.ButtonコンポーネントのTagプロパティに.Button1なら1、.Button2なら2を設定しておきます。
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.caption := 'This is Combo-Box No.'+IntToStr( TButton(Sender).tag );
end;
Senderは、Tobjectなので、TButtonに型キャストしてTagプロパティを読み出します。
203 :
デフォルトの名無しさん:04/12/05 21:49:57
>>202 かき忘れたけど、Button2のイベントハンドラもButton1と共有できます。(そうしないと意味がない。)
// Component.Nameの数値を取り出す
// 'Button1'->1
// 'Button'->0
function GetComponentNum(Name: string): Integer;
var
i: Integer;
begin
for i := Length(Name) downto 1 do
begin
if Name[i] in ['0'..'9'] then
continue;
Result := StrToInt(Copy(Name, i+1, High(Integer)));
Exit;
end;
Result := 0;
end;
procedure TForm1.ButtonClick(Sender: TObject);
var
idx: Integer;
cb: TComboBox;
lb: TLabel;
begin
idx := GetComponentNum((Sender as TComponent).Name);
Assert(idx>0);
cb := FindComponent('ComboBox' + IntToStr(idx)) as TComboBox;
Assert(Assigned(cb));
lb := FindComponent('Label' + IntToStr(idx)) as TLabel;
Assert(Assigned(lb));
lb.Caption := cb.Name;
end;
>>188-189 ∫,,,,,,,,,∧,,∧ OSはWin系です
⊂,,,,,,,,,つ,,゚Д゚ミつ
どこかの誰かがライブラリ化して関数とか
作ってないっすかね・・・
ご近所だけ使うアプリだから、
リムーバブル&Aドライブなら
フロッピーと限定しちゃっていいような肝するのですが。
興味として。
>>202-204 ありがとうございます。もともとの質問の意図ですが、Comboboxに文字列を記入し
Buttonを押したときに、それまでのコンボボックスに記録した文字列と比較し、一致するものがなければ
コンボボックスのリストの最後に追加する、という作業を行おうと考え 単一のボタン、単一のCombobox
ではうまくいったものの、完成品には1つのボタンには2個のComboboxこれが5セット分あり合計10個分
のほぼ同じコードを記述するのも無駄に感じたため、質問させていただきました。
いただいたコードでゴリゴリやってみます。ありがとうございました。
207 :
デフォルトの名無しさん:04/12/05 22:19:56
ShellListViewコンポーネントについて質問です。
MultiSelectedをTrueにして、複数ファイルを選択したときの選択しているファイルの数を取得したいのですが、
どのプロパティを使えばいいのかわかりません。
自分なりに検索したり、ソースを読んだりして、Folders[Index]がポイントだというところまではわかったのですが、
そこから先がさっぱりです。
Folders[Index]という表現からして、TstringsオブジェクトのようなCountプロパティに相当するものがあると思うのですが。
どなたか詳しい方よろしくお願いします。
ゴメン
フロッピーとリムーバブルディスクの区別つかないや。
>>207 SelCountでは駄目なのかなぁ・・・
∧,,∧ レスありがとやんす!
,,ミ,,゚Д゚ミ
.とミ,,,,,U,,U
>>208さん。そうなんすよ
うまくいかんのですよ。
>>209さん
ヲォ!日曜日はBCBは行方不明&消去になったと
思ってました。
よかったー、いまのうちに(σ・∀・)σゲッツ!しとこうかと。
後で呼んでみます。
213 :
デフォルトの名無しさん:04/12/05 22:55:31
>>211 Selcountで、取得できました。
ありがとうございました。
cmd.dirの標準出力を取り込むw
>903,270,400 バイトの空き領域
>208,>212
Delphiのバージョンにもよるけど、5以降ならOSの違いはVCLで吸収しているので素直にDiskFree/DiskSizeでOK
っつうかソース嫁
FDの識別は...リムーバブルかつFAT12という条件でどう?
>>215 ソース読めれば(ry
そもそもDel使いじゃない罠。
> FAT12
それだとディスク入ってないと判定できなくね?
SHGetFileInfo() はドライブにも使えるよ
ドモー。
∫,,,,,,,,,∧,,∧ 情報が散在してて
⊂,,,,,,,,,つ,,゚Д゚ミつ 正解がどこにあるかわからないのに
"VCLソース呼んで解決することができる"ほどに賢くはないから、
質問して確認しているんだが。くだすれで。
D6で
SysUnils.pasにコメントで書いてあるのね。
{ The GetDiskFreeSpace Win32 API does not support partitions larger than 2GB
under Win95. A new Win32 function, GetDiskFreeSpaceEx, supports partitions
larger than 2GB but only exists on Win NT 4.0 and Win95 OSR2.
The GetDiskFreeSpaceEx function pointer variable below will be initialized
at startup to point to either the actual OS API function if it exists on
the system, or to an internal Delphi function if it does not. When running
on Win95 pre-OSR2, the output of this function will still be limited to
the 2GB range reported by Win95, but at least you don't have to worry
about which API function to call in code you write. }
えっと、英語よめない。後半とかあまりヨクワカ.......
肝心なのは最後の一文か。。。
Del6のIDEで
beginって打った時に
→→→→|
に自動的にインデントさせる設定ってないですか?
ないとして最新バージョンだとできたりしますか?
さて、フロピかリムバですが
∫,,,,,,,,,∧,,∧ MLでは、
⊂,,,,,,,,,つ,,゚Д゚ミつ "マイコンピータのシェルのアイコンから区別できんじゃね?"
という人もいたみたいだけど、
明確な回答は出ていなかったかと、記憶してるです
・・・空容量チェックか・・・
フロッピー、遅いからコリンコリンとアクセスしにいって
ほしくないのですが・・・
SHGetFileInfo() でフロッピーなら szDisplayName でエクスプローラと同じ
表示名が取れるよ
szDisplayName でググったらでてきますた
http://forum.nifty.com/fdelphi/samples/01432.html ∫,,,,,,,,,∧,,∧ ホワワ
⊂,,,,,,,,,つ,,゚Д゚ミつ
>>221さん、夜遅くにありがおう。
function IsFDDrive(const ADrive: Char): Boolean;
これかしら?
Pos(' FD (', UpperCase(fi.szDisplayName)) > 0
なるほ・・・
>>221 それって言語(ロケール)依存しないの?
>>221 「エクスプローラと同じ」って意味では依存しないのでは
226 :
sage:04/12/06 10:33:22
いや、すべてのロケールでFDDのアイコンのテキストは
' FD (' を含むのか、ってことでは?
_| ̄|○ 書くとこ間違えたゴメソ
>>226 それなら
>>222 にきいてみたら。自分の周りだけのアプリだそうだから、それで十分なんでは
>>48 ものっ凄い遅レスですがうまくいきました。ありがとうございました。
>>218 5のソースを見る限り,関数ポインタさえ理解していれば難しくは無いと思います.
また,英文は翻訳サイトが案外役に立ちますよ.
231 :
名無し募集中。。。:04/12/06 13:31:14
最近、Delphi4から7に乗り換えたのですが
メニュー間隔がスカスカなのとセンスの欠片もないスピードボタンにガッカリです
どうにかしてDelphi4の引き締まったインターフェイスに戻すことは出来ないのでしょうか?
>>231 1. Delphi7をアンインストール
以上
>>207 con := 0;
for i :=0 to ListView.Count-1 do
begin
if ListView.items.item[i].selected then
con := con + 1;
end;
とかで一応なんとか
でもスマートじゃないよね?
>>232 了解しますた。
やっぱそれしかないんですね
∫,,,,,,,,,∧,,∧ 漏れに聞いても仕方ないでしょ
⊂,,,,,,,,,つ,,゚Д゚ミつ
>>228 質問の回答ってのは
質問者の漏れだけに役に立つ会話じゃないんだから。
漏れもロケールのトコは気にしてなかったけど、気になってきた。
ロケールは別にしても名前の変更で簡単にFDを消すことはできる。
238 :
デフォルトの名無しさん:04/12/06 23:04:44
'49たす83'を音声に変換するのってどうやるの?
>>238 ブルックナーの第8交響曲を聴いた後、秋田馬方節を歌えばよい!
>>235 のレジストリで行けるのでは?
表示用の文字列はロケール依存激しいと思う。
右から書く言語もあるしね。
そういえばスピーチAPIとかって在ったような気がする。
今はどうなったのかしらんが。
243 :
デフォルトの名無しさん:04/12/07 09:42:16
QReportではNewPageで自動で次のページ作ってくれますよね。
RaveではNewPageみたいなメソッドって無いんでしょうか?
FinishNewPageでは思うような動きをしてくれなくて・・・
探しても見つからないし、マニュアルは英語だし・・・限界です_| ̄|○
> マニュアルは英語だし・・・限界です
プログラマには向かないかも
>>236 >漏れもロケールのトコは気にしてなかったけど、気になってきた。
周りだけのアプリで、気にすんの? アラビア語とか使ってる人いるの?
>>244 Σ(゚д゚lll)ガーン そ、そんな殺生な・・・。
プログラマーの適性検査は結構良かったんだぞヽ(`Д´)ノウワァァン!!
>>246 でもマジな話、英語はできるようになったほうがいいよ。
別にペラペラにならなくてもいいから、辞書片手にマニュアルくらいは読めるようにはすぐなれるし、
将来海外の人と電子メールするようになるかもしれないでしょ。
マニュアル、ヘルプくらいだったらちょっと努力すれば比較的簡単だよ。
>>247 わかった。一度挫折したんだけど、もう一度マニュアル読解にトライしてみる(`・ω・´)
長文を見ると日本語でも英語でも投げ出してしまうクセもなるべくなおすよ。
特定のプロシージャ内でしか使わない変数があるのですが
どうやって初期化すればいいですか?
ただ、そのプロシージャが呼び出されるたびに
初期化されるのも困るんです。
グローバル変数にするしかないですか?
>>236 Win2k で FD のところをレジストリからとってみた。
\??\FDC#GENERIC_FLOPPY_DRIVE#5&7fad87f&0&0#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
うーん、これはロケール依存しなさそうだね。"FDC" のところを検出するとOKかも
>>249 Cでいうstatic変数のことかな?
Delphiには存在しないからimplementation部に変数宣言
もしくは手続き、関数内で型付き定数を使用するぐらいしかない
>>249 グローバル変数を使いたくなければ、クラスを使え。
たとえば、変数と手続きだけのクラスを作って、
起動時にインスタンス作って以後そのインスタンスを使うとか。
GUIアプリなら、変数と手続きの両方をForm1のメンバーにしちゃうとか。
変数だけForm1のメンバーにして、手続きにvarで参照渡しするとか、
やりかたはたくさんある。
たくさんあるって言っといて、どれもスコープがプロシージャの外に出てるじゃん。
なぜそこでスコープの話になる
そんなエサに釣られるクマー(AA略)
代案厨乙
>>254 なぜそこでって、プロシージャ内でしか使わないのに、その外からアクセスできるんじゃ
グローバル変数で妥協するのと変わんないじゃん。
そもそも質問が変。
>ただ、そのプロシージャが呼び出されるたびに初期化されるのも困るんです。
そうそう、それ、プロシージャのスコープから外れてるし
馬鹿は黙ってていいよ。もう
>>251で決着してんだから。
そもそも質問が馬鹿だからなー
262 :
デフォルトの名無しさん:04/12/07 16:04:23
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
ってユニットごとにガシガシ呼んでも大丈夫?
>261
具体的にどう上手くいかないの?
264 :
デフォルトの名無しさん:04/12/07 20:14:52
' ← これを文字列に使うにはどうしたらいいの?
' '' '
'\'' 普通こうやるよな
delphi特殊
AA描いてる気分になる
>>263 すみません。自己解決できました。
uses節にMSHTML_TLBとActiveXを書き加えてなかったのが主な原因でした。
> 主な原因でした。
ほかの原因はなに?
レス下さった方々どうもです。
なにやら質問自体に問題があったようで・・・
しかし、さっぱりなのでそこらへんかんべんです。
しっかり勉強してみます。
>>238 読み上げ算プログラムを作りたい,ということしょうか.
「いち」「にー」「さん」「しー」「ごー」「ろく」「なな」「はち」「きゅー」「じゅー」
「にじゅー」「さんじゅー」「よんじゅー」「ごじゅー」「ろくじゅー」「ななじゅー」「はちじゅー」「きゅーじゅー」
「たす」
みたいな音声を用意してたとえば49+83なら
「よんじゅー」「きゅー」「たす」「はちじゅー」「さん」と連続再生すればとりあえずできるようになります.
(最大2桁なら「きゅーじゅーきゅー」まで全部用意しても良いのですが3桁以上だと現実的ではありません)
あとは数値から読みに変換する(たとえば 49 を「よんじゅー」「きゅー」にする)部分のプログラムを書きます.
>>248 何でも良いから小説本でも読む.何でもというからには
ttp://www.france.co.jp/bisyojo/index.html こんなんでも良いと思います.
個人的には『スレイヤーズすぺしゃる』シリーズとか.お笑い系で短編集なので1つが短い.
>>270 ご質問自体は間違っていません!!
C言語にはご質問の通りに使えるstatic変数というものが存在しますし,
Delphiにはstatic変数はありませんがコンパイラオプションで『型付き定数への代入』を許可すると
型付き定数をCのstatic変数と同じように使うことができます.
procedure TForm1.Button1Click(Sender: TObject);
const YobidashiCount: integer = 0;
begin
inc(YobidashiCount);
ShowMessageFmt('%d回目の呼び出しだぜ!', [YobidashiCount]);
end;
> コンパイラオプションで『型付き定数への代入』を許可すると
> 型付き定数をCのstatic変数と同じように使うことができます.
( ・∀・)つ〃∩ ヘェー*16
>『型付き定数への代入』を許可すると
これ非推奨だけどな。
var YobidashiCount: integer = 0;
procedure TForm1.Button1Click(Sender: TObject);
begin
inc(YobidashiCount);
ShowMessageFmt('%d回目の呼び出しだぜ!', [YobidashiCount]);
end;
のがまだまし。外に出してもユニットローカルだから大して問題にはならない。
禿同。型付き定数への代入ってものすごくソースが読みにくい。
グローバル変数やクラスのフィールド変数は、ゼロやらfalseやらnilに自動で初期化されるし。
276 :
デフォルトの名無しさん:04/12/07 23:38:45
ようはCの関数内static変数と同じものはないんだね。代わりになるものは非推奨。
しょぼいなぁ。
言語の違い。ショボイとかの問題ではない。C はクラスつかえんだろ。
278 :
デフォルトの名無しさん:04/12/08 00:20:39
ようはC++の関数内static変数と同じものはないんだね。代わりになるものは非推奨。
しょぼいなぁ。
この際D++を開発汁!
言語仕様を比較し出すと、
DelphiはC++より不自由だからコンパイルが速いとか
ジェネリックプログラミングとビルドが速いのはどちらが作業効率が高いかとか
際限なく話が広がっちゃうのでやめれ。
282 :
デフォルトの名無しさん:04/12/08 07:01:28
質問させてください。こちらのデルファイは、デルファイ6のエンタープライズです。
ウェブサーバーアプリケーションを作るとき、「CGI実行形式」を選んだ場合、
吐き出されたバイナリは、ウインドウズ系以外のOS上のアパッチでも動くのでしょうか。
CGIを作る必要があって、(パールの使えますが、)可能ならデルファイでやりたいと思います。
苦労して作って、動かなかったというのは避けたいですし、実験しようにもよくわからないものを
外部のサーバーに送り込むのは、セキュリティ上気が引けます。(プライベートネットワークには、
IISが動いているマシンはありますが、ユニックス系のOSのマシンはありません)
よろしくお願いします。
クロスプラットフォームで書けばいいんじゃね。
という希ガス。
>>282 マジレスするとWindows以外のOSは山ほど在るんだが・・・
恐らくUNIX系OSとの推測で答えると・・・これまた山ほど在る。
製品名がどうこうではなく、CPUのアーキテクチャからして違う。
Delphiファミリーで生成できるのはintel i386アーキテクチャ上での
Windows or Linux用実行モジュールのみ
補足すると上記は言語についてのみの話。
すべてのライブラリ(コンポーネント)やOSに依存する機能が提供されている訳ではないので誤解なきよう。
例えばLinuxにOleDBやADOはない。
286 :
デフォルトの名無しさん:04/12/08 10:43:03
最小化起動すると、OnActivateは動かないでつか。
どうしよう。
>>286 onActivate内に記述する必要ある処理って何だ?
フォーム表示後に一度だけ処理を行いたければ
CMShowingChangedをオーバーロード汁
288 :
デフォルトの名無しさん:04/12/08 11:01:24
超サンクス
>>287 ネーミングから、何度も発生しそうなイベントですが、本当に一度でつか?
何度も発生するならフラグ付けますが。
289 :
名無し募集中。。。:04/12/08 11:05:01
>>288 procedure CMShowingChanged(var Message: TMessage);message CM_SHOWINGCHANGED;
procedure TfrmAE002.CMShowingChanged(var Message: TMessage);
begin
inherited;
if Visible then
begin
end;
end;
>>289 途中送信してしまいますた
if Visible then
begin
ene;
>>290 ああ、もう何が何だかわからない_| ̄|○
念のためif文のbegin〜end内にSelf.updateを入れておけば十分かと
292 :
デフォルトの名無しさん:04/12/08 13:03:31
>>283,284,285
レス、どうもです。
つかうメソッドに注意して試してみます。
293 :
デフォルトの名無しさん:04/12/08 13:49:22
アイコン化したときのイベントかメッセージ教えて下さいでつ。
アイコン化してると、殆どイベント来ませんね。
>>293 TApplication.OnMinimizeです。
296 :
デフォルトの名無しさん:04/12/08 14:44:19
サンクス
>>295 その通りですた。
ただ、アプリの初期処理をForm.OnActivateとApplication.OnMinimizeと2箇所にいるなんて、
VCLが一つになるようなイベント用意してくれれば良かったのに。
297 :
デフォルトの名無しさん:04/12/08 15:29:31
確認させてください。
OnShowとOnActivateは一回づつしか発生しないでつよね?
そんなことはありません。Hide → Show するたびに OnShow
Deactivate → Activate するたびに OnActivate
初期化は Application.OnIdle でやってしまって、イベントハンドラをはずすと
一回だけオブジェクトの生成後に処理できます。
こんな感じ
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Add('Create');
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Memo1.Lines.Add('Activate');
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Memo1.Lines.Add('Show');
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Memo1.Lines.Add('Paint');
end;
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
ApplicationEvents1.OnIdle := nil;
Memo1.Lines.Add('Idle');
end;
300 :
デフォルトの名無しさん:04/12/08 20:24:44
ShellExecuteで、アイコン化してプログラムを実行したいのですが、
Delphiアプリが言うことを聞いてくれません。
どうしたら良いで塚?
起動元、起動側、両方Delアプリでつが、専用の処理を入れるのメンドウでつ。
でつでつうっせーぞハゲ
302 :
デフォルトの名無しさん:04/12/08 20:41:55
もう解決したから良いでつ。
SW_SHOWMINNOACTIVEのみアイコン化ですた。
WindowState効かないっけ?
Delphiアプリって起動パラメータを見てたっけ? WindowState の方が優先では?
305 :
ウルトラ初心者:04/12/08 22:33:23
function XorEnCode(S,P: string): string;
var
i, j, LP, Blk, M,LS: Integer;
begin
Result := '';
LP := Length(P); LS := Length(S);
if (LP = 0) or (LS = 0) then Exit;
Blk := LS div LP;
M := LS mod LP; //PassWord文字列の長さに満たない場合
SetLength(Result,LS);
for i := 1 to Blk do
for j := 1 to LP do
Result[(i-1)*LP+j] := Char( Ord(S[(i-1)*LP+j]) xor Ord(P[j]) );
if M > 0 then
for i := 1 to M do
Result[Blk*LP+i] := Char( Ord(S[Blk*LP+i]) xor Ord(P[i]) );
end;
-------------------------------------------------------------------------
単に任意の文字列に対しXORをかけるだけなのでP(パスワード文字列)も任意の日本語で問題ないと
思うのだが XorEnCode( '諸星弾&友里アンヌ' , 'ウルトラ警備隊') などとやると2回繰り返した
場合元に戻らない。なんでじゃろ?
xorなんて使うな。最低でもBlowfish使え。
307 :
デフォルトの名無しさん:04/12/08 23:16:21
アイコンの指定がうまくできません。
エクスプローラで見ると指定したアイコンなのですが、exeファイルを右クリックでみると
デルファイのアイコン?になってしまいます。
resファイルを削除して再構築してもだめでした。
>>305 なんだかよく知らんが、ソース分かり辛い。意図した動作をしないならコード間違っているんじゃない?
RC4でも使えば? 簡単だし速いしソースも一杯転がっているし、バイト単位でできるし汎用性が高いので使いやすいと思う。
>>305 たとえばカタカナ同士の LeadingByte は同じだから、Xor をとればゼロになる。
だから、文字列の長さを間違う。
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s := XorEnCode('諸星弾&友里アンヌ','ウルトラ警備隊');
Label1.Caption := s;
Label2.Caption := XorEnCode(s,'ウルトラ警備隊');
end;
ならうまくいくが、
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := XorEnCode('諸星弾&友里アンヌ','ウルトラ警備隊');;
Label2.Caption := XorEnCode(Label1.Caption,'ウルトラ警備隊');
end;
失敗する。暗号化したものは文字列として受け取ることは危険。
310 :
デフォルトの名無しさん:04/12/08 23:30:49
なんだDelphiのバグか。
バグじゃない。文字列の特性。
delphiでCのqsort
313 :
デフォルトの名無しさん:04/12/09 06:47:31
>>307 プロジェクトオプションで指定するプロジェクト全体のアイコンと各フォームのアイコンの両方指定してありますか?
つまりこういうことだよね。
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s := '途中で'#0+'途切れる';
Label1.Caption := s;
Label2.Caption := IntToStr(Length(s));
Label3.Caption := IntToStr(Length(Label1.Caption));
end;
文字列同士の代入は参照の代入で同一の実体を指す。CopyOnWrite 。
プロパティーへの代入はアクセサによるコピーなので最初に見つかった #0 で長さ確定。
これは PChar と string の代入互換性を実現するためにしかたないか。
>>305 の Xor のようなビット操作で文字列を「暗号化」した結果は、かなり高い確率で #0 を含む
ので、もはや文字列ではなく、バイナリデータだとみなした方がいいね
Captionへの代入って文字列のコピーじゃないのか…
暗号化 BlowFish アルゴリズム Delphi移植版 BlowFish002.lzh 16627 2004/12/09
>>316 コピーだって言ってるじゃん。最初の#0までの。
type
TByteArray = array of byte;
procedure XorEncode(const Source, PassWord: string;var ba:TByteArray);
var
i, LP,LS: Integer;
begin
SetLength(ba,0);
LP := Length(Password); LS := Length(Source);
if (LP = 0) or (LS = 0) then Exit;
SetLength(ba,LS);
for i := 1 to LS do
ba[i-1] := Ord(Source[i]) xor Ord(Password[(i-1) mod LP +1]);
end;
function XorDecode(const ba: TByteArray;const PassWord: string):string;
var
i, LP,LS: Integer;
begin
result := '';
LP := Length(Password); LS := Length(ba);
if (LP = 0) or (LS = 0) then Exit;
SetLength(result,LS);
for i := 1 to LS do
result[i] := Char(ba[i-1] xor Ord(Password[(i-1) mod LP +1]));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ba:TByteArray;
s,p: string;
i:integer;
begin
s := '諸星弾&友里アンヌ'; p := 'ウルトラ警備隊';
XorEncode(s,p,ba);
for i := 0 to Length(ba)-1 do Memo1.Lines.Add(Format('%.2d : $%.2x',[i,ba[i]]));
Label1.Caption := XorDecode(ba,p);
end;
>>318 いやだからヌル終端文字列のコピーなんでしょ?
まあ言い回しはどうでもいいんだけどさ…
どう言い訳したところでDelphiの仕様バグが直るわけでもなし。
323 :
デフォルトの名無しさん:04/12/09 17:02:25
MemoやListBoxのLine/Item数をgetするにはどうすれば良いでしょうか…。
プログラム実行中にLineやItemが追加する動きの後に
その合計数を参照したいのですが…。
激しく既出でしたら申し訳ございません。
count
文字列の途中に #0 がはいってもいいようにするより、PChar との互換性を選んだってことだろ。
>>324 countプロパティを知りませんでした。orz
助かりました。
どうもありがとうございました。
Randomizeって具体的には何してるの?
seedに大麻突っ込んでるだけだろ
>>309,319,320
サンクスです。とても参考になりますた。
>>327 以下のコードを貼り付けて(要Memoコンポーネント)、100回実行してみてください。
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 9 do Memo1.Lines.Add(IntToStr(Random(100)));
end;
Randomize の意味じゃなくてどうやって実装してるのかって質問だろ
332 :
デフォルトの名無しさん:04/12/09 22:27:59
>>327 乱数の種をどこから取得しているのかという質問か?
procedure Randomize;
{$IFDEF LINUX}
begin
RandSeed := _time(nil);
{$ENDIF}
{$IFDEF MSWINDOWS}
var
systemTime :
record
wYear : Word; wMonth : Word; wDayOfWeek : Word;
wDay : Word; wHour : Word; wMinute : Word;
wSecond : Word; wMilliSeconds: Word;
reserved : array [0..7] of char;
end;
asm
LEA EAX,systemTime
PUSH EAX
CALL GetSystemTime
MOVZX EAX,systemTime.wHour
IMUL EAX,60
ADD AX,systemTime.wMinute { sum = hours * 60 + minutes }
IMUL EAX,60
XOR EDX,EDX
MOV DX,systemTime.wSecond
ADD EAX,EDX { sum = sum * 60 + seconds }
IMUL EAX,1000
MOV DX,systemTime.wMilliSeconds
ADD EAX,EDX { sum = sum * 1000 + milliseconds }
MOV RandSeed,EAX
{$ENDIF}
end;
なるほど
時間からとっていたとはぁこりゃぁたまげた(・∀・)
Delphiユーザーは天才だなwwwwwwwwwwwwwwwwwwwwww
>>319のTByteArrayのような動的配列の読み書きは
EncodeByte: TByteArray;
L := SizeOf(EncodeByte);
WriteF.Write(L, SizeOf(L));
WriteF.Write(EncodeByte, L); ※
ReadF.Read(L, SizeOf(L));
ReadF.Read(EncodeByte, L); ※
でええのかな? 文字列だと ※のところが
WriteF.Write(EncodeStr[1], L);
ReadF.Read(EncodeStr[1], L);
でいいみたいでっけど・・・・・
WriteF.Write(EncodeByte[0],Length(EncodeByte);
Read も同様
)がたりんかったか
動的配列は長い文字列と同じようなスマートポインタ
SizeOf(EncodeByte);
は常に4
あと、Read の前に SetLength() を忘れないように。
バッファ操作のインターフェースにarray of byteってどうよ?
元データが文字列なんだからString, PChar, varあたりが妥当だよ。
StreamはWrite(const buf; だし。
ついでにTByteArrayは別の形で定義済み。Types.TByteDynArray使っとけ。
MemoryStream でやってみた
procedure TForm1.Button1Click(Sender: TObject);
var
ms:TMemoryStream;
i,L:integer;
EncodeByte,DecodeByte:TByteArray;
s,p: string;
begin
s := '諸星弾&友里アンヌ'; p := 'ウルトラ警備隊';
XorEncode(s,p,EncodeByte);
ms := TMemoryStream.Create;
try
L := Length(EncodeByte)*SizeOf(Byte);
ms.Write(L,SizeOf(L)); // 書き込み
ms.Write(EncodeByte[0],L);
ms.Position := 0;
ms.Read(L,SizeOf(L));
L := L div SizeOf(Byte);
SetLength(DecodeByte,L);
ms.Read(DecodeByte[0],L);
Label1.Caption := XorDecode(DecodeByte,p);
finally
ms.Free;
end;
end;
>>340 お好きにどうぞ。
文字列をEncode → 文字列じゃまずい、バイナリデータにすべき
という流れから Array of Byte にしたんだろ。PChar はどう見てもまずい。
>>342 文字列の問題じゃないといったい何度言わせれば・・・
byte of arrayだとデータが既にある場合にコピーしないといけないからいまいちだな。
Encode した結果を PChar や string で受け取ると間違いを生みやすいってことから質問が始まって
るでしょ。そうでなければ
>>305 の関数自体は正しいでしょ。
>>346 意味分かってない奴。
なんにしてもバッファ操作にarray of byteなんて使う奴はいないってこった。
Delphi cryptかなんかで検索してインターフェース調べてみなよ。
string をバッファ操作に使う方が珍しいような希ガス
> なんにしてもバッファ操作にarray of byteなんて使う奴はいないってこった。
うーむ、どこがバッファ操作なんだろう?
ソース文字列とパスワード文字列と XOR するのに添え字でアクセス出来るので
この上なく便利だと思うのだが?
350 :
デフォルトの名無しさん:04/12/10 11:21:21
TPageControlのタブにTMemoとか貼った場合、
タブが表示されるまでCreateされないんでしたっけ?
出来れば、該当のVCLの位置キボンユ
自分で調べろよ。TPageControlにTMemo貼ってダブ表示させない状態で情報取りに行けばわかるだろ。
それは初耳。それだと初期化できないだろ。
353 :
350:04/12/10 11:36:14
表示されてないタブのTMemo.Lines.Addすると、タブを表示したときにTMemoが消えてますた。
>うーむ、どこがバッファ操作なんだろう?
うーむ、codecのどこがバッファ操作じゃないんだろう?
355 :
デフォルトの名無しさん:04/12/10 12:23:41
codec ってなんですか?
356 :
デフォルトの名無しさん:04/12/10 12:29:55
それだと長い文字列つかえばみなバッファ操作だわな
>>353 Add 出来たなら Create されているんでは? 消えた原因は不明だけど
そもそもMemo1がnilじゃなければCreateされてる希ガス
再描画シテミソ
なんかここもC言語スレみたいになってきたな・・・
例えば
memo1.visible
のmemo1部分をconという変数に代入して、
con.visible
という感じに動作させるにはどのようにすればいいのでしょうか。
con の型は何で宣言すれば?
>>361 うまくいきました。ありがとうございます。
>363
360の条件ならFreeしちゃ駄目だと思う。
>>364 onCreate内でmemo := TMemo.Create(Self)
onDestroy内でmemo.Freeが必要なのでは?
memo := TMemo.Crete(Self);
memo.Parent := Self;
しとけば児童解放される。TComponent継承してるクラスならね。
>365
>360はcreateではなく別な変数memo1(たぶんフォームデザイナで作ったインスタンスへの参照)を
代入しているから、もしconをfreeすると元々のmemo1が解放されてしまう。
違うフォームのTStringGrid.Rowに数字を代入するとプログラムが固まります。
他の例えばTStringGrid.Colなどは問題なく動作するのですが。
同じフォームにコピーしたTStringGridで同じことをやっても特に問題は起こりません。
何が起こってるんでしょう・・・
ブレークかけてみたら。イベントが連鎖的に発生してるかも。
一般に他のグリッドなら駄目と言うことはないよ。
ありがとうございます。
でも特にwhileもfor〜も使ってないのです。
showmessageなど使って問題の行の前後に置いてみると、
確実にTStringGrid.Rowの行で止まってます。
あーブレークって固まってるときにIDEから停止させるって意味。
止まったら呼び出し履歴調べてみて。
Delphi 6 RTL アップデート #3で上書きした
c:\winnt\System32\rtl60.bpl
c:\winnt\System32\rtl60.map
c:\winnt\System32\rtl60.jpn
は、Delphi 6をアンインストールしたら削除しても良いファイルなのですか?
削除してもいいけどパッケージ使ったアプリが動かなくなるよ。
>>373 パッケージ使ったアプリとは、どういうことでしょうか?orz
このファイルは、Deiphiをインストールする前からあったファイルなのですか?
(上書き前のファイルのことです)
>>371 すみません、単純なコードのミスだったことが判明しました。
失礼しました・・・
>>374 プロジェクトオプションで指定できる実行時パッケージの事。
それ使うとexeのサイズが激減する代わりに*.bplがないと動かなくなる。
何度もスミマセン_| ̄|○
c:\winnt\System32\rtl60.bpl
c:\winnt\System32\rtl60.map
c:\winnt\System32\rtl60.jpn
はDelphiのランタイムだったんですね。
ということは、Delphiをアンインストールしたからといって、
わざわざ上書き前のファイルに戻してやる必要はないのでしょうか?
リロードしてなかった。
>>376 ありがとうございます!
テキストファイルを読み込み、内容をTreeViewに書き込むプログラムを作っています。
アアア
イイイ
ウウウ
上記の項目を設計時にTreeViewに設定してあった場合、
イイイの下にテキストファイルの内容を、子ノードとして追加していきたいのですが、
イイイの取得の方法を教えていただけませんか?
>>379 TreeView1.Items[]でTreeNode列挙できるからTextとLevelみて検索
381 :
デフォルトの名無しさん:04/12/11 01:18:41
Delphi6 の TComboBox の編集ボックス内で、文字列の途中に
全角スペースを挿入したあと、BS で全角スペースを消すと
文字化けするんだけど、解決方法教えてくだちい。
>>380 さっそく試してみたところ、取得できました。
ありがとうございました。
>>381 WindowsUpdateしてDel6用パッチを全てあててから
フォームにComboBoxを一つだけ貼り付けてプロジェクトで再現したら
使ってるOSを書く。
>>381 AutoCompleteプロパティをFalseに汁
>>381 正直、AutoCompleteはお奨めできない
Tntを使うと幸せになれるよ。
stringってなに?
array of charでもなくてPCharでもないのにキャストできたりして意味不明
フォームの、×ボタンと最大化ボタンを消したいのですが可能ですか。
サイズは変更可能、最小化のボタンだけ残したいのですが。
プロパティのBordericonsやったよな、たしか
えー?
「最小化だけ」は無理じゃない?
「終了ボタン」も、「無効」なら出来るけど、
純粋に「最小化ボタンだけのウィンドウ」って無理だと思う…。
>>391 ところでこのサイトまとまってよかったのに何でやめちゃったのかな
元のページなくなってるし
>>392 Seventh Delphi旧入門として復活してるよ。
>>388 WM_NCPAINT で最小化ボタンだけのタイトルバーを自前で描画する。
ボタンの部分は WM_NCLBUTTON〜 でなんとかする。
元の項目は CreateWnd あたりをオーバーライドして DeleteMenu で消す。
delphiで六角大王(初期)のようなものを作ってみたいんですが
何を覚えればいいんでしょうか?
質問させていただきます。
KOLとか言う、容量を少なく出来るらしい奴を使ったんですが、
exptintf.dcuが見つからないと言われました。
どうしたらいいでしょうか?
>>391 ありがとうございます。
やっとpstringとpcharの違いがわかった気がします
再起動したら直りました。
ごめんなさい。
399 :
TWAIN:04/12/11 17:32:13
久しぶりに訳あってDELPHIを使用します。環境も古くてD3.1C/Sです。
内容的にはTWAINを自力で制御するソースをACTIVEX化したいと
思っています。
(鶴の一言によりImageKitのような市販品は今の所、使えません。
組み込みもPowerCobolに行うのでActiveX化が必要です。)
とりあえずTWAINソースは簡単なサンプルを作ったのですが
ACTIVEX化で詰まっています
TTimerや通信系のような、画面に出ないOCXを目標にしています。
新規作成−ACTIVEX−ACTIVEXコントロールで作ろうとすると
例えばTTimerがありません。
TTimerはウィンドウレスだから出てこないのかと思っていますが、
・このような場合どうやってACTIVEX化するのか
が1日ネットで泳ぎましたが分かりません。
最近のDELPHIでもACTIVEXコントロールの辺りは大差ないと
思うので、ちょっとしたポインタだけでもご存知でしたら教えてください。
今時ActiveXかよ
401 :
TWAIN:04/12/11 18:03:42
あ、いまどきは違うのですか。最近Cでハンディやってたもので。すいません。
他のコンパイラに機能を提供するのには今時はなにをつかうのですか。
dll
404 :
TWAIN:04/12/11 19:30:58
認識が間違っているかもしれませんが
dllだと1アプリでスキャナ2台使うケースまで考えると、
1アプリに対してのdllインスタンスは1つなので
dll呼び出し時にハンドルを使用者側で管理してもらう必要があります。
(本家本元のTWAINライブラリの都合上hwndが必要です
→DLLでCreateWindow発行
→使用者にハンドルを渡す)
OCXなら「使う分貼りつけて」になり、使用者側も分かりがいいかと。
総合的には今の所、ActiveXControlの方が利便性があると思っています。
TTimer系をActiveXにするポイントをご存知の方、よろしくお願いします。
実際のものもTComponentから派生する予定なのですが、TComponentだから
ActiveXに出来ないのでしょうか(その辺がわかっていません)
>>404 使用目的が限定されているなら、ActiveXなんて面倒なラップしないで普通にAPIなDLLで提供したほうが楽そうな気が。
てか、ActiveXは作るのが面倒。どのIDEでも同じだが、提供されるのは最低限の雛形生成。
クラス型のプロパティがあったりすると、そこはActiveX用にインターフェイスを定義してやらないとアクセスできんし。
メンテも大変だしね。
ひょっとしたら、どこかにサポートツールが在りそうなきがしないでもないが俺は知らん。
手動でインターフェイス書くなら間違いなくActiveXのほうが作業量が多いがそれでもやりますか?
もしかしてDelphi2005って最強?
Delphi2005Personalキボン
> Personal版予定(2005年春)
> 体験版提供予定(2005年01月)
410 :
デフォルトの名無しさん:04/12/12 09:47:53
TEditはPasswordCharに適当な文字を設定してしまうと、日本語入力や右クリック
メニューが使えなくなるようですけど、これを避ける方法があるのでしょうか?
無い。Windowsの仕様だから。
412 :
デフォルトの名無しさん:04/12/12 11:52:33
タスクトレイのアイコンを左クリックしてメニューを選んで実行、
という作業を自動化するアプリを作ろうとしています。
タスクトレイ全体のハンドルを取得することはできましたが、そこで詰まっています。
目的のアプリに対応するアイコンの場所かハンドルかを取得して
マウスクリックのメッセージを送る、という方法になるかと思っていますが、
具体的にはどのようにしたらよいでしょうか?
タスクトレイのウィンドウ構造はOS依存だから面倒
そう。そこにも書いてあるけど、トレイアイコンの部分は ToolbarWindow32 クラス
だったり、その親の TrayNotifyWnd クラスだったり SysPager があったりなかったり
全部のOSを動的に判断することはできるから、不可能ではないにしろめんどくさいね。
100万回の処理をするときに右下にカウンターを表示してどの程度進んだか
途中の結果が見たい。
それでTimerを使ってIntervalを1に設定して定期的に表示してるけど遅い
速い方法はありますか?
Thread使ってSynchronize
Repaintで強制描画。(XPだとInvalidateとかの場合負荷が高い時の遅延が大きい)
ま、あんまり拘らずに1秒間隔でも俺はいいと思うぞ。
420 :
デフォルトの名無しさん:04/12/12 22:17:30
JavaのHashMapクラスみたいなものはありますか?
THashedStringListしかない
memoにいくつかの数値を入力し、平均を求めるプログラムつくってるんですが
var
N,X:single;
I:integer;
Form1: TForm1;
N:= Memo1.Lines.Count;
X:= StrToFloat(Memo1.Lines[I]);
I:=0;
for I:= 0 to N-1 do
for文の制御変数波ローカル変数にするにはどうすればいですか?
関数にする。
>>422 変数をメソッドの中で宣言して下さい.
メソッド,関数,手続きの中で宣言した変数はローカル変数になります.
それ以外で宣言した変数はグローバル変数になります.
なんとなく変数I, N, XをForm1の下に宣言しているような気がするのですが,
ここに変数を置く必要はまずありません.(私は置いた記憶がありません)
平均値を求める処理はTForm1にメソッドを1つ作り,その中で行うと思いますが,
変数I, N, Xはこの中でしか使わないのでここで宣言すべきです.つまりローカル変数にすべきです.
426 :
デフォルトの名無しさん:04/12/13 12:20:15
配列にいれたデータをクリアにするにはどうしたらいいでしょうか?
For i:=0 to 255 do
begin
hairetu[i]:=0;
end;
とするしか方法はないでしょうか?
FillChar
>>426 FillChar(array, Length(array), #0);
1バイト配列とは限らないだろ・・・・
>>429 ?
多次元配列やレコード型の場合はsizeofだよね?
FillChar の第二パラメータはバイト数だろ。だから Length(array) じゃだめ。
Length(array)*SizeOf(要素の型) じゃないと。
procedure TForm1.Button1Click(Sender: TObject);
var
IntArray:array[0..4] of integer;
i:integer;
begin
for i := 0 to 4 do IntArray[i] := Random($FFFFFFF);
FillChar(IntArray,Length(IntArray),#0);
for i := 0 to 4 do Memo1.Lines.Add(IntToStr(IntArray[i]));
end;
は間違い。
procedure TForm1.Button1Click(Sender: TObject);
var
IntArray:array[0..4] of integer;
i:integer;
begin
for i := 0 to 4 do IntArray[i] := Random($FFFFFFF);
FillChar(IntArray,Length(IntArray):SizeOf(integer),#0);
for i := 0 to 4 do Memo1.Lines.Add(IntToStr(IntArray[i]));
end;
が正しい。
間違った
FillChar(IntArray,Length(IntArray)*SizeOf(integer),#0);
SizeOf(hairetu)でいいやん
おおそうか
>>433 > SizeOf(hairetu)でいいやん
これ動的配列ではダメだね。スマートポインタだからいっつも4になる。
procedure TForm1.Button1Click(Sender: TObject);
var
IntArray:array of integer;
i:integer;
begin
SetLength(IntArray,5);
Label1.Caption := IntTostr(SizeOf(IntArray));
for i := 0 to 4 do IntArray[i] := Random($FFFFFFF);
FillChar(IntArray[0],SizeOf(IntArray),#0);
for i := 0 to 4 do Memo1.Lines.Add(IntToStr(IntArray[i]));
end;
この場合も
FillChar(IntArray[0],Length(IntArray)*SizeOf(integer),#0);
ならOK
リストボックスでマウスポインタ下のアイテムを取得する方法はないのでしょうか?
OnMouseMove で ItemAtPos
438 :
TWAIN:04/12/13 14:58:25
>>405 あきらめてDLLにしました
ご意見ありがとうございます
バイナリファイルをピンポイントで書き換える方法ってないですかね?
書き換えたいのはほんの16バイト〜64バイトだけなのに
TFileStreamやTMemoryStreamとかだと上書き保存でも先頭から最後まで上書きしていくようなのです。
動画ファイルをいじるツールなので、ファイルサイズは当たり前にウン百MB・・。
ひたすら時間がかかってしまいます。
>>440 BlockWriteで良いんじゃない?
>>441-442 遅くなりましたが何とかうまくいきました。
ファイル型を使うのが初めてだったのとRecSizeとBlockWriteの書き込みサイズの関係に手間取ってました。
まさしく理想的な速さです。(本当に保存したのか不安になるぐらい)
ありがとうございました。
>>441さんの意図はTFileStreamのSeekメソッドのような気もしますが….
つまり,TFileStreamのSeekメソッドで書き換えたい位置に移動,
Writeメソッドで書き込み,最後にFreeメソッドでファイルを閉じる,
という感じで部分的に書き換えることができます.
445 :
デフォルトの名無しさん:04/12/14 01:42:50
ビルド時のユニットの検索で暗黙的にLibとImportsを見にいってるけどそれ以外のディレクトリを追加するのはどうやるの?
プロジェクトのディレクトリのデフォルト設定とかじゃなくて。
暗黙じゃなく、環境で設定されているのだけどね。
環境オプション ライブラリパス
例外処理について質問です
入力値チェック等複数の条件分岐が必要な場合は
if (条件) then
if (条件) then
if (条件) then
とif文をネストしていましたが例外処理を使って
try
if (条件) then raise Exception.Create('最初のif文)
if (条件) then raise Exception.Create('次のif文)
if (条件) then raise Exception.Create('最後のif文')
except
end
と書いても同じことになるのでしょうか?
同じだと思うよ
まあでもgotoの代わりに使うのは面白くないけどな
>>447のexcept〜end内にraiseが抜けてました
例外を生成してるのでこれだとメッセージが出ないですね
>>448 レスどうもです
条件分岐がたくさんある時はいちいちif文で分けないで
エラーだったらズバッと特定部分に飛ぶのはスマートだと思いますが
これは間違った認識なのでしょうか?
Del6 Perで制作したソフトって、自分のHPで配布したり
ベクターとかに登録してもいいんですか?
license.txtを読め。
GNUの宣言文なんかよりずっと読みやすい、
平易な文章だ。そして、自分で理解しろ。
そうしないと危険だ、わかるだろ?
レスありがとうございます。
読んでみました。
フリーソフトとしての配布なら問題ないって事ですよね?
そのはず
この板以外で2ちゃんねる用語使うの勘弁して欲しい。wikiとか
458 :
ウルトラ初心者:04/12/14 21:04:25
>>305を少し変えた
type
CharArray = array[0..2047] of Char;
procedure XorEncode(var Buf: CharArray; LS: Integer; PassWord: string);
var
i, j, LP, Blk, M: Integer;
begin
LP := Length(PassWord);
if LP = 0 then Exit;
Blk := LS div LP;
M := LS mod LP; //PassWord文字列の長さに満たない
for i := 0 to Blk - 1 do
for j := 0 to Plen - 1 do
Buf[i*LP+j] := Char( Ord(Buf[i*LP+j])
xor Ord(PassWord[j+1]) );
if M > 0 then
for i := 0 to M - 1 do
Buf[Blk*LP+i] := Char( Ord(Buf[Blk*LP+i])
xor Ord(PassWord[i+1]) );
end;
これは確かに文字列の復号化には失敗するのだけど次のようにファイルに対してはOK。
なんでじゃろ?
459 :
デフォルトの名無しさん:04/12/14 21:05:19
ReadF := TFileStream.Create(FileName, fmOpenRead or fmShareExclusive);
TmpName := ChangeFileExt(FileName, '.$$$');
try
WriteF := TFileStream.Create(TmpName, fmCreate or fmShareExclusive);
try
repeat
NumRead := ReadF.Read(Buf, SizeOf(Buf));
XorEncode(Buf, NumRead, PassWord);
WriteF.Write(Buf, NumRead);
until NumRead <> SizeOf(Buf);
finally
WriteF.Free;
end;
finally
ReadF.Free;
end;
if DeleteFile(FileName) then RenameFile(TmpName, FileName);
460 :
デフォルトの名無しさん:04/12/14 21:06:04
ReadF := TFileStream.Create(FileName, fmOpenRead or fmShareExclusive);
TmpName := ChangeFileExt(FileName, '.$$$');
try
WriteF := TFileStream.Create(TmpName, fmCreate or fmShareExclusive);
try
repeat
NumRead := ReadF.Read(Buf, SizeOf(Buf));
XorEncode(Buf, NumRead, PassWord); //Decodeもいっしょ
WriteF.Write(Buf, NumRead);
until NumRead <> SizeOf(Buf);
finally
WriteF.Free;
end;
finally
ReadF.Free;
end;
if DeleteFile(FileName) then RenameFile(TmpName, FileName);
どんなファイルでもOKみたいだ。
相変わらず腐ったインターフェースだな
そりゃ、そうだろ。文字列にしなけりゃ途中で切られることはないからね。
前のレスの内容どおりだろ。
procedure TForm1.Button1Click(Sender: TObject);
var
Fs: TFileStream;
Parser: TParser;
S: String;
begin
Memo1.Lines.Clear;
Fs := TFileStream.Create('D:\mydata\testdata.txt', fmOpenRead);
try
Parser := TParser.Create(Fs);
try
S := '';
while Parser.Token <> toEof do
begin
// '/' の前にある数値でなければ抽出する
if (Parser.TokenString <> '/') and (S <> '') then Memo1.Lines.Add(S);
// 現在のトークンが数値だったら保存する。
if Parser.Token = toInteger then S := Parser.TokenString
else S := '';
Parser.NextToken;
end;
finally
Parser.Free;
end;
finally
Fs.Free;
end;
end;
何がしたいんだ?
465 :
デフォルトの名無しさん:04/12/15 04:31:02
>>463 TParser ってヘルプにもない・・・とおもってぐぐったら出てきた出てきた!
そうかあ・・・こんなパーサーあったんだな。
こんな便利なものなんでヘルプに載せないのかな?
TStringGridでスクロールバーが移動した時に発生するイベントってありますか?
467 :
デフォルトの名無しさん:04/12/15 09:43:25
sageてしまったのげageさせてください
イベントはない
>>466-477 自己解決しますた
やりたいことはTStringGridのセルにTComboBoxをはめ込んで使用していますが
セルにTComboBoxが表示されている時にスクロールすると
セル表示されているColが全てTComboBoxになってしまいました
単にTComboBoxのOnExitイベント内でTComboBoxを非表示にすればいいだけでした
お騒がせしますた
やりたいことと質問の内容がずれてる
471 :
デフォルトの名無しさん:04/12/15 15:20:02
これからプログラムの勉強を始めようと思っています。
それで Delphi 2005 Professional を購入しようと思っているのですが、
動作環境に Windows XP Pro となっています。
私のはWindows XP Home なのですが、これでは使えないのでしょうか?
また、使えたとしても、なにか制限が生じるのでしょうか?
無料で本もいっぱいあるJavaやっとけ
>>471 D2005のトライアルで試せばいいと思うけど
トライアル最悪
>>471 予算は大丈夫か?新規購入はめっちゃ高いぞ。
usesには
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, FileCtrl, Grids;
こんなものが書いてありますけど、たとえばMathなどを使う必要もないのに書き加えても
動作上は問題ないのでしょうか?
mathなんかは使わなければリンクされないと
Delphi1の頃の塚越本には書いてあった希ガス。
今でもだいじょうぶなんじゃない。
Mathユニットの関数と同じ名前の関数とか作ったりしなければ。
>>477 モノによってはusesするだけでexeのサイズが肥大化するものもあるけど
動作上問題になるケースはまずないよ。
コードサイズが増えるかどうかはユニットの一番下の
initialization/finalizationにコードが記述されているかどうかを見て判断。
Mathは増えない。
ありがとうございました。
Image.Canvas.Pixelsとかが無茶苦茶遅いんだけどどうにかならないの?
高速かつリアルタイムに描画が反映される方法かコンポってない?
描画にPixels を使うやつの気が試練。
484 :
デフォルトの名無しさん:04/12/15 17:57:40
バイナリ<->テキスト(string)間の変換を行う標準の機能はありますか?
単純に暗号化したいというのなら、
それ用のコンポーネントか、アーカイバコンポーネント使ったら?
486 :
デフォルトの名無しさん:04/12/15 20:00:12
>>484 なにをしたいの。
String型でも文字コードの並んでいるものとして扱えばバイナリで処理できるけど。
この場合は、PCharにキャストしたほうがいい。
>>486 そういうことではなく
メモリ(バイナリ)イメージを表示可能なテキストに変換する
s := bin2str(myrecord, sizeof(myrecord)) //=> '12 fs df 00 00...'
str2bin(s, myotherrecord)
のような機能が標準であるかということです。
488 :
デフォルトの名無しさん:04/12/15 20:52:14
>>487 それなら、IntToHex 関数というのがある。
整数値を16進形式の文字列にして返してくれる。
標準でそういう機能があるかという質問なんですが。形式は16進等特定のものである必要もありません。
# 実装の仕方がわからないわけではありません。
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
標準で
何言ってんだこいつは
ライブラリが充実していないと何もできない、いつもの方です。放置推奨。
>>481 基本的には
>>483のとおり,PixelsではなくScanLineを使います.
ただ,イメージコンポ内部のビットマップ形式を変更する必要があります.以下,へたれサンプル投下.
(※うちはDelphi 5なのでそれでも動くようにImage1.Picture.Bitmapを参照しています.)
procedure TForm1.Button1Click(Sender: TObject);
var
x, y: integer;
r, g, b: byte;
pb: PByte;
begin
// 内部ビットマップの初期化
Image1.Picture.Bitmap.PixelFormat := pf24bit; // ←ハードウェアや画面モードに依存しない,かつ画素当たり24ビットの形式
Image1.Picture.Bitmap.Width := Image1.ClientWidth;
Image1.Picture.Bitmap.Height := Image1.ClientHeight;
// メインループ:1画素ずつ塗りつぶす
r := high(byte);
b := high(byte);
for y := 0 to pred(Image1.Picture.Bitmap.Height) do begin
g := high(byte);
pb := Image1.Picture.Bitmap.ScanLine[y]; // ←pbはラインyの左端の画素の1バイト目を指す
for x := 0 to pred(Image1.Picture.Bitmap.Width) do begin
pb^ := b;
inc(pb);
pb^ := g;
inc(pb);
pb^ := r;
inc(pb);
g := (g + 255) and 255;
end;
b := (b + 255) and 255;
end;
end;
495 :
デフォルトの名無しさん:04/12/15 22:44:55
496 :
デフォルトの名無しさん:04/12/15 22:46:43
delphi6を使っているのですけれども
ファイル名にUnicodeを使うにはAPIたたかないと駄目でしょうか?
IntToHexみたいにVCLで用意されてるのは、標準とは言わんのか
>>496 ウニコードはWideString型だから
StringToWideChar
とか使ってみれば?
でもファイル名にユニコードの意味がよく分からん。
そんなのOS側で処理してくれるでしょ
例えば日本語とハングルが混ざったファイル名とかですかね。
そういうファイルをAssignFileとかTFileStreamとかでは扱えないっぽいので。
TFileStreamはコンストラクタにハンドル渡せるからCreateFileWで得たハンドル渡せるかもね。
そういう抜け道以外でVCLでW対応したものってないんじゃないの。
やっぱそんな感じですか。そっちの方向でやることにします。
ありがとうです。
Tnt 使え。
殆ど対応している。
AnsiPosの右から検索バージョンってあるの?
ない
>>502 む。これはよさげですね。
いろいろいじってみます。
文字列を左右逆にして、AnsiPosで探すとか。
>>506 反転させるのはコストが高そう。
私なら頭から読んでいって、最後にでてきた位置を覚えておいて
その場所を返すようにするなぁ。
508 :
デフォルトの名無しさん :04/12/17 10:18:03
自分で作ったフレームを頻繁に使うのでコンポーネント化したいのですが、
できるのでしょうか?
>>508 出来ると思うけど、フレーム上のコンポーネントとか動かすのが
大変になるし、プロジェクト依存の変数とか使えなくなるよ。
>506-507
尻から順番に比較して、
ヒットしたらByteType関数で先頭がmbTrailByteでないか確認。
ベタに関数を書き下しても、引数チェックを除けばたったこれだけ。
Result := 0;
for i := Length(Text) - Length(Sub) + 1 downto 1 do
begin
if Text[i] = Sub[1] then
begin
f := False;
for j := 2 to Length(Sub) do
begin
f := (Text[i + j - 1] <> Sub[j]);
if f then Break;
end;
if not f and (ByteType(Text, i) <> mbTrailByte) then
begin
Result := i;
Break;
end;
end;
end;
511 :
デフォルトの名無しさん:04/12/17 11:28:15
>>509 そうなのですか・・・
たくさんのフレームを作成していて、そのうち1つだけ使用回数がえらい多いので
フレームコンポーネント選択→フレーム選択がとてもわずらわしいもので・・・
>>511 コンポーネント・テンプレートに登録すれば、
パレット上に表示できる。
フレーム変更時は、再登録しないと変更が反映されないけど。
>>512 ありがとうございます。
簡単なロジックのみのフレームなので、あまり変更は無いと思います。
>>512さんの方法で進めてみます。。
TUIWebBrowserってやっぱりDelphi6 Personalにはインストール出来ないのでしょうか?
SetLengthで長い文字列や動的配列の長さを確保した場合、処理が終わったらFinalizeで解放しないと
いけないのだろうか?
type
TMyRec = packedrecord
Dat1:SmallInt;
Dat2:Integer;
end;
TMyAry = array ofTMyRec;
procedureTForm1.Button3Click(Sender:TObject);
var
IDX:Integer;
FFile:TFileStream;
Dat:TMyAry;
begin
if not OpenDialog1.Execute thenExit;
FFile:= TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
IDX:= FFile.SizedivSizeOf(TMyRec);
SetLength(Dat,IDX);
try
FFile.Read(Dat[0],FFile.Size);
finally
FFile.Free;
Finalize(Dat); //これははたして必要か?
end;
end;
>>515 CreateならFree、NewならDispose、SetLengthならFinalize
やっぱり自分で作ったものは自分で面倒みなきゃ
>SetLengthならFinalize
こんなのあった?
いらん。コンパイラが暗黙で終了コードを生成してくれる。
CPUウィンドウ見れば答えがすぐ分かるよ。
>>516 知ったか死ね。
とかいうやりとりのどれを信用する?
俺なら死ねとかいう人は信用ならないので自分で調べる。
>>515 おそらく、ファイルやフォルダが削除出来なくて、
君は解放忘れじゃないかと疑ってるんじゃないか?
もしそうだとしたらら原因はOpenDialog1にあるよ。
>>518 String型、バリアント型を使用している場合は必要
お前も知ったか死ね
>>521 話が長くなりそうだから問題の起きるサンプルコードよろ。
そのコードを実行すると何が問題になるのか、どう修正するといいのかも説明して。
知ったかの521も system._DynArrayClear のコードでもトレースしてごらん。
>>521 逆だろ
ここ初心者スレだぜ?
ユーザー減らすようなマネやめないか?
そういうレスは、フサギコの相談室でやってくれ、頼む
Finalize(Dat); //SetLength(Dat, 0)でもいい
起動中に不必要なメモリを占領し続けないというなら必要だが
メモリリークについては心配無用!
>>516 の書き方がいかにも「知ったか」なのがカチンとくるな。たしかに。
間違ってるのが致命的だが。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
Del厨のレベル低下もここまできたか
*質問*を勇気を持って書き込むスレッドです。
欲しくもない代案を次々と出してくる人たちはどうですか?
質問自体がタコな場合は代案大いに結構
結構かどうかは質問者が判断することだろ。
バカじゃね。
>>533 代案厨乙
あるいは気がついてないのかもしれないけど
あんたの代案は誰の役にも立ってないよ。
FinalizeはFAQなわりに案外まとまったドキュメントがないんだな。
ShowMessage('(*´ω`*)モチツケ');
タコな質問者はいい代案でも理解できないのが多いから、回答しないで無視
半年まえから代案、代案って叫ぶ変なのがいついてるな。フサスレの病気なのと同じくらい不気味だな。
delphiを始めたんですが、とりあえず何かを作ろうと思い、
2chブラウザなら出来そうだと思ったんですが、作り方が
よく分かりません。
そこで相談ですが、どのように作れば良いか教えていただけないでしょうか?
「ぐぐれ!」というのは無しでお願いします。調べても分からなかったんで。
よろしくお願いいたします。
>>539 どうも、フサスレから荒らしが来てしまってるようだな…
>>540 いっぺんに作ると余裕で破綻するから
・板情報の入ったHTMLをダウンロードするサンプル
・HTMLを解析して板情報を抽出するサンプル
・板のURLを入力してスレ一覧を取得するサンプル
・スレのURLを入力してレス一覧を取得するサンプル
・レス一覧を取得して個々のレスにばらして表示するサンプル
をそれぞれ別のプロジェクトとして作成する。
で、サンプルの機能を一つのクラスにしてユニットにまとめる。
で、それをまとめてアプリケーションに組み込む。
こういう構成要素の多いアプリケーションを作る場合
単一の機能を下から一つずつ作っていくといいよ。
いきなりフォームにメニューおいてツリービューと
リストビューとブラウザコンポおいてと
進めるのはあまりお勧めできないよ。
janeとかのソースをダウンロードする
↓
理解不能。2chブラウザも大変なんだと気がつく
↓
もうちょっと役に立たない物から作ってみる
>>544 これだッ (*^ー゚)b グッジョブ!!
>もうちょっと役に立たない物から作ってみる
これが、楽しい内は大丈夫。
それに飽きる頃には、実力の無さを嘆くのみ_| ̄|○
>>516 の 「SetLengthならFinalize」は間違い。
これが知ったかと言える要因。
みんな間違って覚えるんじゃないぞ。
521は逃げたようですね。
プログラミングは実力ってあまり関係ない。
それよりも根性だ。
1日かけようと思っている時間を1ヶ月にすればもっといいものが出来る。
面倒だと思うところを面倒がらずにやる。
無限の労力をかければどんどんなんでも出来ていく。
できないことはない。
いかに時間を浪費させずにやるかは実力絡むかもな。
>>547 根性で、なんとかなれば苦労はしないよ・・・
最終的にはセンスや才能っていうのが大きいけど、
とりあえず禁止事項を理解しよう。
漏れは516でも546でもないが、まあ、とにかく、ヘルプの動的配列の
項目を見てみたのよ。 以下引用
>動的配列変数は暗黙にポインタであり,長い文字列型と同じ参照カウントの方法を使用して管理されます。
>動的配列の割り当てを解除するには,配列を参照する変数にnil を代入するか,Finalize に変数を渡します。
>配列がほかで参照されていなければ,これらの方法のどちらでも配列が破棄されます。
>動的配列は,参照カウントが0 まで下がった場合に,自動的にリリースされます。長さが0 である動的配列の値はnil です。
>動的配列変数に逆参照演算子(^)を使用してはいけません。
>また,動的配列変数をNew 手続きまたはDispose 手続きに渡してはいけません。
つまり、ほっといても動的配列ならガベコレが効くけど、明示的に割り当てを解除したけりゃ、
参照カウントを0にした上で、nilを入れるなりFinalizeなりする、ってことでいいんじゃないすかね。
で、参照カウントを0にできない状況でメモリ負担を減らしたければ、setlengthで要素数を0にすると。
ガベコレという言葉をここで使うことの是非は知らんけど。
ゲーム作成のためにDelphi+SDLで行こうとおもうんですが、
Delphi6はDLしたんですがSDLのダウンロードの仕方がわかりません。
それとDelphi+SDLでプログラミングしていくには、どういう手順を踏めばいいんでしょうか?
JEDI-SDLのインストールに書かれてることをすればいいんでしょうか?
それとも、下にある本家のサイトからSDLをDLするんでしょうか?
両方やって見りゃいいだろクズ
なんでやってみる前に質問するんだろうか?
そのうち、この単語でgoogleで検索すればいいのでしょうか?とか聞くのだろうか
555 :
デフォルトの名無しさん:04/12/18 22:55:16
Windows API のコールバック関数さんに
クラスのメソッドを渡すのは無理なのでしょうか?
C++のstaticメンバ関数のようにクラスメソッドにすれば
できるかと思ったのですがAccess Violationエラーがでてしまいます。
(もちろんクラスに入れないで使えばエラーがでてない)
WEB上で検索をかけてもそういうことやってるのは見当たらなかりませんでした。
できれば隠蔽したいのですが…無理なら無理って言ってください。
そのままだと無理。クラスメソッドでも無理。
詳しい説明は面倒なのでしない。
メソッドは隠れた引数(インスタンスのポインタ)が存在する。つまり型が全く違う。
>>555 無理。メソッドの引数リストには暗黙の引数 Self が含まれるから。
呼び出し元の API の lParam に対象となるオブジェクト (Self など) を渡して、
コールバックがそれを手がかりにメソッドを呼ぶようにしたらいい。
558 :
デフォルトの名無しさん:04/12/18 23:14:57
Delphi2005とVB2005とでどっちが優れてますか?
560 :
デフォルトの名無しさん:04/12/18 23:21:30
>>560 何で?
Delphiの方がいいと思うなら素直にDelphiって言えばいいじゃん。
何か言えない事情でもあるの?w
COBOL2005が最強です^^^^^;;;;;
普通のメソッドはSelfが渡されて
クラスメソッドはSelfじゃなくてクラス参照が渡される。
565 :
デフォルトの名無しさん:04/12/18 23:28:41
2005からDelphi始めた人っている?
やっぱ.NET使うならVS買うよな。
.NET使うくらいならJava使うよ
568 :
デフォルトの名無しさん:04/12/18 23:33:54
将来を担う初心者の方々の前ではDelphi2005の話題はタブーなんですね?w
558=561=568はニートまっしぐらで将来担うことはできないからな
Delphi2005へのJVCLのインストールを成功された方はおられませんか?
JVCLをインストールしようとしたのですが、
その前のJCLがインストールできないです。
1.93では、Delphi2005を認識してくれないようです。
571 :
デフォルトの名無しさん:04/12/19 00:38:50
Delphi2005はNGワードでよろ
これがDelphi自滅への道か
不機嫌なユーザ大杉
単に
var
Name: string[30];
と宣言した場合Nameは短い文字列になるのでしょうか?
>>575 ?
ヘルプにそう書いてあるだろ。
短い文字列にならなかったのか?
ごめん、正直全然分からないので教えてください。
リムーバブルディスクのハードウェア名からドライブを
取得したいんですが、どうしたらできるのかしら。
リムーバブルディスクを右クリック→プロパティ
でハードウェアタブで「なんたら USB Device」ってなってる
名前のことです。
なんか他にうまいやり方あるのかな。
ここら辺のプログラム組んだ事なくて、ダメダメなんです。
WinXP Del5Pro
せめてこのスレくらい検索しとけ。答えがあるとは限らないにしても。
>>578 答えられないなら黙っててください。
初心者相手にしか強い態度に出られないのって哀れですね。
578じゃないけど、このスレでちょっと前にドライブについてわだいになってるよ。
レジストリから取るのが一番確実らしい。さかのぼって見てみたら。
577は検索しなかった自分を反省することができないウジ虫
∫,,,,,,,,,∧,,∧
⊂,,,,,,,,,つ,,゚Д゚ミつ
前に話題になったのは
>でハードウェアタブで「なんたら USB Device」ってなってる
>名前のことです。
とは違うだろ....
吐駄と同じキャラはこのスレにはいらないってば。
Delphiに無関係な話題ですいません。
579は私じゃないですが、色々調べてみましたが、
まだ分かりません。もう少し調べてみます。
あmぁ、調べても分からなかったので聞いたワケですが。。
病人の仕業だったのか・・・
586 :
デフォルトの名無しさん:04/12/19 16:01:38
ヤフオクの出品ツールを作っているのですが、HTMLソースの取得で躓いています…
WebBrowserに表示したページのソースを取得したいのですが、
IndyのTIhttpを使ってもエラーが出て取得できないのです。
RichEdit1.Text:=idHTTP1.Get(WebBrowser1.LocationURL);
このようにコーディングしたのですが、普通のページ(Yahooのトップページ等)
は無事に取得できました。
しかし、MyAuctionのページ(
http://user.auctions.yahoo.co.jp/jp/show/mystatus)を
取得しようとすると、『HTTP1.0 302 Found』のエラーが表示され、取得することが
出来ません…
他の方法でも構いませんので、どなたかご教授頂けないでしょうか…
宜しくお願い致します。
>>586 302ってURLがリダイレクトされてるって言ってるんじゃないかい?
だからそのリダイレクト先のURLを収得してGetしないといけないと思う。
>>587 ご回答有難うございます!
早速リダイレクトに関して調べ、TWebBrowserのonNavigateComplete2イベントや
onDocumentCompleteイベントでURLを拾い、パブリック関数に入れて実行したのですが
現象変わらず…でした。
(URL自体に変化がありませんでした…)
しかし、リダイレクトと言うのは考えていませんでしたので、もう少し調べてみます。
本当に有難うございました。
OwnerDataを有効にした状態のListViewで
Itemのメモリを正しく解放するにはどうすれば良いのでしょうか?
例えば、ListView1のOwnerDataを有効にした上で
ListView1.Items.Add;
ListView1.Clear;
とするとMemCheckでリークが検出されてしまいます
OwnerDataなんだから自分でownしないと駄目。
TObjectListとかに自分でインスタンスを保持しといて
ListViewからデータのリクエストがあったらそのリストからインスタンスを渡し
最期にリストごとまとめて自分で解放する。
>>590 もしかしてOwnerDataが有効なListViewに項目を追加するにあたっては
Items.Addは不必要(というか、やっては駄目)でしょうか?
ListView項目追加にあたり、単にデータ保持用のインスタンスの項目と
Items.Countを調整してやるだけならリークしてない様なのです
スレを汚すようで申し訳ないのですが、結果報告をします。
色々調べたところ、IdHTTPの『HandleRedirects』をtrueに設定することによって
無事取得することが出来ました!
解決に導いていただいた
>>587さんに改めて御礼申し上げます。
>>591 Countに個数セットして
OnDataイベントでItem.Indexに対応するオブジェクトを文字列化する
Item.Caption := Format('Data:%d', [Item.Index]);
Itemsには触らない。
>>593 ありがとうございます
やっと仮想リストビューの使い方がわかりました
delphi5、win2000で
ci : tcursorinfo;
getcursorinfo(ci);
とすると正常に動作しないです。
delphi5でtcursorinfoのヘルプないけどコンパイルは通ります。
自分何か勘違いしてますでしょうか?
tcursorinfoの構造体が違うんじゃないかなと・・・
cbSize設定し忘れだろ。
ci.cbsize := sizeof(ci);
win32check(getcursorpos(ci));
サンクス
>>589 OwnerData=Trueの時はItems.Add, Insert を行ってはいけない。VCLのバグでリークが発生する。2005で修正されたかは確認できていない。
回避するには、Items.Countで要素数を変更するか、APIで追加を行う。
色々と調べていますが、まだ解決できていません。
そこで、質問を変えようと思います。
ドライブ名からハードウェア名を得るにはどのようにしたら
よいのでしょうか?よろしくお願いします。
Win32APIスレで聞きなよ。
勝手に作れ
>>601 水が沸騰する様子をビデオに撮ってメディアプレーヤーコントロールで再生しましょう。
冷却するときは逆方向に再生するのがお勧めです。
>>598 バグがなかった場合、OwnerDraw:=TrueでAddしたらどうなる(べきな)の?
2005のパスの設定がわからないんですがわかる人いますか?
日本語でもう一度
2005以外で保存したprojectを開こうとしてもエラーがでるです。
で、PATHの設定を弄れば良いのかとおもったわけです?
エラーの内容によるんじゃないかな。
本当にパスが問題なら、.NETの方とWin32の方で別口だから確認しなよ。
609 :
デフォルトの名無しさん:04/12/20 06:55:20
>>599 フォームにシェルコンボボックスを貼り付けて、ビジブルプロパティーをフォルスにする。
あとは、シェルコンボボックスのリストアイテム(文字列とグリフ)にアクセスして取得する。
怒るなよ。決してふざけて書いてるんじゃない。最善の策が取れなければ、次善の策で対応することも必要だ。
Del5にShellComboBoxがなかったので、ダウンロードして
使ってみました。いまいちできそうもない感じですが、
もうちょっと頑張ってみます。
申し訳ありませんが質問させて下さい。(D6 Personal)
2つのフォームを持つアプリケーションを制作しているのですが…
例えばこのような構成で、
Unit1→Form1
Unit2→Form2 Label1
Unit1において
Form2.Label1 := 'hogehoge';
は可能なのに
Form2.Visible := True;
ではEAccessViolationクラスの例外としてエラーになります。
どうすればUnit1からForm2のVisibleを制御できるのでしょうか?
Form2 を生成する前にアクセスしてるからだろ
>>612 プロジェクトオプションでフォーム自動作成にしてればuses節に
Form2のpasファイル名書けばアクセスできる。
動的に作成するなら
Form2 := TForm2.Create(Self);
try
Form2に対してアクセス
finally
Form2.Release;
end;
>613,614,616
616氏のやり方で出来ました。
どうもありがとうございます。
>>599 delphi getlogicaldrivesでぐぐって最初に出てくる日本語ページを見れ
計算プログラムを作ってて、コンパイルは通ったのに、実行したところ
「EInOutError クラスの例外を生成しました。'I/Oエラー(32)'」
とのメッセージが出てきました。
これはどういったことが原因で起こるエラーなのでしょうか?
説明
EInOutError 例外は,ファイルの入出力エラーが発生するたびに生成されます。
そういえば
Assignfile(dum_f,dum_path+'\'+ChangeFileExt(dum_fn,'.txt'));
ReWrite(dum_f);
こういうコードのところでエラーが起きていました。
再チェックしてみます。
ありがとうございました
ちゃんとCloseFileしてるか?
大学の先生が作られたプログラムを別の目的で動かすために組み替えてる途中です。
今までは正常に動いていたのですが、あれこれ書き換えていた最中にエラーが発生するようになりました。
なんとか
>>620にあるようなエラーはなくなったのですが、
今は浮動小数点演算などというエラーがでてきてトレース実行しながら点検中です。
浮動小数点演算に関するエラーは、0での割り算が行われていた場合に発生するエラーだったような気がするのですが、
どなたか教えてください。
信じてみます
>>624 移植前のソフトではどういう対処してたの?
私の知識じゃうまく説明できませんが、こんなことをやっています。
A:a.ループ計算 b.固定値
B:a.固定値 b.ループ計算(現在作成中のもの)
X:a.ループ計算 b.固定値
Y:a.固定値 b.ループ計算
XYはABの発展版で、すでにA、XYは完成しています。(私が作成したものではありません)
だからYを元にBを作っていけば簡単だろうと思って、
使われてる変数に注意しながらコピーペーストを繰り返していたところ
難問にぶつかってしまったというわけです。
>>629 そんな漠然とした情報出したって意味ないよ。
エラーの出る箇所を特定してそこにブレークポイントはって
再度実行して各変数の値に異常がないか調べて
異常な値があったらその値がどこでセットされたかを調べて突き止めたら修正。
を地道に繰り返すしかない。
基礎の文法、自分が計算したいことの背景原理、まずそれから
明日が期限です。
おっしゃるとおりにやってみます。
うまくいったら報告しにきます。
ありがとうございました。
>>632 浮動少数発生例外の種類知りたきゃ
try
浮動小数でなんたらかんたら〜
except
on EZeroDivide do ShowMessage('ゼロで除算しちゃった');
on EOverflow do ShowMessage('オーバーフローれす');
on EUnderflow do ShowMessage('アンダーフローれす');
on EInvalidOp do ShowMessage('無効な演算発生');
end;
て書けば例外の種類に応じたメッセージが表示される
統合開発環境だとあまり意味ないかな
すみません。例外処理についてなのですが。
Text := TStringList.Create;
try
try
Text.LoadFromFile(filename);
except
on EFOpenError do ShowMessage('エラー');
end;
finally
Text.Free;
end;
このようにやっても通常のEFOpenErrorが出てしまいます。
何が原因なのかさっぱり分からないのでアドバイスをお願いします。
filenameのパス文字列をどう生成しているか、
そもそもfilenameが存在しているか?のチェックも必要なんでないの?
ファイルを開くことはできています。
しかしプログラムが正しく動いているか確かめるために
わざとエラーを出させようとしたら、例外処理が働いていなかった
というわけです……。
補足しますと、上記のエラーだけでなく
同様の方法でEConvertErrorも捕捉できませんでした。
>>634 おかしいな?コピペして(全角空白は半角にしたけど)
動かしたらちゃんと「エラー」って出るよ。
↓コレやってみたらどうなる?デルファイに忠告もらうと思うけどw
procedure TForm1.Button1Click(Sender: TObject);
var text:TStringlist;
begin
try
Text := TStringList.Create;
try
Text.LoadFromFile('123');
except
on EFOpenError do ShowMessage('エラー');
end;
finally
Text.Free;
end;
end;
>>636 エラーを出させるというのは無効なファイル名を指定して
意図的にEFOpenError例外を発生させるということなのかな?
試しに下のコード書いたらこちらでは動いたけど
ファイル名は存在しない名前で例外を補足出来る
procedure TForm1.Button1Click(Sender: TObject);
var
Text: TStringList;
begin
Text := TStringList.Create;
try
try
Text.LoadFromFile('E:\Temp\aa.tx');
except
on EFOpenError do ShowMessage('エラー');
end;
finally
Text.Free;
end;
end;
IDEから実行してて、デバッガが例外を報告してるのを見て、
例外を補足できてないと勘違いしてるっつーパターンでないの
ダメなようです。
「ソースファイルが見つかりません」と出た後に「デバッガ例外が発生」となります。
ちなみにdelphi6 Personalです。
数日前に同じことを試したときはちゃんと動いた気がするんですが……。
640じゃないや。
トホホ。
お手を煩わせてしまって申し訳ありません……。
>数日前に同じことを試したときはちゃんと動いた
このときも同じ勘違いしてたのを思い出しましたorz
646 :
デフォルトの名無しさん:04/12/21 13:27:19
Del6のFileOpen標準アクションでファイルが選択されてOK押されたかどうかってどうやって判断するの?
単純にダイアログのexecuteを呼ばず、
if not(opendialog1.execute) then exit;
とかやる。
質問以外は超初心者禁止なんですけど
たしかに647の内容はひどい
ループ計算させてるつもりなんですけど、結果が以下のような感じで最終計算結果だけしかテキストファイルに
出力されません。
49.999996224 22.2169675652865 1.5
--------------------------------------------------------
本来なら
49.999996224 13.1789910114626 0.01
49.999996224 12.9951821606033 0.02
49.999996224 12.9626502250015 0.03
49.999996224 12.951383041687 0.04
49.999996224 12.946190205465 0.05
(右端の値について0.01*150でループ計算)
49.999996224 22.2169675652865 1.5
こんな感じで150個の値をテキストファイルに出力したいのですが、どのようにすればいいのでしょうか?
----------------------------------------------------------
for k :=1 to 150 do begin
temp_i0:=0.01*k ;
Rkg_setting.P_val[4]:=temp_i0;
if not RKG_Routine(RKG_setting,
dum_path,
dum_fn) then begin
ShowMessage('計算に失敗しました');
exit;
end; //----(if not文)----
StB_main.panels[0].Text := '出力中…';
Application.ProcessMessages;
if not RKG_ResultOut(dum_path,
dum_fn,
RKG_setting) then begin
ShowMessage('結果の出力に失敗しました');
exit;
end;
end;//----(for文)----
RKG_cal_flag := true;
RKG_show_result;
StB_main.panels[0].Text := '';
end;
RKG_ResultOutの中の問題だろ
他に思いつくような情報が見つかりません。
どうかアドバイスお願いします!
チェックしてみます!
ありがとうございました!
>>654 ファイルに書く時にAppendじゃなくてRewriteを使ってると見た
RKG_ResultOutの中でファイル作成-出力・閉じるまでやってて
150回同じファイル名で作って書き出してるような希ガス。
Assignfile(dum_f,dum_path+'\'+ChangeFileExt(dum_fn,'.log'));
ReWrite(dum_f);
Writeln(dum_f,'[実施日]');
Writeln(dum_f,FormatDateTime('yyyy"."mm"."dd',Now));
:
:
:
:
こんなものを見つけましたが、この残り時間で新しい技術にはとうていチャレンジできません!
RewriteをAppendにする。
すみませんが、それらしきコードをいっきにはりつけていきます。
めいわくでしょうが、どうかお許しください。
>>660 だから、RewriteをAppendにするだけ。それで解決。
Function RKG_Routine(dum_RKG_setting:TRKG_setting;
dum_path:String;
dum_fn:String):boolean;
var
i,j ,k,l :Integer;
dum_loop :Integer;
k_temp :array of Extended;
q_temp :array of Extended;
y_temp :array of Extended;
y_old :array of Extended;
x_temp :Extended;
dum_f :Textfile;
dum_s :String;
dum_dy :array of Extended;
dum_kk :integer;
dum_v :array of Extended;
dum_row :integer;
>>658 AssignFile(dum_f,dum_path+'\'+ChangeFileExt(dum_fn,'.log'));
if FileExists(dum_path+'\'+ChangeFileExt(dum_fn,'.log')) then
Append(fp)
else
Rewrite(fp);
try
Writelnなんたかかんたら
finally
CloseFile(dum_f);
end;
だいたい'.log'なんて名前つけてるのになんでRewriteで開くかなぁw
>>661さんの言われるとおりにやってみたのですが、問題が起きました。
確かに沢山の結果が出力されるようにはなったのですが、
このプログラムはメモ帳に設定条件が出力され、秀丸に計算結果が出力されるようなプログラムでした。
ここを変更したら、設定条件が沢山出てきてしまいました。
>>663さんの方法もためしてみたいのですが、頭が混乱しています!
666 :
デフォルトの名無しさん :04/12/21 17:43:14
パッケージの削除をしたいのですが、
削除されません。
[コンポーネント]-[パッケージのインストール]
→設計時パッケージより選択し「削除」
で削除されるはずが・・・なんででしょう;
ジオシティーズのHPを編集してるところです。
一度見ていただきたいのですが。
>>665 計算結果側のRewriteだけをAppendに汁。全部置換したんだろ?
予想される次の質問
今度は全部表示されたんですが、なぜか前回の計算結果まで表示されてしまいます!
釣りじゃなくて、本当に素人です!
//******自分で追加 と書いてある項目以外は、全て先生が作ったものです。
本当に結果が最終結果だけしか出力されずに困り果てています。
>このプログラムはメモ帳に設定条件が出力され、秀丸に計算結果が出力されるようなプログラムでした。
これはDelphiのプログラムとは関係ない話だよ。
プログラム自体は正常に動いてるんじゃないのか(Appendだけじゃ駄目だけど)。
メモ帳とか秀丸とか言われたってこっちは分からないよ。
話すならファイル名いいなよ。
>>672 見てみた。最終結果だけ出すプログラムだから、あたりまえじゃんw
パラメータだけ出力する手続きと結果出力する手続きに分けなきゃできんよ。
今から先生に怒られてきます(´・ω・`)
拡張子txtにメモ帳が、logに秀丸が割り振られてる、ってとこだな。きっとw
Appendのままにしていらない項目のWritelnをコメントアウトすれば
とりあえず目的は達成されるんじゃない?
先程はどうもです。
怒られはしましたが、ものの一瞬で修正個所を直してくれました。
if FileExists(dum_path+'\'+ChangeFileExt(dum_fn,'.txt')) then
Append(dum_f)
else begin
ReWrite(dum_f);
なんかこんな文章を加えることで動くようになりました。
その文の意味を理解しないと620は今後も同じ質問をすることになるな
それは663とどこが違うのか。
ちょっと自分で考えるようにしたら?
要領よくだけでやってけないよ。
ちなみに。DelphiでもFreePascalでもgpcでも、存在しないファイルに
Appendしてもファイルできるだけで例外になんないみたい。
そらそっちが便利だあね。いまどきこんな古い入出力使わないからいっか。
テキストファイルの内容をMemoコンポーネントへ加筆表示させる方法がわかりません。
処理の過程をMemoコンポーネントへ表示しているのですが
文字をMemoへ加筆表示するには
memo1.Lines.Add('処理1経過');
memo1.Lines.Add('処理2経過');
この後、テキストファイルの内容を加筆表示したいのですが
memo1.Lines.LoadFromFile('test.txt');
とするとMemo1に上書きされてしまい以前の表示が消えてしまいます。
レベルの低い質問で申し訳ありませんが,どなたかご教授お願い致します。
procedure TForm1.Button1Click(Sender: TObject);
var
sl:TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\Test.txt');
Memo1.Lines.Add(sl.Text);
finally
sl.Free;
end;
end;
>>682 ありがとうございます。
助かりました。
修行します。
卒論の季節だねえ
つーか、前任のソースくらいあらかじめよんどけや
>>680 >いまどきこんな古い入出力使わないからいっか。
これだからDel厨は・・・
どうなんだろう。
ファイル存在しないでAppendすると思いっきり例外発生するんだが
最近のDelphiは変ったのか?(Delphi7 Enterpriseでテスト)
FreePascalでも例外になるやん。ファイル作られるのはgpcだけだ。
689 :
デフォルトの名無しさん:04/12/22 15:28:19
D4からいきなりD2005に乗り換えて浦島太郎状態です。
VCLコンポーネント(TEditにちょっと手を加えた簡単なヤツ)の登録をしたいのですが、
HELPにある「コンポーネント>コンポーネントのインストール」というメニューに
行き着けず難渋しております。
(ウィザードに沿ってUnitが表示されるまでは行くが)
どなたかご教示願えませんでしょうか。
691 :
デフォルトの名無しさん:04/12/22 15:48:47
ありがとうございます > 690
要するに「dclusr」がないとウィザードで選択肢が出てこないようです。
助かりました。
ヘルプの不備がFAQになってるのか・・・・
>>693 配列(TList)の挿入削除の計算量がO(n)だから。
O(1)なデータ構造(リンクリストなど)を選択すれば高速化可能だけど
その場合配列のメリットは手放さなければならない。
>>694 Oの意味もカッコ内がなんなのかも、
配列のメリットがなんなのかも、
解決策も、
ぜんぜん通じてこないんですが、私嫌われてます?
>>695 一言で言うとTListの挿入削除は本質的に遅いのでどうにもならないってことだよ。
リンクリストを使うとで解決できるものの今度は
ランダムアクセス(list[3]のように添え字を使ったアクセス)が出来なくなるし
メモリ効率も悪くなる。だから万能な方法はない。
だから問題の性質に応じて一番ましな方法を選ぶ必要がある。
リンク先読めないんだけど何がしたいんだ?
リンク先は、私と同じようにTListが遅いと感じた人が
どのような解決を行っているかをググってみたら出てきただけで、
読んでもわかりませんでした。
ベクター構造とリスト構造があって、挿入と削除は遅いって書いてあるんだけど、
じゃぁ、挿入削除もしなきゃいけないけど、もうちょっと速くならないかって
思ってる同志が楽な方法見つけてないかな?と思って、
質問してみたけどよくわからないので来年あたりまた考えてみます。
最初からTlist.capacityは大きくとってる?
原理的には遅いけど、ポインタずらすだけだから実際的に遅いとは思わないけどね。
> 質問してみたけどよくわからないので来年あたりまた考えてみます。
考えて解決できるもんでもないけどね。原理的なものだし。ようは適材適所で選ぶしかない。って
>>696 と同じか
TList の挿入削除の速度が気になるって、だいたい実際の要素数が数万と数十万とかの場合なような
>>700 setはlist, vectorと保持する情報が等価じゃないし。
DeCalでは等価なの?
>>704 DeCalは「データ構造を非常に簡単に変更できる」というのが長所みたい
アルゴリズムの教科書でも買って読めよ
O(n)もわからんようでは、プログラム組めんと思うが
場合によるんじゃないの?
知らなくても普通に組めるだろ。
ただ、コンテナに対する操作のパフォーマンスの話がしたいなら知っておかないと駄目だろ。
話が長くなりすぎる。
O(1) データ数に関わらず一定の計算量
O(n) データ数に比例した計算量
O(n^2) データ数の二乗に比例した計算量
で、あってる?>識者
識者じゃないが合ってる。
手元の教科書にもそう書いてある。
ちなみにSetだとランダムアクセスできないよね確か。
Delphiのソース弄るのに特に相性のいいテキストエディタってない?
便利なマクロが一杯公開されてるようなの。
Delphi2005
リファクタリングも出来てうわなんだやめ
結局D4から2005への移行は見送り
その昔 Delphi2.0 時代のの TStringList では、1 万行を越えるような大きな文字列
をロード、もしくは追加しようとしたときに、極端に速度が低下したものだが、その後
修正されたのだろうか?
メモリ16MB時代の話だろ
>>711 テキストエディタって人によって使用感の好みがはっきりわかれてしまうから
あれだけどsakuraエディタとかでいいんじゃないの?
>>714-715 Delphi 3で修正されたようです.
ためしに文字列リストにランダムな文字列(長さ40〜80バイトランダム)を追加するベンチマークプログラムを作って調べてみました.
古いPC(MMX Pentium 200MHz RAM32MB Win95)では
Delphi 2.0でコンパイルしたものとDelphi 3やDelphi 5でコンパイルしたものとでは
0行から1万行に追加した場合に約5倍,2万行では約13倍の差が出ました.
新しいPC(Athlon 64 3000+ RAM512MB WinXP Pro)ではそれぞれ約4.5倍,6倍の差になりました.
(なお,Delphi 3ではCapacityプロパティが追加されましたが上記の結果はFalseのままです.)
Delphi 3とDelphi 5のClasses.pasを見るとCapacityを自分で設定しなくてもその数を
4→8→16→32→48→64→以後Capacityが足りなくなるたびに全体の4分の1を増やしているようです.
(Capacityを最初に設定した場合はさらにかなり速くなりましたので,
あらかじめ数がわかっている場合はやはり設定すべきようです)
手元のDelphi 2.0がスタンダード版なのでソースコードを見ることはできませんが,
もしかしたら単純に4個ずつとか最悪1個ずつという感じで増やしているのかもしれません.
>>717 サンクス!
俺はずっと気になってべあ氏のTLightStringsを使っていた。
DelphiのIDEのエディタって超使いにくいんですが、
外部エディタを使えるとか、せめてキーカスタマイズできないのですか?
Turbo Pascalの頃は使いやすかったのに。
>>720 ZoomInとZoomOutでRefreshしてるから。Refreshは一旦背景を消去する。
TMyScreenのControlStyleにcsOpaqueを含めて消去しないようにするか、Refreshの代わりにその自作のDrawでいいんでない?
>>721 おお、ありがとうです。
ついでに聞きたいのですけど Invalidate と Refresh の使い分けはどうしたらいいのでしょう?
ヘルプを見てもよくわからないし、ぐぐってもさっぱりです。
Delphi6personalなんですけどTShellListViewとTShellTreeViewをつかってエクスプローラみたいなの画面作ってるんですけど
TShellListViewの画面のファイルやフォルダをダブルクリックしたら独自の処理をしたいんです。
でOnDblClickにイベントハンドラ指定すると確かに独自の処理ができるけど、その後にファイルをダブルクリックしたら実行されるというエクスプローラと同じ処理が自動的になされてしまいます。この処理は余計なのでなくしたいんですけどどうすればいいのでしょうか。
ふつうのやつ使う
726 :
デフォルトの名無しさん:04/12/24 01:57:02
QuadrupleD3を使ってHeightMapを描きたいのですが
メッシュを動的に作成する方法、
頂点を操作する方法、
がわかりません。教えてください。
>>724 AutoNavigateプロパティをFalse
>>719 TPからそんなに変わってないと思うけど。具体的には?
TPは全てのコマンドのキーカスタマイズが出来たな
コマンドって・・・・
StatusBarコントロールでAutoHint=Trueの設定を有効にしたまま
OnHintイベントハンドラに書かれている処理を実行させる方法はないのでしょうか?
Delphi6 Personalです。
733 :
こまってます:04/12/25 16:39:02
質問があります。
Delphi7 Proを使っているのですけど、IDEから起動したプログラムを
終了した時に、デバッガで致命的なエラーが発生した事を示すエラー
メッセージが表示されてしまい再起動を促されるのですけど、どうす
れば解決できるでしょうか?
他の方でエラーメッセージとか表示された事のある人はいるでしょうか?
エラーメッセージが発生する条件は、コンパイラの”ヒント”が表示される
時のみです。例えば、以下のコードを実行して起動して終了した時など。
procedure TForm1.Button1Click(Sender: TObject);
var
B: Byte;
begin
end;
Delphi7はWindowsXP Home Sp1上にインストールしてます。
パッチは全部あててあるのか?
735 :
デフォルトの名無しさん:04/12/25 16:45:08
>>734 修正パッチは以下をあてています。
Delphi 7 - Indy ヘルプファイル・アップデート
VCL および RTL ヘルプファイル・アップデート
調べた所、まだこれだけしかないみたいですし。
複数のコントロール(Label)をループをかけて配列に格納したいんですけど、
コントロール名を変数で指定することは可能でしょうか。
lbl_0
lbl_1
lbl_2
とあるときに、0,1,2の部分を変数で管理するということです。
どうすればよいのでしょうか。
738 :
デフォルトの名無しさん:04/12/25 17:16:15
ありがとうございますorz
>>735 Delphi 7.1 update出てるよ
Delphi6を始めた者です。
ServerからClientにファイルを転送したいと思っています。
どのように書けばよろしいでしょうか。。
>>741 まさか「サンプルを提示しろ」ってことじゃないよね?
まずは地道な検索から。
>>742 ご返答ありがとうございます。
ClientからServerには送れたのですが(´・ω・`)
Delphiのネットワークプログラミングについて書かれている
オヌヌヌの本はありますでしょうか?
とりあえずは地道に検索してみます(`・ω・´)
はじめまして。
Delphi7を使っています。
XMLのパースをRelaxNGで行いたいのですがどうやるのでしょうか?
745 :
デフォルトの名無しさん:04/12/26 01:40:20
Delphi6(パーソナル)で、
variantのバイト数を取得したのですが、
どのようにしたら良いのでしょうか?
取得したのをどう使うのかまで面倒みろと?
>>745 そしたら次のステップとして Stringのバイト数の取得に挑戦しる。
748 :
745:04/12/26 01:52:28
すみません。誤植でした。
正>variantのバイト数を取得したいのですが、
誤「植」なのか
ラベルコントロールのOnMouseEnterやOnMouseLeaveのようなイベントを
ほかのコントロールでも実現させる方法ってありますか?Del6です。
>>745 VarToStrと、Lengthを検索しる
752 :
デフォルトの名無しさん:04/12/26 08:02:47
>>750 とりあえず、OnMouseMoveでやってみたら。
コントロールの上にマウスポインタがあると発生する。
あるいは、ウインドウメッセージをハンドルする。
文字列置換のための StringReplace って便利なんだけど、処理がやたら遅い(Delphi5)。
たとえば 'Delphi' という文字列を1万個含む1MB程度のテキストで、 'Delphi'を
'Borland' に置換するとちょっと古いマシン(Pentium 800MHz)では4分くらいかかる。
検索に AnsiPos を使ってるのが原因だと思うのだが、最近のDelphiでは少しは早くなっ
たのかな?
うーん、文字列の置換がどう行われるかを想像できれば遅さは納得の範囲なんですけどね
>>753 そういうのをどう解決するのかがプログラムの醍醐味なわけよ
そうそう。がんばれば1桁速くできそうだね、それ。
まず検索関数から
//高速版 AnsiStrPos
function AnsiStrPosEx(StrStart, StrEnd, SubStrStart, SubStrEnd: PChar): PChar;
var
p, ps: PChar;
SL : Integer;
begin
p := StrStart;
SL := SubStrEnd-SubStrStart;
Result := Nil;
while p < StrEnd do
begin
ps := SubStrStart;
while ps^ = p^ do
begin
Inc(p); Inc(ps);
if ps^ = #0 then
begin
Dec(p,SL);
Result := p;
Exit;
end;
end;
if p^ in [#$81..#$9F, #$E0..#$FC] then Inc(p);
Inc(p);
end;
Result := Nil;
end;
function ReplaceStr(const S, FindStr, RepStr: string; UpLow: Boolean): string;
var
PosList : TList;
DestIndex : Integer;
i,Count : Integer;
p, e, ps, pe: PChar;
zs, zo: String;
begin
zs := S; zo := FindStr;
if UpLow then //大・小文字を区別しない
begin
zs := AnsiLowerCase(zs);
zo := AnsiLowerCase(zo);
end;
Result := S;
if FindStr = '' then Exit;
PosList := TList.Create;
try
p := PChar(zs);
e := p + Length(S);
ps := PChar(zo);
pe := ps + Length(FindStr);
while p < e do
begin //ソース文字列のどの位置に置換すべき文字列があるかをリストに保持
p := AnsiStrPosEx(p, e, ps, pe);
if p = nil then Break;
PosList.Add(p-PChar(zs)+PChar(S));
Inc(p, Length(FindStr));
end;
if PosList.Count = 0 then Exit;
//置換後の文字列長さを計算し、バッファ領域を確保
SetString(Result, nil, Length(S) +
(Length(RepStr) - Length(FindStr)) * PosList.Count);
p := PChar(S); //p を文字列の先頭に戻す
DestIndex := 1;
//位置リストを見ながらソースからバッファへMove。もちろん置
//換すべきところでは、置換すべき文字列をMove。
for i := 0 to PosList.Count - 1 do
begin
Count := PChar(PosList[i]) - p;
Move(p^, Result[DestIndex], Count);
Inc(p, Count);
Inc(DestIndex, Count);
Move(RepStr[1], Result[DestIndex], Length(RepStr));
Inc(p, Length(FindStr));
Inc(DestIndex, Length(RepStr));
end;
e := PChar(S) + Length(S);
Move(p^, Result[DestIndex], e - p);
finally
PosList.Free;
end;
end;
いいねいいね、そんな感じ。置換すべき文字列の位置を一括して求め、置換後の長さを
計算し、メモリを確保してコピーすると、最少回のコピーで複数置換が出来るよね。
デルフィ2005でEXEファイルを作る方法を教えてください。
AnsiPosのPChar版のAnsiStrPosがあるからそれ使え。
それから大量の文字列を処理するのが分かってるなら
汎用性は欠けるけど拡張可能な自前のバッファ確保してそこに書き込めばよし。
汎用性を持たせるにしてもわざわざリスト持って長さ算出してなんて
オーバーヘッドでか過ぎ。
妄想終わり。
確かに妄想だな
拡張を多数回やるから文字列の挿入が遅いのに
>>757 からのはオーバヘッドないよ。 汎用性も十分
リスト生成廃棄のオーバーヘッドがあるだろ。
特に検索個数が0, 1がメインの場合無駄が大きい。
なんにしても計らなきゃ分からない。
レベルの低い質問です。ごめんなさい。
MemoとRichEditの違いについて
Memoコンポーネントにテキストを入れ表示したものに対し、
マウスの第一ボタンで範囲をドラックし範囲指定し第二ボタンでコピーはできるのですが、
Memoの変わりにRichEditを使用すると、第一ボタンでは同じように範囲指定できるのですが、
第二ボタンでのコピー、カットが出来ません。
同じように使うことは出来ないのでしょうか。
どなたか、ご助言お願いいたします。
>>758の置換が早いのは
>>760が指摘している理由もあるが何より
>>757の
検索関数の仕様(テキストの途中から途中までの範囲で検索でき、かつ
テキストの長さを測るなどという処理を行わない)が優れていることが
大きい。俺は大いに感銘を受けた。
>>7621=764の言っていることは
>>763が指摘したとおり。
それにしてもくだすれでこんな質の高いコードを目にするとは!
アップしてくれた人、ありがとう。
767 :
デフォルトの名無しさん:04/12/26 13:21:57
strings をGetTextによってstringに変換して、
そのstringを、もう一度stringsに戻すにはどうすればいいでしょうか?
(改行コードを含むstringからstringsの作成と考えていただいてもよいです。)
768 :
デフォルトの名無しさん:04/12/26 14:02:55
ORACLEテーブルのBLOB型列データをoo4oで読み込みたいのですが、
サンプルがあるURLまたは具体例などを教えて頂けないでしょうか?
>>767 ?
TStrings.Textにいれてやるんじゃ不満なのか?
770 :
768:04/12/26 14:32:31
すみません、自己レスです。
とりあえず、サンプルが見つかりました。
晒せよ
>>762 Delphi 5のSysUtils.pasを見るとAnsiPos関数はStrAnsiPos関数を呼び出していますよ.
>>765 メモコンポの右クリックで出てくるポップアップメニューと完全に同じにする方法はわからないのですが
とりあえずコピーとカットができればよいのでしたら…
・TPopupMenuコンポを新たに1個置く.
・リッチエディットコンポのPopupMenuプロパティにそのコンポを割り当てる
・TActionListコンポを1個置く(すでに置いてあればそれを使っても良い).
・それをダブルクリックしてアクション一覧ウィンドウを出す.
・[Shift]+[Insert]を押して『標準アクション』ウィンドウを出す
(または[Insert]キーがなかったら▼をクリックして『標準アクションの新規追加』をクリック)
・分類が『編集』になっている項目をすべて選んでOKをクリック
・さっきおいたTPopupMenuコンポをダブルクリックしてメニューデザイナを出す
・空のメニュー項目が選択状態になっていると思うので,オブジェクトインスペクタでActionプロパティにEditCopy1を割り当てる
・空のメニュー項目が増えているのでそれをクリックで選び,オブジェクトインスペクタでActionプロパティにEditCut1を割り当てる
・同様にほかのアクションも追加
765です。
773さん、ご丁寧にありがとうございます。
メモ帳をやっと作れるようになった初心者です。
スキルアップの為に簡単なプログラムを作りたいのですが、
何がお勧めのものはないでしょうか?
ちなみにdelphi6パーソナルを使っています。
よろしくお願いします。
>>775 頻繁使いそうなところで圧縮、解凍ソフト
>>776 ありがとうございます。がんばって作ってみようと思います。
DelWikiのTipにある"フォームやコントロールの状態を保存・復旧するには"ですが
複数のFormでも一つの設定ファイルに書き込み&読み込みする方法、何かよいやり方はあるのでしょうか?
>>775 メモ帳って確か文字列の置換もできないし上方向の検索もできなかったんじゃ
なかったっけ?
だから圧縮、解凍ソフトもいいけど、メモ帳の機能を強化してもいいのでは。
>>775 webやメール系の文章を扱うのなら、複数の文字コードのテキストの
読み込み・変換ってのを付けるってのも良いかも。
自分で組んでもそんなに難しくはないけど、nkf.dllを使えばより簡単だし
外部dllの使い方が分かって、いろいろなdllを利用できるようにもなるから、
非常に有益だと思う。
>>778 ただのストリームだから追加していけばいいんじゃないの。
ただし先頭のフォームは新規でファイルを作り、
読み書きするのは常に決まった順番でないといけない。
例えばForm3を開くからForm3だけロードは難しい。
あの、低級な質問なんですが
EXEのアイコンってDelphi2005で作れるのでしょうか?
作れたらどうやって作るのか教えてください。
ツール|イメージエディタ
フリーウェアのがよっぽど使いやすいが。
オイラはEdgeで作ってる
プログラム内で実行マシンのプライベートIPを取得したいのですが、どうしたら良いのでしょうか?
>>787 LANにぶらさがってるマシンに割り当てられるプライベートIPを取得したいという意味だったのですが
ClientSocketを貼ればできるような気がしてきました、ありがとうございます
冬休み暇なので無料版でブラウザを作ってるのですが
標準で使うブラウザ情報ってレジストリのどこにあるのですか?
できたらレジストリからデータの取得方法も教えてください
>789
HKEY_CLASSES_ROOTのhtmlfileとhttpとhttps
TRegistryのRootKeyを設定して、OpenKeyでキーを開いて、ReadStringで値を読む。
接続中にServerでClientのIPを取得したいのですが、どうすれば良いでしょうか。
>>791 TIdUDPServerならOnUDPReadイベントで渡されるABinding.PeerIPで取れるが
他は試したことがないのでわからない。
何度もすいません
var
Reg: TRegIniFile;
begin
Reg := TRegIniFile.Create('HKEY_CLASSES_ROOT\htmlfile\shell\open\');
try
ShowMessage(Reg.ReadString('command', '', ''));
finally
Reg.Free;
end;
end;
こんな感じでやってみたのですが何も出力されません
regeditで見てみて、(標準)というところに格納されているのですが、どうやって取り出すのでしょうか?
ScrollBoxにImageを貼り付けImageのAutoSizeをTrueにすればスクロールバーでは画像を動かすことが
できますが、このとき画像をマウスでつまんで(^^;)動かすにはどうしたらいいのでしょう? 次のよ
うにやってみたのですが全然ダメでした。
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft Then Image1.BeginDrag(False);
end;
procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source is TImage then
begin
Accept:=True;
Image1.Left:=X; Image1.Top:=Y;
end;
end;
procedure TForm1.ScrollBox1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin
Image1.Left:=X; Image1.Top:=Y;
end;
>>795 Image1.DrugMode = dmAutoMaticにしてないのではないかという気もするが。
それ以上に気になるのが、スクロールバーのPositionプロパティに値を代入していないことなんだが。
これだと、スクロールボックスの中で、イメージ1がスクロールバーに関係なく動いてしまうんじゃないか。
ああ! そうだと思って以下のようにしたのですが結果は同じです。
しかし、ScrollBox1.DrugMode = dmAutoMaticにすれば時々動きますが変な動きをします(^^;)。
こういう場合(ScrollBoxがImageのParent)はドラッグしたいのはImageなので
ScrollBox1.DrugMode = dmManual
でいいと思うのですけど・・・・。
procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source is TImage then
begin
Accept:=True;
Image1.Left := X;
Image1.Top := Y;
ScrollBox1.HorzScrollBar.Position := -X;
ScrollBox1.VertScrollBar.Position := -Y;
end;
end;
>>795 はるか昔に、delphi-MLで同じような質問を見た記憶がある。
「猫の手スクロール」等のキーワードでMLを漁ってみてそ。
ドラグ関係なし。
ドッキングやメニューをOfficeXP風にしたいのですが、そのようなコンポーネントはないでしょうか?
>>801 それを参考に
private
FDownFlg :Boolean;
FPosX :Integer;
FPosY :Integer;
procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDownFlg := True;
FPosX := X; FPosY := Y;
end;
procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDownFlg := False;
end;
procedure TForm1.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if FDownFlg then
begin
ScrollBox1.HorzScrollBar.Position := X-FPosX;
ScrollBox1.VertScrollBar.Position := Y-FPosY;
end;
end;
としましたが、だめでした(;_;)。
804 :
デフォルトの名無しさん:04/12/28 11:14:41
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FPosX := X;
FPosY := Y;
end;
procedure TForm1.Image1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
(Sender As TControl).Enabled := False;
end;
procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
(Sender As TControl).Enabled := True;
end;
procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := True;
(Source As TControl).Left := X - FPosX;
(Source As TControl).Top := Y - FPosY;
end;
では何とか動きました。ただマウスの位置によっってはImage1MouseDownしただけで
(つまりドラッグしていないのに)そのマウスの位置にImage1のLeft、Topが移動し
ます。
>>803 OnMouseMove で FPosX と FPosY を更新してないね
Image の上で操作したいのになぜ ScrollBox のマウスイベントを使うのか謎
あと変化分だけスクロールするなら
ScrollBox1.HorzScrollBar.Position := X-FPosX;
じゃなくて
ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position + X-FPosX;
のような
行番号を表示するやり方教えてください・・
標準では無理なんじゃないの。そういうアドインがあると言うのも聞いたことないし。
>>792 なるほど。ありがとうございます。
当方6Personalなのですが_っぽいですか。
2005CDの焼き直し版来たぞ
配列プロパティで、レコードの読み書きをする場合、
ゲッターは値渡しになるのでしょうか?
だとしたら、アクセスに無駄があると思うのですが、
かと言って、プロパティでポインタを返すのも変ですよね?
>>809 6PerでもIndyをインストールすれば良いはず。
インストールしたとして、TIdUDPServerでいいかどうかはおまいさんの作りたいソフト次第。
他のコンポについてはわからないから、偉い人降臨きぼん。
Indyで指定したURLがリンク切れ(Not Foundとか)になってないかどうか調べたいのですが、
どうしていいのか見当も付きません。
なにか良い方法はありませんか?
まさにそれでした。ありがとうございます!
バイナリを弄るツールを作りたいのですがどのようにソースを打ったらいいのでしょうか?
バージョンは2005です
Delphi2005なのですがポップアップで「致命的なエラーです。」と出てブラクラ状態になりました。
助けてください
820 :
デフォルトの名無しさん:04/12/29 09:03:15
>>819 それじゃ答えようがない。
どんなコンポーネットが配置しあって、どういう状態でポップアップメニューを出すとエラーになるのか。
フォーム上はどこでもエラーになるのか、特定のコンポーネントの上なのか。
どのユニットのどのメソッドでエラーになっているのか。
(多くはInterface部でUsesしているユニットでエラーが出ていると思う。存在しないオブジェクトをたたいていることが多い)
このへんを上げたら、何か反応が返ってくるかも。
あとブラクラ状態って何だ?
>>820 アプリを作っている途中で一回コンパイルに失敗してから終了させたらこういうエラーがでて閉じても閉じても閉じられませんでした。
ちなみにほかのときは大丈夫でした。
で、最終的には再起動して終了させました
var
MS: TMemoryStream;
s: string;
begin
MS := nil;
try
MS := TMemoryStream.Create;
s := 'ほげほげ';
MS.Write(s, Length(s));
MS.SaveToFile('c:\ほげほげ.txt');
finally
MS.Free;
end;
end;
といったような事をやると、保存したファイルが文字化けしたような状態になってしまうのですが
ちゃんと保存する方法はないのでしょうか?
普通ならTStringListあたりを使うんだと思うのですが、改行コードが自動的にCRLEになってしまうのでいやなんです。
MS.Write(s[0], Length(s));
じゃなかったっけ?
>>821 配置したコンポーネントを参照するコードを書いて、その後仕様変更でコンポーネント削除して、コードはそのままなんじゃないか?
D2005 使うなよ・・・・・
どこがいいの?
D7 よりバグがいっぱいで楽しい
>>811 『Object Pascal言語ガイド』より(Delphi 4版ですが)―――
・静的配列型,レコード型,集合型の関数結果の場合,値が1バイトを占有する場合はALに,値
が2バイトを占有するときにはAXに,値が4バイトを占有する場合はEAXに結果が返される。そ
の他の場合は,宣言されたパラメータのあとに関数に渡される追加のvarパラメータに結果が返さ
れる。
―――ということでレコード型では値渡しにはならないようですが,
1レコード全体の内容をコピーすることには変わりなく,
それによるオーバーヘッドが無くなるわけではないので
大きなレコードを大量に処理するような場合は影響が出るかもしれません.
一方,レコード型の値をポインタで渡すことは変ではないと思います.
私のつたない経験ではむしろレコード型のポインタ型にする方が使いやすいと思います.
なぜならレコードの一部だけを変更する処理がシンプルになるからです.
レコード型ならこんな感じ:
Rec := NantokaObj.Records[i];
Rec.FamilyName := 'Sato';
NantokaObj.Records[i] := Rec;
ポインタならこんな感じ:
NantokaObj.Records[i]^.FamilyName := 'Sato';
※ポインタの場合でもレコード全体をコピーする場合は以下のようにそれぞれ1行で書けます.
NantokaObj.Records[i]^ := Rec;
Rec := NantokaObj.Records[i]^;
>>791 TIdTCPServerならピアスレッドのConnection.Socket.Binding.PeerIPで取れるようです.
特定クライアントとの接続に関するイベントハンドラ(OnServerConnectなど)では
パラメータAThreadがそのピアスレッドですからここから参照できます.
接続中に一覧を取得したい場合はThreadsプロパティにピアスレッドのリストが入っているのでこれを使います.
var theList: TThreadList; ClientIP: string;
theList := IdTCPServer.Threads.LockList;
try
// 接続している各クライアントについて…
for i := 0 to pred(theList.Count) do
begin
theThread := TIdPeerThread(theList[i]);
ClientIP := theThread.Connection.Socket.Binding.PeerIP;
// ※処理※
end;
finally
IdTCPServer.Threads.UnlockList;
end;
たびたび質問すみません。
>>814さんに教えて頂いたResponseCodeをさっそく試してみたのですが、
URLの指定の仕方がまったくわかりません。
どうやって指定すればいいのでしょうか?
>>833 Get なり Head なりのメソッドでリクエストかけれ
状態を知りたいだけなら Head か
headに404なアドレスを渡すとエラーが発生してしまうのですが、
これは
try
IdHTTP.head('
http://tyometyome.com/');
except
end.
のようにスルーしちゃっていいものなんでしょうか?
>>830 詳細なご解説本当にありがとうございました。
Delphiでは、なるべく直感的なプログラミングを心掛けていましたが
この場合は、ポインタを使ったほうがよりスマートになりそうですね。
>>836 それは813がやりたいこと次第だな。
言語例外はライブラリが「あえて」起こすもので、単なるエラーとは違う。
どう処理するかはプログラマーがやりたい事に即して決めるものだ。
839 :
デフォルトの名無しさん:04/12/29 21:34:34
del4,5,6,7のプロ版のうち、どれか一つ友人からもらうことになりました。
どれがおすすめですか?
一応、自分のマシンは400MHZ,256MBのAMDK6-2マシンです。
使用目的は、Delphi言語の学習&フリーウエアの制作(夢)です。
友人は6,7のうちどちらかを手元に残して置きたいそうなので、
4,5あたりをもらおうかと思うのですがどうでしょう?
……。
6のPersonalで十分だろ
842 :
839:04/12/29 21:45:08
>>841 いや、その友人はプロ版しかもっていないので
パーソ版をくれとはいえないのです。
通報しますた。
845 :
デフォルトの名無しさん:04/12/29 22:17:10
>>839 ずばり6。
5でも悪くはないが、6にでは、一部のイベントが拡張されている(TlabelのOnMouseEnterなど)。
7は、重いし、6とあまり変わってない。仕様許諾で、個人情報をもっていかれるのが気色悪い。
だからDel7は登録せずとも使えると何度言えば・・・
>>839 釣られているかと思うが、マジレスするとさ、
その友人は多分、アップグレード版で各バージョンを
揃えているはずだからさ、アップグレードした前のバージョンを
人にあげるのは、ライセンス違反だから気をつけなよ。
Borlandはかなりライセンスについてはケチなので。
いや、839とその友人の人格が融合して一人になれば全バージョン使い放題だよ。
6はPersonal版のおかげで一番多く出回っているし開発実績も多いと言ってみる。
> 使用目的は、Delphi言語の学習&フリーウエアの制作(夢)です。
6per でいいじゃん。ライセンスもオッケーだし。
>>849 Delphiでぐぐると
>Borland - Delphi 6 Personal Download
がトップ項目に出てくるしな・・・
某にとっていいこととも思えないが。
母集団が大きくなるメリットとタダで配布のデメリット
どちらが得かは非常に微妙なところだ
853 :
デフォルトの名無しさん:04/12/29 23:05:32
per落として浮いた金で書籍買うわけでもなし
単に潰した暇をドブに捨ててるだけだから日本全体の損失だよ。
そんな暇があったら働いて彼女作って子供作って収入を力の限り消費しなさい。
>>838さん、レスthxです。
例外処理は「もうだめぽ」というよりは「注意」程度のものとして考えてもいいんでしょうか
てっきりもうなにもできないからプログラム死ぬのを待つもんだと思ってました。
やっぱりエラートラップ仕掛ける事にします。ありがとうございました。
まっ、これからDelphiやり始めることが果たしていいことなのかどうかは微妙。
オレだったらC#をすすめるが
end; な
>>855さん
そんな感じでやってみる事にします。
取得できないときにResponseCodeを使うことにしました。
C#は意外と難しいからC++のように挫折する可能性あり
Delphiより簡単、入門本も山ほどあるし
ヘルプも充実してるしね
>>839 DVDに全部焼けばいいじゃないか。
それよりも、本気でやるならもう少しPCいいもの使ったほうがいいいよ。
メディアの話ではないんだが・・・・
>>866 だまりなさい いぬちくしょうめ
おまえに しゃべる けんりなど ないのです
わんわん
ついに でるふぁい を てにいれたぞ
→そう、かんけいないね
ゆずってくれ!たのむ!
ころしてでも、うばいとる
>>869 はC#を挫折したのか? アフォばればれだな
938 :デフォルトの名無しさん :04/12/30 09:06:54
今年、ちょと気になったこと。
GDN掲示板でDel>>>C#乗り換え厨らしい人をたくさん見たこと。
>>869 みたいに沈みかけた船から乗り換えられない人もいるんだな
ミ,,゚Д゚彡フサギコのフサフサDelphi談話室だけじゃ檻足りないのかな。
冬休みに突入するといろんなことがある。
ClientSocketとServerSocketでListBox全体を送受信するにはどうすればいいんでしょうか(^^;)
>>876 プロトコルを決めれば自ずと結果は導き出されるだろ・・・
馬鹿は無理してレス付けなくていいよ。
部屋の掃除でも指定なさい。
SendText,ReceiveBuf(ClientReadイベントで処理) を使う
ただしSTX,ETX(crlf)等の区切りを意識して送受信
ListBox1.Items.Textをバイナリで送るとか
>>802 Toolbar2000とTBXを使ってみたいんだけど、ライセンスがよくわからん…。
フリーウェアなの?
>>883 Toolbar2000のregisterのところに
Registration is required if you use Toolbar2000 in any applications that you or your organization are profiting from (e.g., commercial or shareware).
とあるけど、これってフリーウェアなら登録は必要ありませんってことじゃないんですか?
ありがとうございました。
タスクバーのアプリケーションウィンドウを右クリックしたときに出るメニューを
編集するにはどうしたらよいのですか?
タスクバーのウィンドウ?
GetSystemMenu(
AppendMenu(
とかを使う。
>>888 うげ、ちらっと調べてみたけどこんなにめんどくさい方法しかないの?
MainMenuとかみたいにメニューデザイナで編集したりはできない?
専用コンポがある
名前忘れたけど
PopupMenu指定するだけのやつ
>>890 いくつかのコンポーネントがみつかりました。
ひとつずつソースを見ながら試してみようと思います。
いろいろありがとうございました。
うーむ、コンポをつくるヤツ、それないと何にも出来ないヤツ、いろいろだな
>>891 名前おせーて
>>892 万人が下水道這いずり回ったりバキュームカー運転したりする
低レベル作業員である必要はないからな
低脳重役ばっか
>>894 そうだね。それがDelphiのいいところでもあるんだよ。実装を一切知らずにコンポ
探し回ってなんとかアプリの形を整える。で、バージョンアップなどでコンポが使えな
くなったりすると青ざめる。そんなのの繰り返し。だから他へ移れない。
低レベル作業員が一番賢そうだな・・・・
897 :
デフォルトの名無しさん:04/12/30 23:21:59
D2005で初めてC#に触れてみましたがDelphiみたいな感じですね。
VS.NETに移行しても問題ないかなぁって思いました。w
いままでなにが問題だったの?
899 :
デフォルトの名無しさん:04/12/30 23:33:09
C#がDelphiみたいと言ってる奴は全く理解できていない証拠。
Delの機能と対応している部分しか見ていない。
C#+.NETFWははるかに高機能で複雑だよ。
それを理解した上でなおDelphiを選択する奴は
よっぽど開発・実行環境が劣悪なんだろうな。あるいはおつむが。
900 :
デフォルトの名無しさん:04/12/30 23:35:15
>>899 もちろん対応している部分を見て言ってるんだがw
そりゃ対応してる部分はDelphiみたいだろうな。対応してるんだから。バカだなぁ。
>>899 よかったらその高機能な点を教えてください。
Win32アプリだったらDelphiが現時点で
最強のツールであることに依存はないと思うけど
乗り換えるような魅力はあるのですか?
C# は言語としては簡単だよ。
>>899 が言ってるのは .NET のライブラリの部分。VCL より巨大な迷路だと言えるね。
べつに Delphi.Win32 と機能がかぶってるわけじゃないら使い分ければいいだろ
> 乗り換えるような魅力はあるのですか?
乗り換える必要はない。ただ、平行してやっておく価値はある、と断言できるよ。
905 :
デフォルトの名無しさん:04/12/30 23:44:16
C#が簡単で理解したつもりになってるアホ一匹
>>902 > よかったらその高機能な点を教えてください。
そんなのMSDNへいって.NET のレファレンス見てご覧。かなり VCL に似てるけど
それより遥かに広範囲高機能だとすぐに分かるよ
>>905 みたいなのは言語の文法とライブラリを混同してる可能性大
スレ違いの話題みたいで申し訳ないのですが
>>904 C#に価値が見出せないのですが
Javaより優れている点はありますか?
結局はWindows環境でしか使われない予感・・
>>906 もっと端的に説明できませんか?
戸田君みたいなレスは要りません
CLIの知識がすっぽり抜け落ちてるアホ一匹
>>908-909 >それは言語の話じゃないよね?
そう。言語のはなしじゃない。.NET の CLR の話。C# は独自のライブラリをほとんど
持ってなくて、全面的に CLR に依存している。だから .NET 専用の言語といえるだろう。
で、
>>908 はMSDNへ行ってみるくらいの自助努力をしたの? 一目瞭然だけど。
>>911 あなたが
>>899と同一人物かどうかはわかりませんがそうだと仮定します。
少なくとも
>>899を見るとC#についてかなりの理解があると思います。
だけど「端的に教えて」と尋ねたら「MSDN見ろプゲラ」
としか言えないようなら口だけ番長を証明してるようなものですよ
>>912 いや、百聞は一見に如かずだからね。真面目に答えたいけど、真面目な質問なら
ほんとに行ってみなよ。ただ、アンチのためだけに煽ってるんじゃないんだけど。
> 口だけ番長を証明してるようなものですよ
それはそうかもね。きみは単なる教えて君であることを証明してるけどね。
試しに VCL のすばらしさは端的に答えてご覧。MSDN には載ってないし。
ちなみに
>>899 とは別人。
>>899 のどこがC#についてかなり理解があると思うの?
∧,,∧
ミ,,゚Д゚彡
ミ つ旦)~~
〜と,,,~),,~)
赤の他人のしかも
くだすれDelでC#をえらそうにもちあげるような人間の
具体性に乏しい発言を立証するために
"自助努力"という名目で補ってあげるほどに
できた人間を漏れは見たことないし
これからもみることはないと思うのだが。
>>914 へんなヤツだね。
Delphi2005 は Delphi.Win32 と Delphi.NET と C# の統合開発環境だろ。
Delスレで C# の質問が出て、真面目に答えてどうしてそんなこと言われなきゃならないの?
>>913 まだシロートなのでつい教えて君になってしまいますスイマセン
>試しに VCL のすばらしさは端的に答えてご覧。
VCLというかペタペタコンポーネント貼るだけで簡単にWin32アプリが作れる
Delphiという開発環境はとても凄いと思います。勿論限界もありますが。
VCLの素晴らしさとは何かと辞書的に聞かれても答えられるほど理解がありません。
>
>>899 のどこがC#についてかなり理解があると思うの?
何か偉そうな口調で語っていたのでかなりでなくともそれなりに
理解はありそうだと思いましたので
> VCLというかペタペタコンポーネント貼るだけで簡単にWin32アプリが作れる
それはVCLというより、IDEとの協調作業に依っている。VC# や Delphi2005 の C# や Delphi.NET
でもほとんど同じですよ。Windows.Forms アプリの場合は使われるライブラリが
違っているだけで。Win32 アプリはつくれませんけど。だから、乗り換えるんじゃなくて
使い分け。
最近は談話室からあふれ出たMSマンセー軍団がここにも進出しているのか?
>>918 なるほど、使い分けですか
当面はWin32のDelphiでいいけど
MicrosoftがWin32を見捨てて.Net環境に全面移行する可能性もあるので
そうなったらC#が必要になる。だったら今から準備してもいいってことですね
だから自分が使いやすいと思う開発環境を使えばすむ話。
というか、それ以外に決着のつけようがない。
この議論で「○○の方がいろいろ優れてて使いやすいんだ〜」って結論が出ても
「俺は××の方が気に入ってるからそれを使う。個人的なことに意見を言われる筋合いはない」で終わりなんだから。
好みの話はしていないだろ
∫,,,,,,,,,∧,,∧
⊂,,,,,,,,,つ,,゚Д゚ミつ
"自分が使いやすいと思う開発環境"
の定義を構築、修正したいから
議論や情報をやりとりする意味はとてもあるよ。
ただ、結論はその人の思考に大きく左右される
ことも多いのでなかなか結論が出ない、状態にはなる
んだろうけど。
結論は出す必要はないし、出せないだろ。
あっちに高い山があるんだけど、面白そうだから登ってみないか。っていう話。
山があることも、あるいは、あることは知っていてもその高さを知らないかも
知れないから、ちょっと地図でも見てご覧っていう程度。
∫,,,,,,,,,∧,,∧
⊂,,,,,,,,,つ,,゚Д゚ミつ
砂漠で目玉がどうたら、という比喩は
なんのことを指しているのか漏れにはわからなくて
語呂もきれいくないので好きではないんだが、、、
.NETがそれを使うだけで
VCLに対して断然優れていたとしたら
D8はその存在だけでユーザーに許容されていただろうし
D2005であえてWin32を呼び戻したり
BCB(Win32のみと思われ)を存続させる必要は全くないんだが...
そもそも、DelphiIDEをWinFormで書けばいいのに
某もVCLorVCL.NETで構築しちゃっているわけで....
某の失敗は言語にあるんじゃなくてその実装にある。
D8 は Delphi.NET オンリーでしょ。.NET をやるのに言語として Delphi を
選ぶ理由はないと思うし、Delユーザもそのことをよく知っているのでは。
何遍もいうけど .NET アプリの開発環境と Win32 の開発環境は機能として重複して
ないのだから、両方やってもなんの矛盾もないと思う
おい、何でココで議論してんだよ
スレ違いだ、どっか他でやれよ
そうだね、スマソ
特定BBSに書き込むプログラムの書き方を1から教えてください。
環境 Delphi2005
OS WinXP pro sp2
です。よろしくお願いします
>>930 多分ネタだと思うけどマジだったら死ね
>>931 まじです。作りがのっているHPがないのでわかりません。
どなたか教えてください
>>933 マジにしては人を馬鹿にした内容だな
まあIndy内のHTML関連のコンポーネント使ってGetメソッドとか使ってみれば
Indyってどこにありますか?
超初心者です
そもそも用途が荒らしっぽいから
>>934 すいません、文章が下手なので
>>936 荒らし目的じゃないです。簡単に投稿できるようにしたいだけです。
>>938 9.0.17 Source code distributionのzipをDLして解凍しました。このあとどうしたらいいですか?
∫,,,,,,,,,∧,,∧ こことかやろか…
⊂,,,,,,,,,つ,,゚Д゚ミつ
>>939さん
Wininet Programing
http://www.geocities.jp/wininet_dll_jp/page15.html WinInet.DLLを使う方法ですが。
∫,,,,,,,,,∧,,∧ Indyインストールを
⊂,,,,,,,,,つ,,゚Д゚ミつ さらっとググってみました。
どぞー
Delphi TIPS/Indyのインストール - dev.chu.jp :
http://dev.chu.jp/index.php?Delphi%20TIPS%2FIndy%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB ギコナビのビルド方法 :
http://deuxdeux.hp.infoseek.co.jp/gikobuild.html
>>941 ありです!参考になります。
少しは自分でがんばってみようと思います。
>>942 >少しは自分でがんばってみようと思います。
この一言を書けるお前ならきっと出来る、頑張れ、
DelphiにIIF関数ってないですか?(もしくは代わりになる関数)
煽りとかじゃなくてあったら便利なのにと思って
>>945 DelphiにはIIFや三項演算に相当するものがない
引数の型ごとに関数を作ってオーバーロードするとか
後はVariant型でまとめて処理するとかぐらい
>>945-946 たしかD6からだけど
IfThen
ってのがあるよ。
三項演算子じゃないから、ATrue/AFalseに
関数が渡されると、どちらも呼び出されちゃうけど。
Delphi6 Professionalなんですけど、
DBGridで行を移動したのを拾うにはどうしたらいいんでしょうか?
マウスで移動した場合はOnCellClickが使えそうですが、
カーソルキーの上下で移動した場合がわかりません。
ずっとム版の過去スレを彷徨っていたら。
「くだすれ」とは
どんなに「くだ」らない質問でも、誰かが優しくレスをしてくれる「すれ」っど
by 毛の生えたブリーフ(別名:毛の生えたフサギコ 別名:40歳だけど〜青年です)
であることを突き止めた。
2005のinlineでIfThen書いたらショートサーキット有効になるかな
953 :
デフォルトの名無しさん:04/12/31 10:35:04
C#って、 世界共通語として考案されたがほとんど使用されていない幻のエスペラント語みたいだよね。
954 :
デフォルトの名無しさん:04/12/31 12:14:00
>>950 Onkeydownイベントで、キー入力をトラップして、調べるのはどう。
>>953 あれただの文字セットだよ
同じく人工的に作られたハングルはうまく使われてるようだけどね