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

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

<前スレ>
くだすれDelphi(超初心者用)その16
http://pc5.2ch.net/test/read.cgi/tech/1089779142/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
>990 :デフォルトの名無しさん :04/08/05 10:41
>>>987
>何という関数でしょうか?
>いまいちWindowsAPIというのが分かりません。。
>Delphi システムコールでググってるんですが。。
>
>992 :デフォルトの名無しさん :04/08/05 10:55
>だから、システムコールです。
>Cでいうsystem()みたいなのを

システムコールとは、言語の標準ライブラリではなくて、OSの機能を直接呼ぶわけです。
例えば、Windowsにはsystem()はありませんが、UNIXにはsystem()があります。
Windowsの場合はWindows APIのことになります。
>>3
はい。
それで、WindowsAPIの中のどの関数を使えばいいのでしょうか。
WindowsAPI コールとかで必死に調べてるんですが・・・
>>4
つまり、UNIXのsystem()と同じ機能、プログラムの起動を行いたいわけね?

なら、ShellExecute or CreateProcess or ...
Delphi標準関数でもあったと思うが。
>>5
プログラムの起動ならそれで分かるのですが。
perl example.pl
taskkill /F /IM example.pl
というようなことをやりたいので、その関数では出来ないと思うんです
>>6
CreateProcess
>>7
フルパスでしかできないじゃないか、と思ったんですが
第二引数のほうに書けばうまくいきました。
どうもありがとうございました。
AnsiReplaceStrとStringReplaceはどう違うのでしょうか?
単にTReplaceFlagの有無でしょうか?
10デフォルトの名無しさん:04/08/05 12:58
ファイルの関連付けはどうやってやりますか?
>>10
yahooで「ファイル 関連づけ delphi」で検索して
上から二つめのリンクのところでどお?
12デフォルトの名無しさん:04/08/05 13:17
thax>>11

レジストリいじるんですね、OKでつ。
専用APIがあるのかと思ってました。
13前スレ972:04/08/05 13:39
>>974-975
ありがとうございます。参考になりました。
いろいろと考えて作って見ます
>>13
そして公開しる(・∀・)
>>9
名前が違いますxp
Delphiからバッチファイルを呼び出したときに
DOSに表示される

「コマンドまたはファイル名がちがいます」

などの結果を表すメッセージを
EditやMemoコンポーネントに出力することはできるのでしょうか?
>>16
バッチのリダイレクト処理でメッセージをファイルにして保存して、
それをDelで読み出すとか。

リダイレクトの内容をバッチの変数に入れて、終了後に
呼び出し元(Del製アプリ)に実行結果として渡すことって
できるんだろうか?
>>16
テンポラリファイルにリダイレクトしてコマンド終了後に読み出し。
探せばコンポーネントもあるけどな。
19デフォルトの名無しさん:04/08/05 16:30
databeseのソフトに初チャレンジしているのですが、
D5proでOracle7.3に接続するソフトを作れますか?

tcpを使ってdatabaseにアクセスしようと思っているのですが、databasenameに
\\198.1.1.1\
などと設定してもディレクトリエラーになります。

やり方を教えていただけないでしょうか?
参考になるサイトを教えていただくだけでも結構です。
delphi acidというサイトを見つけたのですが、database関連はいくつかあったのですが
tcpがらみが無かったもので。fdelphiにも無いでした。
変な質問でしたらごめんなさい。脳内補完してください。
普通にIP指定でODBCに登録して、それに対して
接続してあげればいいんでないの?
Oracle7.3って、まだサポートされてんだ(驚)
2419:04/08/05 17:22
>>20
このサイトは知りませんでした。色々と見てみます。ありがとうございます。

>>21
すみませんが、できたらどのコンポを使ってIP指定でODBCに登録して接続するかを
教えていただけないでしょうか?

>>22
実はもっと古いのもありまつ。。。
そっちは諦めてまつ。。。
>>24
Oracleの事が全く分かって無い気が・・・

とりあえず
http://www.dotfoward.jp/DB/Oracle/OracleIndex.html#Connection
SQLでしかやったことないが、コンパネ→管理ツール→ODBCで
オラクルが動いてるサーバにODBCで接続。
DelphiからODBCはDelのデータベース→エクスプローラから
接続すればいいんでないの?
27デフォルトの名無しさん:04/08/05 19:32
↑グロ
29デフォルトの名無しさん:04/08/05 21:12
前スレでコンパイルエラーのメッセージを別ファイルに写せないか
聞いた者です。
どなたかご存知ないでしょうか。
右クリック→メッセージの保存
右クリックして保存できるんじゃね
>>29
エラーメッセージを右クリックして、
メッセージの保存

Delphi7 Professionalはこれで上手く行くけど・・・
プログラム実行中に
処理を2秒間止める(待つ)にはどうすれば良いでしょうか?
sleep
>>33
sleepすると、他の処理まで止まってしまうんですけど・・・
という質問をエスパーが感知してTThreadを使えとおっしゃっています。
36デフォルトの名無しさん:04/08/06 00:12
PaintBox1.Canvasを青と白のビットで埋める処理はどのようにするのでしょうか
Brush.Style := bsDiagCross で目の大きさを変えたり出来ればと思ったけどだめでした。
scanlineでポチポチ打ってけば?
38 :04/08/06 00:21
「application.ProcessMessagesを使った手続きを作る」に1票。
t := timeGetTime;
While timeGetTime-t > 2000 do
begin
end;

・・あほだな俺
>>38

>>35
へね。

検索すればサンプルあるから。
4136:04/08/06 00:56
>37
>scanlineでポチポチ打ってけば?

TPaintBoxには無いようなのでTbitmapを作ってコピーするってことでしょうか
scanline Help見てもいまいちわかりませんでした。
座標がかえってくるらしいのでその座標にたいして色を塗るってことなのかな
ちょっと調べてみます。

ありがとうございました。
>>40
ループしてるわけじゃなくてsleepしてるのに、
どこでメッセージポンプを起動すればいいので?
t := timeGetTime;
While timeGetTime-t > 2000 do
begin
 Application.ProcessMessages;
 Sleep(1);
end;
なんてのが現実的な使い方なんじゃないの。
考え無しにやるとバグるけど。
2秒間またなければならない理由がわからんと
ProccessMessagesとTThreadのどっちがいいか
わからんね。
t := timeGetTime;
While timeGetTime-t > 2000 do
begin
 Application.ProcessMessages;
 Sleep(1);
end;



何やってんの、コイツ
>>45
アホには分からないらしいので一応解説。
2秒間スリープし続け、なおかつメッセージループを処理し続ける(画面が固まらない)。
ループ中でSleepはなくても動作は同じだけど、OSの負荷を低減するためのもの。
Timerとの違いは同一イベントハンドラ内に処理を記述できること。
>>46
Sleep(1); する意味は?
4847:04/08/06 01:20
ああ負荷低下になるのか
横やりごめん。
>>46
処理待ちが必要で、その間にユーザにクリックとかさせたくない
場合は(砂時計とかだして)そのまま待たせる。
ユーザがいじってもよい場合は、メインスレッドとは別のスレッドや
タイマーで処理するのが普通でしょ。

processmessagesは、単純にループ中でのフリーズ状態を解決
するだけの短絡的な解決法だし、それだとループ中にフォームの
ボタン等を押してもいいのか、それとも押しちゃいけないのかわかり
にくい。
>>41
Canvas.Brush.Bitmap にビットマップを割り当てて FillRect すればいい。
ただし Windows 95 の場合、8×8 以内でないといけない。
>>49
>普通でしょ。
質問者が具体的に聞いて無いのに「普通」もなにも無いだろ。
質問に対する俺の応えは>>34で終わってるよ。
最適解がスレッドって事はまず無いと予想してるけどね。
>43は>42へのレスだよ。
Sleepってメッセージ処理しなかったっけ?
普通にsleep(2000)でいいような気がするが
>>52
試してみろ数秒で確認できるだろうから
おいおまえら、Delphiはもう、終わったんだよ
>>45
なんでループのなかでsleepやってんの?
基地外だろ
朝から暑いな
>>55
ネタならメル欄にそう書いてくれよ。
TListViewのvsReport形式にて、ユーザーに行を選択させて、削除
ユーザーがなにも選択していないときはなにもしないと言う動作をしたいのですが

TListView->Selected->Indexを呼び出して、インデックス番号を取得しようとしたら
ユーザーが選択しているときは問題ないのですが、ユーザーが何も選択していないときは
ここで例外が発生します。

なんとかしてユーザーが行を選択している、いないを見分ける方法はないでしょうか?
>>58
selectedがnilじゃなかったらIndexを取得。
nilだったら-1を返すとかすれば?
>>55
条件判断の回数を減らすことができるし
CPUを一瞬だけ休ませることができる
一瞬休むかどうかでCPU使用率は大きく変わる
ループに速度は要求されてないから問題ない
そして固まらない
IntegerとLongInt、
CardinalやDWORD,LongWord,UINTの違いって何ですか?
ヘルプにはInteger,Cardinalが効率的だ、みたいな感じで書いてますが
それなら他のやつは何のためにあるのですか?上位互換?
使い分けが必要なものなんでしょうか?
もし必要なら、どのように使い分ければいいのかも教えてください。
>>61
IntegerとCardinalはビット数がOSに依存する。

8ビット:ShortInt,Byte
16ビット:SmallInt,Word
32ビット:LongInt,LongWord
64ビット:Int64

UINTやDWORDは上記に含まれる。
>>60
delのsleepはミリか。それなら納得
delのじゃない。winのsェエpだ
>winのsェエp

あたらしい技だな
>>43
uses MMSystem;

var
t: DWORD;

t := timeGetTime;
While timeGetTime-t > 2000 do
begin
 Application.ProcessMessages;
 Sleep(1);
end;

て書いてみたんですが
ウエイト処理になりません・゚・(つД`)・゚・
どこか間違ってるでしょうか
ずっと思ってたんだが、不等号が逆じゃないだろうか
(・∀・)ニヤニヤ
というか、メインスレッドでループ中にsleepなんてしないほうがいい。
CPUがかわいそうだろ
こういう場合は
sleep(0) とやるもんだと思ってた。
Delphiでobjファイルのようなものはありますか?
他のプログラムに埋め込みたいのですが・・・
>>72
dcuファイル
>>71
パフォーマンスモニタ見ながらで0と1の挙動を比較してみろ
75デフォルトの名無しさん:04/08/07 03:46
StringGrid の OnDblClick イベントで、ダブルクリックした位置のセルの
ACol, ARow を知る方法はありますか?
OnRowMoved
OnColumnMoved
のToIndexを変数に代入しておく
Delphiもobjファイルを出力できますよ。
>>72
プロジェクト(P)の
オプション(O)...で開く設定ダイアログの
「リンカ」タブの「リンク結果」で
出力設定ができると思います。
>>75
Col
Row
>>77
詳細きぼん
http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_omf.html
.objが吐けても役に立たない気がする…
素直にDLL作れ
>>81
確かに・・・たぶん下位互換性の為に用意されてる仕組みなのね
パフォーマンスモニタをベンチ代わりにしてる奴が居たとは・・・
恐ろしい世の中になったな
ComboBoxのEnterイベントにフォーカス時に自動ドロップダウンするようにしてます。
その時ドロップダウンした項目の上にマウスカーソルが重なってると
ComboBoxをFrameに乗せてる時とそうでないときでは挙動が違います。
Frameの時は何故かマウスカーソルに重なっている項目がComboBoxテキスト欄に
表示されてしまいます(ここではまだ選択された事にはなっていない)。
そうなるとEnterキーで移動させてるので変更に気づかずに決定してしまいます。
Frameは辞めれないのですが、何か良い回避方法は無いでしょうか?
8685:04/08/07 14:56
要するにFrame上のコンボが自動でドロップダウンした時にマウスカーソルが
項目の上に重なっていてもテキスト欄が変更されないようにして欲しいって事です。
>>86
いっている意味がわからんので、同じことやったかどうかわからんけど、
Frame上でもForm上と同じ動作ですた。Del7pro
バージョンによって動作違うんでしょうか。
D5なんですが。
俺はStyleがcsDropDownListのとき、FrameもFormも>>85みたいな挙動した。
>>89
ええっ・・・何か人によって違いますね
>>89
csDropDownListでもならんねぇ。
Tabキーで移動させてFocasあててるけど、質問者はもうちょっと
詳しく説明汁
Enterキーでカーソル移動中に
ComboBoxにフォーカスが当たると自動でドロップダウン。
「↑」がマウスカーソルとすると
______        ______
|       |▼|    ピロッ |b      |▼|
 ̄ ̄ ̄ ̄ ̄ ̄        | ̄ ̄ ̄ ̄ ̄ ̄|
                 .|a        |
   ↑            .|b■■↑■■. | ←選択状態
                 .|c        |
                 .|d        |
                  ̄ ̄ ̄ ̄ ̄ ̄
こんな感じです。stayleはcsDropDownListです。
AA書いてる暇があったらリファレンス嫁
んなことについて書いてないだろ
人によって色々ある見たいだから極単純に、
カーソルのx座標がComboBoxの両端の範囲ないだったら
Left - 1にカーソルを移動させるコードをドロップダウンイベントに書きました。
なんかダサいですが取りあえずこれで誤操作は防げそうです。
テストしてくださった方どうもです。
Delphiで作成したEXEファイルには、作成者を特定できるような情報が埋め込まれたりするのでしょうか?
例えば2つのEXEファイルがあるとして、ある程度詳しい人が解析したら
作成者が同じかどうか分かったりしてしまうとかそういうことはないのでしょうか。
>>96
とりあえずクラス名はそのまま入ってるそうだから
ユニークな名前をつけてたりするとわかるかもしれないね。

作成者○○なんてのは自分で入れない限り勝手に入ったりすることはないと思う
98A:04/08/07 23:01
Panelをドックサイトにしてドッキングを受け付けているのですが、
ドック中のオブジェクトが、ドラッグで外部に出された場合、OnUnDockで感知できますが、
ドック中のオブジェクトを、グラバのところにある、[X]ボタンで閉じる(隠す)と、
オブジェクトは消えるのですが、Panel側では、これを感知する方法はあるのでしょうか?

具体的には、Panelの上に、見えるオブジェクトが何もなければ、Panelを隠す(幅を0にする)
という処理を行いたいのです。
>>97
そうなんですか、ありがとうございます。
とりあえずあまり変わった名前は付けないほうが良さそうですね。
>>99
違法ソフトでもつくるのか?w
よほど有名にならないかぎりそんなもん調べるアフォはいないと思うがな…
一応念には念をw
心配性なので。
個人の特定は可能だけど、>>99には教えない方が良さそう。
try..exceptって慣れてくるとくせになるね。
いや〜便利便利
VC++のバイナリには個人名が入って危険だからな。(リリースビルドのデフォルト設定時)
またもやDelphiの勝利だ。
>>103
で?

>>104
いやあれは勝利とかではなく
ただ単に「流石だなビル」ってだけだろう(;´Д`)
色んな意味でありえないよあれは…
ListView_GetSubItemRectをつかってvsReport形式のTListViewの枠に棒グラフを塗る
ということをしているのですが、カラムの幅を更新しても棒グラフが長さを変えてくれません
(デフォルトの幅を短くすると、ぬったグラフが消えてしまう。幅を長くすると塗った棒グラフの長さはそのまま)
ListView_GetSubItemRectはカラムの幅変更は探知してくれないんですか?

だとすればどうすればカラムの幅に応じて塗る幅を算出できるでしょうか?
どなたか教えてください
>>100>>102
ぶっちゃけると、地味にフリーソフト公開してる裏で
激しくオタ臭いのを公開してるので同一ってばれるとへこむ(つд;)
>>107
それは厨房向けスクリプト言語作者として有名になっても同人エロゲを売ってるようなものか!?
>>96
[プロジェクト|オプション]バージョン情報で作者や著作権表示を指定できるからそこに設定してなければ大丈夫。
ただ一回でも設定してそれをデフォルトとして保存しておくと
別のプロジェクトでも勝手に設定されてしまうので注意が必要。
気になるならバージョン情報を確認しておいた方がいいかも。
>98
ドック中のオブジェクト側でならCM_VISIBLECHANGEDで消えるのは感知できるけど、
ドックサイト側ではワカランと思う。
ただドックサイトのAutoSizeプロパティをTrueにしとけば、勝手に隠れてくれるハズ。
111A:04/08/08 01:04
>>110
ありがとうございます。
やってみました。たしかに、AutoSizeで自動的に消えますね。
でも、そのままだと、Panelに連動してSplitterが消せない……
とおもったけど、Panelの、OnResizeで、Panelのサイズを見て、表示/非表示させることで
解決しました。

が…、PanelのAutoSizeがTrueだと、Splitterによるサイズ調整が効かないんですね。
そういえば、これが原因で、AutoSizeをはずしたんでした…どうしたものか…
CM_VISIBLECHANGEDで感知した時に、ドッキングしてる数が0だったら消す。
113A:04/08/08 01:31
>>112
CM_VISIBLECHANGEDって、どうやって感知すればいいのでしょうか…?
>>111
ドックサイト (Panel) に CM_DOCKNOTIFICATION が送られてくる。
これを検知して NotifyRec^.ClientMsg = CM_VISIBLECHANGED だったら
VisibleDockClientCount を調べて処理する。

Panel のメッセージを取るには Panel の WindowProc を付け替えたらいい。
新しい値を設定する前に元の値を保存して、付け替えた手続きの最後で
それを呼ぶようにする。
>104
冗談抜きで真実なら、どのへんに何が埋めこまれてるのか教えてホスィ…
>>115
スレ違いだから、他でやってホスィ…
>>115
デフォルトで VersionInfo や Manifest リソースが含まれている。
デバッグリリースには関連するファイルのフルパスが含まれている。
プロジェクトを保存するデフォルトのディレクトリは、
C:\Documents and Settings\ユーザー名\My Documents\Visual Studio Projects
118A:04/08/08 06:18
>>114
おお。うまくいきました! ありがとうございます。

とりあえず、こんな感じでやってみました。

procedure TForm1.PanelDocNotify(var Message: TMessage);
begin
if Message.Msg = CM_DOCKNOTIFICATION then begin
if Panel.VisibleDockClientCount < 1 then begin
Panel.Width := 0;
end;
end;

PanelWinProc(Message); // 保存しておいた元のWindowProc
end;

説明の内容より、だいぶ単純な判定しかしてないのですが、とりあえず、これで
ちゃんと動いているように見えます。
…これだと、なにか抜けてたりしますでしょうか?

NotifyRec がどこから来たのかわからなかったので…。
>>118
Message を TCMDockNotification 型にキャストする。
Client にはメッセージが発生したドッキングコントロール、
NotifyRec が指す DockNotifyRec レコードには元のメッセージの
Msg, WParam, LParam に相当する値が入っている。

この場合、TCMDockNotification(Message).NotifyRec^.ClientMsg が
CM_VISIBLECHANGED のときだけ応答すればいい。
NotifyRec が nil でないことを確認してから逆参照した方が安全。
120A:04/08/08 07:23
>>119
ありがとうございます。 こうしてみました。

procedure TForm1.Panel5DocNotify(var Message: TMessage);
var
 Pdn: PDockNotifyRec;
begin
 if Message.Msg = CM_DOCKNOTIFICATION then begin
  Pdn := TCMDockNotification(Message).NotifyRec;
  if (Pdn <> nil) and (Pdn^.ClientMsg = CM_VISIBLECHANGED) then begin
   if Panel5.VisibleDockClientCount < 1 then begin
    Panel5.Width := 0;
   end
   else begin
    if Panel5.Width = 0 then begin
     Panel5.Width := Form1.ClientWidth div 4;
    end;
   end;
  end;
 end;

 Panel5WinProc(Message); // 保存しておいた元のWindowProc
end;

前のだと、隠れた子コントロールが表示させられた時、に対応できてなかった…。
12119:04/08/08 17:47
>>25-26
レスありがとうございます。
>SQLでしかやったことないが、コンパネ→管理ツール→ODBCで
>オラクルが動いてるサーバにODBCで接続。
>DelphiからODBCはDelのデータベース→エクスプローラから
>接続すればいいんでないの?

データベースエクスプローラーからは接続できましたが、これをプログラム内で
利用するにはどうしたらいいでしょうか?
色々と検索しているのですが、データベースエクスプローラーに関するサイトが少ないので、
それ以上進展していません。
アドバイス、あるいは参考になるサイトがあったら教えてください。

ちなみに、ローカルに置いてあるデータベースに接続するぐらいは
本で勉強したので何とか出来ます。
>>121
本で勉強して何とかしろ
123デフォルトの名無しさん:04/08/08 19:01
DelphiってSQL Server 2005 (Yukon)と連携できますか?
VB 2005ではできたんですが。
>>123
来月発表のDelphi 9なら可能です。
12519:04/08/08 21:37
>>122
delphi DB&WebプログラミングとかDBが載っている本は買ったのですが、ローカルマシンのDBに
接続するやり方しか載ってないのですよ。
少なくとも書籍とネット、DelphiMLは色々と検索したのですが、分かりませんでした。
お手数ですが教えてもらえないでしょうか?
126デフォルトの名無しさん:04/08/08 21:58
任意のディレクトリにあるファイル名の一覧を取得したいんですがどうやったらいいのかさっぱりわかりません。どなたかお願いいたします。
>>125
ODBCドライバを設定して、外部DBに接続できているなら、外部もローカルもない。
あとはBDEやADOの問題。

BDEなら、BDE Administratorでエリアス作成して
TTableなどから、そのエリアスを使用するだけ。

ADOなら、接続文字列を作成して
TADOTableなどを使用するだけ
>>126
FindFirst
FindNext
FindClose
129デフォルトの名無しさん:04/08/08 22:51
>>128ありがとうございます。やってみます!
13019:04/08/08 23:07
>>127
ありがとうございます。やってみます。
131A:04/08/09 01:50
上のサイズ可変な自動的に閉じるドックサイトですが、いちいちコーディングするのは面倒なので、
コンポーネント化しています。
いろいろやっていて壁にぶつかりました…。

Align プロパティの値を制限するには、どうしたらいいのでしょうか?
alTop, apLeft, alBottom, alRight だけにしたいのです。

思いついた範囲では、その4つだけの型を作って、Alignプロパティを再定義。
書き込みメソッドで、本来のAlignに変換して書き込み…とやろうとしたのですが、
本来のAlignへのアクセス方法がわからない…orz
>本来のAlignへのアクセス方法がわからない…orz
Inherited Align
或いは TControl.Align では?
×TControl.Align
○TControl(Self).Align
>>131
>その4つだけの型を作って
これでも全然問題ないけど
型増やさないでwriteメソッドで設定値調べてalNone, alClientなら
デフォルト値(alTopとか)をセットというのもありかも。
>>131
部分範囲型を使ったらいいと思う。
例えば type TAlign1 = alTop..alRight;
このように定義した TAlign1 は inherited Align に代入できる。
>>134 が書いてるように write メソッドで範囲をチェックすること。
136A:04/08/09 05:19
>>132
Inherited ってそういう使い方もあるんですね。overrideしたときしか使えないものだと
思い込んでました。

>>134
その方法だと、オブジェクトインスペクタに設定できない(設定しても反映されない)項目が
表示されるのが、ちょっと…と思ったので。

>>135
その方法でやってみました。

type TAmDsAlign = alTop..alRight;
property Align: TAmDsAlign read GetAlign write SetAlign default alLeft;

procedure TAmDockSitePanel.SetAlign(Value: TAmDsAlign);
begin
if not(Value in [alTop..alRight]) then Value := alLeft;
inherited Align := Value;
end;

function TAmDockSitePanel.GetAlign: TAmDsAlign;
begin
Result := inherited Align;
if not(Result in [alTop..alRight]) then Result := alLeft;
end;

としたところ、うまくいきました。オブジェクトインスペクタの表示も、4っつのみになりました。
ありがとうございます。
137デフォルトの名無しさん:04/08/09 11:19
TWebBrowser 以外にウェブブラウザはありまつか?
無料のものが欲しいでつ。
ありまつ
教えて下さい>>138
140デフォルトの名無しさん:04/08/09 13:24
delphiでの通信プログラミングについて質問させて下さい。
今、PCとあるデバイス(イーサネット/RS-232C変換機)を
イーサネット(LAN)とRS-232Cケーブルで相互接続しています。
ここで、シリアルケーブル(RS-232C)のCD(Carrier Detect)信号を
PCのシリアルインターフェース側から発生させて、
CDがデバイスを通してPCのLAN側で検知できているかどうかのプログラムをdelphi
で作りたいのですが何から手を付けていいのか解らない状況です。
ここで、本来は
PC--イーサネット/RS-232C変換機--RS-232C機器
という構成にしたいのですが、RS-232機器がないため、ソフト的にチェックしたいために
上記のように相互接続にしました。

アドバイスの方を下さい。よろしくお願いします。
OSはXP Pro、delphiはversion5.0 Proです。
141A:04/08/09 13:47
>>140
まずはそのイーサネット/RS-232C変換機 とやらの詳細や、その変換機のドライバの情報を
調べて書くことから、始めてみたらいいとおもう。

ソフト側からは、LANポート経由で通信した内容が、ドライバで仮想的なRS-232Cに見える。
ってかんじなんだろうか…?

RS-232Cを扱うコンポーネントは、たしかあったはずだけど……みつからない…
あとで探してみよう。
142デフォルトの名無しさん:04/08/09 14:07
ピタゴラス整数判別のプログラム作りたいんだけど、
ぜんぜん分かんない。。。
ヒントでもいいから、教えてください。お願いします。
>>142
ピタゴラス整数とは何か?要件を述べよ
FillRectやRectangleが引数に与えたとおりのRectで塗りつぶしてくれません。
どうやらhDCを持つ範囲すべてを全部塗りつぶしてしまっているようなのですが…
これはいったいどうやったら指定のRect範囲で塗りつぶしてくれるのでしょう?

Rectの各値をいくら調整しても、小さくなってくれません。

Rectangleにおいては中を塗りつぶさずにPenで外枠をかくと指定どおりのRectで
外枠を書いてくれているのですが…
これでBrushプロパティを指定するとRectの範囲をはみ出して描いてしまいます。
145275:04/08/09 14:30
>>143
a^2+b^2=c^2を満たす、a,b,cの整数の事です。
それを求めるプログラムです。
>>143
http://www004.upp.so-net.ne.jp/s_honma/pythagoras/pythagoras.htm

ピタゴラス数、ピタゴラス三角形の方がヒット数が増えるね
コードみせて
>>144
コードみせて
数式が分かっているなら、あとは方程式を解くアルゴリズムを探せば良い
ニュートン法?
150140:04/08/09 14:37
>>141
レス有難うございます。
デバイスは以下のURLにある物で変換機のほかにルータとしての機能も付いています。
今PCのブラウザからデバイスの設定画面(ルータの設定画面の様なもの)に入り
CD信号のON,OFFが確認できるのですが、
これはシリアルケーブルの方を接続するとCDがON、離すとOFFになります。
どうやら物理的にはCD検知出来ているようです。

そこで、シリアルケーブルを繋ぐとCDがONしてあるアクションを起こすようにするために
delphiでCD信号監視プログラムを作ろうと思います。
こうすれば物理的にシリアルケーブルを接続したり離したりすれば
そのプログラムのテストが出来そうなので。
でも、肝心な実装するプログラムがわかりません。
TClientSocketコンポーネントなどを利用すれば出来ますでしょうか?

ttp://www.centurysys.co.jp/product/fa11/rindex_s.html
151142:04/08/09 14:38
>>149
アルゴリズム・・・。
わかんない。。。ごめん。。
>>151
コンピュータを使ってある特定の目的を達成するための処理手順。
アルゴリズムをプログラミング言語を用いて具体的に記述したものを
プログラムという。

153142:04/08/09 14:49
>>152
よくわかんないけど、とりあえず、3≦a<b≦100をみたすものをすべて打ち出せ。
って問題だから、打ち出せればなんだっていいと思う。。。。
>>153

procedure TForm1.Button1Click(Sender: TObject);
var
Ia,Ib,Ic,SumSq:integer;
rt:Extended;
begin
for Ia := 3 to 99 do
for Ib := Ia+1 to 100 do begin
SumSq := Ia*Ia + Ib*Ib;
Ic := Round(Sqrt(SumSq));
if SumSq = Ic*Ic then
Memo1.Lines.Add(Format('a : %d b : %d c : %d',[Ia,Ib,Ic]));
end;
end;
>>154

rt はいらない
156144:04/08/09 15:16
実はTListView内で棒グラフを表示したいので…
それをもとにAdvancedCustomDrawSubItemの部分に以下のようなコードを書きました。

ListView_GetSubItemRectマクロを使用して、棒グラフを表示させたい部分の
Rectを取得して。

Rect.Top = Rect.Top + 1;
Rect.Bottom = Rect.Bottom - 1;

として棒グラフの幅を調整
そして

//<注1>
Sender.Canvas.Pen.Color = clBlue;
Sender.Canvas.Rectangle(Rect);

とすることで、Rectの幅どおりに中が塗りつぶされていない四角形を書くことができました。

そして次に上記の<注1>の部分をそっくり以下のコードに入れ替えました

Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.Brush.Color := clBlue;
Sender.Canvas.Rectangle(Rect);

ところがRectを無視して、棒グラフが描画されるべき欄は真っ青になってしまいます…
Rect.Top = Rect.Top + 1;
Rect.Bottom = Rect.Bottom - 1;
をいくら調整してもその変更が反映される様子はありません…

いったいどうなっているのでしょう? どなたかアドバイスよろしくお願いいたします。

157142:04/08/09 15:18
うわああああああ、できたあああああああ!!!(・∀・)
154さん、本当にありがとう☆☆☆
>>156
DefaultDrawがtrueだからでは。
変更されたBrushを使ってデフォルトの描画をされてしまうからね。
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.Brush.Color := clBlue;
Sender.Canvas.Rectangle(Rect);
Sender.Canvas.Brush.Style := bsClear; // これを加えてみるとか
>>158
なるほど、わかりました!

>>159さんのコードで解決することができました!
西暦年号を入力するとその年が平年か、閏年かを判定するプログラムが作りたいんだけど、
わかりません。。。
どなたか教えてください。
お願いします。
>>161
IsLeapYear 関数
163161:04/08/09 15:37
IsLeapYear 関数を使わないでやりたいんですけど、
できますか?
できます
165142:04/08/09 15:40
すいません、、、再び質問なんですが、
ピタゴラス定数を満たすa,b,cが何組あるか、
その総数を出力するプログラムを作るには、
どんな関数を使ったらいいんですか?
それと、総数もメモの欄に出力することはできますか?
何度も質問すいませんけど、教えてください。。
>>163

http://www.echizenya.co.jp/mini/colum/uruudosi.htm

1.西暦年が4で割り切れる年は閏年とする。
2.西暦年が4で割り切れる年でも、100で割り切れる年は閏年としない。
3.西暦年が4で割り切れ、100でも割り切れる年でも400で割り切れる年は閏年とする。

これをコードで表現する
>>165

procedure TForm1.Button1Click(Sender: TObject);
var
Ia,Ib,Ic,SumSq:integer;
count:integer;
begin
count := 0;
for Ia := 3 to 99 do
for Ib := Ia+1 to 100 do begin
SumSq := Ia*Ia + Ib*Ib;
Ic := Round(Sqrt(SumSq));
if SumSq = Ic*Ic then Inc(count);
end;
Memo1.Lines.Add(IntToStr(count)+'個ありますけど');
end;
168142:04/08/09 15:51
>>167
たびたびありがとうございます。
本当に感謝感謝です!
169161:04/08/09 15:57
>>166
なるほど、ありがとうございます。
えーと、これをコードで表現しようとして、EditとBottunを一つずつ作って、
ShowMessageで閏年かどうかを示そうと思ったのですが、Edit1に入力した数字を
Bottun1のif文で使うにはどうしたらいいかがわかりません。。。
どうしたらいいのでしょう?
それとも、別の方法のほうが良いのでしょうか?
よろしくお願いします。
>>169
>Edit1に入力した数字をBottun1のif文で使うにはどうしたらいいかがわかりません。。。

なんだか文章がピタゴラスの人と同じですね。宿題をこの際かたずけるつもりですか。
文字列から数値に変換するには StrToInt() を使う。
整数のわり算のあまりを求めるには mod を使う。以上、ヒント

171142:04/08/09 16:04
断っておきますが、僕は169とは別人です・・・。
本当に・・・。
>>171
それは失礼。祈る健闘。
どうでもいいけど、日本語では「かた"づ"ける」だよ
どうでもいいけど、日本語では「かた"づ"ける」だよ"。"
17519:04/08/09 17:06
>>127
TTableのTableNameのドロップダウンリストを見ようとすると、Oracleに接続されていません。
と表示されてしまいます。

32bit Administratorではデータベースにきちんと接続できて色も変わっているのですがなかなか。
エリアスはドロップダウンリストから選択しているのでタイプミスなどは無いです。
>>175
テーブルへのアクセス権ってある?
177A:04/08/09 19:34
>>150
そのページによると、

>2.FA-21,FA-11を意識させない透過的な接続:
>
>FutureNet FA-21,FA-11を使ってもPC上のソフトウェアに変更は必要ありません。
>RS-232を持つ装置とPCとの間の通信は透過的(ソフトウェアから見るとFA-21,FA-11は存在しない)に
>おこなわれ、PC上のソフトウェアは PCの COM ポートへアクセスするのと同じインタフェースで
>実現できます。

って書いてあるね。

てことは、PCからは、それはイーサネットではなく、RS-232Cとして見えているはずだから、
Delphiのほうも、RS-232Cとして、扱ってやればいいんだと思う。

とりあえず、Delphian World ( http://home1.infonia.ne.jp/~delphian/delphi/ )の、
Networkのコーナーに、「Delphi4用 RS-232C 通信コンポーネント」ってのがあるのは
見つけた。
こいつが、Delphi5でも動くかどうか、とか、どうやって使うのか、とかは、私にはわからないので、
あとは、がんばって自力か他の人に聞いてみて。
17836,41:04/08/09 19:51
>37

やっと出来ました。
ありがとうございます。

TBitmapで書いたイメージをTPaintBoxに書き込みことは出来たのですが
Tbitmapが大きなサイズのとき、TPaintBoxに一部が表示されます。
スクロールバーで表示されていない場所を表示するようにしたいのですが
どのようにやるのでしょうか
179A:04/08/09 20:08
>>178
TPaintBox を TScrollBox に入れてみるとかかな?(未確認)
180178:04/08/10 00:05
>179

色々やってみましたが、TPaintBox と TScrollBox はくっつかないような気がします。
間違えていましたらすみません具体的に教えてください。
>>180
ScrollBox を貼り付けて適当なサイズに調整し、その中に PaintBox を
貼り付ける。
Bitmap のサイズを決めるときに PaintBox のサイズも変更する。
PaintBox が大きくなるとスクロールバーが自動的に出てくると思う。

描画は PaintBox の OnPaint イベントの中だけで行うこと。
描き直すべき領域は ClipRect でわかるので (座標の原点は見えている
部分に関係なくクライアント領域の左上)、その部分だけ描けばいい。
182デフォルトの名無しさん:04/08/10 01:37
delphiって2年後にはオープンソースになってる気がするけど。
TServerSocket で一定数以上のコネクションについて
拒否或いは受け入れをを遅延させるにはどうすれば良いのでしょうか
>>183
Close
TComboBoxのイベントにはMouseDownが無いのですが、上位クラスにはあります。
手軽にMouseDownを使えるようにするにはどうすればいいのでしょうか?
継承して、published にしたコンポを作るといいのでは
>>186
コンポーネントにすると大量に作り変えないといけないので、
現存のプログラムに追加する感じでコード上に書き足す程度の方法がいいのですが
そう言った方法ってないのでしょうか。
それなら、どんな方法でも大量に作り替えないといけないのでは?

そもそも TComboBox でどうして OnMouseDown イベントがほしいの? それも大量に?
いえ、Comboがマウスダウンを検知してくれればAPIとかでもいいんです。
ただ上位クラスから継承する簡単な方法があればいいなと思いまして。
ComboでMouseDownを検知する方法をググって見ると解決したらしい例が
1件だけあったけど今は見れないようで。
>>189
>Comboがマウスダウンを検知してくれれば

だから、なにをしたくて検知したいの?
>>191
あるのかないのか聞いてるんですよ。
ちょっとうざい。
193A:04/08/10 12:35
TComboBoxを継承したTMyComboBoxを作って、
フォームをテキストで表示、ソースとフォームの
TComboBoxを全てTMyComboBoxに置換。とかは?
194A:04/08/10 13:03
……191じゃないが、レスしないほうが良かったか…

何の為にやりたいのかがわかれば、
別の方向からの解決法があるかもしれない。

なんでわざわざ、不必要な情報隠蔽するんだ?
結局、損をするのは自分なのに。
前みたいに、「ある」とか「できる」だけの無意味なレスで埋まってるのがいいのか
>>192は元質問者とは別人だと思うが、最終的に何がやりたいかがわかれば
別回答が出てくる場合もあるから、詳細を書いた方がいいと思う。
196195:04/08/10 13:05
うわ、かぶったorz
>>192
結論から言えば簡単ではないがやろうと思えばできる。

Style が csDropDown または csSimple のコンボボックスは複数の
ウィンドウで構成される複合コントロールなので継承クラスを作らずに
実現するのは非常に難しい。

複合コントロールでない場合は型キャストで OnMouseDown に手続きを
割り当てるだけで可能なはず。
19819:04/08/10 13:50
>>176
マシンを再起動したらできるようになりました。
スマソ
〜がありますか?

if あるなら then
 その方法を提示;

if ないなら or 現実的でないなら then
begin
 直接的な解はないと回答
 while さらに別の方法が必要か? do
  一段階上位の要求を聞きだして、その方法を提示
end;
begin
バカな質問者は無視。
end;
>>199
>if あるなら then
> その方法を提示;

今回はここまでは行っている。でも、質問者はそれ以上に<簡単にできる>こと
を望んでいる。やりたいことがあるのは分かるけど、その目的を明らかにしない。
そういうのは無視が一番。
>今回はここまでは行っている。
行ってないだろ。いきなり別解に突入してる。
203デフォルトの名無しさん:04/08/10 14:15
>>137-139 もお願いします。
>>203
上は標準のWebBrowserのバグ修正版みたいなの。下はMozilla版
http://www33.ocn.ne.jp/~takoyakusi/delphi/UIWebBrowser/
http://www02.so-net.ne.jp/~rando/mozilla/

海外制のもあって2chブラウザ(確かぞぬ)で使ってたはず。
興味あるなら調べてみたら。
>>202
継承してコンポ作れってかなり一般的で単純明快でまともな回答じゃねぇか
どこが別解なんだよ?
先のことを考えずに設計したのが悪いんだろ?
超初心者スレだから設計が下手なのは仕方がないが、
情報隠蔽しながら、より簡単な解を求められても対処のしようがない。



まぁ、何はともあれ
あとは>>202が引き受けてくれるそうです。よかったですね^^
206デフォルトの名無しさん:04/08/10 15:19
DelphiとVB、どちらが可読性が高いですか?
Pascalの可読性は最高。
クラス派生による差分コーディングとthrowにより行数が少ないのに高機能安定動作。

VBのイベントハンドラコピペソースはサイアク。
>>207
オブジェクト・インスペクタ最高!!!
特にイベント
209デフォルトの名無しさん:04/08/10 15:35
Del厨ってどうしてそんなに釣られやすいんですか?
どうして愛する自スレをこうも容赦なく荒らせるんですか?
初心者なので分かりやすく教えてください。
209はゲラ
211デフォルトの名無しさん:04/08/10 15:39
502 :デフォルトの名無しさん :04/07/03 12:38
.NET 2.0 Betaを使ってみて、VCL.NETを使おうかと本気で検討中。
このスレにいる使ったこともなく語る人たちは信じられないだろう。

.NETライブラリの互換性って、クラス名、メソッド名が同じなだけで、動作はだいぶ違う。
いま1.1でできているものが、2.0でデザインが崩れたりチラツキが出たりしている。
修正したくてもクラスライブラリがsealedやinternal使ってて無理。
バージョンがあがるたびにこれほど変更されるくらいなら、VCLの方がマシ。
いや、VCLも.NET 2.0以降まで対応するという前提で。
>>211
VCL.NETヨサゲ
必死だな。(藁
>>213
砂漠で目玉焼きでも作ってろ(藁
聖火で焼いた玉子焼きってうまいのかな
Del厨って馬鹿ばっかり
MessageDlg('馬鹿でも使えるんだから仕方ないだろ!',mtWarning,[mbOk],0);
MsgBox "VBの方がはるかにマシ"
219デフォルトの名無しさん:04/08/10 16:00
何だ、この糞スレは?

VB超初心者スレに変更だ。
>>219
VB使いの方が人口多いし、そうした方が有意義だね
>>217-218
どう見てもMessageDlgの勝ち。
>VB使いの方
氏にました。
Del厨荒らすなよ。(ゲラ
D7ProにあるSpinEditって右寄せできない?
TSpinEditのCreateParamでES_RIGHTを追加してもだめだったんだけど。
>>224
エンプラ版ではできるぞ。もっと貢げよ。(ゲラ
226224:04/08/10 16:12
すみません。自己解決しました。
基地外が去るまで耐えよう。
227 = 基地外
アホアンチはほんと迷惑な奴だな。
228=229=手の内三重三重
いや、俺には229=230に見える
232A:04/08/10 16:43
オブジェクトインスペクタに表示されなくてもいいなら、
別に継承だけでコンポーネントとして登録しなくてもいいけどね
それが一番簡単な方法だと思う

フォームソースの方の書き換えがいやなら、
生成後にインスタンスをすりかえるとか。

ただ、先祖が公開していた物を、わざわざ隠してあるってことは、
そこには触れて欲しくないってことだろうから、
何らかの副作用が有るかもしれないけど。

あと、どうしても、既存のソースをいじりたくない、いじるのが面倒ってのなら、
継承も置き換えもせずに、やる方法も有るには有る。
ただし、継承を使う方法よりもずっと面倒で遠回りだけど
type TMyComboBox = class(TCustomComboBox)
  public property OnMouseDown;
 end;

TMyComboBox(ComboBox1).OnMouseDown := ...

でいけるよ。動作保証も推奨もしないけど。
VBに比べると面倒だな
そもそもなんでDelphiスレにまでVB厨がくるんだよ。
>>186
前に俺も悩んだんだけどDelphi広場で検索すると似た様なのが見つかるよ。
確かHalbowがレスつけてて神を感じたような記憶がある。
(;^ิД^ิ) < レス下さった方ありがとう御座います。
荒れてたのでちょっとへこんでました。

テストしましたら>>233>>236のサイト先のどちらの方法でも検知する事ができました。
夏らしい展開だったなw
239178:04/08/10 19:17
>179,181
ありがとうございます、そしてごめんなさい
TScrollBoxとTScrollBarを勘違い色々いじくっていました。

>181
>描画は PaintBox の OnPaint イベントの中だけで行うこと。
>描き直すべき領域は ClipRect でわかるので (座標の原点は見えている
>部分に関係なくクライアント領域の左上)、その部分だけ描けばいい。

ここの部分がよくわかりませんでした。
TImageでPicture.Bitmapに代入することでとりあえず目的は達成しましたが
もう少し教えてもらえないでしょうか
240デフォルトの名無しさん:04/08/10 20:31
ふー、やっとブビ厨が去ってせいせいした。w
241デフォルトの名無しさん:04/08/10 21:44
>>233のやり方はオブジェクトのフィールドのメモリ上の配置がリファレンスで規定されている以上完全に合法。
TCustomComboBoxで定義されたフィールド・プロパティにアクセスしている限り正しい動作が保証される。
何をもって「正しい」とするかだな。
そういう場合はふつー反例一つでで済むんだけどな。
>>239
PaintBox が ScrollBox よりも大きくなると PaintBox のうち
見えてない部分が発生する。それでも PaintBox.Canvas の座標の
原点は PaintBox の左上になるということ。
OnPaint イベントは WM_PAINT の呼び出しによって発生するが、
PaintBox に来る前に古くなった領域と PaintBox のクライアント
領域が重なり合う領域だけにクリッピングされているので、
ClipRect の外側は描画しなくてもいいということ。別に描画しても
まったく問題はないが、時間のかかる描画を行う場合、その部分を
省略することで高速化が図れる。
TImage は Picture が変更されるたびに Invalidate を呼び出して
Image 全体が古くなったことにするので、ドットを 1 つ打つだけでも
全部を描き直すことになる。
245デフォルトの名無しさん:04/08/11 02:17
ドライブが使えるかどうか判定したいんですが・・・
どなたかお願いいたします。
246A:04/08/11 02:49
>>245
GetLogicalDrives APIを使うといいらしい。
詳しくはここに。
ttp://homepage1.nifty.com/MADIA/delphi/Win32API/GetDrives.htm
247デフォルトの名無しさん:04/08/11 02:52
>>246
ありがとうございます!やってみます!
248247:04/08/11 03:21
>>246うまくできました!本当にありがとうございました。
Delphiでコンポーネントを使わずソケット通信をしたいのですが
コピペで使えるようなサイトないでしょうか?
WinSock使え。
BSD互換APIなら山のように転がってるだろ。Cだけど
>>250
いや、だからCなら知ってるの。
それをDelphiで書いてあるのがほしいの。コピペしたいの。
またあれてたんだなここ。
寧ろ返答者側が夏真っ盛りだな。
今日の肴は249か・・・
じゃあ、なにをuses句に追加すればいいかだけ教えて
255デフォルトの名無しさん:04/08/11 09:41
>>254
お前にはVBがお似合いだ
まだ〜
>>244
質問したものではありませんが、参考になりました。
TCanvas.ClipRect を有効利用する方法がわかりました。TImage よりいい感じ。

procedure TForm1.FormCreate(Sender: TObject);
begin
bmp := TBitmap.Create;
bmp.LoadFromFile('C:\WINDOWS\雲.bmp');
with PaintBox1 do begin
Top := 0;
Left := 0;
Width := bmp.Width;
Height := bmp.Height;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
bmp.Free;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
with PaintBox1.Canvas do
CopyRect(ClipRect,bmp.Canvas,ClipRect);
end;
DelphiからDirectXって使えないんですか?
259258:04/08/11 13:22
VBなら使えるのに
>>258
使えないんですか?って訊くのはどうして? 使えますか? じゃないの。
使えなさそうな情報でもあるの?
261デフォルトの名無しさん:04/08/11 13:50
ほら、VBと比べるとすぐにムキになる。(ゲラ
はいはい、無視して次どうぞ
VBとDelphi、どっちが優秀ですか?
>>263
VB厨からの視点
VB>>>Delphi>>∞>>263

Delphi厨からの視点
Delphi>>>VB>>∞>>263
優秀なアプリが多い方が勝ちです
数勝負なら圧倒的にVBだな。
267デフォルトの名無しさん:04/08/11 16:05
エディタの部分のフォントサイズを変えるにはどうしたらいいのでしょうか?
ツールのエディタオプションとかみても見つけられないのです。
ツールのエディタオプションで設定しとけ
>>267
Delのバージョンは
2005
昨日から単純なプログラミングで煮詰まってしまった。

TextOut(0, 0, '・'); // TCanvasへの「中黒」の描画

中黒がどうしても表示されない。
他の文字に置き換えると、
普通に表示されるのに。。。

こんなことって、ありえないですよね。
272自己レス:04/08/11 17:49
>>271
古いフォントを使ったのが原因でした。
中黒のないフォントなんて。。。

お騒がせしました。
ズコー(AAry
禿ワラ
275A:04/08/11 19:49
>>249
自分でコーディングせずに、コピペするぐらいなら、コンポーネント使ったほうが
楽だと思うのだけど…とりあえず、まじレスしてみる。

Delphi + WinSock でぐぐって最初にでてくるこのサイトでいろいろ解説されてるらしい。
ttp://www.asahi-net.or.jp/~nk2w-ishr/winsock0.htm

また、書籍では、「Delphi2 達人テクニック」という本に、詳しい解説があります。
名前からわかるように古い本なので、今でも手に入るかどうかはわかりませんが、
Indyを入れる前は、お世話になってました。
276A:04/08/11 20:03
>>258
こっちにも。

DelphiでDicectXは使えます。
VC++で使うのと同じように、DirectX APIを使って、使用することができます。

また、それより楽をしたい場合は、DelphiX というフリーのコンポーネント集があります。
ただし、少し古いので、対応がDelphi5まで、DirectX7まで、になっています。

この他にも、QuadrupleD、というフリーコンポーネントもあり、こちらのほうは、
新しいものもサポートされているようです。(私は使ってないので詳しいことはわかりません)
ttp://www-fu.magma.ne.jp/~hayase/dddd/
Char型の配列にString型の文字列を、
キャストして入れようとしたんですが入らない。。。
配列一つ一つに文字列を一文字ずつキャストして入れればいいと思うんだけど
やり方わかりません。
教えてエロい人!
Move(CharArr, PChar(str)^, Length(str));
>>277
procedure TForm1.Button1Click(Sender: TObject);
var
 CharArr: array[0..255]of Char;
 S: string;
begin
 S := 'ミ,,゚Д゚彡';
 StrCopy(CharArr, pChar(S));
 Label1.Caption := CharArr;
end;
280A:04/08/11 21:15
>>277
var
 c: array of char;
 s: String;
 i: Integer;
begin
 s := 'ABCとか適当に';

 SetLength(c,Length(s));
 for i := 0 to Length(s)-1 do
  c[i] := s[i+1];
end;

こんな感じかな?
forループの回数と、Char配列とString型の添字の値の違いに注意。
281A:04/08/11 21:16
スマソ、全然楽な方法があったのね…orz
>>278-280
みんなまとめてdクス!

>>277
元の文字列の長さが不定の場合は Move や StrCopy の代わりに
StrLCopy を使った方が安全。
SetString だろ。お前らアフォか?
お前がアフォ
286A:04/08/12 04:40
まだ、ドックサイトパネルを作ってます。ほぼ期待通りの動作をするところまで
いったのですが、一つなぞの現象が……

自作パネルのalignを、alTopかalBottomに設定して、
Formの上にclClientに設定したMemoを乗せただけのフォームをドッキングさせると、
自動的に表示されるグラバをつかんでも、ドック解除ができません。
なぜか、グラバにある[×]ボタンをダブルクリックすると、解除されます。

ドッキングに関係ありそうな部分だと…
自作パネルは、TCustomPanel より派生。
GetSiteInfo、DoDockOver、DoAddDockClient、DoRemoveDockClient の各メソッドを
オーバーライドし、CM_DOCKNOTIFICATION メッセージに反応するようにしてあります。
その他のコードは、表示制御関連で、直接関係無いと思うのですが…

実験のために、オーバーライドした、4つのメソッドの中身と、CM_DOCKNOTIFICATION メッセージ
のメソッドの中身を、inherited; を残してコメントアウト。
それでも症状は変わらず…。ということで原因はそれ以外。

alignが、alLeft、alRightの時は正常に動くので、どうやらグラバが縦長の場合にのみ
おかしくなっていそうなのですが…DockSiteなコンポーネントを作るにあたって、
DockSite := True; にする、以外に注意することって、なにかありましたでしょうか?
287A:04/08/12 10:11
…ためしに、思いっきり単純化してみたところ…

type
 TDSPanel = class(TPanel)
 public constructor Create(AOwner: TComponent); override; end;

constructor TDSPanel.Create(AOwner: TComponent);
begin
inherited;
DockSite := True;
end;

var DSP: TDSPanel;
procedure TForm1.FormCreate(Sender: TObject);
begin
 DSP := TDSPanel.Create(Self);
 DSP.Parent := Self;
 DSP.Align := alBottom;
end;

たったこれだけで、すでに同じ問題が起きてることがわかりました…orz

Createの、DockSite := True; をコメントアウトして、代わりにFormのほうで、
DSP.DockSite := True; すると、きちんと動くようです。
これはいったい………。DockSite := True; で何が行われているんだろう…。
DockSiteを設定したあと、Alignを設定すると駄目なもより
289A:04/08/12 11:03
>>288
おおっ、できました。

procedure TAmDockSitePanel.SetAlign(Value: TAmDsAlign);
begin
DockSite := False;
if not(Value in [alTop..alRight]) then Value := alLeft;
inherited Align := Value;
DockSite := True;

SplitterRePositon;
end;

こんな感じに、一度、False にしてから、Trueにすることで、正常に動くようになりました。
どうやら、DockSite := True の時に、その時点でのAlignを元に、ドックマネージャーの
生成が行われている、っぽい感じですね。
それなら、同じくAlignが変化している、alRightでは、問題が起きない理由に説明が
つきます。

ありがとうございました。
290デフォルトの名無しさん:04/08/12 15:35
Delphiって最新版の無償版ってもう出ないんですか?
VB2005のExpressが非常に優秀だったので比較したかったのですが・・・。
>>290
今のところ予定はありません。
>>290
VBにはもう勝てないので出しません。
>>290
無償版はドキュン・厨房を増やすだけだと言う事に気づきました。
そんなことない。VBには一度も無償版がなかったにもかかわらず(以下略
だれか291の予定を訊いたのか? おれの予定にもないけど
296デフォルトの名無しさん:04/08/12 16:11
すいません 質問させてください。
DelphiでTablet PC Platform Software Development Kit (SDK) v1.5
を使用してInkPictureを使ったアプリを作るにはどうすればよいのでしょうか?
ActiveXの取り込みは失敗しました(⊃д⊂)
297296:04/08/12 16:12
VBなら問題なくできるんですけど
298296:04/08/12 16:13
>>297
VBなら出来るように資料はあったのですが
どうしてもDelphiでやりたいんです;;

どなたかわかる方はいらっしゃいませんかね・・・;;
>>298
エラーメッセージを出せ
300296:04/08/12 16:56
>>299
コンポーネント>ActiveXコントロールの取り込み>
Microsoft Tablet PC Type Library, version 1.0

その後構築しコンパイルを掛けると

[エラー] MSINKAUTLib_TLB.pas(1045): 識別子の多重定義 : 'IInkDisp'
[エラー] MSINKAUTLib_TLB.pas(3247): 識別子の多重定義 : 'IInkDisp'
[致命的エラー] *****.dpk(36): 'MSINKAUTLib_TLB.pas' ユニットはコンパイルできませんでした

となりできません。
Delphi触ったばっかりでもう全然わからなくて;;
IInkDisp2に、名前変えるとか・・・
302296:04/08/12 17:07
>>301
今適当に名前を変えたところコンポーネントとして登録はできたのですが、
フォームに貼り付けるとエラーが出てしまい使えません;;

---------------------------
エラー
---------------------------
アドレス 00000073 でアドレス 00000073 に対する読み込み違反がおきました。.
---------------------------
OK
---------------------------

リネームする箇所を換えてもう少しやってみます
ActiveXコントロールの取り込みは「.pas」ファイル作ってるだけなんで、
既に使ってる人のpasファイル貰えば使えるよ。
その製品の会社の中の人か、使ってる人探したら?
304デフォルトの名無しさん:04/08/12 17:14
要は、VBなら問題なくできるのにDelphiではバグバグで駄目だってことだろ?
ocxによっては、VB専用の場合もあるらしい
BDNぐらいミロよ
Tablet PC SDK 1.5 interface units TabletPC SDK 1.5 API interface units, Delphi Funktions
が1分で見つかったぞ。
307296:04/08/12 17:28
>>306
それは既にDLしたのですが中に入っていたのはただ一つのテキストファイル・・・・
コンポーネントの容量も圧縮しても1Kとおかしいなぁと思っていたのですが・・・

以前にそれをDLした方がいれば助かるのですが作者のページもなぜか見れないし
どうにかなりませんでしょうか
308306:04/08/12 18:00
>>307
マジでいってんの?
interface unitの存在がわかったんだから、ググってみれよ。

http://www.pjh2.de/jediplus/download/index.php?l=en
309296:04/08/12 18:06
>>308
すみません このReadMe.txtをどう使うのでしょうか;;
interface unit とかわけわかめです・・・
310デフォルトの名無しさん:04/08/12 18:08
おいおい
お前らお客さん獲得の千載一遇のチャンスだぞ。
もっと懇切丁寧にしっかり教えてやれよ。
>>308
ReadMeは関係ないみたいね
(作者はいじめられて、引き篭もり中みたいな内容)

これまた現在、サーバー・トラブル中みたいだが、
BDNからinterface unitをダウンロードして
usesすれば、タイプライブラリの取り込みは不要って事
312296:04/08/12 19:43
>>311
BDNっていうのは
http://codecentral.borland.com/codecentral/ccWeb.exe/listing?id=21363
ここのことですよね?

ここから落とせるファイルはもう落としてやはり中身は上記と同じReadMeだったのです・・・
やはりDelphiでは簡単にはTabletPCSDKを扱えないのでしょうか;;
いじめられて、配布停止中って事なのか・・・Peter Haasの根性なしが
>>312
簡単に使えたよ。3分20秒ぐらいかかったけど
>>314
う???詳細きぼんぬ
TThreadが完全に開放されるまで待つのはどうしたらよいですか?
教えてください。
OnTerminateより後って事?
TYourThreadのデストラクタでどっかのフラグでも書き換えたら
TFileStreamなどを使用して画像ファイルを2つに分割し、
それを2つのファイルに保存したいのですがどうすればいいのでしょうか。
ご教授お願い致します。
>>319
TFileStreamを2つ用意してそれぞれに分割した画像ファイルを書き込めばいいんじゃない?
レスありがとうございます。
2つ用意してやってみたのですが、どうもうまくいきません。
どうやったら2つに分割できるのかわからなくて・・・
どういうメソッドを使用すればいいのでしょうか?
Winnyで違法に公開されているマンガをダウンロードして分割して表示したいと
いやぁ、そんな大そうな物まだ作れないっす。
Streamの勉強のために、それを利用してファイル分割ソフト作りたいだけっす。
>>319
Rect使うのでは?
ああ、そうか
Streamに取り込んだのを何とか分割して保存しようとしてたのですが
Rect使ってやってみます。
ドゥモ ありがとうございました。
326320:04/08/12 22:33
>>321,325
もしかして読み込みもStreamを使っている?
それなら「読み込み用に1個、書き出し用に2個Stream」を用意して、書き出しのStreamに好きな様に書き出せばいいんじゃないか?

それとも「画像として成立する形式」で分割したいのか?それだとヘッダを作ったり圧縮したりする必要があるから、結構面倒だったりするぞ。
bmpやjpegなら標準のライブラリを使えばいいから簡単だけど。
レスありがとうございます。
読み込みはTMemoryStream使ってやってました。
書き出し用に2つStream用意して試してみます。
ありがd。
ファイルを分割したいのか、画像を分割したいのかによって全く違う
329デフォルトの名無しさん:04/08/13 15:50
Delphi 7 Personal Promotionでユーザー認証ができません。

BorlandのHPから認証用のファイルreg119.txtを入手して、
C:\Document and Settings\<username> にコピーしたのですが。
Win2000です。

これだけじゃ駄目なの??
330329:04/08/13 16:06
ちなみにVB 2005 Expressでは認証なんて不要でした。
Delphi7の場合は、「今すぐ登録」アプリケーションで登録するのでは?
スタートメニューからアクセス汁
超馬鹿な質問でスマソ。

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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。