1 :
デフォルトの名無しさん :
02/11/13 09:19
2 :
デフォルトの名無しさん :02/11/13 09:19
3 :
デフォルトの名無しさん :02/11/13 09:20
FAQ Q D6パーソナルにアクションマネージャーは? A ありません Q D7Proヘルプアップデートしたらハイパーリンク無くて使い難い A D7Extヘルプを一緒に落としてコッソリ使いましょう
掲載リンクは googleヒットの先頭から選んだもので、恣意的なものではありません。
すれ立て乙 統一の話はどうなったんだろ。
お疲れ。 それにしてもDelphiって本当に糞言語だな
> それにしてもVBって本当に糞言語だな あのーここDelphiスレですが・・・
>統一の話はどうなったんだろ 2chのシステムとして、使わないスレは勝手に下がる のだから、不要なら使わなければいいだけでは?
>>5 >A D7Extヘルプを一緒に落としてコッソリ使いましょう
D7 Ent(erprise) の間違いだな?
13 :
デフォルトの名無しさん :02/11/15 18:26
今日賢くなった事 age 構造体配列定数の定義 type THoge = record a:string;b:string; end; const AHoge:array[0..2] of THoge=( (a:'こう' ; b : 'いう'), (a:'ふう' ; b : 'に'), (a:'構造体メンバ目' ; b : 'が必要'));
14 :
デフォルトの名無しさん :02/11/15 21:11
ゲームプログラムをしているのですが、描画内容の計算は1/30秒ごとに行い、 Application.OnIdle で暇なときに描画関数を呼び出し、というのをやっています。 が、このOnIdleというのはCPUに余裕があるときに発生すると聞いたのですが、 完全に暇なときなのでしょうか、それとも100%以外という意味なんでしょうか。 もし前者なら、描画できる余裕が少しあるのに描画できない、後者なら 描画を始めた時点で100%に達してしまい、終わるまで次が描けない → 描くのに1/30秒 以上かかるときに描画が等間隔にならない、と考えたのですが・・・。 理想は、通常は30fpsで描画して、維持できなくなったら徐々にfpsを減らしていく、 という形なのですが、いいアイデアは無いモノでしょうか。
つまりPCの状態にかかわりなく優先的に処理して欲しいわけか
>>14 18fps(55ms間隔)でよければOnTimerイベント内で処理するのがいいよ。
呼べなきゃ呼べるようになったときに呼んでくれるから。
OnIdleはそういう目的では使わないよ。
というか素直にDirec(略
>>14 「CPUに余裕があるとき」じゃなくて何の処理もしてないとき。
これはwindows全体の話ではなく、あなたのプログラムが何の処理もしてないときに呼び出される。
(つまり、メッセージループに入っていて、かつ処理するべきメッセージがないとき)
CPUの負荷はあまり関係ない。
OnIdleはメインスレッドにメッセージがこなくなったら発動するんだと思う。 だから後者かな。 俺はゲームの経験はないんだけれども、fpsを気にするようなゲームでは、 メインループは独自に書いたほうがいいと思う。こんな感じ?↓ while GameIsOn() do begin if PeekMessage(...) <> 0 then ProcessMessages(...)<-もしVCLにウィンドウメッセージを処理させたいなら。 <描画とか、時間測ってsleepとかで調節したり...> end;
while True do begin now := GetMilliSecond; calc; if realtime < processtime then render else NanoSleep(調整); Inc(processtime, GetMilliSecond - now); Inc(realtime, 33); end;
なるほど、勉強になりました。
OnIdleは自分が何もしていないときに呼ばれるんですね。
ゲームといってもシミュレーションに近いので、数値計算は一定時間おきに行って(MMTimer使ってます)
計算結果をボンボン放り込んで、描画はそれを取り出しながら維持できる最大のfpsで行いたい、って感じですね。
うーん、やっぱりOnIdleは使うべきではないのかな・・・。
(負荷が増えると描画間隔が不定になるので、見てて気になるんです)
>>20 参考になります。
えっと、描画が終わるまでsleepして最大33ms間隔で描き続ける・・・でしょうか。
sleepは使ったことがないんですが、全体が止まってしまうということはありませんか?
(すみません、スレッドとか扱ったことがなく、よく解らなくて・・・(´・ω・`))
もう一個mmtimer使って、そっちで描画やったら?
mmtimer(マルチメディアタイマー)は実は別スレッドなので、 マルチスレッドを意識しないで使うとバグの温床になります。 つか、最近それでハマった・・・・・・。
24 :
デフォルトの名無しさん :02/11/16 18:50
アセンブラのようなものを作ろうとしています。 そのフィールドを表現する方法として 案1: type TOpFld = record LAB , OP , SRC , DST , Cmt:string; end; 案2: type TOpName=(opLAB,opOP,opSRC,opDST,opCmt); type TOpFld = array[TOpName] of string; があると思います。 案2だとループ等の処理が容易なので魅力なんですが、普通はどうやります?
record / 構造体の代わりにクラスを定義。 ループだろうが文字列によるインデクシングだろうが何でもできる。
26 :
デフォルトの名無しさん :02/11/16 20:04
MapDKという地図開発ツールをDelphiで使っている方いらっしゃいますか? Delphiでどうやれば使えるようになるのか知りたいのですが。。。
>>25 そりゃまあ、何でも出来るけど、メンドクサイ面が多くなりませんか?
単に一時的に保存するだけでメインでない部分でクラスを使うのは・・・・
>>26 知らないんだけど ActiveXみたいだから コンポーネント->ActiveXの取り込みで動くんじゃないの?
レコードだと一気に全部ファイルへ書き出せるのにクラスだと ファイルに書き出すのが面倒
>>28 う〜ん、試してみたんですけどAcitiveXの取り込み->コンパイルで
エラーが発生してコンパイルできないんですよ。
でも、MapDKを使用して製品を開発している会社の紹介では、
Delphiを使っているというところもあるみたいだし。
>>30 確かに、タマにあるよね。 手直ししないと使えない事が。 昔は IEコントロールがそうだったような気がする。
エラーメッセージはどんなの?
>>29 そうだね。バイナリならそのまま書き出せるけど・・・文字列だからなあ
結局 こんな所で悩んでもしょうがないので、2の配列型にしました。
その方が面白そうだし
>>24 速度いらないなら行全体を文字列として保持すればいいし
速度最優先なら一命令一クラス割り当てて
文字列を適切な型(アドレス・レジスタ等)にキャストしてセットすればいい。
文字列配列はその中間だけど列挙型がない方が柔軟な記述ができるから
type TOpFld = array of string;
でいいんじゃないの。
>>31 レスありがとです。
会社行かないとエラーメッセージは確認できないです。残念。
いろいろいじってみますね。
>>35 面白そうだね。
ただ、古いTPスタイルのコードみたいだから
Delphiスタイルに変更してしまいたいな。
それからGUI付けたい。
>>35 こういうのを若い人にやって貰いたいな。特にフサギコに。
>>23 がちょっと気になる・・・mmtimerだけ論理的に別空間で動いてるってこと?
特に意識せずに使ってるけど、なんか覚えておかないとまずいのかな・・・。
「論理的に別空間」ってのはよくわからんが、仮想メモリ空間は同じだぞ。 何が問題かというと、たとえばあるポインタがnilかどうかチェックしてからそのポインタを 逆参照するようなプログラムで、nilチェックしてから逆参照するまでの間に別なスレッドが そのポインタをnilにしてしまうとバグるとかそういう話。 TThreadの使い方、特にSynchronizeメソッドあたりの使い方を勉強しる。
41 :
デフォルトの名無しさん :02/11/17 20:55
>>38 DIpasdocにそのソースを入れてコンパイルしなおしたんだけど
特に今の所日本語が通らない事はないみたいだけど?
PanasonicのHDカーナビのCMで 今日何に食べる? ナポリタンナポリタンナポリタン〜 イタリアンね みたいな会話がある… どうみても ( ゚∀゚ )ぱいそんぱいそんぱいそ〜〜ん のパクリだ…
JavaのinterfaceみたいにDelphiのinterfaceを気軽に使いたいんですが 何かいい方法はないでしょうか? どーもごちゃごちゃして汚くなるのと、メモリ管理が参照カウント方式になるのが わけわからんのです。 ためしに_AddRefと_Releaseを単に-1を返すようにoverrideしてみたんですが、 それはそれで間違っているような気がします。 var ti : IHoge; begin ti := SampleClass.Create; だったらti.Freeできないですし。 Javaだったらgcがあるからかまわないわけですが、どうやるのがDelphi的に正しいのかなぁ。
DelphiのinterfaceはCOM専用と思っておいたほうがいいよ。 Delでは自前のクラスにinterface使った事ないよ。
45 :
デフォルトの名無しさん :02/11/17 21:46
stringで、「何か」ってどう表せば良いんでしょうか? 意味不明でスマソ。
>>41 サンクス。しかしこちらの調べだと2バイト文字の影響を
食らいまくっているらしく。
・コメント中に2バイト目が{}がくる文字(”ボ”や”マ”)が
現れた場合はパースに失敗する
・2バイト目に@がくる文字(”ァ”)の後にlink等と書くと
タグであると誤認識する&文字化けする
StrByteType チェックを噛ましまくって暫定解決できた
版を作ったので、GUIとセットでソース置き場に上げときます。
しかしキモの部分に手を加えているのでエンバグ/デグレ
(特に既存他言語の処理で不具合)が起きている可能性が
極めて高いので御用心を。
>>44 多重継承みたいなことが必要になったときにはどうしてます?
そのような事態にならんように設計で回避ですか?
基本的なコトなんですが・・・ 1. 自分でprocedureを作って、Formの上の部品にアクセスしたいとき、 Form1.label1 とか絶対指定しないとエラーになるのですが、要するにそのprocedureが Form1を継承していないということなのでしょうか?何処かに指定がいるんでしょうか。 2. フォームの上に動的にimage1を配置したいのですが、それを見越して Form1.image1... というのをソースに書くと、そんなモン無いぞとエラーになります。 が、image1とだけ書くとコンパイルが通ります。何故なんでしょうか?
>>48 >1.
継承しているかどうかということではなくって
Form1を省けるのはTForm1自身のメソッドのみ。
>2.
いろいろ方法はあるけど
TForm1のprivate部分に
image1: TImage;
と書いておけばいいよ。で、FormCreateか何かで
image1 := TImage.Create(Self);
image1.Parent := Self;
としておく。
>image1とだけ書くとコンパイルが通ります。
これは別の何かを参照しているのでバグっぽいかも。
コンパイルが通るのはたまたま・偶然。
>>48 FAQっぽいわけだが。
誰でも通る道っぽいので、気持ちはわからんでもない
1.クラスは「型」。例えばおかしのクッキー型のように
TForm1という型でForm1と同じFormをぽんぽん作れるの。
ぽんぽん作ったクッキーはそっくりでその全てにLabel1があって、
例えばLabel1と書いてもDelphiはTForm1という型で作った
どのクッキーのLabel1の事を云っているのかわからない。
よって Form1.label1 と指定しなければならない
2.まずソースを見る。TForm1という型には image1 は
存在しない筈。存在しないものを指定すればエラーになる道理です。
image1 でエラーにならない理由だが、
手続き/関数のローカル変数として宣言してないか?
ローカル変数はその名の通り特定地域内(たとえば関数内)専用の変数。
要は〜.〜の形式ではアクセスできないわけ。
詳細はHELPのスコープの項をみてくれい
>>43 それでいいんじゃないですかね。
クラスとしての参照も保存しておいて、そっちでFreeかな。
var
t: SampleClass;
ti : IHoge;
begin
t := SampleClass.Create;
ti := t;
{ti使う}
ti := nil; {Free後_Releaseが呼ばれないよう参照を切る}
t.Free;
インターフェースに_Release以外の解放用メソッドを付けるのは、
解放後言語仕様により_Releaseが呼ばれてしまいアクセス違反を起こします。
自分は、クラス型としての使用をメインに、何かに渡す時だけインターフェースな
使い方もするので、最後はクラス型としてFreeです。
或いは、TComponentの様に、連鎖解放みたいな仕組みを作っておくとか。
52 :
デフォルトの名無しさん :02/11/18 08:06
>>46 おお、修正が早いね。
2バイト目の } は見つけたんで
function TTokenizer.ReadCommentType1(var t: PToken): Boolean;
var
c: Char;
label LP;
begin
ReadCommentType1 := False;
if (not CreateToken(TOK_COMMENT, t)) then Exit;
t^.Data^.AppendChar('{');
repeat
LP:
if (not HasData) or (not getChar(c)) then
begin
Exit;
end;
if (c in LeadBytes) then begin t^.Data^.AppendChar(c);GetChar(c);t^.Data^.AppendChar(c); goto LP;end;
if (c = #10) then
Inc(Row);
if (c = '{') then
WriteLn(GetStreamInfo + 'Warning: Found opening brace { within comment, nested comments are not supported.');
t^.Data^.AppendChar(c);
until (c = '}');
ReadCommentType1 := True;
end;
こんなふうに修正した所だけど、 2つ目は見つけてもなかったよ
C言語のsystem()に相当する関数って何かありませんでしたっけ・・・?
Windows.CreateProcess
>>49 >>50 ありがとうございます。
Form1が持つimage1と明示してやらないとだめなんですね。
で、気になったのが、onFormCreateでimage1を作ってやって、他のTForm1の
メソッド(たとえばForm.Button1.onclick)でimage1にアクセスすると通るんですが、
自分で単体のProcedureを作って(Form1のメソッドではない)その中でForm1.image1に
アクセスしようとするとダメでした。
後者は、その時点でForm1にimage1が無いのでダメなのは、ご説明で理解できました。
前者がなんで通るのかがいまいちで・・・。
http://www.geocities.co.jp/SiliconValley/1810/hoge.txt ← アフォでスミマセン(´・ω・`
>>39 TTimerと同じ使い方をすると原因不明の挙動で悩むことになる。
例えば、よくやるのがVCLのコンポーネントなんかにアクセスしてたりする場合。
基本的にはマルチスレッドプログラミングを適用すればよいので、
同タイトルのスレッドか、書籍やwebを見ればよいと思われ。
俺もデバッガのスレッドウインドウ見てて最近気づいた(駄目ジャン
48=55 は、結局、クラスとかOOPが我かっとランのね
>>57 そうだね。クラス、メソッド、フィールド、継承、self などを
しっかり勉強した方が、ここで対症療法を繰り返すより、
かえって上達への近道だと思われ。ヘルプを読むだけでも
いい
>>54 CreateProcessパラメータ多くて面倒すぎ・・・
ただdirとかコマンドラインから実行したいだけなのに。
ウワァァァンヽ(`Д´)ノ
WinExecという手があった。 推奨されないらしいけど。 cmd /c dirでできるね。 しかし微妙に思ったとおりの動作にならない。 コマンドラインアプリケーション作って、 cmd /c pauseってやったら 最後にEnter押すまで終了しないのが理想なのだが。
>>55 もうちょっとつきあおうじゃないか。
でも
>>57 >>58 の指摘は正しい。そのつもりで聞いとくれ
>>55 の例でimage1に出来るのはimage1がグローバル変数だから。
詳しくはHelpのグローバル〜とスコープの項を読み漁る事。
その上で、以下の質問に答えよ(解答はメール欄に書く事)
Q1:a〜iのうちproc1からアクセス可能なものを挙げよ。
Q2:a〜iのうちproc2から(以下略)
Q3:unit1をuses指定しているunit2のproc3から(以下略)
unit Unit1;
interface
type
TForm1 = class(TForm)
a: Integer;
public b: integer;
private c: integer;
protected d: integer;
published e: integer;
end;
var Form1 : TForm1;
f: integer;
implementation
var g: integer;
procedure TForm1.proc1; var h: integer; begin end;
procedure proc2; var i: integer; begin end;
clipboard := TClipboard.Create; begin clipboard.SetTextBuf(Pchar('a')); end; とやるのと、 Clipboard.Astext := 'a'; とやるのではどっちが良いのでしょうか?
あり、begin と end は抜かして下さい。
後者がいいよ。PCharなぞ見たくもない。
やっぱりそうですか。さんくすです
∧,,∧ マヅ ミ,,゚Д゚ミつ TClipボドのインスタンス生成イクナイ たぶん
前者見て、singletonのかと思ってソース見たら違うじゃん。 利用するだけなら、後者だな。 後者も後者で遅延生成されてるんだな。 proxyパターン?
∧,,∧ VCL標準の ミ,,゚Д゚ミ シングルdではなかったかと。 ClipbrdユニットClipboard関数みたらわかるです。
69 :
デフォルトの名無しさん :02/11/20 23:00
1 SHL 32 なんで結果が1になる?
実行前だから
>>69 型のビット長の余りだけシフトするからあってるよ。
「1」とだけ書くとintegerだから32ビットシフトは
0ビットシフトと同じ。
1 shl 32 = 1 shl 0 = 1
1 shl 33 = 1 shl 1 = 2
むしろ1でなくて何になると思ったのか聞きたい
ヘルプコピペから >x shl y と x shr y の各演算は,x の値を左または右に y ビットだけシフトする。 >これは x に対する 2^y の乗算または除算に相当し, 1 SHL 32 = 1*2^32 オーバフローしてゼロを期待していました。 じつは、 nビットマスク処理= 2^n のモジュラ演算として mask := (1 SHL n) -1; result := X and mask; と書いたのですが、 これが動かないので気付きました
>>73 ヘルプをそこまで読んだなら、なぜその後を読まない?
なるほど、 D6パーソナルのヘルプには書いてありますね。 D5proには無かった
>>75 げ、D5かぁ。確かに書いてないな。すまん。
C++中級者(仕事で使ってる)ぐらいの人が かんたんに、 Delphi勉強できるHPや書籍ってありませんか?
>>77 中級なら基本は付属のマニュアル等で十分だと思うがダメ?
>>78 Personalだっけ
無料の奴使ってるので。
付属マニュアル無いのです。
特に無いのなら、
明日、紀伊国屋で、立ち読み大会してきます。
気に入ったら買います。
∧,,∧ 書籍ならD6プログラバイブルが ,ミ ゚Д゚彡 C++/VBとDelとの対応表が載ってた ミ ∪ と思うです。 ミ〜,, ミ ∪ ∪ かなり詳細だったはづ
まさか付属マニュアル見るやつが居るとは思わなかった 言い訳にしてるだけか?
C++ → Delphi はチョイ前のC Magazine で特集組んでたよ 何月号だったかは忘れたが、割とページを割いていて分かりやすかった
>>43 >>51 なるほど〜.
実は最近インターフェイスを使い始めていて,
終了時にソースで追えないところでアクセス違反が出ていたので
どうしたものかと思っていましたが….
そこまでしてインタフェス使うメリットが感じられない。
>>80 さんや、Delフサギコさん の紹介サイトでなんとなくわかりました。
何か適当に作ってみて、慣れて見ます。
今日は忙しくて本屋いけなかったので、
次行った時にでも、D6プログラバイブル 見てみます。
ありがとうございました。
逆に、すべての自作クラスをInterfacedObjectから派生させて 参照カウント方式にメモリ管理を任せれば、メモリーリークと無縁の世界になれる? VCL系のオブジェクトはFreeしなきゃいけないから混乱しちゃうか。
Delphiのメモリ管理 ・Create/Free ・TComponentの親が子を開放 ・Interfaceのリファレンスカウンタ なんだかねぇ・・・
ちなみにInterfaceは循環参照するとリークが発生する。
>>61 すみません、超浅漬けで申し訳ないんですが勉強してきました。・゚・(ノД`)・゚・。
理論だけ見ても全く実感沸かないですね・・・実際に自分で書いて試してみます。
Formのメンバ、Unitの変数、スコープの認識がかなり曖昧デシタ・・・。
まぁ、C++でもメモリ管理は頭痛い問題だからしょうがないべ (shared_ptrなんかは若干使いやすいけど) いっそGC欲しいとも思わんでもないなぁ
ずっと思っていたのだが、 親が子を解放って事は st:=Tstringlist.Create(Form1); というような感じでクリエイトすれば Free しなくても Form1の終了時に勝手にメモリ解放してくれますか?
>>94 TComponentの派生クラスならそうだが
残念ながらTStringListにはOwnerはありませんにょ。
>>94 TStringListはコンポーネント継承ではないので、その管理機構を持っていません。
TObjectTray = class(TComponent)
public;
constructor Create(Parent:TComponent);
destructor Destroy:
function CreateStringList:TStringList;
end;
みたいなインターフェースで作るしかないかも
>>95 ガ━━━(゚Д゚;)━━━ン!ありがとうにゅ
勉強し直してくるにゅ
>>96 かなり解ってきました。
TmenuItem などはオーナーを TmainMenuにしておくと個別に解放する必要は無いわけですね。
>>96 かなり解ってきました。
TmenuItem などはオーナーを TmainMenuにしておくと個別に解放する必要は無いわけですね。
100 クソしてくる
保守
>>92 おしい。Q2、Q3とも a はアクセス可能です。
まぁ大体分かったと思うので精進してくれぃ。
103 :
デフォルトの名無しさん :02/11/24 00:09
HTTPから、MP3などのストリーミングデータを取り込んで、 ストリーム再生できるMP3プレイヤコンポーネントに渡す方法は 無いでしょうか? procedure OpenStream(Stream: TStream; StreamType: TMP3StreamType); で、渡せるみたいなのですが、サンプルコードではClientSocketから、 stream := TWinSocketStream.Create(ClientSocket.Socket, 2000); として、Streamを取り込んでいました。 これと同じ事をNMHTTP等から出来ないものでしょうか。
NMHTTP なんだから HTTP プロトコル以外は無理だろ?
∩| CLXでバグ報告&対応っす ミ ゙''゙゙゙つ ミ∧,,∧ 以前教えてもらった ミ,,゚Д゚彡CLXでfsStayOnTopなMainFormが U U 最小化/リストアするだけでどっか行方不明になる というバグ。Application.OnRestoreで FormStyleを変更するという対応だけでは不十分だったので調べました。 CLXはFormStyleを変更したり 最小化/リストアするだけでForm位置がかってに変わります。 ですので以下のようにする必要があります。 なぜこんなマジックナンバー(8とか46とか)になるのかは不明 タスクバーの配置が上下左右、どの位置でもこれでOK procedure TForm1.AppRestore(Sender: TObject); var FormRectBuffer: TRect; begin FormRectBuffer := Self.BoundsRect; FormStyle := fsNormal; Show; FormStyle := fsStayOnTop; FormRectBuffer := Rect( FormRectBuffer.Left + 8, FormrectBuffer.Top + 46, FormRectBuffer.Right + 8, FormRectBuffer.Bottom + 46); Self.BoundsRect := FormRectBuffer; end;
106 :
デフォルトの名無しさん :02/11/27 11:21
ラジオItem型のメニューの設定が簡単になるよう procedure SetMenuEnumProp(TypeInfo: PTypeInfo;MenuItem:TMenuItem;Click:TNotifyEvent); var i:integer; var T: PTypeData; var s:string; var nw:TMenuItem; begin T := GetTypeData(GetTypeData(TypeInfo)^.BaseType^); for i:=T^.MinValue to T^.MaxValue do begin s:= GetEnumName(TypeInfo , i); if i<=MenuItem.Count then begin nw:=TMenuItem.Create(MenuItem); MenuItem.Add(nw); end else nw:=MenuItem.Items[i]; nw.Caption := s ; nw.Visible := True; nw.RadioItem:= True; nw.OnClick := Click; nw.Tag:=i; end; end; こんな関数を作り、 列挙型 THoge=(HAHA,FUFU); を定義して フォームのpublished に property hoge:THoge;を設定して procedure TForm1.OnHoge1(Sender: TObject); begin Hoge:= THoge( (Sender as TMenuItem).Tag ); end; 実際の選択時のアクションは Hogeプロパティの代入メソッドで 書けばいいという事になるんだけど、 このあたりもっと自動化出来ないかな?
かなり遅レスだが個人的にタイムリーなんで
>>26 漏れはMapDKIIIとDel6Entの組み合わせで使ってます。
ActiveX取り込みんとこでエラーは出なかったが
インポートしたpasを若干修正しないとうまく動かないかも。
108 :
デフォルトの名無しさん :02/11/30 02:08
type
TTest = class(TObject)
public
constructor Create;
destructor Destroy; override;
end;
http://www.acesekkei.com/dp_03.htm ↑ここのサンプルなどを見ると、TObjectから直接派生したクラスで、コンストラクタやデストラクタを自前で書く場合、デストラクタの方だけoverrideしてinheritedを呼んでいます。
なぜコンストラクタとデストラクタで書き方が違うんでしょうか?
TObjectのCreateは静的メソッドなのでoverrideできないのはわかるのですが、なぜあえてTObjectのCreateとDestroyは違うディスパッチの設計になっているのでしょうか?
解説していただけるとありがたいです。
なぜって、オレにはなぜ同じでなきゃならんと思うのかの方が不思議。 Destroy には、ふつう後始末をするコードを書く、そして、override できない Free から間接的に呼ばれて実行される。後始末は上位クラス についても実行されるべきなので、継承の過程でえんえんと下位クラスで override されていくべきだと思う。これに対して、コンストラクタには 普通、初期化のコードを書くので、下位クラスで新たにパラメータを もつ TComponent.Create(AOwner: TComponent); みたいに新たに定義して もかまわないし、そうすべきなのでは。
110 :
デフォルトの名無しさん :02/11/30 04:20
>>108 オブジェクトを作るときはクラス名を指定してコンストラクターを呼び出す。
inst := TClass.Create;
オブジェクトを削除するときはインスタンスを指定する。
inst.Free
削除のときinstは基底クラスの変数を使うときがあるので仮想関数になっています。
TDerive = class(TBase)
var base: TBase;
base := TDerive.Create;
base.Free; <--- ここではTDeriveのデストラクタが呼び出される。
>>108 TObject.Destroy
TObject.Free
ヘルプ読んだか?
∧,,∧ 俺も、『Delphiオブジェクト指向プログラミング(塚越氏著)』を ミ,,゚Д゚彡 読んでようやくわかったからなあ・・・ ミつ[|lllll]). 〜ミ ミ ずばり、・なぜデストラクタは仮想かってのがP177にあり ∪''∪ TObject直派生のCreateやDestroyから inheritedを呼ぶべきか否かについても書いてある。P135とP146 しっかり読んで初めてわかるかもしれない。 名著は名著たる資格があるから名著なんでしょな。 ヘルプ読んで誰もがわかるものじゃないと思うyo。
∧,,∧ で、CreateとDestoroyの宣言について。、 ミ,,゚Д゚彡 通常、オブジェクト破棄に使われるFreeは ミつ[|lllll]). TObjectのメソッド(静的) 〜ミ ミ ∪''∪ StringListを例にとると、 StringList1.Freeを呼び出しても、呼ばれるコードはTObject.Free。 このTObject.FreeでDestroyを呼び出すようになっているんだけど Destroyが静的メソッドだと、呼び出されるのはTObject.Destroyに 固定されてしまうので、StringList.Destroyが呼ばれなくて困る。 だから、Destroyは仮想メソッド。 そんな感じ。
∧,,∧ inherited Createとinherited Destroyは ミ,,゚Д゚彡 単にTObject.Create/Destroyに ミつ[|lllll]). 何もコードがないから呼び出していないだけ 〜ミ ミ ∪''∪ 他クラスからの派生コードなら inherited Create / Destroyは必ず必要と 覚えておいてよいでしょう。 こんな話題も、某MLでは"過去ログに載っている"or"HELP嫁"で 話題つぶされてしまうのかなあ、、、、2chも同じか。 今、HELPのTObject.Free/Destroy読んだけど、 俺の書いたような事は載ってないだろ、 なぜそうしなければいけないかの理由無しに "必ず override 指令を追加"と書かれているだけ。
その本をDelphi6,7あたりに対応して復刊してくれないかなぁTT 読みたいんだけど手に入らないんよ
復刻じゃなくて PersonalやPoに添付してくれないかなぁ 今添付してあるのはPDFでいいよ 簡単なクラスを作って XX.Freeの部分からF7でトレースして動きを見れば なるほどと思うよ
>>114 ここで話題にされているのか。
デフォルトですべてのメソッドは Virtual。ってのが正統派 OOL。
それだと速度とかが稼げないから non-virtual を指定できるようになったのが
C++ を筆頭とする OOL。
だから"必ず override 指令を追加" ってことで十分なんだけど。
で、混乱の元は「なぜデストラクタは仮想なの」ではなく「なぜコンストラクタは仮想でないの」
なのだと思うが?
>で、混乱の元は「なぜデストラクタは仮想なの」ではなく「なぜコンストラクタは仮想でないの」 >なのだと思うが? TObject はオブジェクトの頂点です.つまり,この上には何もいないので override する必要がありません. こんな説明でよろしいかと
>で、混乱の元は「なぜデストラクタは仮想なの」ではなく「なぜコンストラクタは仮想でないの」 >なのだと思うが? 継承先でコンストラクタの引数を変える場合を想定しているから。 かな。 やればわかるが、クラスのコンストラクタを仮想にすることは可能。 つまり少なくともTObjectは「意図的に仮想とはしていない」 その理由としては クラスを継承する場合は元となるクラスに何かしら機能を追加/特化 するわけだからコンストラクタに引数が追加されるケースもありうる そして、仮想とした場合は引数を追加することができない。 例えば、TiniFileはTObjectを継承したクラスでコンストラクタの 引数としてファイル名を要求するが、TObjectのコンストラクタを 仮想とする場合はTiniFileのためにわざわざファイル名を引数にもつ コンストラクタを用意しなきゃいけない。無駄だと思わない? それはまだ良いんだが。例えばコンストラクタに自分で作った クラス(TMyClass)を渡す必要がある場合はどうする? 某に頼んでTObjectにコンストラクタを追加してもらう? いくらなんでも無茶だと思わない?
こんなこともできますが? >constructor Create(s: string); overload で警告が出るがこれは全く余計なお世話だと思う。 TMyObject = class public constructor Create; virtual; end; TMyObjectEx = class(TMyObject) public constructor Create; overload; override; constructor Create(s: string); overload; end;
ひぇーDelphi初心者の自分にはこうなるとわけわかんないよ。 コンストラクタが仮想ってことは生成したいオブジェクトが実行時にしかわからんということだよね? どーゆー意味があるんじゃあ
>コンストラクタが仮想ってことは生成したいオブジェクトが実行時にしかわからんということだよね? TMyClass = class of TMyObject; TMyObject = class ; TMyObject2 = class(TMyObject); TMyObject3 = class(TMyObject); としといて var c: TMyClass; o: TMyObject; begin c := TMyObject2; o := c.Create; // TMyObject2のインスタンスが生成 c := TMyObject3; o := c.Create; // TMyObject3のインスタンスが生成 end; なんてことができる。 例えばオセロゲームなんかで使うとこうなるよ。 // プレイヤー選択 FirstPlayer := TManPlayer; SecondPlayer := TCpuLevel4Player; ... TOhelloGame.Start(FirstPlayer, SecondPlayer) // 内部でプレイヤークラスのインスタンスを生成
∧,,∧! / ミ,,゚Д゚彡 < なるほど、勉強になるね ミ.,,O),,.ミ \ たしか、overloadはD4かD5からなので それまでのDelphiの為に元々のVCLが Createを静的メソッドで実装してきたのかも。 純粋OOPLなら、デフォルトでvirtualが理想なのかもしれないですが DelphiのHELPみると、静的メソッドは "メソッドのアドレスが決まるからデスパッチが高速" なんて書かれていますね。virtualがデフォじゃないとか Createがvirtualじゃないってのも決まっているのかも知れず。 ちょっと違う疑問なんだけど、overrideって指令は "上書き""仮想"っていう二つの意味をもってんでしょうか? TMyClass1 = class procedure Method; virtual; end; TMyClass2 = class(TMyClass1) procedure Method; virtual; //※ end; override使わなくても構文としては、 これで十分だといっつも思うんだけど…
[Delphi:72797] Re: Delphi .NET Preview が更新 ∧,,∧ / 見逃してたんだけど、ここみると、 ミ,,゚Д゚彡< .NET版は ミ つI) \ 今のところすべてのコンストラクタが 仮想コンストラクタになっている とか、、、、
>>125 スペルミスした時のことを考えてみてください。
>>125 違う。ひょっとしてdynamic を忘れていないかい?
overrideはあくまで "上書き"の意味しか持っていない
"仮想"には動的仮想 dynamic と 仮想 virtualの2つがあるけど、
それを指定/変更できるのは宣言元の継承元クラスのみ。
よって継承先がどちらの仮想指定であったか意識する必要はない
>>130 どうだろうな。VCLの中ではそれなりに意味のある使われ方してるらしいし。
reintroduceしる
次は、Dynamic がなぜ導入されたかかな? 誰か DelWiki に、トピック作れや。
dynamicなんてVCL級の大規模なクラスライブラリでも作らない限りは知らなくていいだろ。
しかしヘルプに「動的メソッドを使用するとコードのサイズを最適化できます。」 なんて書いてあるので、深く考えずに使う奴が多数かも。
> ここはひとつ、dynamicは廃止の方向でとはいきませんか? 逆にdynamicを廃止するとVCLのメモリ使用量が増大すると何度言わせれば・・・
VCLのdynamicを全部virtualに書き換えて試してみろ!!
Virtual vmtにそのままメソッドポインタが格納されるので、検索が無く高速 当然virtualを多用すれば vmtが巨大になる。 Dynamic System.GetDynaMethodを見ると、継承された dynamic method index だけのテーブルを作り、vmtにはそのテーブルだけを登録する。 呼び出す都度、indexがあるかどうかみつかるまで順検索する。 無ければさらに親も順検索する
overrideがあるのは、偶然、同名同引数の仮想関数を新たに定義してしまうのを 防ぐためじゃないの。
140 :
デフォルトの名無しさん :02/12/03 02:07
質問です。 下のようなコードを書いた場合、THogeHoge型の内容に関係なくOKと表示されますか? var A: array[0..100]of THogeHoge; P: ^THogeHoge; begin P := @A[0]; Inc(P,23); if P^ = A[23] then ShowMessage('OK') else ShowMessage('NG'); end;
THogeHogeが=で比較できるならOKでは。 つか試せよ。
ミ,,゚Д゚ミつ
>>141 さんのリンク先のやり方は
私のところでは激しく効果ありまいた。
WinXPで不安定になってる人はお試しあれ。
そういやD1の頃から IME 周りでトラブルがあるよなあ・・・・まあ勝手に仕様変更するMSが悪いんだろうが
>>145 たとえば?
既知の問題は片付いていると思うけど。
overrideって、優先の意味では。。。 overwriteなら上書きだけど。。。
ちょいと質問 同じユニットで定義した 親子クラスがあるとします。 子クラスのすべてのメソッドから親クラスのprivate,protected が呼び出せるのはいかがと思いますが。 皆さんは不自由していませんか?
>>皆さんは不自由していませんか? ぜんぜん。かえって便利。 ユーザサイドは関係なく、プログラマサイドの問題だから 呼び<だせる>ことに不自由するって感覚が理解できない
>>149 さんお答えありがとうございます。
でもほかのユニットになると厳しくなるのです。
これがよくわからない。
根本的にクラスの設計ができないんでしょ > 150
>でもほかのユニットになると厳しくなるのです。 何が厳しいのか書いて。
>>149 ,151さま
そうかもしれません。ありがとうございました。
同一ユニット内のクラスは互いに関連することが多い。 関連するクラス間ではデータのやり取りが他のクラスと比べて頻繁に行われる。 データのやり取りをする為にはプロパティ・アクセスメソッドを公開しなければならない。 特定のクラスにのみ公開する場合でもpublicにすると 全てのクラスからアクセスできてしまうので都合が悪い。 このような場合同一ユニット内で相手のクラスの中を 直接参照することで無駄なアクセサの公開を避けることができる。
unitっていうのを クラスの親玉みたいなものだって考えたらいいんじゃないの? 同じユニット内で定義されてる関数やクラスはみんなお友達って事で
C++から来ると焦るんだよなぁ。 なんでprivateが呼び出せるんじゃーと叫んだことがあった。 main部とクラス定義を同じファイルに書いてたときに。
auto friend機能だよ。
friend 指定使ったことある? > 156
154-155>>thx すみませんです。 >>でもほかのユニットになると厳しくなるのです ではなく ユニットが異なると普通(マニュアル)の規則が適用される。 です。 あと、クラス参照プロパティ参照があぶないです。
危なくない機能なんて言語には存在しないんだから 仕様を理解した上で慣れるしかないよ。 まさか一クラス一ユニットにするわけにもいかないだろ。
>>158 あるよ。
今は知ってます。auto friendも。
ちょっとしたコンソールプログラム作って挙動を試すときが多いので、
auto friendはそのときは邪魔だったりする。
156>> さんとおなじなのです だけどPascal or Algol は好きだ。
friend が C++ の仕様の中でも毛色が変わっていることは知っているかな? かつ、friend が存在しないと困る局面も知っていると思う。 Delphi でもそういうこと。
毛色が変わっているものが標準で有効なのはおかしいだろ。
C++ でもバンバン使っているだろ?
必要ないときは使いません。
>>164 さまありがとうございます。
でもファイルスコープでfriendとおなじにするとい
うのはいかがなものかと思われます。
------
わたしはpascal好きです
はいはい。屁理屈言うなら終わり。 cout << someVariable; とかもつかわないのか。
>>169 屁理屈はやめたほうがいいよ。
cout << someVariable; なんてfriendと関係ない話を出すなんてね。
これってObject Pascalで最もセンスを感じさせる仕様だと思うよ。 C#でもより明示的に取り入れられてるし。
えーと...(すみません) 私が考えているのは他人の実装を考えたくないからなんです。 つまり、ひとつのファイルの中で完結したい。
やっぱりDelphiの方々にはfriendは受け入れられない。 悲しいことです。さよおなら..
さようなら。もうこないでね >> 148です
このやり取りは何なんだ?沸け和か乱
わたしわじゅうぶんわかっている。 みんなもわかってあげなければにほんのあしたはないのだ。
今日の午後あたり、ム板全体に吉外の風が吹いたらしい。
179 :
デフォルトの名無しさん :02/12/03 23:08
窓枠を用意して、窓の外の景色を描画するとします。 このとき、窓の外の風景をCreateしてから窓枠をCreateし、Transparent指定すると ちょうど風景が透けてイイ感じになりますよね。 が、風景を更新しようとすると窓枠のほうが奥に行ってしまう・・・。 ここで、重ねる順番(Zオーダーってヤツでしょうか)について疑問が出たのですが、 Createした順番に重なっていくような印象なのですが、明示することはできるのでしょうか?
>>179 そういう場合は自前で描画する方を選ぶもんだと思う
181 :
デフォルトの名無しさん :02/12/03 23:19
182 :
デフォルトの名無しさん :02/12/03 23:44
Object Pascalってどうやって勉強しました? リファレンスだけ?
1.入門書を全部読む 2.分厚い解説書の文法の章を全部読む 3.リファレンスを全部読む これで完璧
>>182 Delphi言語・・・と揚げ足を取ってみる。
>>180 コンポーネント内で描画させようとすると手前にボーンとなるんですよ(;´Д`)
自分でやるしかないのかな・・・。
ひょっとして TImage つかってるの? それは駄目
しょっちゅう落ちてるよ。 メール出さないと気づいてくれないのかも。
>>182 Turbo Pascalとの差分のみ、ヘルプとリファレンスから。
Turbo PascalはPascal原典とA+D=PとTurbo Pascal本多数。
>>188 TAviimageとゆーモノでつ・・・。。・゚・(ノД`)・゚・。
>TAviimageとゆーモノでつ・・・。。 なんだか分からないが、TImage 系なら、描画しようとしたとき ポーンと手前に来るんじゃなくて、たんにCanvasにアクセスしたので 不透明なビットマップができるだけじゃないの。
194 :
デフォルトの名無しさん :02/12/04 11:09
組込み用 C ソースの検証をBCBでやってたんだけど ライブラリ依存とか面倒になって、モジュール単位に閉じる方が楽だから だんだんと関数ポインタと構造体ポインタを使いまくるコードになってきた。 これでいいのかな? まあ、一人でやってるからいいんだけど、他人が見たら嫌だろうなあ
BCB の話は C++Builder相談室 でどうぞ。
196 :
デフォルトの名無しさん :02/12/04 11:39
ボタンクリック→ CALC.EXEを起動したいんですけど、 どうすればいいですか?
>>193 描画メソッドを見ると、Canvas.Drawで描画していました。
ということは、奥をDrawすると手前のTransparent越しに見えてたものが
不透明になってしまうってことなのかな・・・。
コントロールの順番は不変で、透過してたら見え方はずっとそのままって
観念だったので混乱してまつ...(汗
ツールバーのボタンに画像を表示させたいのですがどうすればいいでしか?
200 :
デフォルトの名無しさん :02/12/04 14:46
Delphi相談室その8に接続中... しばらくお待ちください... 接続完了!!... 相談中...
DirectX !!
>>198 フォームやパネルが再描画が必要になれば、その上のコントロールが描画される
その時の順番が、たぶんキミが言ってるZオーダ
で、それぞれのコントロールに直接描画しろと命令を送ると、当然そのZオーダは無視されてしまう。
だから、そういうふうにしたい場合は
1、フォームやパネルをDoubleBufferd:=true;にしておいて、
それぞれのコントロールにではなくフォームにInvalidateを送る
2、上のTransparentに設定した窓枠からリージョンを取り出して
リージョンでクリップして描画させる
どちらかの戦略を取レ
>>202 なるほど・・・
1はちょっと頭不足で理解が追いつかないので、2で。
1) 透明指定した部分を取り出して保存し
2) その部分だけに描画をかける
ってことですね。サンプルを探しながら挑戦してみます。
Delphi 6 Personalです。 簡単にグラフや、散布図を書けるコンポーネントを色々探しているのですが、 なかなかこれといったものが見つかりません。 そこで、皆さんにお勧めのグラフ用のコンポーネントをお聞きしたいのですが。
ミ,,゚Д゚ミつ マヅはTChartのデモをみてから。
207 :
デフォルトの名無しさん :02/12/04 18:19
Tchartってどこにありますか? ちょっと分からなかったので・・・
ミ,,゚Д゚ミつ、 ぢやあ、Personalには無いんだ、、、、
209 :
デフォルトの名無しさん :02/12/04 18:44
( ・∀・) | | ガッ と ) | | Y /ノ 人 / ) < >__Λ∩ _/し' //. Vミ,゚Д゚ミ/ (_フ彡 /
211 :
デフォルトの名無しさん :02/12/04 20:07
こんにちは。 C++のヘッダをDelphiにコンバートしてるのですが、 typedef structの構造体にメンバ関数が入ってまして、 それをDelphiのrecord型に入れられるのでしょうか? できましたら、サンプルなどをいただけたらありがたいです。
>>208 戸田>>>>>>>>>>>>>>>>>>>>>>フサ
>211 スタックなobjectかヒープなclassに置き換え。 recordでは無理。
215 :
デフォルトの名無しさん :02/12/04 21:24
>>214 それは、TObjectから新しいクラスを派生させて、そこに
メンバ関数を記述するということですか?
ヘルプで「オブジェクト型」を見たまえ type Hoge = object : edn;
>>211 メンバ関数が入ってるという構造体を見せて
c++ の場合 typedef しなくても構造体は自動的にtypedefされるので
もしかして メンバ関数ではなくて 単なる関数ポインタでないの?
218 :
デフォルトの名無しさん :02/12/05 00:53
>>216 ヒントありがとうございます。ヘルプと格闘してみます。
>>217 こんな感じです。
typedef struct {
void*(*get_ycp_ofs)( void *editp,int n,int ofs );
void*(*get_ycp)( void *editp,int n );
intreserve[6];
} EXFUNC;
Timagelistで、n番目にbitmapが格納されているかを確認する方法はありますか? GetBitmap(n, hoge) して、hogeがnilかどうかを見るしかないのかな・・・。
Count
>218 それは関数ポインタ
TListViewやTTreeViewでのDrag処理でメモリリークが発生して困ってます。
詳細:
DragModeをdmAutomaticにして、さらにOnDragOverで、Acceptをtrueにしてやる。
これを実行し、ドラッグしたまま、TreeViewやListViewの中と外をいったりきたりさせると、使用メモリ量がみるみる増えていきます。
現象は、WinXpでタスクマネージャ使って確認しました。GDIオブジェクトもリークしてるみたいです。
同じexeを2000や9xで動かしても、現象は起きません。
Delphiのバージョンは6+update2です。
Delphi6はXpに正式対応じゃないみたいなので、ひょっとしたらDelphi7では直ってるのかも知れませんが、手元に6しかないので確認できません。
どなたか回避策とかご存知ないですかね?
常駐型のアプリなものでリークすると困るんです・・・。
なお、再現用のソース一式とDelphi6でコンパイルしたexeは下記に置いてます。
ttp://www57.tok2.com/home/papers/outbox/LeakTest.zip
223 :
デフォルトの名無しさん :02/12/05 05:47
> どなたか回避策とかご存知ないですかね? XP対応のバージョンをつかうか、OSを換える
XP で、ビジュアルスタイルを有効にしているとか無いかな?
>>222 つい最近、どこかで似たような質問を見かけたんだが...
D6 で確認. Win98 では使用メモリ量に変化が無いが XP だと増えていく。 D7 でも同様。
過去ログ、調べたか?
>>218 type TExFunc=record
get_ycp_ofs:procedure (var editp; n,ofs:Integer );
get_ycp: procedure (var editp: n:Integer );
reserve:array[0..5]of integer;
} EXFUNC;
var editp が嫌ならポインタにしたらいい
>>218 今回は関数ポインタだから関係ないけど、
C++では struct と class はほぼ同じ意味だと理解してるか?
デフォが public か private かの違いだけで struct でもメンバ関数は持てる。
質問です タブ型のメモ帳作ろうと思ってこんなコードを書きました。 procedure TForm1.newtab(filename: string); //新しいタブ var tabsheet:TTabSheet; var memo:Tmemo; begin tabsheet:=Ttabsheet.Create(PageControl1); //←この辺と memo:=Tmemo.Create(tabsheet); // ←この辺 memo.parent:=tabsheet; memo.Align := alClient; if filename<>'' then tabsheet.Caption:=ExtractFileName(filename); tabsheet.PageControl:=PageControl1; PageControl1.ActivePageIndex:=PageControl1.PageCount-1; if filename<>'' then begin memo:=Tmemo(PageControl1.ActivePage.Controls[0]); memo.Lines.LoadFromFile(path+CurrentDir+listbox1.Items[ListBox1.itemindex]); end; end; これって同名のインスタンスがいっぱいできてるって事?( tabsheet と memo) 設計時だと作れませんけど、同名のインスタンスは作っても問題ないですかね?
心配ならNameを書き換えればいいだけ。デフォルトは空。
Delphiでバイナリエディタって作れるの?
>>233 バイナリエディタ用コンポーネントは標準ではありません。
それだけは勘弁してください(´д`;)
使えと言ってるつもりはないから、大目に見てくれw
>>233 ○○って作れるの?という問いの答えは
作れるけどお前じゃ無理、と決まってます。
新しいOSや言語を学習するときにはとりあえず16進ダンププログラムを作る ってたのは「プログラミング Windows」の Charles Petzold だっけ
>>240 だったかな?
俺はマンデルブロ集合を描くプログラムが定番だったな。
>Delphiでバイナリエディタって作れるの?
バイナリエディタを作ることが目的なら、自分で作ることを考えては?
少なくとも Delphi IDE と同じ程度のものを作ることは可能です。
バイナリエディタを使いたいのが目的なら、バイナリエディットに特化したコンポーネントを
入手し、使うことができます。
http://www.woodybells.com/binedit/ こんなのはどうですか?
バイナリエディタは他のことをやるための道具だ。というのであれば
市販品/シェアウェア/フリーソフトを探してもよいでしょう。
>>236 さんの提示した製品でもよかろう。
236が言いたいのは、PWがDelphiで作られてるって事だろ。
変数のread only propertyにたいして@で参照すると書き込めるのは なぜでしょう。
@で参照したからです
>>226 すみません。ちょっと前に他所にも書き込みました。
>>227 D7でも同様ですか。う〜む…
247>>さんへ VCLをだますのにかなり使っていました。 最近、これではいかんと思うようになりました。
>>245 Win32 アプリケーションには Java/.NET などのようにメモリセキュリティはないんだから、
メモリアドレスさえ取得できれば読み書きは可能。つーか、そうしてもらわないと困る。
>>247 もちっと調べてみるけど、MFC/VC6 でも怪しい動きをする。
調査が必要だ
251 :
デフォルトの名無しさん :02/12/05 16:44
乱数を発生させたいのですが、Randomを使うと毎回同じ順で数値が出てくるのですが、 完全にランダムで決定させる方法はありますか?
最初に一回だけRandomizeを呼べ
>>252 ありがとうございました!m(_ _)m
なんでヘルプ読まないんだろ…
>Delphiでバイナリエディタ 適当にbinフォルダにあるコンポーネントをインストールしたら面白いよ。 確かメモリダンプコンポーネントがどこかにある筈
256 :
デフォルトの名無しさん :02/12/05 19:10
バイナリエディタ作りたいなら、 TFileStreamあたりを見るとよい。 TStream系が使えるようになるとだいぶ技術の幅が広がるよ。
257 :
デフォルトの名無しさん :02/12/05 20:28
const ABC = (['A', 'B', 'C']); この ABC の要素数である3を得るにはどうしたらいいでしょうか?
これって集合型になるの?だったら要素数という概念自体がなんか変かも. この括弧て意味ある?
こんな事がしたかったの s: string; if (s[i] in ABC) then raise Exception.Create(ABC + 'が入ってます');
×が入ってます ○に入ってます
コンコン!入ってます!
const 定義には型宣言が存在しません。だから直接には型情報およびそれに関連する 値を取得することはできません。 変数に代入するか、または型付定数、初期化済み変数を使うか。
>259 その用法でなぜ要素数が欲しい? sの文字数分そうやってチェックするだけだろ? つまり、集合型の要素の最大数の求め方は俺にはわからん訳だが.
const ABC = 'ABC'; if (Pos(s[i], ABC) > 0) then raise Exception.Create(ABC + 'が入ってます');
こんなふうに _INVALIDCHARFILENAME にキャラクタを追加するだけでokにしたかったの const _INVALIDCHARFILENAME = ['\', '/', ':', ',', ';', '*', '?', '"', '<', '>', '|', '+']; function ValidateFileName(const Name: string): Integer; var i: Integer; begin for i:=1 to Length(Name)-1 do begin if (Name[i] in _INVALIDCHARFILENAME) then begin Result := i; Exit; end; end; Result := 0; end; if (0 < ValidateFileName(FileName)) then begin raise Exception.Create(_INVALIDCHARFILENAME + 'はファイル名に使えません'); end; で、↑ここで文字列にする必要があるから要素数が必要 (無理だけど) SetLength(_INVALIDCHARFILENAME, Length(_INVALIDCHARFILENAME)); for i:=0 to High(_INVALIDCHARFILENAME) do s[i] := _INVALIDCHARFILENAME[i]; Pos なんていやん
×SetLength(_INVALIDCHARFILENAME, Length(_INVALIDCHARFILENAME)); ○SetLength(s, Length(_INVALIDCHARFILENAME));
const _INVALIDCHARFILENAME = ['\', '/', ':', ',', ';', '*', '?', '"', '<', '>', '|', '+']; _INVALIDCHARFILENAMEのメモリイメージを理解すれば自動で文字列化なんて無茶なことは言わなくなるよ。無難に(Ansi)Pos方式にしとけ。 if (Name[i] in _INVALIDCHARFILENAME) then Nameにsjisが混入することも考慮しとけ。
>_INVALIDCHARFILENAMEのメモリイメージを理解すれば自動で文字列化なんて無茶なことは言わなくなるよ。 何を読めばイメージが掴めるでしょうか? >Nameにsjisが混入することも考慮しとけ。 気づきませんでした。ありがとうございます。
constで集合定義するならエラー用の文字列も定数で作ったら? そんなことで一日悩んだわけじゃないだろうけど、時間の無駄っぽい
>>266 その使い方なら逆に
INVALIDCHARFILENAMEStr='\/:, , ;*?"<>|+';
と文字列にしてそれを集合型にするのがいいのじゃないの?
初期化節で処理したらいいんじゃないの? const _INVALIDCHARFILENAME = ['\', '/', ':', ',', ';', '*', '?', '"', '<', '>', '|', '+']; var _INVALIDCHARFILENAMEs:string; ・・・他の処理・・・ var c:Char; initialization _INVALIDCHARFILENAMEs:=''; for c:=Low(Char) to High(Char) do begin if c in _INVALIDCHARFILENAME then _INVALIDCHARFILENAMEs:=_INVALIDCHARFILENAMEs+c; end; end.
274 :
デフォルトの名無しさん :02/12/08 01:15
↑直リンスマソです…
>>273 想像だけど、dfmファイルが壊れているんじゃない?
フォームをテキストで表示して、確認してみ
>>273 Indy9では HTTP.Requrst.ProxyPortとか、HTTP.Requrst.ProxyServerは
HTTP.ProxyParam.ProxyPort、HTTP.ProxyServerに変更になっている
はず。
サンプルプログラムは、この辺を直してやらないとコンパイルできない
けど、コードは書いてないんだよね。
もしかすると Indy8がうまくアンインストールされてないんじゃない?
Windows\system32フォルダに Indy8のindy60.bplが残ってるとか。
>>275 一応壊れてはないみたいです。
>>276 とりあえずindy60.bplで検索するとC:\Program Files\Borland\Delphi6\Binにありましたが、
それを開いてみるとちゃんとパスは全てC:\Program Files\Indy\Sourceになっていました。
>>273 イマイチ状況がわからないな。
"コードは何も書いてません" ってのは、新規プロジェクトの
フォームにIdHttpをのせて実行したら、上記のエラーが出るという事?
デバッグで追い掛けてどのタイミング/どの行で例外が発生するか
わからない?
フォームにのっかっていたコンポーネントの published プロパティが変更されただけでしょう. 設計時にそのフォームを開けば,無くなったプロパティを検出して修正を促してきます.
280 :
デフォルトの名無しさん :02/12/09 00:04
あるプロセスが起動しているかをチェックして、もし消滅していたらWindowsをシャットダウンするという コードを書きたいのですが・・・。(処理終了→自動終了するアプリと一緒にWindowsも終了させたいという魂胆です) シャットダウンは標準APIでいいとして、 1) 特定プロセスに割り当てられたアドレスを知る方法 2) それが生きているかを調べる方法 があったら教えてください。(ノД`)
(´-`)。o ○ (シャットダウンして欲しくないなぁ… どうして「終了タイマー」 みたいなフリーウェアが氾濫してるんだろう?)
関係ないけど、.NETServer2003ってさ、手動でシャットダウンするときに いちいち理由を選ばないといけないのよ。(ハードウェアメンテナンスとか) まあサーバだし、うちで3ヶ月立ち上げっぱなしで、とくに不具合ないからいんだけど。
283 :
デフォルトの名無しさん :02/12/09 01:22
以下のような TBitmap を戻り値にした function を作って function AAA(pBmp:TBitmap):TBitmap; var tmpBmp:TBitmap; begin tmpBmp:=TBitmap.Create; try 【処理】 finally result:=tmpBmp end; end; 関数を呼ぶ時にには、呼ぶ側でCreateとFreeをやっています、 bmp:=TBitmap.Create; bmp:=AAA(bmp); bmp.free; この時に、 bmp:=TBitmap.Create; bmp:=AAA(bmp); bmp:=AAA(bmp); bmp:=AAA(bmp); bmp.free; こんな感じで連続して呼び出しても一応処理は出来ているみたいなのですが bmpのfreeが1回しかないわりに、関数中では毎回tmpBmp:=TBitmap.Create; が走っていてなにか釈然としないものがあります、大丈夫なのでしょうか? そもそも、関数の最後に上の例で言えば tmpBmpをFreeしちゃいけない理由が判る方、教えて下さいお願いします。
> 大丈夫なのでしょうか? 大丈夫じゃない! > tmpBmpをFreeしちゃいけない理由 result に代入したあとなら Free できるが解決にはならない そもそも function AAA(pBmp:TBitmap):TBitmap; こんな形 の関数が必要なのかね? 【処理】の内容によっては引数の加工で 済む場合がほとんどだと思うが。
234 はオブジェクト参照というものが分かってない >bmp:=TBitmap.Create; >bmp:=AAA(bmp); なぜコンストラクタを実行する必要があるの?
@あるフォルダ内の全ファイル名を配列で取り込む A実行ファイルを引数つきで実行する。 にはどういう関数を使えばいいですか?
×234 ○283
何でもかんでも「関数」って言えばいいっても(略)
>>286 @ FindFirst() と FindNext() ヘルプの例を参照
A ShellExecute() or CreateProcess() or WinExec() API →google
>> result に代入したあとなら Free できるが ごめん、まちがい、Free できない
大丈夫でない理由 bmp:=TBitmap.Create; bmp:=AAA(bmp); ← ここで上の行で作った TBitmap オブジェクトが行方不明 bmp:=AAA(bmp); ← ここで上の行で作った TBitmap オブジェクトが行方不明 bmp:=AAA(bmp); ← ここで上の行で作った TBitmap オブジェクトが行方不明 bmp.free; ← ここで上の行で作ったTBitmapだけが解放される
つまり、4回コンストラクタを実行して、1回だけデストラクタを実行しているので 3つのオブジェクトが行方不明になる
>>tmpBmpをFreeしちゃいけない理由 関数を書き直して function AAA(pBmp:TBitmap):TBitmap; begin result:=TBitmap.Create; 【処理】 result.Free; ← これを実行すると返値がタコになるでしょ! end;
ありがとうございます。
>>283 です。
>>284 >そもそも function AAA(pBmp:TBitmap):TBitmap; こんな形の関数が必要なのか
この関数はアルファブレンドしたり、エフェクト処理とかをする関数なので
処理済bmpが帰ってきた方が便利かと思いまして、利便性だけ考えて関数に
しただけなんですが、ここらが間違っているのでしょうか・・・。
>>285 >オブジェクト参照というものが分かってない
ごめんなさい、全く判っていません。
かなりアホなんで勉強して出直してきます。m(。。)m
>>291-293 やっぱり駄目ですかBitmapで渡さない方向で
練り直します。ありがとうございました。
>>294 >これを実行すると返値がタコになるでしょ!
Free出来ないのでは、戻り値と言うか、たぶん、予想ですが、
戻そうとしている値があった場所を記憶していた値、
ポインタがfreeされて迷子になるだと認識しているのですが。
>> 処理済bmpが帰ってきた方が便利かと思いまして そういう考え方をするのは理解できる。でも、関数のなかでコンストラクタを 実行するのは、非常に危険だと思う。 function AAA(pBmp:TBitmap):TBitmap; の形ではなく procedure AAA(pBMP:TBitmap); の形にして、渡した pBMP を加工するとよいと思う。呼び出し側で、加工まえの 画像を保持する必要があるときは、コピーをつくってからこの関数を呼ぶように する。オブジェクトを参照する変数は、たとえば上の引数 pBMP などは、オブジェクト 自身を保持しているのではなく、それを指すポインタである、ということを理解する 必要がある。だから、引数の pBMP を加工しても、その結果は呼び出し側にそのまま 反映される。通常の参照渡し var の場合と同じ。オブジェクトを渡す場合は、var を つけない方がよい。それ自体が参照なので。
>> コピーをつくってからこの関数を呼ぶ コピーの作り方の例 copyBMP := TBitmap.Create; copyBMP.Assign(originalBMP);
>>297 加工した画像は、戻り値で戻さないと駄目だ、
と思い込んでいたのが間違いって事ですね。
勉強になりました。ありがとうございました。
>でも、関数のなかでコンストラクタを実行するのは、非常に危険だと思う。 時と場合によるけどね Singletonの実装では常套手段だし
>> 関数のなかでコンストラクタを実行するのは、非常に危険だと思う。 283のは駄目だと思うけど、通常は関数内でコンストラクタ実行してもいいんじゃないの?
ごめん入れ違いになったみたい、時と場合によるのね。
303 :
名無しさん :02/12/09 02:43
Pure P2Pの例題ソース書き込んで下さい。お願いします!
>> 通常は関数内でコンストラクタ実行してもいいんじゃないの? そうだね。文法的に駄目という意味ではなく、関数をブラックボックスと見なすとき そのユーザに対して、この返値のオブジェクトは使用後必ず Free してください、 という注釈が必要になるでしょう。そのことが関数自体で完結していないので危険 だと思う。 >> Singletonの実装では常套手段だし この場合は、むしろ呼び出し側では通常 Free は実行してはいけない、場合なのでは?
折れにはオマイラが書いてることが理解できませむ!
Indyコンポーネントの解説書とか発売されないのかなぁ。 数が増えたのはいいけど、イマイチわかりにくいな。 サンプルもDL汁じゃ寂しいよ、Indyはフリーとはいえ 日本語サイトも無いしなんとかしてよ某!
妙に活気付いてるな・・・。
確かにIndyコンポが多いのは嬉しいけど使わないのも多いな。
TCP関連とかスレッド対応になってるし、一昔前より理解するのは難しいのかな?
>>303 とか、IdTCP*使ったら作れるんじゃないかな。
>>304 俺時々やるなぁ、インスタンス生成して返す関数。
絶対に開放を忘れないように、それとはっきりわかる関数名付けるけど。
TGraphicCreate(filename:sring): TGraphic;
とかで、画像フォーマットに合わせたインスタンスで、なおかつファイルを読み込んで
オープンするとか。
もちろんファイルオープンに失敗したら、関数内でインスタンスは破棄して例外を関数外に
投げるようにしてる。
>> 絶対に開放を忘れないように、それとはっきりわかる関数名付けるけど。 なるほどね。ユーザが呼び出し側コード内で、コンストラクタとデストラクタの 呼び出し回数を数えられるような感じだといいかもね。ところで TGraphicCreate(filename:sring): TGraphic; この関数なかなか便利そう! コードさらすつもりない?
TGraphicCreate(filename:sring): TGraphic; var ext: string; begin Result := nil; try ext := UpperCase(ExtractFileExt(filename)); if ext = 'BMP' then Result := TBitmap.Create; if ext = 'JPG' then Result := TJPEGImage.Create; // 他いろいろ if Assign(Result) then begin Result.LoadFromFile(filename); end else begin raise Exception.Create(ext+'なんて拡張子は知らん。'); end; except Result.Free; raise; end; end; こんな感じだったかな? いまソースをとっさに持ってこれないんで、テキストエディタで適当にかいたから スペルミスとかあるかも。
311 :
デフォルトの名無しさん :02/12/09 03:21
Assign(Result)じゃなくてAssigned(Result)だった。
TPicture を使えばいいのに……
314 :
デフォルトの名無しさん :02/12/09 03:32
既出だったらすいません。 Delphiってタダで使えるんですか? なんか、どっかからダウンロードできるって聞いたんですけど。
315 :
デフォルトの名無しさん :02/12/09 03:35
Delphi6のパソ版なら ボーランドからダウンロードできんじゃないかな。
317 :
デフォルトの名無しさん :02/12/09 03:43
わざわざすいません。 ありがとうございました。
パソ版ってのでシェアウェア作って公開してもいいんですか?
商用に該当するので不可です。>318
シャアウェア
>>319 まじっすか〜7の値段見たらパソ版で10000したんだけど、
多分これも無理って事はプロ版買わなきゃなんないんですよね〜68000円て無理だ(藁
322 :
名無しさん@303 :02/12/09 08:58
では、どうやってIdTCPを使って記述したらいいのですか?IdTCPはあまり使ったことがないので分かりません・・・。
> Result.Free; Freeした後、必ずnilするクセをつけろ! FreeAndNil(Result); しる!
>> Result.Free; >Freeした後、必ずnilするクセをつけろ! だめな例に教訓たれても・・・
> だめな例に教訓たれても・・・ じゃあ、これで・・・ Freeした後、必ずnilするクセをつけろ! FreeAndNil しる!
326 :
デフォルトの名無しさん :02/12/09 15:52
>>321 1) D6パソをタダで入手。
2) 小銭貯金を始めると同時にD6パソで修行開始。
3) 金払ってくれるヤツがいる様なソフトを作れようになるのより\68000貯まる方が早い。
6) Pro版を買って小銭貯金の投資を回収。(←これが困難)
※ 速攻で売れるようなソフトがすぐに作れるようになれるような才能溢れるキミはガタガタ言わずにPro版買え!
D6パソが普通に使えるようになってから proでもD7でもD8でも買ったらいいんじゃないのか? 最低でもD6パソを普通に使いこなせないと、 売れるようなソフトなんて組めないだろ?
328 :
デフォルトの名無しさん :02/12/09 19:00
Delphi6Personal版落としてきたんですが、EXEを実行すると 一般保護ダイアログが出てしまって、インストールできませんでした。 borlandとvectorの所から4回程ダウンロードし直して試したんですが、 全て駄目でした。環境はWindows98SEです。 ちなみにアップデートモジュールの方をダウンロードしてきて実行 するとちゃんとセットアップが実行される(本体居れてないので失敗 しますが)ので、Delphi6Personalのexe本体が壊れてる可能性が 高いと思うんですが、そういう情報はないでしょうか?
インストーラーが吹き飛ぶの? インストール後の Delphi IDE が吹き飛ぶの? インストーラーが落ちるのなら Windows Installer の問題だろうから、 IE の最新版でもインストールしてみたらどうだろうか? IDE が起動時に吹き飛ぶ場合は... なんだろうね。聞いたことが無いけど。 OS に変な/変わったモジュール入れていませんか?
DelphiのインストーラーってWindows Installerじゃないだろ。
EXEを実行した直後に、いきなり一般保護になります。 セットアップに関係する様なダイアログは出ません。 以下はエクスプローラーから BorlandDelphiPersonalEditionJP.exeを実行した時の 一般保護の詳細です。 --------------------------------------------------------- EXPLORER のページ違反です。 モジュール : KRNL386.EXE、アドレス : 0002:00004317 Registers: EAX=00005f5f CS=016f EIP=00004317 EFLGS=00000206 EBX=c18883d0 SS=1bdf ESP=0000b2d8 EBP=0000b2e4 ECX=0000fd96 DS=018f ESI=015d0ff6 FS=45df EDX=c188c2b1 ES=018f EDI=015d1000 GS=0000 Bytes at CS:EIP: 67 ab fe 46 ff fe 46 ff e2 92 8a 46 ff 59 66 5b Stack dump: b2dc0000 015d205f c08f01ec 4380b2f4 2057458f 00000062 000001e8 0a9db326 ffff205f 458f01ec 458f01ce 062201c8 458f01ce 00750074 0001001e 458f01e8
また、エクスプローラーからexeのプロパティを開き、 バージョン情報タブを選択すると同じ様に落ちます。 ↑を見ても判る通り、落ちるときは起動したシェル毎落ちてしまいます。
特に変なのを入てた覚えはありませんが、 しいて言うならCD革命です。 他のEXEは問題なく実行できるのに。
アンインストールしろよ CD革命
D6パソを営利目的で使ってるやつなんて山ほどいるがな。 有名どころだと鷹月ぐみなのとことか
原因がわかりました。 ConfigSafeという、パソコンにプリインストールされていたソフトでした。 (セットアップ前の状態を保存するソフト) これをアンインストールしてBorlandDelphiPersonalEditionJP.exeを 実行したら正常にダイアログが表示されました。
>>335 つまりDel厨はライセンス違反野郎ばかりってわけだね。
>>331 そのインストールファイルを Explzhなどで開いて解凍。
そしてその解凍されたファイル群のなかのsetup.exeを
実行すればインストールできると思われ。
InstallShieldで作成されたインストールファイルを、Win9x
でプロパティ表示すると落ちる問題と同じと思う。
漏れも別のソフトのインストールで遭遇した。
>>335 「VC++で作りますた!」と答えるのに中身はdel。
同人ゲーム界のスタンダード(藁
違反者は潰そうぜ
このままじゃDelphi Personal使いが全部違反者だと思われるもんな。
343 :
デフォルトの名無しさん :02/12/09 21:32
>>同人は基本的には非営利活動 ↓ >>同人活動というのは扱い上「非営利」であり ↓ 利益が出ていなければ商用に該当しない ↓ >>ちなみに私の同人活動の儲けは、ほぼ現状赤黒ゼロです del厨毒電波
自分で使うツールは割れVC++、公開するツールはDelphi6Personal 違いのわかる漏れは使い分けてます
>>278 そうです。どのタイミングで発生するかはちょっとわかりませんでした。
>>279 フォームはずっと表示してます。(意味取り違えてる?)
if OpenDialog.Execute then begin CurrentFile := OpenDialog.FileName; FileName := ; end; こうやったときに、FileNameにフルパスではなくただそれのファイル名を代入したいのですが、 どうすれば出来ますか?
>>349 あ、そうでした。何か前にそんなのをみたような気がしてたんで…。さんくすです。
TabControlでタブ付きのメモ帳作るのって難しいですかね? PageControlよりリソース消費が少ないからそっちの方がいいと思うんですけど。
恐ろしいほど簡単です。
タブを追加することは出来たんですが、タブの切り替え方法が分からず… OnChangeに何を書けば良いのかさっぱり。 そこをどうか教えてくださいませんか?
TabIndex見てメモの中身をすげ替えろ
>>353 TabControl.Tabs.AddObjectとか
TabControl.IndexOfTabAtとか
TabControl.Tabs.Objectsとか
TabControl.Tabs.IndexOfObjectとか
を上手く使えば出来る。
難しいか、難しくないか聞いてどーしようってんだろう? 出来ますか、出来ませんかって聞いてどーしよってんだろう?
なんか教えてもらえるかもしれない、ということだろ?
ゆ う き が ほ し い の さ 。 き っ と . . .
難しいか、難しくないか / 出来ますか、出来ませんか しか聞いていないので、たとえ答えをズバリ教えてもらってもお礼を言いません 「そこまで聞いてねーけど勝手に答えた」って感じ
モノクロビットマップの操作って難しいというか判らん bmp := TBitmap.Create ; try bmp.Monochrome:=True; bmp.Width :=xs*Length(s); bmp.Height:=ys; bmp.Canvas.Font.Name:='MS ゴシック'; bmp.Canvas.Font.Height:=ys; bmp.Canvas.TextOut(0 , 0 ,s); このビットマップの0,1の反転したくて 1、これだと何故か下線しかひけない for y:=0 to bmp.Height-1 do begin q:=bmp.ScanLine[y]; for x:=0 to bmp.Width div 8-1 do q^[x]:=not q^[x]; end; 2、これは全くダメ for y:=0 to bmp.Height-1 do for x:=0 to bmp.Width-1 do bmp.Canvas.Pixcel[x,y]:= not bmp.Canvas.Pixcel[x,y]; 3、結局 Windows APIで Windows.InvertRect(bmp.Canvas.Handle,rect); 成功 でもなんで1,2だとダメなのかな
>bmp.Monochrome:=True; これだけでは PixelFormat が pfDevices のままなのでダメです.
コンソールアプリからのエラーメッセージを受け取るにはどうすればいいですか? たとえばWinExec('copy file1 file2',SW_SHOWNORMAL); でfile1が存在しなかったとき、カスタムのメッセージボックスにエラーを表示したいのですが。
∧ ∧ DelでC/Sシステムを作るとき ミ ゚Д゚彡 何を使うと、いいのでしょうか。.. 〜ミ,,,,uuミ VBでWinSockを使ってて、 なかなか便利なので、Delでも同じ事したいです
Client/Server と WinSock に何の関係が? 通信プロトコルレベルを作りこむ気か?
VB 使いつづけたら? >> VBフサギコ
>>361 ではどうすればいいのでしょう?
bmp.PixelFormat:=pf1bit; を bmp.Monochrome:=True; の
前に入れた場合、Canvas.TextOut で文字をどう描けば良いでしょうか?
後に入れた場合、出来てるのは いわゆるモノクロビットマップではなく
パレット付きの2色のビットマップが出来ています。
(SaveToFileしてペイントブラシで見ると色付き文字になってる)
VBフサギコの言いたいのは、ネットワークをまたいだプロセス間通信を簡単にやりたい。 ということではないかな? DCOM 使えば?
>>360 >このビットマップの0,1の反転したくて
DIBのモノクロビットマップはパレットがあるんで、色データではなく
パレットの色を入れ替えるだけで反転するよ
>>371 私もそれがベストな方法だと思います
しかし Bitmap.Palette := CreatePalette(...) だと反転できないみたいです.
パレット 0 が clBlack 固定なのかな?
TBitmap を欺いて SetDIBColorTable すればできるけど.
>>パレット 0 が clBlack 固定なのかな? うーん、TBitmap ではどうだかしらないんですが、すくなくとも普通の DIB なら ゼロが黒固定ということはないです。
>そして作成直後に pf1bitを設定すると変な色パレットが付いてるのでTextOutとかが巧くゆかないと 変な色パレットなんて付かないと思うんですけど…… うちでは黒白の2値パレットになります. DDB->DIB ってビデオカードに影響されるんでしょうか?
DDBがビデオカード依存罠
_________
∧,,∧ /
ミ;゚Д゚彡< あうあうあ・・・・
ミつ つ \
〜ミ ,, ミ.  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∪ ∪
>>369 さん
イエス
ネットワークを跨いだC/Sってのがイマイチ意味不明なんですが・・・。 DBサーバに接続するだけじゃ駄目なの? それともP2Pみたいなシステムって事?興味あるので詳しく解説希望
380 :
デフォルトの名無しさん :02/12/12 21:40
一定期間ごとに最前面に表示して入力を促すソフトを作ろうと思ってます。 そのソフトの入力画面が表示されている間だけは他のソフトの制御を出来なく したいのですが、良い方法は無いでしょうか。 いつもは普通のソフトだけど、ある瞬間だけスクリーンセーバーとして偽装する ことができればやりやすいと思うんだけどなかなかうまくいかないもんで。
一定時間ごとにスクリーンセーバーを起動するだけのソフトを作ったらいいんではないでしょうか
383 :
デフォルトの名無しさん :02/12/12 21:54
>>381 レスどうも。
スクリーンセーバーは今あるヤツをそのまま使いたいので
スクリーンセーバーとは別に作りたいのですよ。
>>383 そのソフト、ものすごく使いたくないけど、
キー入力を完全に無効にしたらどう?
Delphi7のヘルプが中途半端に日本語化されてて一部英語な罠…
>>385 ヘルプアップデートしても?
うちのは英語出てこないけど?
>>386 TRichEdit とか英語じゃない?
7はまだヘルプアップデート出てないし…。
>スクリーンセーバーは今あるヤツをそのまま使いたいので >スクリーンセーバーとは別に作りたいのですよ。 時間が来たら一時的に入力を促すだけのスクリーンセーバーを起動して, 終わったらあなたのお気に入りのスクリーンセーバーに戻せば良い. 他にアイデアは無いです.
DirectXの排他モードを使えば?
>>380 「スクリーンセイバーの作り方 delphi」を検索して、他のアプリを隠す部分だけ真似すりゃ
いいんじゃないでせうかね。
∧,,∧
>>378 さん
ミ,,゚Д゚ミ インヂーの何を使えばヨロシコですか?
>>379 さん
DBは使わないのです
鯖も蔵も自作アプリで単に通信したいだけなんすが。
P2Pってのは違うと思われ(ヨクワカ)
>>392 単に通信したいだけなら WinSockレベルで書いてもしれてるでしょ
LAN内だけなら
メールスロットなんてのもあるし
数秒レベルの遅延が許されてるなら共有ファイルを決めて
共有ファイルを通してメッセージ交換すれば? 簡単だし
Win9xを無視するなら名前付パイプでやりとりとか
>>392 SOAP/Web service なんかどうなの?
>>392 のVBフサギコさんはヘルプで「DCOM アプリケーション」を引いてみるとよろし。
つかVBもDCOM使えたような…というよりDelphiより得意なんじゃないか?
>>392 なるほど、
IndyのIdTcpClientとIdTcpServerでなんとかなりませんか?
>VBでWinSockを使ってて、 >なかなか便利なので、Delでも同じ事したいです ここにつっこむ人はいないの?
VB の WinSock は、それはそれは便利なんだろ?きっと。
_____
∧,,∧___ /なでか、微妙に煽られてる
/ミ゚Д゚*ミ/\< 希ガスる...
/| ̄∪∪ ̄|\/ \_____
|____|/
レスありがとです
>>393 さん
WinSockスレベルのしれてる度がどれだけシレってるのかが
よくわかなのです。
スロットはしたことありません。共有ファイルは簡単しょうっすね
名前尽きパイプも吸った事無く、よくわかですた。
>>394 さん
そこには逝きたいでつが、大げさすぎる肝汁ですが。
>>395 さん
VBは使って使って使ってガンバッテモ鬱になる言語ですが、何か.
DCOMはみかかDOMOCOみたいなので、嫌いなのはともかく
やったー事ないのでよくわかです。
>>396 さん
なんとかなりそうでし。クスコクスコクスコ
>>397 さん
突っ込みどころ満載ですが、何か?
>>398 さん
後ろの方が、VBでやって簡単にLAN内の2台で通信できてたので
「おや、まあ、デルファイさんでも簡単ですかねえ」
と思いましたが。
メールスロットは Win95〜NT迄使え、LAN内のほかのパソコンともやりとり出来ます。
まずは、標準のメールスロットに送信をしてみましょう
フォームにMemoとボタンを貼り付けてボタンイベントに
procedure TForm1.Button1Click(Sender: TObject);
var hfile:THandle;
var msg:string;
var wSize:DWORD;
begin
hfile:=CreateFile('\\.\mailslot\messngr', GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0);
msg:='俺'#0'お前'#0+Memo1.Text;
WriteFile(hfile,PChar(msg)^,length(msg),wSize,nil);
try finally CloseHandle(hfile);end;
end;
どのパソコンにメッセージを送るかは CreateFileの第一引数で指定します。
詳細は
http://www.google.co.jp/search?q=mailslot&lr=lang_ja messngrは w2000なら普通は常にサービスとして動いています。 W9xではWinpopupです
メッセージは 誰から誰へ の欄がありその区切りは #0 です
受信も簡単です 別のアプリを作成し、メモとタイマを貼り付けます。 1、ローカルにハンドル型変数を定義する var hMailSlot:THANDLE; 2、フォームのOnCreateForm イベントか 初期化節で hMailSlot:= CreateMailslot( '\\.\mailslot\2CH\test' ,100 // 最大メッセージサイズ ,0 // 読み取りタイムアウトの間隔 ,nil); 3、タイマーイベントで procedure TForm1.Timer1Timer(Sender: TObject); var rSize:DWORD; var buf:string; begin setlength(buf,1000); if ReadFile(hMailSlot,PChar(buf)^,Length(buf),rSize,nil) then begin SetLength(Buf,rSize); if buf<>'' then Memo1.Lines.Add(buf); end; end; 送信側アプリで '\\*\mailslot\2CH\test' とすればOK
MailSlotは簡単ですが、制限もあります 1、必ず届くとは限らない=届いたかどうかはそれだけでは判らない 2、複数届く場合もある 3、ドメインを設定してなければ \\*\ が使えない=相手名を設定しなければいけない=結局WinSockAPIが必要かも 4、1回の送信バイト数には制限がある
質問ですが、Windows.pas だけ使用して スレッド作る方法何か無いでしょうか? (もしくは、なるべくサイズが大きくならない方法) あるソフトのプラグイン作ってるんですが、 なるべく軽く済ませるためにClassesは使いたくないのです。
スマソ、自己レスです。 System の BeginThread でやりまつ。
405 :
デフォルトの名無しさん :02/12/15 15:27
_____________ ∧,,∧ / StringListに入れて _ ミ,,゚Д゚彡_< Valuesで取り出せるよ .=| |==U==U=| |= \ | |@ミ ミ .| |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | ∪''∪ | | NamesとValuesをチェックっす | | | |
_____________ ∧,,∧ / _ ミ,,゚Д゚彡 _< ネットワク関係でレスくれた人サンクスコ .=| |==U=U==| |= \メルスロソース、ありがとん | | .ミ ミ | | | |ノ∪''∪. | | Indyでやってみてソース書いてから | | | | レスろうかと思ってたけど、禿忙しいので かけそうにないです 今日も出勤…もうぬるぽ…
408 :
デフォルトの名無しさん :02/12/15 15:40
409 :
デフォルトの名無しさん :02/12/15 15:51
解決しますた。
そこでどういうミスをしていたかを書いてくれれば後から見た人の役に立つのに・・・。
>>411 おいおい、それでは教えて厨失格というものだ。
_____ ∧,,∧ / ミ*゚Д゚,,ミ < よっしゃ、ばれてない! ミ つ つ \_____ @ミ ミ (ノ'''''∪ (ヒミシ)
|∀・)バレテルヨ…
415 :
デフォルトの名無しさん :02/12/16 10:11
パワーユーザでコンパイルする方法教えれ。
パワーユーザって 何の事?
Power Usersと書かないとわからんだろ。
コンパイルの仕方を知らないパワーユーザ(藁
PoorUser?
Personalを使うべく、Borland Mail News Members アカウントの登録をしたのですが、 Step2へ進むためのメールが来ません。 ISPとhotmail両方試したけど両方音沙汰無し。 時間がかかるものなんでしょうか?それとも休止中?
解決しました。19時に試した分だけメールがきました。
自作した関数に可変数のパラメータを とることはできないのでしょうか? こんな感じで・・・ procedure FuncName( param1, param2, param3 ・・・ :String ); 無理ならデフォルトパラメータでやることにしまつ。
そら、ジュウレンジャーだって。
>>423 Format のような引数指定ではどうかな?
>>425 さんくすです。解決しますた。
後の人の為に。
function Add( Base :Integer; const Args :Array of Integer ) :Integer;
var
i :Integer;
begin
for i := 0 to High(Args) do Inc(Base, Args[i]);
end;
使用例: SumOneToTen := Add(1, [2,3,4,5,6,7,8,9]);
単なるオープン配列パラメータじゃん. で、それに集合わたしてコンパイル通るの?
集合?
まず、自分でやってみな。> 427
なるほど、オープン配列コンストラクタってやつだな. >428 「オープン配列コンストラクタは、集合構成子と同じように、 式をカンマで区切って全体を大カッコで囲んだものです。」 だそうだ、ヘルプによると.
431 :
デフォルトの名無しさん :02/12/17 12:53
426の例はResult値がない罠
い。
そんぐらい許してやれ
よ。
(嘘)
あまり使う気はしないな<オープン配列コンストラクタ なんか気持ち悪い
といいつつ、formatで思いっきり使ってたりして
オブジェクトの生成/消滅をモニタできるプロファイラか Log4J のようなロギングライブラリで定評があるのって何?
C#を使ってみたが、泣きたくなるぐらい分かりずらいのでdelphiに 戻ってきますた。あー落ち着く。単にスキルがしょぼいだけだが。
C#とDelphiって激似だと思うのだが。どこが分かりづらい?
たぶん言語レベルじゃなくて、ライブラリ関連だと思う。
Delphiの・・・に相当するC#の機能はどれだってのを探し疲れるんだよな。
Formの上でTimageを動的に作ったりしてオブジェクトの生成・掃除の練習をしてるんですが、 親子関係がよくわかっていません。Form1を閉じると、上に載っているimageも自動で消滅させるには Ownerを設定するだけでいいのでしょうか?
いいよ あとParentも調べとけ あとメモリリーク検出するユニットも使っとけ
Owner 浅野内匠頭 Parent 大石内蔵助 Child 大石主税
TComponent 継承はCreateで指定した親と一緒に解放されるから TImageも同じ TBitmapはそうじゃない。TPersistent継承だからストリーム入力機能は あるから、コンポーネントのプロパティにすれば dfm に保存は勝手にやってくれるが 生成、解放は別に管理が必要
448 :
デフォルトの名無しさん :02/12/22 12:27
TImageに画像が表示しきれないときに、スクロールバーを表示させたいのですが、どうすれば出来ますか?
>>448 TScrollBoxにTImageをのせる
450 :
デフォルトの名無しさん :02/12/22 13:10
>>449 やっぱそれしかないんですか…さんくすです。
>>450 >やっぱそれしかないんですか
TScrollBox は、もっぱらそのような目的で使用される。
TImage は TWinControl の派生クラスではないので、それ単体で
スクロールバーをもつことはできません。
452 :
デフォルトの名無しさん :02/12/22 18:30
>TScrollBoxにTImageをのせる 私もこの方法がお手軽で良いと思っていましたが, 画像ビュワとか作ってみると,拡大で限界が見えてくるんですよ. コントロールのサイズを果てしなく大きくできないし どんどん描画が遅くなるし >やっぱそれしかないんですか…さんくすです。 それしかないわけではなくて,一番簡単な方法という事ですね. 不満があるなら TImage は諦めて,イメージの表示サイズにあわせて 自分でスクロールバーを制御する事が必要となります.
Anders Melander氏のTGIFImage(
ttp://delphi.icm.edu.pl/ftp/d20free/gifimage.exe )を使って
アニメGIFを表示させようとするとすぐ固まってしまいます。
procedure TForm1.Button1Click(Sender: TObject);
var
GIF: TGIFImage;
begin
GIF := TGIFImage.Create;
try
GIF.LoadFromFile('C:\test.gif');//←GIFアニメ
Image1.Picture.Assign(GIF);
finally
FreeAndNil(GIF);
end;
end;
デモを参考にして一応こんな風にやってみたのですが、何が問題か分かりませんか?
UNISYSへの送金がすんでないからだろ
んなこたーない
form2をメインフォームとして、form2上のボタンを押すとfom1を生成して form1をShowmodalします。で、form1で処理をいろいろ行い、form1のonCloseで unit1が作ったオブジェクトをFreeし、form2側では form1.showmodal の次に form1.Free を書きました。 が、form1を閉じると「読み込み違反が起きました」が山のように出ます。 なにか間違ってるのでしょうか・・・。
Release
>>458 あ、なるほど。ヘルプ見て気付きました。
あと、Form1 := Tform1.create(Application); とかやっておけば、メインフォームを閉じたときに
form1も掃除できるのでは?と思ったのですが、どうでしょうか。
Memcheckには反応せず、LeakCheckerには反応したのでちょっと不安で(;´Д`)
>>459 Form1がメインフォーム=アプリと同じ寿命なら最初から自動生成しとけ。
>>461 了解です。もうちょっと勉強してきます(`・ω・´)
初めてActiveX DLLを作成することになったのですが、うまく例外を発生させることができません。 例外情報を渡すためのクラスとしてIDispatchインターフェースとExceptionクラスを継承したクラスを作成し、 例外発生時にはそのインスタンスを作成およびraiseして、クライアントアプリケーション側では、 そのインターフェースからエラー情報を取得するようにしたかったのですが、 クライアント側で発生する例外はただのExceptionになっています。 例外オブジェクトはActiveXとアプリケーションの間を飛び越えられてないようです。 ActiveXでエラー情報を渡す方法ってどのような方法がありますか?
>>463 えーと、どのスレで回答すればいいのかな?
他のスレでは、もうコメントついているのかな?
465 :
デフォルトの名無しさん :02/12/24 19:44
>>463 >クライアント側で発生する例外はただのExceptionになっています。
EOleException じゃない?
タブ式のペイントソフトを作っています。 PageControlのタブ名の代わりに縮小した画像を表示したいのですがどうすれば出来ますか?
人間やめますか?マルチポストやめますか? マルチポストは確実にあなたを破壊します。
468 :
デフォルトの名無しさん :02/12/25 00:00
ちょいとお邪魔します。 オートメーションサーバでクライアントからインターフェースを 受け取りたいのですが、下記のようにやってみたら 「EOleException'エラーを特定できません'」という例外がでてしまいます。 何かアドバイスを頂けると嬉しいです。 ・サーバ側のタイプライブラリでIAgentを定義 ・クライアント側で IAgnetを実装したクラスTMyAgent (TInterfacedObjectから派生)を作る ・クライアント側で begin FServer := CoServer.Create; FServer.ShowStatus; // ← 普通のメソッドは呼べる FServer.AddAgent(TMyAgent.Create as IAgent); // ← ここで例外 end;
>>468 そういうちょっと高度な質問は ML にした方が質の高い回答が得られると思うぞ。
>>468 >FServer.AddAgent(TMyAgent.Create as IAgent);
これだと、どの場所が問題か判らないから3行に変更してみたら?
FMyAgent:=TMyAgent.Create;
IMyAgent:=FMyAgent;
FServer.AddAgen(IMyAgent);
>>470 >FServer.AddAgen(IMyAgent);
ここで例外がでました。
試しにデバッグ版DCUを使ってみたところ、(これが原因かどうか分かりませんが)
MyAgentがQueryInterfaceでIStdMarshalInfoを要求されてE_NOINTERFACEに
なっているみたいです。
うーん、わけ分かんない(-_-;;
>>469 確かにそう鴨。
てゆーかML入れよ>漏れ
サーバ側も一緒に作ってるんでしょ? そしたらサーバ側で AddAgent にブレークポイント仕掛けてみたら?
仕掛けてみたけど、そこまで辿り着けないみたいなんです。
>>473 じゃ クライアント側でブレークポイント仕掛けて CPU 窓を開いて ステップ実行したら?
というか まずAddAgent の定義を晒してみたら?
BCBスレで質問したのですが、 全然関係ない事で盛り上がっていて返事が無いので、 こちらで質問します。 BCBスレによるとTRichEditとTMemoを同じ行間にする事は無理らしいのですが、 1つのTMemoコンポーネント内に 二色以上の文字列を表示させる事はできますか? できるならばどのようにすればいいのでしょうか? できないならば、選択して普通のテキストとしてコピーできる TMemoと同じ行間で、2色以上の文字を表示できるようにするには、 どのような方法をとるのが一般的でしょうか? プログラム側で文字列と色は書き込むので、 ユーザーにとってはReadOnlyで構いません。
>> どのような方法をとるのが一般的でしょうか? そのようなことができるエディタ用コンポーネントはたくさんあるし、 それを使ったらよいと思う。なぜ、TMemo と同じ行間にこだわるのか 謎です。
>>476 ありがとうございます。エディタ用コンポーネントは大きい物ばかりなので
サイズが大きかったりシェアウェアだったりするので敬遠していました。
TRichEditだとWin98とWin2000で行間が変わって
Win2000だと行間が異様に広すぎて情報が表示しきれないのです。
>>477 ゴメン 関係ない話題に食いついてた
TRichEditでフォントを調整してもダメなのですか?
479 :
デフォルトの名無しさん :02/12/25 18:37
メニューの項目にマウスカーソルを合わせると その項目にあわせた情報を文字列として生成して Tipヘルプとして表示したいのですがどうやればいいですか?
そうやればいいよ。
ったく、ゴミレスするぐらいならレスすんなよな。
TThreadについて質問です。 TThreadで複数のスレッドを作って、それらのスレッドから同じグローバル変数(Integer型)にアクセスしています。 このグローバル変数を参照・代入するときに同期処理をしなかった場合、つまり複数のスレッドから同時にアクセスした場合に、どの程度の不具合が出るのでしょうか? 計算結果がおかしくなるだけで済むのか、それともメモリ違反が起きてアプリケーションごと停止してしまうのか、エラーの程度を知りたいです。 詳しい方、お願いします。
> 計算結果がおかしくなるだけで済む と思う。マルチCPUでもなければ「同時に」アクセスする、という事態はない。
>マルチCPUでもなければ「同時に」アクセスする、という事態はない。 マジ?
たしかにないけど・・・そういうことじゃないだろ。
>>479 確かに、D7のTMenuItemのヘルプには
| ヒントテキストは,ヘルプヒントが有効な場合
| (つまり,フォームおよびアプリケーションの ShowHint プロパティが
| true の場合)に,ユーザーがメニュー項目の上でマウスポインタを止めた
| ときにヘルプヒントウィンドウに表示されます。
とあるけど、全然表示されませんね。
バグかな?それとも、WindowsXPだから?
>>482 スレッド1がグローバル変数nに1と2を交互に書き込み続ける。
while True do
begin
n := 1;
n := 2;
end;
スレッド2がグローバル変数nの値を表示し続ける
while True do
Writeln('n=',n);
このとき
スレッド2がn=1かn=2以外の値を表示することはない。
例外やエラーがでることはない。
1と2どちらが表示されるかはわからない。
値の代入・参照にSetN/GetNのような関数を使っていた場合はまともに動く保証はない。
マルチCPUでかつ同時にアクセスしても問題ないと思うよ
>>483 ,484,485,488,489
レスありがとうございます。
Integer型への単純な代入・参照ぐらいでは、変な計算結果になることはあっても致命的なエラーは起こらないということですね。
重ねて質問なのですが、同じようなケースで、複数のスレッドからInt64型やAnsiString型のグローバル変数を参照・代入したときや、インクリメントの処理(x:=x+1)などを行った場合はどうなるのでしょうか?
482のケースと同じと考えていいんでしょうか。
どなたかご存知の方がいらしたらお願いします。
>>490 CPUバスは64bitだけどレジスタは32bitなので、int64は2つのレジスタを使っている。だから、
>>488 と同じような事をした場合
$11111111 と $22222222 を 交互に書き込んだら
$11111111 と $22222222 以外に $11112222 や $222211111が読める場合がマレに出て来る。
AnsiStringについては2つのスレッドが 単なる代入をするだけなら 参照を書き換えるだけだから問題
ないだろあうが、
str:=str+"1"
str:=str+"2"
のような感じで相互に書き換えるとメモリ管理が変になるかもしれない
threadvar ってどういう時に使うのでしょうか?
>> 482のケースと同じと考えていいんでしょうか。 違うんじゃないか、と考える根拠はなに? そもそもなにやりたいの?
> $11112222 や $222211111が読める場合がマレに出て来る。 おつ、断言してるね。
> $11112222 や $222211111が読める場合がマレに出て来る。 もと質問ではエラーの程度が知りたいみたいよ。内容がどうなるかについては 興味ないみたい。というか、そもそもどうなるかわからんし
内容が不定ということで、エラーの程度はもとのケースと同じ
皆様レスありがとうございます。
>>493 >>違うんじゃないか、と考える根拠はなに?
>>そもそもなにやりたいの?
説明が足りなくてすいません。
質問した理由は、マルチスレッドのサンプルを見てみると同期処理をしなければいけない場合としなくてもいいケースがあるらしく、その辺の基準を知りたかったからです。
Int64について聞いたのは、Int64は32bitCPUでは1度に処理できないと思うので、複数に分けられた処理が重なるとどうなるか、
AnsiStringは、文字列を代入するときなど内部的にメモリ操作なんかをしてそうなので、その処理が重なるとどうなるか、
インクリメントについて聞いたのは、インクリメントは参照と代入をしますから、その処理が重なるとどうなるか
というのがそれぞれ気になったので質問しました。
>>491 ということは、Int64については、Pascalのコード上では別々に実行されても、アセンブラのレベルでは処理が混ざってしまうケースがあるってことですね。
で、それでも致命的なエラーにはならないと。
threadvarはスレッド毎に違う値を保持できるんだけど そういう値はTThread継承してフィールドとして保持するからあまり使われない。 AnsiStringや動的配列は内部で関数コールしてるからスレッドセーフじゃないかも。
同期処理をしなくても良い場合 ○単ワードで完結したデータを 多他方が読むだけの場合 例えば片方が読むだけの処理で片方が読んで書く処理はOK 複数ワードのデータの場合は片方が書くタイミングによって は正しく送れない 基本的にそれ以外は同期処理が必要 ただ、同期処理といっても自前で簡単に出来る場合もある。 1、複数ワードのデータ、例えば文字列をスレッド間で渡す場合は、 文字列の領域を読むスレッドが 完全に読める一定時間確保しておいてそのポインタを渡せばよい 2、セマファのように相互に書き換える旗を実装する場合は x86ならXCHG命令を使う 3、複数スレッドでカウンタを実装する場合はアセンブラのinc命令を使う これを巧く組み合わせればOSの同期処理を使わなくても大丈夫
OSの同期処理を巧く組み合わせれば、↑を使わなくても大丈夫 同期処理をさぼりたい理由って何だろうか。しなくてもよいことは しない方がよいことは分かるが
Synchronize つかってメインスレッドにやらせりゃ、自動的に排他処理になる のになんでめんどくさいことしなきゃならんの。速度クリティカルならまぁ わかる
>>500 同期処理をサボるんじゃなくてさ・・・
マルチスレッド使いこなすには同期処理しなくてよい場面をどれだけ作れるかって事
じゃないかなと思ってたんだが・・・・
まあ、無理やり理由つけると、OSの同期処理を使ってしまうとKylix<->Delphi移行なん
て時に不便かな・・・程度かな
Synchronize は Windowsメッセージを使って、メインスレッドにやらせてる訳で
よく判らんけど結構重い処理だと思うよ。
たまに呼び出すならいいけど、例えば、処理の進展状況を報告する程度の事なら
integer のグローバル変数を介して非同期にやりとりした方がいいでしょ
503 :
デフォルトの名無しさん :02/12/26 11:50
TEditで選択中の文字列の背景色と文字色を変更する事は可能ですか?
>>503 どうだろ?
GetSysColorの呼出個所にパッチをあてておいてWM_SYSCOLORCHANGE を送るとか・・・無理かな
>>504 それはTEditコンポーネントを改造するという事ですか?
ごめんなさい、良く分かりません(^^;
たぶんで答えられても困るのですが(^^;
>> たぶんで答えられても困るのですが(^^; できるかもしれないが、超めんどくさいことをしなけりゃならん、と 思う。これでどう。
WM_PAINTで標準の描画が行われた後のタイミングを捉えて、 BrushCopyかなんかで色を置換するのは駄目?ちらつくか。
>> GetSysColorの呼出個所に 1)TEdit はウィンドウズのエディットコントロールのラッパー 2)その各部の色(背景色以外)はシステムカラーで決まってる(?) 3)システムカラーを変更するとできるだろう。たぶん(藁 4)でもその結果、すべてのエディタに影響が及ぶ 5)これを回避するために・・・・よくわからんが、めんどくさいことをしなければならないだろう ま、標準コントロールの色をいじりたがるのは初心者だけだね。
ま、(?)とか「たぶん」とか書くのも初心者だろ。 よーするに有効な手段はないからてめえでコンポーネント作れ で、よろしいか?
あのね、たぶん、と答えたら困る、ってことで、詳しく説明したつもりなんだけどね。 なんで逆切れしてるの。 選択色を変更しなけりゃできない機能ってどんなことだい? わざわざコンポーネントを一から作る価値に見合う機能なんだろうね?
選択色を変更したいのでエディタコンポーネントを一から作るってのは 凶器の沙汰。
沙汰 「沙」は砂、「汰」は選び分ける 水中でゆすって、砂を捨て米や砂金を選び分ける意
>>505 そういうレベルならモナーに聞いて欲しかったな。
挑戦的な質問に聞こえたからああいう答え方になったけど、
TEditコンポーネントを改造というかその延長では出来ないと思うよ
だから、TRichEditで頑張った方がいいと思うよ
ちょっとした疑問なんですが、プロジェクトのソース、pasとdcu、dfmを合わせても700KB 程度しかないのに、コンパイルすると4MB近くになってしまいました。 今までは、せいぜいバイナリは1.5倍〜2倍程度だったのですが、今回だけ異様です。 この妙なサイズはどこから来るのでしょう? (外部リソースは全て動的にアクセスしているので、exeが巨大化する理由がわからないんです)
誰も的確に答えられませんでした。
皆、的確に答えたが、質問者が理解できなかった。
ダブルバッファリングした上で
>>509 の方法が多分一番楽。
つか、スルーされた時点で、からかいに来たのかと疑ってる。
また、たぶん、かよ。 やってみてから言ってよね。
上の人のは偽物です(^^;
>>519 その方法を詳しく教えて頂けませんか?
ブラシの色を変えて、それで選択部分の矩形をどうやって求めるの?
>> その方法を詳しく教えて頂けませんか? いい質問だね。きっと、519は具体的に答えてくれるよ。
>>519 ダブルバッファにする為には今度はBeginPaintをひっかけないといけないんじゃないの?
さあ、一体誰が 本 当 に 的 確 に 答えられるんでしょうかねえ(^^;
>>507 >>511 これは偽者です。
レスが遅れまして申し訳ございません。
>>512 フォームのデザインの関係で見栄えがちょっと悪かったので
変更できるのかな〜と・・・
>>513 改造でも狂気の沙汰ですか?
>>515 私のレベルがスレと合ってなかったみたいっすね(^^;
もっと簡単に出来るのかと思ってたけど、かなり難しいようですね。
どうりでググっても見つからない分けだ。
めんどくさいことするだけの価値があるかどうか、質問者は再考するように! というのが一番的確な回答
519は逃げますた。
>>521 こっちも偽者。
むぅ・・・、トリップ付けちゃる。
>> 改造でも狂気の沙汰ですか? 515さんも答えてるけど、TEditの改造で簡単にできるとは思えないよ
要するに、一回(メモリ上に)標準色で描かせておいて、 後から標準の選択色で塗られているピクセルだけ塗り替えるって事。 BrushCopyってのは、ヘルプの文面があれだけど、要するに透明色つき描画なんで、 ダブルバッファリングで得たコントロールのイメージBitmapから、 標準の選択色を透明色にして…云々。 書いてて、DIBでポインタアクセスの方が手っ取り早い気もしてきた。 まあ手段は何でもよくて、最悪GetPixel/SetPixelで1ピクセルずつ調べても、 面積にもよるけど最近のCPUならそんなに遅くならない気もする。
>>524 標準コントロールは、WM_PAINTのWPARAMにDC送ると、
画面じゃなくそっちに描いてくれるので、ダブルバッファリングは割と楽。
>>527 そんなに大変だと思ってませんでした。
他の方法(TRichEditを使うとか、選択しないとか)でやってみます。
>>まあ手段は何でもよくて、最悪GetPixel/SetPixelで1ピクセルずつ調べても、 >>面積にもよるけど最近のCPUならそんなに遅くならない気もする。 おう、すごく現実的な回答だけど、こんなのでは実装したくなくなるねぇー
一からコンポーネント作るより楽だったんじゃねえの?
>> 一からコンポーネント作るより楽だったんじゃねえの? それは認める。いろいろ勉強になった。ありがとう。
実際やれと言われたら出来る人はゼロだったということか。
>>538 537 です。実用的かどうかはともかく、実際、わたしならできるように思います。
うぬぼれでなく。
>>531 BrushCopyって便利そうですね。
コンポーネント単位で描きなおすんじゃなくて、
画面の標準色の有り無しを調べて塗り直すんですね。
よっしゃ、諦めよう・・・・。
へたれはカエレ!!(・∀・)
>>532 ああなるほど、今実験したら
type TMyEdit=class(TEdit)
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
でちゃんとWMPaintも呼ばれるし、 これなら簡単ですね
>> これなら簡単ですね そう。あと、選択部分の矩形領域をどうやってもとめるのか、を 解決できれば、できそう。GetPixel はできればやりたくないです。
あと文字の変更時は WMPaint呼ばれないから、文字変更毎に Invalidate させてとか も必要かな。でもたいした事じゃないか
>そう。あと、選択部分の矩形領域をどうやってもとめるのか、を 別に求める必要は無くて、使いたい色で一面に塗られたもうひとつのメモリビットマップに、 標準選択色を透明色ということにして色抜きコピーしてやれば解決。メモリの無駄とも言う。 全部調べるにしてもDIBでポインタアクセスした方がGetPixelより圧倒的に速いし。
>>544 1) EM_GETSEL を送って、選択領域の最初と最後の文字インデックスを求める
2) EM_POSFROMCHAR で選択領域の最初と最後の文字の論理座標を求める
3) 2) で求めた座標の最初と最後のところの近辺を GetPixel で調べて
矩形の四点を求める。うーむ、左上と右下の2点で十分だね。
一行エディットだとこれでいいと思う。
>> 標準選択色を透明色ということにして色抜きコピーしてやれば解決 これの具体的な説明を教えて。
TransparentBltって色抜きコピー可能なAPIがあって、BrushCopyはそのラッパー。 で、例えば、白地にひとつ青い矩形が書かれた画像があって、青を赤にしたいとする。 真っ赤な画像を別に用意して、そこへ、元の画像を青=透明でコピーすると、白地に赤い矩形になる。 こんな説明でいい?
>537 です。実用的かどうかはともかく、実際、わたしならできるように思います。 >うぬぼれでなく。 「人に頼れば」出来ると言う事だったらしい。プ
>>548 分かると思う。帰宅したらやってみる。ありがとう。
>>「人に頼れば」出来ると言う事だったらしい。プ いや、GetPixel や ScanLine を使えばできることはできる。もっと効率よく ということさ。
(´∀` )エヘヘ
誰でもいいからさっさと作れよ。
>>516 もしかしたら…ですが,『プロジェクトオプション』 - 『リンカ』の
『TD32デバッグ情報を含める』にチェックが入っていませんか?
556 :
デフォルトの名無しさん :02/12/26 19:29
>>503 程度も実現困難なDelphiはOOPLとしての限界を露呈してしまったね。
言うなら Windows標準コンポーネントの 限界だな。 バカはしゃべるなよ。
.NETなら多少長めに見積もって5分ってとこだな。
>>556 アフォかそれが出来ないこととOOPLの限界とは関係ないだろ。
素人はでてくんな。バカ。
Delphiなら4分ってところかな。って何の話?
カップラーメンの麺が程よく伸びる時間
最近のカップラーメンは4分が一般的だね。 ところで俺はGooTaのワンタンはおいしいと思うんだ。
カップラーメンはちょっと堅いくらいがうまいのに
>>559 もともとのWinコントロールにその機能が無いのに無理でしょ。
DelphiやネイテブのWinアプリだと最悪 DLL呼出部を検索してそこにパッチをあてる
という方法が使えるわけだけど、.NET だとそれも使えない訳で
あ、それと実験してみたけど結構大変みたい。 試しにオーナ描画で procedure TMyEdit.WMPaint(var Message: TWMPaint); var str:string; FCanvas: TCanvas; PS: TPaintStruct; begin str:=Text; with Message do if DC = 0 then DC := BeginPaint(Handle, PS); FCanvas:=TCanvas.Create; try FCanvas.Handle := Message.DC; FCanvas.Brush:=Brush; FCanvas.Font:=Font; FCanvas.TextRect(BoundsRect,0,0,str); if SelLength>0 then begin FCanvas.Brush.Color:=HighLightColor; FCanvas.TextRect(BoundsRect, FCanvas.TextWidth(copy(str,SelStart,SelLength)) ,0,SelText); end; finally FCanvas.free;end; end; とやっても、肝心の選択動作中に WMPaintが呼ばれないし、キャレットが表示されない。 OnChangeだけでなくキーボードイベントも乗っ取って描画を制御しないといけないみたい
>>566 本題と関係ないけど、EndPaintもinheritedも無いような、気のせい?
>>567 いやその通り EndPaint忘れてたよ。
純粋に技術的なチャレンジとしては意味があるとは思うけど、
>>526 フォームのデザインの関係で見栄えがちょっと悪かったので
>変更できるのかな〜と・・・
のような厨房質問への回答としてはむなしいね。「労多くして功少なし」
>>503 程度も実現困難なDelphiはOOPLとしての限界を露呈してしまったね。
>>570 で、APIプログラミングとOOPLに何の関係が?
>>570 C# でのサンプルを提示してくれるかな?
無理だろうけど。
挑発にのるな!
>>570 みたいのは、スキルのないヤツしか書きこめんだろう、恥ずかしくて。
>>573 いーでしょ。おまえが管理しているわけではないんだから黙っていろ。
コードを提示できるならすばらしいことなんだし。
>>574 おっ、OOPLの意味もわからん馬鹿がきたか。
>>570 は書き込みとしても意味不明
だと理解できないのか。厨房は寝る時間だぞ。
576 :
デフォルトの名無しさん :02/12/28 01:20
アップデートCDキタ━━━━━━(゚∀゚)━━━━━━!!!!!
和訳へただけど、リリース前から変更点が解説されてるのはうれしい。
>>575 バカに対して、吉外のようにわめくあなたもすばらしい。
そろそろ帰りな。
>>576 .NETのでしょ?
使ってないもので、しかも、試作品のパッチもらっても困るよな。
無料でD8が送られて来たら大歓迎だが(笑
タイトルバーの高さを求めたいのですが、どうすれば良いんでしょうか?
げっとしすてむめとりっくす
583 :
デフォルトの名無しさん :02/12/31 21:58
>>582 実はImageとフォームの大きさを同じにしたいのですが、
SetBounds(Left, Top, Image.Width, Image.Height + GetSystemMetrics(SM_CYCAPTION));
こうやるとボーダー(?)分幅や高さが足りなくなってしまいます。
こういう場合どうするのが一番良いんでしょうか?
ClientHeight := Image.Heightとかやる。
>>583 つーか、「フォーム全面にイメージを載っける=見た目、イメージだけ状態」
にしたいってことでは?もしかして。
587 :
デフォルトの名無しさん :03/01/01 01:55
どなたか Shell Namespace Extension をDelphiで使ったことがあるという人いませんか?
Delphiのソース編集を外部エディタ(TeraPad)でしたいのですが できないのでしょうか?
_____________ ∧,,∧∩ / ミ,,゚Д゚彡 < あけ、おめ (ミ ミ \____________ 〜ミ ミ ∪''∪外部エディタではないが、 メニューでエディタを切り替えられる方法 [ツール][ツールの設定]を選びませう [プログラム] エディタの指定 C:\Program Files\EmEditor3\EMEDITOR.EXE [実行時引数] 普通にファイルを引数として渡す $EDNAME EmEditorの場合、行番号も引数に渡すことが可能 /l $ROW $EDNAME 一度、Delphiでファイルを保存してから EmEditorでファイルを開く方法 $SAVE /l $ROW $EDNAME 同様に、編集中ファイルのフォルダを開くと 実行ファイルのフォルダを開くを 作っておくと、かなり便利。
Eclipse で Delphi を使えるようにしる!
>>589 あけましておめでとうございました&ありがとうございました。
Delphiのエディタでフリーカーソルがなくなったらだいぶましになるのになぁと思ってみたり
>>589 こういうページがあったんですか
ありがとうございます
ボーランドの製品は大昔からフリーカーソルなのです。 MSも最初はフリーカーソルだったのに、ラインエディタあたりから変わった。
_____________
∧,,∧∩ /
ミ,,゚Д゚彡 < おめ あけ
U ミ \
@ミ ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∪''∪
>>592 さん
> 編集中のソースのあるフォルダを開く(ツリービュー有り)
> &Explorer cmd.exe /c delphi_tool_explorer.bat $PATH($EDNAME)
[プログラム]
エクスプローラを指定、以下のどの指定方法でもOK
explorer
explorer.exe
C:\WINNT\explorer.exe
[作業フォルダ]
設定しなくてよい
[実行時引数]
現在開いているファイルのフォルダを開く
"/n", "/e", $PATH($EDNAME)
こっちでよいのでは?動作確認しました。
あと、コードテンプレートを指定エディタで開くのも
いれておくと、楽に編集できますです。
>>591 さん
旧版からの伝統で某に直す気一切なしです
ガリレでもフリーカソのみだったら・・・
フリーカーソルまんせー(ぼそっ)
∧,,∧ ミ,,゚Д゚ミy━~~ U ミ 俺もマンセですけどね。 フリカ拒絶派も取り込まないと ガリレが生き残る道は… 単にフリカON/OFFスイチがあればいいだけなのに 無いだけで、IDEくそ呼ばわりですから....
>こっちでよいのでは?動作確認しました。 俺にゆーな。試したんなら直してくれよ。 >あと、コードテンプレートを指定エディタで開くのも >いれておくと、楽に編集できますです。 こっちは載ってるよ。
∧,,∧ Wikiの使い方がわからないのですもの。 ミ,,゚Д゚彡 ミつ[|lllll]). 〜ミ ミ ∪''∪ コードテンプレの記述はありました。 WZの他にEmとか秀の設定があるといいかも。 あと、編集前に$SAVEは入れた方がいいかと。
601 :
デフォルトの名無しさん :03/01/01 23:22
ボーランドが非フリーカーソルをサポートしないのは、 フリーカーソルに慣れて欲しいからかもしれないね。 フリーカーソルの方が便利だから。 非フリーカーソルで、コメント2を追加したい場合はどうするの? Line1; // コメント1 Line2; ↓ Line1; // コメント1 Line2; // コメント2
602 :
デフォルトの名無しさん :03/01/01 23:26
みんなーボーランドと一緒に滅びようなー
>>601 フリーカーソルの方が面倒では?
Line1; // コメント1|←カーソル
Line2;
↓
Line1; // コメント1
Line2; |←カーソル
↓
Line1; // コメント1
Line2;|←カーソル(BS連打)
↓
Line1; // コメント1
Line2; // コメント2|←カーソル
フリーカーソル、もう慣れちゃったなー。今更変えられない。
606 :
デフォルトの名無しさん :03/01/02 00:19
タブが消えたから分かり難かったです。
Line1; // コメント1
Line2;
Line1; // コメント1|←カーソル
Line2;
↓
Line1; // |コメント1 Ctrl+← で "コ"に移動
Line2;
↓
Line1; |// コメント1 ←を3回押す
Line2;
↓
Line1; // コメント1 ↓を押してコメントを書き始める
Line2; //
>>603 Line1とLine2の長さが違う場合はどうするのですか?
>>606 非フリーカーソルの場合、
Line1; // コメント1|←カーソル
Line2;
↓(↓カーソル押)
Line1; // コメント1
Line2;|←カーソル
↓
Line1; // コメント1
Line2; // コメント2|←カーソル
608 :
デフォルトの名無しさん :03/01/02 00:22
それに非フリカで矩形選択はどうなるのだろう?
609 :
デフォルトの名無しさん :03/01/02 00:24
>>607 じゃ、常に ; の二文字後からコメントが始まるの?
// を縦にそろえたりはしない?
AA;
AAAAA;
AAAAAAAAA;
AAAAAAAAAAAAA;
↓
AA; // コメント
AAAAA; // コメントの続き
AAAAAAAAA; // コメントの続きの続き
AAAAAAAAAAAAA; // 等など
610 :
デフォルトの名無しさん :03/01/02 00:26
>>608 矩形選択時だけフリカになるだろ。
TeraPadとかほとんどのエディタがそういう手法だが?
>>608 ボックス選択とカーソルモードは直接的な関係はないと思われ。
>>611 >フリカ
通ぶって 略語作って 赤っ恥
614 :
デフォルトの名無しさん :03/01/02 00:30
非フリカの利点が解らないよ! 行末で→を押すと次の行に移動する事? リターンキーは使わないのかな…。
キーマクロも非フリカだと使いにくそうですが。
>>614 Enterしたら改行入っちゃうじゃん。
結局ボーランドのIDEを使いにくくするための策略でしょ?
フリーカーソルかどうかなんて他の欠点と比べれば取るに足らない問題だ。
でもね、もしDelphiのエディタがメモ帳になったらDelphiを捨てます。
結 局 慣 れ
Delphiのテキストエディタって矩形選択で右端がキャレットより一つ余分に選択されるやつ。 これ嫌。
BorlandがTEditor使えば良いんだよ。
JavaDoc的ドキュメンテーションツールとエディタによるサポートがないのは致命的。
非フリカで縦書きの時はどうするんだろう?
自動インデント
非フリカを売りにしたソフトは無いんだから。
そりゃWindowsで非フリカは当たり前だからね。
最初のWindowsでは技術が無くてフリーカーソルに出来なかったんでしょ。
TPictureにLoadFromStreamってありますよね? Image.Picture.LoadFromStreamとやろうとしても未定義の識別子と怒られてしまいます。 ヘルプ見てもやっぱりあるようなのですが…何か勘違いしてます?
Imageがないんじゃないの。
Image.Picture.Graphic.LoadFromStreamだといけるんでそれはないかなと思います。
TPicture.LoadFromStreamはないよ。 ヘルプ確認してみ。
TPicture.LoadFromStream TPicture参照 LoadFromStream メソッドは,Stream から画像を読み出します。 procedure LoadFromStream(Stream: TStream); 説明 LoadFromStream を使うと,TStream オブジェクトから画像を読み出すことができます。作成される TGraphic クラスは,ストリームに格納されているデータの型によって指定されます。 ストリーム内のデータは,別の TPicture オブジェクトまたは TGraphic の下位オブジェクトの SaveToStream メソッドへの呼び出しによって書き込まれたものです。
それはCLXリファレンスな罠
う、そうでした…。 なんかImage.Picture.Graphic.LoadFromStream(StringStream);だとエラーが出るんで使えるのかと思ってました。
Image.Picture.LoadFromFile('test.jpg'); だと大丈夫なんですが、 Image.Picture.Graphic.LoadFromFile('test.jpg'); だとエラーが出てしまいます。 これって何が原因なんでしょうか?
Graphicが作成されていない
アホー
Delphiのエディタで時々Enterキーを押しても 改行に成らないときがあるのですが どうしたら元に(改行するように)戻るのでしょうか?
Insert
>>644 ありがとうございます 治りました
こんな基本的なこと聞いてすいませんでした。
>>641 実はBitmapとJPEGの両方を対応したいのですが、
Image.Picture.Graphic := TJPEGImage.Create;
とやるとBitmapが読めなくなってしまいます。
本当は自動的にグラフィックデータのフォーマットを判別するTPictureを使いたいのですが、
TPictureにはLoadFromStreamないようなので困っています。
Bitmap→PNGでした スマソ
>>646 君の考えている方法とは違うけど、俺ならこうする。
procedure TMainForm.OpenMenuItemClick(Sender: TObject);
var
FName: string;
ext: string;
png: TGLDPNG;
begin
if OpenPictureDialog.Execute then
begin
FName := OpenPictureDialog.FileName;
ext := LowerCase(ExtractFileExt(FName));
if ext = '.png' then
begin
png := TGLDPNG.Create;
try
png.LoadFromFile(FName);
Image.Picture.Assign(png); // Image: TImage;
finally
png.Free;
end;
end else if (ext = '.bmp') or (ext = '.jpg') or (ext = '.jpeg') then
begin
Image.Picture.LoadFromFile(FName);
end;
end;
end;
バカー
650 :
デフォルトの名無しさん :03/01/04 13:50
TWebBrowserでHttpのステータスコードを取得する方法ってありますか?
652 :
デフォルトの名無しさん :03/01/05 00:23
初歩的な質問で申し訳ないのですが・・・ TCard = class 〜〜 end; TEventCard = class(TCard) 〜〜 end; THappenCard = class(TCard) 〜〜 end; というTCardを基底にした2種類のクラスがあり、 この2種類のどちらも格納できる配列を作成したいのですが、 その場合、Array of TCard とすれば問題ないのでしょうか? もし、その配列に TEventCard を TCard に型キャストして代入したとすると、 TEventCard で拡張したフィールド変数などの情報は保持されるのでしょうか?
されるよ。参照するときは(arr[n] as TEventCard)すれば良し。
>>652 問題ないです。キャストが必要なのは値を取り出す場合のみです。保持されます。
1000getおめ♪
ゴメソ、質問さしてください。 TForm.OnCloseQuery で分岐処理をしていて、TForm.Close メソッドを呼び出しても 必ずしも Form が閉じられるとは限らない場合、当該 Form が閉じられたかどうか 確認するにはどうすればいいのでしょうか。
埋めてる奴氏ねよ。マジ迷惑なんだよ。
>>657 Form.Visible
死ねって言われて死ぬのはおまえぐらい。プ
D6Up2のdemoプログラムで
∧,,∧ カスタマイズダイアログで
ミ,,゚Д゚彡 ActionMainMenuBar
ミ つ旦)~~ に"戻る"を押すと
〜と,,,~),,~) MainMenuが消えますね。なぜかしら。
あと、ヒントのショートカット表示の動作が変かな?
ちょっともてあそべば、使えるものに
なるような気がするような、しないような。
とりあえず、ここのサンプルは勉強になるでしょう。
http://homepages.borland.com/strefethen/info/ABExpressTutorial.htm いろいろ触ったけど
MainMenuBarだけカスタマイズOFF
という動作は出来ないみたい。
MainMenuだけは違うクラスを使った方がいいかもね。
(DelphiIDEもMenuは違うもの使っているみたいだし)
ツールバーカスタマイズに関してはそれなりに使えそうな手ごたえでした。
>>658 TForm.OnClose で Action := caHide にしている場合には、Visible で
判定できそうですが Action := caFree にしている時はどうなんでしょう。
おそらく Form のメンバにアクセスしない方がいいとおもうので、
外部にフラグを用意して OnClose でセットするくらいしかないのでしょうか?
Delphiはぬるぽないんだっけ?
ActionManager / ̄ \ いろいろ試したけど 0⌒> ヽ [Tools][customize] ⊂ニニニ⊃ のメニュー部分だけ変更させたくない ミ,,゚Д゚,彡 って動作は出来ないみたい… ミ,つ酒O と,,,~),,~) なんとなく、なのですが ActMainMenuは使いにくい オブジェクトツリーがないとオブジェクト選択も難しいっす。
モナースレの>990さんどうもありがとうございました がんばって作ってみます
668 :
ComboBox1 :03/01/05 08:58
ComboBoxについて質問です。 ComboBoxのイベントは OnClose → OnChange の順で起きる のですが、OnCloseの時点で選択肢に変化があったかどうかを認識し、 それにより動作を変えたいです。 これを実現するにはどうしたらよいでしょうか。
本当にTWebBrowserでHttpのステータスコードを取得する方法ってないのでしょうか? Webを参照するプログラムを作っているのですが、どうしてもHTTPのステータス情報が 必要なのです。 WinInetで作成する方法も考えたのですが、TWebBrowserを使用するほうがはるかに 簡単なのです。(Httpステータスコードさえ解決すれば、すべて解決するのです。) 誰かTWebBrowserでHttpのステータスコードを取得する方法を見つけてください。
型違いの質問です 'String' と 'Cardinal' には互換性がありません 'TStrings' と 'Cardinal' には互換性がありません が出てくるんですが、どうやって互換性があるようにすればよいでしょうか
これくらいなら答えられるぞ Mojirets → String Mojiretsus → TStrings Tsuka → Cardinal として Mojiretsu := Format('%d', [Tsuka]); Mojiretsus.Text := Format('%d', [Tsuka]); Tsuka := StrToInt(Mojiretsu); Tsuka := StrToInt(Mojiretsus.Text);
>>669 こんな奴がプログラミングすんな
マジで
674 :
デフォルトの名無しさん :03/01/05 15:15
OSの再インストールしたいんだけど Delphi6のバックアップはどうすればいいの? Borland\以下のファイルとレジストリコピーして OSとDelの再インストールが終わったらまた上書きすればいい?
去年までヲチ専門だったけど、htmlタグとJavaScriptでサイト作って 二年で350万hitした。一度やってみなよ。 初回のみだけど、1枚以上のオパーイ画像晒せば4000hitくらいカウンタ回る。 転用されるだけされて警告せずにアク禁することもできるし、裁判で白か黒に 思い切って訴えてしまえば50パーセントで神になる。 カッコ良きゃオフラインでセクースすればいいだけ。暇つぶしになる。 ビデオはめ撮りとかスカトロとか色々あるのでマジでお勧め。
なんだこのバカは。 20歳にもなってこんなレベルの人間もいるのか...。
>>て。 サンスク 自分はまだ入った事のない領域だ(?)
最小化したときにタスクトレイにアイコンを表示して そいつをクリックで復活させたいんだけどウィンドウは復活するんだけど どうしても復活したときにウィンドウが前面に来てくんないよ 色々やってみたけどどうしてもだめ どうしたらいいんでしょ? 田舎帰ろうかな { 最小化から復活したとき } procedure TForm1.appRestore(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @FIconData); SetWindowPos(Form1.Handle, HWND_TOP, 0,0,0,0,SWP_SHOWWINDOW + SWP_NOSIZE + SWP_NOMOVE ); SetActiveWindow(Form1.Handle); end;
TopMostして解除(藁
帰れ。
682 :
デフォルトの名無しさん :03/01/05 20:51
>>680 あ できた ありがと
と思ったら一番前にいるのにアクティブにならん タイトルバーがグレイだ Why!?
SetActiveWindow(Form1.Handle); ってしても
Form1.Activate; ってしてもだめだ どちて?
コードくれくれ
>>686 function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL ; stdcall; external 'user32.dll' name 'AllowSetForegroundWindow'; stdcall;
↑をどっか見えるとこに書いて
{ 最小化から復活したとき }
procedure TForm1.appRestore(Sender: TObject);
var
PID : DWORD;
begin
Shell_NotifyIcon(NIM_DELETE, @FIconData);
SetWindowPos(Form1.Handle, HWND_TOPMOST, 0,0,0,0,SWP_NOSIZE + SWP_NOMOVE + SWP_SHOWWINDOW);
SetWindowPos(Form1.Handle, HWND_NOTOPMOST, 0,0,0,0,SWP_NOSIZE + SWP_NOMOVE + SWP_SHOWWINDOW);
GetWindowThreadProcessId(Application.Handle, @PID);
AllowSetForegroundWindow(PID);
SetForegroundWindow(Application.Handle);
end;
とやったらできたよ
688 :
デフォルトの名無しさん :03/01/05 23:22
Httpのステータスコードってな〜に〜?
Q D6パーソナルにアクションマネージャーは?
A ありません
↑これって、字数の関係で
>>1 に書けなかったのかもしれないけど
>>1 に書くべきでは…
最近は無いか…。この質問。
WikiのFAQにリンクすればいいんでしょ
自己解決出来ましたので一応ご報告。 コンボボックスを開くときにitemindexの値を変数に取得しておき、 OnCloseUpイベントでitemindexに変化があったかどうかを比較 することで変化の有無に応じて動作を変えることに成功しました。(^^;
レス番号だと思った。 そして、別スレッドで接続させたいのかと思った。 TWebBrowserってIEコンポーネントをつかうのれすね。 最初の HTTP/1.0 302 Found が欲しいと。
696 :
デフォルトの名無しさん :03/01/06 12:59
TTreeViewのノードをクラスで管理したいと思い 下のようなサンプルプログラムを書いてみたのですが これだとTreeviewのノードをクリックしたときにエラーが出てしまいます。。 よろしかったら良い方法を教えて頂けないでしょうか? type TForm1 = class(TForm) TreeView1: TTreeView; Edit1: TEdit; Memo1: TMemo; Button1: TButton; Memo2: TMemo; procedure Button1Click(Sender: TObject); procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end; TTreeItem = class private FTitle: String; FData: String; procedure SetData(const Value: String); procedure SetTitle(const Value: String); public property Title: String read FTitle write SetTitle; property Data: String read FData write SetData; end;
procedure TForm1.Button1Click(Sender: TObject); var NewItem: TTreeItem; begin NewItem := TTreeItem.Create; try NewItem.Title := Edit1.Text; NewItem.Data := Memo1.Text; TreeView1.Items.AddObject(nil, NewItem.Title, @NewItem); finally NewItem.Free; end; end; procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node: TTreeNode; begin Node := TreeView1.GetNodeAt(X, Y); if Node = nil then Exit; Memo2.Lines.Add(TTreeItem(Node.Data).Data); end;
{ TTreeItem } procedure TTreeItem.SetData(const Value: String); begin FData := Value; end; procedure TTreeItem.SetTitle(const Value: String); begin FTitle := Value; end;
NewItem.Free; してしまったものに Memo2.Lines.Add(TTreeItem(Node.Data).Data); でアクセスするからでしょ Node.Data に格納されるのは参照だけ。本体を free しちゃだめでしょ
TTreeItem(Node.Data)が危険なような。 Assigned(Node.Data) and (TObject(Node.Data) is TTreeItem)もチェックしたら。
>>699 >>700 参照だけなんすね。。ありがとうございます。
FreeをForm1のDestroy時に持っていって
MouseDownイベントを以下のようにしたのですが
EAccesViotationのエラーが出てしまいます。。
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Node: TTreeNode;
begin
Node := TreeView1.GetNodeAt(X, Y);
if Node = nil then Exit;
if Assigned(Node.Data) and (TObject(Node.Data) is TTreeItem) then
Memo2.Lines.Add(TTreeItem(Node.Data).Data);
end;
ふーむ、あとあやしいのは TreeView1.Items.AddObject(nil, NewItem.Title, @NewItem); で、@NewItem じゃなくて pointer(NewItem) じゃないかと思ふ
>>702 あ、うまくいきました。
pointerにキャストと@ 演算子は違うものが
入るんですね。。中身を調べてみたら違ってました。
そこら辺また勉強しなおします。
>>702 さんみなさんありがとうございました。
恥ずかしながらもう一つ質問です。。
>>701 に
>FreeをForm1のDestroy時に持っていって
と書いたものの、Form1のDestroy時は
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i := TreeView1.Items.Count -1 downto 0 do
TreeView1.Items[i].Delete;
end;
のようにノードを解放すれば
NewItem := TTreeItem.Create;
で得たメモリは解放されるのでしょうか?
>のようにノードを解放すれば >NewItem := TTreeItem.Create; >で得たメモリは解放されるのでしょうか? 開放されない。ノードを削除する前に TTreeItem(Node.Data).Free を実行しないとダメ。 だって、TTreeNode.Data は Pointer であって、それに 何を格納しているか、TreeNode 自身は知らないわけですし。
>TTreeItem(Node.Data).Free を実行しないとダメ。
実際の
>>704 のコードでは、
TreeView1.Items[i].Delete;
の前に
TTreeItem(TreeView1.Items[i].Data).Free;
を実行します。
706です。 あぁ、レベルの違いがあって削除するのはめんどくさいね。 TreeViewの各ノードのDataにAddするときに、別にリストとして保持しておけばいいよ。 TListを使えば純粋にリストとして保持できるし、TObjectListを使えば自動的に メモリを解放することもできる。
OnDeletion
710 :
デフォルトの名無しさん :03/01/07 01:15
Form1とForm2と作成。 Form1がメインフォームね。 Form1とForm2と両方とも開いている状態で タイマーでも通信でも何でも良いんだけど、 非ビジュアルな(?)方法でForm1からForm2.Closeするようにコーディング。 普通に動かすとForm2.CloseでちゃんとForm2が閉じるんだけど、 アプリケーションを最小化した状態でForm2.Closeするとなんかおかしい。 タスクバーのアプリケーションをクリックして 最小化を解除すると、Form2が残りっぱなしになってる。 しかも、この生き残りのForm2は×ボタンをクリックしても閉じない。 Form2.Hideでも同様の現象でした。 デバッガーで除いてみるとHide後、Form2.VisibleはFalseになってる。 にもかかわらず、画面上にForm2はちゃんと表示されている。 Delphi(というかWindows)ってこういうもんなの? ガイシュツだったらスマソ。
>>710 ありがとう。最小化した状態で勝手にクローズはしないと思うけど、覚えておくよ
>>710 激しくガイシュツ。VCL読んでみれ。
あ、あと、Windows固有の現象ではないぜよ。
Kylix2でも再現できるはずだす。
713 :
デフォルトの名無しさん :03/01/07 23:55
TCoolBarにTToolBarを何個か置くソフトを作っているのですが TToolBarをD&Dして移動させた後の状態を保存するにはどうすれば 良いのでしょうか? TToolBarのTop,LeftをINIファイルで保存、読み込みなどはしてみたのですか うまくいかないです。。
716 :
714です :03/01/08 01:59
解決しました。
>>714 >プラウザのボタンや、テキストボックスに文字を入力したりって、
>Delphiでプログラムは可能ですか?。
可能かもネ。
>例えば、
http://www.google.com/のテキストボックスに >検索したいキーワード(ActiveX DOM取得など)を入力して
>ボタンを押すまでの処理を自動化させるには、どうすれば良いでしょうか。
努力すればいいです。
718 :
デフォルトの名無しさん :03/01/08 02:17
>>710 なんで? Close内でReleaseが呼ばれてちゃんと開放されるんじゃないの?
719 :
デフォルトの名無しさん :03/01/08 05:55
>>718 ん?CloseとReleaseは関係ないのでは?
ゴメーン。 caHide になってた。
721 :
デフォルトの名無しさん :03/01/08 13:11
for i:=0 to hoge do begin temp := fuga[i]; ・・・・・ を記述したとき、もし何らかの原因で hoge に負の値が入ってしまった場合、 動作は予測できるものなのでしょうか? 実は、アクセス違反が不定な位置で出現するようになってしまい、一番 疑わしいのがコレなのです。IDEから実行しても何もエラーを吐かなかったので 疑いもしなかったのですが、環境を変えるとピョコピョコ出るんです・・・。
>>721 負なら実行されないはず、どうしても不安ならこうしちゃうとか..w
if hoge >= 0 then
begin
for i:=0 to hoge do
begin
temp := fuga[i]; ・・・・・
end;
end;
これでワナを張っとくと解りやすい鴨。
if hoge < 0 then begin showmessage('hogeが負になってるゾ') end;
>>722 たしかに、最初から 0 to -1 とかにするとコンパイル時にループが削除されますね。
動的に-1を入れても実行されませんでした。ということは、他の部分なんですね・・・。
疑わしい場所ぜんぶに try except を張って、どこで例外が
発生してるかを見るしかないようです。ショボン
(このとき、Delphiの例外か、OSの例外かというのは関係ないのでしょうか?)
>>723 アクセス違反が不定な位置で出るのは、その出た位置ではなく
1、配列境界を越えたりして、スタック等別の領域への爆弾を落とした後
2、解放してしまったオブジェクトにアクセスしてしまった誤爆
とかで、爆弾を落としたり、誤爆を探さないといけませんよ。
だから、例外で捕捉してもみつからない事が多いです
>>724 Σ(・ω・ノ)ノ す、すみません、一度で理解できませんでした・・・。
AccessViolationは、1) 割り当てられていない領域に手を出したとき、
2) あると思ったものが無かったとき、に発生という認識だったのですが、
これが不定に起こるということは・・・自分が確保したメモリ外の領域に書いてしまい、
それが消えてしまった → アクセスしたら何もない、ということ等でしょうか。
こればかりは簡単に検出できないか・・・。
(例外で落ちるとNTがログを吐きますが、これを見てもクラッシュした近辺は
わかっても誤爆した位置はわからないんですよね・・・。)
ログから判る事もあるけど、不定に起こるような場合、そこから調べるよりは 配列の境界違反あたりから調べてゆく方がいいです。 とりあえず{$R+}から
ありがとうございます。怪しいと思われる場所で試してみます。 (境界違反が毎回発生してくれてれば有り難いのですが・・・。)
728 :
デフォルトの名無しさんlo :03/01/08 16:19
ウィンドウのリサイズを禁止するにはどうすればいいんですか? 初歩的な質問ですみません。
BorderStyle の事? D6/D7なら Constraints で固定しても変更は出来ないけど
730 :
デフォルトの名無しさん :03/01/08 18:15
Delphi7でコンパイルしたプログラムがWin98やWinMEだと 正常にプログラムが起動しないらしいのですが、 Win2000やXPだとちゃんと動きます、 当方には既にWin98/MEの環境が無いので検証できないのですが、 このバグ?をメールで知らせてくれた人に協力してもらって ソース部分を全て削除してEdit,ComboBox,ListBox,TImageが フォームに張り付いただけのハリボテを作成して、 それでテストしてもらいましたが、 やはり フォームが表示される前にプログラムが落ちるとの事です。 同じプログラム(ハリボテの方)をDelphi5で コンパイルしたモノはちゃんと起動するみたいなのですが・・・・。 Delphi7でコンパイルしたプログラムはWin98やMEでは動かない ものなのでしょうか??
733 :
お茶はいかが :03/01/08 20:10
文化オリエントのLEADTOOL10をDelphi6pro(アップデート2済み) + Win2000SP2 + IE6SP2 の環境でLEAD Main Control をActiveX登録したところ、コンポーネン トパレットには登録されているのにフォームに貼り付けようとすると「vcl60.bpl のアドレスxxxxxで読み込み違反が起きた...」というエラーが表示され貼り付け が失敗します。更にもう一度、同じ手順を踏むと、「フィールドメソッド名LEAD1 は既に定義済みです」とエラー表示します。ちなみに、アクロバットリーダーの ActiveXコントロール等は同じ登録方法ですが問題ありません。OS初期化や 再Delphiインストールもやってみました。VB6SP5では問題無く使用できます。 どなたか解決法をご存知の方いらっしゃればご教授くださいませんか?
ども。 モナーの *やさしい* Delphi質問スレ Ver.9が落ちちゃいましたね。 で、質問が… IMEの再変換がしたいんですが、いろいろ調べた結果、「MSIME.TLB」がいるようです。 環境がWinXP,OfficeXP,IME2002なので入ってないんですよ、これが。 どこからか手に入れられますかね??? もし違法でもよければアップしてもらうとか(w よろしくお願いします(MSIME.TLBだけあってもできなかったら悲しい...)
>>735 回答ども。
うーん、VB専用なんですか。
でも、使用しているエディタコンポーネント、TSonEditってやつがMSIME.TLBがあれば
再変換が簡単に実装できるようになってるんです。
でもないことには始まらない…
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
>>724 >>726 いま怪しい部分に {$R+} を適用して実験しています。
ですが、かなりの時間動かしても、特に範囲エラー例外などは出てきません。
コレのバイナリを、デバッガのない環境に持っていってもチェックできるのでしょうか?
でしたら、"なぜか例外が出るマシン"の持ち主に送ってみて、ERangeErrorが出るか確認しようと思うのですが・・・。
>>738 それなら配列範囲外ではないのでは?
・ポインタを使っていませんか?
・型変換を使っていませんか?
・スレッドを使っていませんか?
>>730 俺はWIN98SEにDelphi7インストールして開発してるし正常動作してる。
「メールで知らせてくれた人」の環境が腐ってる可能性もあるぞ。
あるいはCLXで作ってるとか。
やはり範囲外アクセスではないようです(;´Д`)ナニモ デナイ
>>739 ポインタは使ってません。アタマがついてってないので・・・。
型変換は、数値表示用に IntToStr等が点在しています。
スレッドは意図して使ってはいませんが、別スレッドで動くVCL(というかタイマー)があります。
大麻ってTTimerか?それともマルチメディアタイマか? 後者ならあぼーん。
> スレッドで動くVCL(というかタイマー)があります。 その辺、もっと詳しく。 VCL標準のTTimerは今のところスレッドではない。 VCLが単なるコンポーネントをさしていて、タイマーがマルチメディアタイマーのことなら、 それはマルチスレッドになっているので、注意しなくてはならない。
すまぬ。「スレッド」を「別スレッド」に読み替えてくれ
>>730 D7が出た頃に誰か似たようなことを書いてたよ、
うろ覚えなんで正しくないかもしれんが
コンボかリストか忘れたけどリスト内に文字なし("")があると
落ちるとか落ちないとか.(Win95の話だったかも)
>>742-743 あ、使っているのはMMTimerです。(TTimerは精度が悪かったので)
別スレッドで動くとは聞いていまして、一応オブジェクトへのアクセスはMMTimer.OnTimer内から
だけ行うものとそれ以外で分け、ぶつからないように気を付けてはいるのですが・・・。
(あっ、何カ所かOnTimer内でWriteしてそれ以外でReadするのがあったような・・・)
祈念かきーこ >>ヒロユキタン いつまでやるですか?
Del7をインストールしてみた。Del5からの移行なんだけど、どうも慣れない。 一番気になるのが、エディタの文字の横の文字間隔がなんだか広くなってること。 フォントのサイズ変えても縦に小さくなっても横幅は変わらず。 これはどっかで変更できるんでしょか?
>>374 ZBsKvw39 みたいな厚顔無恥さも必要だね
D6Personalでメモ帳トラッパー2.33改のソースを改造してビルドしたんだけど、 状況依存型のヘルプがポップアップじゃなくてヘルプのウィンドウの中にできてしまう。 こんなはずじゃなかったんだけど。
>751 それはないっす。 実際比べてみれば一目瞭然。右マージンの位置が全然違うから。 それともうちだけ?
>>748 Del7は未体験ですがDel6からBoldにしなくても
文字間隔が広いままのようですね.
私の場合は広くなること自体よりも
それによって文字間隔が空くために格好悪いのが気になりました.
『MS ゴシック』や『MS 明朝』ではそれほど気にならなかったのですが
手持ちのヒラギノやダイナフォントだと間延びして気持ち悪かったです.
買うかどうかわからないけどガリでは改善してほしいです.
最近使っている『Osaka - 等幅』(12または9ポイント)は
Del6で試していませんがDel5で予約語だけBoldにして
間延びチェックをした限りでは比較的気になりませんでした.
>買うかどうかわからないけどガリでは改善してほしいです. ここに書いても意味無いと思うが?
うーん、Del6からだったのね・・・ あのスカスカ感がかなり気持ち悪いけど、しょうがないのか・・・。 ついでに言えばメインメニューのスカスカ感も同時に気になる。 実際の機能や操作には全く関係の無い趣味的な問題だけに どうしようもないなー
老舗の TurboPower が解散し、Jedi も活動停止。 2003 年は年明けから暗い話ばかりだ...
馬鹿yahooがニュースにしたりするから、 何も知らんような奴が流れ込んで来る あとZDnetも何かにつけて2chネタばっかり書きすぎ
すんません、解決しました。>751のいうとおりでした。 HTMLタグのみBoldになってました。一つでもBoldがあると 全部影響受けるんだね・・・
TToolBarにTBevelやFlatなSpeedButtonを置くと勝手にセパレータの表示に なっちゃうのはどうすればよろしいでしょか?
でっかいパネル置いてその中でやりくりしれ
最近いろんな板のいろんなスレで、わけわかんない番号に 意味不明のレスをつけてるやつがいるんだけど、何? どっかとまざってんのか?
なんか、復活した。 ハングル。
>>758 ということはエディタの文字間隔がBoldなしでも大きくなってしまうのは
Del6だけということなのでしょうか.
(それとも私の見間違えだったのでしょうか…)
サンクス 今後は書き込みは無いものとして脳内補完しまつ
>767 どうでしょ? とりあえず、普段つかわないような項目が実はこっそりBoldになってないか 調べてみたらいいかも
とにかく2ちゃんは人が減るのを一番恐れている。
弱虫と優しさの協奏曲。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 ガンバレオマエラ
TPicture を使えばいいのに……
うさたん ★ひさしぶりにみたの はあはあなの
>>767 Del2からDel6まで使ってるけど、特に文字間隔に関しては変更なかったと思うよ。
217 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:49 ID:rLfxQ17l 一定期間でログは消しますです。 249 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:52 ID:rLfxQ17l >荒らしとか犯罪のためなの? そす。 246 名前:心得をよく読みましょう[] 投稿日:03/01/08 17:52 ID:BH998yxV >ひろゆき 俺のお気に入りのスレとか荒されてるんだがそういうのにも有効? 257 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:53 ID:rLfxQ17l いずれは。
「アドレスFFFFFFFFに対する読み込み違反」とかいうエラーには、なにか 特別な意味があるのでしょうか?通常では使わないですよね、そんなトコロ・・・。
-1が入っているメモリを、間違えてアドレスと解釈して使ってしまった場合とか?
>>720 一般人はどうやってみるんだ?
掲示板といえるのか。
匿名じゃなくなったら2ちゃんねるはただの掲示板じゃないの? 魅力がなくなる ->> 閉鎖 ってことにならなければよいが
勉強。
なんか、取り込中みたいだけど、ちょっと くだらない質問するけど、いい? Delphi 6/7 で使える DirectX のヘッダファイルって どんなのがある? できれば DirectX8あたりの。 DirectSoundが使えるだけでいいんだけどね。
>>783 DelphiX付属のでも構わないけれど、JEDIのが一番いいと思う。
DirectX8まで揃ってて、DirectX9は翻訳中らしい。
どもです。 Delphi-Jediに行こうと思ってたんだけど、 サイトに行けなかった。解散してたのか。 で、結局ロシアのサイトを見つけて、 DirectX9をDL中(贅沢いえないけど、 めちゃ遅い...)。
えっと、無知で突っ込みを入れられるのを覚悟で。。 IPの記録が抑止にもなるなら、削除系の板のリモホ表示をやめて みるのはどうでしょう。 依頼者のホストを削除板以外の板に晒されることもないでしょうし。
<丶`∀´><ウェーハッハッハッハッ
791 :
デフォルトの名無しさん :03/01/11 10:15
>>741 あたりで、例外が捕まらないと喚いていた者です。
NT系では発生せず、9X系だと発生するために、環境を変えてデバッグしてみました。
リアルタイムで数値を表示させたくて、MMTimerの中で数値を型変換してLabelを書き換え
ていたのですが、多分コレではないかと・・・。処理が重くなると(間に合わなくなると?)
無効なポインタ操作が発生していました。
もしかして基本だったですか(;´Д`) 以降、無茶はやめます( ´・ω・`)
むぅ、計算は精度がいるのでMMTimer、表示は普通のTTimerで併用しようかな・・・。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
>>791 MMTimerは別スレッドだよね。
Label書き換え時にちゃんとsyncronizeしてる?
>>791 たぶんソレですね。
MMTimerではVCLを直接呼んではいけません。
計算は精度が必要というのは、サンプリング精度ですか?
なお、現在この板は別板の内容をコピペされる荒し中なので
お名欄欄に、何か デフォルトの名無しさん 以外の名前を
入れて頂くと、区別し易くてよいです
>>793 同期はしてませんでした。MMTimer以外から触ってないからいいやと思いまして・・・。
>>794 直接呼んではいけないんですか!これは初めて知りました。
以降、分離させるようにします。アドバイス感謝・・・。・゚・(ノД`)・゚・。
(精度ですが、サンプリングですね。秒間数十回行っています)
別スレッドからVCLにアクセスするにはとにかくsyncronizeしなきゃダメってことで。
ついに全板か ( ´,_ゝ`)プッ
syncronize の中身は単に Windowsのメッセージ機構を使って SendMessageして処理させてるだけなので それなら MMTimer内から PostMessage してラベルを非同期に 描画させた方が軽くなっていいかもしれません。
800 :
デフォルトの名無しさん :03/01/11 11:05
いままでスクリプト厨で、プログラミングははじめてなんですが、 InifileからreadStringしても2047文字目以降がどうしても読み込めないんですが 何かよい知恵ありますでしょうか。 やってることは [mojii] nakami="ごにょごにょと2047文字以上書いてる..." とinifileに書いてあったとして、 str := IniFile.ReadString('moji' , 'nakami' , ''); と書いてます。strはString型です。 ちなみに2047文字までは普通に読めています。 なんかアドヴァイスおながいします。
うん
IniFileクラスやめて、自分でファイル入出力する。 Windowsのiniファイルは制限あったり、キャッシュされたり、くせが多すぎ。 まじれす。
>>それなら MMTimer内から PostMessage してラベルを非同期に MMTimer使う意味がなくなるでしょ。すなおに Sychronize をつかったほうが いくぶんまし。
>>804 ああ、言ってる意味は、MMTimerで測定はする。 結果はFIFOか配列に記録だけする
それとは別に表示が必要なら その
必要な項目が出来た時に、PostMessage を投げて表示させるという事です。
単に表示を定期的に更新するなら、MMTimerとは別にTTimer使えばいい
どうして MMTimerで Sychronize 使わない方がいいかというと、 メインスレッドが重い処理をしている場合、Sychronize だと結果が返ってくるのが非常に遅れます。 その間に次のMMTimerの時間が来た場合、 1、多重割り込みになる 2、次のMMTimerが遅延される のどちらかとなるわけで、どちらも好ましくない結果となります
Sychronize は即座に処理させるのじゃなく メインスレッドを メッセージループの個所まで動かして それから処理して返ってくる。
さっそくの返答ありがとうございます。
>>802 ,803
やっぱり何かの制限に引っかかってましたか。
僕の探し方が悪いのか、ここらへんヘルプでも見つからなかったんで
途方にくれていました。
「delphi readstring 文字数」とかでググっても見つからなかったし…
直接ファイルの読み書きも考えていたんですが、具体的にINIファイルの
形式でできるようにする方法もまだ思い浮かぶレベルではなく、
いい方法教えていただいてありがとうございました。
さよなら2ちゃんねる
>>808 Delphiの良い所は、Pro版だと、vclのソースが付いてる。
メソッドの中のソースを読んでも良いし、デバッガで中に入っても良いし。
えー、クラスライブラリのコード読むのー?とか思うかもしれんが、
SDKなんかのサンプルコードが、クラスのメソッドやプロパティとして、
綺麗にまとめれられてる感じ。
実際の動作をDelでポトペタして、中身のソースコードを追いかける、これ最強。
後、メソッドのオーバーライドするには、クラスライブラリののソース読んどくのが間違い無いし。
ついでに書いとくと、VCLの中身に入っていくと、 最後、Win32APIコールまで辿り着ける。ので、原因不明なんてことはまずない。 このへんもコンパイラ言語Delマンセー。
812 :
デフォルトの名無しさん :03/01/11 12:35
Delphiとjavaはどう違うの? 日曜プログラムにはどちらが向きますか?
Windows限定ならDelphi最強だろ。 フリーウェアやシェアウェアもDel多いし。
814 :
デフォルトの名無しさん :03/01/11 12:46
>>813 Windows限定か。
ならjavaしかありませんな。
ありがとう。
>>806 ありがとうございます、非常に参考になりました。
表示専門のTTimerを置いて、VCLへはそこからアクセスするようにします。
別スレッドでも、MMTimer内で計算結果を書いて、TTimer内でそれを取り出して
Labelのcaptionに貼るだけの場合は、特に同期は考えなくていいですか?
>>816 同期は MMTimerの目的から考えて使わない方がいいです。
スレッドはCPU命令の間には割り込めませんから 1命令で書き込みが
済むような場合は同期の必要ありません。
たとえば Integer/浮動小数点などは不要
構造体や文字列の場合は 、FIFO配列を用意しておいて、そこに書いた
後、更新番号を渡すような方式で処理すると良いでしょう
あっと、 MMTimerは別スレッドといっても、普通はその処理が終るまでメインスレッドに 切り替わったりはしないはずなので、 文字列作って渡しても大丈夫かもしれません。 というか、たぶん大丈夫です。
>普通はその処理が終るまでメインスレッドに >切り替わったりはしないはずなので、 文字列作って渡しても大丈夫かもしれません。 >というか、たぶん大丈夫です。 嘘はいけません。
TListViewコンポーネントのReport表示で アイテムの順番を入れ替えるにはどうしたらいいのでしょうか? だれか教えてください。
delete&insert
>>821 できました。
ありがとうございました。
ああ、そうか文字列のサイズが変更されると問題が出るかも
いや違うか、 メインスレッドで その文字列を読んでる間に、MMTimer割り込みがかかった場合 1、ポインタが書き換わる 問題ない、古いポインタの情報は残ってる 2、文字列が書き換わる 2バイト文字が混じってると問題、 数字なら一時的に混じって表示される=常に起きると問題 3、サイズが書き換わる 文字列が書き換わるのと同種の問題 だから、やっぱり FIFOとか配列をリング状に使って渡す方がいいな まあ、文字列じゃなく、数値で渡せばめんどくさい事しなくてもいいから楽か
427 名前:心得をよく読みましょう 投稿日:03/01/10 20:34 ID:Pp49I/sC いっそのこと辞めればいいのに 儲かってるのか? そこまで裁判までやって続ける 意図が理解できん 433 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/10 20:36 ID:jWxHxvti IP記録してれば、荒らしの使ったホストも規制しやすかったりして。 ゲームすかねぇ。 477 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/10 20:46 ID:jWxHxvti ログそのものをCDROM化したりDVD化したりして出版する話が 何度かでたことがありますが、 ログを出版してしまうと、全責任を出版者が負わなければいけないので、 潰れる気のある出版社ぐらいでないと出せないです。
>>800 >802-803
Del4以降ならTIniFileの代わりにTMemIniFileを使うと良いかも.
TIniFileと違いWindowsのINIファイル処理APIを使わずに読み書きしていますが
こちらは2047バイトの制限はないようです.
288 :ひろゆき ◆3SHRUNYAXA :03/01/08 17:56 ID:rLfxQ17l >厨房板は本当に閉鎖なのか? 初耳。
いいかげんうぜーなぁ・・・。
>>828 ちゃっちゃと削除依頼出すべし。俺はこいつらに嫌気が差して自作板を捨てた。
>800 TStringList.LoadFromFile/SaveToFileで別ファイルに保存。 .iniファイルにあまり大量のデータを保存するのはあまり好きではない。
それがTMemIniFileだろ
gg
ガンダム
一定精度以上で(少なくともTTimer以上)、しかも遅延を考慮して Windowに描画とか、VCLの更新とかを行う場合、 MMTimerは事実上使えないということでよいですか? 解決策は結局、メインスレッドのOnIdleで自力で時間待ちですか?
はっはっは!よう、俺のねぐらどこ?
2ちゃん早く潰れろよ(藁
>>Windowに描画とか、VCLの更新とかを行う場合、 >>MMTimerは事実上使えないということでよいですか? 描画の更新とかスレッドセーフじゃないVCLの更新は本来メインスレッドで おこなうものです。ウィンドウズのようなマルチスレッドでメッセージベースの OSなら、このような機能を別スレッドにして正確に時間間隔をはかっても あまり意義を見出せない。なぜ、MMTimer を使うほど精度が必要なのか、そっち のほうが興味があるんだが。
2ちゃんねるは生まれ変わります
じゃぁどうやって書き込んだ人に連絡をとるんですかね?
gambleやったんだったらnews3をおまけに やってくれるのが親切というものだと・・・。
サブスレッドでビットマップ描いてメインスレッドでBitBltすれ
>>834 名前欄に何か書いてくれないとイチイチ読まないといけないのでツライです
Windowに描画とかを 別スレッドや MMTimerでする意味があります?
MMTimerではデータのサンプリングや送受だけをして
描画とは切り離す設計にするのが普通だと思います
メインスレッドの OnIdleを使う方法はTTimer程度の精度しか得られません。
やはりMMTimerの方が正確です
↑って、この名前は気付いて貰ってるのだろうか?(w MMTimer使って、なおかつ手っ取り早い同期方法は、 適当なウィンドウ(Application.Handleとか)にSendMessageCallbackで WM_GETTEXTLENGTHみたいなどうでもいいメッセージを送りつけて、 一緒に呼ばれるコールバック関数中で描画とかをすること。
>>843 なるほど、巧い手ですね。
RegisterWindowMessage でメッセージID貰うと WinProcで自前でディスパッチ
しなければいけなくなるし、
空いてそうなID使っちゃうと 将来の Delphiのバージョンアップや 他のコンポと
との組み合わせで問題出る可能性に怯えるわけで
それから、あんまり考えないで書いた事をチョット反省。 MMTimerはメインスレッドとは別スレッドだが TThredではないので Synchronize メソッドは実際には呼べないです。
質問します。 メモリを確保するAPIってありますか?
(^^)
人を人と思わないコイツらの死に様は悲惨だろうな
ゲーム作ってるのもあってサポート用のツールで高い精度のタイマーがいるんですわ。 > メインスレッドの OnIdleを使う方法はTTimer程度の精度しか得られません。 実際に調べました? そんなことはないです。 で、まあ、結局メインスレッドで一定精度を得るならOnIdleが楽かなと。
>>845 あー、そうですね。
どちらにせよ、そもそもMMTimerではSyncronizeが使えないので
同期を取る必要があるとつらいですね。
>>850 精度の意味が違うのでは?
他のプロセスが動いてる時の OnIdleと TTimerは精度が同じ。
プロセスがリソースを独占可能な時は OnIdle>TTimer
ただしTTimerも 分解能を合わせれば精度は同じ
>プロセスがリソースを独占可能な時は ああ、そのことです。 そいや、TTimerの精度って上げられたっけ? timeBeginPeriodでつか?
確か Windowsタイマーの分解能は整数値じゃないから、分解能を正しく合わせるのは無理なんじゃないかな
>>850 なるほど、そういう使い方なら OnIdleでやればいいのでしょう。
でもCPU占有率100%になりそうな勢いですね。
timeBeginPeriod は MMTimer の精度では?
PageControlで「全て閉じる」のようなことをやりたいのですが、こうやると 「リストのインデックスが範囲をこえています」とエラーが出ます。 どこが間違ってるのでしょうか? var i: integer; ClosePage: TTabSheet; begin for i := 0 to PageControl.PageCount -1 do begin ClosePage := TTabSheet(PageControl.Pages[i]); ClosePage.Free; end; end;
>>851 MUTEXとかセマフォとか。手はいくらでもある。
∧,,∧ 誰もがはまる罠です。 ミ,,゚Д゚彡 i=0で0番目のページを削除したとたん、 ミつ[|lllll]). もとの1番目が0番目に変わるので 〜ミ ミ 次のループでi=1で削除すると 元々の2番目のページが削除され… こういうときは for i:=PageCount-1 down to 0 で、ループまわして最後から削除っす。
>>856 例えば、最初に A B C D E の5つのページがあるとして……
Pages[0]を削除 → B C D E
Pages[1]を削除 → B D E
Pages[2]を削除 → B D
Pages[3]を削除 → もうそんなページねぇよウワァァァン
>>858 あー、だから半分まで閉じるとエラーになるんですね。
助かりました、さんくすです。
var i: integer; begin for i := 0 to PageControl.PageCount -1 do PageControl.Pages[0].free; end; これで(・∀・)イイ!!とおもわれ
どっちかと言えば↓が好きかな while PageControl1.PageCount > 0 do PageControl1.Pages[0].Free
おんなじだけど with PageControl1 do while PageCount > 0 do Pages[0].Free
>>855 ゲームとかそういう類のは組んだことはないでつか?
> でもCPU占有率100%になりそうな勢いですね。
それは組み方によります。
FPS固定なら、余った分Sleep(Sleepは精度が悪いので工夫がいるが)するとか、
OnIdleを早く抜けて処理を返すとか。
FPS非固定なら100%でぶん回すこともあるでしょう。
>timeBeginPeriod は MMTimer の精度では?
ですよねえ。標準タイマーは精度劇悪だったはずなので。
>>857 なるほど。
>>866 じゃまとめましょう
□TTimerの分解能は 9x系列で1/30
NT系列 2000/XP では1/100程度
TTimerはメッセージを貰ってメインスレッドで実行される
□MMTimerの分解能は timeBeginPeriod で決まる
MMTimerはメインスレッドとは別の特殊なスレッド。よって、
VCLコンポを呼び出してはいけない。また、
一般的にマルチメディア系のコールバック中で悪さするとOS
を巻き込んでしまう場合が出易いので注意
VCLをMMTimerをキッカケにして動かす場合は
PostMessage/ SendMessageCallbackを使う
>>867 単位もまともに書けん奴が精度を語るか。
>>869 「1/30」「1/100」ってなに?という話だと思う。
>>870 ああ、
TTimerの設定分解能は1ミリ秒だが 98系列ではその1/30の実分解能しかない
って事だろ。
あそこに分解能が1/30秒と書けば正しくないし、まあもっと上手にまとめられる
というのなら、まとめてやれよ。
874 :
デフォルトの名無しさん :03/01/16 13:31
perlでの @a = split(/hoge/, $str); みたいのをDelphiでやるにはどうしたらいいですか?
モナーの *やさしい* Delphi質問スレ をまだ見てませんでした。見て分からなかったらまた来ます。すみません。
>>876 見て出来るようになりました。ありがとうございました。
878 :
デフォルトの名無しさん :03/01/17 22:28
他のフォーム(Form2)からForm1上にあるListViewに アイテムを追加しようと下のように書いたのですが <<のところでEAccessViolationエラーが出てしまいます。 同じようなのをForm1に書くとうまくいくのですが… 他のフォームからだとダメなのでしょうか? どなたか良い方法を知ってる方おられましたら 教えて頂けないでしょうか? procedure TForm2.Button1Click(Sender: TObject); var ListItem : TListItem; begin ListItem := Form1.ListView1.Items.Add; << ListItem.Caption := Button1.Caption; ListItem.SubItems.Add(Button1.Caption); end;
>>878 まず、どこで例外が起きているのかを突き止めないと、なんとも。
//↓チェック用のコードを挿入してみるとか
Assert(Form1 <> nil);
Assert(Form1.ListView1 <> nil);
...
nil以外の値が入っていても、既に解放されている等して不正なポインタの場合が有り、
その時は中身を参照するとエラーになるので、そちらも注意。
勘で書けば、多分、TForm1をTForm1.Createで作成した時
Form1変数に代入してないとか、その辺とは思うけど。
>>878 Form1,Form2の関係を書いた方が。
>>879 >>880 >勘で書けば、多分、TForm1をTForm1.Createで作成した時
>Form1変数に代入してないとか、その辺とは思うけど。
873さん、これモロビンゴっす。。
var
Dlg: TForm1;
Dlg := TForm1.Create(Self);
てな感じでやってました。。
言われないと全く気づかなかったと思います。
ありがとうございました!
>>882 9801には高解像度タイマ付いてないが。
TImageで画像があるかどうかを取得したいのですが、どうすれば出来ますか?
>>884 試して無いけど、Pictureがnilかどうかで分からないかな?
TBitmapに、IsEmptyだか、プロパティねぇ? クソレススマソ
ファイルに保存しないで、マイクからの入力データをLAN無いで 転送して別のPCのスピーカーから再生させたいのだが、 そもそもマイクからリアルタイムに音声が取り出せない、 なにか良い方法はありませんか?
DirectSoundCapture
>>879 素朴な疑問ですがどうしてブレークポイントを使わないのでしょうか?
>>884 Image1: TImage; だとすると
Image1.Picture.Graphic = nil だと空みたい.
空にするときはImage1.Picture := nil;
または Image1.Picture.Assign(nil); なのでややこしいですが.
>>890 >空にするときはImage1.Picture := nil;
メモリリークしない?
絶対にしない
>>892 write用のメソッド定義されてるの?
>>891-893 今は載っているかわかりませんが初期のDelphiの説明書には
nilを代入してグラフィックを空にする説明が載っていたと記憶しています.
私は気持ち悪いので(笑)Assignを使っていましたが.
>>893 その通りです.内部でTPictureのAssignメソッドを呼び出しています.
そのメソッドは引数がnilの時に内部のGraphicを解放してnilを代入し,
イベントハンドラがあればそれを呼び出しています.
>>894 ライブラリのソースはプロ版以上でないと見られませんからね.
逆にプロ版以上の方は私の説明よりソースを見るのが吉かと思います.
プロパティ宣言のread/writeが何を意味するか理解していれば
十分理解できるコードではないかと思います.
>>895 勉強になりました。どもです。
>>894 Del6 PersonalとDel3.1 Standerdしか持ってないんで。スマソ。
ヨーダは緑色さ!
そのヨーダな
900 :
デフォルトの名無しさん :03/01/21 17:39
D7にて、TCustomComboBoxから独自のコンボボックスコンポを作ろうとしているのですが、 設計時にオブジェクトインスペクタのプロパティに | Items | (TStrings) […] | という欄があって [・・・]ボタンを押すと 簡易エディタのようなダイアログが表示されますよね? あれは何処で実行されているのでしょうか? やりたい事は、設計時に[・・・]で文字列が入力された後で値のチェックを かけたいのですが、それらしき部分が見当たらないのです。(涙)
>>900 前半の質問は、プロパティエディタの設定でされてる。
自作のエディタを作りたいなら、 ヘルプの
コンポーネント開発者ガイド->コンポーネントを設計時に利用出来るようにする->プロパティエディタの追加
からを見るといい
後半は・・・・もしかしてSetItems メソッドを定義してないの?
SetItemsが呼ばれた時の値で、チェックをかければいい
チェックをかけて値が変更されてたら
たしか、 GetParentForm(Self).Designer.Modified; みたいな感じだったと思う
MDIアプリで、起動時に引数を受け取る方法ってありますか? 起動済みで受け取る方法は分かったんですが…。
>>902 ParamStr(i :integer);
>>903 for i := 1 to ParmCount -1 do
begin
if Pos('
http:// ', ParamStr(i)) > 0 then
CreateMDIChild(ParamStr(i));
end;
タブブラウザっぽいのを作ってるのですが、こうで良いんでしょうか?
ParmCount → ParamCount でした
>>901 SetItemsでチェックするようにしたら、なんとかなりました。
あと、[プロパティエディタの追加]を読んで見て、
独自のエディタも作れそうな気になってきました、実力は無いのですが
なんとか頑張ってみます。
ありがとうございました。
DelWiki, なくなっちゃったの?
>>908 一緒に置いていたエロ画像が原因で削除されたらしい。
やっぱりDelやBCBでDirextXはだめですか?
>>910 そりゃ発表されたばかりのバージョン使いたいなら苦労もあるだろうけど
ひと昔前のを拾ってゆくなら何の問題もないよ
>>908 広告貼り忘れで消されてました。
たぶん復活したと思います。お騒がせしました。
SJISに対応したPosって無いんでしょうか? Pos('\','表')がちゃんと0になるような。
AnsiPos
TStringGrid上で常にヒントのポップアップを表示しておきたいのですが方法はありますか? 尚且つマウスポインタの位置が別のセル上に移動したときは、即ヒントの文字列を更新したいのです。
>>916 それは Popup ヒントでなければいけないの?
普通は TStatusBar を使って、StatusBar.AutoHint:=True; にすると思うのだけど
>>916 ポップアップヒントに似せたウィンドウを一つ作成して、
OnEnterで表示、OnExitで隠蔽、OnSelectCellで内容出力したらどうかと。
>>917 >>918 おまいら答えになってないよ。
>>916 TApplication.OnShowHintイベントでTHintInfoのReshowTimeoutを適当(500)に設定し
TStringGridのOnMouseMoveイベントでHintプロパティを変えればいけるだろ。
ヒントの位置も変えたければTHintInfo.CursorPos:=Mouse.CursorPosとやればOKかな!?
>>919 なるほど、0.5秒毎にReShowするから、自動的にHideしないって事ですね
ほんの少しチラツキが出る以外は巧いアイデアかも
(^^)
>>919 それではその機能を組み込んだコンポーネントを作る場合どうするか教えてください。
924 :
デフォルトの名無しさん :03/01/26 01:53
potatoのisoはftpで見つけたのですが、woodyのisoイメージを 発見できません、何処から落とせば良いのでしょうか?
Debian と Delphi って似てるか?
ごめんなさい、誤爆してたみたいです。
>>925 なぜか間違ってしまいました。(汗
>>926 誤爆にお返事頂いて申し訳ありません。
jigdoで作れるのですね、ありがとうございました。
DelihelとDelphiは似ている
ビジュアルベーシックとベンチャービジネスは似てる
Cとしぃは似ている
Delphiとは関係ないかもしれないのでつが。 マウスのホイールをクリックしたときに、コントロールによっては 自動スクロールする場合がありますが、あれってアプリ側で処理 を書いているんでしょうか?
コントロールの種類によって変わる。
誰がコードを書くか。という問題なんだけどね。 1. コントロールが他人の書いたものならそれにまかせる。例:Windows 標準コントロール 2. 標準の動作を変えたり、ホイールメッセージを処理しないコントロールの場合 自分で書く。多くの場合すべてを書く必用はなく、あたかもスクロールバーを制御している 用に見せかければ良し。 3. Logitech とかのマウスドライバだと、WM_MOUSEWHEEL を処理しないアプリケーションに対し マウスドライバ側でスクロールメッセージに変換してくれる。こういった環境ではアプリ側で 何もしなくてもホイールが使える。
>>932 たとえばTCustomControlから自前でコンポーネントを
起こす際に、どう実現したらいいものかなーと……
ていうか自動スクロール自体は、別にどうってことはなくて
ホイールクリックしたときに出る、「○と▲と●のアレ」を
どこから持ってくればいいのかよくわからないです。あとカー
ソルも。
>>934 すまんです。説明足りなかったです。
WM_MOUSEWHEELはもちろん受け取って処理するのですが
ホイールをクリックしたときによく出る変なマークはどこから
取ればいいのか知りたいのです。
秀丸やDelphiのコードエディタなんかも同じマークが出るみたい
なんで、それぞれが自前で持っているわけでもなさそうな感じ
だし……。
よくわから。
TControlにはOnMouseWheelというPublicイベントが存在するのだが、 なぜか下位のTListBoxなどには継承されていない。
>>935 それはアプリケーション毎に用意する物
ホイールクリック=中ボタンを押された状態と同じ事です。
どのアプリでも出るのならば、マウスドライバ自体が特殊なのかもしれない。
>>937 どうもUSER32.DLLかcomctl32.dllあたりにそれっぽいカーソルが
収められているみたいです。
それを適宜取得して、表示は自前で……という感じか。
'アドレス 00000009 でアドレス 70046913 に対する書き込み違反がおきました。' とか見ても、具体的に何がまずいのか、さっぱり解らないのですが、 こういった情報からエラーの原因を知る事は出来るのでしょうか?
>940 ありがとうです。 しかし残念ながら、personal版にはそのメニューは無いようです。 やっぱ本格的にやろうとすると、Pro版が必要なのかしらん。
Personal には無かったっけ? Wiki に書かなきゃ... 以下の説明で、わからない場所が有ったら突っ込みを。 GP/AV が出たら CPU ウィンドウを開き、呼び出し履歴とスタックポインタを探って 問題を起こしているポイントを見つける。 >'アドレス 00000009 (1) でアドレス 70046913 (2) に対する書き込み違反がおきました。' アドレス(1) はコードのアドレスが出てくる場所で、これが $0009 ってことはありえない。 存在しないコードを実行することはできないから、どこからか $0009 にジャンプしてきて そこで例外を起こした。と。 マスターポインタ + $0009 に何かのメソッド/関数がある。というコードで、マスターポインタが 0(Nil) だったのだろう。 Delphi (をふくむ多くのコンパイラ)ではルーチンをまたぐ Jump はほとんど生成されないので call で飛んできていると思われるから、スタックペーンの冒頭のアドレスから逆アセンブル。 そこ、ないしはそこから1〜2段さかのぼったところに鍵がある。
>942 説明ありがとです。 大まかな意味は解るんですが、 CPUウィンドウで、 mov eax, とか色々書かれているのを見ても、 アセンブラ(?)は解らないので、さっぱりです。 ソースの中の、エラーの原因となる位置を特定できたらいいなぁ。 と思ったんですが、 アセンブラを勉強しないと、(仮にPro版を持っていたとしても) こういう情報からエラーの原因を特定する事は出来ないんですか?
CPUウィンドウのスタック欄で、アドレスらしい数字を見つけて 「エラーの検索」とか関数名に@つけて表示させてみるとかで、 アセンブラわからなくても大体の位置は特定できるでしょ。
>関数名に@つけて表示させてみる こんな事も出来るなんて知りませんでした。 ちゃんと使い方を覚えれば、詳しく調べられるんですね。 ありがとうです。
すいません。delphiで.lnkファイルのリンク先を調べるにはどうすればいいんでしょうか
>>946 検索すれば見つかる。delphiに限定しないで検索してみるがヨロシ。
>>947 だいぶ探してなんとかdelphiのも見つけました。うまくいってます。ありがとうございました。
>>947 あんたのせいでCOMに興味持って夜更かししてしまいました。眠い。
950 :
デフォルトの名無しさん :03/02/19 22:18
PopupMenuが閉じる時に流れるMessageって無いですか?
PopupList.Window の WindowProc を置き換えれば WM_CLOSE が来ないかなぁ? 試してないけど.
>>952 >WM_CLOSE
それ≒終了するとき
だと思われ。
ShellListViewでクリックしたファイル(フォルダ)のファイル名を取得したいのですがどのようにすればよいでしょうか? if (ShellListView1.Selected <> nil) then begin ShowMessage(ShellListView1.Selected.Caption); end; とやってみましたが、ブランクが表示されます。
WM_CLOSE じゃなくて WM_EXITMENULOOP
>951-956 どうやらWM_MENUSELECTで自分のイベントを起こしたいタイミングに イベントを起こせそうです。 ありがとうございます。
>>954 Demos のは ソースを読んでガンバレって事だから
ShellListView1.SelectedFolder.PathName が該当のものじゃないかな
DemosのShell系はいまいちだねえ・・・ 必ずHDDアクセスは起こるし、ShellTreeViewには共有のオーバーレイイメージが 表示されるのにListViewには表示されないし、TreeViewにもショートカットのイメージは表示されないし、 ListViewにパスをセットできないし、どれも変数の開放忘れがあるし。 結局ちょこちょこ自分でいじって別パッケージにしちゃってるよ。
>>959 一体いつのバージョンを使っているの?
BDN にアップデートがあがっているんだけど。
Del7付属の奴。 BDN、登録してないんだよねえ
>>961 簡単な英語が読めれば、誰でも登録できるけど?
...割れ物使いかい?
あの登録と割れと、何が関係するんだ? で、登録してきたけど見つからないんだけど。どこ見ればいいの?
たびたびスマンね。 MLの過去ログでパス貼ってたので見つけられたよ。 で、見てみたけど俺が上記した問題はほとんど解決されてないようなのだが。 あんたインストールしてみて全部試してみた上で言ってる? あんまり無責任な発言するもんじゃないよ。
965 :
デフォルトの名無しさん :03/02/20 20:51
サンプルは英語サイトから拾ってこいとか ライブラリはフリーの使えとかやる気のない処理系ですな。
処理系?
>>958 フルパス
ShellListView1.SelectedFolder.PathName;
ファイル名
ShellListView1.SelectedFolder.DisplayName;
でした。
ありがとうございます。
>>959 ,960
フォルダーの情報を取得したいのですが、
ShellListViewはやめたほうがよいのでしょうか?
>>960 BDNてなんですか?
たびたびですいませんがお願いします。
環境は、
Del6Ent Build 6.163
Windows2000 SP3
会社であまっていたので、
入れてもらいました。
BDN=Borland Developer Network ShellListView、別に使えるよ。 ただ、不十分なところもちょっとあるって程度で。
969 :
デフォルトの名無しさん :03/02/21 11:42
initialization時に今、実行時なのか設計時なのか 区別する方法ってありますか?
>>969 TComponent のインスタンスを作成したらどうだろ?
いつもの事だけど、このスレの次スレはどうするの?
俺のプロバイダだと最近建てられない。串探すのメンドクサイから
GetModuleFileName(0)がDelphi32.exeなら設計時、どう? …でもこれだと、IDE拡張に使ったときも設計時と見なされてしまうので、 ユニットを分けて、設計時用パッケージを別に作った方がいいかも。
,,,,,,,,,,,,,,,∧,,∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜′,,,,,,,,,,ミ,,゚Д゚彡< 次スレ
http://pc2.2ch.net/test/read.cgi/tech/1045813143/l50 UU"""" U U \_________
>>970 >>971 どもです。
ComponentStateみたいな状態はないんですか・・・
設計時のinitializationの時にファイルOPENしてて
実行時にまた同じファイルOPENしてエラーが出てしまうので
なんとかしたかったのですが・・・
>972 アホが・・・
Delphi相談室その9早く立ててくれよ。
漏れ的にC#は一押しなんだけど。 C++は魅力的だが、肥大化しすぎ&精通してる奴が少なすぎ Javaは言語的に萌えない&マニアックな操作が出来ない どうよ
C#はCOMベースで動きますので、C++のように単体では動けません。 と理解してるんだけど、JAVAならできるけど、C#はコンソールアプリ作れるの?
出来るよ。*.exe になる。その exe が単体で動くかどうかは知らんが。
C#ってのは言語名なわけ? じゃー21世紀最初の(製品化された)言語カナー?
人類がMSに付いていく限り永遠に新しい言語を覚えさせられそうだな。
というか、俺、オブジェクト指向勉強し始めなんですが Java,VC++,C#.netからC#選んで勉強することにしますた。
C#はDelphi8のことですが何か?
Delphi8はあまりはやらないと思います。。 C#があれだけ浸透しているのに、Delphiに乗り換える理由がわからないです。 もちろん、双方の良さ悪さありますけど。
某のやりたいことは、囲い込みだよね。 私企業なんだし、それはそれでいいと思うよ。 でも、ネットワークは本質的に「囲い込めない」でしょ。 単純に言って、.NETの人たちが使うことはないっしょ。 結局、Delphi8ってのも、某の土俵内なんだから、新Delphiってことだよね。 旧Delphi程度にははやり、それ以上にはならない、つのが結論だっぺ。
流行らなかったら 流行らせるまで1年くらいはガンバルでしょうね、某は。 でも Delphi1の時の勢いは感じられない。
C#のパフォーマンスってどうなの? なんかイメージ的には相当遅くなってそうなんだけど・・・
Javaがウンコとすると、C#は神。
C#には構造体があるのか。 メモリ使用量もガベコレ頻度も減って一石三鳥だな。 Javaだとなるべく、Pointみたいなプリミティブ型にクラスはなるべく使わないようにしてきたけど、 C#だとそんなくだらない努力はしなくてもいいのね。 C#マンセー
C#の構造体の本質は Javaだとint,float,stringなどに限られていたプリミティブ型を自由に定義できるということ。 またそのインスタンスをインラインに持ち、スタック上におけるということ。 これはパフォーマンスクリティカルな部分においても、 可読性と速度を両立できるという大きなメリットをもたらす。
っていうかC#はそんなに遅くねーって。 体感速度は、メモリを多めに食うクルーソーCPUを載せているって感じか。 Javaと違って、言語仕様上の制限は少ない(構造体、関数ポインタ、ポインタもある)から 実質ネイティブコンパイルと同等のパフォーマンスは得られる。
Javaが遅い理由の一つに、クラスロード、メソッド実行のたびに入る コードの安全を確かめるための大規模な検証作業があるが、 C#の場合、暗号化と公開鍵の仕組みによって外部からの改変を防ぐことでコードの安全性を保障している。 だからJavaのアプリケーションみたいに起動が糞重いなんてことはない。
5
510
次スレを・・・
OLE OLE2 COM OCX ActiveX 確か今の形になったのが5〜7年くらい前じゃないかな Javaの対抗にActiveX打ち出して JavaをActiveXと融合させえてゴチャゴチャに かき乱して、結局JavaやJavaアプレットとかクライアントから追い出してしまった
すびばせん。 しかたないから C#もちょっとだけ勉強しようかと思っているんですが、 C++みたいに昔の仕様を引きずっていたり、VCみたいに16bit→32bitの 仕様を引きずっていたりしない? 言語仕様が整理されていて勉強しやすければいいなーと思ってるんですが。
現時点では最高のオブジェクト指向言語であり、コンポーネント指向言語。 過去に縛られることなく、C++,Javaの良い点を取り入れつつ、 プロパティ、イベント、アトリビュートなどコンポーネント指向のための要素が追加されている。 JavaとC#の比較 Java ・プリミティブ型はオブジェクトではない。 ・ストリング型だけ例外的に特殊な演算子が使える ・プリミティブ型は参照できない ・byte配列からfloat型に変換など、Java言語では決して書けない処理がある。 ・setXXX/getXXXなどカプセル化するために無駄なコードが大量に増える。 ・コールバックを使うためにはインナークラスを大量に使うか、インターフェイスを大量にインプリメントする必要がある ・プリミティブ型は固定されている。 C# ・プリミティブ型もすべてオブジェクトである。(ボクシング/アンボクシングの導入) ・演算子は自由にオーバーライドできる。 ・プリミティブ型もrefを付けることで参照できる ・unsafeコードでポインタの使用を許しているので、矛盾なく書ける。 ・プロパティの概念によってメンバ変数に直接アクセスしつつ、値操作をフィルタリングできる。 ・イベントとデリゲートの概念によって最小限のコードでコールバックを実現できる ・構造体を使うことで、自由にプリミティブ型を宣言できる。 このようにJavaは一貫性がなく矛盾の多い仕様なのに対し、C#は非常に洗練された言語仕様になっている。
C#の優位性 ・すべての要素はオブジェクトである。 C#の場合、ハッシュ、リストなどのコレクションはライブラリで用意さえている。 しかもintだろうが、floatだろうが、クラスだろう、構造体だろうが何でも一つのコレクションの中に入れられる。 ・リフレクションによる動的型解析 自動XmlシリアライズなどはC++には絶対に書けない。 (やるなら余計なコードを追加するか、ソースコードを解析してシリアライズコードを自動生成するかどっちか) ・動的コード生成、動的バインディング 言語仕様内で可能 ・ガベージコレクションによる自動メモリ管理 C++ではshared_ptrを使っても循環参照時に破綻するが、 Mark&Sweep方式のGCによって完全に安全なメモリ管理が実現される。
ばかだなあ、みんな。 C#の優位性はあきらかだろ。「MSが押してる」だーよ。 これで決まり。逆らってるヤツは、お払い箱。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。