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

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

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

<関連スレ>
Delphi相談室(中級者以上)その12
http://pc5.2ch.net/test/read.cgi/tech/1064420818/
【ドキュメント】Delphi8 for .NET 2【どこ?】
http://pc5.2ch.net/test/read.cgi/tech/1078695271/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
3デフォルトの名無しさん:04/06/21 22:21
3GETするのも面倒
     ∧,,∧,,,,,, )      (´⌒(´
  ⊂ミ゚Д゚⊂,,,,,,,`つ≡≡(´⌒;;;≡≡≡
ズザーーーーーッ    (´⌒(´⌒;;

4げ......



やれやれ・・・
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄
  ポ  ∧,,∧  ポ
  ン  ミ,,゚Д゚,彡 . ン
   (´;) U,U ミ〜 (;;).
(´)〜(⌒;;UU (´ )...〜⌒(`)
              
>>1
6デフォルトの名無しさん:04/06/21 22:48
前スレでアドバイスをくださった方、ありがとうございました。
新スレお疲れ様です。早速質問をさせてください。
TTrackBarのバーをドラッグ中にOnChangeを発生させない方法はありませんか?
OnChangeに限らず、Positionが変わっていて、マウスボタンが離された時を検出できればいいのですが...
サブクラス化するという案はどうか。
>>7
> Positionが変わっていて、マウスボタンが離された時を検出できればいいのですが

TTrackbar がフォームの上に置かれていればサブクラス化の必要はない。フォームで
Orientation が trHorizontal のときは WM_HSCROLL 、trVertial のときは
WM_VSCROLL メッセージを受け取って

private
{ Private 宣言 }
public
procedure WMHScroll(var Msg:TWMHScroll);message WM_HSCROLL;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses
CommCtrl;

procedure TForm1.WMHScroll(var Msg: TWMHScroll);
begin
inherited;
if (Msg.ScrollBar = Trackbar1.Handle) and (Msg.ScrollCode = TB_ENDTRACK) then
Label1.Caption := InttoStr(Trackbar1.Position);
end;

のようにする。
107:04/06/22 00:03
ありがとうございます。
解決しました。
CやPerlのcrypt関数相当(アルゴリズムはDESかな?)の
ことが可能な暗号コンポーネントとかないでしょうか?
DelphiでCGIを作ってて、画像を動的に生成して
送ると言うところで、ちょっと戸惑ってます。

今はDelphiでプログラミングしていますが、最終的には
Kylixでコンパイルして、Linux上で動かす予定です。

ところが、TBitmapがXWindowなしには利用できない
みたいで困ってます。まあ、何らかのWindowシステムが
ないと、文字を描くのも不可能だから、当然といえば
当然なんでしょうが。

簡単なイメージなんで、最悪、メモリストリームに直接
アクセスして「お絵描き」しようかなとも考えてますが、
何か他にいい方法ある?
>>11
自分で作ればいいじゃん、とか思った漏れは素人ですか?
TMainMenuについての質問です
TMainMenuの領域内の色をWindowsの設定を変更しないで変更することはできるでしょうか?
ストリンググリッドを貼りつけたフォームに、ページめくりボタンをつけたいの
ですが、書き方が分かりません。

VBAでいうところの
SendKeys "{PGUP}"
SendKeys "{PGDn}"
みたいなものでいいんですが。
>>14
オーナードロー

>>15
キーを送るよりも LeftCol と TopRow を VisibleColCount、VisibleRowCount の
分だけ変化させることで、左上に位置するセルを指定するのがいいと思います。
それぞれ範囲を超えないように注意してください。
>>16さん
なるほど、とうなずくことができるにはまだまだ遠い未熟さが情けないですが、
とにかくヒントとしていただいた、VisibleColCount、VisibleRowCount
を手がかりにひたすら粘ってみます。
1815:04/06/22 05:53
ちょっとだけなるほど

MyList.Row:=MyList.Row + MyList.VisibleRowCount
でいけますね。

あとは、最初の最後どん詰まりの部分の処理の仕方。
たぶん何とかなります。
ありがとうございました。
1915:04/06/22 06:33
できました
きっちゃないコードですけど↓

procedure TForm2.PgAtoClick(Sender: TObject);
var
NanGyouMe:integer;
begin
MyList.Col:=0;
NanGyouMe:=MyList.Row+MyList.VisibleRowCount-1;
MyList.TopRow:=NanGyouMe;
MyList.Row:=NanGyouMe;
end;

procedure TForm2.PgMaeClick(Sender: TObject);
var
NanGyouMe:integer;
begin
MyList.Col:=0;
NanGyouMe:=MyList.Row-MyList.VisibleRowCount+1;
if NanGyouMe<1 then
begin
MyList.TopRow:=1;
MyList.Row:=1;
exit
end;
MyList.TopRow:=NanGyouMe;
MyList.Row:=NanGyouMe;
end;
>>15

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Perform(WM_VSCROLL,MakeWParam(SB_PAGEDOWN,0),0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
StringGrid1.Perform(WM_VSCROLL,MakeWParam(SB_PAGEUP,0),0);
end;
21デフォルトの名無しさん:04/06/22 11:32
アップデートした後プロジェクトをコンパイルしたら、
動作がおかしくなっちゃった。
こんなもんです?   そうですか。
>>11
CのライブラリをBCCでビルドしてリンクするのが手っ取り早い。
ShowMessageで表示したダイアログを、ボタンを押さずしてプログラムから
自由に閉じる方法はありますか。
ありますけど、ユーザの心を読めるプログラムはないよ。どのタイミングで
閉じたいと思うの?
カスタムフォームにしてメーターなり残り時間なりを表示してCloseするのが無難では。
>>24
あ、ボタンを押さずしては念じてという意味ではないです。すみません。
あるデバイスを「取り外してください」というメッセージを、取り外したのをプログラムが感知したら
勝手に閉じたいのです。
>>25
情けないのですがフォームを二つ作るのに苦手意識がありまして・・・できる限り
そうでないやり方を探したいのです・・
>フォームを二つ作るのに苦手意識
ふいちまった。
Delphi製のダイアログとかフォームを開いたとき
ボタンにマウスカーソルが自動的に移動してくれないんだけど
どうにかならないの?
>>26

if Screen.ActiveForm.ClassName = 'TMessageForm' then
Screen.ActiveForm.Close;
>>28
「ボタンにマウスカーソルが自動的に移動」させるプログラムがアホなんでは?
>>30
あわせるのはOS。コンパネ-マウスで設定するやつ。
>>22
なるほど、そういう手もありますね。

昨夜から検索してて、UCrypt.pasってのが
OpenJane関連で見つかったんですが、
どうもトリップの作成用みたいで、こちらを
まず試してみます。
>>31

スマートムーブっていうのね。たしかに Delphi 製のボタンには行かないね。
コモンダイアログなら大丈夫だけれど。何が違うんだろう。デフォルトボタンの
設定の仕方かしら?
日本製は知らないけど、Torrys なんかの VCL コンポのDLサイトでは、暗号化コンポーネント
なんかは山ほどあるよね。そういうのは使えないの?
暗号やハッシュ周りはOpenSSLのソースパクって使うのが一番安心。
>>29
できました。ありがとうございます。
37デフォルトの名無しさん:04/06/22 15:44
>>28
MLで昔同じ質問があって、中村氏が答えてた記憶がある。
Delのウィンドウ(ボタン等)に問題があるって言ってたような。
ダイアログリソースやテンプレートをつかった原始的な方法でダイアログをつくって
DEFPUSHBUTTON で指定したものは Delphi でコンパイルしても正常にカーソルが
動くね。むしろ、Delphi のフォームのウィンドウ関数がダイアログプロシージャと
して働いてないのが問題なのでは。
39デフォルトの名無しさん:04/06/22 16:07
て言うか、まだそんな現象があるのか。
ま、そんなところがかわいいのだけれど。
40デフォルトの名無しさん:04/06/22 16:11
服部さんが、「Cでできる事は、Delphiでもできる」って言ってたけど、
そんなこと言い出したら、VBもだよって言いたくなるレベルだな、デルヒって。
>>40 意味不明
HSPもだよ
> 服部さんが、「Cでできる事は、Delphiでもできる」って言ってたけど

だから、CみたくリソースエディタつかったダイアログをDelphiでつかえば
標準動作になるよ。問題なのは、TForm + TButton なわけで、C とコンパチ
のところではむしろ無問題。
>>43
40や42のようなアフォに説明しても無駄
delphiでwaveファイルを再生するにはどうすればいいのですか?
よろしくお願いします。
46デフォルトの名無しさん:04/06/22 17:11
>>40-45はHSP信者
そうか、デルポイは中途半端はげって事ですか。
なんかさぁ、荒らすにしてももうちょっとこう気の利いた書き込みできんのかな。
あたまわるそうな書き込みで、読む方が恥ずかしくなってきた。
49お前がウザい:04/06/22 18:23
'999,999,999'等のカンマが含まれる文字列からカンマだけを抜き取りたいのですが、
AnsiPos関数以外を使った方法でできないでしょうか?
AnsiPosだと一箇所しか返してくれないので、何かいい方法があったら教えて下さい。
お願いします。
StringReplace rfAll
Delphiでプログラムを組んだことすら無い香具師が荒らしてるんでしょ。
何が気に入らないのか分からないけど、放置しときなさい。
>>51
ありがとうございました。
54デフォルトの名無しさん:04/06/22 19:34
PopupMenuと同じようなタイミングで消えるフォームを作りたいんですが
どういったコーディングをすればいいですか?
表示した瞬間は最も手前に表示され
他のアプリやフォームをクリックしたり切り替えたりしたら消えるようにしたいです。
>>54
ApplicationEvents のOnActivateとOnDeactivate
をうまく利用すればできる。

そのフォームだけで他にもフォームを表示させてるのなら
FormのOnActivateとOnDeactivate

タイマーを利用すればある程度時間を空けて消したりできる。
56デフォルトの名無しさん:04/06/22 20:23
DelphiからDOSコマンドを実行したいのですが、どうすればいいのでしょうか?
使用したいこまんどはNET USEです。

Delphiのバージョンは7です。

WinExecをで実行しようとしたのですが、うまくいきませんでした。

よろしくお願いします。
実行するだけならWindows.CreateProcessかShellApi.ShellExecute。
でもWinExecでもいけるはずだけど。
GetLastErrorの値見るかWin32Checkで囲ってエラーの内容調べてみたら?
58デフォルトの名無しさん:04/06/22 20:52
前スレで、データベースデスクトップでメモ型にデータを入力をする方法を
聞いたものですが、データベースエクスプローラーを使えと教えてもらいました。
グラフィック型も同じと思っていたらどうも違うようなのですが、何処で入力すれば
いいのでしょうか?
教えて君ですみません。
色をString型にしたりその逆はできますか?
TStringListで管理してファイルに保存したいのですが...
色のリストが保存できればなんでもいいのですが。
ColorToString
StringToColor
おおっ!ありがとうございます。
6215:04/06/22 23:19
>>20さん
遅まきながら感謝です。
>>19 にのせたコードは見直したら不備だらけで、実験を何回か繰り返しながら
どうにかモノにしました。
不細工ながら、それはそれでとりあえず満足。

こちらももちろんありがたくいただいておきます。
63デフォルトの名無しさん:04/06/23 09:39
コンポーネントのプロパティの値は
コンストラクタ(create)内では、まだ反映されておらず、
デフォルト値のままなのでしょうか?
64デフォルトの名無しさん:04/06/23 10:23
ReadStateで読み込むということ、
またそれがコンストラクタの後だと言うことは分かったのですが、
ReadStateがどのようにしてプロパティから値をとているか教えていただけませんか?

コンストラクタ内でプロパティの値で条件分岐がしたいのです。
どなたかよろしくお願いします。
>>64
プロパティを読み込むのはTReaderの仕事らしいけど、
それよりも、なぜそういうことをしたいのか詳細を書いた方が回答をもらいやすいかも。
66デフォルトの名無しさん:04/06/23 10:56
(´-`).。oO(RPG作りたい…)
      (金も知識もゼロ…)
      (Delphiが良い感じなんでやろうと思う)
        
m9っ`・ω・´)<良い書籍やサイトは有りますか!?
        <誘導して下さい!
sage忘れスマソ
68デフォルトの名無しさん:04/06/23 11:01
>>67
ageても良いんだぜェ!
単発質問スレ乱立を防ごうサ!
>>66
古い本かもしれないけどSOFTBANKから出てる「遊びのレシピ」って本がお勧め。
Delphiを使ったいろんなジャンルのゲームの作り方が載ってる。
70デフォルトの名無しさん:04/06/23 12:38
>>66
そんな貴方にRPGツクール
71デフォルトの名無しさん:04/06/23 12:40
>>66
【Delphi】 ゲームつくるぞ(゚Д゚)ゴルァ 【作れば?】
http://pc5.2ch.net/test/read.cgi/gamedev/1051110669/
72デフォルトの名無しさん:04/06/23 14:53
DelphiってStringBuilderないの?
まさかMemoryStream使うとか・・・
>>72
えーと・・・・・・・・・・・・?
>>66
ぐぐればサイトはなんぼでも出てくる。
れっつとらい。
ただし只で手に入るDelphi6Personalは商用アプリ開発不可なので、
即売会で売ったりダウンロード販売するためには、Professional版を
購入する必要あり。
PageControlに追加したTabSheetの各タブに出るヒントを、別々の物にする方法は?
現在タブ部分のヒントは、全てPageControlの物が出てしまいます。
76デフォルトの名無しさん:04/06/23 15:53
IndyのデモでCGIMailerがコンパイル出来ないんだけど、
[致命的エラー] CGIMailer.dpr(4): ファイル 'IdCompilerDefines.inc' が見つかりません
って出るんだけど、俺だけ?(´・ω・`)ショボーン
.incファイル探してあったらパス通してみたら。知らんけど
78デフォルトの名無しさん:04/06/23 16:03
IdCompilerDefines.incが無いんです。
あきらめます。
>>72
.NETやJavaは文字列がオブジェクトなので専用の構築クラスを使わないと遅くてやってられないが
Delphiだと+演算子使いまくっても充分なスピードがでるよ
一応TStringStreamってのもある

…ってので満足か?
>>73 多分>>72はよくわかってない煽り
>>78
C:\Program Files\Borland\Delphi7\Source\Indyに普通に存在するが?
8178:04/06/23 17:12
Indyのアップグレードしたらありました。
ありがとう。
それから、Indyのホームページぐぐったら、
Del7のは、バグがあるからDel6が良いってのがあったんですが、
Lクライアントとかサーバーとか勉強して作りたいんですが、使わない方が良い?
バグによりけりだろうけど、入門レベルなら気にしても仕方ないんじゃない?
というかIndyでソケット入門ってつらくないか?
ドキュメントがないって言う意味で。分かるならいいけど。
ちょいと聞きたいんだが。
Del1からDel7をWin2000にインスコってできるのか?
85デフォルトの名無しさん:04/06/23 18:33
以下の4000を一発で求めることが可能な動的配列のサイズを求める関数ってありますか?

procedure TForm1.Button1Click(Sender: TObject);
var
 A: array of array of Integer;
begin
 SetLength(A, 10, 100);
 ShowMessage(IntToStr(Length(A) * Length(A[0]) * SizeOf(Integer))); //4000
end;
ない
>>86
わかりました。
>>84
とりあえず6,7,8は共存させて問題ない(私のPCがそうだから)
>>88
なるほど。
いまPCにインスコされてるやつはDel3とDel5。
Del3が入るならDel4は当然入ると思うから良しと。
そこで、Win2000にDel2.0Jが入るのか疑問に思っているところなんだ。
確か入る。
2,3,4,5を入れてる人がいた。
98だったかも・・・
92デフォルトの名無しさん:04/06/23 20:15
>>65
TReaderでしたか、ありがとうございます。

タスクトレイにアイコンを表示させるための、コンポーネントを作っているのですが、
コンストラクタ内でFTask(駐屯型かどうか)の値をもとに、
アイコンを登録するかどうかでわけたいのです。
駐屯型でない場合は、最小化時のみ、アイコンを表示させようと思っています。

NID:TNotifyIconData;

constructor TTrayIcon.Create(Owner: TComponent);
begin
  if not (csDesigning in ComponentState) then begin
    ・・・
    with NID do begin
     ・・・
    end;
    // FTray ← の値が常にFalseだから使えない。。。
    if FTray then Shell_NotifyIcon(NIM_ADD, @NID); {アイコン登録}
  end;
end;

既存のコンポーネントで、Visibleの値をもとに、
表示したり、されなくしたりするのはどのようにしているのでしょうか。
>>75
>PageControlに追加したTabSheetの各タブに出るヒントを、別々の物にする方法は?

uses
CommCtrl;

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String;
var CanShow: Boolean; var HintInfo: THintInfo);
var
i,itm:integer;
r:TRect;
begin
if HintInfo.HintControl.Name = 'PageControl1' then begin
itm := -1;
for i := 0 to PageControl1.PageCount-1 do begin
PageControl1.Perform(TCM_GETITEMRECT,i,LPARAM(@r));
if PtInRect(r,HintInfo.CursorPos) then itm := i;
end;
if itm <> -1 then HintStr := IntToStr(itm)+'-th tab だよ';
end;
end;
CとかJavaならHello Worldを出力せよってプログラムを最初にやると思うんだけど
Delphiでそれにあたるようなプログラムは何でしょう?<最初に作れと言われるプログラム
>>94
コンソール版hello,worldと
ボタンを押すとメッセージが表示されるフォーム版hello,world
最初に作るアプリはなぜかメモ帳が多いな。
98デフォルトの名無しさん:04/06/23 20:39
Delphi6 ProでHTMLを出力したいんだけど
タグの出力等を支援してくれるライブラリってない?
>>98
入力ならともかく出力は単なるテキストファイルの出力なんだから
私怨とかいらないんじゃないの?具体的にどんな私怨が欲しいの?
>>99
rubyのCGIクラスやphpみたいなの
>>98
IntraWeb使ってしまえばぽとぺたでHTML吐けるよ
ShowWindow(Application.Handle,SW_HIDE);
でタクスバーのアイコンを非表示にしているのですが、
Application.Minimize;
を実行すると、ちょこっとタクスバーに
アイコンが現れてしまって困っています。
解決策はありますか?
どうぞ一つご教示お願いします。
なんで知られていない(流行っていない)のでしょうか?逆に何故流行らないのかと言いますと、原因は意外とハッキリしています。

MicroSoft社の製品ではない。
「Visual Basic」よりも後に発表された。
名もあまり知られていない言語に手を出したくはない。
参考書があまり出回っていない。
みんながやってるものをやった方が安心する。
企業であまり使用されていない。(使ってる所では使ってますが…)
やっぱりVB、VC++が最高なのよね。
>>102
隠すんじゃなくて、WS_EX_TOOLWINDOW属性をつけてやる
>>103
何を今更
>>105
>103は知っててわざと書いてるんでしょう。
アマチュアか敗北した人にそういうことをする人がいる。
107102:04/06/23 22:07
>>105
もう少し詳しく教えて頂けませんか?
お願いします。
108102:04/06/23 22:20
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
とアプリケーションが実行する前に読ませてやるとタスクバーに
表示されなくて、その点ではうまくいっているのですが、
最小化をした時に左下にフォームのタイトルバーが現れてしまいます…
>>106
>>97のサイトからのコピペだよ
画像をアンチエイリアスつきで回転できるコンポーネントなどありますか。
>>108
ちょっとややこしいけどイイかな?
それでよかったらコードを掲載可能。
112102:04/06/23 22:28
>>108
お願いします。
勉強になりますから是非お願いします。
>>112
了解。
>>83
ソケット入門って言うネタが成立するならやってみたいです。
でも、ソケットって言葉では知ってしても実際プログラムとしては
どんなものか分かってないので。
Indyではソケットって無いんですか?
>>112

メインフォームのInterface部に以下を記述

 //●何も考えずにメインフォームにコレを記述●
 THideTaskBarApplication = class(TApplication)
 public
  constructor Create(AOwner: TComponent); override;
 end;

メインフォームのimplementation部に以下を記述

//●何も考えずにメインフォームにコレを記述●
constructor THideTaskBarApplication.Create(AOwner: TComponent);
var
 WndStyle: Integer;
begin
 inherited;
 WndStyle := GetWindowLong(Handle, GWL_EXSTYLE);
 WndStyle := WndStyle or WS_EX_TOOLWINDOW;
 SetWindowLong(Handle, GWL_EXSTYLE, WndStyle);
end;

//●何も考えずにメインフォームにコレを記述●
initialization
 Application.Free;
 Application := THideTaskBarApplication.Create(nil);

end.
116デフォルトの名無しさん:04/06/23 23:03
フォーム上にTEdit、登録ボタンを配置しています。
登録ボタンを押した時にTEdit上に書いてあった内容を
テキストファイルに保存するにはどうしたらいいでしょうか?
>>115

それって SetWindowLong() でセットするのとどこが違うの?
>>116
とりあえず、'C:\File.txt'に保存する例。

procedure TForm1.Button1Click(Sender: TObject);
var
 F: TextFile;
begin
 AssignFile(F, 'C:\File.txt');
 Rewrite(F);
 try
  Write(F, Edit1.Text);
 finally
  CloseFile(F);
 end;
end;
>>108
>最小化をした時に左下にフォームのタイトルバーが現れてしまいます…

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Form1.Visible := false;
end;
>>115
プロジェクトファイルに

SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

ですむんじゃないの
> Indyではソケットって無いんですか?

おおまかに言えば Indy はソケットのラッパ。VCL が Win32API のラッパ、という
のと同じような意味で。

Delphi言語でソケット入門っていうのは分かるけど、Indy でソケット入門というのは
ちょっと意味不明な感じ
122116:04/06/23 23:35
>>118
できました。ありがとうございます
123102:04/06/24 00:05
>>115
>>117
>>119-120
レスありがとうございます。
一応思い通りの事ができました。
115さんのが完全に理解できていませんが
うまくいったので満足です。
また勉強したいと思います。
ありがとうございました。

application.MessageBox(PChar(文字列),PChar(文字列));

この文字数に上限はあるんでしょうか
実験したところ500,600程度はあっさり表示してしまいます
この文字列部分は変数なんですが、もし上限があるとするなら、そこに
達する直前で切ってしまいたいので(勝手に切ってくれるんだったらそれでも
いいんですけど)
>>123
結構ややこしくてとにかく理解するには大変だから、とりあえず
これを記述すると表示されなくなることが分ればOK。
今後も必要になった時に貼り付ければイイという感じ。
>>124
何文字あれば十分ですか?2ギガバイトぐらいはいくかもしれませんが
もっと低い制限かましたほうが無難でしょうね
ここはくだらないスレッドですね
>>126さん、レス感謝です

2ギガって、そんなにいけちゃうんですか。

商品別の売上履歴をメッセージボックスの形で表示させてるんです。
XXXX年XX月XX日 X点
YYYY年YY月YY日 Y点
・・・みたいな感じ
でもって、データ元は全履歴テーブルから過去一年分だけ抽出したクエリ。
だから365行分あれば充分なんですけど。
実際には画面の大きさがあるからそんなに表示できるわけないし、
365日間、毎日切れ目なく売れる商品があるわけでもない。
たぶん多くても70〜80行といったところだと思います。

とりあえず尻尾切りはしなくても、最悪画面からはみ出すだけと
考えて大丈夫なわけですね。
>>128
あれは API の MessageBox のラッパでしょ。Delphi というより API の話ね。

普通、StringGrid か ListView かを載せたフォームで表示させるんでは。
今、TPersistentを継承したTData1,TData2...TDataNという
いくつかのクラスをファイル入出力させるためTHogeというクラスを作り、
Dataプロパティに先ほどのTDataクラスを保持させるようにしています。

THoge = class(TComponent)
published
 property Data: TPersistent read FData write SetData;
end;

WriteComponentできちんと書き込みは出来ているのですが、
実行時のDataプロパティの実際の型が不定のため、
ReadComponentでうまく読み込むことが出来ません。
やはりDataプロパティの実際の型をTHogeにプロパティとして持たせ、
Dataプロパティを偽プロパティを使って、
ストリームからの読み込み時にその型を判別し
個々の読み込みを行うという方法をとるしかないのでしょうか?

なにかスマートな方法がありましたら教えてください。
>>129さん
>>普通、StringGrid か ListView かを載せたフォームで
そうしようとも思ったんですけど。
ストリンググリッド貼りつけたフォームばかりもう何枚もできちゃって、
何だか疲れちゃいました。
この程度の表示だったらメッセージボックスでいいかな、と。
(自分の職場のちっぽけなDBフロントエンドです)
バイナリファイルもしくはストリームをRESファイルに落としたいのですが
なんというリソースタイプを指定すればよいのでしょうか?
RCDATA
formの設計で、オブジェクトを選択してそのcaptionやnameを変更するときに
オブジェクトインスペクタで行いますが、
このフォーカスの移動をマウスではなくキーで行う方法ってありますか?
tab
プロパティ名をタイプ
tab
application.terminate と Close の違いって、
「その場ですぐアプリ終了」と「ウィンドウズに終了予約する
だけなので、すぐ終了とは限らない」って言う認識で良いですか?
>>84,88-91
以前使っていたPCではWinXP上で2,3,5を共存させていました.
古いバージョンから先に入れるのがよいと思います.
古いのを後から入れるとBDEが古いので上書きされます.
>>131
60〜70行だと文字を小さくしても画面をはみ出しそうですね.
フォームにメモかリッチエディットとボタンを貼り付けて
スクロール可能な自前のメッセージボックスを作ってはいかがでしょうか?

(宣言部)

TMyMsgBoxForm = class(TForm)
RichEdit1: TRichEdit; // ScrollBarsをssVerticalかssBothに
Button1: TButton; // ModalResultをmrOKに
end;

procedure MyShowMessage(const s: string);

(実装部)

procedure MyShowMessage(const s: string);
var frm: TMyMsgBoxForm;
begin
frm := TMyMsgBoxForm.Create(Application);
try
frm.Memo1.Text := s;
frm.ShowModal;
finally
frm.Release;
end;
end;
139デフォルトの名無しさん:04/06/24 18:54
foo.pas, bar.pasを含むパッケージbaz.bplを作った場合、
ユニットfooを使うアプリのビルドにはどのファイルを検索させればいいの?
baz.bplではなくfoo.dcuへ検索パスを通すのが正解?
テキストボックスに入力される文字を半角だけにするにはどうしたらいいのですか。
procedure TForm1.Button1Click(Sender: TObject);
var
Pos: TPoint;
NewItem: TMenuItem;
begin
PopupMenu.Items.Clear;
NewItem := TMenuItem.Create(PopupMenu);
PopupMenu.Items.Add(NewItem);
NewItem.Caption := Edit1.Text;
NewItem.Tag := 1;

GetCursorPos( Pos );
PopupMenu.Popup( Pos.X, Pos.Y );
end;

というようにすると、作られるPopupMenuのItems.String[1]に
Edit1.textの文字列だけではなくて、半角の&がどこかに入ってしまいます。
例えばEdit1.Text := 'onegaisimasu';だったら、
'onega&isimasu'のようになってしまいます。
どうすれば入らなくなりますか?教えて下さい。
PopupMenu.AutoHotkeys := maManual;
143141:04/06/24 20:41
>>142
アクセラレータキーを自動的につけるためのものだったんですか!
こんなに悩んだのに一瞬に解決してくださり助かりました。
144デフォルトの名無しさん:04/06/24 21:59
質問させてください。

Aという非表示コンポーネントを作成して色々な処理を行います。
Aコンポーネントの中に、フォームを呼び出し、値を入力して、チェックする処理をしたいと思い
Bフォームを作って、AコンポーネントでCreateさせました。

Bフォームで入力後、Aコンポーネントのメソッドでチェック処理をするときに
どのように書けばいいのかよくわかりません。

Bフォームを作ったときにAコンポーネントのUnitを追加したのですが
Bフォーム上でAコンポーネントのメソッドをどのようにしたら扱える用になるのでしょうか?
教えてくださいお願いします。

流れ
   AコンポーネントCreate
   Aコンポーネントのメソッド(Show)を実行
   AコンポーネントがBフォームをCreate
   Bフォームで入力
   BフォームがAコンポーネントのメソッド(Check)を実施 ←この方法がわかりません
145デフォルトの名無しさん:04/06/24 22:34
TEditに入力される物を整数値限定にしてif文で処理したいのですが
整数を表すコードを教えてください。

下のコードの○○(整数値限定)を知りたいという事です。

if Edit1.Text=○○ then
登録する。
else
NGを表示する。
StrToIntDefのこと言ってるんですか?
Val(Edit1.Text, value, code); if code <> 0 then NG;
または
try value = StrToInt(Edit1.Text); except on EConvertError do NG end;
>>145
発想があまりよくない。入力を限定するのはOnKeyPressでやった方がよい。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
  #08:; //[BackSpace]
  '0'..'9':; //数字
  #$7F:; //[Delete]
  else Key:=#0;
  end;
end;

もしその方法でやるとしても、if文でやるのは余りスマートな方法とはいえない。
例外処理を使った方がずっと楽。

try
  intVar = StrToInt(Edit1.Text);
except
  on EConvertError do
    ShowMessage('整数を入力してください');
end;

こうすると、
数値に変換できる文字列がEdit1に入力されているならばintVarに代入が行われるが、
変換できない文字列だったらメッセージダイアログが表示され代入は行われない。
>>144
例をあげる

public
HonyaLabel:TLabel;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
HonyaLabel := TLabel.Create(self);
HonyaLabel.Parent := self;
HonyaLabel.Left := 10;
HonyaLabel.Top := 10;
end;

こんなふうにつくった HonyaLabel に Unit2 からアクセスするには

uses
Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.HonyaLabel.Caption := 'HogeHoge';
end;
150144:04/06/24 23:56
ありがとうございます。
明日、会社で確認します。
(会社からは2chへアクセス出来ないため家から書き込みしているので)

BフォームではAコンポーネントをCreateしていないので、
どうやって操作するのかイメージがわきませんでした。
どのオブジェクトがCreateしたかは気にしなくていいようですね。
> どのオブジェクトがCreateしたかは気にしなくていいようですね。

そうですね。重要なことは、書いたコードに部分から HonyaLabel のような
インスタンス参照が見えるかどうかです。上の場合は uses Unit1; が肝心な部分です。
そして、HonyaLabel が Unit1 の interface 部にあり、TForm1 の public フィールド
である、ということが。
152デフォルトの名無しさん:04/06/25 09:52
お世話になります
登録ボタンとListBoxとComboBoxをフォーム上に配置しています。
そして、ListBoxとComboBoxにはItemsプロパティにいくつか選択肢を入力しています。
登録ボタンを押したときにそれぞれ選択されている選択肢をテキストに保存したいのですが
以下のコードではエラーが出てしまいます。

begin
AssignFile(F,'C:\File.txt');
Rewrite(F);
try
Write(F,ListBox1.Text,ComboBox1); //エラーが出る
finally
CloseFile(F);
end;
end;

どうしたらいいでしょうか?
また、選択肢以外を手書きで入力したときにメッセージで警告表示を促したいのですが
それも教えてください。ShowMessageは知っています。
>>152
簡単に言えば
Write(F, 文字列);
とせねばなりません。
combobox1の何を保存したいんだ?
そのままじゃ保存できない。
>>152
あとComboBox.Style を csDropDownList にしとけば
そもそも手動入力できないようにできます。
156152:04/06/25 10:30
>>153-155

ComboBoxはComboBox1.Textにしたら出来ました。
手動入力はデファルトで入力できる設定になっていましたけど勉強になります。
ただ、手動入力もファイルに保存されてしまうのでShowMessageを使ってNGを出したいです。
157デフォルトの名無しさん:04/06/25 10:33
こんにちは。昨日からDelphiを使い始めました。
いろいろ試しているんですが、
DateToStr(Date)
の年と月と日をそれぞれ別の変数に入れたいんですが、
文字列の分割の仕方がよくわかりません。
xBASE言語のleftstrやrightstrのような関数はないんでしょうか。
>>157
xBASEとやらは知らないけど、その名前の関数はあるよ。
uses に StrUtilsを追加しる。
>>158
ありがとうございます。
でもHELP見ても出てきません。Delphi 5です。
> の年と月と日をそれぞれ別の変数に入れたいんですが、

DecodeDate()

> xBASE言語のleftstrやrightstrのような関数はないんでしょうか。

Copy() や AnsiPos() や Length() でもっと柔軟な使い方ができる。
>>160
うお、こんな関数あるんだ。どもサンクスです。
助かりました。
162デフォルトの名無しさん:04/06/25 11:11
FormにEditを複数貼り付けて名前から(Tagでも可)そのEditを探す方法はありますか?
FindComponent
164デフォルトの名無しさん:04/06/25 11:35
>>163
助かりました
ありがとうございます
165デフォルトの名無しさん:04/06/25 12:26
アプリ起動時にTedit1にテキストファイルから取り込んだ物を
入力したいのですがどうやったらできますか?
166デフォルトの名無しさん:04/06/25 12:48
Edit1.Text := 取り込んだ文字
>>165
おいら初級者なので間違ってたらごめん(´Д`;)

procedure TForm1.FormCreate(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\test.txt');
Edit1.Text := sl.Strings[0];
finally
sl.Free;
end;
end;
>>157
DecodeDateも調べてみてごらん。
既出だった...スマソ
170165:04/06/25 15:19
>>167
ありがとうございます
ねえ、Delphiって関数ジャンプってないの?
VC++にあるようなやつ。
exitのことか?
いや違う。
エディタの話。
自分の作った関数にジャンプできなくない?
Personalはいろいろエディタ機能削除されてるけど・・・
>>173
[表示]-[コードエクスプローラ]のこと?
>>175
それないよ・・・
まあフリーのやつだからしょうがないか。
177175:04/06/25 16:46
>>176
俺はPro版だが、使ったことない・・・。
178デフォルトの名無しさん:04/06/25 16:48
ALT+↑ とか
179130:04/06/25 16:49
スルーされてるっぽいので、他のスレで聞いてきます。
お手数おかけしました。
>>171
Ctrlキーを押しながらその関数にマウスカーソルを当てるとハイライトする。それをクリックすると
その関数にジャンプする。という機能?
それともCtrl + Alt + ↓のこと?

スレ違いならスマソ
>>175
最近ごちゃごちゃなコード書いてるせいか
むしょうにその機能が使いたくてしょうがない。
「定義の検索」でなんとか代用してるけど・・
コードエクスプローラってプロジェクト閉じるたびにツリーも全部閉じるからめんどくさくて使ってられない
DelphiでシーケンシャルファイルをOPENし、配列に取り込むのはどうやるんですか?
HELPでreadとか見つけたんだけど使い方とか書いてないし・・・

なんかVBよりとっつき悪い感じ・・・
>>183
何事も慣れです。「シーケンシャルファイル」なんていってる時点で
化石プログラマーな匂いがプンプンしますよ。もっと柔軟に考えないと。
ファイル操作といってもいろいろなやり方がありますから、
バイナリファイルなら TFileStream、
テキストファイルなら TStringList が楽かも。
余裕があるなら File of XXXX, TextFile、
また、Win32 APIを直で使うという方法もあります。
TFileStreamか、ありがとう。
ってHELPにも出て来ないし・・・やれやれ
そのレベルで2chだけで言語習得しようとしているあんたに惚れた
188デフォルトの名無しさん:04/06/25 23:39
つうかVBプログラマってホント潰しきかねぇな
C#とかC++とかDelphiとかやるならオブジェクト指向について
勉強しとかないとつらいよ。
お前ら"VB"に過剰反応しすぎ。
191デフォルトの名無しさん:04/06/26 00:16
なんかVBよりとっつき悪い感じ・・・
192デフォルトの名無しさん:04/06/26 00:28
>>188
Cやれ。
Kylixの話はここでよござんしょか?
Duron1G、メモリ600MBOverの環境でGnome上でKylix Open Edition 3を立ち上げて
ボタン一個の画面作ってそれだけで走らせようとしたら
実行ファイルはできているらしいもののIDEが凍ります_| ̄|○
(で、その実行ファイルは実行されない。ターミナルから起動しようとしても
参照が未解決だとかなんとか……どっかにLIBPATH通さないといかんのかな)
環境的にきついんでしょうか?
肝心のディストリビューションかいてないし
Delphiのブロック崩しのサンプルってないんですか?
ぐぐってもでてこないorz
すいません。
Timerについてなんですが、
OnTimerの処理が終わらずにまたOnTimerが呼ばれた場合、
一体どのような処理になるのでしょうか、、
>>195
超初心者スレなんで、TShapeとTTimerだけでブロック崩し作ってみたら。
ちょっと面白そうなんでやってみようかな。
>>196
呼ばれません。
199134:04/06/26 13:25
>>135
遅くなりました、ありがとうございます。ネ申よ。。。
>>196
別スレッドになるわけじゃないしな
>>197
sinとかcosの使い方が知りたいのです...
どうやったら移動と反射とかができるのか。
お前ら、布教と救済しる!
何だよ偉そうに。
204193:04/06/27 00:46
ぐは。確かに。 > ディストリビューション
今は最早骨董品と成り果てたRedHat9でござります。
パッチはなーんも当ててないっす。それでも一応、Kylix3の
動作条件は素で満たしていたはずでしたが……
(事実起動はするし、コンパイラも動いてはいるらしいし)
質問させて下さい。
#define UMA ((hoge*32)+16)
↑みたいな置換え処理をDelphiではどうやるんですか?
function UMA(hoge: Integer): Integer; register;
asm
  SHL EAX, 5
  ADD EAX, 16
end;
>>206
スンマセン…ただ単に置換えだけ出来れば良いんです。
#define GIKO hoge[9]
#define UMA hoge[17]
みたいな感じで。
知ってて言ってないか?w
無いですよ。
あったとしても、DelphiのようなIDEによるソースの自動編集が重要な位置を占めてる環境で
IDEの邪魔を好んでするのはお薦めしない。
>>208
本当に知らんかったのですよ…
ヘルプ読んでも検索しても見つからなかったので質問した次第です。
どうもお騒がせしました。
>>205
無い。
Delphiにはマクロもインライン関数も無いです。
素直に関数作るか、定数として定義しておくしかない(コンパイル前に解るような計算式なら定数に出来る)。

211デフォルトの名無しさん:04/06/27 10:23
delphiのソースエディタで行ごと削除できるキーはありますか?
>>205
ちなみにC#にもマクロ、インラインはないです。
>>211
ctrl+y
214213:04/06/27 11:32
追加。
D7だとヘルプのキーワードに「エディタに関するキーボードショートカット」
215デフォルトの名無しさん:04/06/27 15:27
ttp://www.wwlnk.com/boheme/delphi/tips/tec1630.htm

MemCheckによればこれに載ってるコードではメモリリークしてるらしいのですが、
どこが原因になってるんでしょうか?
del7,1 + dbexpress での話ですが、どうしても以下のような
エラーが出ます。海外のBBSを見ると、一部に7.1 upedateの
問題みたいな意見もあるんですが。。。

------- ----------- ------------ -------------
[致命的エラー] ユニット SqlExpr は異なるバージョン
SqlConst.SNOERRORによりコンパイルされています
------- ----------- ------------ -------------

SqlConstって、拡張子が「dcu」と「dcu.jp」ってのが
ありますね。後者は7.1でアップデートされている
わけですが。。。

このエラーって、7.1へのアップデートに失敗した結果?
>>215
別にリークしてるとは思わないけど。ほかの部分に問題があるのでは?

それよりプロセス間をまたいでポインタを渡すなら、GetMem じゃなくて
GlobalAlloc を使ってグローバルヒープに変数を確保しないと駄目な気が
するけど。
> GlobalAlloc を使ってグローバルヒープに変数を確保しないと駄目な気が

おいおい、GlobalAlloc WM_COPYDATA を知っててそんなこと言ってるのか?
220204:04/06/27 21:05
>216
ぐはっ*2。ぐぐればすぐにでも出てきそうなものを、よう探さんかったとは
己の不分明を恥じるのみ。
というわけで216とドイツのスーパーハカーに謝意を表しつつ逝ってきます。
senderを偽装 というのをやりたいのですが、
(Sender: TObject);のついているプロシージャを呼び出したい時に、
Senderを持ってない関数からSenderなしで呼び出すとエラーになってしまうので、
Senderをとりあえず捏造して呼び出したいのですが、どうするのがよいのでしょう。
googleで探すのは不可能でした。
適当にselfとかいれとけ
TObjectっていったらほとんどなんでもOKだよな・・
>>221
プロシージャ内部で何やってるか調べないとまずいんじゃね?
必要ないのにSenderのメンバ弄ってるとかならいいけど
必要だから弄ってるなら適当なの渡すのもまずいじゃん?
stringでtabや改行を盛り込むにはどう記述すればいいんでしょう
制御コード

タブは  #9
開業は  #10

シングルクオーテーションで囲んじゃだめ。ただの文字列になる。
変換ミスはスルーで・・・
改行は sLineBreak 定数を使った方がよさげ
229225:04/06/28 01:38
ありがとうございました。
起動すると必ず最大化されてしまうプログラムを、Windowモードで起動するように指示するプログラムを作りたいのですが、
どのように書けば良いでしょうか・・・。
そういう起動パラメータがあるかどうか調べる
TDBGridで、商品名 価格 数量 小計 を表示するような
プログラムを作成しています。価格*数量で計算した小計を
静的に作成したColumunsに表示させたいと思いますが、
どうやってセルを指定して入力するかがわかりません。
StringGridとは全く扱いが違うようなのですが、ヘルプを
読んでみてもよくわかりませんでした。

よろしくお願いします。
>>230
ショートカットの「実行時の大きさ」を変更してもダメなプログラムは
いったん起動させた後でないとウインドウの変更は無理だと思います。
>>232
TDBGridだけを何とかしようとしても、目的は達成できないよ。
TDBGridのDataSourceプロパティの元になっているTQueryのSQL文で

SELECT 商品名, 価格, 数量
FROM 商品


SELECT 商品名, 価格, 数量, 価格 * 数量 AS 小計
FROM 商品

にして、小計を計算する項目を作成して、小計フィールドをあらかじめ作ってしまう。
小計はTQueryを開くと実行されるからこれで小計は計算される。
あとはTDBGridのColumnsに小計を追加すればOK。

TTableが元になっているならば、このようにすることはできないので、
TTableのOnCalcFieldsイベントを使う必要があるけど、長くなるのでここでは割愛
(もしTQueryを使っていない場合は教えてくれれば後で説明します)。
>>234さま

早速のご回答ありがとうございます。
TQueryを使っています。教えていただいた方法
早速試してみます!!
>>235
こういう質問をするときには、
・DelphiのバージョンとEdition (Personalとか・・・)
・データベースの名前(OracleとかAccessとか)
などを付記しておいた方が適切なレスがつきやすいよ。
Assignedって何か意味あるの?
if p <> nil thenって書いて問題になるケースって存在する?
Assigned(P) はポインタ変数の場合は P<> nil,
手続き型変数の場合は @P <> nil というテストに相当します。
で、ポインタ変数のチェックでAssigned使う意味あるの?
>>239
で、ポインタ変数のチェックでAssigned使わない意味あるの?
お前の人生に意味は無いよ
お世話になります。ローカル変数について二点ほど質問があります。

ある関数内で宣言したローカル変数は、使う、使わないにかかわらず
呼び出しが起こる度に、常に確保されるものなのでしょうか?

array[0..255] of Char のような大きい変数が必要な場合、
このように宣言するのと、動的変数を関数内で確保して使うのとでは
速度に差が出ますか?
自分で確かめれば?
>>242
スタックにとったほうが速度的には有利。
ただしあまり大きくとるとスタックが足りなくなるので
その時はヒープで確保する。
どうもありがとうございます。

速度という書き方をしましたが、別に実効速度がどう変化するかを
知りたいわけではありません。
可能ならより効率のいいコードを書きたいと思っただけです。

実はコンピュータのコアな部分のしくみをぜんぜん知らないので、
スタックやヒープというのをまず勉強してきます。
>>242
正直たった256バイトごときじゃ大差ないだろうね
文意を汲み取れないアホはもう寝ていいよ
248242:04/06/28 23:46
          lヽ、            /ヽ
           i! ゙ヽ、    ,,,..-'"/  ゙i!⌒ヽー-、.,,.-イ''⌒ヽ
            l    ゝ-─‐-/'    i!  ヽ、     i,  ,ノ
         ,/"             i!  .... ゙'';;..   Y"
        ,/'              〈  :::::.  '';;...  'i- 、,,
         i'                'i,  ::::::::   ::::  'i!   ゙"ヽ、
          i! ー-      ,,_         'i  :::::::::  ''':;;;  ヽ、  ゙)
        'i,:::::   ,--、     ̄     ,/ヽ ''''        'i,-‐'"
       /⌒ヽ、 i,_,〉   :::::,,-‐    ゝ   .............    ヽ、
       (    ヽ、   ,,.-‐''"       ,)  :::::::::      '\,
        ヽ、,,  ノ,.-‐''"      ノ-‐''"´( :::::::::::          )
          "~ (       ,. -'"     ヽ、    _,,... -‐─'''"
             ヽ、,,.. -‐'''"
寝る!
いや、>>246 の指摘は重要。質問者は >>245 で書いているように実行速度が
どうこうではなく、より効率のいいコードを書きたいと言っている。256バイト
程度でぐちゃぐちゃ悩むのは全く効率よくない。
250246:04/06/29 00:06
>>247
えーと、あなたは何を汲み取ったのですか?とても興味がありますww
252デフォルトの名無しさん:04/06/29 09:29
ListBoxについて質問させてください。
例えばフォーム上にListBox,EditBoxがある時にListBoxの選択肢をEditBoxに表示
させたいのですがプロパティが見つかりません。教えてください。
ComboBoxのTextのような物が見つからないのです。
EditBox.Text := ListBox.Items[ListBox.ItemIndex];
文字を一文字ずつ抜き出すサンプルとかで、
1バイトずつ見ていき、
「2バイト文字の1バイト目ならどうの、そうじゃなかったら」
なんてのがありますがWideStringを使えば、そんな事しなくても
良いと思うのですが、何か理由があるのでしょうか?
>>254
WideString使えない、使いたくない、あるのを知らない、などなどの理由から
controlbarにtoolbarをドッキングさせると
toolbar内のspeedbuttonが表示されません
なぜでしょうか?

フォームを移動させたり
controlbarのサイズを変更すると表示するのですが・・・
最初だけ表示されません
>>254
DelphiはコンポーネントやTStringListなんかがすべてSJISで統一されていて
WideStringで統一的にコーディングできないから。
なので毎回String<->WideStringの相互変換が発生して遅くなる。
例えば
var s: String;
function Foo(ws: WideString): WideString;
...
s := Foo(s);
とやるとString->WideString->Stringと変換されてしまう。
速度を気にしなければ自作のライブラリはすべてWideStringで統一するというのもありといえばあり。
258254:04/06/29 21:15
>>257
非常に納得。アリガd
259デフォルトの名無しさん:04/06/29 23:14
TStringListのLoadFromFileメソッド使ってファイルを読み込む時の質問です。
File自体が存在しない時の対応処理できるのですが、
Fileは存在するが中身が空の時にエラーが出ます。
「デバッカ例外の発生。リストのインデックスが範囲を超えています。(0)」
ヘルプを読んでもイマイチ解らないです。
このエラーの意味と対策を教えてください。
260デフォルトの名無しさん:04/06/29 23:15
1GBのファイルを読みこむにはどうすればいいの?
>>260
なにがやりたい?
>>259
普通はLoadFromFileで中身が空のファイル読み込んでもそんなエラーは出ない。
アップデートちゃんと当てているか?

>>260
TFileStream

>>262
ありがと
>>259
というか例外処理してる?例えば
try
 sl.LoadFromFile('test.txt');
except
 on E: Exception do ShowMessage(E.Message);
end;
とか。
単純に、「読み込んだ後の処理」で例外が出てるんでしょ?
「何も無いのにインデックスもへったくれも」ってことでは?
266A:04/06/29 23:39
Delphi4 std. で、アプリからユーザーにメッセージを表示したいのですが、
その時に、以下のような動作を期待しています。

メインのフォームとは別の、メッセージを載せたフォームを、画面最前面に表示したい。
このフォームは一定時間後に、自動的に閉じられる(<これは出来てる)
ただし、その際に、現在動作している他のアプリのフォーカスは奪いたくない。
最前面に表示するのは、メッセージフォームのみで、メインフォームは下に置いたまま。

要は、できるだけ、ユーザーの邪魔をせずに、メッセージをそっと通知したいのです。

どういったコードで実現できるでしょうか?
TWebBrowser を使って表示したページの特定のフレームの Document にアクセスするにはどうすればいいのでしょう?
(TWebBrowser1.Document as IHTMLDocument2).frames.item(pvarIndex) でフレームには行き着いているようなのですが、
その後が分かりません。
>>265
もしかして読み込んだ後にsl[x]にアクセスしてるということ?
それならアクセス前にsl.Countが0でないかどうかをチェックしろ、ということですな。
>>268
そーゆーことだと思ったが。違うの?
>>269
LoadFromFileで冷害が発生してるのかとオモタ
271259:04/06/30 00:08
>>262
返事どうもです。
アップデートに関してですが、
インストールしたばかりでBorlandのdelphiダウンロードのそばにあった
バッチファイル2つはあてました。
TstringListでStrings[i]使うとエラーがでます。実際、空なのでi行目には
データは入ってないのですがこれは無視できませんか?
Form1.FormPaintでImage1を書き換えてるのですが
Image1を書き換えるとForm1,FormPaintが呼び出されて
無限ループになります

Form1が再描写されるときにImage1だけ再描写するにはどうすればいいのでしょうか?
Image1のOnPaintを使うべきだ
274259:04/06/30 00:23
皆さんありがとうございました。
>>271
だからStrings[i]使う前にCountでちぇっくしろと
Image1のオブジェクトインスペクタにOnPaintがないのですが
どうすればいいでしょうか?
PaintBox
PaintBoxいただきです
ありがとうございました
279デフォルトの名無しさん:04/06/30 01:36
ある範囲全体をスペースでずらす事は出来ますか?
新しくif文で入れ子にする時、その中身全体をずらしたいという事です。
>>279
Delphiヘルプ→キーワード→「キーボードショートカット」→エディタ(デフォルト)
にある「ブロックをインデントする」「ブロックをアウトデントする」でどうぞ。
281デフォルトの名無しさん:04/06/30 01:52
>>280
ありがとうございます。
便利なものですな
>267
確かEmbeddedwbにフレームにアクセスするメソッドがあったと思う。
>>266
こんな感じでどうですか? 十分にテストしてないのでご了承ください。
Form1 がメインフォーム、Form2 がメッセージ用のサブフォームです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Label1.Caption := 'メッセージをセット';
  SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOMOVE or
    SWP_NOSIZE); // 非アクティブで最前面に表示
end;

上記の方法で表示すると Form2 の Close が効かなくなるので、
WM_SYSCOMMAND に応答して以下のコードを書いてください。

procedure TForm2.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_CLOSE then
    ShowWindow(Handle, SW_HIDE); // 非表示にする
  inherited;
end;
284A:04/06/30 05:20
>>283
ありがとうございます。
組み込んでみたところ、ほぼ期待通りの動作になりました。

なぜか最初の1回目だけ、メインフォームがアクティブになっちゃうのですが、
他の部分が悪さしてる可能性があるので、一度シンプルなテストを作って
いろいろ動作を調べて見ます。
TRichEditに64KBまでしか入力できないんですけど、そういうものなのでしょうか?

今までTMemoを使ってたのですが、一行に4000文字くらい表示することになったのでTRichEditに変更しました。
TMemoからRichEditに乗り換えてる人は結構いるみたいなんですが、どうしてるんでしょうか?

よろしくお願いします。

環境
WindowsXP Professional SP1
Delphi 7.0 Professional
> TRichEditに64KBまでしか入力できないんですけど、そういうものなのでしょうか?

違います
287285:04/06/30 11:26
違うんですか、そうですか。
調べてみます。どうもありがとうございました。
> WindowsXP Professional SP1

XP なら TMemo でも 2GB まで行くはずだけど
TRichEditって使いにくくない?
漏れは乗り換えようとして乗り切れなかった・・。
表示だけならWebBrowser最強
291デフォルトの名無しさん:04/06/30 12:42
IndyでノンブロッキングでHTTPダウンロードするのってどうやるの?
292285:04/06/30 13:06
>>288
いや、なんか一行1KBまでだったんです。
> 一行に4000文字くらい表示することになったので

????
294285:04/06/30 13:59
A NUMBER(3)
B NUMBER(5)
C CHAR(10)
D CHAR(1)
E VARCHAR2(2000)
F VARCHAR2(2000)

↑なテーブルからエクスポートしたCSVを表示したいんで。
表示って書き方がおかしかったですかね。






て有価、俺、なんか勘違いしてる?
1行に4000文字もあったら管理する気うせる
>>194
なぜ一行で表示したいのか分からない。TMemo に垂直スクロールバーをつけて表示
しても良いのでは。StringGrid でもよいし。
× 194
○ 294
298285:04/06/30 14:58
>>295-296
激しく同意なんですが、そういう仕様で既に作ってあったんです。
いままでは、1レコード1KB以下だったんで全部TMemoで問題なかったんですが
今回>>294のテーブルを追加してしたんで、RichEdit使うことになったんです。
virtualなlistviewのがよくないか
ループで1文字ずつ代入していってどこでバグるか見れば制限がわかるだろ
64kで止まったコード出すか?
こうやってDelphi製ソフトの評判が落ちていくわけか・・・
302285:04/06/30 15:11
>>300
あ、すいません。最初の問題は解決しました。
MaxLenghtを弄ったら大丈夫でした。
TRichEdit とか TMemo はウィンドウズのコントロールであり Delphi は無関係
296 の仕様でよいなら TMemo で無問題
>>301
だからVB製ソフトは評判が悪いのか・・・・
>>305
そうやって、いきなりVBだしてくるなんて
過剰反応するから・・・。
VBの話題はスレ違いです

VB vs Delphi @夏厨2004
http://pc5.2ch.net/test/read.cgi/tech/1088578261/
なんかヒステリックな反応が迫害されたΩ信者みたいだな。
関係ないものに例えて
変なイメージを植え付けようとするのは
詭弁のテクニックだね。
関係あるものに例えたら例えになりませんが。
Del厨って日本語にも不自由なんだな。
・Delphiのアプローチ
問題にぶつかる→できない(本人の力不足)→Delphiの評判が落ちる

・VBのアプローチ
問題にぶつかる→できない(言語の力不足)→VBの評判が落ちる
DelphiとVBとの比較話題はスレ違いです

VB vs Delphi @夏厨2004
http://pc5.2ch.net/test/read.cgi/tech/1088578261/
315デフォルトの名無しさん:04/06/30 21:20
挫折したので誰か助けて〜
下のVBを移植してください。

Dim i As Long, FileNum As Integer
FileNum = FreeFile()
Open "map.dat" For Binary As #FileNum
For i = 0 To 40000
Get #FileNum, , map(i)
Next i
Close
316デフォルトの名無しさん:04/06/30 21:36
Var
 i: Longint;
 FS: TFileStream;
Begin
 FS := TFileStream.Create('map.dat',fmOpenRead);
 Try
  For i := 0 To 40000 Do
   FS.ReadBuffer(map[i],SizeOf(map[i]));
 Finally
  FS.Free;
 End;
End;
getmem allocates memory from the RTL memory manager and returns a pointer.
the returned pointer must be freed with freemem.

memproof0948でオブジェクトリストをfreeすると出る警告なのですが
解放できてないのでしょうか?
なんか知らんけどオブジェクトリストにGetMemしたヒープをぶら下げてるとかじゃないの
オブジェクトリストに オブジェクトリストぶら下げてます
ツリーになってます
321315:04/06/30 22:20
>>316
ありがとう〜。
そうやって使うのか・・・
memproofってなに?
解決しました
destroyでオブジェクトリストの解放を忘れてました
ListViewのリストアイテムの追加時にそのアイテムの文字色を
奇数行は赤色、偶数行はオレンジ色というふうにするにはどうすればいいのでしょうか?
>>316
beginとendのキャップがキモイ
>>316
var、try、for、to、do、finallyも
それより質問者は何で 40001 回に分けてコピーしてるか意図不明。
VB って連続バイトのコピーもできないのか?
まぁまぁ、こっちだって読み込んだだけで使わずにFreeしてるし
329デフォルトの名無しさん:04/07/01 13:48
すみません。こんな変数は可能でしょうか?
Tfruits
fruits.kind[1]='ばなな';
fruits.amount[1]= 5;
fruits.price[1]=100;
fruits.kind[2]='みかん';
fruits.amount[2]= 10;
fruits.price[2]=250;

型とか変数とか配列でヘルプを見てるんですけど、いまいちピンと
来ません...。
= は := です。
>>329
可能かどうかなら可能だけど、俺ならTfluitsにkind、amount、priceを持たせて
fluitsを配列にする。
Tfurute = record
kind :string;
amount. praice: Integer;
end;

var
fruits: array[0..2] of Tfuruts;
>>332
変です
334A:04/07/01 18:37
>266 >283

シンプルなテストアプリを作ってやってみたところ、一部に、よく判らない動作が
おきているようです…。

Form2 に pop手続きを作り、そこで、以下のように記述。
タイマーはForm2を自動で閉じるための物です。(ShowWindow(Handle, SW_HIDE);を記述)

procedure TForm2.pop;
begin
 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
  SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
 Timer1.Enabled := True;
end;

Form1の呼び出し側では、同じくタイマーで、一定間隔で自動的に、Form2.pop; を呼んで
Form2を表示。

この作りで、Form1が、アクティブ、非アクティブ、最小化、いずれの状態でも
Form2は表示され、かつ他ののアプリの邪魔をしないという、期待通りの動作をします。

ところが、Form1が非アクティブかつForm2が表示されている間に、Form2をクリックすると、
1) Form2がアクティブ化、Form1が非アクティブのままトップに表示。
2) タイマーでForm2が、消えると同時に、Form1は、元の位置(アクティブの後ろ)へ。
3) 次のForm2.pop;で、Form2が表示されると同時に、Form1も非アクティブのままトップへ。
4) タイマーでForm2が閉じると、今度はForm1が非アクティブのまま最上面に残ります。
これ以降は、Form1がトップに出たまま、Form2が表示/非表示を繰り返します。

どうしてこんなことになるのか・・・。
335315:04/07/01 21:53
>>327
おお!
連続バイトのコピーを使った奴で教えてください。
PLCだと解かるんだが、PCはむずい。
var
  FileNum: Integer;
  Map: Pointer;
begin
  GetMem(Map, 40001);
  try
    FileNum := FileOpen('map.dat', fmOpenRead or fmShareDenyNone);
    if FileNum >= 0 then
      try
        FileSeek(FileNum, 0, 0);
        FileRead(FileNum, PChar(Map)^, 40001);
      finally
        FileClose(FileNum);
      end;
    // 読み込み後の処理
  finally
    FreeMem(Map);
  end;
end;
337315:04/07/01 23:07
>>336
ありがとう。
なるほど、pointerか・・・
それにしても何故HELPでFileOpenとか出て来ないんだ・・・?
あぁ、でも霧が晴れてきた感じ。
openfileなら出るんじゃない?とか言ってみるテスト
せっかく316がTFileStream使ったのに水の泡じゃん。
初心者を惑わすなよ。
Pointer を使ったのは map が何を意味するのかわからなかったからで、
普通は型付きの配列を使った方が簡単だと思うぞ。

FileRead の第二引数は ReadFile API に先頭のアドレスを渡すだけだから、
その先のメモリがちゃんと確保されていれば型は関係ない。
USBの232C変換アダプターでのシリアル通信で注意することってありますか?
Delphiとは関係ないのですが、今までPC直付けのComで無問題だったのが
USBに変えたらトラブりだしてしまって。
342A:04/07/02 04:13
>>334
自己レスです。

Form2がクリック等でアクティブになったときに、Form1をアクティブにしてやることで、
一応問題は回避しました。

それとはたぶん別件で、アプリが、ときどきなぜか、勝手に前面に来る、という症状が
起きています。
Application.OnActiveteが発生しているようなのだけど、一体誰が起こしてるのかが
掴めない…。イベントを発生させた元を突き止める方法は、無いでしょうか?
343デフォルトの名無しさん:04/07/02 06:40
EditBoxを複数扱う処理について教えてください。
フォーム上にEditBoxがたくさんありButtonを押した時のイベントハンドラ
でそれらを例えばファイル出力する時に以下のコードを書きました。

for i:=0 to ComponentCount-1 do
begin
if Components[i] is TEdit then
begin
Writeln(F,TEdit(Components[i]).Text);
end;
end;

でも、この場合だとどのEditBoxかが判断できず
もし、2つのEditBoxをフォーム上で入れ替えたら
処理が逆になってしまいます。
どうしたらいいでしょうか?
>>343
sl:= TStringList.Create;
try
・sl.Sorted:= True;
・for i:=0 to ComponentCount-1 do begin
・・if Components[i] is TEdit then
・・・sl.AddObject(Components[i].Name, Components[i]);
・end;
・for i:=0 to sl.Count-1 do begin
・・Writeln(F,TEdit(sl.Objects[i]).Text);
・end;
finally
・sl.Free;
end;
>>344
すばらしい!
>>341
クリティカルな処理をしない限り、基本はCOMだろうがUSBだろうがさほど変わらないように思えるんだけど、
どういうトラブルが発生したか教えてほしい。
DelphiとVB、どちらが簡単ですか?
349デフォルトの名無しさん:04/07/02 13:35
>>331-333
どうもありがとうございます。
こんな感じにしましたけど、なんかムダとかヘンな使い方してるとか
こんな使い方はしないとかありますか?
type
Tfruits = record
name : string;
amount, price : integer;
end;
type
Tfruitsshop = record
name,address,tel : string;
fruits : array[1..100] of Tfruits;
end;
var
tokyoshops : array of Tfruitsshop;
begin
setlength (tokyoshops, 123);
with tokyoshops[1] do
begin
name := 'フルーツパラダイス';
address := '渋谷区横浜1-2-3';
tel := '03-1234-5678';
fruits[1].name := 'みかん';
fruits[1].amount := 100;
fruits[1].price := 50;
fruits[2].name := 'りんご';
fruits[2].amount := 50;
fruits[2].price := 150;
end;
end;
> setlength (tokyoshops, 123);

念のため。これだと

tokyoshops[0] から tokyoshops[122] まで

> fruits : array[1..100] of Tfruits;

これも
fruits : array of Tfruits;
にしてSetLengthして使った方が無駄がなくていいと思う。
てゆーかTObjectList使っとけ
レコード型だから TList で十分
VB.NETの方がgenericsが使えて安全ですね。
でも遅いし、40MBのランタイムいるし。
TRegistryでReadStringについて質問があるんですが、
値を取得しようとするといつも「""」がついてくるんですが、
これをつけずに読み込む方法はないでしょうか?
357356:04/07/02 19:07
すいません、こちらの手違いでした。
FileListBoxって勝手にアイテムがソートされてしまうのですが、
これを無効にすることはできませんでしょうか。。?
iriaとかFlashGetとかダウンローダーにあるようなファイルの途中からのリトライ機能ってどうやってるんですかね?
どこかにDelphiに限らず資料とかないですか?
おおっ!
素早く適切な資料をありがとうございます!
362215:04/07/02 22:39
ParamStr をローカル変数に代入せずに処理するとうまくいきました。
ParamStr なんてどこにも使われていないじゃないか。
いやいや、想像するに、二重起動を禁止して、自アプリの起動済みのヤツに自分の
ParamStr() を知らせるために WM_COPYDATA を使ってるのかと。メモリリークは
どこで起こるか、想像できんが。
>>353
ヒープにとるならレコードである必要はないだろ
367デフォルトの名無しさん:04/07/02 23:24
theSpoke版でVB.NET始めるのとDelphi Personal買うのとどっちが賢いですか?
今すぐ完成度の高いものを作りたいならDelphi7Pro
そうでなければC#
>>367
両方はじめて見識を広げる
>>369
サイズ固定する意味ないだろって流れだろ
>>367
Delphiスレで質問するとはいい度胸してるな。



どっちもやっとけ。

Delphi8にはPersonalはないけどな。
なんかムダとかヘンな使い方してるとか
こんな使い方はしないとかありますか?
Delphi6 Personal(無料)
Delphi8 はすすめない。Delphi6Personal なら無料のはず。
4830円>>>無料
>>375
?????
>>358
FileListBox は Win16 のなごり。つかわないのが吉。
では、ParamStrとWM_COPYDATAを使ったメモリリークするコードを教えて欲しい。

ParamStrをローカル変数に代入するとリークし、
代入しなければリークしない。

だぞ?
>>381
他人のコードをさらして、メモリリークの疑いをかけるのは本当に失礼なことだね。

>ParamStrをローカル変数に代入するとリークし、
>代入しなければリークしない。

コードを見ないと皆目見当もつかないけど。
自分のコードは匿名でもさらさない、か・・・
そんなにメモリリークが気になるなら、送信したい文字列をINIファイルに保存して
受信側で適当なタイミングにINIファイルを読み込むようにすればどうだ?

タイミングは自分で考えるべし。
>>380
ということは、ソートを無効にすることはTFileListBoxでは無理なのですね。。
自作コンポの勉強するかな。。
TFileListBox はソースが付いているでしょ。
>>384
それはダサ過ぎ。WM_COPYDATA をつかっても、メモリリークは解決したそうだよ。
>>367
仕事用にC#
趣味用にDelphiやっとくと最高に仕合せです
>>388
趣味でも C# のほうが幸せになれそうだけど
390A:04/07/03 05:12
Form1に、TTimer、TIdHTTP、TUIWebBrowser を置いて、

OnTimer で、
s := IdHTTP.Get(URL);
UIWebBrowser.DocumentSorce := s;
といった、ことをしているのですが、謎の、Application.OnActiveteが発生します。

色々と調べてみたところ、どうやら、UIWebBrowser.DocumentSorce := s; の後に
発生しているようなのですが、毎回発生するわけではなく、
アプリをアクティブにした後、別のソフトに切り替え、その次の最初のOnTimerの時に
Application.OnActiveteが発生し、それ以降のOnTimerでは、発生しません。
再び、アプリ→他アプリの操作を行うと、また発生します。

これは一体どういったことなのでしょうか…? orz

ちなみに、起動直後、これらの処理をしているだけであれば、このApplication.OnActiveteが来ても、
アプリは特に、前面に出ることも、アクティブになることもありません。
>>367, ついでに>>388-389
>>314
それから、趣味ならソフトウェア板行ってVCLと.NETの評判を探すが良い
大体、VCL≒コンポ頼みなので細かい事できない、.NET≒遅すぎ論外
>>390
仮に、UIWebBrowserをフォームから消して、タイマーとTIdHTTPだけでやっても、同じ現象が起きますか?
393215:04/07/03 08:13
>382
本当にお恥ずかしい事です
コードはこれです
http://venus.aez.jp/uploda/dat/upload8209.zip
>>391
VCL≒コンポ頼みなので細かい事できない
とかいってるやつは単に知識が足りないだけじゃん。
だってそれいいいだしたらフレームワークやミドルウェア使うなーってことになっちゃうし。
結局アセンブラに近い無印Cがイイ!ってなるだけでさ。
>>394
禿同!
Delphiではコンポを使うだけじゃなく、作れることもお忘れなく。
使うだけなら初心者レベル。
両方出来た方がいいに決まってるだろ

と、流れを読まずにレスしてみるテスト
またこのごろテストするのがはやってるのか?

と、テストレスしてみるテスト
398385:04/07/03 11:12
>>386
すいません。当方D6Perのもので。。

orz
399デフォルトの名無しさん:04/07/03 12:31
StdCtrls ユニットや Controls ユニットがダウンロードできる
サイトってどこでしたっけ? ちょっと忘れました。
400359:04/07/03 13:35
>>366さん
Irvineのソースコードあったんですか・・・orz
ありがとうございます。
401A:04/07/03 15:55
>>392
UIWebBrowserを消しては居ないのですが、DocumentSource への代入をコメントアウトすると
どうやら、Application.OnActivate は発生しないようです。
逆に、IdHTTPを、コメントアウトして、定型文を DocumentSource へ代入した場合、
発生するようです。
どうやら、UIWebBrowserが原因のようですね。 といっても使わないわけにはいかないし…。
どうしたものか…。
大人しくTWebBrowser使うとか。
>393 begin

404デフォルトの名無しさん:04/07/03 17:18
string型の配列について質問させて下さい。
コンパイルは通るのですが「デバッカ例外が発生しました」というエラーが出ます

var TestS : array[1..5] of String;

TestS[1]:='テスト';

上記のような感じなのですがアドバイス下さい。
>>404
ShortStringで固定長にするか
TStringList使え
406A:04/07/03 17:31
追加です。いろいろ調べてみたところ、アプリ起動後の状態では、
UIWebBrowser.DocumentSource をいじっても、Application.OnActivate は発生しません。
ところが、一度、UIWebBrowserをクリックしてから、他ソフトに切り替え、その後に、
UIWebBrowser.DocumentSource をいじると、Application.OnActivate が発生するようです。

よくわからないのは、UIWebBrowserをクリックしても、ActiveControlは、変更にならない。

UIWebBrowserをクリック後、他のコントロールをクリック(ActiveControlはそれになる)しても
Application.OnActivateは発生する。
この時、アプリをアクティブにすると、そのコントロールは、ActiveControlはそのままに、
フォーカスを失っている模様。

UIWebBrowserをクリック後、他のコントロールAをクリック、続けて別のコントロールBをクリック
すると、Application.OnActivateは発生しない。フォーカスもそのまま。

という挙動をするようです。

>>402
そのまま、TWebBrowserを加えて、usesに、MSHTML_TLB を追加したところ…
自分で使っている、Booleanの代入全てに、Booleanは、Integerと互換性が無い、とのエラーが… orz
407404:04/07/03 17:34
>>405
アドバイスありがとうございます。
しっかり状況を説明していなかったのですが
上のようなString型をいくつかつかってレコード型で扱いたいのです。
ですからレコード名をAとすると
A.TestS[1]:='test';
という感じです。
ShortStringで固定長にしてもダメでした。
TStringListはレコード内で使えるのでしょうか?

いろいろコンパイルしてみて>>404で書いた部分でエラーが出ることが解ったので
単純に質問したつもりだったのですがどうもすいません。
知ってるかもしれないけどWebBrowser使うとなると別の不具合が発生するよ。
修正は可能らしいけど。
また役に立たない情報ですね
>>407
TSample = record
 TestS: array[1..5] of string;
end;

こんなの??
>>404
ほんとにそのサンプルコードで落ちるか?
>>407
レコードを動的に確保してInitializeしてないとか?
413A:04/07/03 17:42
>>404
string(TestS[1]) := 'テスト';
で、コンパイルは通った。正しく動いてるかどうかは、判らないけど。

いちおう、その方法で、1〜5に適当な文字列を入れて、
各行を、Memo1.Lines.Add(TestS[1]); とかで出したら、ちゃんと出た。
256文字以上とかのは、調べてない。
414404:04/07/03 17:43
>>410
度々スイマセン。
こんな感じです。string型は大丈夫なのですが配列の場合がメモリエラーが出ます。
もしかしてstring型の配列はポインタを使うのでしょうか?

TSample = record
TestS : array[1..5] of string;
TestT : array[1..5] of string;
teleS : string;
numberS : string;
end;

A : Tsample;
>>414
そのコードじゃどうやってもエラーでないぞ。
新規プロジェクト作ってエラーの発生する最小限のコードを書いてうpしろ。
416A:04/07/03 17:49
>>414
TSample = record
 TestS : array[1..5] of string;
 TestT : array[1..5] of string;
 teleS : string;
 numberS : string;
end;
var
 A : Tsample;

って状態で…

procedure TForm1.Button1Click(Sender: TObject);
begin
a.TestS[1] := 'テスト';
a.TestS[2] := 'てすと';
Memo1.Lines.Add(a.TestS[1]);
Memo1.Lines.Add(a.TestS[2]);
end;

が問題なく、実行できたよ。 >413の要らなかったのね…。
>>414
意外と再起動したら直るかもしれん
418404:04/07/03 18:02
皆さんアドバイスありがとうございます。
そして申し訳ございません。
最後のファイル出力コードをコメントアウトしたら動きました。
その原因は少し考えて見ます。
Aさんいろいろ試してもらって本当にすいませんでした。
JavaScript(JScript)やVBScriptにオブジェクトを追加して使用したいのですがそういうコンポーネントはありますか?
DMonkeyはちょっと遅すぎたのでDMonkey以外でお願いします
EXEがCOMサーバになってWSHからいじってもらえばいいんじゃないの
421A:04/07/03 19:24
Application.OnActivateを来ないようにするほうほうが、見つからないので、
Application.OnActivateが来ても問題無くする方向で、対処することにしました。
>266 >283 >334 >342 の関連です。

現在のテストアプリは、Form1、Form2 を用意して、

---Form2---
procedure TForm2.pop(Sender: TWinControl);
begin
 FSender := Sender;  //呼び出し元を記憶。
 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
  SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOMOVE or
  SWP_NOSIZE); // 非アクティブで最前面に表示
 Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
 ShowWindow(Handle, SW_HIDE); // 自動的に隠す
 Timer1.Enabled := False;
end;



422A:04/07/03 19:24
(続き)
procedure TForm2.FormActivate(Sender: TObject);
begin
 SetWindowPos(FSender.Handle, HWND_TOP, 0, 0, 0, 0,
  SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE); // 呼び出し元をアクティブに
end;

---Form1---
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 UIWebBrowser1.DocumentSource := IntToStr(i);
 Inc(i);
 if (i mod 5)=0 then Form2.pop(Self);
end;

という形になっています。
Form1のタイマーがくると、UIWebBrowserが更新され、 
5回に1回Form2が最前面に表示され、一定時間で自動的に隠れます。

この状態で、1度でも、Form2.pop を使った後に、Application.OnActivate が来ると、
Form1が、非アクティブの状態で最前面に表示されてしまいます。
恐らく、隠れているForm2の、HWND_TOPMOST 設定が悪さをしているような気がするのですが、
隠す前に、Form2や、Form1を、SetWindowPos APIでいろいろ設定を変えても、
思ったような動作になりません。

Form2を使った後、Form1の状態を、使う前のものに戻すには、どうすればいいのでしょうか?
隠すだけならvisible使ったほうが楽だとおもうけど
>>420
ありがとうございます
しかしDelphi6 PersonalだとCOMサーバーアプリは作れないみたいです
情報が小出しになってしまい申し訳ありません。
425A:04/07/03 19:48
>>423
Visible := False;
だと、隠れないみたいです。
>>424
だったら
>オブジェクトを追加して
も無理じゃないの?
オブジェクトって自作のってことでしょ。
TDateTimeに指定できる最も大きい値って何?
type TDateTime = type Double;

Double の範囲5.0 x 10^-324 .. 1.7 x 10^308

意味があればね
>>421-422 >>425
TForm2.pop の SetWindowPos〜 の後に
Visible := True; を入れてみたらどうでしょうか?

そして TForm2.Timer1Timer の ShowWindow〜 を Hide;
(または Visible := False;) に変えてみてください。
>>419
というかJavaScript(JScript)やVBScriptって速いの?
431A:04/07/03 23:42
>>429
やってみました。その方法だと、確かに隠れるみたいです。
でも、Application.OnActivate で Form1が最前面に出てきてしまうのは、
同じみたいです…。
>>215
>>393のソース

確かにメモリリークを起こしていますね。
解放し忘れているのは TConversion で TRichEdit関連。
最初に起動した方を終らせるときにでます。

ファイル名を渡さなくても、
 RichEdit1.Lines.LoadFromFile('C:\hoge\Unit1.pas');
の様に直接読み込んでもリークしますよ。
>>426
VBScriptやJScriptのパーサーがあれば自由に追加したりできるのではないかと思い質問してみました

>>430
DMonkeyはコンパイルの作業があるのでDMonkeyよりは速いと思います
ところで、WM_COPYDATAで送るときにGetMemは必要ないよね?
長い文字列型は、GetMemでメモリを確保しているんだし。
TRichEditStrings.LoadFromFileが原因みたい。
WM_COPYDATAは関係無し。

これだけで二つ解放し忘れてる。

procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Lines.LoadFromFile('C:\test.txt');
RichEdit1.Lines.LoadFromFile('C:\test.txt');
end;
メモリリークのバグを修正しました。

procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Lines.LoadFromFile('C:\test.txt'); Dec(AllocMemCount);
RichEdit1.Lines.LoadFromFile('C:\test.txt'); Dec(AllocMemCount);
end;
>>433
コンパイルの作業があるから遅いってどういう意味?
普通はコンパイルした方が早くなるのだけど。
だってそうでなきゃわざわざコンパイルなんかしないって。
いっとくけどスクリプト言語は総じて遅いよ。だからCとかでサブルーチン作ったりするわけだし。
フォルダーと拡張子の無いファイルを見分けるのはどうすればいいのですか?
FileGetAttr 関数かGetAttribute関数
>>438
拡張子の有無で判定するのは危険。フォルダにだって拡張しつけられるし。
>>439
>>440
ありがとうございます無事動作しました
442デフォルトの名無しさん:04/07/04 16:32
「デバッカ例外が発生」というエラーに悩まされています。

プロジェクトProject1.exeがEAccessViolationクラスの例外を発生しました。
'Access violation at adress 00404272 in module 'Project1.exe' Read of adress FFFFFFFF'
プロセスは停止しています。再開するにはステップ実行又は実行を選択してください。

というメッセージです。
自分で確認し間違っている所はないと思うのですが・・・
例えば以下のコード(ボタンを押した時のイベントハンドラ)で出ます。
コード自体は只フォーム上にTEditを幾つか配置してそのTEdit内の文字数を
Integer型の配列mojilに入れていくというもので特に意味はありません。
デバックするとfor文2回目のmojil[i]:=… の所でエラーが出ます。
どうかアドバイスを下さい。お願いします

for i:=0 to ComponentCount-1 do
begin
if Components[i] is TEdit then
begin
  mojil[i] := Length(TEdit(Components[i]).Text);
end;
end;
443デフォルトの名無しさん:04/07/04 16:59
>>442
そのコード自体は問題ない。新規アプリで試せば動くはず。
ヘルプ読んで思い当たる節ない?

<ヘルプ読もうね>
EAccessViolation 例外は,アプリケーションで次のような動作を実行した場合に生成されます。
・nil ポインタを逆参照した場合
・コードページに書き込もうとした場合
・そのアプリケーションに対して仮想メモリが割り当てられていないメモリアドレスにアクセスしようとした場合
上のコードだけで推測した場合、mojil[i]の添え字 "i" が、
mojilの要素の数 - 1 "high(mojil)" を超えてしまった事が
例外の原因と考えられる。
445442:04/07/04 17:19
>>443
返事ありがとうございます。
「デバッカ例外が発生」のhelpしか読んでませんでした、すいません。
しかし、EacessViolation例外のhelpもポインタ使ってないですし思い当たる節がありません。
元々>>442のコードだけでなく、どこで上記のエラーが出るのか調べていました。
何か全然関係のないコードを削ったりしたらエラーが消えたり出たりでおかしいのです
(これじゃ意味不明だと思いますが)
>>442のコードは新規アプリで実行しています。フォームにはbuttonとTEditを10個程置いてです。
このコードでエラーが出るのは変だと思ったのでここで質問した次第です。
環境はXP-Home、Delphi personal version6.0 Update Pack2 を使用しています。
446442:04/07/04 17:54
>>444
仰るとおりです…、ありがとうございます。
元のコードを直しても動きました。
本当に情けない、こっ恥ずかしいです。
俺はこんなミスに丸一日悩んでいたなんて…
元のコードは関係のない所を消したりしたら上記のコード書いていても問題なく出来たのに、
新規アプリで上記のコードだけだとエラーが出るのでかなり迷宮入りしてました。
只、こういうミスで上記のエラーが出ることを知ったのは初心者の私にとって勉強になりました。
丸一日というとても高い勉強代だったような気がしますが。
ほとんど愚痴になってしまってすいません。ちょっと今の気持ちを吐き出したかったので。
本当にありがとうございました。

最近じゃ自分が書いたコードを見てもさっぱり原理(アルゴリズム)が理解できん。
昔の自分、頭よすぎ・・。

448デフォルトの名無しさん:04/07/04 21:15
TTreeView で質問
ImageList に0〜2の三枚の画像を登録し、
Collapsed のとき、ImageIndex := 0
Expanded のとき、ImageIndex := 1
とある TTreeNodeは ImageIndex := 2
としています。ここまでは普通に動きます。

で、とある TTreeNode (ImageIndex=2) をクリックすると
ImageIndex が 0 の画像を表示してしまいます。
このとき、Collapsed, Expandedイベントは発生しないようにクリックしてます。
(実際に発生してません)

OnClick イベントで直接 Selected.ImageIndex := 2 としても反映されません。

どうしてなのでしょうか?また回避方法はありますでしょうか?
Delphi7 を使用しています。
>>447
ちなみに何歳ですか?
1年前のコードなんてほとんどわかんねーよ
下手すると3ヶ月前でも危ないぜ
>>448
もしかしてイベント起こるごとに画像変えてるの?

TTreeNode.ImageIndex  >通常時の画像
TTreeNode.SelectedIndex >選択時の画像

これでどぞー。
>>451
ありがと。
えーと、伝わりにくくて済みません。
画像は3種類で、
1.展開時の画像(ImageIndex=0)
2.折りたたんだ時の画像(ImageIndex=1)
3.展開時、折りたたんだ時関係なく、一定の場所にある Node の画像(ImageIndex=2)

一定の場所の Node (ImageIndex=2) を選択したときに、
1の画像になってしまう現象です。(常に ImageIndex=2 にしたい)

ImageIndex は フォームクリエイトで設定し、

Expandedイベントと、Collapsedイベントでも
Node.ImageIndex を再設定しています。
>>452
Node.ImageIndex := 0;
Node.SelectedIndex := 1;

これでNodeは通常時0の画像が、選択時1の画像が自動で表示される。
じゃあ常に同じ画像を表示させるにはどうすればいいでしょう?
454デフォルトの名無しさん:04/07/04 22:53
>>453
されは OnClick イベントに書くんですよね。
えーと・・
ちょっと今考えてます。
>>454
いや、Nodeの作成時に設定すれば後は勝手に通常、選択で画像を切り替えてくれる
イベントとかに記述してた画像切り替えの部分は全削除で
456448:04/07/04 23:03
>>455
ありがと。
固定したい Node の
ImageIndex := 2;
SelectedIndex := 2;
とすると、2で固定されたみたい。
正解ですか?
>>456
激しく正解
>>449
23です。
ちなみにコードはだいたい1年3ヶ月前ぐらいにかいたもの。

一度だけですが、昔の自分のコードを見てあまりの見事さに
「これを自分が書いたのか」と驚いたことがあります。(アルゴリズムの話)
>>457
わっマジでありがと。
ImageIndex だけ設定しても
SelectedIndex に値を入れていないと0になっているから
それが表示されていたって事ですね。

SelectedIndex って知らなかったw
TStringListの文字列リストをCSV形式でテキストファイルに保存するには
どうしたらいいでしょうか?
今まではSaveToFile使って保存していました。
CSV形式で保存するには一度CommaTextプロパティを使って文字列変数に入れて
それを吐き出すしかないのでしょうか?
それしかない
CommaTextを別のTStringList.Textに放り込んでSaveToFileするとか。
463460:04/07/05 00:13
>>461-462
そうですか。
ありがとうございました。
>>458
>「これを自分が書いたのか」と驚いたことがあります。

そういうことってあるね。異様に冴えている瞬間があるんだよ。
>「これを自分が書いたのか」と驚いたことがあります。
違う意味ならある(w
コードは必ずにコメントを付けておきましょうね
鬱状態になると、思考力集中力等が落ちて、
今まではどうでもなかったことが、
出来なくなったり、多大な負担を感じるようになる。


と言うのは
TStringListのLoadFromFileでテキストファイルを読み込むとき
行ごとの扱いはStringsプロパティで
MyStringList.Strings[i]またはMyStringList[i] // Mystringlist : TStringList;
とし、これを使えばいいのは解るのですが
各文字列リストの文字ごとを扱うにはどうしたらいいでしょうか?
例えばMyStringListの一行目の三文字目を指定したい時などです。
MyStringList.Strings[0][3] 違いますよね・・・
教えてください。
一旦ローカル変数へ代入するのが良いと思います。
copy(MyStringList.Strings[1],3,x)
とか…。
ちなみにMyStringListが「空っぽ」じゃないことを確かめないと
またいらんエラーが。

delphi「1行目も何も、空だっちゅーの!」
471470:04/07/05 01:48
間違えた。「strings[1]→[0]」か…。
>>469-470
返事どうもです。
一回文字列に代入して扱う事にします。
473A:04/07/05 04:07
>>468
やってみたら、
MyStringList.Strings[0][3];
でも、動いたよ。
ヘルプを読めば一発で解決すると思った。
475デフォルトの名無しさん:04/07/05 04:19
| 何について調べますか?
| ┌────────────┐
| |. おまえの消し方        |
| |.                    |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ
>>475
おまえは画面上ちょろちょろするから好かん
質問です。
Tmemoからクリップボード使ってチャットに張り付ける「AAコピペツール」を作ったのですが
ときどき「クリップボードを開くことができません」というポップアップが出てしまって困っています。
あまりに高速連続で張り付け過ぎなのか・・・
例外処理しても出てくるんです、こいつ。

しかもソフトの都合上、最前面に表示してるのですが、ポップアップがウィンドウの後ろに隠れてしまうのです。
ポップアップの上にウィンドウが有ると見えないのにポップアップにフォーカスが行くのでウィンドウも移動できず、
強制終了するしかない!ように見えるのが辛い。
 (enterを押すとポップアップのOKが押されるので注意書きには書いてあるのですがイマイチな対処法で・・・)

しかもペースト先がJAVA製の為かクリップボードを使わずwinapi使って文字列を送り込む事が出来ないようで( つД`) (CTRL+V ENTERの情報を送ってます)

検索掛けてもクリップボード監視ソフトが怪しいくらいしか出てなかったのでほとほと困っております。
どなたかこのエラー消す方法を教えてくださいませ。

ウェイト掛けるとこのエラーは出てない気がしますが、高速の時でも出たりでなかったりなので解りません。
>>475
その質問、入力したことあるw
479A:04/07/05 05:57
>266 以来、お騒がせしていた、サブフォームポップアップと、謎のApplication.OnActivate問題が
やっと解決しました…。

結論から言うと、Form2のポップアップに、SetWindowPos APIを使わずに、

 FormStyle := fsStayOnTop;
 Show;

隠す時には、

 FormStyle := fsNormal;
 Hide;

で、OKでした…。
この隠す時に、FormStyleをセットしなおすのが大事だったようで、
>266の質問する以前は、この処理をしていなかったため、Form1が勝手にポップアップする
という現象が起きていたようです。それで、FormStyleは使えないと判断してしまっていました。
あと、fsStayOnTop で、Show しても、アクティブになったり、フォーカスを奪ったりは、
しないんですね…。

1週間かかって、こんな単純な方法でよかったなんて… orz
いろいろお騒がせいたしました。
TList.Sortを使ってソートしているのですが
ソートを重ねると値が同じところが入れ替わります
ソート結果を安定させる方法は無いでしょうか?

(b,1)(d,2)(d,1)(a,1)(c,1)(a,2)(d,3)
        ↓
(a,1)(a,2)(b,1)(c,1)(d,1)(d,2)(d,3)   1回目のソート
        ↓
(a,2)(a,1)(b,1)(c,1)(d,3)(d,2)(d,1)   2回目のソート
        ↓
(a,1)(a,2)(b,1)(c,1)(d,1)(d,2)(d,3)   3回目のソート



比較はこれで行ってます

function SortCompare(Item1, Item2: Pointer): Integer;
begin
Result := CompareText( Item1.値1, Item2.値1 );
end;
> ソートを重ねると値が同じところが入れ替わります

クイックソートの仕様。値が同じ項目の順番は保証されない。
>>477
WinXPのバグ
>>482 。・゚・(ノД`)・゚・。
484デフォルトの名無しさん:04/07/05 15:38
XPでDelphiアプリがよくバグるんですけど
素直に文字列送ればいいのに。クリップボードより楽だろ。
文字列よりも愛を送ってほしい・・・
>>484
またおまえか
488デフォルトの名無しさん:04/07/05 21:24
Delphi8買おうとしたら猛反対にあったんですけど、何か悪い点があるんですか?
猛反対した人はどう言ってるの?
> Delphi8買おうとしたら

なにをしたくて買おうとしたの?
まあ確かにVBに負けてるし。
>>488
そもそも悪い点の無い言語/開発環境なんて無い
どの言語/開発環境も長所・短所がある
けど、長所短所のバランスが大切だ
>>492
そんな一般論ではなく、Delphi8 の長所・短所が知りたいんじゃないの
VB厨の釣りだから無視
Delphiじゃないと書いてて気持ち良くなれない
2バイト文字と1バイト文字の識別ってどうすればいいのですか

[]で囲った情報の読み出しをしているのですが
]を探している時に2バイト文字の可能性があるので
1つ前の文字を$80以下かどうか調べてみたのですが

本当に]だった場合で前が2バイト文字だと1つ前の文字が$80以上の時があります

]だけを抽出する方法はありますか?
一度WideCharに変換してから元に戻すとか。
ByteType
LeadBytes
>>498-500
おお、できた〜!!ありがd
>>482
WinXPのバグなの?
オレの環境は違うけど、例外出るけど。
結局無視することにした。

>>477
環境は何?やっぱりWinXP?
例外の処理ってどんな感じでやってるの?
オレは

try


except
end;
↑要するに何もしない
今、DB&Webプログラミングって本見て勉強してます。
ふと疑問に思ったのですが、DBをサーバー側にインストール
するのって通常どうやってるんですか?
インストーラーを実行するんですか?
それとも必要なものをFTPとかで送るんですかね?
Oracleだったらインストーラー使ってサーバーにインストールするな。
MSSQL鯖でも同じ。
(´,_ゝ`) プtッ
>>502 xpですわ。確かにエラー出たって言ってた人もxpだったです。
例外処理は
try

except
StatusBar1.Panels[0].Text:='ゴメンバグッタ( ゚д゚)';
end;//例外エンド
end;
てな感じで。 ゴメンバグッタ( ゚д゚) はちゃんと出る

例外処理は普段使わないから難しいです
>>506
ふーむ。
オレは前述ので沈黙してくれたがなぁ?<例外

ダメもとで空欄にしてみては?(ステータスバーの記述を無くす)
って、ダメもとな話しちゃアカンかw
508>>477:04/07/06 02:27
(゚д゚)解決しました

except
StatusBar1.Panels[0].Text:='ゴメンバグッタ( ゚д゚)';
sleep(1000);
beep;
keybd_event( VK_RETURN, 0, 0 , 0 );
keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP , 0 );
end;//例外エンド

こぴぺでenter送ってるなら、ポップアップにも送って自動で押して貰おうとか思ってそのままコピペしたら
ウマーくいきました。無理矢理な解決法ですが問題ないようです。

(゚д゚)みなさまありがとうございました。 この解決が誰かの役に立ちますように
'
を出力するにはどうしたらいいんでしょう?「'」です
''
シフトJISの 82A9 を文字の か に変換するにはどうしたらいいでしょうか?
>>511
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
code:DWORD;
begin
code := $82A9;
s := Chr(code shr 8) + Chr(code and $FF);
Label1.Caption := s;
end;
513232:04/07/06 10:08
大変遅くなりましたが、結局>>234さんの助言を元に
OnCalcFieldsイベントを使い、実現できました。ありがとう
ございました。

今回はさらにわからないことがあったので質問させて頂きます。
>>232のプログラムで、小計をさらに足し合わせて、別TEditに
合計という形で出力したいと思います。SQLで毎回問い合わせる
のは、効率が良くないのに加え、できれば合計を入力と同時に
更新できればと思っています。何か方法はないでしょうか?

Delphi 7 Professional
現在はParadoxを使用しています。
ゆくゆくは(私の知識が追いついたら)DBサーバも作りたいと
思っています。

よろしくお願いします。
514デフォルトの名無しさん:04/07/06 14:39
Delphiってgenerics使えますよね。
VBでもできるのにDelphiでサポートされてないなんて考えられません。
> VBでもできるのに

なぁ、釣りはよそでやってくれよ
釣りに見える理由は?
何か都合でも悪いの?
釣りは無視
> VBでもできるのにDelphiでサポートされてないなんて考えられません。

そうですね。
VBでもまだベータでしょ。Delphi も .NET2,0 からサポートされる(はず)
>>514はベータ版のVBを隅々まで使いこなしている優秀なプログラマもどきだから
もまいらも素直にご教授賜っておけ。
↓ 514による generics を使ったコード例とその説明
ShowMessage('ぬるぽ');
>>521
すごい、すごい、さすがVB.NETは違うなぁ。ShowMessage() が特にすごい。
TActionで、アクションにEditCopyとかEditCutなど標準アクションを
追加すると、コピーとか切り取りの機能が実現できますが、
ここでTEditとかTMemo以外のコントロール(TDBGridなど)で、
独自に情報をクリップボードに送り込みたいときがあるのですが、
EditCopyのOnExecuteイベントにその処理を書き込もうとすると、
確かに実現できるのですが今度は通常のEditコントロールへの
処理が死んでしまいます。
EditCopy, EditCutなどを残しつつ、その処理を横取りして独自にクリップ
ボード関連の処理はできないでしょうか?
(通常のTActionのOnExecuteでコントロールの種類を判断して処理を
分岐せよと言われてしまえばそれまでですが、ほかに方法はないのかと。。。)
> コントロールの種類を判断して処理を分岐せよと

これで何が不都合なの?
>>523-524
EditCopyなんかを使うと、コピーができる適切なコントロール(TEditとか
TMemo, TDBEditなど…)に対して適時Enabledが制御されるし、たとえば
対象コントロールがReadOnlyの場合などは、EditCutやEditPasteが自動的に
Falseに設定されるので、設計者がコントロールに対してEnabledなどを
制御する必要がなくなるんだけどれど、
通常のTActionを使うと、全部自前で判断しなければならなくなるから
じゃないのか?よくわからんし大外しかもしれんが。
526デフォルトの名無しさん:04/07/06 15:49
DelphiってGUIアプリ以外に何か適してる分野ってありますか?
最近はVB.NETはウェブアプリが得意のようですが。
全部適してます。
DelphiってGUI以外作れないじゃん。
>>528 君には無理
Delphi >> Delphi.NET >> VB.NET >> VB
VB厨の言ってることってVBとは直接関係なくて .NET のライブラリを自慢してるのな。
532デフォルトの名無しさん:04/07/06 16:33
VB.NET使いも食わないVCL.NET。(ゲラ
>>531
言語仕様とライブラリの区別がつかないんだよね。で、ライブラリを自慢しても
言語固有じゃないのが笑える。
>>532
Delphi8 は VB.NET と同じように .NET ライブラリを使えるよ。むしろこっちがおすすめ。
んで、超初心者がDel8使ってるの?実際のところ。
>>535
そう、よく分からないけど使ってるのは超初心者だけのような気がする。
ちょっと初歩的なこと聞くけど、いい?

try
 **A**
 try
  **B**
 except
  **B'**
 end;
except
 **A'**
end;

ってあるとき、Bで例外が発生すると、
B' が実行されることは分かるけど、
A' も実行される?まあ、自分で試せば
いいことだけどさ。
書き込んでる間に試せると思うけど
B'でexceptしない場合、A'が実行される
B'がexceptした場合、
 B'で再raiseするとA'が実行される。
 B'でraiseしないとA'が実行される。
× B'でraiseしないとA'が実行される。
○ B'でraiseしないとA'が実行されない。
>>539
ありがと。一瞬戸惑ったけど、>>540読んで、よく分かった。

tryネストの中で例外が発生して、メモリ解放などで
最外のexceptまで実行させたいときは、最外のexceptだけで
例外処理すればいいってことですね。違うかな?
542デフォルトの名無しさん:04/07/06 17:14
例外処理なんて今時VB.NET使いでも常識だよね
543デフォルトの名無しさん:04/07/06 17:17
> まあ、自分で試せばいいことだけどさ。

喧嘩を売っているとしか思えないな(笑)
ウィンドウを他のウィンドウとか画面の端にひっつけるのってどうやったら実現できますか?
delphi始めてまだ半年足らずの新米PGです。
DLLとパッケージの違いがよく分からずに悩んでいます。
プログラミングの質問じゃなくて申し訳ないんですが、色々調べてもこの2つの違いがよく分かりません。
どなたかこんな自分に分かり易く説明して頂けないでしょうか?
宜しくお願いします。スレ違いですみません。
すれ違いと分かっていながらなんで聞くんですか
>>543
そんなこといってたら、ここにある質問の
ほとんどがそうだろ (w
いやいや、自分で試せば済むことなのを承知していながら質問するのはそんなに多くないよ。
いやいや>>537は自分で試せばいいはなしだよなぁと思いながらも
自分から確実にエラーをだすようなコードがわからないので
とりあえず質問したという経緯じゃない?
よくそんな他人をフォローするねぇ。
経緯まで勝手に代弁するとはご立派。
552511:04/07/06 18:32
>>512
無事変換することができました
どうもありがとうございました!
>自分から確実にエラーをだすようなコードがわからないので

StrToInt('1.3'); とか?(笑
それこそraiseでいいじゃん
>自分から確実にエラーをだすようなコードがわからないので

N:=1/0;
自慢気にエラーコード書いてるが奴らがいるが
こいつらはこんなんで優越感に浸っているのだろうか。
>>537がよっぽどのバカなだけなのに。
哀れ。
>>555
定数式使うとコンパイル時エラーになっちゃいそうだが
> こいつらはこんなんで優越感に浸っているのだろうか。

それは勘ぐり。>>556 はまじめなんだね。
554=556 だったら可笑しいね。
560509:04/07/06 20:52
一晩考えましたがやっぱりできません。
もう一度質問させていただきます。

stringに「'」を代入するにはどうしたらよいのでしょうか?
s := '''';
var
 S: String;
begin
 S:= '''';
>>510は空気
>>556
(´-`).。oO(何でこの人ここにいるんだろう…)
565509:04/07/06 21:00
>>561-562
おお、できました。
ありがとうございます。
一晩悩んだのが馬鹿みたいだ・・
こういうのは悩むんじゃなくて調べるんだよ
510 に回答あるじゃん
PCが死にました
データをすべて失いました
Delphi6はどうやって手に入れればいいのですか?
ベクターにPersonalならあるよ
>>569
俺も今日OS再インストールしたよ。1月にPC買ってもう5,6回目・・・
最初の数回は何もわからずにDelphiの作成中プロジェクト死なせてもうた
>>570
ありがとうございます当方ISDNですので寝ながらDLしたいと思います

>>571
バックアップって取るタイミングが難しいですね
3年平穏に過ごしていたので壊れるなど予想すらしてませんでした・・・
573A:04/07/06 22:36
>>572
ISDNでダウンするなら、Delphi6 のCDが付属してる、書籍を1冊買っておくのもいいと思われ。
今落として焼けばいいじゃん
575デフォルトの名無しさん:04/07/06 23:20
キー入力を確実にするにはどうしたらいいでしょう。
GetKeyStateでやっているのですが、時々失敗します。
> GetKeyStateでやっているのですが、時々失敗します。

コードを見せて
> キー入力を確実にするにはどうしたらいいでしょう。

質問の意味が不明です。
578575:04/07/06 23:38
>>576
if (GetKeyState(VK_PRIOR)<0)then
begin

end;
とやってます。一方でwhileループを動かしてBitmapをコピーしているのですが、
そちらが重いのかキーを5回に1回くらい認識しません。
whileループには application.ProcessMessages;
を入れてます。
よろしくおねがいします。
>>521
ShowMessage( 'ガッ' );
>>578
根本から間違ってるような・・・
>>580
そういうレスをする場合は、正しいと思われる例を出すべきだと思うがどうか。
582デフォルトの名無しさん:04/07/07 00:37
DelphiってXPと相性悪くない?
583デフォルトの名無しさん:04/07/07 02:02
システムドライブのバックアップくらいきちんと取れよ。

▲▽バックアップソフト徹底比較スレ△▼ No.7
http://pc5.2ch.net/test/read.cgi/software/1078146219/l50
重い処理があるなら、WM_KEYDOWNで処理した方が良いのでは?
重い処理をしている途中でキーが押された場合でも
Application.ProcessMessagesでメッセージが発生するよ。
GetAsyncKeyState

これでダメだったらMSDNの説明嫁
TFormが2つある場合の質問です。
アプリ起動時に1つだけFormを立ち上げ(Visible)
そのForm上にあるTButtonを押すと、
もう一つのFormが現れ元のForm(Buttonがある方)が消えるようにしたいです。
どうしたらできますか? 教えて下さい、お願いします。
587A:04/07/07 06:02
>>586
単純な方法でいいなら、

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Show;
 Hide;
end;
>>587
できました。有難うございます。
>>578
OnKeyDownでフラグをセットして
ループの中でフラグをチェックするように変更してみては
>>578 = >575
while なんとか do
begin
 処理
 Application.ProcessMessages;
 while かんとか do
 begin
  重い処理(*1)
 end;
 処理
end;
もしこんな構造になっていましたら(*1)の中にApplication.ProcessMessageを移動.
591575:04/07/07 12:59
>>589
ありがとうございます。やってみます。
>>590
それをやろうとしたのですが、その重い処理内はBMPのコピーで、入れる隙間がなかったのです。
結局常にフォーカスを持たせたボタンをスペースバーで押す方法にしてます。
正しさとしてこれでいいのかサッパリわかりませんが・・・結果うまく行ってるので
分割不可能な重い処理はサブスレッドでやるしかない
> 結局常にフォーカスを持たせたボタンをスペースバーで押す方法にしてます。

GetAsyncKeyState を推奨。最小位ビットはメッセージ処理と無関係に履歴を
見られる。
MainMenuをALTキーに反応させない方法ってあるでしょうか。
595デフォルトの名無しさん:04/07/07 15:08
TTimerコンポーネントについて教えてください。
OnTimerイベントで設定した内容を同じForm上のbuttonを押したときに
リセットしたいのですがその命令(関数?)が解りません。
お願いします。
Enabled:=False;Enabled:=True
>>595
リセット?


まぁButtonを押したときにOnTimerを実行させればいいのね?
Timer1.OnTimer(nil);

必要にあわせて変えて。
>594
FormのonShortCutで
if なんとか=VK_MENU then Handled:= true;
>>598
うまくいきました。ありがとうございます。
マルチメディアなどに使うTrackBarの使い方、
どこかに解説がありませんか?

再生中はマウスが押されてる間は位置の自動更新を
しないで、メディア側の位置を動かし続けるというような
方法だと思うんですが、うまくいきません。

よろしくお願いします。
バイナリ単位で編集するにはどうやったらいいの?
バイナリディタみたいに
>>601
ファイルとメモリどっち?
> バイナリ単位で編集するにはどうやったらいいの?

はぁ? TMemoryStream に読み込めば、どのバイトでもどんなバイナリでも書き込めるけど。
ファイルならMapViewOfFileだな。
ファイルの内容をポインタ使って操作できる。
いちいちTMemoryStremで全部読み込む奴はアフォ。
1GBのファイル開いたらどうするつもりなんだ。
>>604
別にTFileStream使えばいいだけじゃ?
ネベツネを消去できるコードを教えて下さい
文字列操作のPosを反対から検索したいのですがどうしたらいいでしょうか...
608デフォルトの名無しさん:04/07/07 19:10
サンプルで合った Rich Edit Control Demo を FormではなくFrameに変更したいのですが
TMainForm = class(TForm) を
TMainForm = class(TFrame) にしてみましたがやっぱり色々エラーが出来てます。

FormからFrameに変更する簡単なやり方はないでしょうか?

なんで、こんなことがしたいかというとRichEditでコピーとか貼り付けなどの
よく使う機能をまとめたいとおもっていました。(ワードパットみたいなもの)
コンポーネントがあったら教えてください。

お願いします。
609デフォルトの名無しさん:04/07/07 19:10
野球というじじくさいスポーツを消去できるコードを教えて下さい
610595:04/07/07 19:25
>>596,597
返事遅れてすいません
Enabledプロパティ使ってできました。
ありがとうございました。
611607:04/07/07 19:45
ごめんなさい。ここのコード見て自分でやってみます。
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=40#0234.txt
>607
そのやり方でいいならReverseStr。
AnsiStrScanで検索しまくるのも手かも。
データベースにデータを書き込むプロスラムを作っています。
ExeSQLを使って、データをInsertするときKey重複エラー
が発生しても例外が取れなくて困っています。
ExecSQLでKey重複エラーの例外をとることができるのか
教えてください。
使っているDelphiのバージョンは5です。
614607:04/07/07 20:29
>>612さん
逆さまに検索する事で、一つ上のフォルダのアドレスを取得することを目的としてました。
ですから、逆向き検索は簡単にできればOKですので、リンク貼ったトコの(2)を使うことにしました。
とりあえず完成はできました。
書き込みに先走りすぎたorz
615デフォルトの名無しさん:04/07/07 20:47
DelphiアプリをXPで動かすとよくハングします。どうしてでしょう?
釣りじゃないなら詳細よろ
つーか、Delphi製というよりXPって変なバグしょいこんでない?
しょっちゅうエクスプローラが暴走するんだけど・・
>>615
君の環境だけ? しつこく書き込むなら詳細を書くべきなのでは?
Delphi アプリだけが特殊な API を使ってるわけじゃないでしょ。なぜそう思うの?
> フォルダのアドレス

??
620607:04/07/07 21:03
>>619さん
D:\hogehoge\arekore\といったフォルダアドレスを入れた時に、
D:\hogehogeというアドレスを返す関数です。
ようわからんがExcludeTrailingOSDelimiter(だったか?)とかExtractFilePathじゃ駄目なのか
>>620
なんだって!
607からの一連の話題はそういう話だったのか・・

だったらLastDelimiterとか使ったほうが便利じゃない?
>>620
一つ上のアドレスを返すという形か。


ありそでなさげ
624503:04/07/07 22:17
遅レスすみません。。
オラクルみたいなすごいのじゃなくパラドックスなんですが、
最近、Win2003サーバーを使っているレンタルサーバーに申し込んだんです。
で、ここはCGIとかなにしても良いって事なので、データベースを使ったWebアプリ
の練習をしようと思いました。
こういう時って、データベースをどうやってサーバーに設定するのかと思い質問しました。
質問の仕方が悪かったです。すみません。
もう一度教えて下さい。
>>607
ExtractFileDir は?
>>624
winはよく知らないけど
LinuxでMySQLでもインストールしてODBCでつなぐとか。
>>624
そりゃ、レンタル元に聞いたほうが早いでしょ。
レンタル鯖って、普通は鯖ごとレンタルじゃなくて
ディスクスペースのレンタルでしょ。

ユーザにはアプリをインストールする権限がないような
気がするけど。
628624:04/07/07 22:34
>>626、624ありがとうございます。
レンタル元に自分のやりたいことがOKか聞いてみてから、
また調べてみます。
>>621さん
ExtractFilePathは、ファイル名からファイルが存在するフォルダを取得する関数です。
ExcludeTrailingPathDelimiterは\を取って返す関数です(d:\hogehoge\→d:\hogehoge)。
ですからどちらも使えません。

>>622さん
    _, ._
  ( ゚ Д゚) それだ…。

>>625さん
なにかが違うような。。。
630607:04/07/07 23:24
ごめんなさい>>629=>>607です
ExtractFileDir( 'c:\windows\Win.ini' ) は 'c:\windows' を返します。
もしあれば、最後の'\'を削除して、ExtractFileDirでOK
>D:\hogehoge\arekore\といったフォルダアドレスを入れた時に、
>D:\hogehogeというアドレスを返す関数です。
そもそもフォルダアドレスの書き方を統一すれば問題解決
634デフォルトの名無しさん :04/07/08 00:55
すみません、質問させてください。
コンポーネントを貼り付けたときに、四方と線の中心4点に四角が表示されますよね?
それを実行時にもそのコンポーネントをMouseDownしたときに表示することは可能でしょうか?
また、可能であれば四方の一点をドラッグした時に台形になるように二直線を縮小させたいのですが。。
これをTPanelBoxを継承させた新しいコンポーネントで作成できたらと思っています。
知っている方がいれば、ご教授ください。。
ExtractFileDir(ExcludeTrailingPathDelimiter('D:\hogehoge\arekore\'));
>>634
あの点々は、実は一つ一つがウィンドウなのだよ。
同じ事を実行時にしようとするなら、全部自前でやる覚悟が必要です。
sDirName+".\"+sFileNameとすれば

sDirNameの最後に\が有っても無くても適応可能。
>>635
ExtractFileDirはルートディレクトリ指定するとバグるよ
ExtractFileDir(ExcludeTrailingPathDelimiter('D:\hogehoge\arekore\'));
これと
ExtractFileDir(ExcludeTrailingPathDelimiter('D:\hogehoge\arekore'));
は同じ結果
>ルートディレクトリ指定するとバグるよ

ルートディレクトリの上はないからどっちにしろ例外
>>640
ExtractFilePathに変えるだけなんだけどね
ヘルプより

ExtractFilePath( 'c:\windows\Win.ini' ) は 'c:\windows\' を返します。

駄目じゃん
処理の前に判定付けろよ
>>600

OnChange が使い物にならないんだよね。OnEndTrack イベントがあればいいんだけど。
さがせばどっかにあるはず。
645A:04/07/08 02:40
>>634
それを自作した記事が、Delphiマガジンの12月号に載ってるっぽい。
ソースとサンプルだけなら、サイトからダウンロード可能なもよう。
すみません、質問です。
ttp://www.yks.ne.jp/~hori/MemCheck.htmlのMemCheck 2.0をダウンロードして
自分のプログラムに追加してみたんですが、実行しても終了時にBEEP音が鳴るだけで
メッセージとか表示されません。ログとかも見当たりません。

メモリリークが発生したかどうかを知るにはどうすればいいんですか?
>>646

そのページの
>MemCheck を使用するには以下の事をやる必要があります。
は全部やったんだろうな?
>>647
4番の
>プロジェクトソースで MemCheckInstallExceptionHandler 関数を呼び出して例外ハンドラを登録する。
はやってません。

OnDestroy時にsleep命令とレジストリの消去を実行してるんですが、それが悪さをしてるみたいです。
OnDestroyを無効にすると一応メッセージは表示されました。
今、自作でクラスを作っているんですが
Constructor Createの処理の中で

inherited Create;

って必要ですか?
手本にしてる本に載ってたので今まで気にせずに書いてましたけど
なんか、なくてもエラーにならないみたいなんですし・・
TObjectからの直接の派生だったら、コンストラクタの中身は空だからどっちでもよくて
それ以外のコンストラクタに中身があるクラスから派生してるなら
上位クラスでの初期化処理を呼ばないといけないから必要、だっけ。
651649:04/07/08 04:51
>>650
なるほど。
1行目の事実は知りませんでした。
おかげでものすごくすっきり納得がいきました。
こんな事も知らなかった人がクラスを作れるのに俺ときたら。・゚・(ノД`)・゚・。
逝`
EditBoxの入力を整数限定にしたいのですが
OnKeyPressで

if not (Key in ['0'..'9',#8]) then
begin
  Key := #0;
end;

という正数表現しか解りません。
一文字だけマイナスも大丈夫とするにはどうしたらいいでしょうか?
正規表現使え
656654:04/07/08 07:20
>>655
正規表現をOnKeyPressで使うのですか?
も少し詳しく教えてください。
キャレットが先頭にあればマイナスも通すようにすればいいだろうけど
…EDITには最初からそういうウィンドウスタイルがあったんじゃないか?(ES_NUMBER)

ま、整数入力コンポーネントなんて、探せばUpDownボタン付きの含めて大量にありそうだが
658デフォルトの名無しさん:04/07/08 07:26
>>636
難しいのですか。。初心者ではきついって事ですね。。

>>645
ありがとうございます。調べてみます。
またわからないことがあればご指導お願いします。
>>654
それだとコピペが防げないから
OnChangeでEdit1.Textの先頭の'-'と'0'..'9'以外を取り除くコードを書くべし。
おいらだったらStrToIntDefを使うかな。
それだと初回の'-'が入力できない
663660:04/07/08 08:39
>>661
今試してみたら-もOKだったぞ
664デフォルトの名無しさん:04/07/08 10:58
VBアプリをXPで動かすとよくハングします。どうしてでしょう?
>>615-616
解像度やウィンドウのデザインを変えると落ちます。
666デフォルトの名無しさん:04/07/08 11:42
DelphiってXPに対応してないの?
667デフォルトの名無しさん:04/07/08 11:48
昨日TTimerについて質問したものです。
TTimerのOnTimerイベントをそのTTimerがあるフォームが開いてからではなく
そのフォームでのラストアクションがあってからにしたいのですがどうしたらいいでしょうか?
>>667
あいかわらず言ってる意味がよくわからんが
そのラストアクションの最後でEnabledをTrueにしたんじゃダメなのか?ダメなのか?ダメなのか?
てゆーかさっさとTTimer.Reset付けろや>某
>>620 = >>607
ExpandFileName関数を使うと便利でしょう.

ExpandFileName('D:\hogehoge\arekore\..'); // 'D:\hogehoge' を返します.
ExpandFileName('D:\hogehoge\arekore\..\'); // 'D:\hogehoge\' を返します.

アドレスを指定する文字列の中にある『..』がツボです.
これは『〜の一つ上の階層』(親ディレクトリ)を意味します.
この関数を使うことで『..』を使った指定から
実際のアドレスに変換することができます.

※ドライブの一番上の階層(ルートディレクトリ)を返す場合,
 引数の文字列の末尾に『\』をつけてもつけなくても
 末尾に『\』をつけて返します.
 ExpandFileName('D:\hogehoge\..'); // 'D:\' を返します.
 ExpandFileName('D:\hogehoge\..\'); // 'D:\' を返します.

実際に使うときはこんな感じでしょうか.
ParentDir := ExpandFileName(IncludeTrailngBackslash(CurrentDir) + '..'); // 末尾に\なし(ルートディレクトリを除く)
ParentDir := ExpandFileName(IncludeTrailngBackslash(CurrentDir) + '..\'); // 末尾に\あり
671デフォルトの名無しさん:04/07/08 13:30
ListView1.OwnerData := Trueのときある項目を強制再描画したいのですがどうやればいいですか?
>>669
一回EnabledをFalseにしてからまたTrueにするとか…???
>671 UpdateItemsではダメなのか?OwnerData?
>>666
XPで作ってるけど、別に問題ありませんが。

2000で試してみたら?XP特有の現象なら、2000ではバグは出ないはず。
もし2000でバグが出たら、自分が組んだプログラムに問題がある。
もし2000でバグが出ずに、XPでバグが出るんであれば、Delphiに問題があるのかもしれない。

その上で、こういうプログラムを組んだらこういうバグが出ました。
どうすればいいんですか?と質問してみたら?
Del6Pro+WinXPでマルチモニタ環境で
フォームがセカンダリにある状態でMessageDlg使ってダイアログ出すと
プライマリ側に開いちゃうんだけどそれってどうにかならないの。
676654:04/07/08 19:57
>>657,659,660
亀レスです。すいません。
アドバイスありがとうございます。
EditBoxの整数値限定入力について質問したものです。
入力時点で条件に合わないものは入力すらさせたくかったので
OnKeyPressを使いたかったのですが
OnChangeでも入力表示させないようにできるのでしょうか?
どうしても一文字目だけ'-’を含むという条件が解からないので。
お願いします。
OnChangeは内容が変わった時に処理されるので時すでに遅し。
テンキー判定にしてみては?
678676:04/07/08 22:47
>>677
レスありがとうございます。
テンキー判定…ダメだ、よく解らないです。
入力時点での判定はそれでできるのでしょうか?
質問させてください。
TImageを実行時に黒で囲んで表示させたいのですができますか?
なるべくなら新規作成コンポーネントでTImageを継承させたいのです。
constructor ○○○.create(Aowner:TControl);にソースを書けばいいのでしょうか?
初期サイズは高さ幅とも50で、正方形の黒枠を描きたいのですが。。。
知っている方、よろしくお願いします。
>679 Helpでcanvas読んで、描画の練習するべし。
>>675
API使えばいいじゃん。頭悪いね。
Delphi6でアプリを作ってるんですが、全て開放してる筈なのにメモリリークが必ず1回出ます。
これは別にほっといてもいいんでしょうか?
必ず1回なら放置してよし
>>682
パッチ当てたか?
つかリークしたブロックダンプしてみりゃいいじゃん。
>>683
どんな状況でも必ず1回発生します。
とりあえず放置しときます。

>>684
パッチは一応当ててます。
メモリリークはMEMCHECKを使用してるんですが、使い方がいまいち分からないので
メモリリークの数しか分かりません・・・すみません。
どんな状況でもと言う事は、
program Project1

uses
 MemCheck;

begin
end.

でも発生?
Delphiでバイナリエディタ作るのって難しいんですね。
コンポーネントが無い。。。
コンポーネント使うのとフリーウェア使うのってそう大きく違わないよね
コンポーネントだってフリーウェアだろバカ
>>687
フリーウェアを使ってください
そう言う意味ではないと思うんだが
たしかPowerWitch the Royalってバイナリエディタが
もろDelphi製だったはず。

難しいといっても不可能ではない。要はやる気しだいでしょ。
693デフォルトの名無しさん:04/07/09 10:18
描写時の色をランダムにするにはどうすればいいんですか?
TColor(Random($1000000))
695デフォルトの名無しさん:04/07/09 11:26
VCLのソースコードをダウンロード出来るサイトってあるでしょうか?
ない。あってもそれを閲覧する権利はない。
>>695
全部じゃなければありますyo。
ダウンロード可能。
>>695
ダウンロードできるサイトはちゃんとあるよ。
ちょっとURL忘れたけど・・
すごい見付けにくかった記憶がある。
素直にPro買うか、
Kylixインストールして(OpenEditionはGPLの元で)CLXの(VCLと共通部分の)ソース見るかしろ
>>687
Windowsの標準にはないインターフェイスのものは
Delphiでなくても難しいかもしれませんが(むしろほかの方が大変だと思います).

一方で,その気になれば初心者でもメモコンポを使って
それなりのバイナリエディタを作るのはそれほど難しくないと思います.
OnKeyPressイベントで0..9, A-F以外の文字入力をブロックしたり
下の桁を打ち込んだらカーソルをさらに1文字右に動かしたりとか.

でも最初は表示だけできるバイナリダンプソフトを作ってみると良いですよ.
これができるだけでもかなり勉強になるのではないかと思います.

#単に無料のバイナリエディタがほしいだけでしたらBzエディタを.
 私も愛用しています.
701デフォルトの名無しさん:04/07/09 16:22
DBCtrlGridにて中の文字の色を変えようと思い、
DBCtrlGrid1PaintPanelを利用してやってるんですが
なぜかフォーカスされた行だけ色が思ったものと
違うものになってしまいます。

ちなみにDBCtrlGrid上にパネルを置いてその上に
DBTextを置き、その文字の色を変えようとしています。

どなたか解決方法ご存知のかたおられましたら
教えてください。
702デフォルトの名無しさん:04/07/09 18:51
起動後に別ソフトを起動させたいのですが、どうしたらいいでしょうか?
現在はOnActivateでShellExecuteを使って別ソフトを起動しているのですが
起動中に別ソフトが起動してしまいます
それとボタンを押した後にボタンのフォーカスを外す
または、フォーカスがどこにも当たっていない状態にする方法も教えてください
>>702
起動後=フォーム表示直後に何かするのは結構面倒。Timer使うのが無難。
Form1.ActiveControl := nil;
704682:04/07/09 19:19
メモリリークがどんな状況でも発生するとカキコした者ですが、開放し忘れを発見しました_| ̄|○

ご迷惑をおかけしました。
おう、よかったじゃないか。まず、自分を疑えっていう教訓も得たし。
MemCheck 使ったかいもあったし。
学校の課題何ですが、質問いいですか?
いちいちそんなこと聞かれたらレスの数が倍増するので嫌です
スレ立てます。・゚・(ノД`)・゚・。
>>708
単発で質問立てるなよ
ここで質問してけ
>>709
ありがとう・・・どうもありがとう(つД`)
単位落としそうで必死なんだ・・・ホントありがとう。・゚・(ノД`)・゚・。
こんな問題なんです。

【問題】

英語の試験の点数を、つぎからつぎへと入力して、
その合計と平均(少数第2位まで)、最大値と最小値の点数を求めて表示する。
試験の点数をして999を入力すると点数(データ入力)の終わりとする。
(999は合計に加えない)。

って奴なんです。まず何をするのかさっぱりで・・・お願いします。
一番のネックは点数を読み取ってつぎつぎ入力するロボットの設計だな。
これはちょっとDelphiの手に余る問題だよ。
うーむ、初級の文法を練習するのには良い問題だね。自分で解くとよいことがあるかも。
DelphiというかPascalなんです。
これは不可能な問題なのでしょうか?
>>711
Pascal?それともDelphi?
>>713
そうなのですか!じゃあ自分でちょっと分からなくても組んでみます。
できたらここに晒しますので間違いを指摘してもらってもいいですか?
足し算、わり算、if 文の練習。
>>715
PascalをDelphiでやるんです。
必死なわりに何もやってないんだな
いえ、別のをやってます。6つ問題があるんです。
そのうち4つがわからないのです。
上のはわからないうちの1つです。頭こんがらがっちゃって・・・
フォームとか Edit とか Button とか使っていいの?
1つ質問です。
小数第2位までを出すにはどういうふうに定義をしたらいいんですか?
>>721
習った範囲でやらないといけないのでダメぽです。
whileで回して入力値が999じゃないなら合計値に足していく、
999なら最高、最低、平均を表示して終了させる。
>>722
わかりました。

integerではなくrealで定義すればいいんですね。
>>724
なるほど!ありがとうございます。やってみます。
ううう・・・わからなくなってきました・・・
728710 ◆EbFiUcpS.Q :04/07/09 22:47
IDないのでトリップつけました。
>>727
さらせ
730710 ◆EbFiUcpS.Q :04/07/09 22:48
begin
writeLn;
writeLn;
n:=0;
while n < 999 do
begin
n:=n+1;
a:=n;

ここから下が・・・_| ̄|○
731710 ◆EbFiUcpS.Q :04/07/09 22:48
定義は

n:integer
a:real
>>730
まずは使用者に入力させろ。
話はそれからだ。
733710 ◆EbFiUcpS.Q :04/07/09 22:55
writeln(n:=n*2);
writeln(n:=(n*a)/a);

とかやってみたのですが・・・実行できない_| ̄|○
>>730
あの問題からなんでそんなコードが出てくるのか・・・
735710 ◆EbFiUcpS.Q :04/07/09 22:59
その前にまず問題の意味が・・・

999までwhileで出力して1〜999の横に
今までの合計と平均ってのを随時出力していくんですよね?

最大値の点数は999で最小値の点数は1なのでは・・・?
どこの最大値と最小値なんでしょうか・・・
736710 ◆EbFiUcpS.Q :04/07/09 22:59
>>734
すでに間違ってますか・・・
こんなんでプログラマーになれるのかな。・゚・(ノД`)・゚・。
737710 ◆EbFiUcpS.Q :04/07/09 23:00
それとも自分で1〜999までを入力してそれの平均と合計、
最大値、最小値を出力するんでしょうか?

そうするとwhileは使わないですよね?
そこから教えないとできんのか・・
delphi以前の問題だ。問題を理解してから来い
var
 input, min, max, count, total: Intger;
begin
 count := 0; total := 0; min := 999; max := -999;
 
 while True do
 begin
  Write('Input(999 to quit): '); Readln(input);
  if input = 999 then break;
  Inc(total, input);
  if min > input then min := input;
  if max < input then max := input;
  Inc(count);
 end;
 
 if count > 0 then
 begin
  Writeln('min=', min);
  Writeln('max=', max);
  Writeln('average=', total / count:0:2);
 end;
end.
740710 ◆EbFiUcpS.Q :04/07/09 23:02
>>737のが問題の答えですね。

ということはwhileは使わないですね。

if文と足し算割り算ですよね。

ちょっと作り直してみますね。
741710 ◆EbFiUcpS.Q :04/07/09 23:06
>>739
ありがたいですが・・・
そういう書き方は習ってないですし・・・
僕自身理解ができないので・・・ごめんなさい・・・
初心者風な書き方で頑張ります。
>>741
答え出たけどひとつだけ問い詰めさせてくれ
なぜ999回回す
743710 ◆EbFiUcpS.Q :04/07/09 23:11
>>742
・・・良く分かってないものでして・・・
あと、上記の答えは使えません。
>>710
やる気もないみたいだし答えを読む気もないどころか問題も理解してない。
やってることは雑談だけ。もう消えろ。
745710 ◆EbFiUcpS.Q :04/07/09 23:16
>>744
はい。どうもありがとうございました。失礼します。
739 はメタコードとしてもよいコードだよ。自分の習っている範囲で書き直せば
そのまま正解になると思うよ。
>>745
Delphi初心者用サイトとか見ながら>>739を理解しる
そんなに難しくはないから
>>744
誠に遺憾なことだが、
スレの趣旨としてはこんなやつですらOKゾーンなんだよな・・
スポーツだと適不適がほとんど客観的に分かるでしょ。陸上でも短距離か長距離か
足が遅くても、ハンマー投げが得意、とか。そもそも陸上に向いてないとか。

プログラミングにも適不適があるんだよ。ある程度の人なら、ほとんどすぐに適不適
を見分けられる。コードがつたなくても、センスのあるなしは分かるもんだ。
いや〜センスあるなし以前の問題だと思うぞ・・。

陸上で言うなら「どこを走ればいいのかわからない」「靴の履き方がわからない」
これがうわさのゆとり教育でつか
プログラム言語以前の国語力の問題だな.
算数の文章問題を何べんも音読させられたのを思い出したよ.
>>752
激しく同意。 >>711 の題意を理解してないと思われ
もう見てるか分からんが・・・

readlnはユーザーの入力を読み取れる。
入力された値が0〜100なら点数で、999は終了を表す。この999というのは100以上なら何でもいい。
問題でそう決められているからそれに従っているだけで、999という数字自体に意味はない。
Inc(x, y)はx := x + yと同じ。Inc(x)ならx:=x+1.
それを踏まえて>>739のコード見れ。これで分からなかったらまじでやばい。
だから本気でガンガレ。
入力するところでループする。そしてループ脱出の条件が999を入力されたとき、
と気がつけば、あとは足し算わり算の問題。
プログラム板で1番優しいスレはここですか?
757デフォルトの名無しさん:04/07/10 00:20
これから、Delphi をやろうと思っているのですが、知り合いの話だと
もう Borland は Delphi に力を入れてないから、やがて消えていくと
言っていましたが、本当なんですか?

それならこれから勉強してもしょうがない感じがするので、誰か本当
のところを教えて下さい。

持っているのは Delphi 5 ですが、これってWindows XP 用のアプリ
をつくれますか?

教えて君ですいませんが、Delphi 初心者なので、宜しく。
758デフォルトの名無しさん:04/07/10 00:22
Delphiって何でこんなにXPと相性悪いの?
>>757
君は若者?
「チャレンジしてみてダメだったらそれはそれ」って
選択肢はあり得ませんか?
誰かに決めてもらうのが最良ですか?
若者なら挫折も良いのでは?
2005年はVBの年になるからVBやっとけ。
私も757のようなタイプにはVBが相応しいと思います。
初めても居ないのに初心者とは此如何に

と、冗談は置いて置いて
これから何かするんならDelphiでもVBでも初歩は変わらない
それから先は言語じゃなくてソース書くやつの腕次第
>711の問題を>739以外のやり方でやるなんて
ものすごくめんどくさそうなんだけど
いったいどこが「使えない」表現なんだろうか…
break を習ってないとか
誤った入力をした時に訂正が効かないのは、
テュウェンティーワンセンチュリープログラミングとしてどうか。

と、最高に頭が悪そうな発言をしてみる。
たしかに最高に頭が悪そう。
767デフォルトの名無しさん:04/07/10 01:41
> もう Borland は Delphi に力を入れてないから、やがて消えていくと
> 言っていましたが、本当なんですか?

本当です。Delphi に限らずどんな言語もやがて消えていくでしょう。
ちゃんとした言語をちゃんと学ぶと、どんな言語にも通じるものを学ぶことが
できます。Delphi はちゃんとした言語であると思います。
C#ほどはちゃんとしてない古臭い言語。
> C#ほどはちゃんとしてない古臭い言語。

そうかもしれませんが、現時点では C# より出来ることが多い。
C# からプログラミング入門というのもいいかもね。あと2,3年たったら間違いなく。
>>757
持っているのは…ってことは、もう買ったのか?

今さらDelphi5を買う奴は無いので昔買ったが眠っていたパターンと推測して、
もしそうならやめとけ、ソフトにしろプラモにしろ小説にしろ、買っても積んでおくだけな奴は
どうせ何やっても長続きしない
FlileStreamの使い方を、超初心者でもわかりやすく書いたホームページはどこでしょう?
Memo1にOpenDialog1.executeで読み込んだ文章をFileStream使って表示したい。
せっかくVBをすすめたのに、どうしてVBしないですか?
>Memo1にOpenDialog1.executeで読み込んだ文章をFileStream使って表示したい。

Memo1.Lines.LoadFromStrem(FS);
>>772 ヘルプで十分

procedure TForm1.Button1Click(Sender: TObject);
var
FS:TFileStream;
begin
if OpenDialog1.Execute then
begin
FS := TFileStream.Create(OpenDialog1.Filename,fmOpenRead or fmShareDenyWrite);
Memo1.Lines.LoadFromStream(FS);
FS.Free;
end;
end;
StringListとStream系がわかるようになると
やれることの幅がかなり広くなる。

次はなにを学ぶといいですかね?
カテゴリ別ルーチン一覧を眺めてどんな機能があるのかを知っておくといいよ。
特に文字列周り。
> 次はなにを学ぶといいですかね?

なにをしたいかによる。学ぶことが目的ならコンポーネントの自作。
最初は、フリーのソース付きのヤツのソースを見て研究するとよい。
IMEを制御したり状態を取得するにはどうすればいいでしょう。
imemode
>>780
ありがとうございます、他のアプリの状態の取得にはどうすれば?
動的配列について質問したいのですが
メモリ領域を確保(Setlength)していない時の対応について教えてください。
if文で動的配列のメモリ領域を確保していない場合のコーディングをしたいのです。

var TestS : array of String;

if (…解らず) then 〜

length(tests)=0
>>783
どうもです。
lengthってこういう時にも使えるのは知りませんでした。
ありがとうございました。
785780:04/07/10 16:21
解決したと思ったのですがもう少し質問させてください。
Setlength(TestS,0)と強制的に長さを0にしてしまう場合にも
>>782の条件に引っかかってしまう事に気づきました。
実際そういう状況にもなるので・・・
説明不足でしたが動的配列宣言してSetlengthを一度もしていない時の
処理をしたかったのです。
この二つの区別は無理なのでしょうか?
Setlengthを一度もしていない時 = length(tests)=0

どうして区別する必要があるのか?
>>785
無理。stringが自動的に''で初期化されるのと同様。
どうしてもというなら他にbooleanのフラグを用意しないといけない。
788デフォルトの名無しさん:04/07/10 16:56
Del6 Personalで作ったアプリがXP上で変な動きをします。
Del7以上だとお金がかかってしまいます。
嫌がらせですか?
>>788
嫌がらせですか?
そうじゃないならソース示せ。2ちゃん以外の。
790まいど:04/07/10 17:09
嫌がらせではありません。
アホを釣っているんです。
791デフォルトの名無しさん:04/07/10 17:09
Delphiアプリってバッファオーバーフロー起こすんですか?
仕様です。
>>789
こら、せっかくみんな無視してきたのに、反応するな…

バッファオーバーフローについては、
・Delphi7なら修正済み
・XP側のアップデートでスタックは実行不可になった
Del6以下で、XP以外のOSでも、普通通過しないような箇所にあるので、
わざわざ起こすような酔狂なコーディングをしなければ起きない

ついでに、XPの実行可能属性保護は.NETには無効→.NETのunsafeコードはネイティブアプリより危険
http://msdn.microsoft.com/security/productinfo/XPSP2/memoryprotection/exec_imp.aspx
(Whidbey=2005以降は.NETも保護されるらしい)
>>785
長さに0を指定するとメモリ領域をすべて解放するので
SetLengthを使う前と同じ状態になります.
故に区別できません.
>>785
おいおい初期状態に戻せないと困るじゃないか
集合型のpropertyを作っていて気づいたんですが、
集合型のpropertyの場合、includeとか使えない?

試しにTFontStyleについてやってみましたが、
include(Font.Style, [fsBold]); // ダメ
Font.Style := Font.Style + [fsBold]; // OK

つーことは、変数宣言された集合型以外では
includeとかは使えないってことでしょうか?

どちらでもいいんですが、helpによると、includeを
使ったほうがコードの効率がいいって書いてあったもんで。
それは集合型とは関係ない話
propertyはvarパラメータには渡せない。
例えば
procedure Foo(var s: String);にForm1.Captionを渡すとコンパイルエラー

functino Foo(s: String): String;
Form1.Caption := Foo(Form.Caption);
なら可能
>>797
速攻レス、thx

なるほど、そういうことですか。
今、includeをhelpで見て、初めて気づきました。
なぜ渡せないかというと
propery Prop: TProp read GetProp write SetProp;
のようなプロパティには渡すべき実体が存在しないから。
800デフォルトの名無しさん:04/07/10 19:36
Win2000 Delphi6 Personalでアプリ作ってますが、会社のXPで実行すると起動と同時に砂時計が出て重いです
スペック的には会社のほうが圧倒的に優れています
それと、XPで実行すれば勝手にルナインターフェースになるのかと思ったらならないんですね
どうしたらいいのでしょうか?
802デフォルトの名無しさん:04/07/10 19:47
ありがとうございます
>>799
たとえば

FProp: TProp;
propery Prop: TProp read FProp;

というような場合、FPropの値が渡されるだけってこと?
デバッガの例外処理について質問です。
Java のように try 〜 except でハンドルされなかった例外だけ
トラップするようにはできないものでしょうか?

デバッガオプションの「Delphi 言語の例外で停止」を外すと、
ハンドルされない例外が発生しても無視されてしまうので…。
>>804
さらに外側のexceptでトラップするだけヤン
>>804
無理
807ホームラン:04/07/10 22:20
>>772
 >>774,5 のように単にプレーンなテキストファイルを読み込むだけではFlileStreamのあ
りがたみはわからないのではないかな。
なんかやたらTStrings, TStream系のクラスに固執する奴多すぎだよな。
もう少し状況に応じて使い分けるべきだよ。
>>807
そうだね。TFileStream は実質何の役にもたってないし。質問の

> Memo1にOpenDialog1.executeで読み込んだ文章をFileStream使って表示したい。

が少々意味不明ではあるし。
> もう少し状況に応じて使い分けるべきだよ。

はいはい、それは当たり前。プログラミングの練習をしてるんだろうよ。
> もう少し状況に応じて使い分けるべきだよ。

で、どんな状況のときにはどれを使うのがいいの?
812デフォルトの名無しさん:04/07/10 22:35
ボーランドのフリーのコンパイラを使用しているのですが
cppをDLLにコンパイルする方法が分かりませんコマンドに-WDが必要な
必要なあたりまでは分かったのですが、

**に代入した値は使用していない(関数 とか
パラメータ***は一度も使用されないとか

全く分からないエラーが出ます。(C/C++自体ふれたことがない)
ソース自体は配布されているものなので問題がないと判断し、
コンパイルする時点の問題ではないかと思いました。

ここ読めみたいなHPあれば教えてください。
>>811
とりあえず行単位のフィルタ処理でTFileStreamとかTMemStreamで読み込んで自前で改行コード判定したり
TStringListでいちいち全部読み込んだりする奴はアホ。
815デフォルトの名無しさん:04/07/10 22:40
>>814
thanx!!
816デフォルトの名無しさん:04/07/10 22:57
>>801
manifest.resがありませんって言われちゃうのは私だけですか?
プロジェクトと同一ディレクトリだよね?
.exe.manifestでがまんしとけ
>>813
じゃ、アホじゃない人は AssignFile Reset Readln Writeln 使うの?
ぜんぜん状況を判断してるようには見えないけどな。
819デフォルトの名無しさん:04/07/11 00:19
>>817
そんなもの同封して配布したらかっこ悪いじゃないですか
なんとかならないですかね・・・
820デフォルトの名無しさん:04/07/11 00:20
Del厨ってフィルタ処理もできないんですね。
VB.NETならCUIプログラミングもお手の物ですよ。
813 は300バイトのファイルでもいちいち AssignFile とか使うんだろうな。
メモ帳つくっても決して Memo1.Lines.LoadFromFile とかは使わないんだろな。
> VB.NETならCUIプログラミングもお手の物ですよ。

でも40MBのランタイムいるし。遅いし。
Delphi でもCUIつくれることしらないの?
813はVB.NETユーザーだろ。
DrawOverlay関数が何をするものかわかんねぇ
825デフォルトの名無しさん:04/07/11 00:26
Delphi6無料版をこれからやろうと思うんだけどパッチあてないとどうなるの?
826デフォルトの名無しさん:04/07/11 00:26
初心者です。
DelphiでUTF8のファイルを読み込んでUTF8のまま編集する
メモ帳を作りたいのですがどうすればいいのでしょうか。
VB.NETであればTextBoxを配置するだけで済んだのですが・・・
>>819
801のサイトのマニフェストでオレの環境では何も問題ないぞ
何かミスってんじゃないのか?
>>824
ショートカットアイコンの矢印画像をオリジナルアイコンに重ねて描画する
ときなんかに使う。
829デフォルトの名無しさん:04/07/11 00:38
>>827
そうですか、もう一度がんばってみます
サンクス
>828
にゃるほど、つまり普通の透過描画であって
半透明にしたりとかはしないのですね。サンクス。
初心者で困ってるんですが、助けてください。

あるコントロールに対して、Click、DblClick、MouseDown、
MouseMove、MouseUpなどのイベントを使ってます。

それで、ダブルクリックすると、まずクリックが検出され、
つぎにダブルクリックが検出されます。たぶん、これが
普通なんでしょう。

ダブルクリック時に、クリック側プロシージャでは、それが
クリックなのかダブルクリックなのか分からず、困っています。

こういう場合、どうしたらいいのでしょうか?
>>831
>ダブルクリック時に、クリック側プロシージャでは、それが
>クリックなのかダブルクリックなのか分からず、困っています。

クリックされた時点でそれがダブルクリックの最初のひとつかどうかを判断することは
できない。未来を予測できないからね。
>>822

こっちでやれ。相手にするな。

ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その13
http://pc5.2ch.net/test/read.cgi/tech/1089454618/
>>832
素早いレス、ありがとうございます。

つまり、1つのコントロールに対して、クリックと
ダブルクリックの両方のイベントを利用することは
できないんですね。

ありがとうございました。
835デフォルトの名無しさん:04/07/11 00:58
Delphiで64bitアプリは作れますか?
VB 2005でできるのでDelphiでもできると思いますが。
さっきから悩んでいるのですが
添字[-1]で動的配列にアクセスしてるのにエラーが起きないばかりか範囲チェックにすらひっかからない。
なんでだろう・・?
あるイベントハンドラ内のコードが長くなったため何個かの手続きに分けて
コーディングする事にしました
そこでちょっと問題が起きて困ってます。
元々そのコードの中でexit()手続きを使っていたのですが
自分で作った手続きに分けるとexitはその自分の手続きを終了するだけで
イベントハンドラ自体を終了する事ができません。
どうしたらいいでしょうか?
838832:04/07/11 01:06
>>832
> 未来を予測できないからね。

「未来」で今思いついたけど、どうしてもクリックと
ダブルクリックを検出したい場合、タイマを使うって
手もありますね。

でも、そこまでやるってのも考え物ですが。

ただ、グラフィック関係のツールで、操作上、どうしても
マウスのクリックとダブルクリックを区別したいんで。。。
>>834
>つまり、1つのコントロールに対して、クリックと
>ダブルクリックの両方のイベントを利用することは
>できないんですね。

やりたいことは、ダブルクリックのときシングルクリックのイベントハンドラを
実行してない、ってことでしょう?

これは、かなりの FAQ なんです。せこい方法では、クリックイベントでタイマーを
起動し、ダブルクリック時間間隔(システム設定)経過したらシングルクリックとみ
なし、そのコードを実行する。OnDblClick ではタイマを止め、ダブルクリックイベ
ントの処理をする、というものです。

これの難点は、本当のシングルクリックのときの処理応答が遅延されることです。
>>837
自分で作った手続きを関数にして、
本体側で戻り値を判断してexitするとかは?
>>826
VB.NETを使おう。
>>837
戻り値で判断しては?
> グラフィック関係のツールで、操作上、

シフトキーを押しながらクリックとか、Ctrlキーを押しながらクリックとか、
あと右ボタンクリックを使うこともあるよね。
>>837
・自分の手続きを関数にして戻り値で判断。
・イベントハンドラ内のフラグを利用
procedure TForm1.EventHandler(Sender: TObject);
var
 exitFlag: Boolean;

 procedure MyProc;
 begin
  if xxx then exitFlag := True;
 end;
・Abortする。
845837:04/07/11 01:14
>>840,842
なるほど、やってみます。
ありがとうございました。
>>843
そうですね。

ダブルクリックは押しそこなうこともあるから、
両方使うことは、場合によっては、危険でも
ありますね。
847836:04/07/11 01:27
うわ・・大発見かも
特定の型のときだけ範囲チェックをすり抜けるようだ。
TShellTreeView を使っているのですが、ソースコード側から
特定のフォルダ(のノード)を選択にするにはどうすればよいのでしょうか?
ググレば見つかるが場所忘れた
850837:04/07/11 01:45
>>844
すいません、もう少し質問させてください。
今自分で作った物についてですが
exitが使われている自分で作った関数の戻り値をBoolean型にしました。
そして、イベントハンドラ内で、作った関数をif文の条件文に書き
そこでもう一度exitを使って対処しました。
これじゃ後々何か問題ありますか?
正直今の俺には>>844さんのコードが完全に理解できません。
特にAbort使った事ないんですがやっぱ>>844さんの方がいいんですか?
動けばなんだっていいよ。
Abortはもともと望んでいた多重Exitと同機能。
exitしない所を関数に分けてはどうだろう?
あなたのレベルでは最初から作り直すべき。
いみふめ
>>850
それでよし。
暗黙のSelfを一時的に無効にする方法ってないですか?
ない。何がしたい?
今作っているクラスのproperty名と
グローバル関数の関数名とが被っているのです。
普段は適切な方が自動判別?されて呼ばれるので問題ないのですが
クラスのメソッド内からグローバル関数の方を呼ぼうとすると
なぜかpropertyの方が呼ばれてしまうらしく
「'['が必要なところに'('があります」というようなエラーがでてコンパイルが通りません・・。

propertyが呼ばれるのは暗黙のSelfのせいだと思うので無効にする方法はないかと思って質問しました。
グローバル変数を指定したいなら
ユニット名.グローバル変数名
例えばフォームを指定する場合
Unit1.Form1とする。
う〜ん。同じユニット内にあります。
なぜならそのクラスのために作ったグローバル関数なので・・

function Point(const x,y: integer): TPoint;
のようにクラス専用のrecordを作る関数なのです。

とりあえず今は
メソッド内からグローバル変数を呼ばずに手動でrecordを作成して回避してます。
同じユニット内であっても明示しないと駄目
861855:04/07/11 04:29
>>858
あ、おかげさまでうまくコンパイルが通りました。
ありがとうございます。
またひとつ知識が増えました。
>>836,847
そりゃ宣言によるでしょ。

たとえばarray[-5..5] of integerで-1にアクセスできなかったらまずことになるぞ。
動的配列ってマイナスの添字もてたっけ?
詳細晒す気がないんだからほっとけ
プログラムからIEを立ち上げる or IEのパスを知るにはどうすればいいのですか?

WinExec( PChar('IEXPLORE'), SW_SHOW );

これだと何の反応もありません・・・
ShellExecuteの関連付けではなくIEを指名してってことならユーザーにフルパス指定させるしかない。
>>866
ShellExecuteで
関連付けで起動できました
ありがとうございます
868862:04/07/11 11:06
>>863
ああ、動的配列か。普通の配列のことだと思った。
動的配列は使ったこと無いから分からないや。
Destructor Destroyってさんざん「直接呼ばないように」と言われてる割には
publicにありますよね・・。
はっきりいって直接呼んでも全然かまわないよ。
はっきりいってFreeの恩恵にあずかったことがない。
動的配列は必ず0からです。
Professional Version5 に関してですが。
Professional Version5?
>>870
NullオブジェクトをFreeしてもエラーにならないけど、
Destoryの場合はEAccessViolationになる。
>>873
じゃぁ
if Assigned(O) then O.Destroy;
でいいやん。禁止しなくても。
875名無しさん@そうだ選挙に行こう:04/07/11 13:46
素直にfree使えばいいじゃん
なぜゆえdestroyにこだわる?
876875:04/07/11 13:47
質問させて下さい。
Delphi5Proで顧客管理ツールを
作ろうと右往左往してるんですが、

DBEditに打った内容を
DBGridに反映させる時に。

リアルタイムに打った内容が反映されてしまって、
間違って入力した時に上書きされないように、DBEditに
入力した後、ボタンイベント等を行わない限り。DBファイル
が更新されないようにするには、どうすればいいでしょうか><
>>876
連動させたくないんだったら普通にEditつかえば?
878876:04/07/11 14:17
えっと、普通のエディットに変えてみます。
エディットで入力したデータをDBファイルに
反映させる方法も、もしよろしければ御教授
願いたいです><
(解らないのなら取り合えず)ボタンイベントでSQL文投げろよ。
もしかしたらダメかなと思ってやってみたらやっぱりダメだった
StrToInt(00433) とか StrToInt(00876) とか StrToInt(00088) とか

何とか足し算引き算の出来るまっとうな数字に直したいです。
>>880
なにがしたい?
StrToInt には整数型は渡せないが。
i := 00433 とかやれば普通に 433 の数値が入るが。
(;゚д゚) ぅぉ、何時の間にか名無しが変わってる…
>>880
Valは?
> StrToInt(00433) とか StrToInt(00876) とか StrToInt(00088) とか

00433 は sring じゃないでしょ。 StrToInt('00433') じゃないの
885876:04/07/11 18:09
>>879

Appendメソッドを使って
何とかデーターの書き加え出来ました><
普通のエディタ使ってよかったです。アドバイス
ありがとうございました!
indyをダウンロードしたのですが、指定URLからタイムスタンプを取得するには
どうすればいいのでしょうか?
>>875
だって、Destroyの直呼び禁止に意味はあるか、という話でしょ。
GIFを扱えるコンポーネントはありませんか?
889デフォルトの名無しさん:04/07/11 21:29
>>888
そこらへんにいくらでも落ちてる
>indyをダウンロードしたのですが、指定URLからタイムスタンプを取得するには

indyをダウンロードしたことと、指定URLからタイムスタンプを取得することとは無関係
891888:04/07/11 21:47
ごめんなさい。TGIFImageで検索したらいっぱいありました。
>>890
わかりにくい質問ですみません。
indyをインストールしたのですがコンポーネントが多すぎてどれを使えばいいのかわからないんです。
タイムスタンプを取得するにはどのコンポーネントのどのメソッドを使えばいいのでしょうか?
そもそもネットワークリソースのタイムスタンプなんて無いが。
Last-Modified の事か?
ならTIdHTTPで、GET か HEAD メソッドでリクエストかけてヘッダメッセージ調べればいい。
>>893
ありがとうございます。
895880:04/07/11 23:44
>>881-884サマ
StrToInt の件
ごめんなさい、どうしようもないアホでした
文字列として''でくくってやったらちゃんと出来ました。
'〜'の中はそもそも変数で、他から引っ張ってくる0付き数字の列なんですが、
さてこれがどうやったら数字になるのかと、ためしに StrToInt(00426)
とかやってみたらダメだったので、ついうろたえて書き込んでしまいました。
本当に初歩的な質問で恥ずかしいんですが、
日本語文字を単位として、文字列中での
ある部分文字列の位置を知りたいんですが。

PosとかAnsiPosとかをどのように使うんでしょうか。


よろしくお願いします。
そこまでわかってるならヘルプ見れば即決だろう・・
898896:04/07/12 03:44
>>897
そうなんですか。。。

LengthみたいにWideCharで型キャストするとか?
>>896

ちょっと勉強のためにやってみた


procedure TForm1.Button1Click(Sender: TObject);
var str1,str2:string;
a1,a2:integer;
begin
str1:=edit1.text;
str2:=edit2.text;
a1:=ansipos(str2,str1);
a2:=a1 div 2 + 1;
edit3.Text:=inttostr(a2);

end;


Edit1の中に、調べたい文字列を書く
Edit2の中に、Edit1に書かれた内容から何文字目か知りたい文字を書く
Edit3の中に、Edit2の中に書かれた文字が、何文字目かを表示

日本語文字ってことで、2バイトだから、ちょろっと操作→ a2:=a1 div 2 + 1;


こんな感じでできると思うけど、もっといい方法あるかもしれない
(俺も初心者だし)

ただこれ、日本語のみ使ってる場合にしか使えないから
1バイト文字もはいってきたときにどう処理するかが頭使うのかも
900896:04/07/12 04:07
>>896
なんかできました。

日本語文字ということで、AnsiPos + WideString で
試してたんですが、Pos + WideString だったんですね。
procedure TForm1.Button1Click(Sender: TObject);
var str1,str2:widestring;
a1:integer;
begin
str1:=edit1.text;
str2:=edit2.text;
a1:=pos(str2,str1);

edit3.Text:=inttostr(a1);

end;


>>899だけど

899で書いたやつより、896さんがいった感じでやったほうが
日本語と英語まざってても対応できるから
こっちのほうがいいね

勉強になったよ、thx
ハードディスクのファイルって本当は全部0と1の集まりなんでしょう?
テキストファイルも0と1の集まりだよね?

このスレの文章も本当は0と1の集まりなの?
Delphiで文章を0と1だけの本当の変換する方法を教えてZ!
>>902
>全部0と1の集まりなんでしょう?

いいえ、違います。
on/offならともかく0と1というのは明らかに間違い。
本当
という文字は
数字で
96 7B 93 96
と表され、これを二進数(0と1の集まり)で表すと
10010110011110111001001110010110
となる。すべてのデジタル情報はこの表記に変換できる。
型識別子を引数にしたいのですがどうかけばよいのでしょうか?

function SizeOf(X): Integer;
function High(X);
function Low(X);

の(X)のように書きたいのですが、このまま書いても「パラメータの型が必要です」と言われてしまいます
function High(var X);
でどんな変数でも取れるけど目的には適わないな。
C#とかののgenericsを使うと実現できるけどDelphiにはない。
IntegerでもStringでもDoubleでもちゃんと処理する関数を書きたいなら
function High(X: Integer): Integer; overload;
function High(X: String): Stirng; overload;
function High(X: Double): Double; overload;
と地道に書くしかない。
質問したそうそうなんですが、
やりたいことは別の方法で実現できました
スレ汚しすいません。
バリアント型とか、TypeInfoを受け取ってRTTIで処理するとか、方法はあるけどね
>>903は笑えるな
910デフォルトの名無しさん:04/07/12 16:45
3MBぐらいのビットマップ画像を TImage の Picture プロパティに読み込ませて実行すると

[エラー] RLINK32: Error opening file "C:\Program Files\Borland\Delphi6\Projects\Unit1.dfm"や
[エラー] RLINK32: Error opening file "Unit1.dfm"などのエラーが出てしまいます。

以前は同じ画像を読み込ませても何もエラーが出なかったのですが
なぜか最近エラーが出るようになりました。原因がわかりますでしょうか?よろしくお願いします。
Delphi6のパーソナル版を使用しています。
TImageだけの新規プロジェクトで試してみたら
TForm に TImage だけを貼り付けて試してみたら、ということでしょうか?
やってみました。でも、15秒程度Delphiがストールした状態になり、
その後、同じエラーが出てしまいました。
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
>15秒程度Delphiがストールした状態になり、
そこでDelphiがぶっ壊れてると思わない思考に萌えます
915910:04/07/12 17:19
う〜ん・・・
一応Delphiを再インストールしてみたんですが・・・
それから、ファイルに保存してみようとしたら
「メモリストリームの拡大中にメモリが足りなくなりました」
って怒られました。自分のパソコンの問題なのかな('A`)
>>910
ハードディスクが逝かれた
>>915
Del6Pro+パッチ全部の環境では7MBのファイル一瞬でロードできるな。
単にOSのメモリが足りないんじゃないの。
918910:04/07/12 17:31
>>916
>>917
やはり自分のパソの問題だったようで。
アドバイスありがとうございました。
というか最初からエラーメッセージを書けよゴルァ
↓のような型を自分で作成し、そこに入れたデータをバイナリでファイルにセーブしようと
しましたが、

const CMaxFld = 12;
type TIni = record
TableName: string;
InsertFld: array[0..CMaxFld-1]of string;
UpDateFld: array[0..CMaxFld-1]of string;
UpDateKeyFld: string;
DeleteKeyFld: string;
end;

ファイル型の宣言をした際にコンパイルエラーが発生してしまいます。

var
F: File of TIni;

「'TIni'型は終了処理が必要です。-ファイル型として使うことはできません」
とのメッセージ内容がいまいち分からないのですが、どなたかご教授下さい。
お願いします。
stringは使えない。ShortString使っとけ
ファイルへの書き込みはTFileSream使っとけ。
922920:04/07/12 17:46
ありがとうございました。
タイトルバーが消せなくて困っています。

フォーム1を親 フォーム2を子にしてるんですが
親のタイトルバーは消せるんですが子フォームのが消せません。

なぜでしょうか?
>>924
>>808を別に否定はしないが
シーケンシャルなバイナリファイルの読み書きに
TFileStreamが向かない理由とその代案を説明してくれ。
808は無視してよし
MDI子フォームのタイトルバーがなかったら不便だろうなー
ListViewにて任意のセルにユーザー直接文字入力できるよう
設定できるプロパティってありますか?
任意のセルは無理なんじゃないの
930923:04/07/12 18:44
仕様だったんでしょうか?
なぜできないのか疑問だっただけなんで。
931513:04/07/12 21:14
>>513の質問、誰かヒントだけでも良いのでいただけない
でしょうか。。。完璧に行き詰まってしまっています。
>>931
いろんなやり方があると思うが、
普通のグリッド使って、一括処理、というのもありだと思うよ。
例えば最大99行ぐらいの伝票処理なんかだと特に向いてるかも。
同じ伝票を同時に複数人がカキコすることがある、とかだと難しくなってくるけど。
>>928
つーか、Listviewの各項目はセルとはいわんだろ。
TMediaPlayerでWaveを再生するとき、ボリュームを変更するってことで、
ネットでいろいろ探したんですが、以下のようなものがありました。
いろんな国のサイトで同じソースが出てたから、これが定番なのかも。

ttp://www.swissdelphicenter.ch/torry/printcode.php?id=618

ところが、これがウチではうまく機能しないんですが?
つまり、音量がまったく変わらないんです。ウチの環境の問題?
これは純粋にDelphiの問題じゃないのかもしれませんが、
よろしくお願いします。

ビットマップAに背景色と前景色を指定して文字を描画し、
それに少々処理を加えます。ビットマップBには任意の画像が
読み込まれています。

ここでビットマップAの背景色を透明色として、ビットマップAを
ビットマップBにコピーしたいんです。このとき、ビットマップAの
文字のアンチエイリアス処理で生じた半透明の部分も上手く
コピーしたいんです。

こんな場合、どんな方法があるんでしょうか。
BitmapB.Canvas.Draw(x,y,BitmapA);
>文字のアンチエイリアス処理で生じた半透明の部分も上手く

Canvas.Draw だとこれがうまくいかないか
>>935
重ね合わせた後に文字を書くとか?
知らんけど
939935:04/07/13 00:00
やっぱアルファブレンドの方法を
ちゃんと勉強しないとだめかな...
C#でGDI+叩けば一発なんだけどな
DelphiでもGDI+使えるよ。
ネットワークドライブの割り当てがされているフォルダがあり
OpenDialogでパスを取得したとき

e:\filder\faile.txt (ネットワークドライブ)ではなく
\\コンピュータ名\filder\faile.txt

にしたいのですがどのようにすればよいでしょうか
おねがいします。
WNetGetUniversalName
bccで作ったobjファイルをリンクしようとしているのですが、

コンパイルすると、
"forward または external 宣言された 'sum' が見つかりません"
というエラーが出ます。

具体的なコードは以下のようになってます。

=== sum.cpp ( bcc32 -c sum.cpp ) ===
extern "C" {
int __stdcall sum(int a, int b)
{
  return a + b;
}
}

=== Unit1.pas ( 一部 )==============
{$L sum.obj}

function sum(a: Integer; b: Integer): Integer; StdCall; external;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBox(0, PChar(IntToStr(sum(2, 5))), '', MB_OK);
end;

どのようにしたら解決できるか、教えていただけると嬉しいです。
恐らく"sum"ではなく"_sum"になってると思われます
.objをバイナリエディタで開いてみてください
(伝統的にC呼びだし規約はアンダーラインが付く)

ついでに、C呼びだし規約に対応するのはstdcallではなくてcdeclです
Timageをクリックしたときに指定フォルダ(c:\pic\)にある画像(00〜10.bmp)を
ランダムに表示させるにはどうしたらいいでしょうか?
>>945
レスありがとうございます

いろいろ試してわかったのですが、
sum.cpp を sum.c にして作成した obj ファイルだとリンクできました。
extern "C" をつけてるので大丈夫だと思ったのですが、C++だと駄目なようです。

呼び出し規約については、
stdcall でも cdecl でも Cの関数提供側とPascalの呼び出し側で統一してやれば、
問題ないようです。

C++のobjファイルがリンクできないと自分には不便なのですが、
方法はないのでしょうか?
>>946
具体的に何が知りたい?

画像の読み込ませ方?
ファイル名をランダムに得る方法?
誰かTStream のテキストファイル対応版を知りませんか。
950949
ResourceStreamやMemoryStreamから
Readln、Writeln したいのれす。