102 :
デフォルトの名無しさん :
04/03/05 21:39 質問よろしいでしょうか。バージョン6のパーソナル使ってます。 MP3を鳴らそうとして、コンポーネント、ActiveXからWindowsMediaPlayerを追加しました。 ここで、繰り返し再生させたいのですが、WMPの設定で連続再生のボタンにチェックをいれても 1回しかならずに止まってしまいます。 どのようにすれば繰り返し再生できるのでしょうか。 なお、通常のTMediaPlayerを使用すると富士通のパソコンだと動くのですが、 vaioだと鳴らなかったりしたんで、WMPをインストールしました。
すいません誤爆でした。
>>98 >そのズレまくりなのを なんとかしたいのです。
だからそのファイルをコンパイルしなおせ。と。
行番号情報が古いものを使い続けているだけだ。
そのファイルがライブラリのファイルなら、ファイル名を教えて。直してあげよう。
これ完全なFAQだな。
delphi8のWin32版がでるというのは本当ですか?
>>107 US Newsgroup その他での話によると、夏あたりまでに D7 のアップデートの話もあって、Delphi8/W32 との関係がまだよくわからない。
なお Delphi8 IDE そのものは VCL/W32。
IDE 上で動くアドインを開発するための、Delphi8 相当の W32/VCL のライブラリとコンパイラキットが
すでに公開されている。
hozen
死ねよ粘着
ここは実質12ってことで FA?
114 :
デフォルトの名無しさん :04/03/09 20:48
115 :
デフォルトの名無しさん :04/03/09 21:53
Winソケットを使ったプログラムを組みたいんですけど、どこかによいソースとかありませんか?
ソースを見たら<プログラムを組>むことにはならんと思ふ
>>115 「Winsockを使ってみようぜ」
このサイト見てみれ
多分あんたが求めてるものじゃあない。
118 :
デフォルトの名無しさん :04/03/09 23:11
こっちのスレを再利用でいいのかな? WindowsのシステムフォルダってDelphiではどのように書けばよいのでしょうか? Win95ではWindowsですし、Win2000ではWINNTですし・・・
GetEnvironmentVariable
GetWindowsDirectory, GetSystemDirectory
123 :
デフォルトの名無しさん :04/03/10 13:53
自作のプログラムを起動させていると、丸1日ぐらいすると突然、キーボードから キーが入力で着なくなったり(NumLockを押してもNumLockのLEDが点滅するのみ)、 マシンを再起動しようとすると再起動の途中のWindowsをシャットダウンしています の画面でマシンが固まったりしてしまいます。 stringlistやsendinputを多用したソフトなのですが、このような症状の回避策に あるいはチェックするべきところに心当たりはないでしょうか? Stringlistのfreeはtry.finallyで必ずやっています。 OSはXP,D6Proで書いてます。 漠然としていてレスしにくいと思うのですがどうかお願いします。
>>123 まず、メモリの使用量がどんどん増えていないか確認してみては?
ハンドルなどのシステムリソースを食らい続けたときの症状っぽい
>>125 使って見てみます。
>>126 THandle型はたぶん使っていないのですが、どういう意味でしょうか?
>>127 おまいさんが直接使ってなくてもVCL内部ではたくさん使われている。
文字列のInsert関数みたいに、動的配列の真ん中に要素を挿入できる関数はありませんか?
>>128 何度もすみません。
ということはどの辺をチェックすれば良いでしょうか???
>>130 動的に生成していて、破棄していないものを調べる。
例えば、CreateしてFreeしてないものがないかとか。
使ったことないけど
>>125 ので検出できるんじゃない?
しらねーよ ソース出せないなら自分でやれよ
>>130 だから、タスクマネージャ出して、そのリソースとかメモリとかが増えてないか調べてみろよ
更新速度を遅くしとけよ。
135 :
デフォルトの名無しさん :04/03/10 18:07
つーか、何でもリークのせいにするなよ
まずはリークを疑えという話なんで、他にアドバイスがあればしてあげれば?
1、普段からアプリを作ったらタスクマネージャでメモリ・リソースが使ってる間に増えてないか確認するのをクセにする 2、デバッグ中、範囲チェックはさせる 3、ファイルを異常に沢山作成させてないか、ハードディスクを時には確認する
ヘルプ見てもいまいち解かりにくいのですが SetLengthで確保した動的配列の割当を開放するのはどうすればいいのでしょうか? 「nil を代入するか,Finalize に変数を渡します」 とあったので今は動的配列変数にnilを突っ込んでます。 他でも見たのはSetLengthで0を割り当てるとかもありました。
>>139 SetLengthという手続きで確保しているから、Finalizeという手続きで開放した方が
見た目がよさそうなので、そうしてる。
その割には、オブジェクトの開放はFreeAndNilを使うよう徹底してたりするわけだが。
141 :
デフォルトの名無しさん :04/03/10 21:39
質問失礼します。 プログラミングの勉強をしようと思ってC言語の入門書片手にやり始めたのですが Sample1.cというソースファイルをコンパイルしてSample1.exeというファイル にするというところでいきずまっています。 その入門書には\CGENGO\PRACTICEに移動してdirでSample1.cがあるのを 確認した後Lcc Sample1 と入れてEnterでコンパイルとなっているのですが 以下のような文がでてきてできません.なぜできないのでしょうか? これだけの情報ではわからないかもしれませんがご教授の願います。 Microsoft (R) KKCFUNC バージョン1.10 Copyright (C)Microsoft Corp. 1991,1993. All rights reserved. KKCFNC が組み込まれました。 マイクロソフトかな漢字変換 バージョン 2.51 (C)Copyright Microsoft Corp. 1992-1993 エラー:エクスドメモリーマネージャーがすでにくみこまれています。 XMSドライバは組み込まれていません。 Microsoft (R) KKCFUNC バージョン1.10 Copyright (C)Microsoft Corp. 1991,1993. All rights reserved. KKCFUNCはすでに組み込まれています。 コマンドまたはファイル名が違います。 lcc: can't exec: cpp: No such file or directory
誤爆だ、わーい!
Delスレ的にはBCC32だな。
145 :
デフォルトの名無しさん :04/03/10 22:49
ComboBox1の中の数値とComboBox2の中の数値を掛けたいのですが、 どうすればよいのでしょうか? begin と end の間の処理なんですが・・・ 中の数値を一度変数に置き換えないとダメですか? stringとintegerの間に互換性がないとか言われてチンプンカンプンです
>中の数値を一度変数に置き換えないとダメですか? はい >stringとintegerの間に互換性がないとか言われてチンプンカンプンです 文字列型と整数型は全く異なる型で互換性のないのが当たり前です。 VBではこの当たり前じゃないことが通用してしまうわけですが…
147 :
デフォルトの名無しさん :04/03/10 23:06
>>146 ありがとうございます!m(_ _)m
それで、変数に置き換えようとしたのですが、
begin
w := ComboBox1;
end;
では出来ないようで、途方に暮れております・・・
どうすればいいのでしょう?
>>145 var
V1,V2,V3:Variant;
begin
V1 := ComboBox1.Text;
V2 := ComboBox2.Text;
V3 := V1 * V2;
Edit3.Text := V3;
end;
>>148 Delphiらしくはないけど、それでも動くよね(最近この手のレスのやりとりがあったっけ)
>>147 普通は
var
nValue1, nValue2, nResult: Integer;
begin
nValue1:=StrToInt(ComboBox1.Text);
nValue2:=StrToInt(ComboBox2.Text);
nResult:=nValue1*nValue2;
Edit3.Text:=IntToStr(nResult);
end;
みたいになるよ。
ちなみに変数を宣言しないで一行で書くことも可能
Edit3.Text:=IntToStr(StrToInt(ComboBox1.Text)*StrToInt(ComboBox2.Text));
150 :
デフォルトの名無しさん :04/03/10 23:31
>>148 ありがとうございます!!!!!!
Variantなんて初めて使った・・・
ちなみに、Label.Caption:=V3
にしようとすると、エラーになってしまうのですが、
これは出来ないのですか?
それともどこか間違っているのでしょうか?
149の方がスマートだよ、148はある意味悪例。 なんにせよ、例外処理(数値が求められるところ に文字とか出た場合のとか)は必要。 うちでは、148の内容の Edit3.Text := V3; を Label.Caption:=V3 に変えても、一応通る(エラーなし)けどね。
反対に148の方がスマートか。 正に、「らしくない」がふさわしい。
>>139 ヘルプには書いてありませんが,
単に解放するだけでしたら何もしなくても自動的に解放されます.
(『長い文字列型と同じ』という記述に注意してください)
明示的に解放する場合,
その配列を別の動的配列変数に代入していなければ
その3つの方法のどれでも解放されます.
>>145 ここでいう『互換性』とは
・式の中であるふたつの値を一緒に使えるか
あるいは
・ある値を変数に代入できるか
ということです.
DelphiではIntegerなどの数値型とStringなどの文字列型には『互換性』がありません.
154 :
デフォルトの名無しさん :04/03/11 01:37
150です。
このスレのおかげで今夜は寝ることが出来ますです。
特に
>>148 さんに感謝しますm(_ _)m
みなさんどうもありがとうございますです
>>153 が途中で切れてしまったので続き.
…よって,
>>149 のように文字列として連結したいときは数値を文字列に変換し,
数値を演算したいときは文字列を数値に変換しなければなりません.
>>148 はバリアント(Variant)を使った例です.
バリアントには文字列でも数でも格納することができますし
文字列と数値との間の変換も勝手にやってくれるので非常に便利です.
そもそも文字列型だとか数値型とかいちいち意識しなくて済むので特に初心者には楽ちん(死語?)でしょう.
しかしバリアントには落とし穴があります.
たとえば>148の方法で足し算をやるとうまくいきません(文字列とみなして連結してしまうようです).
v1に文字列が代入された時点ではv1は文字列として情報を持っています.v2も同様です.
代入先が数値変数ならv1とv2は自動的に数値に変換されますが
代入先がバリアントの場合の仕様はドキュメントには書かれていません.
恐らく変換しなくて済むものは変換しないようになっているのでしょう.
なお,この問題はたとえば v3 := VarAsType(v1, varDouble) + VarAsType(v2, varDouble)とすれば回避できますが,
この時点で『文字列型だとか数値型だとかいちいち意識しなくて済む』メリットは失われてしまいます.
DelphiではVBと違い,基本的にバリアントを使わず,
プログラマーに型やその違いをはじめから意識させることによって
いちいち型変換しなければならない代わりに
予期しない型変換によるトラブルを未然に防いでいます.
>>138 を参考にしてやってみたのですが今日も駄目でした。
タスクマネージャーをずっと表示していたのですが、メモリの使用量は
増えていませんんでしたがまたキーボードがいかれてしまいました。
リソースの使用量は確認できなかったのですが、どのようにすればリソースの使用量は
確認できるのでしょうか?
また、どのようなことを忘れていたらリソースの量はどんどん増えていって
しまいますか?
158 :
デフォルトの名無しさん :04/03/11 12:44
Delとは直接関係ないんだが、 スタートアップで起動させるソフトを登録する レジストリで、起動させるプログラム名と任意の 引数を与えたいのだが、どう書くの? ぐぐったけどよく分かんなくて、今手元に本とかも ないので誰かおせーて。
そういや俺Variant型って1回も使ったことないや。 なんか危険な香りがプンプンするよね。
>>159 基本的な考え方は何でも入るObject型と同じですよ?
>>160 そりゃ知ってますけど、なんか本能的に
わかりにくいバグを生みそうな予感がします。
>>159 Comをやるときには必要になるよ。(Excelを操作したり)
それ以外の用途ではほとんど使わないね。
>>162 それも知ってるけど、個人的にCOM使わないし
こういう足し算のパターンではまず使わないなぁ、と。
個人的にはね。
かけ算か。
Gkitって言う有料コンポではVariant型使いまくられてるので仕方なく使ってます。
166 :
123=157 :04/03/11 13:13
どなたかよろしくお願いします。
>>123 =157
だからリークなわけないっていってるじゃん。
リソースはタスクマネージャで表示項目にハンドルやGDIを追加してください。
キーボードが逝かれるってのは、 Msg.Resultを処理してなくてブラックホールできてるんじゃないか?
>>158 HDDからこんなのが出てきたけど、参考になるかな?
var
ri: TRegistry;
begin
ri := TRegistry.Create;
ri.RootKey := HKEY_LOCAL_MACHINE;
if(ri.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\run', True)) then
begin
ri.WriteString('適当な名前', '実行ファイルのフルパス オプション');
end;
初心者スレで閉じて解放するところを省略するのはいかがなものか
>>170 ごめんよ。関係ない部分を編集してたら抜けてしまった。
var
ri: TRegistry;
begin
ri := TRegistry.Create;
ri.RootKey := HKEY_LOCAL_MACHINE;
if(ri.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\run', True)) then
begin
ri.WriteString('適当な名前', '実行ファイルのフルパス オプション');
end;
ri.free;
end;
172 :
123=157 :04/03/11 14:45
>>167 たびたびすみません。
では何が原因だと思われますでしょうか?
教えていただいたリソースの確認はやってみます。
>>168 MSGの意味が分からないのですがどういう意味でしょうか?
>>172 ソースも出せないくせに粘着すれば答えが出ると思ってんの?
174 :
123=157 :04/03/11 15:31
200kbほどあるのですが、どこかにアップした方がいいでしょうか?
>>174 アップローダくらい自分で探せ!おまい何様だ?
>>172 XPならタスクマネージャのパフォーマンスタブで 合計の所にハンドルの表示があるから、その数を確認
それが増えていってないなら、リソースリークではないだろう
メモリの消費量はコミットチャージの方で確認してるよね?
ところで、そのアプリ使わなくても そのキーボードいかれる現象起きない事は確認してるんだよね?
とりあえずタイマーで回してる部分のみを張ってみては?
リークじゃないかと言い出すやつに限って、リークさせてみたことないから、 だんだん変になるってのは、どう変になるかにによらずリークだといいだす。
>>178 うーん。
低レベルオーディオとかのCALLBACK中に悪さしてるとか、グローバルフックをかけてるとかなら別だけど、
普通に作って、保護例外とかも出ないなら、それ以外の可能性が考えられないからなあ
あるいは例外全部キャッチして握りつぶしてるのかな? ならデバッガ上で動かしてみるべきだね。
>可能性が考えられない 個人の能力に依存
リークじゃなくて、メモリのフラグメンテーションかもしれない。 とりあえず、メモリ使用量がホントに増えてないんだろうな?
183 :
123=157 :04/03/11 19:48
皆さん何度もありがとうございます。えぇスレや。
3時間ソフトを走らせてみたのですが、メモリの使用量は5M近辺をうろうろしていて
大きくはなっていません。ハンドルは74、GDIオブジェクトは67から変化しません。
マシン全体の合計のハンドル数も4400弱を上下しています。
>>176 コミットチャージの合計値は110M前後です。上昇はしていません。
このアプリを使う前はこのような症状は無いでした。
>>177 はい。次に貼り付けます。長文スマソ
SendInput があやしい
185 :
123=157 :04/03/11 20:09
procedure TMainForm.MainTimerTimer(Sender: TObject); var TempList1:TStringList; TempList2:TLightstrings; i,j,jj,age1 :Integer; SetName,kk,s,s1:string; ChangeData:boolean; Wnd,ChildWnd:HWND; begin MainTimer.Enabled:=False; ChangeData:=false; if (LastGetDataTime<now-EncodeTime(0,3,0,0)) then begin Richedit1.Lines.Add(FormatDateTime('yyyy/mm/dd hh:mm:ss',Now)+',通信が途絶しました。再ログインします'+SetName); Richedit1.Repaint; Login(Self); LastGetDataTime:=now; end; for jj:=1 to 10 do begin kk:=''; SetName:=whatsetname(jj,kk); statusbar3.SimpleText:=SetName+' Data'; statusbar3.Repaint; kk:=MainPath+SetName+'.Data.'+formatDateTime('yyyymmdd',Now-1); s :=MainPath+FormatDateTime('yymmdd',Now-1)+SetName+'1.txt'; s1:=MainPath+FormatDateTime('yymmdd',Now-1)+SetName+'2.txt'; if not fileexists(kk) then begin
186 :
123=157 :04/03/11 20:10
TempList1:=TStringList.Create; TempList2:=TLightStrings.Create; try try TempList1.LoadFromFile(kk); age1:=FileAge(kk); for i:=0 to templist1.Count-1 do begin TempList2.Text:=TempList1[i]; Nowtime:=Now; if SetData1(jj,SetName,TempList2,s,s1,NowTime) then begin ChangeData:=true; end; LastGetDataTime:=now; end; if age1=FileAge(kk) then begin if not DeleteFile(kk) then begin RichEdit3.Lines.add(FormatDateTime('yyyy/mm/dd hh:mm:ss',Now)+',Data file "'+kk+'" Delete Failed'); end; end else begin j:=TempList1.Count; TempList1.LoadFromFile(kk); for i:=0 to j-1 do begin
187 :
123=157 :04/03/11 20:11
TempList1.Delete(0); end; TempList1.savetofile(kk); end; except RichEdit3.Lines.add(FormatDateTime('yyyy/mm/dd hh:mm:ss',Now)+',Data file "'+kk+'" Open Failed'); end; finally TempList1.free; TempList2.Free; end; if errorflag and (not errorReportflag1) then begin TempList1:=TStringlist.Create; try i:=Richedit1.Lines.count; if i>2 then begin TempList1.Add(Richedit1.Lines.Strings[i-3]); TempList1.Add(Richedit1.Lines.Strings[i-2]); TempList1.Add(Richedit1.Lines.Strings[i-1]); end else begin TempList1.Add(Richedit1.Lines.Strings[i-1]); end; Mail(TempList1); errorReportflag1:=true; finally
188 :
123=157 :04/03/11 20:12
TempList1.free; end; end; if (DataCount<16) and ((not errorflag) or ChangeData) then begin SetData2(jj,SetName); SetData3(SetName); if MaxData/MinData>0.8 then begin statusbar3.SimpleText:=SetName+' Data Process'; statusbar3.Repaint; DataPro(jj); statusbar1.Color:=clBtnFace; statusbar1.SimpleText:='正常処理中です。'; statusbar1.Repaint; end; end; end; end; TempList1:=TStringlist.create; try if not errorReportflag2 then begin errorReportflag2:=true; TempList1.Add('エラーが起きています。'); Mail(TempList1); end; finally TempList1.free; end;
189 :
123=157 :04/03/11 20:13
ComboBox2Change(Self); MainTimer.Enabled:=True; end; 以上です。もっと長いのですが、余計な部分は消してます。 読みにくいソースですみません。
SendInput使ってないじゃん
わかった、FileAgeだとおもう。
直接関係ないけど 1. 通信途絶の時はSetNameが初期化されてないけどいいのか? 2. ファイルkkが存在しない時にTempList1が読もうとしてるがいいのか? 3. メール関係のシェアウェアを公開してたりするか?
SetDataの中の人が気になるな〜 TLightStrings(おいらは知らなかったけどニフティにあるらしいね)というのが 引数になってるから余計に… あとはMailとDataProかな〜 いずれにせよ、このリストからはリークもリソースの開放し忘れも見えてこないね。
×リスト ○ソース ま、いっか
原因がわからないエラーの時は原因を探すのを先にやらなければいけない。 しかし、1日おいて突然起きるような現象を突き止めるのはとても厄介だ。 Timerで エラーレポートをRichEditに書いてるけど、これだと暴走して電源切らなくちゃいけなくなったら消えてしまう。 ファイルに書き出しておいた方がいい。 ところで、大量にファイルを作ってるんじゃないのか? 大量にファイルを作ると、時間と共に急激にWindows全体が重くなるよ。
196 :
123=157 :04/03/11 21:13
>>190 SendInputは
procedure TMainForm.Login(Sender:TObject);
var
Wnd:HWnd;
begin
Wnd:= FindWindow(Nil,'Error');
if Wnd <>0 then
begin
SetForegroundWindows(Wnd);
end;
keybdInput(VK_ESCAPE, 0);
keybdInput(VK_ESCAPE, KEYEVENTF_KEYUP);
SendInput(KeyInputCount,KeyInputs[0],SizeOf(KeyInputs[0]));
KeyInputCount:=0;
こんな感じで使ってます。ちなみにkeybdInputは
procedure TMainForm.KeybdInput(VKey:Byte; Flags:DWord);
begin
Inc(KeyInputCount);
SetLength(KeyInputs,KeyInputCount);
KeyInputs[KeyInputCount-1].Itype:=INPUT_KEYBOARD;
with KeyInputs[KeyInputCount-1].ki do
begin
wVk:=VKey;
wScan:=MapVirtualKey(wVk,0);
dwFlags:=KEYEVENTF_EXTENDEDKEY;
dwFlags:=Flags or dwFlags;
time:=0;
dwExtraInfo:=0;
end;
end;
です。
たぶんファイルはたくさん作ってないぞ。 1.txtと2.txtだけ。
198 :
123=157 :04/03/11 21:26
>>192 1,SetNameの中身は数字で表示しているだけなので大丈夫です。
2,すみませんログを削除しすぎていました。
if not fileexists(kk) then
begin
kk:=MainPath+SetName+'.fxcm.'+formatDateTime('yyyymmdd',Now);
s :=MainPath+FormatDateTime('yymmdd',Now)+SetName+'1.txt';
s1:=MainPath+FormatDateTime('yymmdd',Now)+SetName+'2.txt';
end;
こんな感じになってます。
3,いえ、公開しているソフトは1本も無いです。
>>193 LightStringsやめてStringlistでテストしてみます。
MailとDataProまでここにあげるとなると他の皆様に迷惑でしょうからやめておきます。
無料のサイトにソースをアップした方がいいかな
>>195 毎回ファイルに書き出すようにします。ありがとうございます。
あとファイル数は同じファイルに定期的に上書きしているだけなので大丈夫です。
SendInputで発生したイベントによって KeyInputCount:=0; が実行されないとか… KeyInputCountのリセット位置を工夫すると 安定するような気もするな〜
おいらなら とりあえずKeyInputCountを他の変数に代入して SendInputを呼び出す前にKeyInputCountを0にしてしまうな〜 もちろんSendInputの引数は代入した方の変数なると
俺も全然関係ないことだけど、 TStringlistをメソッド内の変数にして何回も生成破棄するってどうなのかね。 メンバにしてコンストラクタで生成し、メソッド内ではClearするだけの方がすっきりしそう。 余計なtry..finally全部消えるのに。
202 :
123=157 :04/03/11 22:46
>>199 KeyInputcountの値はきちんと入ってるみたいです。
試しにこの行を削除して実行してみたのですが、過去の履歴も一緒出力するようになりました。
>>200 すみません、理解しきれていないのですが、KeyInputCountを0にして
呼び出せば安定する、って言う意味でしょうか?
>>201 ソフトが安定したらFormCreateでStringListを育成して、FormCloseでFreeしようと
思っていたのですが、それよりも201さんが書かれたメンバにしてコンストラクタで生成する
方法の方が安定しますか?
やり方が分からないのでちょっとイメージがわかないです。
OS変えろヴォケ
マシン変えろヴォケ
SendInputによって発生したイベントを処理するイベントハンドラの中に 更にSendInputを呼び出すものが紛れ込んでいたらハングアップするだろうけどなぁ 同じキー入力が何重にも発生するだろうから… (SendInput自体にSendInputが割り込むことはないけれど) 症状から見て極まれにしか起こらないみたいだから SendInputの処理中にタイマーのイベントが発生した場合だけ起こる現象化かもね
207 :
123=157 :04/03/12 00:03
>>206 >SendInputによって発生したイベントを処理するイベントハンドラの中に
>更にSendInputを呼び出すものが紛れ込んでいたらハングアップするだろうけどなぁ
たぶん無いと思います。
でもこのままだとSendInputが原因かどうか分からないので問題の切り分けのために
とりあえずSendInputを全部//行にして実行してみます。
チョンやチャンコロには著作権なんて考えはないからな。 死ねや!チョン&チャンコロ
禿同
覇解怒鵜
ごくマレに起きるのか、それとも時間と共に起きるのか切り分けないといけないね。 1時間毎に、フォームの状態とかを保存した上で 同じアプリを別プロセスで起動して、 自分を終わらせて、同じアプリは自分の終了を確認したらフォームの状態を復元して動作するような仕掛けを作って やっぱり24時間したらハングアップするかどうか見てみたら?
212 :
123=157 :04/03/12 09:48
>>211 24時間たったら必ず起こる、と言うわけではありません。
もっと早く起きるときもあります。
昨日の夜からSendInputを殺して動作させていたのですが、エラーがやっぱり
出てしまいました。
別プロセスで起動する、と言うのが良く分からないのですが、ちょっと考えます。
原因は、自分じゃなくて操作しようとしてる相手にあるかもしれないから、厄介だね。 しかも、長時間稼動しなければ発生しないとなるとなおさらだ。 きりわけをする為に、 SetForegroundWindows とか、相手に投げてるメッセージを探して それを連続して投げてみて同じ事が起きないか順に見てみたら? SendInput も1回だけじゃなくてSHIFTとか関係なさそうなのを連続して投げてみるとかしてさ
>>196 よく判らないけど、別のアプリをコントロールしようとしてるのならば、
"Error"タイトルの窓が無ければ、どこか判らないフォアグラウンドプロセスにESCを送りつけるの?
見つかったとしても、 SetForegroundWindows は 何? SetForegroundWindow ?
SetForegroundWindow は必ず成功するわけではない。
ブリンクさせてなりたいという意思を表示させるだけの事も多い。
この場合、やっぱり現在のフォアグラウンドプロセスにESCを送りつけるわけで、
アプリ全体にこの手の配慮不測があるとすると、そこらへんを見直さないといけないと思うよ。
215 :
123=157 :04/03/12 10:54
>>213 試してませんでした。やってみます。ありがとうございます。
>>214 2週間ほど前まで、214さんが言っておられるタスクバーが茶色ブリンクするだけの
症状にも悩んでいたのですが、こちらのスレで解決法を教えていただいたので
その処理をSetForegroundWindowsというprocedureにして必ず目的のWindowを
表に出せるように処理しています。
フォーム上に文字を表示するのはどうすればいいんですか?
フォームにTLabelコンポーネントを張れ! そしてオブジェクトインスペクタのCaption欄に文字を入れろ
218 :
デフォルトの名無しさん :04/03/12 16:28
ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこい
>>1 !!
「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | |
あぁこうやって誤爆するんだ…
220 :
デフォルトの名無しさん :04/03/12 17:25
質問があります。9を2で割ったときの余りがいらないんですが、どうやって捨てたらいいですか?
>>220 DIVをつかえ 使ったこと無いけどたぶん
a:= 9 DIV 2;
a:=trunc(9/2); というのも有ったかもしれぬ
223 :
デフォルトの名無しさん :04/03/12 17:32
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」 ―――――――――――――‐┬┘ | ____.____ | | | | | | | ∧_∧ | | | |( ´∀`)つ ミ | | |/ ⊃ ノ | |  ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ | [余り] |
| ____.____ | | | ウヒョー .| .| [余り] | | ∧_∧ | .| | |( ・∀・)つ━━┫ ┃ | |/ ⊃ ノ | .|....┗━┛  ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
227 :
デフォルトの名無しさん :04/03/12 18:51
普段はbutton1をクリックして処理を開始しているプログラムを、 スタートアップでウィンドウズの起動と共に自動的に1回処理させたいです。 その時に、フォームは出ないようにしたいのですが、フォームの Createイベントの中で Button1Click; Close; とやるとエラーが出てしまいます。 どうすればいいのでしょうか?
>>227 普通は、OnClickでは、処理を呼び出すだけで、実際の処理は別のクラスに書くものです。
そして、その処理は .DPR に 書くと良いでしょう。
ありがとうございます。 .DPRですか。ぐぐってもすこししらべてみます。
コード・エディタがどうにも使いにくいので、出来れば秀丸にしたいのですが、 どこの設定を変えれば宜しいのでしょうか? 超初心者的質問で申し訳ないのですが、どなたかご教示お願い致します。
>普通は、OnClickでは、処理を呼び出すだけで、実際の処理は別のクラスに書くものです。 はぁ?
ひぇ〜 ”はぁ” 来た〜〜〜
> コード・エディタがどうにも使いにくいので、出来れば秀丸にしたいのですが、 > どこの設定を変えれば宜しいのでしょうか? > 超初心者的質問で申し訳ないのですが、どなたかご教示お願い致します。 Delphi 予約語などのの強調表示ができればいいんだろ。秀丸は Pascal の強調表示には対応してた はず。しかし、超初心者ならコードエディタにも慣れた方がいいと思うぞ。なんと言ってもコード補 完は便利だから。
234 :
デフォルトの名無しさん :04/03/13 00:57
>>230 統合開発環境じゃなくて秀丸使いたがるなんて、プログラムの初心者じゃないだろ。自分で調べろ!
といいたいところだが…
秀丸を統合開発環境のデフォルトエディタには出来ない。
統合開発環境も一緒に起動しておいて秀丸で編集して保存。
んで、統合開発環境のエディタをアクティブにすると、「内容が変更されたが更新するか?」というメッセージが出るのでOKする。
んで、メニューからコンパイルすればよい。
dos窓が良ければコマンドラインコンパイラ(bin\dcc32.exe)もあるぞ。
慣れろ。 以上。
237 :
デフォルトの名無しさん :04/03/13 01:22
DPRにあるルーチンってフォームのユニットから呼び出せたっけ?
たっけ?じゃなくて試せよボウズ
質問させてください。 フォームにボタン(Captionはボタン生成)を1つ貼り付け、 それを押すと度にその下に新しいボタン(新ボタン1,2,3...)が にょきにょき出てくるテストプログラムを作っています。 ここで新ボタンを押すと、その押したボタンが消える(破棄される) ようにしまして、消える事は消えるのですが消えた後にほぼ必ず 読み込み違反のエラーが出てしまいます。ごく稀に出ない時もあります。 このエラーが出ないようにするにはどうすればいいのでしょうか?
ソース
>>239 ボタンを破棄しないで
VisibleをFalseにしる
アッチョンブリケ
すみません
>>228 は誤解を招く表現でした。
前半はドキュメントとビューを別けようという話です。
OnClickに、見かけとか、そのフォームに関する処理を書くだけならいいのですが、
何か処理をする時、 何か処理をするという事は、データを扱うという事ですので、
そのデータの方に注目して、別のユニットにその処理を書きます。
そうすると、そのユニットは単独で使う事が出来るようになります。
たとえばバッチ処理をさせたりしたい場合に便利になるわけです。
そのあたり、馴れない間は、DataModuleに書くと良いでしょう。
後半は、アプリ起動時に処理させたい内容は、.DPRに書くと良いという話です。
DataModuleを使う場合、.DPRはこんなふうになっています。
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TDataModule1, DataModule1);
Application.Run;
end.
ここで、 Application.Run; をParamによって条件判断して呼ばなければ
そのままアプリはフォームを開かずに終了し、endの後でCreateされてるフォームは
Applicationを親にしているので自動的に開放されます。
>>228 ,
>>244 きっかけをもらえて助かりましたYo!
データモジュールの使い方が分かってアリガd
>>239 ボタンはオーナーであるフォームが管理してるんだから
勝手に破棄しちゃ駄目でしょ。Components配列から外さないと。
>>246 子コントロールが開放(たとえばButton1.Free; を実行)されれば、
自動的に親と通信するから大丈夫。
>>239 将来の事を考えると、イベントハンドラ内でFreeしない方がいい。
でも、それとは別に、イベントハンドラ内でFreeしても現在のVCLでは問題ない。
だから、何か変な事をやってるように思うから、その部分のソースを書いてみて。
>>247 > イベントハンドラ内でFreeしても現在のVCLでは問題ない。
設計時にポトペタしたのは大丈夫だけど、動的につくったやつはそのイベントハンドラ
で Free するとエラーになる。試してごらん。
フォーム1からフォーム2をリンクして開こうとおもうのですが 新しくフォームを生成するのではなく フォーム1の中でフォーム2を実行したいのです どうすればいいのでしょうか? また、こういったわからないことがあったら どうやって調べたらいいのでしょうか? ヘルプファイルもいまいち理解しにくいのですが
>>249 PageControl使ったほうがいいかも
>>248 試してみました。
procedure TForm1.Button1Click(Sender: TObject);
begin
TButton(Sender).Free;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with TButton.Create(Self) do
begin
Parent := Self;
Top := Y;
Left:= X;
OnClick := Button1Click;
end;
end;
質問です。 WebBrowserを使って簡単なブラウザを作っているんですが、 リンク先が新しいウインドで開く設定のリンクだった場合 IEが新たに立ち上がって、IEにリンク先のページが開いてしまいます。 これをIEでなく、ブラウザ自身を立ち上げて表示させたいのですが どうすればいいんでしょうか? よろしくお願いします。
その作ってるブラウザをデフォルトのブラウザに しなきゃなんないんじゃないの?
質問お願いします。 Delphi 6 personal で作ったツールを仕事で使ったらライセンス違反ですか?
>>255 そういう微妙なライセンスの問題は、個人の契約問題ですから
ご自分でボーランドに問い合わせて下さい。
257 :
デフォルトの名無しさん :04/03/13 20:20
>>252 リンクをクリックしたときに発生するイベントあるんだから(OnBeforeNavigate2)、
そこにShellExecute使って自分自身を起動するようにすればよい。引数にはリンクのアドレスを入れておく。
んで起動時にOnCreateでParamStr(1)で読み込んで、Navigateする、と。
>>255 よしんばそれがライセンス違反だったとしても
それを確認できる人はいない。
Del6Perで作ったソフトそのものを売ったりしなきゃ
全然オッケーでしょ。
>>257 >>258 新しいウインドを開くリンクをクリックして、とりあえず自身のブラウザを
立ち上げるまでにはなりました。まだリンク先の表示は出来ませんが・・・。
参考に頑張ってみます。ありがとうございました。
フォームのデザインをするときに、色のセンスがないので、 市販のソフトなどの色使いをまねして作りたいのですが マウス上の色をTColor(-$7FFFFFFF-1..$7FFFFFFF)で返すソフトはないでしょうか? もしくはその処理を教えてください。 原色だらけのFormで見づらくて。
function GetColorByCursorPos: TColor; var DesktopCanvas: TCanvas; CursorPos: TPoint; begin GetCursorPos(CursorPos); DesktopCanvas := TCanvas.Create; try DesktopCanvas.Handle := GetWindowDC(GetDesktopWindow); Result := DesktopCanvas.Pixels[CursorPos.x, CursorPos.y]; finally DesktopCanvas.Free; end; end;
>>262 ありがとうござます。
けど、自分で作成したForm内はTColorの値をとれるのですが、
本来の目的、他のアプリの取り方がわかりません。
明日?、起きたらもう一度挑戦します。
>>263 262 さんではありませんが 262 の関数で画面のどの場所でも色が取れるのを確認したよ。
>>261 ALT+COPYして そのアプリの画面イメージをクリップボードに入れてから
処理すると楽なんじゃないの?
>>266 どう楽か知らんが、1点の情報が必要なのに100万点の情報をメモリに入れるのは
バカみたい。
色の値をとれました。 ありがとうございます。 >265 で実施したのですが、 Form外のマウス位置の情報を >262,264 さんがどのように実施したのか 教えていただけないでしょうか?
GetCursorPos
>>268 GetCursorPosというWin32API
検索しようね。
分からない部分をググるだけでもだいぶ違うぞ
GetCursorPos が分からないのではなく、どのタイミングでカーソル位置を取得
するのか分からないんだと思う。
>>265 の方法はマウスキャプチャを利用して
OnMouseUp で検出してるけどね。
272 :
デフォルトの名無しさん :04/03/15 11:09
>>220 なんか お金を払ったときなどの釣りはいらねぇ〜っていう セリフを思い出した。
>269,268,271 >271さんがいっているように、どこで処理を書くのかわかりませんでした。 TForm1.FormMouseMove で処理を実施してもForm外では認識しなかたので。 procedure TForm1.Timer1Timer(Sender: TObject); begin Form1.Color := GetColorByCursorPos; end; と、Timerで処理すればよいのがわかり、解決出来ました。 ありがとうございます。
StringGridについて教えてください。 通常の列については、goColSizingでサイズ変更が可能になるようなのですが、 FixedColはできないのでしょうか? StringGrid自体の幅があまりとれないもので、FixedColを調節して 通常列の値が見えるようにしたいのですが・・・。 どなたかご存知の方がいましたらご教授ください。
QuickRepotの印刷イメージをImage1.Canvas に
コピーしたいのですがどのようにすればよいのでしょうか?
色々試してみて
QuickReport1.PaintTo(Image1.Canvas,0,0);
で出来そうと思ったのですが、デザイン中の画面が表示されてしまいました。
Image1.Canvas := QuickReport1.QRPrinter.Canvas
では、エラーが出てしまいます。
よろしくお願いします。
そもそもの目的は、両面印刷の実施です。
表面 ImageKit という市販のソフト(
http://www.newtone.co.jp/index.html )
裏面 QuickRepot で作成されたイメージ
という形で印刷したかったのですが、うまくいきません。
QuickRepot1.Print を実施すると、次のページに印刷されます。
回避方法として、QuickRepotの印刷イメージをImageKit側に呼び出そうとしています。
表裏面ともに、ImageKitのデータの場合はできました。
もっと簡単な方法がありましたら教えてください。
つづき -------------- 以下は、表裏面ともにImageKitの例 procedure TForm1.Button1Click(Sender: TObject); begin //IkFile1,IkDisp1,IkPrint1 はImageKitのコンポーネント IkFile1.FileName := 'C:\Test.tif'; IkFile1.LoadFile(4); IkDisp1.ImgHandle := IkFile1.ImgHandle; IkDisp1.Display(1); IkPrint1.PrintFileName := 'Default'; IkPrint1.PrintCreateDC(ikPrintFileName); IkPrint1.PrintDlg; //これで両面印刷に設定する IkPrint1.PrintStartDoc(); IkPrint1.PrintStartPage(); //表面の印刷 IkPrint1.ImageOut(IkPrint1.hDC, IkFile1.ImgHandle, 100, 100, 1000, 1000, True, True, ikPrinter); IkPrint1.PrintEndPage(); IkPrint1.PrintStartPage(); //裏面の印刷 IkPrint1.ImageOut(IkPrint1.hDC, IkFile1.ImgHandle, 100, 100, 1000, 1000, True, True, ikPrinter); //QuickRepot1.Print ここで実施しても両面にはならない IkPrint1.PrintEndPage(); IkPrint1.PrintEndDoc(); IkPrint1.PrintDeleteDC(); IkPrint1.ReleaseDevModeHandle; end;
277 :
超初心者です :04/03/15 21:29
実行した内容の保存、呼出の方法についてお伺いしたいです。 例えば、変数のカウントがどこまで進んだかをファイルに保存し、 Memoに呼び出す、といったことをしたいのですが、 簡単で構わないので、何かサンプルをいただければありがたいです。
278 :
デフォルトの名無しさん :04/03/15 22:44
上記御質問の返答が書込まれていない所すみませんが, 便乗して質問させて下さい. モーダルフォーム生成の際ですが,form1(メインフォーム)から form2:=Tform2.Create(self); try form2.ShowModal; finally form2.Release; end; 以上のコードを用いると form2 はモード付きで表示されますが, この状態で form1 をマウスクリックした場合において,form2 に, 一般によく見るような「タイトルバーの点滅」が得られないのです. 何分気に掛かりますので,これを実現する策がありましたら御教授下さい.
モーダルだからフォーカスは同じアプリの他フォームに移動しないのは当然。
>>277 変数をファイルに保存するので一番簡単なのはINIファイルだけど、
カウントを履歴のように保存したいのかな?それだとTStringListだけど。
もうちょっと具体的なことが分からないと(どういう形式でファイルに保存したいのか)。
あ〜、ちかちかするやつか? なんでだろうね。標準モーダルループじゃないからだと。
>>278 実現しなければならない機能に比べて、やらなきゃならないことはいっぱいある。
まぁ、そんなトリヴィアは気にしないこと。
実現しなければならない と やらなきゃならない の違いがわからん。かわいいミスか?
つまり、つまらんこと実現するためにモーダルループに介入しなければならんほど 大変なのでやる価値があるとは思えない、ということ。
TOpenDialog のようなコモンダイアログを表示している場合もちかちかしないね。 この場合は標準モーダルループのはずなのに。うーむ、MainForm がそもそもダイアロ グだからだろうか。わからない。
Delphiアプリは、Applicationという見えないウィンドウがあって それがフォームを出したりしている。 と、ここまで書いて思ったが そこらへんの話って、Halbowさんとこになかったっけ。
>>286 > Delphiアプリは、Applicationという見えないウィンドウがあって
> それがフォームを出したりしている。
うん、それがこの場合にどう関係あるのかがわからないんだよね。
Application ウィンドウからみて MainForm はモードなしダイアログなんだろうか?
それが関係ありそうだけどよくわからない。
Delphi 6 RTL アップデートパック #3をダウンロードしたんですけど このアップデートパックは ZIP 形式で圧縮されています。このファイル を一時的なフォルダに展開し、Delphi 6 のフォルダ(デフォルトのパス は以下のとおり)にコピーしてください。 c:\program files\borland\delphi6\Source\RTL\Common\Classes.pas c:\program files\borland\delphi6\Lib\Classes.dcu c:\program files\borland\delphi6\Lib\Debug\Classes.dcu c:\program files\borland\delphi6\Lib\rtl.dcp c:\program files\borland\delphi6\MergeModules\BaseRTL.msm c:\winnt\System32\rtl60.bpl c:\winnt\System32\rtl60.map c:\winnt\System32\rtl60.jpn と書いてあってこの中の下の3つって Cドライブの中にwinntフォルダがないんで C\WINDOWS\SYSTEM32の中にコピーするんですか? OSはMEです。
俺は2000持ってないけど、ダイアログの点滅は2000でも起こりうるのか? XPだけならマニフェストあたりの問題かも試練。
>>288 すでにあるかどうか確かめる。
試してみる。
>>289 自分は Win2k だけどメモ帳の開くの OpenDialog では、ちかちかするよ。
ウィンドウのオーナー変えるだけの話。でも色々注意しないといけないことが多い。 気にしないほうが幸せになれる。 Delphi8でWinFormという解決方法もあり。
> ウィンドウのオーナー変えるだけの話。 Form2 のオーナーは Application だよね。どう変えるの? > でも色々注意しないといけないことが多い。 全然「だけ」じゃないね。(笑
モーダルダイアログをちかちかさせるために .NET アプリにするのは変!
TForm2 は CreateParams() を override してオーナを変更できるが、コモンダイアログ の場合はどうするのかなー
297 :
デフォルトの名無しさん :04/03/16 14:17
delphiでデザインパターンについていろいろ書かれてる本は有りますか? 現在、kakinotane.s7.xrea.comを眺めながら 『Java 言語で学ぶデザインパターン入門』 結城 浩(著) を購入して理解を深めていく方法を とろうか、とるかまいか悩んでいるところなのですが・・・
> delphiでデザインパターンについていろいろ書かれてる本は有りますか? 見たことない。デザパタは知らないより知っていた方がよいが、 悩んでがりがり勉強するほどのものとは思えない。結城さんの本は 買っておいても損はしないと思う。
良書かもしれないが入門/通俗本でしかないので、とっととちゃんとした本を読むように。
Delphiの本はまだ無いのか・・・ オブジェクト指向の本と同様に、Delphiで本書いたらもうけるかも(偉い方おねがい) 『Java 言語で学ぶデザインパターン入門』 結城 浩(著) を入門書に それ以降はまたいろいろ探して勉強に取り組みたいと思います 御回答、ありがうございました
XP真乳フェストって言うコンポーネント貼り付けてみたら パネルとかが透明になってしまった。 コンポ削除したけど元に戻らないのはなぜ?
既出だったね。すまん。
多様なご回答,ありがとうございます. 当方,Application ウィンドウの概念を理解していなかった様です. 動作の実現が難しいとしても,疑問は解決する事が出来ました. どうも,有難うございました.
306 :
デフォルトの名無しさん :04/03/16 20:38
Windows 2003 serverにMultilingual Interface Pack日本語を被せて、 Delphiで作成したアプリを実行しましたが、 Quick Reportのプレビュー画面が、文字化け化けになってしまいました。 どうすれば対処出来るんでしょう。
>>306 ボーランドにバグレポートを出しつづけましょう。
デザインパターンとライブラリって何が違うんだ?
>>307 そんなことしても、何の解決にもなりません。
Quick Reportのプレビュー画面のフォントを調べたいんですが、
VCLフォルダにソースが無い。
> デザインパターンとライブラリって何が違うんだ? まったくちがう。なにが同じなんだ?
自分を信じること!
しょ(´・ω・`)ぼ(´・ω・`)ー(´・ω・`)ん
これは、前にも話題になったけど Dispose(Item.Data); ではダメで、New() するときに使った型にキャストして Dispose() する必要が あるんじゃなかったか。
そのサイトの例だと Dispose(PFavData(Item.Data)); だと。
管理人に通報しておいてよね!
>>317 パリ旅行の話ばかりで書き込みづらい(´・ω・`)
「ヲッチ先、荒らさず、マター…」 ヲッチ先じゃねーや(藁
印刷のイメージは QuickReport1.QRPrinter.Canvas ここにあるのでしょうか? どなたかお願いいたします。
印刷のイメージは印刷するまでどこにもありません。 Printer.Canvas は印刷するデバイスコンテキストをカプセル化したもので 印刷イメージではありません。
とても遅くなってしまいましたが、レスしてくださった方ありがとうございました。 >241 の方法を試してみましたが上手くいかず、>242 の方法を取り入れた 折衷案で、どうにかエラーが出ないようにしました。 1.新ボタンクリック→2.不可視に→3.次の新ボタンクリック →4.直前に不可視にしたボタン破棄→5.今クリックしたボタンを不可視に→3へ と言った方法です。 アプリケーションを作る時にこの方法が耐えられるかどうか分かりませんが、 とにかくすっきりしました。ありがとうございました。 また、質問した時の廃棄のコードは>251と全く同じでした。
>241 の方法を試してみましたが上手くいかず これは不思議です。コードをしめしてくださいませんか。
326 :
デフォルトの名無しさん :04/03/17 08:24
質問があります。 西暦の4桁とその月だけほしいときは、どのようにすればいいですか?
ヘルプの”日付時刻ルーチン”を辿って組み合わせを考えてみたら?
>>327 組み合わせてできました。ありがとうございました。
電卓のソフトを作ってみてるんですが、Edit右寄せと数字しか入らないようにするやり方を教えてください。
数字しか入らないようにするには MaskEditを使えばいいでしょう。 右寄せは TEdit/TMemoがラップしてるのは Windows EDITコントロールです。 そこで、Delphi-CDROMに付属している日本語WinAPIヘルプから "コントロールの概要" "エディット コントロールの概要"を見てみましょう。 ES_RIGHTというスタイルを選べば、右寄せに出来る事が判るでしょう? 後は、 TCustomMemo.CreateParams を眺めて TMaskEditにこの機能を付ければよいのです
>ES_RIGHTというスタイルを選べば、右寄せに出来る事が判るでしょう? Win95,98,Me では一行エディットで右寄せにできません
ん?98 以降はサポートしていると思ったが。
>>323 { Private 宣言 }
public
procedure WMUser(var Msg:TMessage);message WM_USER;
procedure ButtonClick(Sender:TObject);
end;
....
procedure TForm1.ButtonClick(Sender: TObject);
begin
PostMessage(Handle,WM_USER,WPARAM(Sender),0);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with TButton.Create(self) do begin
Parent := self;
Left := X;
Top := Y;
OnClick := ButtonClick;
end;
end;
procedure TForm1.WMUser(var Msg: TMessage);
begin
TObject(Msg.WParam).Free;
end;
でいいのでは?
>>332 Windows 95, Windows NT 4.0 だけダメなようです。すみません。
ちなみに Windows の電卓の入力・表示部分はスタティックコントロール
ですね。
改行の入力を無効にしてMemoを一行の高さで表示、というのはどうだ。
>>331 ES_MULTILINE もついでに指定してしまえばいいじゃないか。
よく使うんだからフリーのコンポ使えよ・・・
なんでもフリーのコンポでできることはフリーのコンポつかえよー、ってか。 プログラミングよりコンポ探しの方法を鍛えろよ、ってか。 お気楽プログラミングで行きましょう、ってか。 Delphi っていいなぁーーー
なんでもとは言ってない、よく使うんだから、と言っている おまいはまず脳を洗え
よく使わないのはフリーのコンポを使わないのはどうして? それに右寄せエディットって、どうしてよく使うとおもうの?
電卓ばかり作ってるんじゃないのー(藁
よく使うんだから電卓コンポつかえよ・・・
簡単なお絵かきソフトの実験をしています。 よくPhotoShop等であるような、画像上をマウスでドラッグすることで、 点線の四角形で画像の範囲を選択するような動作を実現したいのですが、 点線の描画(というか消去の仕方)で悩んでいます。 いま検討しているのは、レイヤーのように TImageを2枚重ねて1枚目に実際の絵、2枚目に選択範囲の 点線を表示させ、範囲のTRectを1枚目に送って処理する方法が一つ。 この場合はドラッグされるごとに消去→点線の描画をくり返します。 もう一つはドラッグ時に元の画像をコピーしておき、 ドラッグされるごとに、元の画像をTImageにコピー→点線の描画を 繰り返す方法です。 しかし、前者の方法だとcanvasを利用して描画すると透過しなくなってしまい、 後者だと画面のちらつきが激しくなります。 このような動作を実現するためには、どのような処理を行えばいいの でしょうか。よろしくおねがいします。
よく使われるテクニックは XOR 描画ですね。 XOR を2度すると元に戻るという原理を使うわけです。 Penに pmXor を使ってドットを2度描いてごらんなさい
345 :
デフォルトの名無しさん :04/03/17 19:04
16進数RGB値から色を表示する単純なプログラムを作ってます。 そこで、0〜9、A〜F以外の文字があった場合エラーメッセージを出したいんですが、 この場合どうしたら効率いいでしょう?
>>345 効率を考えるようなところじゃないでしょう
1、
for i=1 to length(str) do if not (str[i] in ['0'..'9' , 'a'..'z' , 'A'..'Z'] ) then begin エラーです ; break;end;
2、
try
StrToInt('$'+str);
except エラー;end;
とか、何でも
>324 >333 Σ(゚Д゚ )...すいません、今やったら出来ました。 >241 でも >333 でもエラー出ませんでした。 前にやった時は当たり前のようにエラーが出たんだけど、なんでだろ_| ̄|○ ありがとうございました。 役に立つか分かりませんが、後の人のために一応ソース出しておきます。 まあ、>241,>333 とほとんど同じですが。
{ Private 宣言 } index : integer; procedure NewButtonClick(Sender:TObject); procedure WMUser(var Msg:TMessage);message WM_User; ..... procedure TForm1.Button1Click(Sender: TObject); var NewButton : TButton; begin index := index + 1; NewButton := TButton.Create(self); with NewButton do begin Top := Button1.Top + (Button1.Height + 5) * index; Left := Button1.Left; Height := Button1.Height; Width := Button1.Width; Caption := '新ボタン' + IntToStr(index); OnClick := NewButtonClick; Parent := Self; end; end;
procedure TForm1.NewButtonClick(Sender:TObject); begin ShowMessage('このボタンを破棄します'); PostMessage(Handle,WM_User,WPARAM(Sender),0); //TButton(Sender).Free とすると、消えるけれどエラー end; procedure TForm1.WMUser(var Msg: TMessage); begin TLabel(Msg.WParam).Free; end;
350 :
デフォルトの名無しさん :04/03/17 19:34
Delphiでウィンドウにテーブルのコントロールを表示したいのですが、コンポーネントは何を使えばいいのでつか。 テーブルは10列×200行くらいの大きさで、内容は自分で設定します。 JavaのJTableみたいに値を設定する感じでやりたいのです。 コンポーネントと値の設定方法など誰か教えてください。
自己レス StringGridのようですね。 とりあえずやってみまつ。
>>349 > TLabel(Msg.WParam).Free;
じゃなくて
TObject(Msg.WParam).Free;
にしてください
353 :
デフォルトの名無しさん :04/03/17 20:29
begin sy := StrToInt('ComboBox5.Items'); sm := StrToInt('ComboBox4.Items'); sd := StrToInt('ComboBox3.Items'); Memo1.Lines := IntToStr('10000 * sy + 100 * sm + sd '); end; とすると、 指定された引数で呼び出すことの出来るオーバーロード関数'IntToStr'が定義されていません というエラーが出たのですが、これはどういう意味なのでしょうか? いろいろ調べてみたのですが分かりません。
''で囲まれたものは文字列。中身の解釈はされない。 だから'ComboBox5.Items'は項目(の個数)とは解釈されないし '10000 * sy + 100 * sm + sd 'が計算されることもない。 Memo1.Lines.Add( IntToStr(ComboBox5.Items.Count * 10000) ); と書くべし。
355 :
デフォルトの名無しさん :04/03/17 21:25
StringGridで選択された一行を削除する方法を教えてください DeleteRow?は使えないようです(使い方を知らないだけかも 選択行以降を一つづつ上に繰り上げて、RowCountを一つ減らすしかないのかな
派生クラスを作るとき、メソッドにoverrideって書いても書かなくても 同じ結果になっているように見えるのですが、何が違うんですか?
初心者らしいいい質問だ。次。
overrideし忘れると基底クラスの変数から呼び出したときにうまく呼び出されなくなるよ。
もうちょっと書いてやれよ。
overrideしないと、継承されない。そのクラス独自のメソッド扱いになる。
派生元になった関数が呼ばれないってこと。
その結果、
>>358
>322
以下のコードでPreview画面がとれるので何か方法があると思っているのですが?
Canvasなどのグラフィック関係がよくわからなくて。
QuickReportの良い資料はないでしょうか?
http://www.qusoft.com/ を見てみましたがよくわかりません。
この処理が出来ると、Del8Ent買って貰えるんです。
お願いします、どなたか教えてください。
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickReport1.Prepare;
QRPreview1.QRPrinter := QuickReport1.QRPrinter;
end;
clientdatasetで質問 既に使っている(というか使い終わった)clientdatasetを違うレコードを持った データセットで再利用したい時はどうすればいいの? っていうかclientdatasetを解説した本なりサイトがあったら教えて下さい ヘルプも見てますが分かりずらいよ…
何を買ってもらおうとかまわんが、 まじめに実装するとなるとWinの印刷プレビューは簡単じゃないぞ。 メタファイルのCanvas経由でやるのが常道かな。 中村の里にDHGLてのがソース付きであるから、それを参考に。 とりあえず、本は買っとけ。とても参考になる。
QuickReportは印刷前にその情報をメタファイルで生成する。 これは印刷用と表示用を同じように扱う為だ。 そしてそれはQRPinterも一緒。TPrinterとの大きな違いは 描画前にNewPageしろって事ぐらいかな。
メソッドをoverrideしないと静的メソッドとなり単に上位クラスの メソッドを隠すだけ。VMTには置かれない。VMTのメソッドに 無いと言う事は多鯛が扱えない。多鯛はデザパタの基本みたいなもんだから それらの技巧が使えない。差し替えが出来ないのであらゆる面で固定的 になる。不便。
>>355 MoveRowで最終行と取り替えて行数を1減らす。
というのを実装したDeleteRowというメンバがTCustomGridにある。
protectedで。
日系ソフトウエアのC#の記事見てたら、見た目がカレンダーコンポと 同じ物を使ったサンプルを見つけたんだが、何で? DelのカレンダーってWindowsに備わっている物を使っているの?
何度も質問すいません 今度はTImage上にテキストを描画させたいのですが、 この場合はどうすればいいでしょうか。 よくあるのが、IME(ATOKだけかもしれないけど)のように 文字を入力できるちっこいウィンドウというか四角いスペースを 作成して、その中で編集、確定時にTImageに描画するものや、 PhotoShopのように、直接、TImageに描画、編集できるものが あるようですが、これも基本的にxorの手法なんでしょうか。 クリックで表示開始位置決定、キー入力で文章編集、エンター後に 確定で描画という処理ができればいいのですが、 何かうまい方法ってあるのですか?
>>371 おいらだったら
クリックしたら普段は非表示にしてあるTEditをそこへ移動して表示し
エンターしたらまたEdit1を非表示にして
中身をTImageへ描画すると思うよ。
方法は他にも色々ありそうだけど
(複数行ならTMemoにする手もあるし)
× Edit1 ○ TEdit TEditもTImageも正確にはそのインスタンスということになるけどね。
>>371 文字データを持たせる為の Objectを作っておくといいでしょう。
TPersistent継承にしてストリーム入出力出来るようにしてさ、
そして、その文字データが収まるサイズのBITMAPをメンバーに持たせておて
描画する時はTImage直接ではなく、TImageと合成して描画させるわけです。
そして保存時に、その合成結果を保存出来るような仕掛けにしておけば、
自由に文字位置も変更出来るし、文字内容も変更出来るでしょ?
375 :
デフォルトの名無しさん :04/03/18 12:13
TStringGridのRowsとかColsとかって型はTStringsじゃん。 TStringsのメソッドで消せばグリッドの表示にも反映出来るんじゃないの?
376 :
デフォルトの名無しさん :04/03/18 12:35
Delphiで動的に配列を作ることはできるのでしょうか? doubleの配列を作りたいのですがなかなか。。。。 もしできるのでしたら配列の上限は何個なのでしょうか? あと、最後に配列がいくつなのかをCountするStringlistのCountと同じ機能を もった物があったら教えてください。
> TStringsのメソッドで消せばグリッドの表示にも反映出来るんじゃないの? 一列まるごと、一行まるごと削除するのに、TStrings の Free をつかうんですか?
文字列を削除すると StringGrid にも反映されるんですか。文字列ではなく、行または列を削除したいんです
やってみたが駄目っぽいな。
>>380 なるほど…
Freeだとアクセス違反がでるし
Delete、Clearはそもそも行や列には作用しないと…
やっぱり、しこしこコードを書くしかないのかな
↓こんな感じで
procedure TForm1.mnuDeleteColClick(Sender: TObject);
var
i: Integer;
nDeleteBegin: Integer;
nDeleteEnd : Integer;
nDeleteCount: Integer;
nMoveCount : Integer;
grTemp: TGridRect;
begin
grTemp:=StringGrid1.Selection;
nDeleteBegin:=grTemp.Left;
nDeleteEnd :=grTemp.Right;
nDeleteCount:=nDeleteEnd-nDeleteBegin+1;
nMoveCount :=StringGrid1.ColCount-nDeleteEnd+1;
for i:=0 to nMoveCount-1 do
StringGrid1.Cols[nDeleteBegin+i].Assign(StringGrid1.Cols[nDeleteBegin+i+nDeleteCount]);
StringGrid1.ColCount:=StringGrid1.ColCount-nDeleteCount;
end;
…鈍臭。
>>382 それをまず手続きとして書き直しなさい。
>>383 というより
TStringGridを拡張した方がいいべさ
borlandのdelphi6personalのライセンスキーの取得っていうのはBJMNとやらに メアド登録した後待ってればいいんですか?
とりあえず待っておけばいい
>>362 こういう方法があるんですね…。
かなり参考になります。
サンクス
>>368 か…かしこい…。
こういうシンプルな考え方が出来るようにならないといけないすね
でもソートされていない今の順序をなるべく保持しておきたいと
思っているので、ちょっと今回のには向かないかも
>>387 「入れ替える」んじゃなくて指定行を最終行の後ろに移動、だね。
日本語不自由でスマソ。
試しにフォームにStringGridを貼ってOptionsの中のgoRowMovingをTrueにして
FormCreateで各行に適当な値を放り込んで実行、行の左端をつまんで別の行で
離すと、、、これがMoveRowの動作。
390 :
デフォルトの名無しさん :04/03/18 15:59
ライブラリパスを一度に切り替える方法はありませんか? いくつかのライブラリをインストールして使わせてもらっています 似たようなジャンルのライブラリだとどうしても名前が衝突してしまうようで その都度ライブラリパスを削除したり追加したりして対処してきました 別のプロジェクトなので同居する必要はありませんが 編集するプロジェクトを変更するたびにライブラリパスを編集するのは大変です 上手い方法はないでしょうか?
プロジェクト->オプション->ディレクトリ 検索パスを設定
うまくいきました ありがとうございました
待てど暮らせどメールが来ませぬ(´・ω・`)
のんびり待てばいいよ。なくても普通に起動できるんだから。
>>395 むしろ待たなくていいよ。他にやることあるでしょ?
なかったら・・・・ごめん
辞書順でどちらの文字列が先に来るかを調べるにはどうすればよいですか? 半角英字だけでかまわないんですが
Create時にSelfを指定出来る物は明示的に 自分でFreeしなくて良いのでしょうか? それとも念のため自分でFreeしたほうが良いのでしょうか?
質問なんですが PostMessageで procedure(var Msg : TOriginalMsg); にメッセージを送る場合 どのようにパラメーターを送れば良いのでしょうか?
>>399 AnsiCompareStr AnsiCompareText AnsiStrComp AnsiStrIComp AnsiStrLComp
とかその辺。 どう使うかはまだヨクワカラン。
>>401 procedure musumesanwobokunikudasai(var Msg: TOriginalMsg); message WM_PIYOPIYO;
となっていたら
PostMessage(xxx.Handle, WM_PIYOPIYO, wParam, lParam);
>>401 投稿前に、捜してみましょう
http://www.goggole.com (w
家族に不幸があったため 2ch 活動を自粛しています。m(_≡_)m
---- (-_-)(-_-)(-_-) THE REAL BAKA (-_-)(-_-)(-_-) ----
At the beach, The Real Baka is the one drawing fool in the
sand.
吐駄 庇出於
>>404 WM_PIYOPIYOってどんなときに送られてくるメッセージでしか?
やぱーり、CPUが逝っちゃってるときでしか?
戸田キター
>>394 おかしいと思いますよ。
ちなみに私が普段リンクさせてる manifest.res は 652 バイトです。
スペースや改行を削ればもう少し小さくなりますが、32 は小さすぎです。
>>400 コンストラクタでオーナーを設定できるものは、オーナーが自分が Free される
まえに Free してくれる。もちろん、コードで Free してもいいですが。
>>387 今更だけどGridの列単位でSringListに移してSringListのメソッドで消した後
Gridに戻すのを全列に対してループさせるってのもある。
というか、TStringGridはデータ構造とViewが一体になってるから、 これをフォームのイベントで処理しようとするとすぐに膨大にスパゲッティ化してしまうよ そんなに使い込むならデータ構造は別にする方がいいと思うけどなあ
> そんなに使い込むならデータ構造は別にする方がいいと思うけどなあ 同感。で、表示は OnDrawCell でおこなう、と。
ってか、TDrawGrid でやればいいんだね
timageにファイルをドラッグして取得するには どのhandleを取得すればいいの?
TImage は TWinControl の派生クラスではないので、ウィンドウハンドルはありません。
>>415 ガーーン
じゃあ、ファイルのドラッグはできないってことですか・・・・・
他に手段はあるのでつか?
パネルにのせて、パネルのハンドルを使えばいいじゃない
>>417 おお、賢いっす!ありがとう 調べてみまつ
fHandle := AllocateHWnd(WndProc);
とかやってますた ガックシ・・・
TImageが乗るのはフォームかパネルで窓ハンドルを持ってる。 だからTImageの親のハンドルを使うようにすればいい こうすれば一般化、汎化出来る。
>>419 たとえばTImageを継承したコンポを作るときには、その親のHandleを取得して
ドラッグに対応すればいいってことでつか?
もしTFormだったらフォーム全体がドラッグ対象になるけど、それがイヤなら
ユーザ側でTPanel等の上に乗っけてくれってことですかね。
それともTPanelを継承したコンポにTImageを継承したコンポを乗っけて、
それはそれで一つのコンポとしてドラッグに対応したほうがよいでつ?
って自分でも何かいてるかわからんくなった・・・・スマソ
>>409 回答ありがとうございます。
タスクマネージャ見ながら実行>終了を繰り返して
メモリの合計(コミットチャージ)やハンドルの合計
とか見ていたのですが、自分でフリーしてもしなくても
殆んど変わらないので気になっていました。
と言うわけで、オーナーに任せることにします。
>>421 開放し忘れはMemCheckでチェック
>>420 色んな方法があるよね。
TPanel・TImageを継承したりすると、汎用性を逆に失ってしまう場合もあるから、
メッセージフックを使う非ビジュアルコンポーネントを作って、そっちで対応する方法が一番スマートかもね。
> メッセージフックを使う非ビジュアルコンポーネントを作って、そっちで対応する方法が一番スマートかもね。
いや、それでは解決しません。
>>420 では、ドロップの範囲を限定したいのですから
ウィンドウの実体としても限定した範囲をもっていなければいけません。ですから
パネルに Image をのせて、パネルの WindowProc を入れ替えてサブクラス化する
のが現実的です。コンポにするとサブクラス化しなくてよいのでさらに良いです。
>>424 DragQueryPoint で位置をひらって、グラフィックコンポーネントがあれば
それを対象にするようにすればいいじゃない。
OnDrop( ctl : TControl ; fnames : const array of strings);
みたいなイベントで処理すれば
それか、その非ビジュアルコンポーネントでメッセージフックを使って マウス位置のコンポーネントのZオーダから順に そのコンポーネントのOnDragDropを呼び出して Sourceに応答があればそれが実行して終了 ってのはどうだろ?
> DragQueryPoint で位置をひらって、 でもそれだと、ドロップ可能を表すカーソルの変化を阻止できないでしょう。 ユーザは、ドロップ可能なところにドロップしたつもりなのに、なにもおきな かったら変に思うよ。
>>427 Delphi のドラグドロップじゃなくて、ファイラからのドロップファイルのこと
だと思うよ。だからハンドルが必要なんで。
>>428 ゴメン、キミ ズレてない? ねえ、ほんとはボクの事呼んだんだよね?
Yes No
>>429 だから、非ビジュアルコンポーネントで、フックするTWinControl先を指定すれば
そのTWinControlのハンドルで DragAcceptFilesして
なおかつ TWinControlのWndProcをフックしてWM_DROPFILES を自分で処理する
で、WM_DROPFILES を見つけたら DragQueryPoint で求めたマウス座標の位置の
コンポーネントのZオーダ順に
コンポーネント.OnDrop(コンポーネント , SendStr , x,y);
を送って、
SendStrのExecuteedプロパティがどこかでセットされたらそれで終了
最後までセットされなかったら、最初に CanExecute プロパティがセットされたものを再度呼び出す
TSendStrはファイル名と、Executed CanExecuteとかのプロパティを持たせると
> 非ビジュアルコンポーネントで、フックするTWinControl先を指定すれば フックする TWinControl がないから苦労してるんでは。 たとえば、Form1 に Image1 をのせた場合、Form1 をフックするんでしょ? DragAcceptFiles() は Form1.Handle にするんでしょ? なら、Image1 が載ってないところでもカーソルはドロップ可能になるでしょ? 428 はそのことを言っている。
おお、いろいろありがとうでつ。 いま、TPanelの継承コンポを作って、その上にTImageを動的に作成し、 TPanelで拾ったFile名とDrop位置をTImageのプロパティで渡すように 作っていまつ。 ところでTPanelのコンストラクタで constructor TTestPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); TestImage := TImage.Create(Self); TestImage.Parent := Self; と動的に作成しようとしているのに、コンストラクタでは自分自身の TWinControlって取得できないんでつね。 Self.Nameをみても空白が帰ってくるぽ。このやり方も挫折かも・・・
> コンストラクタでは自分自身の > TWinControlって取得できないんでつね。 自分自身のインスタンス参照は self でしょう。コンストラクタではまだ Window の実体が作られていないってこと? > Self.Nameをみても空白が帰ってくるぽ。 動的に作って試してますね? IDE からポトペタでは自動的に名前が付けられる けど、動的に作成したら Name プロパティーは空白です。でもそれがどうして 必要なんですか?
>>434 非ビジュアルコンポーネントを載せる時の親にしてもいいし
載せた後で、プロパティで指定出来るようにしてもいいじゃないか
>>435 なんのメッセージを送るつもりですか?
定義済みの WM_XXXX なら Win32.hlp を見れば何を設定すべきか書いてあります。
そうではなく、自分が勝手に送る WM_APP だとか WM_USER なんかだったら、
自分で勝手に設定します。設定したくなければ WParam も LParam もゼロに
しておくこともできます。
> 非ビジュアルコンポーネント 派生クラスを作ってるんだからメッセージフックは自前でできるでしょう。 非ビジュアルコンポーネントを作る必要はないよ。
>>436 説明不足スマソ
上記で書いたようにTImageからはHandleが取得できないので、
TPanelのコンポにTImageを動的に作成して、ドラッグ&ドロップ
に反応したTPanelがTImage継承Classにプロパティとしてファイル名
を渡そうとかんがえたんです。TPanelはポトペです。
そこでTImageを動的に生成するためTPanelのCreateで
>>436 のように生成しようと思ったら、TPanelが自身のTWinControlを
取得していないので、TImage.Parentを設定できずにCreateで動的に
生成できないってことなんです。
>>440 その方法でやるなら、
CreateWindowHandle を継承したら?
>>440 無理にTImageを載せた状態で作成させないでも
自分の子コントロールを
>>432 で OnDropを呼ぶようにすればいいじゃないか
> TPanelはポトペです。
ポトペタで
>>434 のようなコンストラクタを書くってのがわかりませんが?
TTestPanel クラスは TPanel の派生クラスですよね?
説明 Trim 関数は,指定された文字列 S から先頭部分および末尾部分の空白と制御文字を取り除きます。 ヘルプにこう書いてあるけど、ソース見た感じ空白しか取り除く気ないように見えるんだけど
>>444 S[I] <= ' '
こうなってるでしょ。制御文字は空白以下の文字コードなのよ
>>443 げっ・・そうなんでつか。
TPanelは派生Classでポトペです。TImageはTPanelのCreate時に
動的生成しようと思ったもので・・・・
>>446 それはOKだけど
動的生成させなくても、後から載せるのも大きな手間じゃないでしょ?
TImage以外のコントロールも載せられるしね
>>446 うーむ、もっとも簡単なのは、ただ、ドロップファイルを受け取って、イベントハンドラ
を呼び出すだけの TPanel 派生コンポです。そのイベントハンドラで、設計時にコードで
受け取ったファイルの処理をするようすればいいのでは。上に載せるのは TImage でも
TPaintBox でも TLabel でもなでもいいので、設計時にのせたらいいのでは?
コンストラクタでウィンドウハンドルが取れないことがあるのは事実で、たしか、
>>441 のようなメソッドをoverrideしてウィンドウが作られたあとにする必要が
あったと思います。わたしだったら、DropEnable:Boolean というプロパティーを
作り、デフォルトで false にしておき、オブジェクトインスペクタやコードで
true にしたとき、DragAcceptFiles() を実行するようにします。false のときも
そうですが。
あと、procedure WMDropFiles(var Msg:TWMDropFile):message WM_DROPFILES;
というメッセージ処理手続きをくっつけるだけです。
>>448 ありがとうございまつ。
すべてまとめて一つのコンポーネントができないかなぁと
欲がでまして・・・・
考え方は同じでつ。いま、IsDrop: Booleanプロパティを作って
それで実験したらできました。
ただ、自動でやりたかったので、AfterConstruction、
PaintWindow等のメソッドをoverrideしてやってみましたが、
両方とも難アリでした。
> PaintWindow等のメソッドをoverrideしてやってみましたが すみません、忘れてしまったのですが CreateWnd CreateHandle CreateWindowHandle のようなメソッドを override して、さきに継承メソッドを実行したあとなら Handle が有効になるのでした。
TThreadって何処でFreeすればいいのでしょうか? Sleepするとメインスレッドは操作できないし
ポトペ/ポトペタって何でつか?
>>452 TThreadはExecuteが実行終了された時点で、デストラクタが呼ばれて、
その後に勝手に自分自身を破棄する。
>>453 パレット等からTButtonなんかを選択し、フォームに貼り付けるようにして
配置する方法。自分で作成する方法は動的生成といいまつ。
FreeOnTerminateがTrueならな
>>454 レスthanks!
ポトペ=ポト+ペ(=paste)
ポトペタ=ポト+ペタ(=「ぺた」っと貼る)
でつか?ではポトの語源は何でつか?
>>415 ,417,419,423,425,427,428,430,432,433
>>436 ,437,439,441,442,443447,448,450さま
ありがとう!できまつた!!
TPanel派生Classを作成し、その上にTImageを
動的に作るようにして、TPanelが受け取った
ファイル名等をTImageのメソッドに受け渡すことで
処理できました!
ExplorerからDragDropに対応したTImageコンポが
一つできました。後生まで大事に使いつづけます。
ぽっとりとぺたっと貼り付けるからw
>>458 ありがd。
誰が使い始めたんだよ〜わかりにくいよー! ヽ(`Д´)ノウワァァン
ツルペタ、ツルペタうるせーよ。このロリコンが!
Button,Edit,Label,Panel,Combo,CheckBox,RadioGroup等のコンポを計15,6個 ほど使って作った物を1セットとし、それを縦40×横40で合計1600セットを スクロールさせて使わなければならないのです。 win98では絶対無理そうなのでwin2k用にしますが果たして動くのでしょうか? 無理な場合、今考えてるのは概観はそのままでスクロールすると中の値だけ変えていき ページ数を表示するような仕組みにしようかと思ってるんですが。
何か良い考えがあればよろしくお願いします。
出来る出来ないってだけなら動的に生成して試してみればいいだけでは。 >無理な場合、今考えてるのは概観はそのままでスクロールすると中の値だけ変えていき >ページ数を表示するような仕組みにしようかと思ってるんですが。 動いたとしても無駄にメモリ食うから 最初からこっちにしておいたほうがいいと思うよ。
データの取り方や保存の仕方がわからんからなんともだけど、 ある程度、使用するコンポの数やデータの残し方が同じなら、 ページを切り替える(前、後ボタンとかつける)ようにして、 その都度、コンポをForm上に配置しますね。私なら。
>>465 公開すれも何も、上のレスアンカー辿っていけば
簡単にできるわけだが・・・・
>>463-464 レスありがとう御座います。
500セット置いてみましたが使用に耐えませんでした。
メモリを大切にしながらページ切り替えで考えていきます。
>>467 つーか、その仕様を書いた奴、または要望を出した奴が
メモリを大切にしなさすぎ
仕様を書いた奴がいるなら、そいつがぬるぽ
要望を出した奴がいるなら、それを止められず要求定義
に書いた奴がぬるぽ
470 :
デフォルトの名無しさん :04/03/19 21:56
Threadを使いたいんですが、Helpを読んで自分でやってみたのですが、 エラーばかりで手も足も出ませんでした。 簡単な処理で結構ですのでやり方を教えてもらえないでしょうか? Thread処理のやり方の例が載っているサイトを知っていたら教えてもらえるだけでも 結構です。
このスレ、最近すんごい速度なんですけど何で?
>>470 TThreadに関しては、Borlandが書いてるTipsだかFaqだか、
それが一番やくだつと思うけど。
エラーばかりでるってのは、SyncrinizedしないでForm上の
コンポをいじろうとしてるからじゃないかな。
>>470 まずどんなエラーが出るからだな。
コンパイルでエラーが出まくりなのか? 動いたけどエラーが出て止まるのか?
hoge.Createに変数などを初期化するコード。 hoge.Executeにそのスレッドで実行したいコード。 Button.Clickでhoge.Create これで、hogeスレッドが作成されて、Executeが実行される。 スレッドは自殺させるのが基本なので、開放忘れには注意な。
>>438 const
WM_OriginalMsg = WM_USER+1;
procedure OriginalMsg(var Msg : TOriginalMsg); message WM_Original;
type
TOriginalMsg = record
s : string;
i : integer;
p: Pchar;
end;
PostMessage(Handle , WM_original ,0,0);
この場合どうやれば
procedure OriginalMsg(var Msg : TOriginalMsg); message WM_Original;
のMsgに代入出来るのでしょうか?
小出しになってしまいすいません
>>474 そのときに作ったTThreadからの派生クラスをCreateでインスタンス化すれば
Execute内のコードがスレッドとして実行されるわけだが、
その前にDelphiのヘルプに「クラスとオブジェクト」という項目があるから
そこを読んでクラスの扱いについて学んだ方が良いな。
>>475 自殺させるのはどこに書けばよいのでしょうか?
あと、引数を渡すにはどうすればよいのでしょうか?
何から何まで聞いてすみません。検索しても出てこないっす。
>>477 読んでみます。
>>478 さんのリンク先に書いてました。ありがとうございます。
出てこないってことは無い。 オレ自身も検索して調べてやった体験がある。
>>479 引数ってか、Create時に渡したいのか、execute時に渡したいのか、
それぞれで違うわな。
TThreadは、Execute内で勝手に動いてて、勝手に消滅するものだと
おもえばいいとかこうとおもったが、知らない人が誤解しそうなので
やめた。
メッセージを送って制御したり、プロパティを変化させて動作させる
まで自己回帰してるprocedureと表現しておこう。
>>479 引数…ていうかスレッドに処理させるデータをセットしたり、
スレッド処理の結果を受け取ったりするには、
それなりにクラスについて理解しなければならんのだよ。
>>476 Windowsメッセージというのはフォーマットが決まってるから、
受け取るレコードもTMessage型と互換の構造をしてないとダメよん。
TOriginalMessage = record
Msg; Cardinal; { メッセージコード(WM_Original)がここに入る }
i: LongInt; { wParamがここに入る }
p: PChar; { lParamがここに入る }
Result: LongInt; { 結果を入れる場所、結果イラネと思ってもコレ必須 }
end;
こんな感じかな。残念だけどsは入る余地ありません。
何かメッセージ以外の受け渡し方法を考えてください。
Postでポインタ渡すのは、変数の寿命をしっかり管理しないと危ないし。
WM_COPYDATA
>>470 自殺させるっていうのは、自分で後始末しろって意味。
スレッド内で確保したメモリとかは、他のスレッドからは開放できない。
開放しないでスレッドが消えるとメモリリークになる。
簡単なやりかたは、
Createでグローバルな変数を読んで
overrideしたExecuteにパラメータとして渡す。
Executeでは最初にTerminatedをチェック。
あとは処理をする関数を呼んでいって、最後にSync.する。
>>483 のいうようにクラスについて理解していないと扱えないから、
まずヘルプを読みこむことを勧める。
>>スレッド内で確保したメモリとかは、他のスレッドからは開放できない。 氏ね
え? 出来るの?
>>445 細かいことですがDelete(#$7F)というコードもありますね.
Trim関数ではこれは取り除かないみたいですが.
>>488 スレッドとはタスクと違って リソースを共有するのが特徴だからね。
スレッドとプロセスを混同する香具師って多いね
2ch全体をOSとすると、 プロセス→板 スレッド→スレッド つーことだな
Windows3.1の頃はDLLのグローバル変数経由でプログラム間で情報の共有が出来て楽しかったな・・・
495 :
デフォルトの名無しさん :04/03/20 15:05
>>494 いま情報共有できたら、
すごいウィルスとか、スパイウェアとかでてきそうな悪寒
>>484-485 いろいろありがとうございます。勉強になりました
WM_COPYDATAでやってみます
Delphiの勉強のためアドレス帳を作っています。 レコード型のTPersonDataというのを作って、 PersonDatas: array[0..1023] of TPersonData として情報を格納しています。 しかしこの方法では少人数の情報しか入力していなくても、 常に1024人分のメモリが確保されているという無駄があり、この方法は間違っているような気がします。 また、登録できる人数の限界もあります。 登録した人数分だけメモリを確保し、登録人数の制限をなくすにはどのようにすればいいのでしょうか。
TObjectListだとサイズを自動的に増やしていってくれる。 動的配列と言うのもあるけど(array of TPersonData)あまり賢くない。 しかしDatasはないだろ。
TListで管理するとか。 作るたびにNewでメモリ確保して 「汎用リスト」でググってみ
>>497 素直にデータベースを使う。
Delphiの真価はデータベースを使ってこそわかるから。
DelphiはもともとOracle(超有名データベース)との接続を
簡単にしようというのが目的で開発されたもので
GUIの作りやすさなどついでのことでしかないらしいよ。
データベースには本当はFirebirdを勧めたいけど
とりあえずならParadoxでも構わないと思うな。
俺もTListにポインタ渡してあげて管理すればいいとおもふ。 TAddList = class(TList); public procedure AddData(PersonData: TPersonData); procedure DelData(PersonData: TPersonData); end; とか派生クラスを作ってかんりしちゃり
Halbowさんの汎用リスト応用しれ
Object格納するのにTObjectListではなくTList使うメリットってあるのか?
レスをくれた皆様、ありがとうございます。 まだいじったことない項目ばかりですがDelphi覚えるのも目的なので 全部やってみようと思います。
>>504 ソフト内でのデータの持ち方もそうだけど、
意外とファイルに保存する方法のほうが大事かもね。
まずはSaveとLoadの方法を決めてからでも
データの持ち方を考えるのは遅くないかも
ほう、record型ってObjectだったのか
違います。C++とは違います。 procedure TForm1.Button1Click(Sender: TObject); type TRec = record A:Integer; end; TCls = class A:Integer; end; var Rec:TRec; Cls:TCls; P1,P2,P3,P4:Pointer; begin P1 := @Rec; P2 := @(Rec.A); Cls := TCls.Create; P3 := Cls; P4 := @(Cls.A); end; この場合、P1=P2だけど、P3<>P4
昨日スレッドについていろいろと教えてもらったものです。 色々やってるのですが、どうしてもうまくいきません。 ソース晒すのでおかしいところを教えていただけないでしょうか? procedure TMainForm.AppMessage(var Msg:TWMDropFiles); var FileNames:array[0..255] of Char; begin DragQueryFile(Msg.Drop,0,FileNames,255); DateAdd.Create(FileNames); ←BooleanとArrayには互換性が無いと怒られる。 DragFinish(Msg.Drop); end; unit Unit2; interface uses Classes,SysUtils; type DateAdd = class(TThread) private { Private 宣言 } FileNameA:String; protected procedure Execute; override; constructor Create(FileName:String); end; implementation { DateAdd }
constructor DateAdd.Create(FileName:String); begin FileNameA:=FileName; inherited Create(False); FreeOnTerminate:=True; end; procedure DateAdd.Execute; var AList,BList:TStringList; i:integer; begin AList :=TStringList.Create; BList :=TStringList.Create; FileNameA:=ExtractFileName(FileNameA); try if FileNameA<>'' then begin AList.LoadFromFile(FileNameA); for i:=AList.Count -1 downto 0 do begin BList.Insert(0,'20'+Copy(FileNameA,1,2)+AList[i]); end; end; BList.savetoFile('Finish'+FileNameA); finally AList .Free; BList .Free; end; end; end.
以上です。
あと、
>>477 さんが教えてくれたクラスとオブジェクトの項目はD6Proにはありませんでした。
みにくいよ! type DateAdd = class(TThread) private { Private 宣言 } FileNameA:String; protected public procedure Execute; override; constructor Create(FileName:String); end; にしれ
>>512 そういう風にしたのですが、なぜかインデントが無くなってしまいました。
>>513 よくみれ
type
DateAdd = class(TThread)
private
{ Private 宣言 }
FileNameA:String;
protected
public ←ココ
procedure Execute; override;
constructor Create(FileName:String);
end;
WM_DRAWCLIPBOARD、WM_CHANGECBCHAIN の2つのメッセージを処理することでクリップボードを監視 するコードを書いているのですが、Win98SE+Delphi5 でコンパイルしたものが WinXp では正常に動作 しません。98とXpでは上記の2つの処理に何か違いがあるのでしょうか? procedure TForm1.FormCreate(Sender: TObject); begin hNextChain := SetClipboardViewer(Form1.Handle); end; procedure TForm1.FormDestroy(Sender: TObject); begin ChangeClipboardChain(Form1.Handle,hNextChain); end; procedure TForm1.ClipChange(var Msg: TMessage); begin if Clipboard.HasFormat(CF_TEXT) then Memo1.Text := Clipboard.AsText; SendMessage(hNextChain,WM_DRAWCLIPBOARD,0,0); end; procedure TForm1.ChangeChain(var Msg:TWMChangeCBChain); begin if Msg.Remove = hNextChain then begin hNextChain := Msg.Next; Msg.Result := 0; end else Msg.Result := SendMessage(hNextChain,WM_CHANGECBCHAIN, Msg.Remove,Msg.Next); end;
ロケットマウスみたいなのは作れる?
>>514 できました。
すげぇ。スレッドもドラッグ&ドロップも初体験だったのに・・・
ここの過去ログと皆さんのおかげです。
ありがとうございました。
>>517 > アップデートのパッチはあててる?
うーん? どうだったかな。
で、もう一度delphi5update.exeを実行する前にd5upatch.exeを解凍しよう
と思ったのですがなぜか「CRCが一致しない」という警告が出てしまいます。
>>513 「2ch でインデント ⇒ 全角空白に置き換える。」は、半ば常識。
>>512 のソースをメモ帳とかにコピペしてみるべし。
(逆に、そのままだとコンパイルできないから気をつけるべし。)
test &nbsp;
( ゚Д゚) ?
(゚д゚) !!
525 :
デフォルトの名無しさん :04/03/20 21:55
俺からもDrug&Dropについてちょっと教えて DelphiでButton1にDropしたらAの処理 Button2にDropしたらBの処理をさせることはできる? 別にButtonじゃなくてもPanelでも何でもいいです。 できるのだったらやりかたを教えて
>>491 制御文字は文字コード0〜31($1F)と127($7F)に割り当てられているのですが,
Trim関数は両端の空白と制御文字を取り除くといっているものの,
コード127($7F)だけは取り除いていないということです.
もっとも私が見たのはDelphi5のソースなので
Delphi6以降は変わっているかも知れません.
>>522 まあ、空白を に置き換えるのが一番親切なんだけど、結構面倒かと。
(正規表現使えるエディタならそれほどでもないかな...。)
つーか、別にインデント部分に拘らずに、素直に全置換でいいんだったな。
>>525 自分のアプリ内で完結するならOnStartDragやらOnDragDropをヘルプで調べれ。
アプリ間ならSDKのRegisterDragDrop, DoDragDrop, IDropTarget, IDropSource, IDataObjectあたりを調べれ。
FAQにあるとおりの手段でD&Dさせて、 後でどのコンポーネントにD&Dされたか調べれば出来るかと。 両方とも、検索すれば見つかるぞと。
>>526 > コード127($7F)だけは取り除いていないということです.
制御コードに $7F が含まれていることをはじめて知りました。
たしかに Trim() は $7F は取り除いていませんね。
ありがとう
TControl.OnDragDrop イベントはコントロール個別に呼ばれるので たんに個別に違った処理を書けばいいのでは?
$7Fってどんなん?googleっても出てこんがな。
取得したフルパスのexeファイル、起動しているかどうかを調べるにはどうしたらいいのでしょうか
Trimのコードってさ TrimLeft(TrimRight(s)) じゃ駄目なの? それともソースにあるほうが速いんかね? while回数増えそうなんだけどな
>>535 ファイルを書き込みモードで開こうとしてエラーが出たら起動中とか
不適切
ファイルのフルパスなんか分からなくても Mutexの名前が分かれば、起動してるかどうか分かるのだけれど。
いかりやを生き返らせるコードを教えてください でるふぁいで
542 :
デフォルトの名無しさん :04/03/21 04:34
>>541 procedure TNullpo.Nullpo();
begin
try
finally
Self.Nullpo();
end;
end;
>>541 procedure TForm1.Button1Click(Sender: TObject);
var
Time:TSystemTime;
begin
with Time do
begin
DateTimeToSystemTime(Now,Time);
wDay:=19;
SetSystemTime(Time);
end;
end;
ワロタ
ネットワーク上のテキストデータをMemoに表示するにはどうしたらよいのですか? ご教授願います。
>>545 ネットワーク上ってのが範囲が広すぎて答えようがないぞ
httpd、ftpd上ならIndyを使ってダウンロード
LANの共有フォルダなら、ネットワークドライブにして
そのまま普通にアクセスしてまえ。
>>546 返答ありがとうございます。
HTTP上のtextデータの事でした^^;
早速Indy試してみます。
なら、TIdHTTPだな。 GetでURLを指定してダウンロードするだけ。 データはTStringStreamにはき出されるから、WriteStringで そのままTMemo.Textにはき出せばいけそう。 改行されなかったらデータをなめて改行コードごとにデータを 取り出してTStringListにいれれ。
C#ならたったこれだけ。
Console.WriteLine(
new System.IO.StreamReader(System.Net.WebRequest.Create("
http://www.2ch.net ").GetResponse().GetResponseStream()).ReadToEnd());
>>549 なんか悔しいじゃんよw
Memo1.Lines.DelimitedText := #10#13;
Memo1.Lines.CommaText := IdHttp1.Get(URL);
Delならこうかな?
>>535 9x > CreateToolHelp32Snapshot/Process32First
NT > 上かEnumProcessesでプロセス列挙してEnumProcessModules/GetModuleFileNameEx
みなさんありがとう やってみます
初めてIndyをインストールしてみた コンポーネントがいっきに増えてビックリたまげた
デフォで入ってないのか? Personalか?
556 :
デフォルトの名無しさん :04/03/21 19:07
StringListの中身をもう一つのStringListにコピーするのはどうするの? A:=TStringList.Create; B:=TStringList.Create; try A:=B とやったけど駄目だった。
A.ASSIGN(B)
558 :
デフォルトの名無しさん :04/03/21 19:17
Thanks
起動時にTStringsにファイルを読み込みたいのですが TextBuffer.LoadFromFile('C:\sage.txt'); とするとエラーになります。 TextBufferはClass Form1のprivateに宣言しています。 どうすればうまくいくのでしょうか?
560 :
デフォルトの名無しさん :04/03/21 21:57
>>559 TextBufferはTStrintList?
TStringは、そのままじゃインスタンスとして使えないので、
TStringListを使うべし。
それ以外なら、Createしていないとか、ファイルがないとか、
誤字脱字があるとか、具体的なエラーがわからないので、
なんともいえん。
>>559 TStrings は抽象クラスだから直接インスタンス化してはいけない。
でも LoadFromFile は TStrings で実装されてるから今回のエラーとは
関係ないと思う。
エラーの内容が書かれてないので何とも言えないけど、Create せずに
使ってるってことないよね。
ファイルの指定に間違いがありました 無事読み込めました ありがとうございました。
563 :
デフォルトの名無しさん :04/03/21 22:43
時間の処理をしているのですが、TDateTime関数の中に1を入れてそれから EncodeTime(0,15,0,0)を減じていくと、0になるはずなのに、 1e-17と言う値が入ってしまいます。 たぶん四捨五入で一番下の桁が残っているのだと思いますが、 これを回避する方法は無いでしょうか?
すみません追記です。 基本的に分単位の処理しかしません。 秒以下はいらないのですが、1mSが邪魔をしていて不等号での判断が出来なくて困ってます。
無理です。 x86の仕様上浮動小数点演算では必ず誤差が出るので直接 = で評価してはいけない。 YearとかDecodeDate等でIntegerに変換するには問題ない誤差ない、変換してから比較するしかない。
BCD演算やればいいと思うが、Delphiではできるの?
>>564 浮動小数点使ってて、1ms が問題となるような判断する方がどうかしている。
分までしか必要ないなら、分をベースにした整数演算すればいいだけ。
>>566 インラインアセンブラ使えば出来ないこともないが…
ちなみにCurrency型という物もある。整数以下の誤差が出ない。
> 浮動小数点演算では必ず誤差が出るので直接 = で評価してはいけない。 これは常識でしょ。こんなの知らないなら、プログラミングなんかの話はできないでしょ。
有限のビット数ですべての数を正確に記述出来るわけないのは、ちょっと考えれば すぐに分かると思うんだがなー。
>>569 そうでもないよ。
漏れの取引先のとある社員は、入社8年目にして知らなかったし、
今年の新入社員4人のうち2人は、コンピューター専門学校のくせにVBすらも使えなかった。
………_| ̄|○
情報系の専門学校なんて基本情報の資格とって終わり ゲーム系ならツールの使い方覚えて終わり 他の職種と違って専門学校のメリットはない
>>567 分をベースにした整数演算ってどうすればよいのでしょうか?
いくら考えてもTDateTime型は整数部は日に該当するので使いかたは分からないので。
>>572 浮動小数点の誤差は基本情報に出てくる問題だよ。
あんた知らないで資格試験バカにしているだけだね。
プログラミング系はいくら資格取っても頭が悪かったら 飯食っていけんぞよ。 独立して一人でぼろ儲けしている奴を何人か知ってる。
>>573 DecodeDateがあるならDecodeTimeも有ると連想できませんかね?
>>570 あんたちょっと普通からずれてるよ。
有限のビット数でそのビットサイズに入りきらない大きい値が表せないのは分かるが、
ビットサイズに入る値がとびとびの値で正確に表せないなんてちょっと考えても分からない。
>>575 資格取っただけで飯が食える職業なんて無いんだが。
あんたがやっているのは資格を自分で過大評価して、
そんなに評価は高くないと自分で普通の評価に戻しているだけ。
> ビットサイズに入る値がとびとびの値で正確に表せないなんてちょっと考えても分からない。 そうか? 0と1の間には無限個の数値があるんだが?
> 有限のビット数でそのビットサイズに入りきらない大きい値が表せないのは分かるが、 数値の大小と、浮動小数点の誤差は直接関係ない。
>>579 小数点以下一桁と限定すれば10個しかない。
>>580 それはちょっと考えただけでは分からない。
>>573 普通に全部自前で計算すればいいだけだと思うけど。
例えば、一時間三十分後の値なら、1 * 60 + 30 = 90 を足せばいい。
とは言っても、扱う範囲が年月日に及ぶとうるう年の扱いが大変だから、そこは TDate 型で処理すればいいと思う。
>>577 例えば、0.0 と 0.1 は表せても、1/3 は有限の桁数だと正確に表せないだろ。
0.1 の二進数表現がこういう状況になる (処理系が多い。)
> それはちょっと考えただけでは分からない。 そうか、きみのちょっととオレのちょっとは違うみたいだな。 プログラマならどっちが「普通」かな。
0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9 という数が代入も表示もできるのに、 実際はこの値でメモリに入っているわけではないと いうのは普通に考えても分からない。
あなたは、なぜ浮動小数点と言うのか考えた事はありますか?
>>584 プログラマの定義が無いのでその質問は意味が無い。
>>586 君がなぜ浮動小数点というのかを考えたのはいつかね?
プログラミングを始める前ではなかろう。
> 小数点以下一桁と限定すれば10個しかない。 そうなんだよ。有効桁数を考慮して、浮動小数点におけるイコールとはどういううことか を考えてプログラムする必要があるんだよね。だから、 > 1e-17と言う値が入ってしまいます。 なんていうう質問は、ほんとはないはずなんだよ。
>>589 だからと結論が全然結びついてないよ。
まず浮動小数点というのを知らないということを前提に考えな。
> プログラマの定義が無いのでその質問は意味が無い。 プログラミングするのがプログラマなら、普通のプログラマと 浮動小数点の内部表現を知らないプログラマがいる、あるいは二進法も 知らないプログラマがいる、というのが現実なのかな。
基本情報に合格していない奴は プログラマにならなければいいって事だな。
>>591 実際そうだよね。資格とっていなくてもプログラマになれるんだから。
>>592 資格は関係なし。常識と想像力があればよい。
>>594 その常識とはなんですか?
一体どこで身に付ければいいのでしょうか?
あと、体力な。
資格試験に決まってんじゃんw
そんなもの義務教育で学ぶだろ。 とか言い出したら笑える。
つまり、常識を学ぶまで 質問もプログラミングをするな。 ちなみに、常識はプログラミングを していれば自然と身につく。 矛盾しているが、これが答えだ。
必要に迫られるかどうかの問題でしょ。 必要に迫られれば気づいて対処するし、そうでなければ一生わからんかもしれん。 それを気づかなくてもプログラマとしてやっていけるかもしれん。 知識さえあれば優秀なプログラマともいえんし、優秀なプログラマならそのぐらい 知ってて当たり前ということもあるけど、どっちかというと知識は問題解決の手段 でしかなく、優秀な人なら知識がなくともいつか気づくでそ。
要するに今が必要になったときで、今が知るときなのに、 そんなもん常識だろとバカにする態度がいけない。
>>590 > まず浮動小数点というのを知らないということを前提に考えな。
浮動小数点を知らないとしても、有効桁数を知らないのはかなり致命的だと
思う。ヘルプにも載ってるんだし。
x.xxxxxxxxxx の加減算を問題にしているとき変数に 1e-17 が入るのはなぜか?
という質問なんだぜ。
人をすぐバカにする奴はたいてい大したことない
>>602 ヘルプに載っているというのなら浮動小数点もヘルプに載っているだろ。
ヘルプに載っていることは問題にならない。
誰でも最初は分からんものさ。 それが普通。
知らないことを素直に認めないのはたいしたことがない以前
知らないから質問しているわけだろ? 浮動小数点も2進数も有効桁数も知らない。 知らない人の常識は知らないに決まっているじゃん。 なんでそこで知っている人の常識がでてくるんだか。
>>606 その通りだけど、そんな奴はここには出てきていないよ。
ここにいるのは知らないことをバカにしている奴だけ。
だから資格勉強ぐらいしとけって、 それか情報関係の大学に行くか。 大学に行ったのにプログラマになるの?とか 大学じゃ遅すぎるというのなら資格勉強をしとけ。 浮動小数点の誤差問題など基礎的なことを学べるから。
610 :
デフォルトの名無しさん :04/03/22 00:38
つか、誰がだれだかわからん。 いいあってる香具師はトリップつけれw
言い合ってるヤツは他へ逝け。 でしょ?
なかさぁ、不毛っぽい議論はやめようよ。ちょっと読んでみてオレが一番ショック
だったのは、
>>579 > 0と1の間には無限個の数値があるんだが?
これを本当に知らないんだろうか。知らないとしたら、何個あるとおもってるんだろうか。
なんか、ここが本質のような気がする。
613 :
デフォルトの名無しさん :04/03/22 00:42
初心者スレで初心者の質問をすると荒れる。 これ初心者スレの常識w
>>612 無限個の数値があると分かっても
0.1が正確にあらわせないというは分からない。
この違いが分からない?
ある時は無限個、ある時は0個。 何個あるかどうかじゃなく、数値というものをどういうように扱っているかでしょ。
> 0.1が正確にあらわせないというは分からない。 うん、これは二進法で浮動小数点をどう表現するか、というかなり高度(?) なので 分からないかも知れない、とは想像つくね。 > 何個あるかどうかじゃなく、数値というものをどういうように扱っているかでしょ。 そうなんだけど、有限個のビット数でそもそも無限個の数値を正確に表せない、とは ヘルプ読まなくても分かると思うんだがなぁ。
でも無限大は表現できるよ。
それは必要に迫られてないからでしょ。 自分の仕事では、ほとんど正数しか使わないから そういう表現が求められることはないし、それで問題になることはないし。
今回の問題は、
>>602 のいうように、浮動小数点の内部表現がどうの、というより、
有効桁数のはなしでしょ。1から引いていって、結果 1e-17 ならゼロとみなしてよい、
ということ。
問題にならないから気づかない。 使わないから気づかない。 こういうときは資格勉強が一番。 浅くても広い範囲の事を知ることができる。
問題になれば調べる。それが漏れのやり方。
調べても調べても分からんかったら仕方がない。 ここ、初心者質問スレで質問する。それが漏れのやり方。
そんな奴ばかりだったらこのスレ要らないなw で、自分のやり方に合わない奴(調べない奴)を煽っているわけか。
> どれくらいならゼロとみなせるんだ? 有効桁数の範囲を超えた小さい絶対値なら確実に。そうでなければ、かなり高度な 議論になる、と思う。それこそ、内部表現にかかわるような。
浮動小数点は誤差が出るんだよ。 だから0と比べたらいけないんだよ。 そんなの常識だろ。 といっておきながら、具体的にどうするのか聞くと 多分大丈夫なんじゃない? と曖昧なことしかいえない罠。
おぉ、居直っている。すげぇー。非常識もきわまれり、ってことか。 > 多分大丈夫なんじゃない? と曖昧なことしかいえない罠。 これ何番?
0.1だと誤差があるけど、0.5なら誤差ないよ。
曖昧だとおもうのは有効桁数を知らないからだろ。
>>624 いや、漏れは誰も煽ってないよ。煽るためだけに来るほど肥満じゃない。
自分の分かる質問なら教える。分からんかったら調べる。それが漏れのやり方。
>>628 無限個の中にはぴったりと一致して誤差なしで表現できるものもあるさ。
無限個から比べると無視できるほど少数だがな。
>>630 オレは少し肥満ぎみ。Q&A のスレって、どんなことでも自分で調べてみると
勉強になるね。ほんとに。
>>632 ドーンマーイ。
やっぱ知識は少ないより多いほうがいいよね。可能性が広がる。
曖昧だとおもうのは有効桁数を知らないからだろ。 といっておきながら、具体的にどうするのか聞くと 多分大丈夫なんじゃない? と曖昧なことしかいえない罠。
知識をつけたはいいが他人がちょっとものを知らないだけで 馬鹿にしたような発言をする奴はどうかと思うけどな。
| _ー|ー|-┐ __|_  ̄── | ノ ヽ/ | ヽ / | /丶/ | | | し^ヽ / \ ヽ(;´Д`)ノ
> 具体的にどうするのか 有効桁数について調べて見れ、 と<具体的>に教えてやらない、といつまでも書き込みそうだな。(藁 あぅ、ちっとも具体的じゃないじゃないか、とレスされそうなので先回りしておくか。
元のネタを読んでいくと時間に関する質問のようだが 今話題にしている誤差は本当に関係あるのか?
>>638 ちっとも具体的じゃないじゃないか(w
先手を打ったつもりだろうが、答えは予想通り変わらない。
相手のレスが予測できるなら、ついでにそのレスの答えも用意しておいたら?
ヘルプより type TDateTime = type Double; なので、浮動小数点の演算に関することであることは間違いない。
そもそもDoubleってのがおかしいよな。
Power(2, -4) * 1.6 = 0.0625 * 1.6 = 0.1 だけど、0.1って誤差無しで表現できない?
教えて君は少しは調べたら。ヒントはもらったんだらさ。 有効桁数は、数値の大小と関係するので演算のもとになる数値によってゼロとみなす しきい値は変化する。
> そもそもDoubleってのがおかしいよな。 そうか。時間の最小単位というのは無限小なので、とびとびに経過するもんじゃ ないし、浮動小数点であったもいいんじゃないの。
PCの時計は有限だよ
でも時・分・秒がちゃんと表せない小数ってのもなぁ。 本当に今の時刻は正確に表せているんだろうか?
ヘルプより 次の表に TDateTime 値の例とそれに対応する日付と時間を示します。 01899 年 12 月 30 日 午前 12:00 2.751900 年 1 月 1 日 午後 6:00 -1.251899 年 12 月 29 日 午前 6:00 350651996 年 1 月 1 日 午前 12:00 PCの時計は関係なし
>>650 1秒ってDoubleに表したら何?
2.75が1900 年 1 月 1 日 午後 6:00だとして
1900 年 1 月 1 日 午後 6:00:01はちゃんと表現できるの?
EncodeTime() とかさ、日付時刻ルーチンを調べてみたら?
0.5も誤差無しで表現できるね。 知ったかぶっていても、所詮この程度。
不具合が出るコードまだぁ?
>>654 誰も0.5が誤差無しで表現できないと言って無いと思いますが?
こんな時間に起きてるおまいらの事だから 少数の扱いぐらいは心得てるんだろ? その上で話を進めようや
>>659 ちょっとまて
0.1をエレガントに誤差なく表現する方法を
語ってたんじゃないのか?
数値とか時間とかさ、抽象化・一般化して考えることがないのかな PCの時計だとか、0.5だとか、なんか痛すぎる
663 :
デフォルトの名無しさん :04/03/22 02:18
そこで.NETですよ。 .NETなら8バイト整数値なので100ナノ秒単位で 正確に時刻が表せます。
ケンカ やめれ!! ∧∧ |\ (´Д`) /| ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /  ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\ __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ___<__)__________ (__>___
>EncodeTime 関数は,指定された時,分,秒,およびミリ秒を TDateTime 値にエンコードします。 ヘルプに書いてあるのは嘘なのか? 誤差がでるなんて書いてないぞ
>>669 時計じゃなくてEncodeTime 関数の話題なのだが
TDateTime の精度があやしくなってきたな。 実はちゃんと表せない秒があるんじゃないのか?
お前らが無資格なのはよくわかった
残念、資格持ちだw だから役にたたないといっただろう
単にとった資格の内容忘れているか、 きちんと理解してないだけじゃん。 もう一回受けなおせ。
> 実はちゃんと表せない秒があるんじゃないのか? あー、ほんとに有効桁数というのを知らないみたいだな。 あほらし。
>>676 とりあえず、一言いわないと気がすまないみたいだな。
煽りは放置ということで。
678 :
デフォルトの名無しさん :04/03/22 02:58
さすがDel厨。 初心者っぷりと初心者を煽る自称プロっぷりが 実に厨っぽくてすばらしい。
結論としては関数のバグ(もしくはドキュメントの不備)でいいのか?
ヘルプより Double 5.0 x 10^-324 .. 1.7 x 10^308 有効桁数 15〜16 > 誤差がでるなんて書いてないぞ 有効桁数以下では誤差が出るのは常識だからいちいち書かないのではないですか?
>有効桁数 15〜16 なら、秒まで楽勝でしょ
>EncodeTime 関数は,指定された Hour,Min,Sec,および Msec に対する TDateTime 値を返します。 ドキュメントによるとミリ秒まで保証していると読めるわけだが
ミリ秒だって楽勝でしょ
DelphiってFortran?
EncodeXXX() してから DecodeXXX() してみたらいいじゃないの
>>686 FORTRANだったらもっと精度いいよ
いったい、何ミリ・ナノ秒まで正確にあらわせるのよ?
DecodeTime(EncodeTime(23,59,59,999),h,m,s,ms);
> じゃあなんで今回誤差が発生したんだ? 浮動小数点どうしの引き算したから。
最初1を代入して、つぎつぎ引いていって結果 1e-17 になった、ということは 有効桁数を超えて小さな値になった、ということ。
> 何ミリ・ナノ秒まで正確にあらわせるのよ? Double 5.0 x 10^-324 .. 1.7 x 10^308 だから、ナノ秒、ピコ秒、アト秒、楽勝。というか、単位が問題なのではなく 有効桁数の問題。1日に対して 1.00000000000001 これは有効。 0.00000001000000000001これも有効。 integer みたいに固定小数点じゃないので、桁数だけが問題になる
1で1日だから、0.001 は 1/1000日の時間。 1日は86400秒だから、0.000011574...で1秒
うん、1日に対して1秒は1e-5の位、ミリ秒は1e-8の位、で TDateTime = Double だから有効桁数 15〜16 、1日に対して1ミリ秒は全然問題なし。1年だと3、4桁 あがっても、大丈夫、1000年に対して1ミリ秒の精度は微妙になってくる。
逆に1ミリ秒にたいして1ピコ秒は全然大丈夫ね。
> 1000年に対して1ミリ秒の精度は微妙になってくる。 これはダメっぽい
(;´д`) 他所でやってくれよぅ
うーん、TDateTime 型って Delphi のものだから、その有効精度を議論するのに 他所って言われても、どこがいいんかなぁ
常識板ってあるんかいな
>>701 中級スレでも上級スレでも談話室スレでも好きなのをどうぞ。
ここで質問されたんだから、ここでいいのでは? ここでだめな理由ってなに? 高度すぎるって?
初心者が質問し易い雰囲気を作ってあげようよ。 20も30もレスの応酬があるなら、移ってあげようよ
質問者にもっと具体的に何をやりたいかを聞いてから回答すればいい。 でなければEncodeTimeだのTDateTimeをどう使うべきか、そもそも使うべきなのかを判断できない。 不足した情報を妄想で埋めたり直接的な解答をすることが常に正しいわけではない。 無能な回答者がよく陥る罠だな。
>>563 の質問自体はきわめて明瞭なのでは?
有能な回答者はこの質問のどんな意味が分からないの?
浮動小数点演算なら誤差がでるのは当たり前、整数に直して演算しろ、とか 誤差の理由について延々レスがのびてるのは煽るのも悪いが、なんか、逆切れして ろくに調べないのもいるからでは。690あたりまでいろんな茶々が入っているが 有効桁数、誤差の原因についてはちゃんと議論になってるよ。690以降は具体的 になってるが。
質問者から真の質問を抽出するのも大事な資質だぞ。 実社会に出て、お客さんに「効果的にバグを報告するには」なんて読ませられると思うか?
「超初心者用」と書いているんだから、質問そのものには文句をつけないようにしませんか? 文句があるなら回答しなけりゃ良いんだし。
「超初心者用」と書いているんだから、質問者そっちのけで議論しないようにしませんか?
PCエンドユーザー<>プログラム初心者
曖昧な質問書かれても曖昧な解答しかできない
ここの場合はお互いプログラマ(職業じゃなくても)なんだから、 的確な質問をするのも能力つか勉強の一つだろ
コード晒してれば10分で解決した問題だな。
>>718 プログラマか否かってのはあまり関係ないのでは?
的確な質問ができるかどうかは経験による所もあるので、最初は難しい。
だからこのスレでは質問する側はあまり気にせず、回答する側が「具体的に書け」
「ソース出せ」と誘導すべきだと思う。
OnShow中にウィンドウを表示する方法ってありませんか?
OnShow中にForm2.Visible := True;じゃだめけ?
>>721 OnShowは窓をこれから表示するというイベントですから、まだ表示されません。
OnPaintを使えばどうですか?
どのフォームのOnShowなのか
どのウィンドウを表示するつもりなのか
OnShowでなければならないのか
1番目は"たぶん"Form1で
2番目は"たぶん"Form2だろうけど
解答が曖昧にならざるを得ない
現に
>>723 と
>>724 という2通りの解釈が出てきてしまっている
>>720 上のような質疑応答を毎回繰り返せばいいのかい?
>>726 非常に論理的な見解だが、最後疑問形にすんなよw
どうすればいいと思うかもかいてくり
>>726 質問する側が同一人物でない以上仕方ないでしょう。
それが無駄だと思うならスレタイに「超初心者向け」なんていれない方がいいと思う。
>質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 スマソ。天ぷら読んでなかったよ
メタ議論ウザ
try〜finallyで保護されている部分でエラーが起こっっても、 必ずfinally〜end;間の処理が実行されるのはわかるのですが try〜finallyの間でExitなどで制御を移した場合も処理は実行されるのでしょうか?
try内でexitしたらfinallyにとんでくれるはず
procedure Exit; 説明 Exit 手続きは,現在の手続きを終了して,制御を呼び出し元に移します。 現在の手続きがメインプログラムである場合,Exit はプログラムを終了します。 Exit は,Exit を呼び出した呼び出し元の手続き文の次の文に制御を渡します。 注意Exit は,現在のブロックではなく現在の手続きから制御を呼び出し元に戻します。ただし,Exit は try..finally 構文で指示されている制御フローを終了しません。Exit が try 節内で呼び出されると finally 節が実行されます。
誤解を招いたようでスンマセン…
OnShow中に、"その"ウィンドウを表示する方法ってありませんか?でした。
>>724 さんの方法で解決できました。
ありがとうございます。
>>734 すみません
ヘルプに普通に書いてありますね
必死にtry、finallyのとこばかり見てました
FileListBox1.Update; これを行うと FileListBox1.FileNameの内容が空白に戻ってしまうのですが、 空白にならないようにリストを更新する方法は有りませんでしょうか。。
Updateするってことはそのフォルダに変化があったと考えているわけで もしそのファイルが消えてしまっていたらおかしなことになるね かっこ悪いけど var s: string; s:=FileListBox1.FileName; FileListBox1.Update; FileListBox1.FileName := s; 動作未確認
updateかけると選択解除になるんじゃない? Explorerでも更新すると解除されるし。 いやなら、updateかける前にどこかに保存しておいたら?
>>738-739 ありがとうございます。
1秒ごとにリストを更新するようにしていました。
ItemIndexで同様の方法を試みようとして上手くいかず困っていたところでした。
そのままFileName使えばよかったのですね。
EInOutErrorがでましたが、何とかなりそうです。
>>740 >1秒ごとにリストを更新するようにしていました。
そのやり方だとファイル数の多いディレクトリを開いてるときにちょっと遅くなりそう。
指定したディレクトリが更新されたら通知するようなコンポーネントがあるよ。
Delphi6以降に。そっちでチェックしたほうが無駄がないかも。
何を目的としてるのかさっぱり分からん
>>741 Delphi6Personalでちょっと勉強中なもんで、、
そのようなコンポーネントはないようです。。
スミマセン。。
FindFirstChangeNotificationなんてのが出てきたけど。
>>745 それつながりでExplorerのフォルダツリーとファイルビューなコンポもあるし。
標準コンポがあるんだからそれでいいじゃん。 せめてそれ以外のやり方のメリット書いたら。
FindFirstChangeNotification は特定フォルダ内で変更があった、というだけの通知
>>748-749 のは、シェル全体で変更があったことがわかる。ファイルだけじゃなしに。
詳細は
>>749 に FindFirstChangeNotification との違いが書いてある。
>>748-749 そのコンポなかなか面白い。だいぶ前に休日一日つぶして作ったことがある。
Shevin 氏のヤツは実装がすこしアレだけどちゃんと動作する。
>>748 のはその
改良版ということになってるが、動作が?のところがある。ファイルシステムの変更
監視はできるけど、どのファイルが、というところで ?? の動作がある。そのほか
のシェルの変更は試してないけど。
テキスト仲からタブ文字を検索したいのですが Pos(Substr: string; S: string)でタブ文字を検索することは出来ないんでしょうか?
754 :
デフォルトの名無しさん :04/03/22 19:56
初歩的な質問ですが。。。 フォームにComboBoxを配置して、 ComboBox の items にボーダースタイルを表示させて 選択した候補を従って、フォームのボーダースタイルを変更するにはどーすればよいせうか? ComboBoxのItems は TStrings なので、 単純にForm.BorderStyle := にはできないのです。 何を読んでベンキョーすればよいかでもけっこうです。 教えてください。
>>754 ConmbBoxのアイテムを選択すると
ItemIndexの値が変わる
どのイベントで処理すればいいかは分かるな?
後はがんばれ
TAB定数を使ってなんとかできないの? bsNone,bsSingle,bsDialog,bsSizeable,bsToolWindow,bsSizeToolWin は順に0-5だから、Itemsの0〜5に上の表示を割り当てて、 Form.BorderStyle := ComboBox1.ItemIndex; でいけそーな悪寒
>>755 , 756 さんへ
ありがとうございました。
ComboBoxのClickイベントに
Form1.BorderStyle := TFormBorderStyle( ComboBox1.ItemIndex);
と書いたところ、うまく切り替わるようになりました。
本当にありがとうございました。
じつは、もう1つ質問あるんですが。。。
かかんのかいw
759 :
デフォルトの名無しさん :04/03/22 20:42
質問があります。 フォームのBorderStyleの値(bsNoneとかbsSingle)を プログラム的に読み出すことはできるのでしょうか? やりたい事は、ComboBoxのItemsにBorderStyleの選択可能な値をいれたいのです。 いまは、かっこわるいのですが、初期設定として手入力しています。 でも、TFormBorderStyleの定義を読んで、それを文字に変換して、ComboBoxに代入したいのですが。 ヒントだけでもいいです。 教えてください。
760 :
デフォルトの名無しさん :04/03/22 20:43
>> 758さん ごめんなさい。 いま書きました。
定義を文字として抜き出すのは無理なんじゃないかなぁ。
ShowMessage(IntToStr(Word(bsSizeToolWin)));で数値は求まる。
>>756 にも順に0〜5と書いてあると思うが。
procedure GetEnumNameList(TypeInfo: PTypeInfo;str:TStrings); var i:integer; var T: PTypeData; var s:string; begin T := GetTypeData(GetTypeData(TypeInfo)^.BaseType^); for i:=T^.MinValue to T^.MaxValue do begin s:= GetEnumName(TypeInfo , i); if s<>'' then str.Add(s) else break; end; end;
>>759 実行時型情報を取得すれば可能で、具体的コードは 上の通り。
呼び方は
GetEnumNameList(TypeInfo(TBorderStyle) , ComboBox1 . Items);
逆に、文字列として列挙型名から列挙型に変換する事も可能。 GetEnumValue(TypeInfo(TBorderStyle), string ) 他にもTypeInfoユニットにはこの関係のがイッパイ
それは.NETでも使えますか?
767 :
デフォルトの名無しさん :04/03/22 21:26
>>763 さん
できました。。。。。感無量です。
PTypeInfo、TypeInfo回りの勉強をします。
>>761 さん
レスありがとうございました。
時間をとっていただいたことに感謝しております。
>>766 さあ?買ってないから知らない。 .NETなら System.Type でやったほうがいいんじゃないの?
>>767 自作の列挙型でも、publishedメンバーにさえすれば同じ事が出来るから、しばらく面白いよ。
>>1 の2行目を熟読して質問です。
俺はまだ狸寝入りしていたほうがいいですか?
>>769 それで解決したんならそれでもいいよ>メル欄
コードを晒す気があるなら晒してもいいし。
>>564 >>567 の書いてる通り、
時間単位の処理がしたいなら TDateTime * 24
分単位の処理がしたいなら TDateTime * 24*60
して、整数に(切り上げか丸めて)int64か浮動小数点で処理すればいい。
そうすれば1分は一足すだけでしょ?
浮動小数点でも整数の範囲なら=で比較出来るしさ。
TDateTimeに戻すのは同じ数で割るだけ。
>>770-772 お三方、ありがとうございます。
とりあえず、動いたので当面はこれで行って他のバグを潰していきます。
次のバージョンでは精度を求めたいので
>>772 の方法できちんとチェック
しようと思います。
半角数字を全角数字にするファンクションあったら教えて下さい。 ヘルプは見たけど見つかりませんでした。
Copy('0123456789', n*2+1, 2)
なぜわざわざ全角数字なのか非常に気になるが、ここはぐっと抑えておこう
>>774 const
Zenkaku:WideString = '0123456789';
function HanSuuToZenSuu(Ch:Char):string;
begin
result := Zenkaku[Ord(Ch)-47];
end;
// てすと
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s1,s2:string;
begin
s1 := '9876543210';
s2 := '';
for i := 1 to Length(s1) do
s2 := s2 + HanSuuToZenSuu(s1[i]);
Label1.Caption := s1;
Label2.Caption := s2;
end;
サンクスコ
はじめまして、こんにちは。 Delphi初心者なのですが、今回チャットを作ろうと D6PersonalにIndyを入れて色々見ているIRCの機能がありました。 そこで、IRCのクライアントとサーバーを作ろうとしています。(まずはチャット機能から。。。) ネットで検索しても、これといったいい情報がなく、みなさんのお力をお借りしたく 思いました、よろしければ、どうすればチャットとして機能するか ご指導願いたく思います。どうかよろしくお願いします。
他の言語やってたんじゃないなら、敷居が高すぎない?いきなり。
781 :
デフォルトの名無しさん :04/03/23 11:29
DelphiでPDFを読み込んでImage化する方法ってありますか? (Readerを使わないで簡易ビューワーを作る方法を探してます) 外国産の有料コンポ使わないとダメかな・・・。
サンクス!うぉ、敷居高いですね・・・ オンラインドキュメント(型式は問いません、Delで扱えれば)を、ネット上から取ってきて 表示するアプリを作りたいのでPDFでなくても構わないんですが・・・うーん、フォーマットを考え直そうかな。
ごめん最後のは有料だったね。
>>779 いきなりIRCだと難しいと思うから、まず、TIdTCPClientとTIdTCPServerで
簡単なチャットプログラムを作ってみたら?
>>783 TWebBrowserでHTML表示するのが一番手っ取り早い予感
Reader使ってるじゃん・・・
>>787 マニュアルをhtmlで作って、それを表示するって意味でしょ
単に表示させるなら、それだけで十分だと思う。
.chmにしろよ。
オンラインで配りたい元データがpdfですた・・・ _| ̄|○ ヤッパリ ムリポ いや、pdfからの変換ツールを探してくるか・・・。
>>790 TorryちゃんとDSPにPDF関連のフリーソフトたくさんあるけどだめなん?
PDF Createってあるから作るのがメインのん゛多いけど、Viewerかねてるのも
あるんじゃないの?
そ、そうですね、行ってきます。 <(;´Д`)>
現在、プロジェクトに登録されているpasで特定の文字列をgrepして 一覧表示するか、次々にその場所を表示してくれるような方法ってありますか?
検索の次のタブでできますた・・・スマソ気がつかなかったよ
TSplitterにOnClickイベントをやりたいのですがどうやればできるのでしょうか?
とりあえず コンポーネントの新規作成で継承して OnClickをpublished にしてみたら?
やってみましたがイベントタブにOnClickイベントはありませんでした Publishedにproperty OnClick;を追加するだけでいいんですよね?
すいません。できました 間違えてPublicに書いてました ありがとうございます
へー、そんなこと可能なんだ。 ダブクリとかインスペクタに表示されてないコンポでも 継承すればひょっとしたらいけるかもしれんってこと?
TControlやTWinControlは イベント全部と多くのプロパティがprotectedのままだから 派生の仕方によっては 必要最小限のものしかpublishedになってないことも多いよね。 TControlから例えばColorやFontをpublicにしたクラスを派生させて そのクラスへキャストすると見えるようになったりもする。 (親へではなく兄弟とか伯父さんへキャストするわけだから、邪道くさいかも)
わざわざカスタムコンポーネントを作成するほどでもなければ、 そのユニット内でクラスを別名で宣言してキャストすると 上位クラスの protected メンバーにアクセスできる。 上位クラスに存在しないメンバーだとコンパイルできないので安全。 こんな感じ↓ type TSplitter1 = class(TSplitter); procedure TForm1.FormCreate(Sender: TObject); begin TSplitter1(Splitter1).OnClick := Splitter1Click; end;
802 :
デフォルトの名無しさん :04/03/24 10:52
あるFormから呼ばれて FormShowの中で条件を判断し、その条件によって Formを表示しないで 閉じて戻りたいのですが、どのようにすればいいのでしょうか? 呼び出して元は、修正しないで 呼び出された側のFormだけ修正したいのですが、 教えてください。
FormShowでCloseしろ
804 :
デフォルトの名無しさん :04/03/24 11:03
Closeしても 表示されます。
なお 呼び出し側は ShowModal で表示させてます。
条件判断をする場所を変えてみましょう 呼び出し元のメソッドの中で判断をして、Showするか否かを決定すればぁ? procedure TForm1.Yobidashi; begin if フニフニ then Form2.Show; end;
だから 呼び出し元を 修正しないで と言ってます。
ちょっと 誤字ってましたが、呼び出し元は、修正しないで、 呼び出された側だけ修正したいのです。
ShowModalをoverride
あぁ、コードの修正のことなのか。 理由がよくわからんがスマソ。 //OnCreate OnShow OnActivate OnResize OnPaint //Application.OnIdle この順番でイベント発生するはずだから、好きなの使いんしゃい。
このスレは 子牛の糞から 誕生しました
FormShow以外の選択肢が見えないの?
無駄に問題を難しくしとるな
フォームを動的に作成するようにして、Createでなんとかするとか。 これも呼び出し元をかえることになるんかな。 もしくはOnShowの部分でタイマーを動作させて、タイマーが動作 したらフォームを閉じるようにするとか。
809のでいいやんけ
ああ ShowModalをoverrideってのは、 showとは 別のイベントなのね。 ShowModalでも OnShow OnActivate OnResize OnPaint の順なんでしょうか? というか ShowModal が どのような処理しているか わからない・・・。 ソースを 覗いてくるか。
イベント順とかどうでもよくてさ、 function TForm2.ShowModal: Integer; begin if 条件 then Result := inherited ShowModal else Result := mrCancel; end;
覗いたけど、よく わからんかった・・・。 タイマー使ったから なんとかできたけど・・・。
プログラミング初めてやる人でDelphiする人って どうやって憶えていけばいいの?漏れこれからやろうとしてるんだけど
>>820 入門書買って読む。
WEBで最初から情報拾ってると不正確で偏った知識しか実に付かないから注意しな。
WEBは詰まったところをワンポイントで質問したりFAQ&Tipsを調べるのにとどめたほうがいい。
822 :
デフォルトの名無しさん :04/03/24 13:29
あ 818の やり方が いいね。 サンクス。
WEBとヘルポで十分だよ あとは慣れ
824 :
デフォルトの名無しさん :04/03/24 13:54
重い処理をするとき、処理中のフォームを ShowModal のような感じで表示して 処理が 終わったら、その表示したフォームを 閉じたいのですが、どのようにすればいいのでしょうか?
Form2.Show; while Foo do begin Bar; 重い処理 Form2.ProgressBar1.StepIt; Application.ProcessMessages; end; Form2.Close;
>>824 >>825 のようにすると、他のフォームのボタンやアイコンが動かせるから嫌なんでしょ?
>>824 のようにするなら、他のフォームの動きを止めてしまう。
あるいは処理の方をスレッドにしてしまう
ShowModalされた処理中のフォームに処理を書くか フォームからその処理を実行するメソッドを呼べばいい。
DelでUPnPを使ったプログラムって可能でつか? 具体的には対応ルーターでNAT越えしたいんだけど。
可能
487 デフォルトの名無しさん New! 04/03/24 12:05 Form.OnShow中にCloseしてもクローズされないという大バグが発見されました。 このバグはいつ直るのでしょうか?
>>829 おおっ!できるんでつか、ありがとうございます。
申し訳ないんですが、何を集めて、どうすれば、UPnPを使用したソフトが
作れるようになるのか、ヒントや解説してるページとかあったら教えてもらえないですか?
いま、いろいろ調べていますが何をどうすればいいかまったくわからん状態です。
SDKあたりがあるのかなと調べているんですが・・・・
ネットワークスレでWindowsでのコーディングの仕方を聞いたほうがいいと思うが。
このスレは マカロニペンギンのフンから 誕生しました
836 :
デフォルトの名無しさん :04/03/24 18:09
フンフン
837 :
デフォルトの名無しさん :04/03/24 20:08
あるEditのコンポーネントに フォーカスが あるかどうかを 調べるには どうしたらいいのでしょうか?
838 :
デフォルトの名無しさん :04/03/24 20:11
>>837 EditコンポーネントのメソッドFocusedで調べることが出来ます。
839 :
デフォルトの名無しさん :04/03/24 21:51
MIDIファイルの関連づけがRealOneになっている場合に、 Delphi6Personalでデバッガオプションがディフォルトのままの時に、 WebBrowserで<embed src="*.mid" height=0>を含むページを開くと例外が発生し、 "invalid floating point operation"というメッセージが表示されます。 そしてその後、このWebページを操作出来なくなってしまいます。 これを解消するには、[デバッガオプション - OSによる例外 - Float Invalid Operation]を、 [処理]を[プログラムが受け取る]のままにして、 [再実行時の例外の扱い]を[例外を破棄する]にすればいいと判りました。 それで質問なんですが、自分で作ったプログラムを配布する際に、一般的には、 デバッガオプションをどのように設定すべきなんでしょうか?
例外処理をちゃんとすりゃいい 全部外しても別にかまわん
>>837 Form1.ActiveContorol=Edit1
訂正スマソ to→t
843 :
デフォルトの名無しさん :04/03/25 00:03
Delphiは死滅したということなのですが次は何をやればいいでしょうか?
>>838 のいうように
if Edit1.Focused then
のほうがいいとおもう
>840 レスどうもです。 自分で書いたコードに関しては例外処理をしてるんですが、 ActiveXコントロール内で起きた例外に関しては、どうしていいかわからず、質問しました。 全部外してもとは、全て[再実行時の例外の扱い]を[例外を破棄する]にしても 問題ないってことでしょうか?
デバッガのオプションってダブクリ実行時関係あるの?
昨今のグローバリゼーションの波に逆らって申し訳ないが 日本語で喋って頂くわけにはいかないだろうか?
ひまわりスレに行って頂くわけにはいかないだろうか?
ああ、なんでだろ。デバッガオプションの設定が、デバッグ時以外にも適用されてると思ってた。 そんなわけないのにね…。適当に試して確認したときに、適用されてるように見えたのが原因か。 ところで、デバッガオプションの[再実行時の例外の扱い]を[例外を破棄する]と同様の事が デバッグじゃない時に出来ず、例外の後、固まってしまうんですがどうしたらいいんでしょうか?
うちのエスパーはただいま出払っております
例外は 実行されてるスレッドから発生されたら、そのスレッドでキャッチして自分で処理すればいい
853 <AAにつき省略>
854 名前:デフォルトの名無しさん [sage] 投稿日:04/03/25 13:34
>>850 それを例外処理をちゃんとできていると呼ぶだろうか?
855 名前:デフォルトの名無しさん [] 投稿日:04/03/25 15:24
なんか変なカキコばっかしだな。
856 名前:デフォルトの名無しさん [sage] 投稿日:04/03/25 18:27
copy()みたいに可変個の引数を渡せる関数をつくりたいのですが、どう宣言すればいいのですか?
857 名前:デフォルトの名無しさん [] 投稿日:04/03/25 18:55
引数を 省略できるってこと?
copyのソースを見てみれば?
858 名前:デフォルトの名無しさん [sage] 投稿日:04/03/25 18:58
procedure foo(items: array of string);
とかじゃなくて?
859 名前:デフォルトの名無しさん [sage] 投稿日:04/03/25 23:19
引数の数とかで変えるのがオーバーロードちゃうん?
860 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 00:10
>>859 それを「可変個の引数」と言うのか?
861 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 00:23
>>860 856にとってはそれが「可変個の引数」。
862 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 11:30
突然ですが。
変数名を決めるとき、皆さんどーしていますか?
Pascal規則っていうのがあるそうなのですが、
ネットをめくっていっても、定義はこれ!というものがありません。
ハンガリアンの規則に準じて、変数名の最初を大文字にするってことなのかと
推測していますが、いまいち不確かです。
Pascal規則を知ってる方、書き込み願います。
(これに反してハンガリアン規則の解説が多いこと。。)
868 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 15:47 case c of 0 : CheckBox1.Checked := False; 1 : CheckBox1.Checked := True; end; case t of 1 : CheckBox2.Checked := False; 0 : CheckBox2.Checked := True; end; case b of 1 : CheckBox3.Checked := True; 0 : CheckBox3.Checked := False; end; これだとなぜか、下の二つのcase文が上手く動作しません。 例えばbの値が1でも、CheckBox3.CheckedがFalseになってしまいます。。 オエライ方なぜか教えてくださいまし。。(;´Д`) 869 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 15:53 んなこたない。 ShowMessage(Format('b=%d', [b])); case b of 1 : ShowMessage('b=1'); 0 : ShowMessage('b=0'); else ShowMessage('b<>0, 1'); end; でどうなるか試してみろ。 870 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:01 0と1しかとらないなら、Boolean 型にしとけば、CheckBox1.Checked に 直接代入できると思うんだけど
871 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:03
こんなふうにもできる
CheckBox1.Checked := c = 1;
872 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:05
>>869 case c of の前に置くとb=1と二回表示されましたが、
case b of の前に置くとb=0と二回表示されました。。。
問題がある箇所はわかってきましたが、
なぜbの値が勝手に変えられてるのでしょうか。。
873 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:07
>>869 elseはendの後じゃないか?
874 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:08
CheckBox のイベントハンドラのなかで変数をいじってないか?
875 名前:868 [sage] 投稿日:04/03/26 16:13
>>874 あー、、すいません、、まさしくそれっぽいです。
CheckBoxのOnClickでいじられていたようです。
ヘルプ読んできたらわかりました。。
CheckBoxの場合Checkedが変更された場合にも
呼ばれるんですね。。
876 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:15
case 文の練習ならともかく、870と871も参考にしてね
877 名前:デフォルトの名無しさん [sage] 投稿日:04/03/26 16:20
>>876 はい、参考にさせてもらいます(´▽`;)
859 :
デフォルトの名無しさん :04/03/30 01:47
これからDelphi始めようと思ったんだけど、 Integerって書くの面倒なんでintと書きたいんだけど C言語の#define みたいなのって無いの?
>>859 何もしないのが一番面倒臭くないよ。
C言語やってたらいいんじゃない?
そんなあなたにCtrl+Space
862 :
デフォルトの名無しさん :04/03/30 02:56
>>860 そんな冷たい事言うなよ。
超初心者同士仲良く仕様やこの糞野郎
>>859 Type int = Integer;
865 :
デフォルトの名無しさん :04/03/30 05:46
procedure TForm1.Button1Click(Sender: TObject); var a:array[1..5] of integer; b:array[1..5] of integer; i:integer; begin for i := 1 to 5 do begin a[i] := 1; b[i] := 2; end; a[random(1)] := 3; caption := inttostr(b[5]); end; すみませんが、ちょっと上のプログラムを実験してもらえますか? OSはWINXPのホームでDELは6のパーソナルですけど これを実行するとエラーにならない上に、b[5]の結果が3になるんです。 こんな結果が出るのはうちだけでしょうか? せめてエラーが出てくれれば三日も悩まずにすんだのに・・・
ちなみに、random(1)の結果が必ず0で、a[0]という範囲外の場所に 書き込んでいるから、という原因はわかってます。 ただ、なぜエラーが出ないのかが・・・くぅぅ泣ける・・・一度寝ます。
バッファオーバーランじゃな。 {$R+}で範囲チェックが有効になるよ。
>>867 エラーが出ないのは
>>868 なぜその結果になるかは
i:=0;
a[i] := 3;
caption := format('%2d %8x %8x',[b[5], Integer(@(b[5])) ,Integer(@(a[i]))]);
うぉ、こんなに速く対応していただき、ありがとうございます。 ヘルプで{$R+} を調べさせてもらいました。これから活用します。
i:=0 or 1 みたいなのとxorの使い方が全く解らないのですが
どういう風に使うのでしょうか?
>>853-858 乙です
xor / 排他的倫理和 って演算がどんなものかは知っているのかな?
and or xor を整数型に使うと、論理型を一度に出来るようなものと考えればいい 利用例 if (x and 1)=0 then 偶数です x:= x or 3 ;<--- 4で割り切ると 3 が余る数になる xor は 1なら相手を反転するからこれを利用して a と bが等しいのを (a xor b) =0 これを応用して、 1) bのbitが1の場所だけ cに aを代入する 2) 入力スイッチのon/offが in 変数のビット情報として入る 各ビットが2度同じ時だけ採用せよ なんて事が並列に出来る
874 :
デフォルトの名無しさん :04/03/30 13:05
DelphiでVCから呼ばれるDLLを作成したいっす。 で、データモジュールを使っているのですけど、 ヘルプに「データモジュールのコンストラクタとのやり取りが不良になる可能性があるため,C++ で OnCreate イベントを使うことはお勧めできません(OldCreateOrder を参照)。かわりに,コンストラクタをオーバーライドすることをお勧めします。」 と書いてあります。(OldCreateOrder を参照)・・・参照しましたがわかりません。 「コンストラクタをオーバーライドする」・・・?overrideですよね? virtualではないですよね? なんかチンプンカンプンなんです。 やりたい事は、VCからCreate(引数なし)を呼ばれたらDelphiで作ったDLL内にあるデータモジュールを生成したいんです。 ご教授お願いします。
>>866 できれば0オリジンにして欲しかった予感
>DelphiでVCから呼ばれるDLLを作成したいっす。 あなたにはまだ無理です。 VCL のデータモジュールって VCL に依存しているから、VC から使うにはいろんなことを 知っていないと。ヘルプにあるのは C++Builder からの使い方だからね。
もしどうしても VC から VCL を使いたいのであれば ・別アプリにして起動。 ほとんど別アプリと言ってもよい DLL を VCL で作って呼び出す。という手もある。 どちらにしろ、入出力をどうするかをしっかり決める必要がある。 ・COM にして呼び出す。 VC/Delphi とも COM でインターフェースをとることができるから、細かい操作が必要なときには この方法も使える。
>>874 > やりたい事は、VCからCreate(引数なし)を呼ばれたらDelphiで作ったDLL内にあるデータモジュールを生成したいんです。
このCreateが何を指すのかわかりませんが
コンストラクタのオーバーライドは以下のようにします.
type
TMyDataModule = class(TDataModule)
public
constructor Create(AOwner: TComponent); override;
end;
実装:
constructor TMyDataModule.Create(AOwner: TComponent);
begin
inherited; // 親クラスのCreateコンストラクタを実行する inherited Create(AOwner); としても可
// 以下,追加すべき初期化処理を書く
end;
879 :
デフォルトの名無しさん :04/03/30 15:25
>>878 さん
ご親切にありがとうございます。オーバーライドの方法はわかりました。
しかし、僕の説明不足で・・・。
もう一度よろしいでしょうか?
・delphiでDLLを作成する。
・このDLLはVCで使用する(VCから呼ばれる)。
・DLL内にはデータモジュール(class)がある。
DLL内にグローバル関数を作成し、それをVCから呼び、結果を得る事は出来ました。
次に、class(データモジュールです。DLL内で非ビジュアルコンポーネントが使いたいので、それを貼り付けてあります)
を生成して、必用な初期化を行いたいんです。
わかっていない所は、
・VCからこのclassを生成する場合、どのように生成すればいいのか?
DLL内にグローバルなCreateという関数を用意し、この中でデータモジュールを
生成するのか?もしそうだとした場合、データモジュールにあるOnCreateイベントの
引数、(Sender:TObject)には何を指定すればよいのか?
・VCからこのclassを生成する場合、直接、データモジュールのベントにある
OnCreateを呼ぶ事はお勧めできないとヘルプに書いてあるので、オーバーライド
する必用がある。オーバーライドするという事は、データモジュールのベントに
あるOnCreateは使用せずに、自分でconstructorを作る必用があるのか?
その場合、引数はどうなるのか?
という所がよくわかっていません。どうやってよいのかわからないので、
説明不足な点があると思います。指摘して下されば追記しますので
どうぞよろしくお願いします。
イベントハンドラの仕組み、インスタンスの作り方、関数とメソッド、なんか基本的 なことが分かってないような。VCから見えるのはエクスポートされた関数だけ。
一つ質問してよろしいでしょうか? なぜVCで作ろうと考えないのですか?
882 :
デフォルトの名無しさん :04/03/30 15:56
そうですね、基本的な部分もわかっていないです。本当はは基礎を固めてから 行いたいのですが時間がなくて・・・。 ただ、イベントハンドラの仕組み、インスタンスの作り方、関数とメソッド、 ここらへんはわかっていると思うし、VCから見えるのはエクスポートされた関数だけ というのも気持ちわかっている気でいます。 今、自分が作りたいDLLというのには親になるクラスがないような気がするんです。 親になるクラスがあれば、Create時の引数とかわかるのですが、親がいないのに・・・ なんて考えてしまってます・・・。 知識不足ですみません。
883 :
デフォルトの名無しさん :04/03/30 16:01
>>881 本当はVCでもよかったのですが、
もともとdelphiのアプリケーションだったんです。
そしたら、今度はインターフェース側がVCで、今までdelphiのアプリケーションだった
ものをDLLとして使用する。
というように方向性が変わってしまって・・。
今後の事もあるし、VCで作成するのもいいけど、とりあえずdelphiで作成しておきたいという部分もあります。
> 親になるクラスがあれば、Create時の引数とかわかるのですが、親がいないのに・・・ 普通のアプリでは TDataModule は TForm1 と同じように Application を オーナとして作られる。DLL でも Application をオーナとして作ればいいのでは?
フォームを表示するDLLは、フォームのオーナにApplicationを設定して作られる。 DLLではウィンドウなしのApplicatiionオブジェクトが自動で作られる。
886 :
デフォルトの名無しさん :04/03/30 16:58
DLLではウィンドウなしのApplicatiionオブジェクトが自動で作られるんですか、 勉強になりました。ありがとうございます。 えと、とりあえずこんなのを作ってみました。DLL部分です。 動作確認は、今の所、VCではなくdelphiでインターフェース側も作成し確認しています。 で、動いちゃってます。やってる事なんですが、普通じゃないでしょうか? このクラスのメンバ関数Testですが、これは上記のようにエクスポートする関数(上記ではCreateTestやFreeTestというexportしている関数)を1つかましてアクセスしないとダメなのでしょうか? public procedure Test; stdcall; export; としたいのですが・・・。試してみましたがクラス内にある関数をexportできるかボケ!と怒られました。ダメダメですみません。 プログラムは↓です。
887 :
デフォルトの名無しさん :04/03/30 16:59
library A; −省略− exports CreateTest, FreeTest; −−−−−−−−−−−−−−−−−−−−−−−−−−−− unit B type TDataMdl = class(TDataModule) : public procedure Test; end; procedure CreateTest; stdcall; export; procedure FreeTest; stdcall; export; var DataMdl: TDataMdl; : procedure CreateTest; begin DataMdl:= TDataMdl.Create(Application); DataMdl.Test; end; procedure FreeTest; begin DataMdl.Test; DataMdl.Free; end;
> 試してみましたがクラス内にある関数をexportできるかボケ!と怒られました。 ラッパー関数を作ってエクスポートして下さい。(笑
C++とかでNEWやDELETEするみたいにボタンとかのオブジェクトを動的に生成、削除ってどうやるんですか? そのオブジェクトへの名前の付け方とかも。
890 :
デフォルトの名無しさん :04/03/30 17:28
>>888 それって↑の例でやってます・・・。よね?違いますか?
ってか、ラッパー関数使うしかないって事ですか?
891 :
デフォルトの名無しさん :04/03/30 18:03
Win2K環境で、簡単にI/Oポート(たとえばプリンタポート)を読み書きする方法はありますか?
Delスレで、Win2K環境の質問をする意味はありますか?
893 :
デフォルトの名無しさん :04/03/30 18:07
>>890 クラスのメソッドをそのままではエクスポートできない、ということでしょう。
CreateTest や FreeTest のなかではなく、単独で呼び出される場合のことだと思う。
if Assigned(DataMdl) then DataMdl.Test;
とかね。DataMdl.Free; も FreeAndNil(DataMdl);
にしたほうがいいね。
894 :
デフォルトの名無しさん :04/03/30 18:56
なんとなくわかってきました。あともうちょっとという感じです。 ある程度作ってみて、もう少し悩んでみます。で、VCはもっとわかりませんが、とりあえず動作するようなものを作ってみて試してみます。 みなさまどうもありがとうございました。 またわからなくなったらご教授お願いします。
教えてください。 TMemoのCanvas上で、 指定したpixel[x,y]が○色だったら、△色に変える。などを高速にやりたいんですが、 BitmapのScanlineみたいに、高速に色々出来る方法無いですか?
ないです
TMemo にはそもそも Canvas がない
すみませんでした。 他のCanvasがあるコンポーネントの場合では、出来ますか?
見えているところなら、同サイズのTBitmapのインスタンスに写し取ってから、加工して また貼り付けたらいいんじゃないの?
今自分の書いてるものが、 899さんの言う方法でやってるんですが、 何か写し取らないで済む方法があったらあやりたいと思った次第で 質問させて頂きましたが、無いようなんで諦めます。ありがとうございました。
ScanLine というのはビットマップ特有の構造に依存してる。Canvas は画像そのもの ではないので、ScanLine に相当するモノはもってない。Canvas 間の画像のコピーは BitBlt()をラップした CopyRect() などを使うと高速で実行できるので、オフスクリーン ビットマップに写し取ってから加工するという方法は、かなり一般的だよ。
>>872 一応ヘルプは読んだのですが意味解らんでした
>>873 どうしてそうなるのか自分で試してもよくわからなかったです
どうやら論理演算子とビット演算子というのが理解できてないみたいです
2chブラウザのOpenJaneがオープンソースだということでdelphiを始めてみました。 プログラムに触れたことは初めてです。 初歩的な質問なのですがデバッグのやり方が詳しく説明をされているHPなどは御存じ無いでしょうか? OpenJaneで書き込みをしてみたところエラーダイアログがでるのですがその内容の意味すら分からないので エラーダイアログの意味やバグを起こしている部分を探すやり方などを知りたいです。 よろしくお願いします。
>>891 ありますよ。
GWIOPM と GIVEIO が有名です。
私はGWIOPMを使っています。 GWIOPM.pas をuses して
GWIOPM_Driver.:=TGWIOPM_Driver.Create;
Status:=GWIOPM_Driver.OpenSCM;
Status:=GWIOPM_Driver.Install('' )
Status:=GWIOPM_Driver.Start;
Status:=GWIOPM_Driver.DeviceOpen;
を順に実行
if ERROR_SUCCESS = Status then
begin
GWIOPM_Driver.LIOPM_Set_Ports(sadr, eadr, true); <-プリンタポートの開始アドレス 終了アドレス
GWIOPM_Driver.IOCTL_IOPMD_ACTIVATE_KIOPM;
GWIOPM_Driver.DeviceClose;
end;
GWIOPM_Driver.Remove;
GWIOPM_Driver.CloseSCM;
とやれば I/O命令がその部分だけ使えるようになります。
Win9x系ではこのサービス呼び出しが失敗しますがどうせI/O命令はそのまま使えるので両方で動くプログラムになります
I/O命令 バイト入出力命令を使う方法は function PortIn( adr:integer): integer; asm mov edx,eax xor eax,eax in AL, DX; end; procedure PortOut( adr,dt:integer ); asm XCHG eax,edx out DX, AL; end;
>>895 TMemoにはCanvasが無いから、その変更したい位置のデスクトップDCを取得して
そこに描画するとかXORとかをかければ一瞬色は変えられるよ。
文字を編集したりすれば元に戻っちゃうけどね
>>889 ttp://hp.vector.co.jp/authors/VA014436/prg_memo/delphi/c_d.html ボタンの場合は
var btn:TButton:
begin
btn := TButton.Create(self); <- フォームのメソッドで書かれる場合はself でなければ親を指定
//親が無ければ selfはnilでもいいけど、その場合自分が管理しないといけない それにボタンは単独では存在できないので窓が必要
その後、
btn.Parent:=self; //Createの引数はメモリを管理してくれる所、これはどの窓に属するボタンかを示すために必要
後は、サイズや表示位置や表示するかどうかとかCaptionとかを指定する。
動的に作ったボタンは名前を付けなくてもいい。自分で変数名 例:btnで管理すればいいから。
OSがインストールされた日付や時刻を知る方法はありますか?
GetSystemDirectory とかのフォルダーの作成日付で代用してみたら?
はあ、なんか最近Delphi調子悪いな… 起動→とりあえず全て保存→何故かアドレス読み込み違反 なんだかなぁ…
一度
del /S *.tds
del /S *.~*
del /S *.dsk
del /S *.dof
del /S *.dsm
del /S *.dcu
del /S *.DBG
del /S *.$$$
とかを実行してみたら?
>>912
>>912 IDEにインストールされてるコンポーネントで、自作物のチェックを一つづつ外してから同じ事をして確認。
原因コンポが判ったら、それを再コンパイルしてみるとか、諦めるとか、デバッグするとか
Delphi6Personal使用者です。 ポップアップメニューで、特定のフォルダの内部に置かれたファイルを 操作したいんですが、メニューをフォルダやファイルに対応させた 構造にする方法が分かりません。フォルダの構造を解析して、 フォルダやファイルに対応するメニューを作成すれば良いんでしょうが その方法がよく分かりません。 どうすればいいんでしょうか。 ご教授お願いします・・・。
>>915 すまんが、言ってる内容の絵が浮かばない。
FindFirst,FindNext,FindClose 再帰処理
>>915 ・ディレクトリの中身を解析するにはFindFirst関数(FindNext,FindClose)を使う
・実行時にメニュー項目を増やすには
TMenuItemのインスタンスを作りCaptionとOnClickプロパティを設定、
追加したいMenuItemのAddメソッドでそのインスタンスを指定する。
>>916 済みません、915は何か分かりにくいですね。
要はWindowsのスタートメニューやIEのお気に入りのように
メニューからプログラムフォルダ内のショートカットを立ち上げたりとか、
Favoritesフォルダ内のURLファイルを立ち上げたりとか、そういう風な
処理をしたいんです。
どうすればいいのか全く見当がつかないので、とりあえずメニューを
起動時に作成する処理を検索して見つけたソース↓
ttp://forum.nifty.com/fdelphi/faq/00138.htm を元に適当に作ってみたのですが、
メニューを追加する事は出来たのですが、サブメニューを追加しようとすると
デバッガで「未定義の識別子:'Menu1'」と怒られてしまいます。
自分で言っておいて難だけど、 再帰処理で末端までファイルスキャンして一気にメニュー項目作る方法はあまり良くない。 (もの凄い時間がかかるし、リソースも無駄遣い) 「ディレクトリ」であるメニュー項目をポップアップした瞬間に、 直下にあるファイルのみをスキャンしてサブ項目を作成、これを表示させる方が良いと思う。 しかし、これがDelのVCLの機能だけではこういう事が出来ないんだ… VCLのオーナードローイベントを流用する裏技もあるが、これはこれで面倒だし。
ポップアップメニューにせずにListViewにフォルダ内のファイル一覧を表示とかは駄目?
というより
>>920 の説明を見てさらに分からなくなった。
>>917 >>918 どうもありがとうございます。
参考にさせていただきます。頑張ります。
>>919 ええ?・・・もしかして結構難しい処理なんでしょうか?(;´Д`)
初心者なんでかなり不安です・・・。
サブメニュー作っておかないと右向きの三角出てこないし 作っておくには下のフォルダ見に行かないと行けないし メニューアイテムにはonダブルクリック無いし 辛かったよホンマ。
>>922 どうもポップアップメニューという事が混乱の元になってるような気が・・・。
実は自分が作ってるアプリはメニューの代わりにツールバーを
使用してて、ツールバーのボタンを押すとボタンの上にポップアップメニューが
出てくるようにしてるんです。
単にメニューで出来る事を、ポップアップメニューで肩代わりしてるだけなんです。
ListViewなら簡単に出来そうですね・・・うう、誘惑に負けそう。
やっぱりどうも絵が見えてこないんだが…。 やりたいことは、その方向じゃないと出来ないのかな? 「ダイアログで開いて(?)何かする」って方向はダメなんかい?
状態をキャッシュし通知イベントで更新するのもよいが、シェルインターフェイスが標準である予感。
最善の方法をよーく考えよ〜、お金は大事だYO 漏れには少し絵が見えてきたかもしんない。 IEの[お気に入り(&A)]をクリックした時に出てくるメニューみたいなのをつくりたいって意味だよね? 違ったらもうだめぽ >単にメニューで出来る事を、ポップアップメニューで肩代わりしてるだけなんです。 宿題か何か? その方法を選んだ理由をきぼんぬ。 特に意味がないなら他の方法でええんじゃないかな
たぶん マイコンピュータ とか フォルダを画面端に持っていって ドロップするとでてくる奴だとおもう。
すまん。純粋に煽りでもなんでもなく、
>>929 のも分からん(^^;。
とりあえず、質問主は「他の代替法でも可って話」なら、一考すれってことで。
>>903 ありがとうございます。なんとなく理解できました
Canvasへの描画について教えてください。 白白白白白白白白白白白白 白白赤赤白白白青青白白白 黒黒赤赤黒黒黒青青黒黒黒 ←こんな線を描く事は出来ますか? 白白赤赤白白白青青白白白 (背景と違う色を避ける線を描きたい) 白白白白白白白白白白白白
935 :
デフォルトの名無しさん :04/04/01 20:06
マ板の談話室から来ました。 Delphi 6 Personal を使っている初心者です。 標準電波を受信して、PCの時計合わせをするアプリを考えています。 受信機とPCはシリアルで繋ぐ予定ですが、 恥ずかしながら肝心の時計合わせの方法が分かりません。 Personal版のせいか、RecodeSecondやSecondOfが 使えないようなのです。 どなたか解決法をご教示いただけないでしょうか。 マルチになってしまいましたが、よろしくお願い致します。
>935 とりあえずusesにDateUtilsを追加してみる。
>>928 >IEの[お気に入り(&A)]をクリックした時に出てくるメニューみたいなのをつくりたいって意味だよね?
あ、そういう事です。そんな感じです。
>その方法を選んだ理由をきぼんぬ。
フォームの上に、メニューとツールバーの二列があると無駄に場所を取ってるような
気がしたので、メニューを作らずに、メニューの代わりにツールバー上のボタンを押すと
ポップアップメニューが出てくるようにしました。
でも確かに素直にメニュー使った方が楽ですね。
>>933 あ、ありがとうございます。早速使ってみます。
>>936 ありがとうございます。DateUtils追加で SecondOfなどが使えるようになりました。
あと、Windows APIのSetLocalTimeというのを使わなければいけないのですね。
最初バグっていて、1899年になってしまったのにはビビりましたw
>>937 いや、そういうことじゃなくてw
940 :
デフォルトの名無しさん :04/04/01 23:35
突然ですが、質問です。 プログラムを始めようと思っているのですが、C言語かC++言語にしようか 迷っています。ですが、友達からC++のソフトMicrosoft Visual C++ 6.0を 貰って、それをインストールしました。 これでも、C++のソフトでもC言語はできるのでしょうか? あと、他にイイ言語があれば教えてください。 よろしくお願いします。
日本語
。・゚・(ノД`)・゚・。なんでここできくんだー
943 :
デフォルトの名無しさん :04/04/01 23:52
2ちゃん初心者です☆すんません(ノ_・、) ぐすん。。 どこで聞いたらいいからわからなかったので、 とりあえず、相談室って書いてあったので、書き込んでみました。
とりあえず、CやC++って書いてるスレにしてほしかったなw まぁ、ここに来たのも何かの縁 Delphiやってみない?
945 :
デフォルトの名無しさん :04/04/01 23:56
それってなんなんですか?聞いたことがないんですが・・・
「相談室」の前に書いてるやん… Winプログラミング言語の一つ
釣り。 スルー。
Delphiいいよ 個人的には、ひまわり、HSP、VB、Delphiの中では一番感触良いと思う
949 :
デフォルトの名無しさん :04/04/02 00:02
なるほど。たくさんプログラミング言語があるんですね。 で、Delphiっていうのは難しいんですか? パソコンを触って1年ぐらいで、あまり知識がないと思ってるですが・・・
超初心者には一番向いてるんじゃないか とは思う。
>>949 Delphiいいよ
噛めば噛むほど味が出る
しかもPersonal版はフリー(無料)
952 :
デフォルトの名無しさん :04/04/02 00:06
マジですかっ!? それは是非教えてほしいです! 詳しく、教えてもらえませんか? 時間があればでいいので お願いします
つーか、クソマルチに反応するなよ。
どうしても初心者から抜けだせん・・・ハァ(・_・ )
下手糞の上級者への道のりは 己が下手さを知りて一歩目 クラス設計下手すぎ_| ̄|○
910です。答えありがとうございました。
inheritedに関して教えてください。 例えば、他のコンポの継承クラスを作る場合、Constructorと、Desructor それぞれでinheritedする必要があると思いますが、これは自分自身(継承 元)をいじる場合以外には、基本的にinheritedはConstructorとDestructor 内の最も最後で行えばいいんでしょうか? Destructorは特に流れからいうと、一番最後にinheritedすればいいように 思うのですが・・・ あと、TObjectの継承クラスの場合には、Createでinheritedしていない サンプルが多いように思いますが、TObjectの継承クラスの場合は Createでinheritedしなくてもよい(してもよい?)んでしょうか。
>>960 コンストラクターは最初にいんへりっど
デストラクターは最後にいんへりっど
でやってりゃあ間違いない。
>>960 >あと、TObjectの継承クラスの場合には、Createでinheritedしていない
>サンプルが多いように思いますが
TObjectのconstructorであるCreateは仮想メソッドじゃないからoverride出来ない
つまりinheritedは意味が無い
しかしTObjectのdestructorであるDestroyは仮想メソッドだからoverride出来る
つまりinheritedは意味がある
なんでDestroyが仮想メソッドかはどこかで説明があったはず
どわすれしたので、その辺は探しておくれ
あ、たぶんTObjectのDestroyを仮想メソッドなのはFreeで呼ばれるからと思う 今、ソース見ておもた //引用TObject.Free procedure TObject.Free; begin if Self <> nil then Destroy; end; 違ってたら、偉い方よろしく
なるほど〜inheritedの使い方がわかりますた。 了解です。ありがとうございました。
Indy9 のTIdHTTP を貼り付けるとアプリを起動して終了するだけで メモリリークが発生(MemCheck で確認)するんですが 何とか回避できないでしょうか?
ソースをいじれ
>>962 inheritedを使うのに仮想メソッドであるかどうかは関係ない。
コンストラクタでinheritedを使うのは親クラスの初期化処理を任せるためだ。
TObject直下のクラスがコンストラクタをinheritedしないのは
TObject.Create自体に処理がないから省略しても問題ないと言うだけのこと。
ActiveXの取り込みでMSXMLをインストールしようとしているのですがリストにMSXMLがありません どうすれば出るでしょうか? IE5SP4+XML4SP2
>>967 おお、ほんとだ。。。
ちょっとテストしたら、確かに仮想メソッドかどうかなんて関係有りませんでした・・・
また一つ勉強になりました
ありがとう
970 :
デフォルトの名無しさん :04/04/03 17:33
なぁ、きいてくれ DelphiWorldにあるDBCloneCtrlGridちゅうのを使って開発してたんだが いざ、開発終了間近になって、MemCheckにてメモリーリークがないかチェックをしたのよ そしたらDBCloneCtrlGridがリークしてるのよ・・・ しかもとんでもない数のリーク量・・・ DataSetをOpen,Closeするだけでどんどん増えていく・・・ なぁ、神よ、、お馬鹿なわしは直すことができない どうか力をかしてくれまいか・・・
そのコンポ使ってないから何とも言えないが 公開されてるコンポにエラーがあるなら作者に通報すべき くれぐれも勘違いで先走らないようになw
いや、それがもうDelphi使って無いらしくて サポートできないと言われました・・・ はぁ、まじ鬱だ、、自分の技術力の無さに・・・
>>970 メモリリークなんてほとんど修復不可能じゃん。
あきらめてそのコンポを使うのやめれ。
わかりました・・・ あきらめて、他を探してみます 返答、ありがとうございました
>>972 > いや、それがもうDelphi使って無いらしくて
> サポートできないと言われました・・・
見てみるから、ソース頂戴って言ってみたら ?
次スレ立てます。
>>975 実はソースはあるのですが
ほんとかなりの量で、しかもDataBase系のコンポ・・・
DataLinkとかなにやら聞いたことのないものから継承してて・・・
今日もしばらく見てみましたが、けっきょくわからず・・・
ただただ、私の技術がないのを再確認しただけにいたりましたです・・・
>>979 > ただただ、私の技術がないのを再確認しただけにいたりましたです・・・
なら、あきらめるしかなかろ。
アイコンをタスクバーにもアイコントレーにも表示させないように するにはどうすればいいですか?
TListViewのColumnを実行時に増やすにはどうすればいいですか?
>>983 var
NewColumn: TListColumn;
(中略)
NewColumn := ListView1.Columns.Add;
NewColumn.Caption := '見出しだ';
…みたいな感じで.
ありがとうございますた。
986 :
デフォルトの名無しさん :04/04/06 01:02
>>970 今のPCはメモリいっぱい積んでるんだから気にするな。
クライアントで動かすんなら就業時間しか使わないから、日々PC再起動で問題ないでしょ。
あとでこっそり直しとけ。
ソース見て直せばいいのに。 俺だったら嬉々としてやるね。
ソースがあって、Open,Closeするとリークするって解かってるんなら 結構簡単に治るかもよ。
まず、リークしてるオブジェクトを特定する VCLオブジェクトならNameやClassNameから検索できるだろう
質問です。 FindClose関数を呼び出すと必ずTSearchRecが引数になっている方が 呼び出されるんですか? Windows.pasにWin32APIのFindCloseの定義が書かれていますが こちらを呼ぶ場合は毎回Windows.FindCloseなどのような書き方を する必要があるんでしょうか。 よろしくお願いします。
FindClose() は、SysUtils.pas、そして、Windows.FindClose はいうまでもなく Windows.pas にある。コンパイラは uses 節の後ろのほうから探すので、上記の pas の順番を入れかえると、Windows.pas のほうが優先される。しかし、ほかにも API とダブってる関数やメソッドがあるので、順番の入れ替えはしない方がいい。 毎回 Windows.FindClose() のように書くのを勧めます。
なるほど、よくわかりました。 誠にありがとうございました。
BCBでわざわざGraphics::TBitmapと書くのが面倒です。
そうだね、Windows の TBitmap はレコード型だったね。Delphi では普通、 uses 節の前のほうに Windows があるので、クラスの TBitmap はそのままで 使えるね。
なぜこのスレにBCB
typedefで書きやすい名前にしるぇ
>>リーク直せない(´・ω・`) そういうときこそGarbage Collectionコンポの導入ですよ 昔どっかに落ちてて拾ったょ
999
⊂⌒~⊃。Д。)⊃
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。