くだすれDelphi(超初心者用)その17

このエントリーをはてなブックマークに追加
超馬鹿な質問でスマソ。

BasicでOSは作れる?
すまぬ。スレ違いだった
VB.NETなら作れます
文字列を大文字小文字分けて、昇順・降順にソートするのってどうするのん?
336332:04/08/13 19:15
そうかそうか。レスあんがと。
TStringList.Sort
>>337
ありがと。馬鹿みたいな勘違いしてた。
ライブラリ依存なのにブビでOS作れる訳ないだろ。
340デフォルトの名無しさん:04/08/13 21:17
ライブラリ依存なCは?
341デフォルトの名無しさん:04/08/13 21:19
OS作るなら、アセンブラだろ。
342デフォルトの名無しさん:04/08/13 21:20
とうとう殺したらしいよ!
http://bbs2.orange-e.net/?id=123456
>>339
Java OSを知らないの?
半透明の文字を表示する簡単な方法ってありません?
やはり、アルファ・ブレンドとかを使う必要があります?
>>344
GDI+とかDirectXとか言ってみるテスト
「半透明の文字」だけが目的なら逆に繁雑だよな…
>>345
DirectXはちょっとやりたくないんで、GDI+の資料をみたんですが、
なんかフォントの指定方法とか、かなり変わってますね。
自分のプログラムではLogFont構造体なんかをいろんな個所で
直接処理してるんで、全面的に変更が必要になってくるみたい。

やっぱり、別のキャンバスに一度描画して、目的のキャンバスに
自前でブレンドするしかないのかな。。。
347デフォルトの名無しさん:04/08/14 00:17
となると、VB.NETが最適だな
コンポ使え。
マジに初心者で申し訳ないんですが
Tmemoに1行に1000文字ぐらい読み込ませると
wordwrapをfalseにしてても勝手に折り返されちゃんだけど
何とかどうにか折り返させない方法を 教えてエロイ人 お願い 泣きそう
>>343
ソースさらしてくれ
>>349
EDIT コントロールの仕様
泣き寝入りか自作しかない
>>349
richeditじゃダメな理由はあるのかな?
>>351
そうなんでつか。。。自作なんてスキルは全然ないっす つД`)・゚・。・゚゚・*:.。..。.:*・゚
ありがとうございました。

>>352
ちょっとやってみます。 ありがとうございました。

ダメだったらそんなに複雑なことやってないんで1000に行かないような設計をちょっと立て直してみまつ。

皆様回答ありがとうございました
ファイルを選ぶようにダイアログを使って
使用者にフォルダを選ばせるにはどうすればよいでしょうか?

今はOpenDialogを使ってファイルを選ばせ
ExtractFileDir(OpenDialog.FileName)を使って収得してるんですが
これだとフォルダ内にファイルがないと選択できない

よろしくお願いします
SelectD(ry
356353:04/08/14 02:25
リッチテキストキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

解決しますた つД`)・゚・。・゚゚・*:.。..。.:*・゚
ほんとに泣けたっす

>>352さんサンクス!!ついに解決しますた!感謝感謝です ほえー これで寝れまつ
>>354
ヘルプの「キーワード」へ>>355
358デフォルトの名無しさん:04/08/14 08:07
Delphi6 Personalを使って、ギコナビ・プロジェクトのメンバーになろうと
思ったのですが、パッチ類が落ちてこない・・・。

どうすればいいですか?
諦める。
360デフォルトの名無しさん:04/08/14 08:10
>>359
絶対にあきらめたくないんですが・・・。
>>358
ここで聞くようなことじゃないだろ。サイトの管理者に何とかしてもらえ。
362デフォルトの名無しさん:04/08/14 08:42
>>361
ボーランドにメールしました。 m(_ _)m
入れ子構造で延々と計算している時に中断ボタンで中断するようにしたいのですが
計算中はボタンが反応してくれません。どうすれば裏で計算しながらボタンを反応
させられるのでしょうか?
>>355 >>357
ありがとうございました
でもまた問題発生です

SelectDirectoryでルートフォルダを指定すると
ルートフォルダより上が表示されないのですが
仕様ですか?

もし仕様なら
最初のディレクトリをマイコンピュータ(どのドライブにもアクセスできる)にするには
どうすれば良いでしょうか?

Delphi6 Personal です
>>363
マルチスレッドにすれ
>>363
Application.ProcessMessages
368A:04/08/14 14:47
>>364
ルートフォルダ、ってのは、一番上のフォルダだから、その上が表示されないのは当然の仕様。

 dir := 'D:\Delphi6\';
 SelectDirectory('ディレクトリ選択','',dir);

こんなかんじで、予め、3っつめの引数に値を入れておくと、デフォルトの選択になるっぽい。
369A:04/08/14 15:04
>>368
スマソ、読み間違えてた。 マイコンピューターの取得方法は、>367 にあるとおり。
別に、普通に全部にアクセス可能(ルートをルート)に設定するだけなら、
空文字を入れとけば、いいらしい。
Indyによくバグが多いと聞きますが具体的にはどういったものが多いのでしょうか。
また、そういった情報にアクセスできる場所はどこでしょうか。
>366
無事に反応するようになりました。おめでとうございます。
言い間違えました。ありがとうございました。
>>371
ありがとうございます。
早速読ませていただきます。
>>373
このやろう、ワラタ
377デフォルトの名無しさん:04/08/14 17:47
質問があります。

大文字小文字を区別せずに指定した文字列の位置を検索したいのですけど、
Posで以下のようにしても、大文字と小文字を区別できず0になるのですが、
pos('CD', 'aあcdef') //0 (4の結果がほしい)
大文字と小文字を区別なく検索できるPos版みたいなことを実現する
何かライブラリでもあるでしょうか?
378デフォルトの名無しさん:04/08/14 17:48
>>377
'aあcdef'の中の小文字を全部大文字にしてから検査すれば?
AnsiIndexText?

それはちがう
AnsiPos('CD', UpperCase('ry
Upper
procedure TForm1.Button1Click(Sender: TObject);
var
 Data, S: string;
begin
 Data := Memo1.Text; //検索データ
 S := Edit1.Text; //検索文字列

 //チェックで区別なし
 if CheckBox1.Checked then
 begin
  Data := UpperCase(Data);
  S := UpperCase(S);
 end;

 if AnsiPos(S, Data) > 0 then
  ShowMessage('(・∀・)アッタ!!');
 else
  ShowMessage('(・A・)ナカッタ!!');
end;
384デフォルトの名無しさん:04/08/14 18:10
Delphi6 Personalのパッチを入手できるサイト教えてください。
お願いします。
Borland
386デフォルトの名無しさん:04/08/14 18:13
>>385
朝から暇を見つけては、DLやってるんですけど
無理なんですよ(泣)
どこかありませんか?
ギコナビ・プロジェクト・チームに入りたい・・・。
迷惑そうだな
>>386
http://www.borland.co.jp/download/delphi.html
ここから
【対象アプリケーション】にDelphi 6 Personalまたは、Delphi6が入っているもの
をダウンロードする。
他にパッチを置いてるとこなんてあるの?
>>387
どういう意味ですか?(w
僕が入ったら、ソフトの品質が飛躍的に向上しますよ。
>>391
(´д`)へー

ところで回線は?
切れやすいんかな。100%落としたように見えて、半分くらいしかファイルできてなかった。
DLソフト使いたまへ
>>392
フレッツADSLの8Mです。
プロバイダはOCNです。
ファイヤーウォールソフトもアンインストールしたのに・・・。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
>>394
>>388のサイトでリンク先クリックするとどうなるんだ?
>>396
> Internet Explorer では、ftp.vorland.co.jp - delphi6update2.exe をダウンロードできません。

> サーバーが拡張情報を返しました

しばらくしてから、こんなmsgboxを表示します。。。
DLソフト使ってみたら?
>>398
久しぶりにイリアさんでやってみます。
イリアさんでも無理っぽいですね。
ショックです。
>>397
> Internet Explorer では、ftp.vorland.co.jp - delphi6update2.exe をダウンロードできません。
漏れは何も問題なくダウンロードできるぞ?
FFFTPでもftp.borland.co.jpへanonymousでログイン、ダウンロードできるよ?

つーか、vorland.co.jpがここだけのtypoであることを祈る。
ftp://ftp.borland.co.jp/pub/delphi/delphi6update2.exe
普通にダウンロードできるな
30秒もかからん。
ルータだろ、ルータ
404DLできない人:04/08/14 19:41
AirH"で試したらいけました。orz

>>403
ルータの場合、どうすればいいのでしょうか。
405DLできない人:04/08/14 19:49
>>401 さんのやり方で、PASVモードにしたらいけました。
実は、朝、Borlandに苦情のメールだしたんですよね。 orz
謝りのメールだしときます。。。
苦情って…
まずは自分の環境疑えよ
407DLできない人:04/08/14 19:56
教えていただいた方々、ありがとうございました。 m(_ _)m

プロジェクト・チームに入れるように、精進します(笑)
パッチのDLも満足にできないやつが
ギコナビ・プロジェクト・チームに入るのか?
改悪だけはするのなよ…
409DLできない人:04/08/14 21:00
次はインストール・キーが入手できない・・・orz
なんか、エラーメッセージが表示されます。
どうしたら、いいんでしょうか。
410ギコナビ使い:04/08/14 21:06
(;´A`)ギコナビの将来が激しく心配だ…
>>409
藻前はがんばった!よくやったよ!
もう寝ろ。
おめでとうございました。
413DLできない人:04/08/14 21:24
また、あした、がんばります!
番長のLL、俺のかとオモタ
ちょー誤爆


   な   ん   だ   こ   の   流   れ   !!



↓ 以下何事もなく質問どうぞ ↓
Delphi6 Personalのインストールキーを入手できなくて困っています。
方法を教えてください。
>>417
Spamguardを設定しないにしお
>>343
ソースはどこ?教えて。
>>418
それってどこでするんですか?
>>417
状況がわからな過ぎるので詳しく書け>DLできない人
>>421
なんかエラーが出ます。
423DLできない人:04/08/14 22:09
>>421
なんでばれたんですか(w

http://register.borland.co.jp/regist/delphipersonal/delphipersonal.dll/
にいって、アカウントの作成で、メールアドレスを入れて
アカウントの新規登録ボタンを押すと、

> Internal Application Error
> 内部アプリケーションエラー
> Unable to complete network request to host "202.33.253.164". Error writing data to the connection. 既存の接続はリモート ホストに強制的に切断されました。

がでるんです(泣)
424デフォルトの名無しさん:04/08/14 22:18
Delphi Personalを落としてから、スパムがものすごく来るようになったんですが、
某の個人情報の扱いって一体どうなってるんでしょうか?
425DLできない人:04/08/14 22:21
Personalがでたとき、インストールしたことあるんですけど
なにも問題なかったのに・・・。
>>424
俺登録して半年以上たつけどまったく来ないよ
>>423
ブラウザは何使ってる?
428DLできない人:04/08/14 22:29
>>427
インターネットエクスプローラ6です。
ルータは使ってるんですけど、関係ないですよね。
あと、ネットスケープ7.1でもやってみたんですが
同じでした。
なんでだ〜(泣)
質問です

Editにag+oau a+garh ta+ehah oeu+hapuhのような任意の文字列がある場合で
     ↑   ↑
のような半角の+のみを全角の+にする方法(他の文字列は半角のまま)がわからなくて困っています
何か良い方法はないものでしょうか?
StringReplace
[rfreplaceall]
AssigenFileなどのファイル関数とTStringListで同じ処理ができるとき
どちらの方を用いるべきなのでしょうか?
速さやメモリ使用量などはどうなのでしょうか?
教えてエロイ人 ヽ(`Д´)ノ
前者は一行読み込み込んで処理して読み捨てる
後者は全体を読み込んで全体を処理できる
前者のやり方で済むならその方が高速省メモリ
後者の方が扱いは簡単
434デフォルトの名無しさん:04/08/15 10:11
この中に、今、Delphi6のインストールキーを入手できる人いますか?
何回やってもダメなんです(涙)
あきらめろ
ルータやFWの問題じゃないのか?
そこらへん全部取っ払ってやってみたら
437デフォルトの名無しさん:04/08/15 10:43
>>436
ソースの糞パーソナルファイアウォールのせいかとも思ったんですが
ファイアウォール切って、AirH”でやっても無理でした。
きっと、サイトがあぼーんしてるんでしょうね。
そう思って日を改めたいと思います。

はあ、、、、、VBから卒業できない。。。
>>437 頑張れ!日本の未来は君にかかっている
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
>>437
それは君の運命だ。素直に受け入れよう。
441DLできない人:04/08/15 11:43
_/\_   ▲  _/\_
\   / ▼■▼ \   /
 |/\|   ▼▼   |/\|
┃             ヽ
┃   ヽ     /    │    |\
┃●  ヽ―-―/  ●  │    | )   寝るぞ、ハゲども!おやすみーw
┃    ヽ   /      │   ●
┃      ヽ/      /
┃            (
┃ / ̄ ̄ ̄ ̄    |
┃│           ノ
┃ \____   ノ
┃           |
┃           |
┃ (人)       |
┃      |   |
┃       ヽ__/
AssignFileで関連付けたファイルを
Resetで開いた時に
I/O エラー(32)が出た場合
特別な処理をしたいのですが
この場合はどうすれば良いでしょうか?
>>442
例外処理が有効な時はtry〜exceptを書く、そうじゃなければIOResultをチェック
try
 Delphi.Abone;
except
 on EDelphiDied do
  C#.BuyAndInstall;
end;
コンパイルエラー: 不正な記号(#)
コンパイルエラー: C#厨はイッテヨシ
447デフォルトの名無しさん:04/08/15 22:44
Delphi9タノシミー!
448デフォルトの名無しさん:04/08/15 22:59
C言語で言うところの__LINE__とか__FILE__みたいなのは、Delphiではどうなってるのでしょうか?
449デフォルトの名無しさん:04/08/15 23:00
>>448
同じ
450デフォルトの名無しさん:04/08/15 23:02
C#.DownLoadAndInstall; で十分。
>>449
Del6ではダメなのですが
>>448
デバッグ目的ならAssertで充分と思うが、何がしたいのですか?
Cの_LINE_とかってプリプロセッサでは?
Assertのダサい使いかただな
{$IFDEF DEBUG}try Assert(False) except on e:EAssertionFailed do OutputDebugString(PChar(e.Message) + 18); end;{$ENDIF}

プリプロセッサ欲しい
System.AssertErrorProcを乗っ取って、例外を起こさずに引数を記録するだけの関数に置き換えたら

var __LINE__ : Integer;

Assert(False); //この時点で記録される
OutputDebugString( ... __LINE_ ... );

のような書き方もできないでもない。
プリプロセッサがあるとコンパイル速度に影響するだろうからいらない。
コンパイラ式のアプリにコンパイル速度云々って・・・
ん?確かに完成品は変わらないだろうけど、F9押した時に1秒待つのと2秒待つのはだいぶ違う気がするが…
どうでもいい
459DLできない人:04/08/16 14:21
インストール・キー、ゲットできましたよ!
これで、ギコナビ・プロジェクトに参戦できます。
ありがとうございました。 <(_ _)>
インライン関数欲しい
テキストの整形をしたいのですが、TStringListの任意の場所、例えば

あああいいいううう

の、一番最初のいの前に改行を入れたいのですが、どうすればできるのでしょうか?
どなたか教えていただければ・・・
s := YourStrings.Text;
Insert(sLineBreak, s, 挿入位置);
YourStrings.Text := s;
procedure TForm1.Button1Click(Sender: TObject);
var
sl:TStringList;
s:string;
p:integer;
begin
sl := TstringList.Create;
try
sl.Add('1234567890');
sl.Add('xxxxあああいいいうううzzzz');
sl.Add('1234567890');
s := sl.Text;
p := AnsiPos('あああいいいううう',s);
Insert(#13#10,s,p+6);
sl.Text := s;
finally
Memo1.Lines.Assign(sl);
sl.Free;
end;
end;
sl.Clear;
sl.Add('あああいいいううう');

sl.Insert(0, Copy(sl[0], 1, 6));
sl[1] := Copy(sl[1], 7, High(Integer));
>>464
>TStringListの任意の場所
>>465
お題の意図は任意の行の任意の位置での行の分割ですが何か?
例えばText使って3行目の6文字目を分割したい場合どうやれと?
>>459
迷惑かけんなよ!
>>466
>>463 が見えないの?
String に写し取って改行入れて、TStringList に戻す。

>お題の意図は任意の行の任意の位置での行の分割ですが何か?

はぁ? >>464 だと後ろの行がつぶれるでしょ?
>>468
お前は題意を読み違えてるから話にならん。
470デフォルトの名無しさん:04/08/16 17:38
盛り上がってまいりました
sl.Clear;
sl.Add('あああいいいううう');
sl.RegExp('s/あい/あ\nい/g');
472DLできない人:04/08/16 17:42
>>467
迷惑なんてかけるわけないじゃないですか(w
今、勉強中です。
>>469
>お前は題意を読み違えてるから話にならん。

たしかにそうでした。すみません。

>例えばText使って3行目の6文字目を分割したい場合どうやれと?

s:= sl[2];
Insert(#13#10,s,7);
sl[2] := s;

このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
今現在のマウスポインタの指してる座標を手に入れるにはどうしたらいいですか?
Delphi内部からShellExecute関数でDOSからperlを実行し
その実行結果によってAファイルができる

このAファイルをDelphiで読み込んでMemoに表示させたいのですが
perlがAファイルを処理し終わる前にDelphiが読み込みを始めてしまいエラーがでます
(更新前のファイル内容が出たり、新規につくられるファイルではファイルがないとのエラー、読込違反のエラー)

ウェイト処理を入れたり、エラー処理をやってみたりしましたが上手くいきません
このような場合、なんか上手な対処方法はありますか?
TMSのメモコンポーネントを使ってみたけど、
予約語を太字にすると最後の文字が表示されない。
これってソースを買わないと直せないかな?
>>476
基準位置(原点)をどことするかが問題だ。
アクティブウインドウの位置を基準とするのか、
アクティブウインドウに乗っているコントロールを基準とするのか、
デスクトップの左上を基準とするのか。
>>477
CreateProcess を使ってループでプロセス終了まで待機する
サンプルをどっかで見た。

CreateProcess WaitForSingleObject

↑で検索すれば引っかかるかと。
479デフォルトの名無しさん:04/08/16 21:37
>>476
perlの処理の最中はフィルを消しておいて、
終わったらファイルを作成。
Del側はファイルがなければWhileとかで回して待機させて、
出来たら読み込みで良いんじゃないの?

そういうことではない?
>>476
while(not FileExsist(FileName)) do
でファイルが作成されるまで待ってはどう?
もしもの時には無限ループになるけどw
481475=480:04/08/16 21:41
>>476
スマソ。綴りを間違えた。FileExistsね

>>478
「デスクトップの左上を基準とする」でお願いします
>>479
返信トンクス
>perlの処理の最中はフィルを消しておいて、
>終わったらファイルを作成。
これはどうやるのでしょうか?

私が実行しようとしているperlは
perlを実行すると先ずディレクトリ内に空ファイルが作製され
それからファイル内部に実行結果を書き込むようです

空ファイルが出来てからファイル内部に結果が書き込まれるまでにタイムラグがあるため
Delphiはこの空ファイルに反応して読み込みエラーになります
また条件により実行結果のサイズが毎回違うために
空ファイルと結果を書き込み終わるまでのタイムラグも毎回違うのです
>>475
Mouse.CursorPos
で良いはず。マルチモニタ等の考慮が入っているかは不明。
484475=480:04/08/16 21:51
>>483
おお、うまくいきました。
ありがとうございます。
>>482
ShellExecuteEx使ってperl起動して終了待ちしとけ
おいおい
waitforsingleobjectが出てるのに虫するなよ氏ね
氏ぬのはお前。
ShellExecuteじゃ待てないだろ。
だからEx無しじゃ待てないといってるんだが。
このスレで言ってもいないことを相手が理解するのを期待すんな。
exで起動すればいいだろ氏ね
477もお願いします。
板目かっこいいから使いたいです。
昨日も超初心者級による珍回答続出だったな
↑ こんなレスより何倍もマシ
>>492
だったらお前が答えてやれと小1時間
なんのなんの。
即答レスはありがたいよ。
質問に質問で返すようなコンサルティング厨より大分マシ。
板目って何?
見た目のタイポ
498デフォルトの名無しさん:04/08/17 16:05
ちょっと困ったことがあります。

”コンポーネントの新規作成”ダイアログで、インストール先の”パレットページ名”
に自分で付けた名前を指定しているにもかかわらず、なぜかSampleページにコン
ポーネントがインストールされてしまいます。
どうすれば自分で指定したページにインストールすることが可能になるでしょうか?
registerプロシージャを見せて
500デフォルトの名無しさん:04/08/17 16:09
>>499

これです。

procedure Register;
begin
RegisterComponents('User', [TDrawButton]);
end;
>>498
そのソースにわざとコンパイルエラーを仕込んで
コンポーネントの登録しようとしたらどうなる?
もしエラーもなく登録できるなら
どこか別の場所の.dcuが使われてしまっている悪寒。
502デフォルトの名無しさん:04/08/17 16:21
>>501
>そのソースにわざとコンパイルエラーを仕込んで
>コンポーネントの登録しようとしたらどうなる?
普通にコンパイルエラーになりましたね。

ちなみに、特定の1個のコンポーネントだけではなく、
全部のコンポーネント(すべてUserページにインストール指定)が
Samplesページに追加されてしまいます。
>>500

それで Sample に載るならたしかに変。'User' が特別なのかなぁー。'Hoge' とかだとどうかな?
そこらへんのソースを一旦忘れて全く新規に中身空っぽの
コンポーネント作って'Test'ページに登録した場合は?
それでも変ならもう分からん。
505デフォルトの名無しさん:04/08/17 16:42
試しにパッケージに3つのコンポーネント、”TScrollBoxEx”、”TSHFileOp”、”TLabelA”を
追加して(TLabelAだけHogeページ指定)試してみたのですけど、”TlabalA”はUserページに、
その他の、”TScrollBoxEx”、”TSHFileOp”がSamplesページに追加されてしまいます。

以下はRegister;手続きです。

procedure Register;
begin
RegisterComponents('User', [TScrollBoxEx]);
end;

procedure Register;
begin
RegisterComponents('User', [TSHFileOp]);
end;

procedure Register;
begin
RegisterComponents('Hoge', [TLabelA]);
end;
506デフォルトの名無しさん:04/08/17 16:45
>そこらへんのソースを一旦忘れて全く新規に中身空っぽの
>コンポーネント作って'Test'ページに登録した場合は?
ダメですた。

とりあえず今はあきらめようと思います。
レジストリエディタを使ってパレットの配置を初期化してみたらどうですか?
インストール後に場所を変更したコンポーネントが元の場所に戻ります。

HKEY_CURRENT_USER\Software\Borland\Delphi\バージョン\Palette
というキーの中にある値を全部削除してみてください。

Delphi を起動してパレットの設定を行うと再作成されますのでご安心ください。
ただし、削除前に保存しておくことをおすすめします。
508TMSユーザー:04/08/17 20:44
>>477
TMS使っているけど、おそらくこの問題はソースコード入手しないと難しいような気がする。
持っているんで確認してみようと思うけど、仕事サボり中のためあまり期待しないで待ってて。
確認できたらNewsGroupかサポートにあげてフィードバック待ってみるから。

たとえばどういう単語?わかっていたら数例挙げてみて。
509477:04/08/17 22:03
>>508
おおおお、ありがとうございます。
期待しないふりをしながらも期待して待っています。
例えば、Procedureとかです。
TMSのDel7を使っています。
それについていたデモでもそうなります。
よろしくお願いします。

板目→見た目です。
表示位置はIDEで設定できるでしょ?
Registerでの設定がIDEでの設定より優先したら、
パッケージをインストールするたびにIDEの設定が無効になるよ!
511デフォルトの名無しさん:04/08/18 01:28
HTMLの<A>タグみたいなことをしたいんですが・・・お願いしますm(_ _)m
「リンク ラベル」で調べればサンプルがざっくざく
513デフォルトの名無しさん:04/08/18 02:10
>>512ありがとうございます!
コンポーネントを貼り付けた子ウィンドウを持つプログラムをDelphiでつくるにはどうすれば良いですか?

具体的には
処理結果がAならウィンドウAを起動、BならウィンドウBを起動
のようにしたいのです
もちろんウィンドウA、Bを外部プログラムとして設計し
内部から呼び出す手もあるのですが
それだとカッコ悪いですし、拡張などで不具合が出る可能性があるので
よろしくお願いします
515A:04/08/18 07:57
>>514
よくわからないけど、フォームをいくつも作って、

if 処理結果 = A then FormA.ShowModal;
if 処理結果 = B then FormB.ShowModal;

ってこと?
それとも、ソフトの起動時に条件によって、フォームを切り替えたいってこと?
その場合は、プロジェクトファイルのほうで、

Application.CreateForm(TForm1, Form1);

の部分を切り替えればいい。
SendMessageやPostMessageでメッセージを送る場合
Application.Handle
Application.MainForm.Handle
どちらがよいのでしょうか?
517デフォルトの名無しさん:04/08/18 13:54
質問があります。

EM_GETFIRSTVISIBLELINEでは、Memoコンポーネント上で、実際に目
にみえている最初の行の行番号を取得できますけど、これの水平バー
ジョンみたいなのはあるでしょうか?

スクロールバーなしでWordWarpFalseのメモコンポーネントで、クライアント領域
の左端のテキストの位置(ピクセル)を知りたいです。
スクロールバーが非表示なのでGetScrollPosが使えません。
messagedlgで、ボタンの中の言葉を変えるのには
どうすればいいんですか?
Editor で messagedlg と言う文字列を選択した後、
F1キーを押してみろ。
520519:04/08/18 18:14
と言う話ではないようだな。
521518:04/08/18 18:26
決まったボタンの名前じゃなくて、好きな文字を
ボタンの中に表示したいって事なんですけど
MessageBoxも表示するボタンが決まってるみたいです。
DQNな方法としては、
CreateMessageDialog でダイアログウインドウを作成して、
表示する前に、ダイアログウインドウ中のコントロールを探索して
ボタンのキャプションを書き換えると言う方法を提示してみる。
これでは、最高で五つまでしかボタンは表示できないっぽいけど。

↑中村さんのとこでも例があったので、これが一番容易らしい。
返り値はShowModalの返り値で良い模様。

もっとスマートでインテレクタルな方法があるかもしれないけど。
任意の文字をキャプションに持つボタンを作成できる
ダイアログウインドウをコンポーネント化してしまうのも手の一つ。
そんなの自前でarray of string受け付けるやつ作ればいいじゃん
524デフォルトの名無しさん:04/08/18 22:50
コマンドのXCOPYみたいなことをするにはどうしたらいいですか?
ShellExecute(nil, 'xcopy'
526デフォルトの名無しさん:04/08/18 22:55
>>525
ありがとうございます〜
527デフォルトの名無しさん:04/08/19 01:01
DelphiとIndyを使って、HTTPのURLにつないで「200 OK」が返ってくるか確認するプログラムを作りたいのですが、
接続したURLのサーバが見つからないときはSocketErrorがでて、そこで終了してしまいます。
サーバにつながらないときは別の処理を実行するようにしたいのですが、どうすればよいですか。

こんな感じでやってます。

IdHTTP1.Head('http://www.2ch.net/');
>>527
どうしてもその組み合わせじゃないとイヤ!
ってんじゃないのなら「Wininet」をお勧めします。
529528:04/08/19 01:08
よくよく読んだらちょっと後半部分が「Wininet」だと怪しい気がしてきたので、
読み飛ばしてください。
↓次どうぞ
exceptしろよ
531デフォルトの名無しさん:04/08/19 14:53
TTest=record
 Name:String[20];
 Age:Integer;
end;
PTest=^TTest;

var
 A:PTest;
begin
 New(A);
 ...
 Dispose(A);
 Dispose(PTest(A));

Aを開放するときはどっちでもOKですか?
後者はNG。文法的には正しいけどそう書く意味がない。
533デフォルトの名無しさん:04/08/19 15:03
>>532
あっ間違えた。

List:TList;

var
 A:PTest;
begin
 New(A);
 List.Add(A);
 ...
 Dispose(List[0]);
 Dispose(PTest(List[0]));

上記の場合はどっちでもOKですか?
DisposeはPointer型の引数をとるからキャストは不要
>>534は嘘。
バリアント型やinterfaceの終了処理があるから、型付きポインタを渡さないといけない。

A := List[0];
Dispose(A);

が正しい。
delphiで実行する前に自動的に保存というオプションないですか?
6 personalです。
>>536
…環境オプション。

ソフトをインストールしたら一応オプションダイアログを眺めるのは常識では…
538デフォルトの名無しさん:04/08/19 15:47
文字列の各単語の先頭の文字を大文字に変換する関数()ってあるでしょうか?
それとも自作する必要がありですか?

abc def → Abc Def
>>538
流石に標準で用意するにはピンポイント過ぎるよそれは
forで一文字ずつ見てって、空白の次にUpCaseかますだけだから、書いても三行ぐらいでしょ
>>537
設定タブの自動保存の設定ですか?
エディタファイルとプロジェクト デスクトップとあるのですが
どっちでしょう?
>>540
…それぐらいは、2chに書き込む手間を費やすよりは、ヘルプを見た方が早いと思うぞ
(何を保存したいのかにもよるが、ソースコードならエディタファイル、窓とかブレークポイントとかの状態はデスクトップ)
>>538
正規表現があれば一発なのにね
>>542
まあ、使いたきゃどうぞ
http://onigiri.s3.xrea.com:8080/delphi/index.php?%5B%5BTRegExpr%5D%5D

ただ、この程度はforでやっちまったほうがusesしてCreateして〜より行数的にも短くなると思うけど
>>541
ありがとう。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 TextBox1.Text = StrConv(TextBox1.Text, VbStrConv.ProperCase)
End Sub
.NETの勝利
>>546
何に勝利したの?
ぴゅう太の日本語ベーシック
>>534
キャストせんとMemCheck先生が怒りますよ
指定したアドレスにバイナリでデータを書き込むにはどうすればいいですか?
TMemoryStreamのWriteを使うのだと思うけどヘルプ読んでもワケワカメ(´・ω・`)
Move
Seek
553デフォルトの名無しさん:04/08/19 23:16
>>516
両方で試せば、おのずと明らかになる。

>>531
GetMem, FreeMem を使いなさい。
554デフォルトの名無しさん:04/08/19 23:32
ここで聞いていいのかわからないんですが…

LISPってなんでしょうか?

全くの素人でして、ゼロから学ばなきゃいけないんですが
何から始めていいのかわかりません…
テキストファイルの中身が空なら処理する
というプログラムにしたいのですがどうすれば良いでしょうか?

FileSizeだとテキストファイルに使えない上に
開かないとダメです

ご教授下さい
FindFirstでSearchRecのサイズを調べる
>>554
どうして学ばなければいけないのですか?
丸投げでいいのでは?
>>554
プログラム言語のひとつだよ。Delphiとはまったく無関係。
専用スレあるからそっち行って処理系なり入門サイトなり探してきな。
このスレもすっかり寂れてしまったな。
みんなVS.NETへの移行で忙しいらしい。
>>533 の質問って、ほぼ3ヶ月おきにされる FAQ だよね。なんで、自信満々で
間違ったことレスするかなぁー。 >>534
型なしポインタでは Dispose で Finalize ができないので一般にはリークする
だろうことぐらい気付けよ
>みんなVS.NETへの移行で忙しいらしい。

うむ、けっこうおもしろいね。実用性がまだまだだけど。
562初心者ですいません:04/08/20 12:54
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

type
TForm1 = class(TForm)
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.

自作の関数や手続きはどこに書けば良いのでしょうか?
またC言語でいうところのヘッダファイルのような物を作るにはどうすれば良いですか?
使うところより前なら実装部のどこにでも
別ユニットにして自作関数をため込むのが一番いいかも
> またC言語でいうところのヘッダファイルのような物を作るにはどうすれば良いですか?

ヘッダファイルの相当するモノはない。ユニットの interface 部がそれにあたる。
uses すると見えるのはその部分だけ。
ま、ユニットファイルの構造くらいはヘルプで読んでおくこと。基本中の基本だから
あのわかりにくいヘルプを超初心者に読めと?
ヘルプの「Delphi プログラマーズガイド」の部分くらい読めよ。
読まなきゃ分かるかどうかさえ分からないだろ。超初心者でも分かるヤツは分かる。
>>同じユニットの例

implementation

{$R *.DFM}

function Tasizan(v1,v2:integer):integer;
begin
result := v1 + v2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('2+3 = '+IntToStr(Tasizan(2,3)));
end;
独立ユニットの例

uses
Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('2+3 = '+IntToStr(Tasizan(2,3)));
end;

------------------

unit Unit2;

interface

uses
SysUtils;

function Tasizan(v1,v2:integer):integer;

implementation

function Tasizan(v1,v2:integer):integer;
begin
result := v1 + v2;
end;

end.
表示されるimageの大きさが実行中に変わるソフトを作っているのですが
 image1.Width := 100;
 image1.Height := 100;
としてから表示させ、続いて
 image1.Width := 200;
 image1.Height := 200;
と変更させて表示させても、最初に表示された大きさのimage以上に表示されません。
これはどこが悪いのでしょうか?
>>570
Image1.Stretch:=True;
おおおおおおおお
素早い対応ありがとうございます
おまいら!QuadrupleDの3.01がでてますよ。
http://www-fu.magma.ne.jp/~hayase/
574570:04/08/20 16:17
すいません、うまくいきませんでした。
画像imageの比率というか、内部で持っている大きさと表示される大きさが
サイズを変えるたびに変わってしまいます。
575570:04/08/20 16:35
とりあえずFORMに直接描くようにして回避しました。すいませんでした。
それにしても
procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Width := 100;
image1.Height := 100;
Image1.Canvas.Brush.Style := bsSolid;
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Width := 200;
image1.Height := 200;
Image1.Canvas.Brush.Style := bsSolid;
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height));
end;

これでボタンを1から押すのか2から押すのかでなぜ表示範囲が変わるのか結局不明。
Stretchだと表示倍率が変わってしまうし。
>>574
Stretch と Proportional を両方 True にしてみてください。
AutoSize は False、Align は alNone になってますか?
577570:04/08/20 23:55
>576
やってみましたが同じくダメでした。白で塗りつぶしてから
Image1.Canvas.TextOut(10,10,'test100');
を入れてみたのですが、ボタン1から押すとボタン2の時に文字が縦横倍に
ボタン2から押すとボタン1の時に文字が半分になってしまいます。
>>570
Image の Width Height を変えるとき、
Image.Picture.Bitmap の Width と Height も変えてみてくれ。
579デフォルトの名無しさん:04/08/21 04:54
しつもんです。

外観はTListViewのViewStyle=vsReportみたいな感じだけれども、マウスでクリック
したとき一番左側の値だけ選択されるのではなく、行全体が選択されるような
コントロールってどうやって実現するんでしか?

具体的に言えば、2chブラウザのスレ一覧につ変われているようなコントロールです・・・。
つ変われているような → 使われているような
実現するんでしか? → 実現するんですか?

でした。
>>579
RowSelect?
>>581
お゛お゛、できました。素晴らしい。
Special Launchみたいにフォームからマウスが離れると
フォームが小さくなるようにするには
どうしたらよいでしょうか?
584デフォルトの名無しさん:04/08/21 13:20
ComboBoxの背景色は、透過させることができますか?
>>585
thx
CM_MOUSEENTERですね
ENTERじゃなくてLEAVEちゃうか?
DelphiにVBのsplit関数と同じものはありませんか?
ない。
コードが欲しけりゃDelphi Splitでググっとけ
>>588
Delimiterを設定して
DelimitedTextにソース文字列を代入する
split関数と同じものではないですね。
>578
できました!おありがとうございます。
ファイルの内容をString型の変数にすぱっと読み込みたいのですが
そのようなことはできますか?
TStringsへ読み込むと分割されてしまうので
できればバイナリで読み込んでそれをStringにしたいのですが・・・
FS := TFileStream.Create(FileName,fmOpenread);
//FS.Position := 0;
FS.Read(s[1],FS.Size);
動作未確認
sl.LoadFromFile(
s := sl.Text
Free・・・orz
>>594
sをSetLengthしないとえらいことになるはず
>>593
TStringsのTextプロパティは駄目なの?
599593:04/08/21 22:04
ありがとうございます。
Textプロパティ使わせていただきました。
オブジェクトを使うほどでもなければ API だけでも十分対応できる。
ほかのどの方法よりも速いはず。

function LoadFileToString(const FileName: string): string;
var
  Handle, Size: Cardinal;
begin
  Handle := CreateFile(PChar(FileName), GENERIC_READ, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if Handle <> INVALID_HANDLE_VALUE then
    try
      Size := GetFileSize(Handle, nil);
      SetLength(Result, Integer(Size));
      ReadFile(Handle, PChar(Result)^, Size, Size, nil);
    finally
      CloseHandle(Handle);
    end
  else
    RaiseLastOSError; // RaiseLastWin32Error;
end;
>できればバイナリで読み込んでそれを
ここには意味があるのかないのか
602593:04/08/21 23:29
>>594さんの方法でできました。
TStringStream なんてのがあるぞ。
私ならAssignFileで開いてBlockReadでファイルサイズ分まとめて読み込むけど。
BlockReadなんて古臭い関数は使わないほうがいい。
エラーチェックが気に食わんけど(Win32Check使えとか一応全APIチェックしろとか)
>>600のでいいよ。
606593:04/08/22 11:42
String型文字列をファイルに書き込みたいのですが
空のファイルができるだけです。何が問題でしょうか?


FS := TFileStream.Create('hoge.txt',fmCreate or fmOpenWrite);
FS.Write(s, Length(s));
FS.Free;
607593:04/08/22 11:44
FS.Write(s[1], Length(s));
としたらできました。
>>606
FS.Write(PChar(s),〜
間違えた、すまん
FS.Write(PChar(s)^,〜
こうだ
610593:04/08/22 12:01
あれ?>>607ではだめですか?
一応動いてるみたいですけど
s[1]だと、長さが0の時困るでしょ
612593:04/08/22 12:11
>>611
おおおおおおおおおおー
613593:04/08/22 12:15
>>611
長さ0の時を試してみたけど大丈夫みたいでした。
うん、s[1]が範囲外で不正なメモリを指しても、サイズが0ならつまりメモリ上は全く上書きされないので問題なし
でも、世の中には{$R+}というオプションがあって…
615593:04/08/22 12:24
なんですか?その{$R+}というのは?
616593:04/08/22 12:29
読み込むほうは
FS := TFileStream.Create('hoge.txt', fmOpenRead);
SetLength(s, FS.Size);
FS.Read(s[1],FS.Size);
FS.Free;

としてるんですけど、こっちもポインタみたいな指定に
したほうがいいんですか?
どういう書き方になるんでしょうか?
>>616
それでいいと思う。
漏れもそう書いてる。
強いて言えば
if FS.Size > 0 then FS.Read(s[1],FS.Size);
かな。
>>616
素直にPChar(s)^にしとけって
>>615
範囲チェックオプション。
620593:04/08/22 13:51
うーんpcharが何なのかよくわからないなあ
一般的には「ヌルで終わる文字列」だが
今回の場合は文字列ポインタと言うべきだろうな
s[1]ってことはShortStringになるわけだが、長さは大丈夫なのか?
>>622
ならないならない
>>622
s:string[255];
と間違えてないか?
sの1文字(バイト)目だよ
Charになるというのならまだわからんでもないが・・
626593:04/08/22 14:48
DelphiのString型はUNICODEじゃないんですか?
それはここで聞くよりヘルプ見たほうが早くないか?
>>626
バージョンとコンパイルオプションとWindowsによって変わるが、
D7まではSJISと思っておけばいい
D8はUNICODE
>>616
> 読み込むほうは
> FS := TFileStream.Create('hoge.txt', fmOpenRead);
> SetLength(s, FS.Size);
> FS.Read(s[1],FS.Size);
> FS.Free;
>
> としてるんですけど、こっちもポインタみたいな指定に
> したほうがいいんですか?
> どういう書き方になるんでしょうか?

だから、わからなかったら素直に>>598>>600の方法使えって。
それで解決できるんだから。

>>615
> なんですか?その{$R+}というのは?
>>620
> うーんpcharが何なのかよくわからないなあ

ヘルプくらい引けよ。全部書いてあるだろ。

何か、釣りなんじゃないかという気がしてくる。
var パラメータは表記の問題で内部的には変数を指すポインタを渡してる。
つまり var パラメータの位置に置いた S[1] は、文字列 S の 1 文字目の
文字を指すポインタを渡してるということ。
Delphi の文字列 (長い文字列) は、参照カウンタとバッファサイズが実際の
文字列の前に付いてるので、単なる文字列バッファではない。
従って、これを直接 TFileStream の Read などに渡すことはできない。
しかし、Delphi の文字列を PChar にキャストすると Delphi の文字列が、
その変数の文字列バッファの先頭を指すポインタに変換されるので、
PChar(S)^ と S[1] は同じになる。
この 2 つの式の型はいずれも Char になる。
>>629
自分が知っている知識を全て常識と思わないようにね
次スレの>>1には、「わからないキーワードはとりあえずF1を押してみましょう」とか書いておくとか
633593:04/08/22 18:22
>>630
結論は
>PChar(S)^ と S[1] は同じになる。
ということですネ!
文字列の長さが0の場合。
S[1]は例外を返す。
PChar(S)^はヌル文字列を返す。
>>633
繰り返しになるが…
「長さが0でかつ{$R+}」の場合を除き、varパラメータに渡す時または@でアドレス取る時、はYes
636593:04/08/22 18:33
この際、難しいことは考えないことにします。
Record型について質問です
Record型で「=」は使えないのでしょうか?

type TItem = record end;

として、Form1上にButton1をおいて
procedure TForm1.Button1Click(Sender: TObject);
var a,b: TItem;
begin
b:= a;
if b =a then button1.Caption:= 'true';   ←[エラー] Unit1.pas(43): 互換性の無い型です
end;
代入はできても比較は出来ない。
比較したければCompareMem関数を使う
DOAのOracleDataSetを使用してSQL(TStrings)を発行しているのですが、
このSQL(TStrings)を書き換えたい場合はどうすれば良いでしょうか。

文字列を代入すると互換性がないといわれてしまい、
StringをTStringsに変換する方法をさがしたのですが見つからず。
師匠たち教えて下さい。
SQL.Text := '代入したい文'
PChar(S)^ はアドレスの逆参照でしょ?
内部的にポインタだからアクセスしないだけで、
本当に逆参照したらAVが発生するでしょ。

>>637
使えない。
642639:04/08/22 23:30
>640 ありがとうございます。これで明日も生きていけます
相当焦ってるか、もしく純粋に経験不足だな
>>638,641
ありがとうございました。
string中に入れたいので比較関数作って処理します
645CLOWN:04/08/23 02:33
馬鹿初心者ですが、今度いろいろと質問させていただきます。
646645:04/08/23 03:09
ってーか6と7の違いすらわからんよ
recordなんて使うなよ。
classにして比較メソッド作れ
>>641
S のバッファが割り当てられていれば、PChar(S) は有効なアドレスを
指します。
上のような場合、割り当ては SetLength を呼び出した時点で行われて
いるので問題ありません。
割り当てによって確保されたサイズの範囲内であれば逆参照も可能です。
ただし、バッファが再割り当てされると、元のアドレスを保持していても
それが有効でなくなる可能性がありますので注意が必要です。

>>647
用途によるでしょ。
record に string や動的配列を含む場合は (自動変数でなければ) 初期化や
終了処理が必要なので class にする方がいいと思われる場合が多いですが、
単純型だけなら record でも十分です。
もっとも、要素が単純型でない場合は CompareMem は意味をなさないので、
要素ごとに適当な方法で比較するしかありません。
>>630
>しかし、Delphi の文字列を PChar にキャストすると Delphi の文字列が、
>その変数の文字列バッファの先頭を指すポインタに変換されるので、

変換されるのではない。string 型自身が実は文字列バッファの先頭を指すポインタなので
単なるキャスト

>>648
>それが有効でなくなる可能性がありますので注意が必要です。

有効じゃなくなる可能性なんかないだろ。S が string 型の変数であるかぎり。
>>649
>元のアドレスを保持していても
と書いてあるから、
A := PChar(S);
のAが無効になる可能性があるという話ではないかな?
>>650
そうだね。それは、今回のキャストの話とはべつのような。文脈を読むと

>>648
>S のバッファが割り当てられていれば、PChar(S) は有効なアドレスを指します。

などと書いているし。バッファが割り当てられていない string 型の変数なんかないだろな。
>バッファが割り当てられていない string 型の変数なんかないだろな。

あっ、ローカル変数で初期化されていない場合かな
>>649
長い文字列は内部的にはバッファを指すポインタですが、文法上は
文字列型という型です。ポインタ型と文字列型は違います。
S := 'abc' みたいに書くし、S[1] は S の 1 文字目でしょ。
動的配列もオブジェクトもポインタですか?

後半は再割り当ての前後でバッファのアドレスが変わる可能性があると
いうことです。
例えば P := PChar(S) として P にアドレスを入れた後で、S に対して
SetLength すれば P に入っているアドレスは無効になるかもしれません。
それはポインタなら当たり前
>ポインタ型と文字列型は違います。

ちがうからキャストするんでしょ
>動的配列もオブジェクトもポインタですか?

ちがいますがポインタにキャスト可能です。
今日も初心者回答者が大活躍ですな
いいから貴様等ヘルプぐらい読んでこい

string → PChar は、長さが1以上ならそのままバッファへのポインタを、
長さが0の時は特別に用意された長さ0のC形式の文字列へのポインタを返してくれる
長さが0のstringは全ビット0なので、純粋なキャスト、例えばPointerにキャストすればnilだし、Cardinalにすれば0。
でも、PCharにしたときは、別の値になる。
疑うならCPUウィンドウでトレースしてみなさい
659593:04/08/23 12:56
まあ、落ち着けw
660デフォルトの名無しさん:04/08/23 12:58
ネットでダウンロードしたあるソースファイル(hoge.pas)を使用して(自分のusesに追加)
コンパイルすると、
「hoge.pas:ファイルが見つかりません:'DsgnIntf'」
というコンパイルエラーが出るのですが
他に何か設定する必要があるのでしょうか?
hoge.pasのusesにはDsgnIntfが書いてあります。
DsgnIntfは設計時専用のユニット。
昔は実行時に使われるソースに設計時のコードまで書いてしまうコンポーネントが多かったため
Delphi5か6か忘れたけどその辺で、設計時パッケージを使わないとコンパイルできなくなってます

要するに、そのソースは古いものでしょう、と。
コンポーネントとしてインストールしたりせずに、単にユニットとして使うだけなら、
usesからDsgnIntfを消して、コンパイルエラーになったところを片っ端からコメントアウトでいけない?
>>658

長さが0でない場合には単なるキャストであることを確認

procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
p:pointer;
i:integer;
begin
S := 'ABC';
p := pointer(@S);
//CopyMemory(@i,p,SizeOf(S)); // こっちでも同じ
Move(p^,i,SizeOf(S));
Label1.Caption := IntToStr(i);
Label2.Caption := IntToStr(integer(PChar(S)));
end;

では同じ値が表示されます。

>長さが0のstringは全ビット0なので、純粋なキャスト、例えばPointerにキャストすればnilだし、Cardinalにすれば0。
>でも、PCharにしたときは、別の値になる。

これも、上で S := 'ABC'; のかわりに SetLength(S,0); とすると確かめられる。

後者は初めて知った。ありがとう。

ところで、蒸し返すようだけど、Move() や TFileStream.Read() などの引数で
string 型にしたい場合、PChar(S)^ がいいの、それとも S[1] がいいの?
ヌル終端が不要で、長さが0の時に何もしないことが保証されているなら(MoveもTFileStream.Readもそう)
Pointer(S)^が一番いい。不要な処理が一切無い

それ以外(APIや外部に渡すとか)は、{$R+}の事を考えると、PChar(S)^の方がいいでしょうね
なるほど、ありがとう
Delphiでポインタのことを勉強するのにいい本ってありますか?
ヘルプ読んでも全然使いこなせません・・・
なんか新鮮な質問だな・・・
>>665
Indide Windows
amazon.comで調べました
9200円って('A`;)
669668:04/08/23 15:45
間違えた Inside Delphiと勘違いしてた
Delphi でも C でも原理は同じ。Cでポインタについての本は結構あるでしょ。
上の話題のように、Delphi で string 型の変数がどのように実装されているか、
は、汎用性に欠けるし、知識としてもあまり有効ではありません。ポインタ一般に
ついて学ぶのがいいでしょう。Delphi では、@ でその変数のアドレス、ポインタの
後ろの ^ は逆参照、型の前の ^ は、その型へのポインタ型、とかを知っていれば
いいだけです。
671668:04/08/23 17:40
>>670
どもども
@hogeとPointer(hoge)って一緒ですか?
一緒だと思ってるけど、いまいち自信がない(´・ω・`)
俺もポインタのこと良く解からないままずっと仕事してるな・・・いい加減しっときたい
ポインタとは読んで字の如くポインタです。
>>672
全然違うだろ。
@hoge は「変数 hoge のアドレス」をアドレスとするポインタ。
Pointer(hoge) は「変数 hoge に入ってる値」をアドレスとするポインタ。
>>675
ますます解らない。

@hogeはhogeが構造体でも使える
Pointer(hoge)はhogeがポインタや4バイトの整数の時しか使えない。
string型は実際にはポインタなので、Pointer(S) のような使い方ができる。

S = '' の時、PChar(S) は 00 となっているコード領域のアドレスを返すため、
逆参照可能。

PChar(S)^、PChar(nil)^ は問題ない。




>>676
@hogeは変数hoge(の内容)を指すポインタを返す。
Pointer(hoge) は変数hogeの内容をポインタとして扱う。

hoge: Cardinal
hoge := 100;

の場合
@hoge は 変数hogeを指すポインタ
Pointer(hoge) は メモリ上の100というアドレスを指すポインタ
関係ない話だけど、
Cなら"->"と"."は区別されているのだが、
Delphiの場合だとどちらでも"."でアクセスできてしまう。
アロー演算子大好きです
シラネーヨ
>>676
> @hogeはhogeが構造体でも使える
> Pointer(hoge)はhogeがポインタや4バイトの整数の時しか使えない。
やってみた。

var
 Ptr: Pointer;
 N: LongInt;
 D: double;
begin
 N := 0;
 D := 0;
 Ptr := Pointer(N); // 4バイトでPointer型と同じサイズだからエラーが出ない
 Ptr := Pointer(D); // [エラー] : 正しくない型キャスト
end;

>>676が言っているように、コンパイルできなかった。
Byte型もPointerにキャストできるよ。
B: Byte;
Pointer(B) も使える。
ローカルなstring型は暗黙の初期化が行われるよ。
初期化なかったら大変だよ。
>>682
順序型ならなんだって出来るんじゃない?
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
WideStringって今でも書込み時コピーしてへんの?
>>686
「書き込み時」って、何に書き込むとき? 「今でも」って何?
WideString 自身を Stream にそのまま書き込むことはできるよ。
>>682
>Byte型もPointerにキャストできるよ。

そりゃ、integer と代入互換性があるからでしょ。Word だってそう。

>>672
>@hogeとPointer(hoge)って一緒ですか?

この違いが分かれば、一歩前進。ポインタって、もっともナイーブに考えると
アドレスを格納するための変数なんだから、変数 Hoge のアドレスと、それが
保持している値は違うことに気づけばいい。
ずっと昔に買った本に、AnsiStringは参照カウンタで管理され無駄なコピーをしないように努力するが、
WideStringは参照カウンタがないからAnsiStringほど効率がよくないって書いてあったんよ
今のヴァージョンでも同じかいな?
>>687
質問の意味がわからないならすっこんでろ。
>>689
D7のヘルプでは
>Win32 では,WideString の値は参照カウントで管理されません。
>Linux では,参照カウントで管理されます。
と書いてある。
>>691
ありがとう
winとlinuxで違うなんて変なの
>>690
Copy on Write っていうんだよ。「書き込み時」じゃ意味不明
俺はなんとなくわかったYO
代入時ならより分かりやすい
でもググると書き込み時コピーで合ってるぽいけど
Copy on Write の直訳だろうね。参照を受け取って、一方が変更されるまでは、
コピーをしない、という意味だよね。string 型や TBitmap なんかもそう。
>>693
「長い文字列」のヘルプも読んでないならすっこんでろ。
>これは書き込み時コピーと呼ばれます。
質問は WideString ですけど
ヘルプ読まないと回答してはいけないのなこのスレ
>>690でFA
>>686はヘルプに書いてある用語で質問しているのに
全く理解できてない>>687、自分の思い込みを強制する>>693
話の流れすら理解できない>>699とアフォばかり出てくるのは
なぜですか?
同一人物だから

で WideString 型がどういう話の流れで string 型のヘルプになるわけ?

質問者にヘルプ読めってことだろ結局 >>691 から
WideStringの書き込み時コピーについては>>692で終わってる。
以降は「書き込み時コピー」という用語が存在するかどうかの話。
686の質問から691の回答まで58分間。689の説明があるまで、まともな
回答がなかったのは事実。687は689の説明を引き出すのに役立った。
はじめから689のように質問していたら、687はなかったし、回答ももっと
早かったのでは。だから、質問の意味がわからなくてもすっこんでいる必要はない。
690,698,702のレスの方が無意味
TMemoでメモ帳を作っています。
改行時にオートインデントの機能を付けたいのですが全然うまくいきません。
どういうコードを書いたらいいのか教えて下さい。よろしくお願いします。
テキストボックスの横にUpDownコントロールをおきました。
updownのassociateプロパティでテキストボックスとひもづけました。
そうするとそのテキストボックスをtxtHogeとします。
txtHoge.Text := '10';
で値を入れることができません。なぜでしょう?
>>707
入れられたけど・・・
うそーん
テキストボックスのNameプロパティでなくCaptionプロパティだけを変えてるとか、
UpDownのmaxプロパティとかminプロパティの設定が間違ってるとか、、、
うーん。
UpDownのPositionに10といれればいけるけど
テキストボックスの.textに入れると0のまま・・・
なんかイベントによって機能したりしなかったりするみたい
UpDown1.Position := 10;
でどうですか?
そうか
Createイベントではだめなんですね
文字列が数字かどうかチェックする関数ありませんか?
VBでいうIsNumericのような
function IsNumericStr(const Str: string): boolean;
var
i: integer;
begin
Result := True;
for i := 1 to Length(Str) do
if not (Str[i] in ['0'.. '9']) then
begin
Result := false;
Break;
end;
end;

こういう関数を用意すればいいかも・・・
716ぬるぽの名無しさん:04/08/24 15:44
>>714
function IsNumer(NumStr: String): Boolean;
begin
try
StrToInt(NumStr);
Result := True;
except
Result := False;
end;
end;

応用するとDateTimeなどにも使える。
>>715
>>716
さてどっちが速いか競争してみましょう。
IsNumericStr() の方が約4.5倍速い
いただきました。ありがd
さらに速度1割り増し

function IsNumericStr2(const Str: string): boolean;
var
i: integer;
begin
Result := false;

for i := 1 to Length(Str) do
if not (Str[i] in ['0'.. '9']) then exit;

Result := true;

end;
>>720
いただきました。
'9999999999999999999999999999'はIntegerに変換できないんだけどな。
質問

>文字列が数字かどうかチェックする関数ありませんか?

Integerに変換できなくても数字であればいいのでは? あっ、IsNumer() のほうならそのとおり。
System.Val…
-ついたらだめだったのでVBに戻ります
>>725
そうだそうしろ。2度と来るんじゃないぞw
Delphiって言語以上にコミュニティに問題があるな
>>720を少し改造すれば負の整数(-付き)にも対応できるよ。
>>727
おまえみたいのがいるからな
VB の IsNumeric は文字列関数じゃなくてバリアント関数じゃないのか?
Delphi やるなら、まず何でもバリアントで扱うという考えは捨てた方が
いいと思うぞ。
>>730
寝言はいいから早くDelphi版IsNumericのコードをください。
function IsNumeric(const V: Variant): Boolean;
begin
  Result := True;
  try
    VarAsType(V, varDouble);
  except
    Result := False;
  end;
end;
うちのdelphi try exceptがまったく効かないんだけど
なんででしょう?
>>733
まず何をもって効かないと言ってるのか書いてみて。
735|Д・彡 ◆A6VzDeLphI :04/08/24 20:27
昔2chで教えてもらったんだけど....
例外キャッチだとIDEが止まるのがちょっといまいち。

D6から
TryStrToInt/TryStrToInt64/TryStrToFloart
があります。

D5以前ならこんな実装してもいいかな。
function CanStrToInt(const S: string): Boolean;
var
E: Integer;
tmp: Integer;
begin
Val(S, tmp, E);
Result := (E=0) and (@tmp=@tmp);
end;

function CanStrToInt64(const S: string): Boolean;
var
E: Integer;
tmp: Int64;
begin
Val(S, tmp, E);
Result := (E=0) and (@tmp=@tmp);
end;

function CanStrToFloat(const S: string): Boolean;
var
tmp: Extended;
begin
Result := TextToFloat(PChar(S), tmp, fvExtended);
end;
>>734
エラーで落ちてしまいます。
本当はキャッチするんですよね?
例外の設定がおかしいと思われる。
設定ですか?インストールしたままほとんど弄ってませんが
>>736
コードさらせ
Except仕切れていないだけなんじゃないの
>>716
とかそのままコピペしても落ちます。
IDEから実行して止まってるだけだろどうせ
えっ!exeなら止まらないんですか?
知らなかった。
とまったらもう一回実行してみろ
>>742
IDEからでも止めたくなかったら、
デバッガオプションを設定する必要あり
そのオプションとやらはどこにあるんですか?
('A`)マンドクセ…
Delphiってほんとにいいね。
仕事で使えないのが残念
おい、まさかIDEで実行して、言語の例外で停止にチェック入れてるとかいうオチ?
Delphi 言語の例外で停止というのにチェック入ってます。
これがだめなの?
>>749
だめというか、デバッグには役に立つんだけどね。
なるほど!
752748:04/08/24 21:26
すまん、逆だったな。
入ってなかったってオチ?だな
753748:04/08/24 21:27
いや、いいのか・・・
例外で止めたらexcept部分が実行されないんだな
どっちやねん!
システムモーダルなフォームを開きたいのですが可能ですか?
システムモーダルって、プロセスが止まっちゃうのでは?
こちらに書けばよかったですね・・・。
すいません質問があります。
WindowsXP標準搭載のCDライティングウィザードを
プログラムから起動させてファイルを書き込みさせたいのですが、壁に当たってしまい困っています。
いまわかっているのはファイルをC:\Documents and Settings\ユーザ名\Local Settings\Application Data\Microsoft\CD Burningに
置くと自動的にバルーンメッセージが表示されCDに書き込める状態になるのですが、
そこからウィザードを起動させる手段がわからずにいます。拡張子が.exeでは無いようにおもうのですが。。
なにかよい知恵はありませんでしょうか?
システムモーダルって何?
ぐ・ぐ・れ♥
761デフォルトの名無しさん:04/08/25 12:41
(フサギコ談話室からの難民です。よろしくお願いします)
TInterfacedObjectに関する質問があります。
GCっぽい動作を期待しつつ、DelphiのHelpに記載されているサンプルを実行してみたところ、メモリリークが発生しているように思えます。
サンプルは、Delphiヘルプ「クラス型プロパティへの委任」から引用しました。
メモリリークの検出は、MemCheck.pas(使い方は間違ってないと思います*1)を用いました。
新規作成したプロジェクト(*2)でも、5個のメモリリークが検出されるのですが、件のサンプルを実装し、それを実行した状態だと6個に増えます。なぜなのでしょうか、エロイ方よろしくお願いします。修正法等もあれば、よろしくお願いします。
環境はDelphi6です。パッチは当たってます。

*1
program Project1;
uses
MemCheck,Forms,Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

*2
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
MyInterface: IMyInterface;
begin
MyClass := TMyClass.Create;
MyClass.FMyImplClass := TMyImplClass.Create;
MyInterface := MyClass;
MyInterface.P1; // TMyClass.MyP1 を呼び出す
MyInterface.P2; // TImpClass.MyP2 を呼び出す
end;
インターフェイス同士で相互に参照してんじゃねーの?
TMyImplClass = class
procedure P1;
procedure P2;
end;
TMyImplClass自身はTInterfacedObjectじゃないからでしょ。
implementsは使ったことないからどう対処すべきかは知らないけど
バイナリファイルを1バイトずつ読み込むにはどうしたらいいんでしょう?
BlockRead(だったけ?)を使えばいいのは判るけど
レコードサイズがややこしいですねえ。
TFileStream使っとけ
厨な質問で申し訳ないのですが、TListViewをvsReportで使用すると
TStringGridのようにも扱えますが、それぞれの使い分けというか、
どういうときにはTListViewを使用して、こういうときにはStringGridを
利用するみたいのを教えてください。
767デフォルトの名無しさん:04/08/25 16:58
>>763
ありがとうございました。
TInterfacedObjectの破棄時、メンバにオブジェクトがあった場合、それも自動的に破棄される物かと思ってました・・・
>>764
別にBlockReadで読む必要はないぞ。

var
  fp : File of byte;
  b : byte;
begin
  AssignFile(fp, Filename);
  reset(fp, 1);
  while not eof(fp) do
    read(fp, b);
  CloseFile(fp);
end;

で1バイトずつ読める。
でも、いまならTFileStreamを使った方が良いんじゃないかな。
CreateFile, ReadFile
TFileStreamは先読みしないのでHDDヘッダの
オーバーヘッドが大きいと聞きました。
本当に一バイトずつ読みのにTFileStreamでいいの?
パフォーマンス気にするならWin32API使えよ
>>770
心配しなくてもOSのAPIが世話焼いてくれるって…
>>770
TMemoryStream
>>772
ご自分で使用したことおあり?
>>770
765だってTFileStreamで1バイトずつ読めとは思ってないだろ。
ある程度の大きさのバッファに読み込んで、そこから1バイトずつ処理すりゃいいじゃん。
言い訳カコワルイ
778764:04/08/25 20:19
あわわ、結局何を使ったらいいのやら・・・(;・∀・)
あ、そうだ。書こうと思って忘れてたけど
ちょっと前にあったPChar(s)^のやつ、
SetLengthを読み込むバイト数+1でやらないと
最後の1バイト切れるよ。
>>780
切れない切れない
>>781
ありがとう。
おかげさまでつまらぬミスを改修できました。
nil ではなく無効なポインタを検出するにはどうすればいいのですか?
無効になった変数には nil を代入して下さい。
これが確実な方法です。
他の方法は不確実。
こんばんわ。
delphi勉強し始めでしてとりあえずブラウザ作ってるんですが
WebBrowserにpgup/pgdnとかhome(ページの先頭へ移動)の命令を送るボタンとかつけたいんですが
どうしたらいいのでしょうか。お願いします。
786デフォルトの名無しさん:04/08/26 02:48
質問があります。
WideChar型の変数に全角文字を代入したいのですが、
以下ではエラーになります。
どうすればいいでしょうか?

procedure TForm1.Button1Click(Sender: TObject);
var
 W: WideChar;
begin
 W := 'あ';
end;
787デフォルトの名無しさん:04/08/26 02:54
Delphi製Cコンパイラが欲しいのですが、既存のもので何かありますでしょうか?
あと、Delphi製のシェルなんてのも探してます。
散々調べてみたのですが、それらしきものが見つかりませんでした。

無ければ、つくります。
>>786
w := WideString('あ')[1];
>>787
作って下さい。
w := #$3042;
>>787
ガンガレ
function ToWideChar(c: WideString): WideChar;
begin
 if Length(c) <> 1 then
  raise Exception.Create(c);
 Result := c[1];
end;
793デフォルトの名無しさん:04/08/26 13:27
WideChar型にどうにかして空文字を('')代入することって無理ですかね?
空文字は文字ではないので代入できない。文字列なら代入可
>>794
わかりました。
delphi6proを5000円で譲ってくれるって話があるんですが、
8のアカデミック買うのとどっちがよさげでしょうか。
6pro買うかVS.NETのアカデミック買え
>>796
今更日某にお布施はもったいない・・・
theSpokeよりVS.NETの方が機能は上なんですか?スレ違いですが・・・
一応兄貴のお下がりでVBとCの本もいっぱい読ませてもらったりちょっと触らせてもらったりしたのですが、
delphiが一番打ってて楽しいので、del6getの方向でいってみます。
theSpoke は機能的には VS.NET 2003 Professional と同じ。
ただし紙のマニュアルなどは省略されてる。

>>799 は開発対象が、Win32 ネイティブアプリケーションなのか、
CLR 上で動くマネージドアプリケーションなのかによって、
最適な選択肢が変わってくると思う。

Delphi6 でマネージドアプリを作ることは不可能だし、VS.NET の
VB でネイティブアプリを作ることも不可能。
801デフォルトの名無しさん:04/08/26 17:38
コントロールパネルを操作することって可能ですか?
>>801
その質問では「操作」が何を意味するのかわからない。
やりたいことをもっと具体的に書け。
803801:04/08/26 17:51
>>802
すいません
具体的にはフォルダオプションのシングルクリックでプログラムを起動するように設定したり、XPでクラシック表示にしたりです。
>>803
かのう。
805デフォルトの名無しさん:04/08/26 17:56
>>804
本当ですか!?
どこかにサンプルとかありますか?
>>805
レジストリエディタとにらめっこをしながら
コントロールパネルで該当のオプションを変更しなさい。
SystemParametersInfo
808デフォルトの名無しさん:04/08/26 18:43
指定した時間(13:30など)に音楽を鳴らすプログラムを作りたいんだけど、Timerコンポーネントを使うんでしょうか?
>>808
そうです
810808:04/08/26 18:51
レス早っ!

DateTimePickerで指定した時刻にイベントを実行するようにしたいんですが、
参考になるようなサイトはありますかね。
「指定した時間に」なら TTimer じゃないだろ
TTimer は「一定時間後」或いは「一定時間ごと」だ
指定した時間なら ApplicationEvents.OnIdle で現在時刻を調べて判定
アフォ
813デフォルトの名無しさん:04/08/26 19:06
>>806レジストリを直接さわらない方法で・・・
>>807後でぐぐってみます(携帯からなんで)
>>811
そしたら常にメッセージループを回してないといけないじゃないか
現在時刻と指定された時間の差をTTimerのインターバルに設定すればいい話
sleepで十分
>>813
初心者がレジストリ操作を避けるのは
「うっかり操作ミス」でキーを消したりするとあぶないから。

ちゃんと該当するキーを調べた上でプログラムから操作するなら
Windowsの設定変更にこれほど強力な手はない。
TTimerのインターバルを利用する方法だと誤差が出たような気がする。
>>803 の前半の方は
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer の
ShellState の 4 バイト目の 5 ビット目 (0 から数えて) が
0 ならシングルクリック、1 ならダブルクリックのようです。

レジストリを書き換えるのはそんなに難しくないと思いますが、
書き換えた後にどうやって反映させるのかは知りません。
819デフォルトの名無しさん:04/08/27 01:04
>>818>>816
レジストリ直接いじるのをさけるのはミスが怖いとかじゃなくて管理者権限がないパソコンで動かすためです...
sh解決しました。
vbでいうところのscreen.mousepointer = vbhourglassに
相当するものを教えてください。
Screen.Cursor := crHourglass;
ちゃんくす
>>821
VBからDelphiへの移行にトライしている人がいるみたいだけど、
ここを見るといい。
ttp://www.wwlnk.com/boheme/

自分もVBから移行するときにかなり参考になった。関数や手続き別に
移行FAQが書いているよ。
もう知っているのかもしれないけど。
>>824
ちゃんくす。ブクマクしますた!
DelphiからVBに移行するのにいいページない?
>>826
ttp://www.kanazawa-net.ne.jp/~pmansato/Tools.htm
>もし、Visual Basic の機能の範囲内で間に合うのであれば、
>Delphi も Visual Basic と同じぐらい易しいといえるでしょう。
>しかしそれなら、Visual Basic を使うことをすすめます。
素人はVBに移りなさいってこった
829デフォルトの名無しさん:04/08/27 18:27
PageControlのタブのサイズを変更したいのですが、どこで出来ますか?
半角空白や全角空白を使って調整する以外に可能ですか?
>>829
TabWidth, TabHeight
デフォルト(0)だとフォントによって自動調整されている。
>>830
ありがとうございました。
子PageControl側でなく、子Tab側を探していたので見つかりませんでした。次からは親側も注意します。
訂正)親であるPageControl側でなく、子Tab側を
ある関数をスレッドにしたいのですが
どうすればよいですか?
>>819
制限ユーザでも HKEY_CURRENT_USER 以下のレジストリは書き込みもできる。
SystemParametersInfo だって最終的にはレジストリを操作するものだし、
そもそも直接操作出来ないようなレジストリは他の API を使って間接的に操作することも出来ん。
>>834
常識的に考えてそうだよね。
>>827
「VBは遅くない」
「Cの知識がある俺にはDelphiは使いこなせなかった」
ということをいうのにずいぶん遠まわしないいかたをするページだ
おじさんは新しいものが覚えられないからな
仕方ないよ
>>827
http://www.kanazawa-net.ne.jp/~pmansato/BCB_Main.htm
>今、話題の C# の開発者は Delphi を開発した人です。

普通に知らなかった
超有名です。
>>836
読み間違えてない?
基本的にVCLマンセーなサイトだけど。

.NETをどうしても使う場合にも、
>Visual Basic を選択してはいけません。Visual C# を選ぶべきです。
という感じでVBやめなさいみたいだし。
ShellListViewでファイル選択時に、選択した合計ファイルサイズを
ラベル(下記のソースではLabel5)に表示したいのですが・・・。
下のソースコードではファイルのみで、フォルダに対応できません。
複数階層のフォルダに対応させるには、どうしたらいいのでしょうか?
842841:04/08/27 23:10
procedure TForm1.ShellListView1Change(Sender: TObject; Item: TListItem;
 Change: TItemChange);
var
  i: Integer;
  size: Integer;
  path: String;
  rec: TSearchRec;
begin
  Label5.Caption := '0';
  size = 0;

  if (ShellListView1.ItemIndex = -1) then Exit;

  try
    for i := 0 to (ShellListView1.Items.Count - 1) do
      if (ShellListView1.Items.Item[i].Selected) then
      begin
        path := ShellListView1.Folders[i].PathName;

        if FindFirst(path, faAnyFile, rec) = 0 then
          size := size + rec.Size div 1024;
      end;
    end;
  finally
    FindClose(rec);
  end;

  Label5.Caption := IntToStr(size);

end;
>>833
API
>>842
再帰。
VB、.NETの評価はこちらでどうぞ。

ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その13
http://pc5.2ch.net/test/read.cgi/tech/1089454618/
Delphi標準のWebBrowserでページを開くと、
TabやEnter、その他の入力ができなくなっています。
フォーカスはWebBrowserにあるのですが。
WebBrowser内で一度クリックすれば入力可能になりました。
どうすればクリックせずに入力可能な状態にできるのでしょうか。

ただ、ページによっては(Googleなど)はじめからEditBoxにカーソルがあり、
Tab、Enterなどが入力可能になっていました。

UIWebBrowserでも試してみたので、WebBrowserのバグではないと思います。

環境:Delphi6 E

よろしくお願いします。
TMenuItemのShortCutを使ってはいかがかな?
聞いたことがないので、調べてみます。
>846
ttp://hogehoge2001.at.infoseek.co.jp/note-delphi.html
このページの「フォーカスを当てる」のとおりにすればフォーカス当たる。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
データベースプログラムでNOT NULLの列を入力せずに
POSTするとエラーが出るのですが、この時のエラーが
「無効/非表示ウィンドウにフォーカスを設定できません。」
と表示されるんです。これの意味がわからず、もう3日も悩んでます。
だれか教えてください。
853841:04/08/28 10:24
>>844
ありがとうございます、再帰というものを始めて知りました。
ぐぐって頑張ってみます。
HTTPでゲットしたデータをそのままファイルに
落としたいのですがこれでよいでしょうか?

procedure TfrmMain.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buff: array[0..4095] of char;
ret: Integer;
fs: TFileStream;
begin
ret := ClientSocket1.Socket.ReceiveBuf(buff, sizeof(buff));
fs := TFileStream.Create('hoge.jpg', fmOpenReadWrite);
fs.Seek(0, soFromEnd);
fs.Write(buff, ret);
fs.Free;
end;
>>854
だめです。
>>855
どこがだめでしょうか?
buff: array[1..4096] of char;
にしたらできました。
アクション関係で一発でダウンロード&ファイルに保存ってのがあったような。
>>858
ぜひ!
TIdHttp.GetでTStreamに取り込んで保存しちゃえ
861デフォルトの名無しさん:04/08/28 17:31
テキストファイルの文字列を全消去できますか?
TStringList.Create.SaveToFile('yourfile.txt');
frmSub := TfrmMain.Create(frmSub);
frmSub.Show;
で表示したフォームを
OnCloseで
Action := caFree;
とするともう一度開くときに
EStackOverflow例外エラーが発生してしまいます。
どのように回避すればよいでしょうか?
>>863
親フォームをCreateで指定する。
自分を指定してどーする
>>864
ネ申!
DateTimeToStr(Now)
で日時を文字列に変換したのですが形式を
yyyy/mm/dd hh:mm:ss
にしたいのですがどのように書けばよいでしょうか?

FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)
>>867
ネ申..._〆(゚▽゚*)
それ違ってる>>867

mmは月。
従って、hh:nn:ss。
ああ、866をコピペしたから
871A:04/08/28 21:20
>>869
>mm 月を先頭のゼロ付きで表示する(01 〜 12)。
>   h 指定子または hh 指定子の直後に mm 指定子を指定すると,月ではなく分が表示される

hhの直後のmmは、分として判断されるので、>>867でもOK。
教えてください。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Jpeg :TJpegImage;
begin
Jpeg :=TJpegImage.Create ;
Jpeg.LoadFromFile('hoge.jpg');
try
Image1.Picture.Assign(Jpeg);
except
end;

Jpeg.Free;

end;

例外処理をしているつもりなのですが
0バイトのjpegファイルを読み込むと

JPEGエラー #41.

がでてしまいます。
例外エラーが出ないようにするにはどうすればよいでしょうか?
Create
Try
LoadFile

の順で
×LoadFile
○LoadFromFile

ゴメソ
>>873
その順番で試してみました。
が、同じでした。うーむ。
876872:04/08/28 23:06
すみません。わかりましあ。
#41が何か解らないけど、IDEは例外で止まるよ。
878872:04/08/28 23:15
最近はネ申と書くと謝辞になるのか?
最高級の謝意を表す文字です。
Explorerからフォルダ(ファイル)をListView1にD&Dしてフォルダ名を追加しようとしています
 DragAcceptFiles(Handle,True);
↑なら正常に動いてくれますが、Form全体が受け取り範囲になっています。
D&Dを受け取るのはListView上だけにしたいのです。
そして
  DragAcceptfiles(ListView1.Handle,True);
に変えてみました。マウスカーソルは期待通りに変わっていますが
いくらドロップしても無反応です。
FormのOnCreateに書いているのが悪いのかと思い(∵まだListViewがCreateされていないため
OnShow部に書いてみても同じ結果です。

以下、その他の関係ある部分です

private
procedure DropFiles(var Msg : TWMDROPFILES); message WM_DROPFILES;

procedure TDupForm.DropFiles(var Msg : TWMDropFiles);
var
FileName : array [0..255] of char;
ListItem : TListItem;
begin
DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
ListItem := ListView1.Items.Add;
if FileExists(FileName) then
ListItem.Caption := ExtractFileDir(FileName)
else ListItem.Caption := FileName;
ListItem.SubItems.Add('hoge');
DragFinish(Msg.Drop);
end;
この部分は弄ってません。
メッセージをきちんと受け取れてないのだと思いますが
解決の仕方が分からないので、教えてください。
Form で WM_DROPFILES を受け取れるわけないだろ。LISTVIEW1 で受けとらなきゃだめ。
>>880
2chではそうらしいね。でも >>864>>867 程度でそういわれるとオチョクッテルみたいに感じる
イム にしたら?
>>868は便乗だからより一層不愉快
886864,867:04/08/29 00:38
同一人物です。
いや、ほんとに助かったので。俺にとっては神そのものです。
887863,866:04/08/29 00:39
まちがえた。885は864と867です。
>>881
TListView の WindowProc で受け取りなさい。
>>888
「ありがとうございます。」ってついてるね。これがあるだけでずいぶん雰囲気が変わる
超神だの鬼神だのやりすぎだと思うがw
>>889
ありがとうござまいす。
>ござまいす
>ござまいす
894デフォルトの名無しさん:04/08/29 01:51
すいませんが質問です。
DBGridのセルの文字数制限をかけようとしています。
cdsの各フィールドのSIZEを指定できればうまくいきそうなんですが、
コードでcds.FieldbyName.Size に値を入れると「cdsが既に開いてるぞゴルァ!」
とエラーが出てしまいます。考え方がいけないのか別のやり方があるのであれば
おしえてくださぃ・・・

Delphiに「フォルダを選ぶ」のダイアログってあったっけ?
>>895

>>355をヘルプで調べよう。
>>888
神から超神に格上げされた挙句に神の申し子に格下げされたのにワラタ
語彙が尽きたんだろうな・・・
>>895
こんなのがあったとは知りませんでした(本でも見かけたことないし・・)
勉強になりました。ありがとう。
レス番間違えた・・。898は896さんへ
ボタンのイベントなどにコードを書いて
そのボタンを削除してもコードが残りますが
そのコードを自動で削除してくる機能はありませんか?
コードの中身を消せ。
beginとendの間になにも書かなければコンパイルのときに自動で消える。
上書き保存したときや別のイベントにコード書くときも消えるよね
消えるのはDelphi自身だよ
Delphiは永遠に不滅です
「永遠に不滅」って、「馬から落馬」みたいだって思わないか?
Delphiはあと二年間は不滅です
ユーザが消滅
メッセンジャー、アンチウィルスなどで画面の右下に
ひょこっとメッセージが出ますがあれをdelphiで作れますか?
バルーンのやつ?
DelphianWorldにコンポあるよ >バルーン
>>907
俺がいるよ(^^)ノシ
>>905
落馬するのは馬とは限らないじゃないか
鼻血が出血。
うんこを排便。
精液を射精。
TQueryでSQLのinsert intoを使おうとすると、この機能は使用できません
とか言われちゃうんですけど、使えないんですか?それとも何か設定
間違ってるんですかね?
ファイル名をバイト単位で取得するのはどーするの?
>>915
ごめん、分かんないな。自分でも良く分かってない。
あ だったら82 A0だよね。そう言う風に全角をバラしたいの。
918914:04/08/30 19:07
実行させようとしているSQL文は、あるテーブルの
レコードを、主キーを書き換えてコピーするという
ものです。こんな感じ。(主キー001のレコードを
000に書き換えてコピーする場合)

INSERT INTO Table(Code,Name,Address)
SELECT '000', Name , Address
From Table
Where uCode= '001'

InsertとSelectを組み合わせて使えないとか、そういう
話ですか?SQLの文法的にはあってると思うんですけど。
>>917
「ファイル名」に限らないですよね。AnsiStringに代入して、普通にs[1]やs[2]でアクセス。
>>914
オレもそのエラー文に苦しめられたなぁ・・
丸一日(本当に一日)試行錯誤を繰り返した挙句、
いつの間にか解消してしまって、解決策はもちろん原因すらわからなかったという・・
>>919
ありがと。それで添え字バイト目にアクセスできるのは分かったけど、
あ を 82A0みたいに表示させる方法が解んないや(´▽`*)アハハ
いくらでもありそうな気がするけどな。
IntToHexとかFormatとか
StrByteType
924923:04/08/30 19:45
あ、なんかすごく的はずれな解答した予感。
Delphi用メール送信コンポーネントありませんか?
パスワードをiniファイルに保存したいのですが
よい暗号化の方法ないでしょうか?
>>922-923
ありがと〜。できますた。
>>926
そのアプリでパスワードチェックを行うだけならMD5とかでハッシュ値に変換しとけばいいし
FTPとかのパスワード入力を自動化するんであれば内部で共通キー使って暗号化するしかない。
>>928
自前で暗号化しとけばいいですか?
xor演算とかでいいですか?
MD5ハッシュがいいと思う
931|Д・彡 ◆A6VzDeLphI :04/08/30 23:52
procedure TForm1.Button1Click(Sender: TObject);
var
 Socket: TClientSocket;
begin
 Socket := TClientSocket.Create(nil);
 try
  Socket.ClientType := ctNonBlocking;
  Socket.Host := '202.239.72.116';
  Socket.Port := 80;
  Socket.Active := True;
  Socket.Active := False;
 finally
  Socket.Free;
 end;
end;

'connect'API でWindows ソケットエラー: (10049)
が出るのですけど、どうすれば接続出来ますか?
Socket.Address := '202.239.72.116';
で接続できました。
>>931
ありがとうございます。やってみます。
935908:04/08/31 08:47
さっそく試してみました。
希望の動きができました。
ただ、このアニメーションしたウィンドウが消えてくれません。
OnActiveにCloseを書いてみたのですが例外エラーで落ちて
しまいます。どこで消したらいいのでしょうか?

procedure TForm2.FormCreate(Sender: TObject);
begin
self.Left := Screen.Width - self.Width;
self.Top := Screen.Height - self.Height;
AnimateWindow(handle, 500, AW_SLIDE + AW_VER_NEGATIVE);
Sleep(1000);
AnimateWindow(handle, 500, AW_HIDE + AW_VER_POSITIVE);
end;
至極初歩的な質問で恐縮ですが
(AA、BBともTStringList)
AA[i] := BB[i]; i := i+1;
を特定の文字がAA[i]に含まれるまで繰り返すコードと、BBの要素があるだけ繰り返すコードを教えてください
BB[i]に含まれるまで の誤りでした
938908:04/08/31 09:31
消えました。
しかし、少し消えるときに一瞬表示されるのか
ちらついてしまいます。
もっと良い方法はないでしょうか?

procedure TForm2.FormCreate(Sender: TObject);
begin
self.Left := Screen.Width - self.Width;
self.Top := Screen.Height - self.Height;
AnimateWindow(handle, 300, AW_SLIDE + AW_VER_NEGATIVE);
Sleep(500);
AnimateWindow(handle, 300, AW_HIDE + AW_VER_POSITIVE);
close;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end;
>>936
VBでやったほうがいいよ
VBではできませんでしたよ
>>938
Sleep を使ってるからだと思います。
メインスレッドで Sleep を使うと止まってる間メッセージ処理ができなくなります。
タイマーの呼び出しで閉じるようにしてみてはどうですか?
>>936
要件の通りにコードしてみたけど、そのままだと使い物にならないと思う。

// 特定の文字が BB[i] に含まれるまで繰り返すコード
// 特定の文字が含まれる前に i が少ない方の要素数に達した時点で例外
while AnsiStrScan(PChar(BB[i]), 文字) = nil do
begin
AA[i] := BB[i];
i := i+1;
end;

// BB の要素があるだけ繰り返すコード
// AA の要素数が BB よりも少なければ i がそれに達した時点で例外
var J: Integer;

for J := i to BB.Count - 1 do
begin
AA[i] := BB[i];
i := i+1;
end;
943908:04/08/31 11:58
>>941
完璧です。ありがとうございます。
944908:04/08/31 12:53
動きは完璧なのですが、そのフォームにラベルが表示できません。
PRINTCLIENTで書けというようなことを見たのでやってみたのですが
表示されません。どこが問題なのでしょうか?

procedure TfrmMessage.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_PRINTCLIENT then
begin
self.Canvas.TextOut(0,0,'hello world');
Handled := True;
end;
{ 他のメッセージに対しては Handled は False のままでおかれるので,}
{ 他のハンドルが処理することが可能となる}
end;
945908:04/08/31 13:14
すみません。できました。
ここは一人漫才のスレか?
947|Д・彡 ◆A6VzDeLphI :04/08/31 14:12
Sleepの代わり

procedure SleepProcessMessages(Milliseconds: Cardinal);
var
 StartTime, NowTime: Cardinal;
begin
 StartTime := GetTickCount;
 while true do
 begin
  NowTime := GetTickCount;
  if Milliseconds <= (NowTime - StartTime) then
   Break;
  Application.ProcessMessages;
 end;
end;

ただし、連続で呼び出すと挙動がおかしくなります。
948908:04/08/31 14:14
できたと思ったのですが、メインウィンドウが非アクティブの時に
描画されません。なぜでしょう?
949908:04/08/31 14:19
あと、親フォームを最小化すると子フォームも一緒に最小化されてしまうのですが
最小化されないようにできないでしょうか?
var InSleepProcessMessages;

procedure SleepProcessMessages(Milliseconds: Cardinal);
var
 StartTime, NowTime: Cardinal;
begin
 if InSleepProcessMessages then Exit;
 InSleepProcessMessages := True;
try
 StartTime := GetTickCount;
 while true do
 begin
  NowTime := GetTickCount;
  if Milliseconds <= (NowTime - StartTime) then
   Break;
  Application.ProcessMessages;
  Windows.Sleep(1);
 end;
finally
 InSleepProcessMessages := False;
end;
end;
951デフォルトの名無しさん:04/08/31 14:58
>>942
エラー リストのインデックスが範囲を超えています(1)が出ました
BBには'文字'が入った行は確実にあります・・どこがおかしいのかわかりません、助言お願いします・・・
>>951
まさかとは思うが、

begin
 AA.Add(BB[i]);
 i := i+1;
end;

で巧くいったりしないか?
>>952
ぬおおおおおお 巧くいきました。ありがとう
かなり知識不足なんで入門サイト片っ端から読んできます
>>948
AnimateWindow の後に次の一行を入れてみてください。
InvalidateRect(Handle, nil, False);

ラベルには TLabel を貼ってもいいし、カスタムペイントが必要なら
OnPaint イベントを使ってください。

>>949 については申し訳ないですがよくわかりません。
下手すると TForm を使ってる時点でアウトかも。
955908:04/08/31 16:05
>>954
パーフェクトです。ありがとうございます。
>>951
AAに何も文字が入っていないなら、
リストに有効なインデックスは存在しない。
だからアクセスしようとするとEStringListError例外が発生する。


それと、>>942の、文字列中に文字があるかどうかの判定で、
BBに格納されている文字列には全く含まれていない「文字」を
指定した場合はどうなるかな?
これも「リストのインデックスが範囲を超えています」EStringListError例外が発生するんじゃない?

漏れがテストしてみたら例外が発生した。

i := 0;
while AnsiStrScan(PChar(BB[i]), 文字) = nil do begin
 AA.Add(BB[i]);
 i := i+1;
 if i >= BB.Count then Break; // 追加
end;

などとすると、とりあえずうまく行く。
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
つか、AA, BBという変数名がコードを読みにくくしてる気がする
あるファイルのアドレス$200から$300の部分(画像データ)を
メモリーストリームにうつすにはどうしたらいいでしょうか?
どうもよく分からないのでご教授お願いします(汗
TMemoryStream.LoadFromFileでファイルを開いて
$200にSeekすればいいじゃん。
Seekですか・・・
ちょっと調べてみます
いや・・なんならposition:=$200でも
>>959

procedure TForm1.Button1Click(Sender: TObject);
var
fromMS,toMS:TMemoryStream;
begin
fromMS := TMemoryStream.Create;
toMS := TMemoryStream.Create;
try
fromMS.LoadFromFile('C:\sample.txt');
fromMS.Position := $200;
toMS.SetSize($300-$200+1);
fromMS.Read(toMS.Memory^,$300-$200+1);
Memo1.Lines.LoadFromStream(toMS);
finally
fromMS.Free;
toMS.Free;
end;
end;
>963
できました
ありがとうございます!!!
くだらない質問につきあっていただいてすいませんでした
965デフォルトの名無しさん:04/09/01 00:59
Delphi5Pro Win2000,Oracle7.3でデータベースにアクセスしようとしているのですが、
起動するたびに毎回パスワードの入力を求められてしまって悩んでいます。
ttp://www.eva.hi-ho.ne.jp/shinnai/Oracle7/ODBCAutoLogin.html
を参考にしてレジストリにパスワードを入れたり、
Query1.param.Add('password=abcdefgh');
などとやってみましたが、駄目でした。
データベースにアクセスする為のパスワードを記憶させる方法は無いでしょうか?
DirectOracleAccessを使いなされ。
967デフォルトの名無しさん:04/09/01 01:22
>>966
レスありがとうございます。
純正のソフトだけでは出来ないのでしょうか?
>>963 は全ファイルをメモリに読んでコピーしてるのでファイルサイズが
大きいと失敗しますし、メモリが無駄かと思います。
読み出し側のストリームは TFileStream を使うことをおすすめします。

procedure TForm1.Button1Click(Sender: TObject);
var
  ToMS: TMemoryStream;
  FromFS: TFileStream;
begin
  ToMS := TMemoryStream.Create;
  try
    FromFS := TFileStream.Create('C:\sample.txt', fmOpenRead);
    try
      ToMS.SetSize($300 - $200 + 1);
      FromFS.Seek($200, soBeginning);
      FromFS.Read(ToMS.Memory^, $300 - $200 + 1);
    finally
      FromFS.Free;
    end;
    Memo1.Lines.LoadFromStream(ToMS);
  finally
    ToMS.Free;
  end;
end;
>ファイルサイズが大きいと失敗しますし、

ファイルの末尾を読みたいときはどうするの?
ああ、バッファリングされてないから無問題か。スマソ
>>965
TDatabaseを貼り付ける
エリアスをお望みのDBに設定。
Paramsにユーザー名とパスを入力。
972965:04/09/01 06:46
>>971
ありがとうございます。やってみます。
新スレ立てました。

くだすれDelphi(超初心者用)その18
http://pc5.2ch.net/test/read.cgi/tech/1093996761/
procedure Encrypts(var Buff: PChar; Size: integer; PassWord: string);
この関数を使いたくBuffにText1.Textを渡したいのですが
どのようにわたせばいいのでしょうか?

Encrypts(PChar(Text1.Text), Length(Text1.Text), 'pass');
とやってみたのですが
変数パラメータに定数オブジェクトを渡すことはできません。
というコンパイルエラーが出てしまいます。
よろしくお願いします。
> var Buff: PChar;

なんで PChar が参照わたしなんだろうか? へんなの
> 変数パラメータに定数オブジェクトを渡すことはできません

このとおりだろな。

var
 pc:PChar;

としておいて GetMem() で適当に確保して渡せばいいんじゃないの
>>975
ポインタのポインタになるし、なんでだろうね。プロシージャ内で確保してるとか?
それにしても Size を設定してるし、ありえないか。
暗号化した戻り値があたらしい値で PChar で返ってくるとか。でも Size は var じゃないんだよなー
変数パラメータにはプロパティを渡すことは出来ません
var s : string;
s := Text1.Text;
Encrypts(PChar(s), Length(s), 'pass');
980979:04/09/01 11:58
リロード忘れorz
>PassWord: string

なんだから、なぜ var PChar なのかは、戻り値が入っていそうだな var String でも
いいようなきがするが
ぐぐって2番目にでてきたこれだろうな
http://homepage3.nifty.com/m-and-i/tips/criptogram.htm
983974:04/09/01 13:37
>>982
それです!
横やりかもしれんけど、DSPとかでも暗号化のunitが山ほどでてくるよ。
うまくいかなかったら、そういうの探してみるのもいいかも。
ま、フリーかどうか、商利用可かどうかとか、問題はあるのかもしれんけど。
985974:04/09/01 13:54
DSPって何ですか?
http://community.borland.com/homepages/dsp/
使用してるDelphiバージョンのEncryptリンク参照。

Delphiのバージョンについては作者確認のバージョンなので、
Delphi5用でも、そのままか少しの手直しでDel7でも動作することもあるよん。
例えばテキストファイルを読み込んでソートするだけのアプリなんかでは
起動時に読み込んでおくのと、OKされて処理するときに読み込むのと どちらが良いんでしょうか
後者
早っ ありがとうございます
理由は先に読む込むとキャンセルしたとき無駄になることと
読み込み、ユーザー入力、本処理
よりは
ユーザー入力、読み込み、本処理
の方が読み込みと本処理が近くなるので読みやすくなる(可能性がある)から。
ローカル変数のboolean型の中にはデフォルトで何が入ってるのか気になっています。
Trueでもfalseでも無いという事は実験でわかったのですが、では一体何なんですか?
>>991
おおっ、わたしと同じことを・・

わたしの調べでは、TrueでもFalseでもない謎の値が入っていて
その値はそのときによってまちまちでしたよ。
ローカル変数は宣言だけでは初期化されません。だから気にしても無意味
>>991
Boolean に限らず明示的に初期化されない変数は、その変数を確保した場所
(メモリ、レジスタ) に元から入っていた値になるのでは?
False→ビット内がすべて0
True→それ以外

じゃないの?

procedure TForm1.Button1Click(Sender: TObject);
var
 Flag: Boolean;
 B: Byte;
 i: integer;
begin
 Flag := True;
 for i := 1 to 255 do begin
  B := i and $FF;
  Flag := Flag and Boolean(B);
 end;
 if Flag then MessageBox(Handle, 'Trueだったよ', 'Boolean型', MB_OK);
end;

でテストしたらメッセージボックス出るけど。

>>991
関数内で定義したローカル変数(上の例だとFlag、B、i)は、初期化されていないと考えましょう。
使うなら自分で明示的に初期化してから使わないと危険です。
ありがとうございました。
クトゥルーでも眠ってるのかとビクビクしてました。
>>995
procedure TForm1.Button1Click(Sender: TObject);
var
b: boolean;
begin
case b of
True:Button1.Caption := 'True';
False:Button1.Caption := 'False';
else
Button1.Caption := 'unknown';
end;
end;

を試してみるとTrueでもFalseでもないことがわかる。
not演算子を使ってもやっぱりunknown
ByteBool 型,LongBool 型,または WordBool 型の値は,順序値が非ゼロの場合に True と見なされます。Boolean が期待される状況でこれらの値が使用された場合,コンパイラは順序値が非ゼロの値を自動的に True に変換します。
999
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。