1 :
デフォルトの名無しさん :
03/09/25 01:26 Delphiに関する中級以上の技術相談室です。 初心者は「くだすれDelphi(超初心者向け)」へどうぞ。
2 :
デフォルトの名無しさん :03/09/25 01:27
3 :
デフォルトの名無しさん :03/09/25 01:27
5 :
デフォルトの名無しさん :03/09/25 01:29
7 :
デフォルトの名無しさん :03/09/25 01:30
8 :
デフォルトの名無しさん :03/09/25 01:38
> かちゅーしゃとかのDelphi製2chブラウザで板一覧取得してListViewに表示する処理で > サーバクラックして不正な文字列埋め込んだりすると危険かもね。 十分外部から引き起こすことが出来るバグです。
9 :
デフォルトの名無しさん :03/09/25 01:39
>ついでに言っておくが、実行コードを走らせるには実行可能フラグの設定されたメモリ領域ではならない。
>通常のヒープやスタックは実行不可。さらにオーバーフローされたとしても大抵は
>隣接する関係のないデータが書き換わるかAVが発生してあぼーんして終わり。
Windowsアプリケーションソフトウェアにおけるバッファオーバーフローの危険性
http://www.shadowpenguin.org/sc_documents/spsdocument21.pdf > 5. スタック上に置かれたコードの実行
> カーネルにより割り付けられたスタック領域は、読み
> 書き可能であると同時に実行可能です。つまり、スタック
> 上にコードを置き、EIPを適切に移すことができれば、置
> かれたコードは問題なく動作します
釈明ま~だ~?
GetSearchString使わなければいいじゃん。 というより かちゅーしゃ 使ってるの?このメソッド。 大体そんな長い板名設定できないんじゃないかな? 起こせないじゃん。よく考えてからほざけよヴァカ!
11 :
デフォルトの名無しさん :03/09/25 01:40
キタキタキタキタキタ━━━ (゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚) ━━━━!!!!!!!!!!
379 名前:****緊急**** 投稿日:03/09/25 01:18 ID:AitgqY+Y
開発ツールDelphiで作成されたアプリケーションに深刻なセキュリティーホールが発見されました。
TComboBox,TListBox,TToolBar,TListView にバッファオーバーフロー
http://memo.st.ryukoku.ac.jp/archive/200309.month/6508.html 同じ会社から販売され上記コンポーネントを使用している開発ツールC++Builderで開発されたWinny2にも
同種のセキュリティーホールが存在する可能性はきわめて高いです。
特にTListView(データを一覧表示するコンポーネント)のセキュリティーホールを利用することで
ファイル一覧を表示するだけでネットワークからダウンロードされた
任意のコードが強制的に実行されてしまう危険性があります。
# たとえばバッファを溢れさせるほど非常に長いファイル名の後ろにコードを埋め込むなど。
具体的な方法はまだ見つかっていませんが、おそらくは時間の問題です。
作者の安全宣言がでるまでは使用を控えるなどの自衛手段をとることを強く推奨します。
380 名前:[名無し]さん(bin+cue).rar 投稿日:03/09/25 01:29 ID:pFLFxdHr
がくがくぶるぶる((((((
>>10 > というより かちゅーしゃ 使ってるの?このメソッド。
> 大体そんな長い板名設定できないんじゃないかな?
何も知らないくせに勝手に結論出すな。ヴォケ。ヴァカはお前だ。ヴォケ。
上級者スレたてなきゃ。
>>15 バッファオーバーフロー利用して移すのですよ。
>>16 それはできないって。
できるなら、今回の件での方法を提示してみな。
>>17 >>9 を読みましたか?
出来ないって言っている奴はスタック上のコードが実行できないと
勘違いしていた奴なのであてになりません。
できる asm mov EAX, ESP jmp EAX end; しかし、今回の件では行えない訳だが。
>19 なんで? 溢れないから?それとも溢れても行えない?
21 :
デフォルトの名無しさん :03/09/25 02:14
しかしVCLってarray [0..xxx] of byte/charの嵐だな。 他にもありそうな悪寒。
>>20 取得元はウィンドウだし、ウィンドウはnull終端で終わる文字列として保持しているから0が入る命令は書けない。
元ネタに戻るがバグを含むVCL側のコードを実行する機会がなければ、ハグが発生する機会さえないわけで。
報告された問題は内部で意図的に作り出さないと起きない問題なため通常は発生しない。
ネット越しの汚い文字列を取り込まず攻撃コードに0x00が含まれず わりと新しい環境でビルドされ(そういえばかちゅはDel6以前だったよな)等々・・・の 条件をクリアしてれば通常は安全といえばそりゃ安全と言い張っても構わないけどさ(藁
微妙に表現が違うぞ。全部orで、どれかひとつでも満たされれば安全だ。 ListViewに至っては、加えてユーザーの操作(頭文字のキーを押しての検索)かつ、 標準の検索動作をわざわざ変えている、かつ、その時GetSearchString使用、かつ、 「ユーザーが入力したキーが」1024文字を超えて悪意のあるコードにならないといけない。 そもそもListView標準の検索動作に手を加えてるプログラムすらサンプル以外では見たことないしね
実は、Iniファイルの読み出しも2048文字に制限されてたりするので実際につくのは難しいかもね。
>>24-25 の条件を満たした場合に
このバグを実際に利用するには
バッファをオーバさせ(オーバさせた領域はスタック)リターンアドレスを書き換えて乗っ取るわけだけど
リターンアドレスはダイレクトアドレスでなければいけない。
他のパソコンで実行されるプログラムが同じアドレスに配置される可能性は低いので、これは乗っ取る側
が何度かアドレスを変更しトライする必要があり、その間に暴走・異常終了してしまう可能性大。
もし利用されても、他の手段ほど危険な状態にはならないだろう。
>>27 は 実行コード側に利用出来るコードが含まれている場合だけど、
それが無い場合はバッファオーバランを利用してそこにコードを書かなければいけない。
そうなると、スタックアドレスはアプリの状況により刻々変化するので余計に難しいように思う
29 :
デフォルトの名無しさん :03/09/25 10:41
ゆえにバッファオーバーフローは一般に危険ではないと。
バッファオーバーランは 1、API等のOSの機能 2、ネットワークに接続し、不特定の相手からデータを受信する の場合に悪用されえる。 通常のアプリでもこれが起きれば誤動作、異常終了の原因となりえるので根絶すべきなのは当然だと思うが
31 :
デフォルトの名無しさん :03/09/25 10:55
> 他のパソコンで実行されるプログラムが同じアドレスに配置される可能性は低いので、 間違い。高い。仮想メモリを採用しているため、 物理的には異なっても論理的に 同じアドレスに配置される可能性が高い。 そんなことも知らないの?
32 :
デフォルトの名無しさん :03/09/25 10:57
> そうなると、スタックアドレスはアプリの状況により刻々変化するので余計に難しいように思う どう変化しようが、変わるのはスタックの一番底なので ある時点でのスタックアドレス=スタックの上(すぐに取り出す部分)は変わりません。
33 :
デフォルトの名無しさん :03/09/25 11:00
> 1、API等のOSの機能 関係ない > 2、ネットワークに接続し、不特定の相手からデータを受信する ネットワークに接続する必要はない。
>>30-33 スレ違いです。
Delphiではネットワークで通信するようなアプリケーションは開発しないし
そもそもセキュリティーホールを狙われるほど広く普及したDelphi製のアプリケーションなどありません。
つまりこの問題は修正をしてもしなくても発生しないのです。断固セキュアなのです。
そこまでしてDelphiを貶めるのには何かわけがあるんですか?
もしかして滅びつつあるVBユーザーですか?
それとも予定ほどには普及していないまたGUIの貧弱なC#ユーザーですか?
我々の問題は我々自身で解決するので(そもそも問題自体が無効なのですが)これ以上スレを荒らさないでください。
これ以上続けるようなら管理者に連絡してアクセス禁止等の処置を取りますよ。
35 :
デフォルトの名無しさん :03/09/25 11:03
36 :
デフォルトの名無しさん :03/09/25 11:09
Delphi相談室(上級者以上)スレを作って そこで話したほうがいいんじゃね? 明らかに技術不足な奴がいるよ。 27とか30とか
>>31 へえ
procedure hoge;begin end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := Format('%p',[@hoge]);
end;
試してみたよ。 ホントだ。
>>32 でも、その場合、相対では指定出来ないでしょ。
38 :
デフォルトの名無しさん :03/09/25 11:12
いまだに暫定パッチすら出ていないということはBorlandの危機意識の低さを表しているよな。 まぁ信者がリスクを全部自分で負うから問題ないって言ってんだから問題ないんだろ。
>>38 やはりスタックの位置がわからないとダメみたいだね。
でも
procedure TForm1.Button1Click(Sender: TObject);
var test:integer;
begin
Caption := Format('%p',[@test]);
end;
として試してみると、やはり必ず同じアドレスになるようだ。
よって、スタックの位置が必ずわかっているのと同じだね。
という事で、想定しないバッファオーバラン対策として .dpr の先頭で var reg:Integer; begin reg:= GetTickCount and $FF0; asm sub ESP,reg end ; のようにするアイデアが浮かんだよ。 これでスタックを強制的にランダムに動かせるから アタックが成功する率を 1/256 に出来る。
42 :
デフォルトの名無しさん :03/09/25 11:53
バカか
>>41 じゃオールアセンブラで
procedure muddleSP;
asm
call GetTickCount
mov edx,[esp]
and eax,$00000ff0
sub esp,eax
jmp edx
end;
44 :
デフォルトの名無しさん :03/09/25 12:22
どこがオールだ
>>44 GetTickCount の部分も手続きに入れた所が
46 :
デフォルトの名無しさん :03/09/25 12:24
Del厨にとってはアセンブラ=埋め込み言語としか知らないのさ。
あとは、プログラムの配置アドレスを毎回動的に変更出来ればいいのだが・・・ スタテックリンクのDLLのサイズで配置アドレスって変わらないかな? もし変わるなら、実行終了時に別のプログラムを起動して、変更するとか可能なのだけど
興味を持つのは構わないけど思いつきで物言ってないで ちょっとは既存の対策方法をあさってみたら?
>>48 検索したら既存の対策方法も同じ感じだね。
・ 毎回ロードアドレスを変更する
・ スタックのベースアドレスも毎回変更する
既に巨大システムになったアプリケーション全てのバッファオーバラン対策を行うコストよりこっちが少ないからだってさ。
前スレで言ったけど、バグが起きる機能使わないだけでいいんだって。 普通に使えば遭遇しないって何回言ったらわかるの? 起きないものに対して対策して楽しいですか?
ああ、スタックポインタを256*16バイト程度動かすだけなら 16バイトごとに同じコードを配置したら抜けられてしまうね。 もっと大きく動かさないとあんまり効果ないか。
>>50 まあね。 今回のVCLの不具合はまあ大した事はないけど、
つい自分でも同じような事やっちゃう場合もあるでしょ。
そんな時の安全策は無いかと思ってさ
>>50 >ついでに言っておくが、実行コードを走らせるには実行可能フラグの設定されたメモリ領域ではならない。
>通常のヒープやスタックは実行不可。さらにオーバーフローされたとしても大抵は
>隣接する関係のないデータが書き換わるかAVが発生してあぼーんして終わり。
Windowsアプリケーションソフトウェアにおけるバッファオーバーフローの危険性
http://www.shadowpenguin.org/sc_documents/spsdocument21.pdf > 5. スタック上に置かれたコードの実行
> カーネルにより割り付けられたスタック領域は、読み
> 書き可能であると同時に実行可能です。つまり、スタック
> 上にコードを置き、EIPを適切に移すことができれば、置
> かれたコードは問題なく動作します
釈明ま~だ~?
釈明ってなんのさ? このスレ全部読めば?(プ
>>51 スタックをもっと大きく動かすと勿体無いお化けが出そうだから
別スレッドをランダムな個数作ってからそのスレッドをメインスレッドにするというのはどうだろか?
>>38 なるほど,『バッファオーバーフロー』の意味がよくわかりました.ありがとう.
Application.Run 内で1回メッセージループが回る都度 スタックをシャッフルするとかは意味あるかな?
初心者はカエレ
こっちに引越しする。 リターンアドレスはスタックに入ってるだろ。4バイトだがどうしても上位に0が入ってしまう。 Windowコントロールの仕様上文字列はnullで終わるので、メッセージ投げて取得しに行った時には既に0以降読み込めない。 また他のスタックデータも設定する場合もこの0問題があるので、正しくハックすることは不可能。 昨日も同じこと書いたぞ。 あとなToolbarとListViewは内部でDQN操作しない限り発生しないからバグはユーザー(作る人)の責任だぞ。 ライブラリのメンテナンスに期待しても無駄。自分で対処するのがプロってもんだろ。なんのためのソースだい?
>>59 そんなことで誤魔化そうってのか(綰听邵
Del厨必死だな(綰听邵
>>59 試してみた。 Win2K では スタック領域はコード領域より前にくるようだ。
コードは$400000番地代 よって、スタック領域は必ず上位は 00 になるのは間違いない。
ただし、上位が00という事は 丁度リターンアドレスの最上位でデータ列を終わらせれば不可能ではない。
コード部をその前の4096バイトの部分におけば良いからだ。
>>59 数多のクラックコードは当然'\0'を避けたコードを書いているんだけどな。
0使う命令には体外代替命令があるしデータの0なんて演算でいくらでも作り出せる。
>>60 どのあたりが必死なのか具体的に説明してくれませんか?
>>62 だから、命令の事じゃなくて、コードの流れを自分のコードに持ってくる為の最初の1ステップである
リターンアドレスを変更する為のデータが置けないと言ってるのだろう。
もちろん、たった一つだけなら0を置くことは出来る
>>61 ソースコード嫁
>>62 そんなことを言うのならば今回のケースで実際に動くコードを書いてみろ
>>65 言いたい事は、たぶん
4096バイトもスタックに取る場合は スタックフレームも作られるだろうから
帰り番地の前にスタックフレームもちゃんと書いてやらなければならないという事かな?
そうすると2つの#00を置くことは出来ないから帰り番地を書き換えられないと
俺を含めて4人だけかよ!
function TComboBoxStrings.Get (Self: TComboBoxStrings; var result Result: System.AnsiString; Text: array[$0..$FFF] of System.Char; Len: System.Integer; begin | PUSH EBX | PUSH ESI | PUSH EDI | ADD ESP,$FFFFF004 | PUSH EAX | MOV EDI,ECX | MOV ESI,EDX | MOV EBX,EAX | MOV EAX,ESP | PUSH EAX | PUSH ESI | PUSH $00000148 | MOV EAX,DWORD PTR [EBX+12] | CALL TWinControl.GetHandle{0xF0} | PUSH EAX | CALL SendMessage{0x190} | CMP EAX,-1 | JNE +2; (0x2E) | XOR EAX,EAX | MOV EDX,ESP | MOV ECX,EDI | XCHG EAX,ECX | CALL @LStrFromPCharLen{0x2B6} | ADD ESP,$00001000 | POP EDI | POP ESI | POP EBX | RET NEAR end;
>>68 は
>>66 への反証だ。
つまり、スタックフレーム(EBP)は作られていない。
よって、もしも何らかの方法で任意の文字列を置けるならば、
攻撃者がリターンアドレスをスタックフレーム内に書き換える事は可能。
結局、CALLでのSPが$123456 だとしたら
4096+3*4 バイトの後に #$56#$34#$12#00 というデータを作り
この文字列の先頭からウイルスプログラムを書けばいいという事だね。
こういう攻撃法に対しては
>>41 >>43 もある程度は有効。
ただし、
>>51 の方法で回避されるから、もう少し大きめ と4byte単位で
俺Delphi7使いだから関係ねーし
.dpr じゃなく ユニットのinitialization 節でやる方法はないかな? それが出来ればダミーコンポをポトペタしてもらえば解決するというふうにできるのだけど。
74 :
デフォルトの名無しさん :03/09/25 23:18
この瞬間Del厨の間に非本質的で小手先なバッファオーバーフロー対応が広がろうとしています!!
>>74 いいじゃないか
暴走原因としてのバッファオーバフローはデバッグして取るべきものだけど
それでも残る事はあるさ、その場合でも攻撃者に利用し辛くしておくことには意味はある。
今回の件は、そもそもセキュリティネタに入れるのはどうかと思うようなことだけどね。
75 = 荒らし本人
はせがわの謝罪まだー
結局誰もセキュリティを破ることは出来ないってわけね。
なんだかんだいってもDel厨って放置できないからマヌケだよね。(w
>>41 >>43 を使う場合は、.dprの中で実行して end の前に元に戻すようにしないとダメなんじゃない?・・・・
と思ったら、end の所で RETは実行されないのか・初めて知ったよ。
>63 そんなVB厨はスルーがイチバン
82 :
デフォルトの名無しさん :03/09/26 22:07
>>73 .dpr の begin の前に @InitExe という隠れた手続き中で initializationは呼ばれ
initialization は ret で終わり、その後 pop /retが何度かある
という事で、 initialization 中ではスタックを変更するのは無理。
initialization 中で InitProc を設定して
Application.Initialize; でやる方法もあるけど
そうすると、 InitProc は他のユニットからもリンクチェイン式に使われるので難しいかもね
やるとすれば initialization 中に@InitExe の ret の帰り番地を書き換えて
パッチをあてる方法だけど、こういうコードがexeに入っていると、逆に攻撃者にこれを
利用されてしまうような気がする・・・大丈夫かな?
そんな細工しなくても、VCL コードを直せばすむと思うんですが。
オーバーラン対策は、オーバーランしない用にコードを書くこと。 あたりまえなんだけど、これが一番。 Linux 系で、ライブラリ/メモリマネージャに手を入れてオーバーランを検出できるように したものがあるけどね。
>>86 まあそうなんだけど、今回の騒ぎのように、使ったライブラリに入ってしまった場合とか
テストコードのつもりで書いたのがデグレで混入してしまったり、
5万行くらい書いてると、完璧だって言い切るのは難しくなるでしょ?
まあ、GUIアプリだと CUIのようにGCIから呼ばれて使われるという事もないから、
ネットワークとの入出力の部分だけに限ってチェックすればいいとは思うけど
>>87 でも片手落ちだと思うよ。
1、確かにスタック上の任意のコードを走らせる確率は減るけどゼロではない。
まあ、失敗したら例外で落ちるだろうから大多数は攻撃に気づくだろうけど、ゼロでない事は重要。
2、スタック上の任意コードはガード出来たとしても、プログラム領域はガード出来ない。
任意のコードは書けないが、普段とおらない筈の部分をいくらでも呼び出せる。
たとえば、個人情報を吸い出されたり、パスワードを解除するような部分を呼び出してパスワードを解除したり、
コード上にある全ての機能を呼び出せてしまう。
と、書くと今度はコード領域もシャッフルすると言い出すんだろうな。
まあそれも有効な方法だから否定はしないけど。
ライブラリに問題があったら直す。自分のコードに問題があったら直す。 ってことだとおもうんだけど。 スタックオーバーフローに関してならスタックにバッファを取らない。と規定すればよし。 String / Dynamic Array を使えばほとんどのコードはそのまま使える。 88 さんの #1 も #2 も非現実的な話。
>テストコードのつもりで書いたのがデグレで混入してしまったり、 >5万行くらい書いてると、完璧だって言い切るのは難しくなるでしょ? それを言い始めたら「プログラムが正しいことの証明」ってことになって不可能。 できるだけおきないようにする。とか、おきたら検出できるようにする。 ってするしか。 C/C++ では、歴史的に文字列バッファをスタック上の Char 配列でとるコードが使われており、 それを長さチェックなしで操作しているコードが多くあったので問題が出た。 Delphi だと文字列型はヒープだし、範囲チェックを ON にすれば配列オーバーランも実行時検出できる。 実際のところ、C# / Java でも「不正メモリアクセスを検出」することができるだけで、それはうまく使えば DOS (サービス不能攻撃) を起こすことができるわけで、そこまで行ったらやはりアプリ側での対応の問題となるでしょ。
まあ、ヒープであっても PCHAR( 文字型 ) を使うと、常にバッファオーバランの可能性はあるわけで・・・・ 範囲チェックをONしても 配列を外部DLLに渡すような場合まではチェックしてくれないし・・・・ ただ、ヒープだとアプリの状態によって、オーバランしたときにどこを壊すかというのが変わってくるから攻撃は難しいか。
>>90 いや、だから、そういう注意を優先項目の一つとしておざなりにすべきではないと思うし、
現在は自分だって注意してコーデングしてるつもりだよ。
しかし、長年使ってると、自作したライブラリはとても大きいし、貰ってきたライブラリも多数あるって事でさ、
おきてしまったときに、攻撃し難くしておこうというのが、スタックスクランブルの手法で、
この為に支払うコストは僅かなスタック上のゴミだけで、実行には何の影響もない。
僅かなコストを支払って、大きなメリットがあるのだから、入れて問題は無いと思うのだが?
いや自分でやる分には反対はしないけどね。 ただ、 initialization であんまりお手軽に対策出来るようにすると 初心者が何も考えずに、これでOKってなりゃしないかなと。
>>88 の追加
3、データ領域にもコードを置いて実行させる事が出来る。
文字列の場合、元と同じサイズまでなら同じアドレスに配置されるので、文字列にコードを埋め込んでおいて
そのアドレスに分岐することも出来る。
その検証コード
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
type TGetSP=function:Integer;
begin
s:='XPテ';
caption:=IntToHex(TGetSP(PChar(s)),4);
end;
これで 文字列中の XPテ を実行してかえってくる
X: POP EAX
P: PUSH EAX
テ: RET
簡単にわずかでもリスクを減らす。ってのなら否定はしない。 「大きなメリット」かどうかには疑問があるが。 その方向でちょっと研究/まとめてみたら? bdn に投稿すればお金ももらえるし。
>>94 のように、データ領域を使って任意コードが実行出来るとなると
ここに数バイトのコードさえ置けるなら、これを使ってSP相対で分岐されてしまい
スタックをシャッフルするという対策は意味のないものになってしまう。
結論として、スタックシャッフルを入れても悪い訳ではないが、それを入れて安全とは言えない。
話が発散してないか? データ領域のデータに実行可能属性が付いているのは OS の問題なんだし、それをいまさら発見のように書かれても。 問題は Exploit でつつくことが可能かどうか?という点でしょ?
>>97 もし、ネットワークで任意データを取得するプログラムでバッファオーバランが起きた時に
事前に設定した文字列・あるいは数値が固定アドレスに配置されているなら、それと組み合わせてつつく事が可能。
文字列はネットワークデータからのデータで再配置されてしまう可能性が高いが、
文字列上の数値を利用するような場合、数値は固定番地におかれる可能性が高い。
グローバル変数でなく、クラス等使ってヒープ上にそれがあっても、そのヒープはプロセスの先頭で確保されているなら
同じアドレスとなってしまうためだ。 特に負数が設定出来るような場合は・・・
わかってるって。 「バッファオーバランが起きた時」には何でもできる。それをいまさら大騒ぎしなくてもいいでしょ?ってこと。 穴をつつくコードはアセンブラの知識があれば良い話し出し。 だから「オーバーランが起きないように」しましょう。ってのと、 もしおきたら、それを検出/遮断しましょう。って話をしているのでは?
>>99 いや、オーバランしてもスタックをスクランブルすれば効果があるというのに対して、
スタックをスクランブルしても、別の攻撃方法があるよという事。
条件:
・
>>68 のコードがあるとする
・データが $00789ABC に配置されてる整数型変数があるとする
攻撃者
1、整数型変数に $802464FF を設定する これは JUMP [ESP-128]相当
2、攻撃コードは 4096+3*4-128バイトからに配置
乗っ取りコードは4096+3*4 バイトの後に #$BC#$9A#$78#00
これで、JUMP [ESP-128]が実行された後、スタックの位置に関係なく攻撃コードが実行される。
そろそろ Delphi 固有の話ではなくなってきていませんかね? ライブラリへの介入でオーバーフロー問題が解決するなら Linux/MS がとっくに対応しているでしょ? C/C++ の方が傷口が大きいのだから。 FUD したいなら別のところで。
>>101 LINUXの方は OS 側でもあるていど対応しようとしてるみたいだね。
1、スタック・データ・コード再配置アドレスのシャッフル
2、スタック領域の実行不可属性
3、データ領域(ヒープ)の実行不可属性
Windowsの方は何のアナウンスもないようだ。
同じようなせ制限とアドレスシャッフルは有効だと思うのだけどね
ただMSはMAC用のIEで、これと似た手法で対策を入れたらしい。
それと C/C++ではコンパイラ側で スタック上、retアドレスの直前にガードデータを入れておくとか ある程度の対応を入れてるようだ。
で、102, 103 で言及している方法でも完全ではない。ってこともわかっているんだよね?
>>105 うん。だからもう少しその関係を勉強しなさい。
Linux にもその実装はあるの。で既存のコードとの非互換性とかがおきているの。
ソースコードレベルで再コンパイルできる UNIX でそれだから MS Windows ではちょっと
難しい。
で、どこらへんが Delphi ?
>>106 もともと WindowsのEXE/DLLは再配置可能モジュールで実際 NT/9xでアドレスも違ってたので
アプリの配置アドレスのシャッフルでは影響は出難いと思うよ。
で、その話のどこがDelphi?
結論としては、 リターンアドレスを書き換えるタイプの攻撃に対しては スタック領域+データ領域+ヒープ領域+コード領域の4つ同時にシャッフルしなければ意味がない。 Windowsがソレをやってくれればいいが、そうでない以上、 Delphi側で簡単に対応可能なのはスタック・ヒープのみ。 他の2つは難しい。・・・・何か方法ある?
いや、だからそれで簡単に結論出ちゃうと、世の中に Exploit はなくなっちゃうのだよ。 Java/.NET のようにがちがちにしても、まだ穴があくんだから。
W2Kで
>>94 のコードに追加して
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
type TGetSP=function:Integer;
var OldAcc:Integer;
begin
s:='XPテ';
VirtualProtect(PChar(s),10,PAGE_READWRITE , @OldAcc)
GetLastError;
caption:=IntToHex(TGetSP(PChar(s)),8);
end;
とやったけど 例外が出ない。
Win2KではPAGE_READWRITE 属性だと実行可能なのか・・・
確かに 実行不可で Read/Write可能って属性をページ毎に割り振れるなら スタックとデータ領域にそれをかければ、問題の多くは解決してしまうようにも思うな。 なんでそういう設計になってないんだろ?
>>111 うぅ。先人の苦労を一から踏む気か。i386 の資料を読んで頂戴。
そろそろもっとレベルの高い話してくれませんか? 知ってることばかりでつまらないです。
そういえば、何でスタックは上からなのでしょうね? 下から使えば、バッファ溢れを利用した攻撃なんて心配しなくていいような。
>>115 汎用CPUだとデータ領域は上からスタックを下から取れば領域を動的に目いっぱい使えるからでしょう。
DSPなんかではスタックをどっち方向に使うか切り替えられるものもありますよね。
>>116 ちゃんと
>>115 のネタに付き合ってやれよ。
「スタックは下からだよバーカ」でもいんだよ。そこからネタが広がるんじゃないか。
あ、ひょっとして上下間違えました? 仮想アドレスが32ビット00000000..ffffffffとあったら、00000000が下位…と思ってたのですが 貧弱な記憶だと、00000000から順に、OS、コード、データ、空間、スタック、の順で、 上下こんがらがってるので矢印で書くと、空間に向けて、データが→、スタックが←方向で伸びる…ですよね… 115は、仮にスタックを→方向に使えるなら、バッファオーバーフローでリターンアドレスが上書きされる 心配が無くなるのでは、という意図のつもりでした。
>>118 昔の人は、メモリマップを描く時に 0番地を上に書いたので 上、下というと逆の意味になる事が多いです。
上位・下位と言えばその通りになります。
上の報告だと Win2000では OS →スタック → コード →データ みたい。これは 調べてみたら?
だから、空間を有効利用出来るという事では意味が無いですね。
バッファオーバーフローの件はその通りですね。 そこまで考えなかったのでしょう。
そこまで考えていれば i386 で読/書可能で実行不可な状態を簡単に作れるようにしてくれたでしょうし
調べてみました。SDK見ても、 Windows NT/2000/XP: The 2 GB partition in low memory (0x00000000 through 0x7FFFFFFF) is available to the process, and the 2 GB partition in high memory (0x80000000 through 0xFFFFFFFF) is reserved for the system. としか書いてなかったので、 program MemLayout; {$APPTYPE CONSOLE} uses SysUtils; function Stack: Cardinal; asm mov eax, esp end; var P: Pointer; begin WriteLn('コード: ', IntToHex(Cardinal(@Stack), 8)); WriteLn('データ: ', IntToHex(Cardinal(@AllocMemCount), 8)); P := HeapAlloc(GetProcessHeap, 0, 1);WriteLn('ヒープ: ', IntToHex(Cardinal(P), 8)); WriteLn('スタック: ', IntToHex(Stack, 8)); GetMem(P, 1);WriteLn('Delphiのはvirtualalloc: ', IntToHex(Cardinal(P), 8));ReadLn end. コード: 00408148 データ: 0040A5AC ヒープ: 00132700 スタック: 0012FF88 Delphiのはvirtualalloc: 00C70984 結果、スタック→ヒープ→コード→データ→OS or VirtualAlloc?
121 :
デフォルトの名無しさん :03/09/27 19:45
俺は基礎知識としてCを覚えておけという主張には常々否定的だったんだが、 このスレの厨房みてるとやっぱ一度はC&UNIX&socketプログラミング やっといたほうがいいような気がしてきたよ。
キョウモ シコシコ コーデング
∧,,∧ ノートPC用に環境ごとに
ミ*゚Д゚彡 ネットワーク設定を
ミ つ旦)~~ 一発切り替え
~と,,,~),,~) できるソフトを
作りたくなりました。
IPアドレス・サブネット・デフォゲ・DNS
LMHOSTS・etc....
レジストリの変更箇所は追えましたが
([Delphi-ML:15656]とか参考)
手動で変更しても、設定に反映されませんです。
ネットワークの接続先アイコンのCaptionやら
プロパティの中身やらを、自由に取得変更する方法を
どなたかご存知でしたら教えてください。
http://redmaru.hp.infoseek.co.jp/index.html NetSet
と同じような機能のソフトを作りテー表ます
皆さんやっぱりソフトとか作る前には 大まかな仕様とか紙に書いたりするんですか?
UMLでデザインしているぜ。
HSPにフサギコが負けた。
128 :
デフォルトの名無しさん :03/09/28 22:40
こんばんわ、 いきなりで申し訳ないですが キャンバスに出力する文字列も幅と高さを知るのに CanvasのTextExtent メソッドがありますが、 Canvasを使わず幅高さを知る方法を知ってたら教えて下さい。
129 :
デフォルトの名無しさん :03/09/28 22:43
こんばんわ、 いきなりで申し訳ないですが キャンバスに出力する文字列も幅と高さを知るのに CanvasのTextExtent メソッドがありますが、 Canvasを使わず幅高さを知る方法を知ってたら教えて下さい。
こんばんわ、 いきなりで申し訳ないですが キャンバスに出力する文字列も幅と高さを知るのに CanvasのTextExtent メソッドがありますが、 Canvasを使わず幅高さを知る方法を知ってたら教えて下さい。
>>122 SHChangeNotifyで行けないかな?
Shell系の関数だから関係ないか。
133 :
デフォルトの名無しさん :03/09/29 00:05
>>132 内部でキャンバス作ってやったんだけどうまくいかなかったもんで・・・
やり方が悪かったかな、
134 :
デフォルトの名無しさん :03/09/29 00:07
>>132 もしよければ簡単なサンプルを教えてもらえませんか?
135 :
デフォルトの名無しさん :03/09/29 00:11
誰かお願いします。どうしてもやりたいもんで・・・
何度もageてゆーなっつーとろーが。 サンプルはくだすれに書くよ。(ここは中級者以上)
137 :
デフォルトの名無しさん :03/09/29 00:27
>>136 どもありがとです、
くだすれみてみます。
場違いでした、すみません。
だからsageを覚えてくれ。頼むから。(TT)
Canvas、つまりデバイスコンテキストを使わずに文字列の大きさを取得する方法は 十分中級者以上の話題では?
上級者だと思われ。
言ってることが矛盾してるな。取得しようとしている値はDC依存だろ。DC使わないで何を取得するの? 自称中級者はカエレ
DCって何の略?
143 :
デフォルトの名無しさん :03/09/29 04:50
144 :
デフォルトの名無しさん :03/09/29 06:22
デジ・キャラットとか思ったそこのお前!
デ・ジ・キャラットなわけだが。
ドリームキャスト
149 :
デフォルトの名無しさん :03/09/29 15:55
>>130 ということは、出力さきのデバイスに依存してるっと事なんですね。
一応内部的にキャンバスを作り解決しました。
みなさんどうもありがとうでした。
内部的にCanvas使ってるなら、結局Canvas使ってるじゃない。
あほな質問すなや。
>>141 DCが保持しているパラメータを使ってシミュレートするんじゃない?
描画はしないけど情報だけほしい。ってときには CreateDC の変わりに CreateIC を 使いますが、そのことを聞きたいのでは? たぶんちがうだろうけどね。
たしかにたぶん違うね。 フォント情報とセットにして解析するのはめんどくさい上、精密でない可能性もあるしね。
>>150 uses, ShlObj;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nil, nil);
でレ痔ストリの内容がシステムに反映されます。
ただ、おいらはアプリの *.icoを更新しただけだから、フサ氏のやりたいことが
このコードでできるかどうかは不明。
クズレスならスマソ。
155 :
デフォルトの名無しさん :03/09/30 15:28
これだからDel厨は
コンポーネント作成の話題はこちらでいいでしょうか? TGraphicControl継承のコンポーネントで 背景や枠を持たせない設定が出来るようにしようと const clNone = TColor(-1) ; なら Polygon -> Polyline あるいは枠を描画しないようにしています。 ただ、問題は オブジェクトインスペクタでは $FFFFFFFF と表示されてしまう事です。 これを clNoneと表示させる為に、 プロパティエディタを作りました。 ところが、 TColor型の全てのプロパティが $FFFFFFFF なら clNoneとなってしまいました。r 自作コンポーネントは複数あるので、 そこで TColor型ではなくTColorNone型というのを作ってみたのですが やはり同じ結果になりました。 どうやれば上手くいくでしょう?
157 :
156のコードです :03/10/03 11:37
interface uses DsgnIntf, Graphics; const clNone = TColor(-1); type TColorNone =TColor; TColorNoneProperty = class( TColorProperty) public function GetValue: string; override; procedure SetValue(const Value: string); override; end; procedure Register; implementation uses Sysutils; const clNoneStr='clNone'; function TColorNoneProperty.GetValue: string; begin if GetOrdValue = clNone then Result :=clNoneStr else Result := ColorToString(TColor(GetOrdValue)); end; procedure TColorNoneProperty.SetValue(const Value: string); begin if AnsiSameText(Value,clNoneStr) then SetValue('$'+IntToHex(clNone,8)) else inherited SetValue(Value); end; procedure Register; begin RegisterPropertyEditor(TypeInfo(TColorNone), nil, '', TColorNoneProperty); end;
RegisterPropertyEditor の第2、第3引数を厳密に指定してみたらどうなる? それぞれプロパティエディタを変更したいクラスと、そのプロパティ名を指定します。
>>158 恥ずかしい・・・既に clNone という色は定義されてたのを忘れていました。
名前を変更したらいけそうです。ドロップダウン時に参照されるようなので
>>157 のコードではエラーが出るようになりましたが。
というか、Delphi定義済のclNoneをそのまま使って、clNoneを使わないという意味に使っても大丈夫みたいですね。 使われてる所みても、そんな感じみたいだし。 コンポーネント作成関係ない話題になってしまいました。ごめんなさい。
161 :
デフォルトの名無しさん :03/10/04 00:45
釣れた(藁
162 :
デフォルトの名無しさん :03/10/04 17:01
IDEでコンポーネントを最初に貼り付けた時に特別な初期値を用意したいのですが可能でしょうか? 整数型の場合、単にCreateで初期化し、初期値を default で指定すればよかったのですが double型のプロパティを 100 で初期化した場合に困ってしまいました。 double型では default が使えないのです。 その為、プロパティを0 にするとプロパティが保存されず、結果 次にロードされると100に戻ってしまう現象が起きてしまいました。
自己解決しました。 Createで if csDesigning in ComponentState then begin と場合別けすりゃいいだけですね・・・・・どうも思考が硬直して型に嵌ってしまったようです。
∧,,∧ どもーー、
ミ*゚Д゚彡 ごぶたさです。
ミ つ旦)~~
~と,,,~),,~)
レスサンコ
>>154 、フサファンさん。
進中のページを見ますと
http://www.asahi-net.or.jp/~GV4J-SGUR/narik/stp001.htm#SHChangeNotify SHChangeNotifyについての、オプションがいろいろ変えられることがわかるのですが
いったい、どれがTCP/IP設定変更時のレジストリ更新に
有効なのか、とんと、検討もつきません。
TCP/IPの設定はレジストリ更新差分比較ツールでみたところ
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{NIC名}\Parameters\Tcpip]
このあたりにあると思ワレなのですが、
レジストリを変更してSHChangeNotifyを実行しても
うまく動かないっすね。
なんか、特殊なやり方があるように思うのですが…
どこかに情報ないかしら。
リバースエンジニアリング。しなさい
166 :
デフォルトの名無しさん :03/10/15 16:53
TCustomControlを継承して、付箋紙のようなウィンドウを表示するにはどうすればいいのでしょうか? 普通はTCustomFormを継承して作成するのだろうけど、いらない機能が多すぎて。。。
TControl はウィンドウを持たないから... 最低限、TWinControl からはじめたら? アプリ側で設定ダイアログを一つでも持てば TForm のコードが引きずり込まれるわけで 機能が多いからといって無駄になるわけではない。
TCustomControlはTWinControlからの継承だよ。
>>166 THintWindow とかのソースを参照したら?
THintWindowのソースが参考になりました。thx!
171 :
バグですか? :03/10/17 15:48
超初心者に書いてしまいましたが、以下の内容は中級者で良い? Delphi5・BDE5.11でTBatchMoveを使用してParadoxテーブルのコピーを 行った所、「ディスク容量が足りません」って出ます。 ディスクの空き領域が4.00G(4,295,634,944)付近の場合のみ発生します・・・ ちなみにテーブルは200M程度なので、足りないわけ無いはずなのですが、 ディスクの空き領域が3.99Gになると発生しません。 何か分かる方居ますか?
>>171 だったら適当にファイルを作って容量を減らせばいい。
2の32乗ってわかる?
>>171 バグだと思いますよ。 レポートを上げておくべきでしょう。
DWORD付近ですねぇ。
>>171 どこか間違えてるが95%、バグの可能性が5%と見た
フォトショップの選択ツールで見られる「蟻の行列」を 実装するにはどのようにすればいいんですか。
xor モードで画面枠の点点を描いては?
178 :
バグですか? :03/10/17 18:01
いろいろ試したが、2147483648Byteで割り切れるサイズを境に、TBatchMoveが 正常に動作しない模様! TBatchMove自体がコピー先のディスク空き容量を見ている感じ・・・ そして、TBatchMoveがディスク空き容量の確認にGetDiskFreeSpaceExを使わずに GetDiskFreeSpaceを使ってるから、2147483648Byteで割り切れるサイズでは 「ディスク容量が足りません」って出してると推測しました!!! Delphi7では直っているんでしょうね~・・・
>>178 delphi側では DiskFreeを使ってないみたい。だからたぶんBDEの問題じゃないかな。
自称中級者はカエレ
delphiでパケットモニタみたいなの作れる? さすがにindyにそんなのないよな。 いいコンポーネントでもクラスでもあったら教えて下さい
パケットモニタの原理が解らないわ!
>>182 漏れもわからんのだが80番ポートを監視したらできそうな気がするが
違うん?
port:80はHTTP専用では? WinSockレベルで監視と言うと、listenするって事ですよね? つまり、サーバーになっちゃう。
なんつー低レベルな会話・・・ おまいら、ここは中級者以上ですが?
WinsockだけでNETSTATみたいなのは作れないよ。
NETSTATはSNMPかと。パケットキャプチャと関係ない。 まあ作ろうと思えばWinsockでも作れないことはないが、実行するにはOSの設定が必要。
>>184 それ見ると、デバイスドライバ作ってるね。
NDIS中間ドライバなるもので実現しているみたい。 デバイスドライバ用のコールバック関数は デバイスドライバで作るしかないって事か。 そのドライバ(DLL)をDelphiからも使えたら、 Delphiでもパケットモニタを作れる…。
あれ、たしかActiveXだったと思ったが。Delphiから利用できるっと。
193 :
デフォルトの名無しさん :03/10/20 17:46
THintWindow上の子ウィンドウを表示するにはどうすればいいのでしょうか? ボタン等を動的作成して、ParentをHintWindowに設定しても表示されませんが。。。
>>193 普通に表示されましたよ?
var w:THintWindow;
begin
w:=THintWindow.Create(Self);
w.Parent:=Self;
w.Left:=10;
w.Top:=30;
w.Width:=100;
w.Height:=40;
with TButton.Create(w) do begin
Parent:=w;
Caption:='test';
end;
デル厨はレベルが低いなぁ(ゲラゲラ
>>195 w.Parent:=nil; の場合は表示されませんよ。
>>198 だからさ、親にTCustomForm継承が無いと上手く動かないようになってるんだよ。
どうしてもやりたいなら、そこの部分を自前で処理しないといけない。
とりあえず表示させたいなら、
w:=THintWindow.Create(Self);
w.Left:=10;
w.Top:=50;
w.Width:=100;
w.Height:=40;
with TButton.Create(w) do begin
Parent:=w;
Caption:='test';
SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_SHOWWINDOW);
end;
SetWindowPos(w.Handle, 0, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_SHOWWINDOW);
とか無理やりに表示フラグをオンしてやれば表示はするけど、Visibleフラグは更新されないぞ。
とりあえず、Parentにnilが嫌なら ParentWindow:=Application.Handle; で我慢するというのはダメかい?
>>199-200 子ウィンドウをすべて検索して、一個一個表示させないといけないようですね。
>ParentWindow:=Application.Handle;
MainFormを最小化したら、HintWindowも最小化されてしまいました。
パケットモニタを作るのはやめなの?
難しいのでやめらしい。
WinSockAPIのフックならDelphiでも出来るんだけどね。
205 :
デフォルトの名無しさん :03/10/24 23:19
>>204 Rawソケット使うんじゃないの?フックつかうの?
Rawソケットを使うやり方はWindows2000以降で WinSockレベルのパケットキャプチャが出来るんだって。 NDISはWinSockを経由しないので、Rawソケットより強力。
お前らいつまでも馬鹿なこといってないでさっさとetherealのplugin作ってしまえ
dcc32でターゲットファイル名を指定できないのはバグですか?
ファイル名に空白を含んでいるのでは?
"" でくくってください。
くくりたくない場合はどうすればいいですか?
氏ね
くくればいいじゃんかよぉ
首くくれ。
病院坂逝け
プロジェクトオプションのリンカのタブにある 「TD32デバッグ情報を含める」をチェックすると exeファイルがでかくなるんだけど このファイルのフォーマットの情報ってどこにあるか知ってる方居ません?
>>217 はるか太古の昔からの機能ゆえ、俺も最初のリファレンスを知らん。
JCLにTD32の情報を読み取るクラスがあるのでそれらから調べることができるかもしれない。
Jediに聞けば答えてくれるかもね。
おおっサンクス。 かなり参考になります。 折を見てJEDIに聞いてみようかな。英語苦手なんだけどなぁ。 そのまえにMemCheckの堀氏に聞いてみるかな。
古の Borland デバッグ情報は、 ハンドブック風の書籍としてBorland 自身が公開していたとおもったが タイトルがおもいだせないなぁ。
221 :
デフォルトの名無しさん :03/11/09 23:48
8キタ-
堤さやか \952 「とびっきりSUNDAY,・・・fall in love ♥」
文字列にメソッドポインタを割り付けて、メソッドを呼び出したいのだが 全然やり方がわからん。誰か教えてくれ。 下のようなコードを書いてみた。 type TDict = record key: String; value: Pointer; end; 登録しようとするとエラー begin dict[0].key := 'Enter'; dict[0].value := PEnter; //ここでエラー dict[1].key := 'Exit'; dict[1].value := PExit; //ここでもエラー end; 利用しようとしてもエラー procedure TUserManager.Execute(command, mess: String); var i: Integer; begin for i := Low(dict) to High(dict) do if dict[i].key = command then dict[i].value(mess); //だめ end;
224 :
デフォルトの名無しさん :03/11/10 01:48
すまん、↑のやつの補足。 PEnter も PExit もTUserManagerで定義しているメソッドで、 どちらもString一つを引数に取る手続き。 なんだけど、上のコードでは「実パラメータが足りません」とか言われる。 で、適当なパラメータをつけてやると 例) dict[0].value := PEnter(s); 「関数とか形無しとかとポインタとは互換性がありません」みたいに言われる。 じゃあポインタにしようと思って@つけてみると 例) dict[0].value := @PEnter(s); 「変数が必要です」とかいう。もうね。なんとかならないかと。
type procedure TEnterEvent(value: String) of object; TDict = recort FOnValue: TEnterEvent; end;
↑早速ありがとうっす。 でも、相変わらず 「TEnterEventと形無しなんちゃらに互換性がない」って怒られるっす
↑すんません自己解決しました。 登録時に dict[0].value := PEnter(s) //←この引数部分がヤバかった こうすればOKでした。 dict[0].value := PEnter
IntraWebって、簡単にWebソフトができそーな予感がするんだけど、 みんな使ってるの? どこまでのことがIntraWebでできますか?
Delphiではprivateメソッドの引数の型は非公開にできないのでしょうか? C++で書くと、こんな事をやりたいのですが・・・・ //---------------------------- class TX { private: //---------------------------- // ↓このクラスを隠蔽したい。 class TY { public: void Exec(int num); }; //---------------------------- int m_num; void Init(TY *pobj); public: TX(int n); }; //---------------------------- TX::TX(int n) { TY a; m_num = n; Init(&a); } void TX::TY::Exec(int num) { Form1->Caption = Format("Hello:%d",OPENARRAY(TVarRec,(num))); } void TX::Init(TY *pobj) { pobj->Exec(m_num); } //---------------------------- Init をProcedure手続きにしてimplement するしかないのでしょうか?
>>229 現状できないね…。Delphi.NETだと確か入れ子宣言が可能になったはずだけども。
>>230 ありがとうございます。
そうですか、Delphi.Netから対応ですか・・・(これだけの為に買うのも・・・)
クラス内クラス以外でも実現できないとすると、
InitメソッドをProcedureに置き換えるしかないなぁ。
ComboBoxをオーナードローで描画したら、ComboBoxのエディット部分を編集できなくなったす。 #前提条件 ComboBox1.Style := scOwnerDrowFixed ComboBox1.DrawItem := TForm1.ComboBox1DrawItem ComboBox1のItemsにAddObjectとして clBlack, clBlue, clRedとかを入れてる procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with ComboBox1.Canvas do begin FillRect(Rect); Font.Color := TColor(ComboBox1.Items.Objects[Index]); TextOut(Rect.Left+1, Rect.Top+1, ComboBox1.Items[Index]); end; end; エディット部分を編集できるようにするためには、あとなにをしたらいいの?
プロパティを何も設定しない状態で(Style=csDropDown) type TXComboBox = class(TComboBox) protected procedure CreateParams(var Params: TCreateParams); override; end; //TXComboBox procedure TXComboBox.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); with Params do Style := Style or CBS_OWNERDRAWFIXED; end; を適用する。 VCLはオーナードローでエディット可のスタイルを標準でサポートしていません。 ちなみにSetWindowLongは効かないのでCreateParamsをいじるは絶対条件です。 Delphi8では変わっていればいいなあ。
234 :
デフォルトの名無しさん :03/11/17 17:29
こんにちは。教えてください、スゴイひと。 Delphi7のActiveXコントロールウィザードでTextBoxを 継承したOCXを作りました。 そのOCXをほかのプロジェクトで使うとデフォルトで Textが 'XXXEdit1' ってなっちゃうんですけど、 これをはじめから空白にするにはどうしたら良いですか?
ControlStyleからcsSetCaptionを削除すると幸せになれるかもしれません。
回答ありがとうございます。 して、それをどこに記述すれば良いんでしょうか? 設計時にフォームに貼り付けたときに走るコンストラクタの ようなものはありますか?そしてそれは(あるとしたら) どのようにデバッグすれば良いんでしょう?
237 :
デフォルトの名無しさん :03/11/17 19:13
コンストラクタをオーバーライドすればいいだけじゃないのか?
Delphi2や3ではTFTPコンポーネントがあったと思うのですが、Delphi6や7では なくなっていますね。IPアドレスを指定して、そこにあるフォルダを持ってきたいのですが、 どのようにすればいいのでしょうか?教えて頂けないでしょうか?お願いします。
>>238 Indyに代わりました。検索するとサンプルが出てくるかもしれません。
”静的メソッドはオーバーライドできません。” だそうです。
240は237さんへのレスです。
>>240 で、君はそのメッセージをヘルプで調べたのかね?
>>242 それがどうかしたのか? 答えになってねーぞ。
はぁ…
もう自己解決した。お前らみたいな口だけの馬鹿に聞いたのが間違いだったな。
さすがDelphiのスレだな。
自称中級者sage
どこのスレで質問するのが一番適当なのか悩んだのですが、ここで質問させていただきます。 現在、DB2をDelphiで使用する方法を模索しています。 今のところ分かっているのは、 1.Delphi付属のBDE、DBExpress等のコンポーネント 2.migaroのDelphi/400 3.IBMのCSレボリューション の3つです。 新規開発においては1.のDelphi付属のコンポーネントでも十分なのでしょうが、 AS/400にすでにある資産(帳票等)を流用したいので、Delphi付属のコンポーネントでは、 物足りないです。 また、2.のDelphi/400は以前使用したことがあり、機能的にはメッセージ、コマンド、SQLが 使用できて十分なのですが、レスポンスは満足できるものではありませんでした。 3.のCSレボリューションはソケットを使用した伝聞でPC、AS/400間をやり取りするそうで、 レスポンスの点ではダントツのようですが、全ての開発において伝聞の形式を定義しなければ ならず、開発効率がかなり悪いようです。 どなたか、他にツールをご存知の方はいらっしゃいますでしょうか? よろしくお願いします。
251 :
デフォルトの名無しさん :03/12/15 14:58
Dephi7のインラインアセンブラでSSEとか、SSE2コードを書いていると、 デバッガでステップトレースした際に、頻繁にInternal Error が出てしまいます。 何とかならないもんでしょうか(^^; 現在は、クリティカルなコードはなるべくステップトレースを避けるなどして、 どうにか対処してますけど・・・。 4,5000行もインラインアセンブラで組んでいると、 そうも行かないところも出てきてしまって…。 Borlandに言っても、修正パッチとかは出そうに無いですし・・・。 それと、デバッグ時にXMMレジスタの中身が確認できないのも辛い。
氏ね
254 :
デフォルトの名無しさん :03/12/16 08:33
21インチのモニタでビデオカードも最強な漏れ フルスクリーンでしか起動しないゲームを フォームの中に4つ程埋め込んで同時ハァハァしたいんだが 手っ取り早いコーポーネント無い? ゲームって所を突っ込むとアッチ系なわけだが、みなまで言わせるな 漏れの欲望を実現させてくれ
PC4台とモニタ4台。
>>255 あんた賢いね!!!
でもそれじゃダメなんだよ
なぁ分かってくれよ…
ソリティア、ハーツ、フリーセル、スパイダーでハァハァする254萌え
フルスクリーンのソリティアって何なんだよ!! なぁ分かってくれよ… ネタじゃなくてマジなんだよ… たぶんマジなんだよ…
260 :
デフォルトの名無しさん :03/12/18 00:32
自アプリにフォーカスが当たっている以内に関係なく たとえばCTRL+Pが押されたことを検出するにはどうすればいいですか?
>>254 DelphiML:79620にこんなのあったけど。
面倒だからインデントなし。
procedure TForm1.Button1Click(Sender: TObject);
var
Wnd: HWnd;
begin
if WinExec('Notepad',CmdShow)<32 then exit;
Wnd:=FindWindow('Notepad', nil);
if Wnd<>0 then
Windows.SetParent(Wnd,Panel1.Handle);
end;
263 :
デフォルトの名無しさん :03/12/19 09:27
コードエディタの右に線が引かれてますけど あれはどうやれば描画出来るのでしょうか?
おお、教えて君な漏れにマジレスサンクス メモ帳を埋め込むサンプルですね。 そこの所を変えればいいわけだ。 10時間ぐらい頑張ってみる。
>フルスクリーンでしか起動しないゲームを この時点でもうだめだろ。VMWAREでも使っとけ。
>>265 ありがとう
あんたの一括が無ければ、10時間を無駄にする所だったよ。
VMWARE?なんじゃそりゃ。5時間以内に調べて来る。
よし、リサーチ完了出来た。 つまり46,000円を払えという事だな。 3時間以内に買ってくるわ。
だめぽ 納期一週間 体験版もDLできぬしな 262の方法で本当に無理か、10時間かけて確認してから あきらめる事にする。
もう一台PC買ったら? ゲームやるやつらはよく複数台のPCでプレイしているよ。
>>263 TMemoやTRichEditをベースにして実現する事は恐らく出来ないと思います.
DelphiのコードエディタはWindowsに標準で付いてくるエディットコントロール(TEditやTMemoの実体)や
リッチエディットコントロール(TRichEditの実体)をベースに作っているわけではなく,
一からすべて自前で作られているものと思われます.
出回っているテキスト編集コンポの中にはそういうものもいくつかあるようですが
これらの中で背景のオーナー描画を自由に出来るものがあればそういう機能を実現する事が出来るかも知れません.
271さんありがとうございます<(_ _)> かなり大変そうですね。 必要に迫られたわけではなかったのですが、 ふと気になったので相談させていただきました。 でも実現出来れば作成出来るものの幅も広がりそうなので、 これを機会にコンポーネントを探してみます。
いまふとタスクマネージャみたら、delphi32.exe様が48,276KBも お使いになられているわけですよ。それって普通なの? お漏らししてるの?
正常終了できなかったときはよくなる そんな時漏れはプロセスで抹殺
いや、ふつうにコーディング→実行→デバッグを くりかえしていただけなんでつが。
C++BuilderXは立ち上げただけで69,276KB
>276 Javaだからな。
ListBoxをオーナー描画すると、再描画のたびにちらつくのですわよ
280 :
デフォルトの名無しさん :03/12/25 09:45
むず・・・
281 :
デフォルトの名無しさん :03/12/26 10:35
オーナー描画ってのはいったいどうやるんでしょうか? 継承とかってのがよく分からなくて・・・
>>281 =
>>278 ?
もしそうなら、ソース出してみ。
「再描画のたびにちらつく」
とだけ言われてもどうしようもない
タスクトレイに常駐し、メールの新着をお知らせするアプリを作ってるんですが、 ダイアログでお知らせをしてるんですが、他のアプリの後ろに隠れてしまいます。 これを必ずトップウィンドウにする方法をご教授願います。
SetForeGroundWindow
最小化したときにしたのタスクバーにCaptionの内容が反映されるように したいのですが MainFrm.Caption := 'テスト' とやってから最小化してもタスクバーの文字には あいわらず Project1と出たままです。 どうやったらタスクバーにキャプションを反映させられるんでしょうか? よろしくお願いいたしますm(_ _)m
Application.Titleだったような
288 :
デフォルトの名無しさん :04/01/04 16:02
>>281 正月休みの間やってみようとしたけど僕にも無理でした・・
>>288 何のオナニー描画をしたいのか言え。
コンポによって使うイベントが違ったりする
漠然としすぎた質問はスルーされる
Winny 2.0b7.1のメニュー Λ,,Λ ___ [検索履歴][再読込] ミ,,゚Д゚ミ .||::::::::|| を自作アプリから ミ つ___||_____|| クリックさせたいのですが | ̄ ̄|__ミ――――― どうしたらいいですか? `ー┬‐'' ┴ ワカラヘンネン
∧,,∧ わかりました。 ミ,,゚Д゚彡 TagetWndにWinnyのハンドルを入れて ミ つ旦)~~ こうすると、Alt+H/Alt+Rを ~と,,,~),,~) 押したことになりますね。 var TargetWnd: HWND; FC:Boolean; SetForegroundWindow(TargetWnd); BringWindowToTop(TargetWnd); FC := GetKeyState(VK_MENU) < 0; if not FC then Keybd_event(VK_MENU,0,0,0); Keybd_event(Ord('H'),0,0,0); Keybd_event(Ord('H'),0,KEYEVENTF_KEYUP,0); Keybd_event(Ord('R'),0,0,0); Keybd_event(Ord('R'),0,KEYEVENTF_KEYUP,0); if not FC then Keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
>>281 とっかかりがほしいのか?
とりあえず以下のとおりやってみ
・ListBox1を配置しる
・プロパティ「Style」に「lbOwnerDrawFixed」設定
・プロパティ「Items」に適当なアイテムいくつか設定
・イベント「OnDrawItem」に以下のコードを記述しる
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
ListBox1.Canvas.Brush.Color := clWhite; //←(A)
ListBox1.Canvas.FillRect(Rect);
ListBox1.Canvas.Brush.Color := clWhite; //←(B)
ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;
以上のコードがうまく動くこと確認したら、(A)とか(B)に適当な色を入れて楽しんでみれ
慣れたらRect.Leftあたりの数値いじってみたり、Canvasに絵を埋め込んでみたり
293 :
デフォルトの名無しさん :04/01/05 10:11
タブ区切りテキストをStringList.DelimitedTextで読み込むと、 空白を適当に切り詰められちゃうんですが、 切り詰めないようにはどうしたらいいでしょう? text := (右はテキストの例)[タブ] [タブ] [タブ] aaaa [タブ] bbbb [タブ] [タブ] cccc [タブ] StringList1.Delimiter := #9; StringList1.Delimitedtext := text; StringGrid1.Rows[0].AddStrings(StringList1); → StringGrid1には aaa, bbb, ccc の3個だけ並ぶ
294 :
デフォルトの名無しさん :04/01/05 11:39
デルファイをはじめたいのですが、何からはじめたらいいでしょうか? パーソナルだと1万ぐらいで、プロだと4万ぐらいで売っていました。 どういう違いがあって、どちらを買ったほうがいいでしょぷか?
>>294 取りあえず公用語のC言語の本とフリーのコンパイラ。
それで3ヶ月ほど勉強してみ。
>>294 えっパーソナル版はタダでダウンロードできるって知らないの?
×昔の話だな。 ○昔のヴァージョンならな。
SetForegroundWindowでウインドウとそれに関連するスレッドも全部前面に出るんだから BringWindowTopはいらなくない? と思ったら98では効かないのか…
301 :
パントマイマの軌跡● ◆xPantyHouQ :04/01/13 11:36
すんまへん、正規表現で番号付きグループができるコンポーネント探してるんですけど・・・ どっかありませんかね? 【例】 <a href="index.html">トップページ</a>を <a href="([^"]+)\1">([^<]+)\2</a> みたいに書いて、\1と\2が別途の変数として取れるようなものです。 bmonkeyさんのところも、BRegExpも両方見てみましたが実装していなかったっぽいんですが。
TRegExpr
303 :
パントマイマの軌跡● ◆xPantyHouQ :04/01/13 12:09
>>302 ウワーイアッター!!!
早速使って見るです!㌧クス!!
304 :
デフォルトの名無しさん :04/01/16 18:51
USBカメラの画像を横取りしてPGで処理してから、 イメージングデバイスに流すことは可能でつか??
難しいかどうかは別として可能です
デバイス制御は初めてでとまどってます。 参考になるHPか文献ありませんか? どっから手をつけて良いのやら…
悪いことはいわないから制御系はCかC++にしておけ。 Del使ってもフロントエンド程度にした方が良い。
>>307 で、何が制限となるのか具体的に説明して下さい。
VBならスダンディングマスターベーションするが。
また一人VBにコンプレックスをいだいている奴が釣れたとw
デバドラでしょ。
>>310 シリアルとかパラレルならそんなもん書くまでも無いっしょ。
>>309 いや、単純にvbってポート叩けたっけ?みたいな。
DelphiはTPの名残で普通にできるけど。
USBカメラからの画像を加工(文字入れ)してから、 メディアサーバー(FLASH)に流すだけなんですが… 難しいでしょうか
315 :
デフォルトの名無しさん :04/01/18 11:09
delphi6 PersonalでSOPAって使える? PureSoapってのを見つけたんだけど、オフィシャルが消えてるっぽい。 って、この質問はここであってる? もしスレ違いなら誘導してください。
ゴメン、あげてしまった。
>>315 XMLとhttpでスクラッチするというのもありかと。
そぱ
319 :
デフォルトの名無しさん :04/01/20 20:14
あるexeファイルから別のexeファイルを呼び出したときにウィンドウ自体に フォーカスが移らず困っています。 ググッたら SetForegroundWindow(form1.Handle); とかでアクティブになるみたいな情報を見つけましたが、うまくいきません。 たしかWindows95・NTとWindows2000,XPではウィンドウ制御の仕組みが変わってたと 思うのでそれが原因かも。 あと、 SetWindowPos(form1.Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE) でウィンドウを最前面に持ってくることはできましたが、やっぱりフォーカスは移ってくれません。 何かいいアイデアはありませんか?開発OSはWindowsXPです。
>>319 そのexeで SetForegroundWindow してもダメ?
自分自身を最背面に移動するんだ。
会社から1回以上カキコすると規制がかかるのなー。初めて知ったよ。
>>322 ありがとうござます。
Cはよくわからないのですが設定を変更する箇所をDelphiで書くと
SystemParametersInfo (SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(0), 0);
ですよね?
やっぱりうまくアクティブになりませんでした。
ちょっと説明を追加すると
"(呼出)元.exe"から"(呼出)先.exe"を呼び出す際、CreateProcessメソッドを使って
呼び出してます。
で、先.exeが表示されたら元.exeのフォームのVisibleをFalseにして、画面が遷移したように
見せかけてるわけです。
元.exeは、先.exeが終了するまでsleepさせています。
先.exeが終了したら元.exeのフォームのVisibleをTureにして表示してるのですが、この仕組み
が悪いのかな?
ちなみにSetForegroundWindowを組み込んだのは元.exeの再表示直後です。
>会社から1回以上カキコすると規制がかかるのなー。初めて知ったよ。 おまえの会社から 2ch にカキコんでいるやつが多数いる。ってことだろ?
うちの会社なんてアダルトサイト扱いだよ… 真っ赤な画面で「業務とは関係ないサイトにアクセスしようとしています」と警告が出る。
OSの設定でClearTypeを有効にしておくと、 TextOutなどで自動的にアンチエイリアスされてしまいますが、 これをコーディングでClearTypeを無効にする方法とかありますか?
できました! というか、社内の別の人が組んでくれました。一応ご参考までに。 procedure SetForeWnd(hWnd:HWND); var dwID,dwForeID: DWORD; begin dwID := GetWindowThreadProcessId(hWnd, nil); dwForeID := GetWindowThreadProcessId(GetForegroundWindow, nil); if dwID = dwForeID then begin BringWindowToTop(hWnd); end else begin AttachThreadInput(dwID, dwForeID, True); SetActiveWindow(hWnd); AttachThreadInput(dwID, dwForeID, False); BringWindowToTop(hWnd); end; end; アクティブにしたいウィンドウのハンドルと現在アクティブなウィンドウのハンドルを比べ 異なるようであればアタッチして、ウィンドウをアクティブにし、再び切り離してる・・・ようです。
>>328 どうでもいいことだけど
ifの中がBringWindowToTopのみ かつどちらでも実行されるなら
if dwID <> dwForeID then
begin
//ここにelseでの処理Attatch…(…False);まで
end;
BringWindowToTop(hWnd);
のほうがコード量少なくて済む。
が、可読性は下がりそう(スマン
331 :
デフォルトの名無しさん :04/01/23 18:18
MySQLのテーブルのBLOBフィールドにバイナリデータを書き込むことに成功した方って いらっしゃいますか? もし、おられたら、書き込む部分のソースを教えて下さい。 宜しくお願いします。
>>332 もうそんなんどうでも良いから、成功した人のやり方を真似させて下さい。
成功した事がない人は黙ってて下さい。
>>333 切に願う。
自分でプログラムやる気がない人は来ないでください。
偽者は黙れヴォケカス 答えられない奴もしゃしゃり出てくるなヴァカ
だから答え様がないんでしょ。(w
MySQLのBlob clumnにはDelphiからは書き込めません。 ODBC経由でもmysql.pas(libmysql.dll)を使っても不可能です。 原因は不明です。 どうしてもやりたいなら、別の言語でdllを作るなりしてやるしかありません。
>>338 うそつき.
別の言語でdllを作ってできるなら原因不明ということになるはずないだろ?
>>339 注意:商用利用は有料です。
(ソース無しバージョンで一人の開発者が使う時は約$60必要です)
ま、無料でやるなら、blobは使うなってこった。
FUD はやめましょうね。 私は普通に接続できていますが。
ソースは?
345 :
デフォルトの名無しさん :04/01/26 17:54
>>342 マジっすか?
次の開発はDelphi + MySQLで行こうと思ってたのに、やめようかなぁ。
業務開発で 6000円出せないんだったら、その会社、やめたほうがよいよ。 個人で作っているなら無料だ。
大体 MySQL 自体、自分のソースを公開したくない場合はライセンス料(\29,800)が必要なんだから ところで、ODBC 接続で何の問題もなく BLOB アクセスできるんですが。 何が問題なんだろう
>>347 Jpeg格納してみ
俺はできんかった。
ちなみにDel7。
正直、ライセンス料払わずに販売してる奴はいるとおもた。
350 :
デフォルトの名無しさん :04/01/28 12:42
FireBird使え、無料だぞ ドキュメント少ないけどな。。。
HyperThread に対応していないサーバー RDB かい。> FireBird
>>351 それって動作しないってこと?それとも最適化されてないってこと?
>>352 今MLで話題になってるが、遅くなるらしい。
まじ?
>>353 どのMLか教えて。
まぁデータは飛ばんし、遅くなっても我慢して使うかな。
HT - along with hardware SMP - will be a problem for Firebird Superserver (which Firebird 1 is) on Windows OS platforms. There are no workarounds. ^^^^^^^^^^^^^^^^^^^^^^^^^
>>347 私が試したところバイナリデータの中に
F*27とか
E*27とか
9*27とかの数値があるデータは書き込めませんでした。
(*はワイルドカード)
もしこれらの数値があるデータでも書き込めたのなら、やり方をご教授下さい。
環境
WindowsXP HomeEdition
MySQL 4.0.15(Windows版 文字コードsjis)
MySQL ODBC 3.51 Driver
Delphi6 Enterprise(BDE 5.01)
コード
ms := TMemoryStream.Create;
ms.LoadFromFile('test.dat');//test.datの内容はE727というバイナリデータ
Table1.Edit;
Table1.Insert;
table1.FieldByName('id').AsInteger := 1;
st := TBlobStream.Create(TBlobField(Table1.FieldByName('data')), bmWrite);
try
ms.SaveToStream(st);
Table1.Post;
finally
St.Free;
ms.Free;
end;
E7 27 という2バイトのデーター? まさか E 7 2 7 の4バイト。ってことではないよね?
問題ないな。 4.0.16 で blob 周りのバグが少しとれています。 16 または 17 で試してみては?私は 4.0.17 を使っています。 あと、この検証コードで問題が起きるのなら、ODBC/MySQL のバグなら他の言語でも 同じ問題が出るだろうし、Delphi/BDE の問題なら他の ODBC ドライバでも同じ問題が出るだろう。
359 :
デフォルトの名無しさん :04/01/29 18:26
360 :
デフォルトの名無しさん :04/01/29 18:26
UDPソケットなんて使った事ないです。
>>360 TUdpSocket の話はつい最近、どこかで見たような...
「他人事だと思っていたら私も」って Delphi-ML でコメントつかないからこっちに振ったんでしょ。
性格悪いな。教えてあげない。
要するにまるぽなんだな
ばれたか。くそどもが。
すまん、だれか、俺が前に質問したやつを 引き上げて答えてくれ・・・ > タブ区切りテキストをStringList.DelimitedTextで読み込むと、 > 空白を適当に切り詰められちゃうんですが、 > 切り詰めないようにはどうしたらいいでしょう? > text := (右はテキストの例)[タブ] [タブ] [タブ] aaaa [タブ] bbbb [タブ] [タブ] cccc [タブ] > StringList1.Delimiter := #9; > StringList1.Delimitedtext := text; > StringGrid1.Rows[0].AddStrings(StringList1); > → StringGrid1には aaa, bbb, ccc の3個だけ並ぶ → "" "" "" "aaaa" .... と並んで欲しい。 うまいように行くTStringsのプロパティとか、他のコンポーネントとか見つからない。 こういうときって、みんな自力でパースしてるもんなの?
>365 適当だけど、 StringList1.Text := StringReplace(text, #9, #10, [rfReplaceAll]);
>>359-360 (キートン○田)
TUdpSocket は UDP なので、OnReceive は発生しません。仕様です。
その代わりに ReceiveFrom を使います。
ReceiveFrom TUdpSocket
でググればヒントが出てくるよ。
Indy の方が使いやすいのは事実だが
がんがれよ>普通のサラリーマン
370 :
デフォルトの名無しさん :04/01/31 21:29
普通のサラリーマンです。ありがとうございます。結局Indy使っちゃいました。 Delphi5だとNMUDPはサンプルがあってあっさり動いたんですけど Delphi7でこんなに手こずるとは思いませんでした。 もうちょっとサンプル充実して欲しいです。
>>370 直にWinsock叩くと言う手もありますよ~。
Winsockを使ってみようぜ 昔読んだけどいまいち分からなかった 今なら分かるかも知れない
>>370 Delphi7 では、TUDPSocket は使うな。Indy に移行しろ。と書かれているのはよんだのか?
375 :
デフォルトの名無しさん :04/02/04 19:58
Jpegファイルの明度を明るくするライブラリとかありますか? 一旦、Winコントロールに描画するしかないんかな。
376 :
デフォルトの名無しさん :04/02/04 20:13
スレ違いかもしません。QuadrupleDの質問です。 TDDSDCaptureのBlockCopyは、録音された内容を配列にコピーできるのですが、 TDDSDWaveDataのBlockCopyは、配列の内容をバッファに書き込み、処理が逆です。 TDDSDWaveDataの内容を配列にコピーしたいのですが、どうすればいいですか?
Delphiでユビキタスコンピュータは作れますか?
言語煽りなどという程度の低いことをやっている奴には永劫未来無理。
それを貴方にあげます。
>>375 画像をビットマップオブジェクト(TBitmap)に書き出してからTBitmapのScanLineプロパティ経由でピクセルを直接いじる感じになるのでは?
とりあえずイメージコンポに読み込んだ画像から明るさ2倍?の画像を作ってペイントボックスに表示する例.
procedure TForm1.Convert; // Image1.Pictureに画像を読み込んだ後に呼び出す
var x, y: integer; p: PByte;
begin
FWorkBitmap.Assign(Image1.Picture.Graphic); // FWorkBitmapはフィールド変数.あらかじめCreateしてPixelFormatをpf24bitにする
for y := 0 to FWorkBitmap.Height - 1 do
begin
p := FWorkBitmap.ScanLine[y];
for x := 0 to FWorkBitmap.Width * 3 - 1 do
begin
p^ := Min(255, p^ * 2); // usesにMathユニットを追加
inc(p);
end;
end;
PaintBox1.Invalidate; // ペイントボックスの再描画
end;
>>356 俺も無理だった。データが1234だったらOK。F727だったらNG。
---------------エラーメッセージ--------------------------
一般 SQLエラーです
[MySQL][ODBC 3.51 Driver][mysqld-4.0.17-max-debug]You have an error in your SQL syntax.Check the manual that corresponds to
your MySQL server version for the right syntax to use near "・")'at line 1.
---------------------------------------------------------
なんでだろね。ただ俺はMySQLに詳しくないのでどこか設定が間違ってるのかも。
OS:WindowsXP
開発環境:Delphi7 Pro + BDE 5.01
データベース:MySQL 4.0.17
ODBCドライバ:MySQL ODBC 3.51.06
fm := TMemoryStream.Create;
fm.LoadFromFile('test.dat');
with TQuery.Create(self) do begin
RequestLive := true;
SQL.Text := 'select * from test';
Open;
Append;
FieldByName('code').AsInteger := 1;
st := TBlobStream.Create(TBlobField(FieldByName('bdata')), bmWrite);
fm.SaveToStream(st);
try
Post;
finally
Free;
st.Free;
fm.Free;
end;
end;
Delphi6 pro,paradoxでデータベースアプリケーションを作成しているのですが、 TDBMemoでメモ型項目に長文を格納したいのですが、240バイトほどしか保存されません。 blobというのを使うらしいということまではわかったんですが、どうやって 保存するのか、ネットやヘルプを調べても情報がほとんどありませんでした。 ご存じの方がおりましたらご教授よろしくお願いします。
blob とは関係ありません。 240 バイトしか保存されない。というのをどうやって確認しましたか?
実際に保存してみました
>>384 私は383であり385の発言はしておりませんが、実際に保存したら240バイト
くらいしか保存されていませんでした。判定方法は、保存された文字数を
数え、170文字(2バイト文字と1バイト文字の混合)くらいしか保存されて
いませんでした。
コードを書かずに TTable -> TDataSet -> TDBMemo とつなげたんだよね? 任意長のテキストの読み書きができるはずですよ? データベース側がメモ型ではなく文字列型だったとか? TDBMemo ではなく TDBEdit だったとか? TTable コンポーネントで項目の追加とかしていない?
煽りは勝手に無視するから、フォローがいいよ。 Demos\Db\FishFact に簡単なデモがあるからそれ見てごらん。 魚の説明のところが DBMemo だよ
s/フォローがいいよ。/フォローはいいよ。/
383です。 みなさん、どうもありがとうございました。 魚のサンプルを見て確かめました。特に間違っていなかったので再度 長文を保存してみたところきちんと保存されていました。原因はよく わからないのですが勘違いかもしれません。お騒がせして申し訳ないです。 また、質問したいのでその時はよろしくお願いします。
フォーム上のコンポーネントをすべて見えなくしたいんですが・・ procedure TfrmDelStudy.Button6Click(Sender: TObject); var i : integer; begin for i := 0 to ComponentCount -1 do begin Components[i].Visible := false; あるいは TComponent.Visible := false; end; end; などと思いつくことはやってみたんですがうまくいきません。 よろしければご教授くださいませ。
>>392 for i := 0 to ComponentCount -1 do
begin
if Components[i] is TControl then
(Components[i] as TControl).Visible := false;
end;
isしたらasは不要だろ
>>393 ばっちりです。とても助かりました。
どうもありがとうございましたm(__)m
396 :
デフォルトの名無しさん :04/02/13 02:24
色々なアプリを操作したいんですが ボタンを乗っ取る方法はありますか? とくに、スキンで特殊なボタンになってるアプリの。
乗っ取るってのは 押せなくする 連打する どっちだろう
>>396 さんは、そのボタンがそこに「ある」とはどーゆーことか考えた事はありませんか?
if Components[i] is TControl then TControl(Components[i]).Visible := false;
>>401 (Components[i] as TControl).Visible := false;
TControl(Components[i]).Visible := false;
上の2つは何が違うの?
>>402 型の解決をコンパイル時にやるか実行時にやるかみたいな話だったかと。
>>403 つまり実用上はどちらも変わらないということでしょうか?
いいえ
>>392 見えたり見えなかったりするのはコントロールだけなのでこれでよいはず.
var
i: integer;
begin
for i := 0 to ControlCount - 1 do
Controls[i].Visible := False;
end;
>>402 ●前者( オブジェクト as クラス型 )
オブジェクトが指定されたクラス型またはその派生クラス型のオブジェクト,あるいはnilかどうかをチェックします.
いずれにも当てはまらない場合は例外を生成します.
●後者( クラス型(オブジェクト) )
オブジェクトが指定されたクラス型かどうかをチェックをせずに
強引にそのクラス型のオブジェクトであると解釈します.
TWebBrowserを使って、User_Agentを書き換えたいのですが
URL := '
http://hogehoge/ '
flg := 0;
Header := ''hogehoge Browser;
WebBrowser1.Navigate(URL, flg, tmp, tmp Header);
上記のやり方では、無理なのでしょうか?
よろしければご教授ください。
自己解決しました。
URL := '
http://hogehoge/ '
flg := 0;
Header := 'HTTP_USER_AGENT: hogehoge Browser';
WebBrowser1.Navigate(URL, flg, tmp, tmp, Header);
これでできました。
409 :
デフォルトの名無しさん :04/02/21 09:24
Canvasの一部にDraw()メソッドで 描画するとCanvas全体が再描画される為か 処理が非常に遅くなり、困っています。 処理が遅くならないDraw()のやり方はあるのでしょうか?
DrawでCanvas全体が描画されるって部分が良く判らないんだけど 具体的な最小コードを書いてみて
画面に表示されていないCanvasに書いて、 画面に表示されているCanvasに一括転送
>>410 レスありがとうございます。
TImageのCanvasに
cv.Draw(x, y, CharImg);
と描画しています。
描画イメージのサイズは32*32
TImageのサイズは500*180です。
TImageのTransparentはTrueにしています。
>>411 ありがとうございます。
早速試してみたのですが
あまり改善しませんでした…
つまり、TImageでTImage.Canvasをアクセスして自動的に作られた TBitmap.Canvasにアクセスしてるんだよね。 そうすると、Picture.OnChangeが設定されてしまっていて、一部でも書き換えたら、TImage全体が書き換えられてしまう。 一番簡単な対策は、TImageを使わずに、フォーム直接か TPaintBoxに描画する事だと思うけど。 つまり、TPaintBox.OnPaintで TBitmapを全部表示して 普段は、その一部だけ書き換える。
>>414 今のマシンは速いから、ダブルバッファで十分じゃないの?
一部でも書き換えられたら全体が描画されるといっても Invalidateが発行されて TImage.paintが遅延実行される訳だから ダブルバッファと同じだと思うんだけどね。 それで重いというなら Bitmapの一部を書き換える時に、そこだけ画面も書き換えるしかないと思うよ。
ダブルバッファは速度向上ではなく、ちらつき防止なのだが。
ガイシュツ気味だが。 TImageってあまり書き換えないような絵を表示するには向いてるけど、すごく重いという感覚がある。 オフスクリーンでTBitmapに描画、それをCopyRectでTPaintBoxに転送するというのが俺の定番。
質問です。 SHFileOperation関数を利用してファイルを転送・削除するときに、 進捗ダイアログボックスが表示されますよね。 あれが出てくる位置を変更することはできないんでしょうか?
>>419 質問です。
あれが出てくる位置を変更するのはどうしてでしょうか?
>>419 死ぬ気でWindowハンドルなりダイアログハンドルなどを取得してごにょごにょ
難しいんじゃないの? 似たの自前で作った方が速いように思うけどなあ
>>420 転送する時に、エクスプローラーの真上に出てくるじゃないですか。
あれをやられると、次に転送するファイルを探しにくいというか・・・。
邪魔なので、右上とか左上に追いやりたいんですけどね。
>>421 ・・・ホント死ねるかも。
ちょっともう少し調べてみることにします・・・。
>>422 やっぱりそっちのほうが早いですか。
私がやり方を知らないだけで、
比較的簡単に出来るのかもしれないと思ったんですけどね。
とりあえず、421さんのやり方で出来ないかもうちょい検討して、
どうしても難しいと悟ったら422さんの案で、自前で用意することにします。
レスありがとうございました。
そういう時こそ W2kのソースがあれば・・・・
>>414-418 ありがとうございます。
上に置くビットマップ素材を作り直すことで
TImageのTransparentをFalseにしても上手く表現
出来たので、今回はTImageを使うことにします。
少なくとも私の環境ではTImageの方で画像を透過しようとすると
大幅なパフォーマンスダウンが見られました。
今回は時間が無かったのでTImageのままですが
次回はTBitmap&TPaintBoxにチャレンジしてみます!
そうだね。 透過をTrueにするなら、下の絵を含めて TBITMAP上で合成してから 書き換えた領域だけを描画させるようにしたら 速くなると思うよ。
中級レベルの話かどうか定かじゃないですが、ご教授ください。 var PC: String; Point:Pointer; begin PC := '$64FA6C'; Point := 何らかの関数?(PC); <---ここ 上のソースのように変数PCに文字列を代入し Pointer型のPointに変数PCに代入したアドレスを入れたいのですが どのようにしたらいいのでしょうか? PCに入れる値はファイルからとってきています。
function toPointer(var dt):Pointeger; begin Result:=@dt; end:
という冗談は置いておいて Point:=Pointer( StringToInt( pc ) ); でも Pointer型より PChar とかにした方がいいよ。
>>429 ありがとうございます。
それを組み込んでみたんですが、
未定義の識別子:'StringToInt'
となったんですが、特別な関数なのでしょうか?
PointerよりPCharの方がなぜいいのでしょうか?
>でも Pointer型より PChar とかにした方がいいよ。 Why? 仮に、ポインタの加減算が出来るなら、PAnsiCharの方が1byte単位であることが 保証されていいような気がします。 どうなんですか?その辺知っている方教えてください。
> 未定義の識別子:'StringToInt' >となったんですが、特別な関数なのでしょうか? StrToIntの間違えっしょ。
>>431 StrToInt。
後半確かにね。 言いたいのは、Pointer型だとそのままじゃ殆ど使えないからって事。
何かポインターとして使いたいなら、その型で使うべきだと思うよ。
Pointer型の加減算もできなくてこまっていたんです var PC: String; Point,Point2:Pointer; begin PC := '$64FA6C'; Point := StrToInt(PC); Point2 := StrToInt(PC) + 4; という感じでいけそうですね。ありがとうございました。 最後にString型よりPAnsiCharの方がいいとおっしゃってましたが String型からPAnsiCharにしたばあいはStrToInt使えないけど どうするんでしょうか?(だんだん初歩的なことになってる・・・)
strtoint(point^)
> 最後にString型よりPAnsiCharの方がいいとおっしゃってましたが うーむ、誰も言ってないと思うけど?
PChar より PAnsiChar がいい、という理由はないと思うよ 型なしポインタは。加減算が不便だけどもっとも汎用的。キャストすると Inc() Dec() で簡単
438 :
デフォルトの名無しさん :04/02/25 21:54
>>473 でも、PCharだと、Incしたときに、何バイト分ポインタが進むかが、コンパイラに
依存するぞ。
もっとも、現在存在する全てのコンパイラは1バイト単位だけど。
くだらね
>>438 Delphiごときに標準規格なんて無いだろw
>>440 そういう神経の持ち主が作ったソフトは使いたくないなw
・PChar は 8 ビット文字で構成される,ヌルで終わる文字列へのポインタです。 ・PAnsiChar は 8 ビット文字で構成される,ヌルで終わる文字列へのポインタです。 ・PWideChar は 16 ビット文字で構成される,ヌルで終わる文字列へのポインタです。
443 :
デフォルトの名無しさん :04/02/26 00:55
>Char が汎用文字型であり,これはAnsiChar と同じです。Char の実装は変更される >可能性があるので,サイズの異なる文字を処理する可能性のあるプログラムを作成する >ときは,ハードコーディングした定数を使用するかわりに標準関数SizeOf を使用した >ほうがよいでしょう。 ヘルプより抜粋
444 :
デフォルトの名無しさん :04/02/26 01:00
ま、よってバイト数が固定されることが保証される文字を扱うには、
AnsiChar型、UCS2Char型、UCS4Char型のいずれかを使いなさい、ってこった。
文字列やポインタについても同じ。
String型やPChar型の実装は、コンパイラ依存ですよ
>>442 確実に8ビット文字列のポインタを扱いたければPAnsiCharを使うのが正解。
こんなスレあったんだ…。
> よってバイト数が固定されることが保証される文字を扱うには、 質問者は「バイト数が固定されることが保証される文字を扱うには」とは 言ってないよ。あんたが勝手に思いこんでるんでは?
PAnsiChar をつかうんなら、文字列も AnsiString にしておかないとね。 String 型に対応するのは汎用型の PChar じゃないの?
> String型やPChar型の実装は、コンパイラ依存ですよ
>>442 だから PChar が正解なんでは
>>446 質問者っつーか、442が間違いとも取られかねない発言をしているのに対しての意見じゃないの?
>>447 それはケースバイケースでしょう。
少なくとも、例えばフォーマットの固定されたファイルから文字列をコピーする
時なんかは俺はちゃんとAnsiStringにしてるが。
内部で一時的に記憶する文字列は汎用のStringで一応使い分けている。
>>449 あのね、PChar をつかうより PAnsiChar をつかえ、とか偉そうに説教してるのが
いるでしょ。そもそも質問者は型なしポインタをつかってるのよ。なにを指して
るのかわからんけど。だから一般的には、PChar でも PAnsiChar でも正解なんか
ないのよ。
>>444 確実に8ビット文字列のポインタを扱いたければPAnsiCharを使うのが正解。
「確実に8ビット文字列のポインタを扱いたければ」なんて誰もいってないの。
そもそも文字列のポインタかどうかさえ分からないんだから。
あなたがどう使い分けてるかは関係ないの
> そもそも文字列のポインタかどうかさえ分からないんだから。 string → PChar AnsiString → PAnsiChar 一般的なバイナリ → PByte Integer の配列 → PInteger レコード型の配列(例えば TRect の) → PRect ...... というふうになるんじゃないの
Delphi.NETへのポータビリティ無視した妄想の議論は無意味だな
> Delphi.NETへのポータビリティ 笑わせるなよ(爆笑
基本型と汎用型を混同している奴がいるな・・・本当に中級スレ? IntegerとLongint、CardinalとLongWordとかも混同して使ってるんだろうな・・・
なんか話が大げさになってしまってますね(滝汗) みなさんの回答で一応解決しました、ありがとうございます 結局こう使いたかったんです p := '$64FA6C'; ReadProcessMemory(hProcess,Pointer(StrToInt(p)),PC1,4,numRead);
元が文字列なのにはなんか意味あるのか?
>>456 たぶん、ゲームなんかのデータ変更ツールを作ってるんだよ。
で、誰かがどこかに流してるデータを・・・
他プロセスのメモリの内容を読みとるのね。アドレスを絶対値(リテラル)で指定して 大丈夫なんだろうか?
WindowsではEXE は同じアドレスにロードされるから大抵は大丈夫。 ロードアドレス以外も、大抵は毎回同じ。 だからバッファオーバランとかにとても弱い訳だ。
> WindowsではEXE は同じアドレスにロードされるから大抵は大丈夫。 そなの? ベースアドレスが同じ指定の異なるアプリを起動したときはどうなるの?
あっ、そうか、仮想アドレスなのかな
質問です。
UWSCというソフトをご存知でしょうか?↓
http://www.vector.co.jp/soft/win95/util/se115105.html このソフトはマウスやキーボードの動きを記録して
再生することができるんですが
マウスクリックはどうやって実現されているのかがわからないんです。
マウスを動かすことまではできたんですが、よろしくお願いします。
どうやったかは以下のソースのようにしました。
procedure TForm1.Button5Click(Sender: TObject);
var
hCalc: HWND;
Rect: TRect;
begin
hCalc := FindWindow(nil, '電卓');
GetWIndowRect(hCalc,Rect);
SetCursorPos(Rect.Left+23,Rect.Top+79);
sleep(3000);
sendmessageA(hCalc, WM_LBUTTONDOWN, 0, 0);
sleep(10);
sendmessageA(hCalc, WM_LBUTTONUP, 0, 0);
end;
サンプル的に電卓の16進数のラジオボタンをクリックするようにしてみたんです。
なにがだめなんでしょうか?
>>463 procedure TForm1.Button5Click(Sender: TObject);
var
hCalc: HWND;
Rect: TRect;
hButton: HWND; //追加
begin
hCalc := FindWindow(nil, '電卓');
GetWIndowRect(hCalc,Rect);
SetCursorPos(Rect.Left+23,Rect.Top+79);
hButton := WindowFromPoint(Point(Rect.Left+23,Rect.Top+79)); //追加
sleep(3000);
sendmessageA(hButton, WM_LBUTTONDOWN, 0, 0); //修正
sleep(10);
sendmessageA(hButton, WM_LBUTTONUP, 0, 0); //修正
end;
Del用のCodeGuardみたいなツールって無いんでつか?
BoundsCheker買え
>>466 Del用はDel2用以降死滅して居るんだが。
Cheker ですよ?
CodeGuard買ったが、その後、ぜんぜんメンテナンスやらねーんだよな。 Delphiは文法的に完全的と思うなら、コードガード買わせるんじゃねーよ。
完全的
Pascalだけは絶対言い残させないと。
Delphiでアプリのオプション設定のような、フォームを書いているときに、 Edit1.Enabled := false; Edit1.Color := clBtnFace; みたいに、入力できないコントロールの表示をいちいち変えるのが面倒で、 Enabledがfalseになったら、自分の色を変えるようなコンポーネントを書きました。 (単に、Enabledのプロパティ変更時に、自身のColorプロパティを変更) で、こんどは、グループとか、パネルのEnabledの設定変更にあわせて、 子コンポーネントのEnabledの設定変更が呼ばれるようにしたいと思うんですが、 こういうのって、TCustomGroupBoxとか、TCustomPanelとかを継承して、 継承したコンポを使うしかないんですかね。 なんか、筋が悪いような気がするんですけど。 #そもそも、コンポの色変更をするほうも、 #Enabledのプロパティ変更(SetEnabled)を、オーバーライドすればいいのか、 #CMEnabledChangedの方をしたほうがいいのかってのもよくわかんない... おしえて、VCLの偉い人!
CM_COLORCHANGED でフックをかければどう?
TAction.OnUpdateに常時監視させるのも手かな
引数にTWinControlとEnabled状態をとる関数作って、それで処理しる
こんな手続きをつくってみた procedure EditEnable(Edit: TEdit; Enabled: Boolean); begin Edit.Enabled := Enabled; if Enabled then Edit.Color := clWhite else Edit.Color := clBtnFace; end; あんまり綺麗にならなかった_| ̄|○ しかも、質問に答えてねぇ
>>476 さらに脇道にそれるが、
Edit.Color := IfThen(Enabled, clWhite, clBtnFace);
三項演算子がそんなに珍しいのか?
>>472 パネルのEnabled を変更したら自動的に子供も変更されなかったっけ?
作った方のコンポーネントから、親の CM_ENABLEDCHANGEDをフックして処理すればいいんじゃないの?
そうすれば親のコンポーネント(パネル)には手を付けなくていい。
あるいは、逆に非表示コンポーネントを作って、パネルの COLORCHANGED をフックして
乗ってる子コントロールの色を全部変更してしまえば・・・ってのは既に
>>473 が書いてるのかな?
ここでいうフックっていうのは、
WindowProcプロパティを自分のインスタンス内に保存(SaveWindowProc)した上で
自分のメソッドに置き換えて、
自分のメソッド内で ENABLEDCHANGEDなら処理してそれ以外なら SaveWindowProcの方を呼ぶってことね。
で、サブクラスをするコンポーネントを使う時は
( ゚Д゚)ノ Delギコ猫のプログラミング相談室part2
http://piza2.2ch.net/tech/kako/999/999482946.html 928
var WM_DetachProc:Cardinal; をローカル変数として定義し
コンポーネントの初期化部で
initialization
WM_DetachProc := RegisterWindowMessage('WM_SubclassFreeNotify');
end.
とする。
サブクラス解放時にはこのメッセージIDで
WParam,LParam はユニークな値を入れて サブクラス先に送信する
それを受信したWindowProcでは、
この2つの値で送信者が自分かどうか判断し
自分でなければリンクを解放して下位にメッセージを送り
メッセージが帰って来たらリンクを再接続する
送信者が自分ならリンクの解放だけを行う
VCL上のサブクラス取り外し
WParam で selfが渡される WParam = LongInt(self)
LParamは無視してよい サンプルコード
>>922 Win上のサブクラス取り外し
LParamでプロセスID
WParamはプロセス内ユニークな値(メソッドアドレス等それぞれのプロセスで管理)
注意: WM_DetachProc は定数ではないので case では使えない ifで判断する事
いろいろ、どうもです。 コンポいじりというか、DELPHIもまだまだ初心者(←3項演算子も知らんかったくらい)なので、 とっても参考になります。 できれば1度作ったら、あとは張るだけでいいようなものを目指してますので(できるん?)、 ちょっと時間をとって、メッセージの流れを追ってみたいと思います。 すぐ試せそうにはないんですが、それなりにできたら、経過を投げますね。 ありが㌧ございました。_o_
>>481 フォームに貼り付けたら、フォーム上の全部のTControlのメッセージフックをして
自分の思うスタイルを実現するっていう非ビジュアルコンポーネントを作れば出来るよ。
仕掛けそのものは簡単だけど、フックしてるから、コンポ設計中につけ外しされた時の処理
(これはパネルやフォームにCM_CONTROLCHANGEとかのメッセージが来る)
をしっかり考えとかないと、IDEが暴走して悲しい事になる。
でも、そこらへんを考えるのが一番面白いよね。
半日くらい調べて結局判らなかったので質問させてください。 やりたい事は、現在開いているウィンドウに対して、マウスによるD&D以外で ファイルを渡す事です。 D&Dが可能なアプリケーションを列挙して選択させるようなフリーソフトが あったりしますが、どのように処理しているのでしょうか? それもソフトによって微妙に表示されるアプリが違ったりするので、いくつかの アプローチがあるのかと思いますが・・・。 また、全然別のアプローチでも構いませんので、なにかいい方法があれば 教えていただけませんでしょうか?
追記。 WM_DROPFILE捕まえたりとか、OLEつかったD&Dの処理なんかはできています。
言っていることがよくわかりません。 そのフリーソフトとやらを紹介してくれれば少しは分かりやすくなるかも >マウスによるD&D以外で 以外って言われても困ります。もっと具体的に
>>483 つまり、D&Dをサポートしたアプリに、 WM_DROPFILE を自分が送り付けてやりたいという事かな?
でも、WM_DROPFILEだけ送りつけても その後そのアプリがシェル API呼ぶからダメだと
OleDropTargetInterface と WS_EX_ACCEPTFILES で列挙。 あとはそのインターフェイスを呼び出すかメッセージ送ればいいんじゃない?
DFとか、PyxisやSpringMやCraftDropあたりでしょうか。 ドロップもしくはドロップオープン、といった感じの名称の機能で、キーボードでD&Dを エミュレートする機能です。 ウィンドウを列挙するのはいいとして、そのウィンドウがD&Dに対応しているかどうかの 判断をどのようにしているのかな、と。 そして、判断できたとして、WM_DROPFILESはどうやって送るのかな・・・と思いましたが これは情報が発見できました。 また、WM_DROPFILES送る以外に何か方法はないのか、とか・・・。
>487 おお!まさにそれっぽい・・・ 検索するとうんじゃり出てきますねー。どうして見つからなかったのか・・・。 OleDropTargetInterfaceのほうは余り情報なさそうですが、ちまちま調べてみます。 どうもありがとうございましたー。
ScriptControl (ActiveX)使って自分のアプリをスクリプトにいじらせたいんだけど、 スクリプトにForm1を引き渡す処理がうまくできないっす。 AddObjectっていうメソッドがうまくやってくれそうなんだけど、 いまいちうまく動かない。どっかDelphiでScriptControl使ってる例ないですか?
あ、追記。 試したソースはこんな漢字。 procedure TForm1.Button1Click(Sender: TObject); begin ScriptControl1.AddObject('Form1', Form1, true); ScriptControl1.ExecuteStatement(Memo1.Text); end; これをコンパイルしようとすると、「IDispatchとTFormには互換性がありません」 って言って怒られる。 でもVBでScriptControl使ってる例では、特に小細工なしにFormぶち込んでOKみたいだし、 IDispatch調べようとしたらなんかCOMの深い世界に行きつくらしいし、 どっちの方向に進めばいいかわからないです。 教えてエロの人
>>490 VBが フォームそのまま使えるのはVBのフォームがIDispatch持ってるから
Delphiでは そのままという訳にはゆかない。
>>492 O.K!じゃあ、さっそくIDispatchとやらをForm1につけてやろう。
type
TForm1 = class(TForm, IDispatch)
・・・・
コンパイル通った。Goooood!!!
よっしゃ、さっそくいじくりまわしてやるぜ!
とりあえず
Form1.Caption = "test"
↓
エラー:
このオブジェクトではサポートされていない操作です Form1.Caption
ヽ(`Д´)ノ
'test'
>>494 いや、上のコードはScriptControl上のVBScriptに書いてるコードだから、
文字列のリテラルは "test" でいいのよ。
(正確に言うと、Memo1.textに書いているVBScriptのコードを
ScriptControl.ExecuteStatementに引き渡している。
説明不足でした。すんません)
あといろいろいじってみたんだけど、
どうやら AddObjectで渡された'Form1'は何者か知らないけど、オブジェクトなんだろう
ということは認識しているらしい。 ScriptControl君は。
いろんなコードを引き渡して観察してみると・・・
Msgbox "test" → OK
Msgbox Form1.Caption → 「このオブジェクトではサポートされていない操作です」
Msgbox hoge.Caption → 「オブジェクトがありません」
というわけで、かろうじて名前は認識しているらしいが、彼にもっとものを教えるにはどうしたら・・
>>495 フォームじゃなくて、オートメーションオブジェクトを渡す
or
IDispatchのメソッドを自力で実装する
Delphi中で、OleVariant経由で操作できるものじゃないと、渡しても意味がない
∧,,∧,,,,,, ) (´⌒(´
⊂ミ゚Д゚⊂,,,,,,,`つ≡≡(´⌒;;;≡≡≡
ズザーーーーーッ (´⌒(´⌒;;
やってみたんだけど、ものすごい簡単に
アプリにVBScriptが搭載できるんですね。
MsgBoxで出力するのは出来たのですが
この中で計算させた値を
変数に代入するにはどうしたら…??
Form1.FValueに代入するのも
やっぱり
>>496 の書きこみみたいのを
実装しなきゃだめ?
∧,,∧,,,,,, ) (´⌒(´
⊂ミ゚Д゚⊂,,,,,,,`つ≡≡(´⌒;;;≡≡≡
ズザーーーーーッ (´⌒(´⌒;;
http://www.delphidevelopers.com/learnbooks/Scripting_your_Delphi_Application.htm このあたりかニャー
きっと、世界のどこかに コンポーネントを指定したら publishedメンバーがアクセス出来るような IDispatchクラスがあるに違いない。 無ければ作れ。
rubyのApolloやら、DMonkeyが似たようなことやってるから、お前もがんばれ
ライブラリはそろっているので、ソースがあれば D6Personal でも動かせるのだが、 Wizard がない。ってことがあれだな。 誰かに雛形ソースを作ってもらって後は手でメンテナンスかな? 手元に Personal 版がないのでどこまでやってあげればいいのかわからない。
>>499 のページと、あと
http://www.wwlnk.com/boheme/delphi/techdoc/dad0030.html なんか参考にして作ってみた。
ComObjユニットにあるTAutoObjectっていうクラスが、あらかじめIDispatchを実装しているらすぃ。
なので、TAutoObjectと、自分が実装したい機能を持ったインターフェースをくっつけて、
新しいクラスを作ればとりあえずOK?みたいな?
uses にComObjを追加
IExposingObjectsDemo = interface
function Get_Age: Integer;
function Get_Name: OleVariant;
procedure Set_Age(Value: Integer);
procedure Set_Name(Value: OleVariant);
end;
TExposingObjectsDemo = class(TAutoObject, IExposingObjectsDemo)
function Get_Age: Integer;
function Get_Name: OleVariant;
procedure Set_Age(Value: Integer);
procedure Set_Name(Value: OleVariant);
end;
続く・・
で、あとは
>>499 に書いてあるのを多少自分の環境にあうように改変して実行!!
→エラー:
TExposingObjectsDemo クラスの オブジェクトファクトリがありません
(・∀・) ダメポ!!
むずかしいなあ・・・それにしても、COMってググりづらくねえすか?
>>501 それかっこいいよ。アッツいよ。
最終目標はそういうコンポの作成だな。
>>502 Apolloいじってみた。
すげーよ!まさにコレやりたかったんだよぅ。
Apolloのソースで勉強するかぁ
>>503 ええ、動くソースさえあれば、壊しながら勉強しますとも
サンプルくれるの? (゚-゚ ) ←期待でいっぱいの目
>>504 まず、タイプライブラリが必要
ほら、ActiveXを読み込むと xxx_TLB.pas が出来るでしょ?アレ。 アレを真似する。
interfaceで公開したいのと同じ名前の dispinterface を作る。で、それに dispid を付けてゆく。
これが無いと、外部からメソッド名が判らないでしょ?
あと、メソッドはsafecallにするのと GUIDを付ける GUIDはinterfaceと dispinterface で同じにする
>>505 >ExposingObjectsDemo クラスの オブジェクトファクトリがありません
initialization
TAutoObjectFactory.Create(ComServer, TExposingObjectsDemo, CLASS_xx, ciInternal);
なんてのを書けってエラーだと思うよ
http://www.wwlnk.com/boheme/delphi/techdoc/dad0080.html ここの サーバーアプリケーションのコード を参考に
>COMってググりづらくねえすか? xxx.com に引っかかる。って話かな? .net も検索しづらいし。キャッチーな宣伝文句だったんだろうけど。
>>505 >>501 の方向がやりたいなら、TAutoObjectを使わず IDispatchを自前でサポートする必要があると思うぞ
>>507 COMは一般的な単語のため検索には使われません。
と言う恐ろしいwarningを出してくれる。
COMとか.NETとか…なんか恨みでもあるんか。
511 :
デフォルトの名無しさん :04/03/13 21:36
delphi5でプログラム開発しているんですが 普通のプログラムはちゃんとデバッグできるんですが マルチスレッドのプログラムをデバッグしようとして、「カーソルの位置まで実行」などで ブレークポイントで停止させると delphi自体がハングアップして デバッグできないのですが マルチスレッドのプログラムはデバッグ不可能なのでしょうか。
>>511 Del6でやってましたが止めてるスレッド以外は動いてたりして結局ややこしくなります。
>>510 ネットでの検索をしにくくして書籍を買わそうという魂胆
とか言ってみる
>>512 やっぱりスレッドのデバッグは、ムリみたいですね。
(ブレークポイントで停止しても、delphi自体がハングします)
そこで一時的にスレッドのユニットをシングルのユニットにしたら、
ちゃんとデバッグできました。
そうするとスレッドのユニットにはあまり複雑な処理を記述せず、
ほとんどのロジックを普通のユニットとして作成して
スレッドのユニットはそれらのユニットを呼び出すだけの処理に
する必要がありますね。
>>514 ひょっとしてDirectX使ってたりしてる?
NT系だとマルチスレッドのデバッグでも問題なかったと思うけど、 どうなんでしょう
>>515 DirectXは使ってません。
pradoxのデータベースを使っています。
osはXPを使ってます。
原因は結局、0での割り算だったんですが、マルチスレッドのままで
デバッグしようとすると、ブレークポイントで停止しても、delphiがハングアップして
しまいます。そして、普通アプリがハングしてもXP自体の再立ち上げは不要なんですが
このdelphiのハングアップの場合は、もう一切の操作をXPが受付なくなります。
再立ち上げしか方法がない、でもアプリでこんな目に会ったのは何年もXP使っているけど
初めてです。
また何回かはブレークポイントで停止し、ハングするのが一定の箇所でなかったため
マルチスレッドのままデバッグしようとしてまる2日も原因究明にかかりました。
(疲れた)
>>511 FAQ
詳細なテキストサービスをオフに汁
>>517 て言うかスレッドで発生する未キャッチの例外ってたまに通知してくれない気がする。
521 :
デフォルトの名無しさん :04/03/14 21:15
質問です。 [Windows] + [M]ですべてのウインドウを最小化できると思いますが、 それによって発生するイベントというのが見つかりません。 お心あたりないでしょうか?代替手段でもOKです。 Application.OnMinimize FormのWM_SYSCOMMANDのSC_MINIMIZEをキャッチ ではダメでした。
EnumWindowsで取得したウィンドウに手当たり次第WM_MINIMIZE送りつけるとか。 これそのままではヤヴァイので、最小化して良いウィンドウか判別しなければならないが。
>>522 タスクバー(appbar)的なプログラムをDelphiで書いていて、ユーザが[Win] + [M]を押しても
巻き添えにならない方法を探しているんです。
拡張子scfを持つテンポラリファイルを作って、 それに「クイック起動」にある「デスクトップの表示」の中身を書き込んで、 ShellExecuteで実行すれば実現できるけど、 これでは不満なんだろ?
>>525 appbarにはしてます。
でもアレってTApplication.Handleを設定するのが筋っぽいですよね。
で、このリンクだと思うのでちょっと呼んでみます。
>>523 釣りと思いつつ、そんなことやっていたら、Winではなくなるだろうが。
変なの
>>527 多くのランチャはタスクバーからの整列や最小化などには追随しないようにできている。
ちゃんとした Windows の作法がある。それが AppBar アプリ。
>>527 タスクバーはWindowsアプリではないってこったな。タダのcoolbarなんだけれど。
Winの作法、Macの作法それを守れないなら、プログラム作るなよ。 バカヤロ。
>>528 いくつかの優秀なグラフィックソフトやオーディオシーケンサを否定する発言ですね。
Macの作法をWinに持ち込んでいるから? まあ、代え難い実績があるアプリは例外だろう。
>>531 君は集合論や論理学の初歩をしらないの。
ある機能を実現する正式な方法ある、と主張しているのが 528 だろ。
それ以外の方法では駄目とはいってないだろ?
>>533 自分を正当化するのに多大な労力をかけるより、素直に引っ込むなり謝るなりした方が
コストパフォーマンスは高いと思うが。
なぜだか一人熱くなってるイタイやつがいるな。527はなにをいいたいんだろう? Delphi でランチャつくってはダメってことなんだろうか?
>>536 そうだよ。お前はMACにでも逝けば?
何、おまけにdelで作ってる?言語道断だな!
あっ、そういう人なんだぁ。 そうだよ、ってことはやはりイタイ人だと自覚してるんだね。 MAC だとDelphiでランチャつくれるの?
すみません、Macにはdelのような高価なコンパイラ無いからな。 只で使えるもので十分だし。済みませんでした。
すみません、ちょっとオフトピですが、まじめに.... MAC は友人が使っているとき画面を見たことがある程度です。 MAC 上ではメジャーなプログラミングツールは何ですか。言語はどの系統ですか。
CodeWarrierかね? C++もPascalも使える。しかもクロスプラットフォーム。
>>541 ありがとう。ちょっと興味がでてきました。539によるとタダでついてくるんだよね。
>>542 使えないとか言うよな。
インタフェースビルダーくらいは憑いて来るが、がんばれよ。
はい、すこし調べてみます。ありがとう
MACでタダで使える開発環境・・・ AppleScriptとOSXのgcc・・・? で、なんの話だっけ?
Windows の AppBar について。
面倒くさいのでVC++で組み直すことにしました。 アルゴリズムは十分移植可能なので。
Win32APIをコールするアルゴリズムを教えてください。
VC++ だと面倒くさくないの? Delphi の方がずっと簡単だと思うが。
>>549 そう言う変な動きに対しての気遣いが少なくて済む。
メイン画面はDCが一枚あればいいので大して難易度は上がりません。
やっと規制解除さえた(´ω`)=3
>>521 WM_WINDOWPOSCHANGING見れ。
Win+M, +Dは最小化ではなくて画面外にウィンドウを移動させてる。
>>551 ありがたいです。
しかしながら、挫折して云年、久々に触るVC++はなんともわかりやすく、コレで一度戦ってみようと思います。
ダイアログベースにするだけでCTRL + M対策ができたりとか素直なので。
画面外に移動は良いんですがタスクバーのボタンで元の位置に戻るってのはWindowsさんが
親切でやってくれるんでしょうか。
>>551 イベントは取れるようになりましたがWin+Mに対して踏みとどまれません。
LParamのポインタに対してごにょごにょしたりMoveWindowを呼んでも消えてなくなりやがります。
ダイアログベースにしたらいけるなら、Delphiでダイアログアプリに・・・まあ素直にVC++かな
みんなデータベースは使わないんだね… データベースを使わなきゃ仕事にならないおいらとしては VC++の方が効率がいいなどということは有り得ないわけで…
Delphiのユーザでお仕事モードの人は少ないんじゃないの? DBクライアントのフロントエンドなら、Delphiは便利かもね。でもそれ専用の ツクールアプリみたいなのもあるんじゃないの?知らないけど。
>>556 知り合いの会社はAccessを使ってるらしいよ。
UIの自由度やら配布のしやすさを考えるとDelphiの方に分があるのは明らかなんだけどね。
大きな会社ほどM$製じゃなきゃ駄目なんだと思うと少し気の毒な気もする。
VS.NETでもあんまり状況は良くなってないし…
(DB用の部品を「買えば」いいらしいけど)
> 大きな会社ほどM$製じゃなきゃ駄目なんだと思うと少し気の毒な気もする。 いや、それで間に合ってるんならそれでいいのでは? なぜ気の毒になるのか分かりません。ごちゃごちゃプログラムつくらなくても 既製品で間に合うなら、それでいいのでは? > UIの自由度やら配布のしやすさを考えるとDelphiの方に分があるのは明らかなんだけどね。 「UIの自由度やら配布のしやすさ」より優先すべき重要なことがあるんだね、きっと。
単純にその会社のデファクトスタンダードがMSと言うだけだと思われ。 大きな会社->設計フェーズでぐいぐい意見を通すことができる->自社のデファクトスタンダードを採用。 小さな会社->大きな会社からの仕様書->いろんなOSなりアプリ。 例えばうちでは独自OSかHP-UX、TurboLinux以外は認められません。 AIXとか口走ったら会社が揺れます。多分。 去年からメーカ系で働いてるけどなんか凄いです。 「せんぱい~。ここの仕様ってわかりにくくないですか?」 『ああ。適当に解釈して仕様書改訂しといて。』 「(・・・いや、他社が作ってる通信相手どうすんだよ。)」 とか、 「(あ、この通信エラーって俺が悪いんだよな)ああ、仕様の相違がありますね・・・。」 『あ!すぐに直しますんで!!』 「(いや、なんであんたが・・・)お願いします。」 怖いね。力って。
氏ね
自作フリーソフトのメインのpasが、13000行を突破・・・。 そしてまだまだ書くことはたくさん。なんとかならんもんか・・・。
そろそろ機能分割すべきでしょうね。
>いや、それで間に合ってるんならそれでいいのでは? >なぜ気の毒になるのか分かりません。ごちゃごちゃプログラムつくらなくても >既製品で間に合うなら、それでいいのでは? 全然間に合いません。 結局、VBAで開発するわけです。
> 結局、VBAで開発するわけです。 いや、だからそれでいいんでは?
VBAの方が 「ごちゃごちゃプログラムつく」る必要があると 思いませんか?
そう思わないひとの方がおおいし、それで間に合ってるならいいのでは?
どうしてもDelphiでつくりたいならつくればいいんだし。
>>557 のように
気の毒に思うのはどうか、ということから始まっているんだよ。
┐(´ー`)┌
ごちゃごちゃの基準も曖昧だしな。 まぁ、他人のコードバカにする暇があったら満足度の高い成果物を作れと。それが正義だ。
おれがマサヨシだ。
> まぁ、他人のコードバカにする暇があったら満足度の高い成果物を作れと。それが正義だ。 ユーザの多い方が正義だと思いますよ。(藁
"自己"満足度
> "自己"満足度 あぁ、なるほど。ひとりでするアレと同じですね。(藁
574 :
デフォルトの名無しさん :04/03/19 07:11
以下をMMX で高速化できないものでしょうか? var BufX,BufY:array[0..16500] of integer;//座標と色を保持した構造体 wRGB:array[0..16500,0..2] of Byte;
procedure TForm1.MMXDraw(cY1,cY2,m:integer); var j,i,r,y,x:integer; v:array[0..2500] of PByteArray; begin for j:=0 to (cY2-cY1) do begin y:=cY1+j; v[y]:=BmpB.ScanLine[y];//まとめてポインタ先に保持 end; for i:=0 to m do begin y:=BufY[i]; x:=BufX[i]*3;//RGB 3バイト単位 // BmpB.Canvas.FillRect(Rect(x,y,2,2));以下相当の処理 for r:=0 to 1 do begin v[y+r,x ]:=wRGB[i,0]; v[y+r,x+1]:=wRGB[i,1]; v[y+r,x+2]:=wRGB[i,2]; v[y+r,x+3]:=wRGB[i,0]; v[y+r,x+4]:=wRGB[i,1]; v[y+r,x+5]:=wRGB[i,2]; end; end; end;
塗り潰しのように大量のメモリアクセスの発生する処理は、あんまり速くならないよ。 MMXでなくとも 折角2ピクセル毎に塗ってるんだから、4ピクセル一度に塗ったら? つまり 3ワード分一度に塗るように変更すれば 3/12 =1/4になるよ・・・・ ・・・・塗る場所が広いと結局メモリアクセスに引っ張られて変わらんのだよね
prefetchしとけ
塗り潰しだから読み込みはしていない。 書込みの前にフェッチしたら、余計に遅くなるわな
579 :
デフォルトの名無しさん :04/03/19 10:02
スプライト高速化に使えるらしいよ>MMX
>>574-575 ループの中で2次元配列の同じ要素へ[]を使って何度もアクセスするのをやめてポインタを使うようにしたり,
ピクセルをRGB個別ではなく一括で転送すれば多少は速度が上がるようです(一応実験しました).
今回のコードをCPUウィンドウをのぞいてみたら
1バイトを転送するための処理が非常に長いばかりか毎回Push/Popしていました.
>>576 delphiの場合、Pentium3やPentium4では、確実に早くなるぞ。
なぜかというと、P3以後ではフェッチされるバス幅、
および、ライトコンバイニングバッファが32ビット(=4バイト)ではなく、
32バイト単位(P4では64バイト)なので、使用するデータ幅が大きいほど、
バス効率が上がるから、CPUのロードバッファ、ストアバッファの負担が下がる為。
P4以後でSSE2命令のレイテンシがMMX命令より悪くても、
MMXより高速化できる場合があるのはこの為。
プリフェッチもひとつの手段だが、CPUごとにプリフェッチの時間距離計算を
変える必要が出たり、色々不定要素が絡むので難しいぞ。
582 :
デフォルトの名無しさん :04/03/24 13:12
>>581 よく読んでやれよ
塗る場所が広ければと書いてる つまりはキャッシュが溢れたら メモリ書込速度のみに調速される。
それから、 プリフェッチについては
>>578
ようしらんけど書き込みって一次キャッシュ経由じゃないの? 一バイトずつ書き込んだら一バイトずつ物理メモリに書き込まれる?
1バイトづつ書いたら、読み出しサイクルがタマに発生するんじゃないのか
復旧記念パピコ
Y < 0 DX > 0 DY > 0 DX > DY のとき、ループを使わないで C を求めたいのですけれど、どうすればいいのでしょうか? var Y, C, DX, DY, S: Integer; begin C := 0; Y := -34; DX := 1252; DY := 92; S := DX shr 1; while True do begin Inc(C); Dec(S, DY); if S < 0 then begin Inc(S, DX); Inc(Y); if Y >= 0 then Break; end; end; end;
おまいが何をしたいのかがさっぱり解からん
高速化のため、ループ無しで C を求めたいのですよ。 C := Trunc(DX / DY * -Y); S := S + -DY * C + DX * (-Y); これじゃだめです。
確かにCが何なのかの説明がないとサパーリですね.
説明不足でした。 本当はSを求めたいのです。 if の中は -Y回実行されるので、S に DX * (-Y1) が追加されます。 後は Dec(S, DY) が何回実行されるか解れば、Sが求まります。 つまり、S := S + -DY * C + DX * (-Y); になる C にはループの実行された回数が入ります。
方程式たてればいいじゃない Cがc番目ならYがy番目 S = (DX shr 1) + y*DX - c*DY ; if S<0 then inc(y) 最終的に S =(DX shr 1) -Y*DX - C*DY Sは必ず正 S>=0 で c=(DX shr 1) div DX まではyは変化しない それ以上になるとおよそ y:c = DY:DX これを S=0で解いてから、整数関係を調整したら?
>>592 そのやり方は理解できませんでした。
で、結局591を手直ししてできました。
C = ループ回数
DX * (-Y - 1) = 最後のifブロック実行前のSの増加分
DY * C = 最後のifブロック実行前のSの減少分
S + DX * (-Y - 1) - DY * C < 0
C > (S + DX * (-Y - 1)) / DY
を満たす、最小の正の整数 C を求める。
(S + DX * (-Y - 1)) を A に置き換えると、
C > A / DY になる。
C := A div DY + 1;
となるので、
C := (S + DX * (-Y - 1)) div DY + 1;
また質問です。 こんどはループの回数が決まっている場合です。 Sの初期値 >= 0 DX >= DY > 0 のとき ループを使わずに S の値を求めたいのですが、どうすればいいのでしょうか? for I := 0 to C - 1 do begin Dec(S, DY); if S < 0 then Inc(S, DX); end; ループを展開すると、 Dec(S, DY); if S < 0 then Inc(S, DX); Dec(S, DY); if S < 0 then Inc(S, DX); Dec(S, DY); if S < 0 then Inc(S, DX); ... C回繰り返す。 になります。
>>594 function hoge(C,DX,DY: Integer):Integer;
var
p,r: Integer;
begin
Result := S;
r := C;
if r = 0 then exit;
Dec(Result,DY);
Dec(r);
p := Result div (DX
if p = 0 then
Dec(Result,DY*
else
begin
Dec(Result,(D
Dec(Result,DY*(r
end;
end;
>595 ヴァカ?
どの辺が「ヴァカ」なのかすら、解らない…
>595 文字化け?
まぁ 594 あたりが「中級者」ではないことはよくわかった。
>>599 (DX や DY* の意味が解らなくてすみません。
for I := 0 to C - 1 do
begin
Dec(S, DY);
if S < 0 then Inc(S, DX);
end;
↓
for I := 0 to C - 1 do
Dec(S, DY);
for I := 0 to C - 1 do
if S < 0 then Inc(S, DX);
が言えたらいいのですけど。
if S < 0 then が無ければ分割できるのですけど。
for I := 0 to C - 1 do
begin
Dec(S, DY);
Inc(S, DX);
end;
i:1..C 番目迄に何度 Inc(S, DX) が実行されたかを K[i] とする S0 を初期値 K[0]:=0; for i=1 to C do begin if S0 - i*DY + K[i-1]*DX < 0 then K[i]:=K[i-1]+1 else K[i]:=K[i-1] ; S[i] := S0 - i*DY + K[i]*DX end; S[c] := S0 - c*DY + K[c]*DX もし S0>c*DY なら K[c]:=0 そうでなければ、 0=< S[c] <DX
Del6EntでTADODataSeを使ってるんですが、Nextメソッドが異常に遅いです。 CursorTypeなどのパラメータを変更してみたんですがどうにも改善せず、しかたな いので現在は生のRecordsetを操作するようにしています。 スピードを比較したところ、TADODataSet.NextはRecordset.MoveNextに比べて 100倍時間が掛かっていました。 これはこういう物なんでしょうか?
つまり、一度でもS<0になったらループ終了後のSの値は 0<=S<DX になるって事か。
605 :
デフォルトの名無しさん :04/04/17 02:25
質問です。 VC++のように、リリースビルドとデバッグビルドを一気に生成する方法ってないのですか? リリースチェック時とかにバグが見つかったりするたびに、オプション変更してコンパイルしなおすのが面倒です。 できれば、VCみたく、Release, Debugのように別フォルダにdcu/exe作ってくれるようにしたいのですが... IDE使わずに、makeでも使えばできるのでしょうか?? 皆さんどうされてます?
再コンパイルが速いから気にしない。
それほどディレクトリを複雑にしていないなら dcc32 -Uコンポーネントフォルダ hoge.dpr で作成出来ると思う あるいはhoge.dprをフォルダ掘ってコピーを作っておいて、そのコンパイルオプションを別にするとか
609 :
デフォルトの名無しさん :04/04/17 16:17
>>605 IDEではできない。
makeかなんか使うしかない。
wantってのもある。
俺はantを使ってる。
フォローどうもです。>>皆様 そうですか、やはりmake/antですか... 特別IDEが好きだってわけじゃないですが、ちょっとばかり残念です。 業務で使ってると、 Debug/Releaseの話と、日本語DLLウィザードの使えなさ加減(*)は気になります。 もうちょっとなんとかしてほしいなぁ。 (*:日本語版だと謎のエラーが出るとか、 バイナリの出力パスに相対指定使っただけで、exe参照できないとか.. こいつもも、コマンドラインから指定できるのかな? ついでに一緒に調べてみるかな..) ほんと、Delphi自体はかなり好きなんですけどねぇ...
>日本語版だと謎のエラーが出るとか それは D7 以降は仕様。D6 以前はバグ。細かく話すときりが無いが 生成された .RC に codepage(932) の一行を入れればコンパイルできると思うぞ
もう少し、詳細を。D7 Pro? どんな形でもいいからレポートしていかないと、結局何時までたっても直らないぞ。
「日本語版だと謎のエラーが出る」ってことかな? なんてエラーメッセージ?
616 :
デフォルトの名無しさん :04/04/22 08:04
TClientDataSetをオンメモリDB(MyBase)として使っている方います? フィルタHit全件Deleteしているんだけど、2回目以降フィルタ前後で件数が 合わない... そもそも2回目以降フィルタHit0件なのはナゼ... orz 初回Delete件数以上いなくなってしまったオレは人望なさすぎですか?(w 後で再現コード晒します。
618 :
デフォルトの名無しさん :04/04/23 17:28
DelForExpソースフォーマッタを使ってみて、
ttp://www.dow.wau.nl/aew/DelForExp.html 日本語環境でフォームの大きさがくずれるので、Del7でビルドしようと思ったのですが、
ExpIntf.pasが見つからないって言われ、Buildできません。
これって、標準のモジュールなんでしょうか。
Del用ウィザード作るのに使うやつみたいなので、当然Borland謹製のものだと思うんですが...
そのページのトップに >New: DelForExp now supports Delphi 7 と出ているが?
この Expert は DLL で作っているのか。 source\toolsapi\ExptIntf.pas が見つからないかな? ホントに ExpIntf.pas て中江だとするとわからない。
>>620 あれ、うちではみつかりません。
あれ、D7Proをデフォルトインスコなんですが、
標準では入らないのかなぁ。
V:\usr\delphi7\Source\ToolsAPI のディレクトリ
2002/09/06 16:00 7,363 ClxDesignWindows.pas
2002/09/06 16:00 24,764 ClxEditors.pas
2002/09/06 16:00 7,904 ClxSprigs.pas
2002/09/06 16:00 1,949 DesignConst.pas
2002/09/06 16:00 90,411 DesignEditors.pas
2002/09/06 16:00 48,713 DesignIntf.pas
2002/09/06 16:00 5,057 DesignMenus.pas
2002/09/06 16:00 6,460 DesignWindows.pas
2002/09/06 16:00 14,609 PropertyCategories.pas
2002/09/06 16:00 164,917 ToolsAPI.pas
2002/09/06 16:00 70,674 TreeIntf.pas
2002/09/06 16:00 45,121 VCLEditors.pas
2002/09/06 16:00 7,812 VCLSprigs.pas
2002/09/06 16:00 3,539 VcsIntf.pas
んー。
622 :
デフォルトの名無しさん :04/04/27 01:33
Del5で使いやすいシリアル通信コンポってないですかね? 用途はシリアルポートによるレシートプリンタ出力です。 いままでDel3などでdukeさんのTComm使っていたんですが Del5では使えないようなのです。
>>621 D7 Pro には無いね。なんでこれを抜いたんだろう..
Delphiには期待していないのでどうでもいい。
626 :
デフォルトの名無しさん :04/04/27 11:11
すんませ~ん!! ちょっと質問聞いてください。 最近Delphi8を買ったんですけど、一緒についてきたDelphi7の意味がさっぱり 分からずに困ってるんですよ。 なんかDelphi8を構成するために必要ですとか書いてあったんだけど Delphi8だけインストールできたし、起動も出来たし、 いったい何のために有るのか知りませんか?
627 :
デフォルトの名無しさん :04/04/27 11:22
追加で、なんですけど。 Delphi8の一部を構成するために必要ならDelphi7を共存させないといけない じゃないですか。 どうなんでしょうかそこのところは。 誰か教えてください。まじ困ってますtt
マルチ
Delphi8 → for .NET Framework Delphi7 → for Win32 全く別物。知らないで買ったのなら、驚異。呆然。
まぁ、知らないから買った、とも言える。(藁
101人目のユーザですか?
632 :
デフォルトの名無しさん :04/04/27 11:38
>>629 いや知らないわけではないんですけど。
都合上最新モデルでプログラムを改良せよとの命令が下りましてねt
で、どうなんでしょう?共存させちゃっていいんでしょうか?
633 :
デフォルトの名無しさん :04/04/27 12:04
>>629 普通のWin32用のプログラムが作りたきゃDelphi7つかえってことですかい?
そゆこと
635 :
デフォルトの名無しさん :04/04/27 12:14
どうなんだろDelphi5とDelphi6いっしょにしたときはむちゃくちゃに なったんだけど、Delphi7とDelphi8か・・・。 まぁ今から共存させてみるよ
>Delphi5とDelphi6いっしょにしたときはむちゃくちゃに >なったんだけど おまえだけ。
637 :
デフォルトの名無しさん :04/04/27 12:19
ん?なんか設定ファイルがかぶらなかったかい? わっけわかんなくなったんでアンインストールしたよtt
>ん?なんか設定ファイルがかぶらなかったかい? かぶらないけど? ディレクトリもレジストリも別だし。 .pas を開くときにどちらになるか。ってのがあるけど、これは拡張子関連付けの問題だから しょうがないし
639 :
デフォルトの名無しさん :04/04/27 12:24
追加。 D5, D6, D7, D8 と4世代同居しているけど問題ない。
641 :
デフォルトの名無しさん :04/04/27 12:26
えーと、どこで聞いた話かもう忘れたけど、 異なるバージョンの Delphi が共存できない。と騒ぐ人がいて、症状を聞いてみたら C: のルートにインストールしていた。というのがありました。 c:\bin\Delphi32.exe って感じ。そんなディレクトリ選ばれちゃ、さすがにどうしようもないが。 世の中にはいろんな人がいる。ということで。
> 世の中にはいろんな人がいる。ということで。 ほんとだね。Delphi に限らないけど、いろんな書き込みの内容を読むとしみじみ そう思うね。個人的には、Delphi8 を買う人がいるってのが(略
644 :
デフォルトの名無しさん :04/04/27 20:30
デルフィアンサイコ-でしょ
マジシャンテンコーでしょ
646 :
デフォルトの名無しさん :04/04/28 10:21
StrToDateTimeだと、OSのロケールに影響を受けてしまいます。 影響を受けないで、DateTime型に変数を入れる方法を教えて下さい。
647 :
デフォルトの名無しさん :04/04/28 10:31
日付表現は原則ロケール依存なので、何か書式を決めないと。 1/2/3 を 2001年2月3日と見るか、2003年1月2日とするかはプログラマーであるあなたが決めること。
648 :
デフォルトの名無しさん :04/04/28 11:19
で、 >1/2/3 を 2003年1月2日 と決めた場合、 Windowsのロケールに影響受けない、StrToDateTimeはありまつか?
649 :
デフォルトの名無しさん :04/04/28 12:57
厳密には無いです。 StrToDateTime の第二引数に 'yy/mm/dd' と指定するか、 自分でパースしてから EncodeDate でしょうか
650 :
デフォルトの名無しさん :04/04/28 13:01
D7 にはあるが。
652 :
デフォルトの名無しさん :04/04/28 13:05
>>651 本当ですね、D7はオーバーロードしてますね。
BCB6には無い...
で、 じゃねえよ、アホ
ShortDateFormatを変更すれば?
655 :
デフォルトの名無しさん :04/04/28 18:43
System or Windowsユニットに数値->文字列変換する手続きか関数ありますか? 逆ならValというのを見つけたのですが。
>>655 SystemにStr手続きがあります。
え?君デルフィアン? もうサイコ-でしょ
このスレもう要らないのでは
Variant型にNullを入れたいんだけどDelphi7じゃ入らないんだよね だれかNullの代わりになるもの教えてくれない? ひょっとして「''」とか?
Unassinged (バリアント)これか!! T・H・X !
Variant変数 := UnAssingedでOk?
どうせバリアントなんだろ
Nullを入れるときVariantは便利だな。
質問です。 アプリ起動時にGetCurrentDirをやるとアプリパスが帰ってきますが、 TOpenDialogの初期パスはどんなアプリでも共通のパスを開くようです。 一度OpenDialogで選択すれば、カレントパスもそこに移動するようですが・・・。 この共通のパスの取得方法ってなんかありますか?
668 :
デフォルトの名無しさん :04/05/01 13:31
あげときます
見てみましたが・・・。 Win2000以降に限定された話になりますが、InitialDirにNullが入っていた場合、 現在のディレクトリをみて、フィルタに指定されたファイルがあればそこを、 なければマイドキュメントを開く、という動作をすると読みました。あってますか? この時の「現在のディレクトリ」というのが問題で、普通にGetCurrentDirをすると アプリパスが取得されるわけですが、実際に初めてOpenDialogを開いた場合などは、 他のアプリのダイアログで開いたパスが開かれるわけです。 「現在のディレクトリ」というものに、アプリごとのものと共通のものが在るのか? また共通のがあるのなら、その取得方法は?というのが疑問です。
引数の渡し方について、ちょっと教えてください。
video for windowsの定義:
function AVIMakeCompressedStream(
var ppsCompressed : PAVISTREAM;
ppsSource : PAVISTREAM;
lpOptions : PAVICOMPRESSOPTIONS;
pclsidHandler : PCLSID
): HResult; stdcall; external AVIFILDLL;
呼び出し:
SourceStream, DestStream: PAVIStream;
opt: TAVICOMPRESSOPTIONS;
if AVIMakeCompressedStream(DestStream, SourceStream, @opt, nil) <> AVIERR_OK then exit;
手本にしたCソース:
AVICOMPRESSOPTIONS opt;
PAVISTREAM pstm,ptmp;
if (AVIMakeCompressedStream(&ptmp,pstm,&opt,NULL)!=AVIERR_OK) return 0;
-----
DelphiからのAVIMakeCompressedStream関数の呼び出しが実行時にエラーに
なるんですが、どうしてでしょう? 最初の引数に問題があると思うんですが?
ちなみに、以下のページで何か言ってるようだけど、英語わからん。
ttp://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_10246460.html よろしくお願いします。
>>672 何でか分からないが、キャストする必要があるみたいだった。
AVIMakeCompressedStream(DestStream, SourceStream,
PAVICOMPRESSOPTIONS(@opt), nil)
> 何でか分からないが @opt は PAVICOMPRESSOPTIONS 型じゃないからだろ
675 :
デフォルトの名無しさん :04/05/02 23:24
@opt は ^TAVICOMPRESSOPTIONS 型なの?
定義はこうなってる。 PAVICOMPRESSOPTIONS = ^TAVICOMPRESSOPTIONS; TAVICOMPRESSOPTIONS = record 分からないんだけど、型キャストするかどうかで この場合、渡されるアドレスが変わるの?
アドレスが変わるはず無い、はず。 デバッグしてみればわかるけど。 以前試した限りではなかった。
そもそも型が違えばコンパイラエラーになる。 まったく関係無い所にバグは潜んでいるのかも…。
679 :
デフォルトの名無しさん :04/05/05 03:05
Indy9使っているんですけど TIdMessageをそのままSendするだけでは Shift Jisのまま送信されてしまうのでしょうか?
ソース見て。
>680 IdCoderHeader.pas内のEncode2022JPっていう 関数で、エンコードしているっぽいのですが… メールを受け取る環境によっては文字化けを起こすらしいのです。 原因などわかる方がいらっしゃいましたら教えていただけませんでしょうか?
>>681 ステップ実行するとどこがバグってるのかよくわかるよ。
勉強だと思って追ってごらん。
フィールドが通貨項目だった場合、DBGrid に表示させると \1,000 と表示されますが、 Table1->FieldByName("Field1")->AsString などとして取り出すと、 1000 になってしまいます。 AsInteger や AsVariant で取り出してから変換してもいいんですが、 ビミョーに気持ち悪いので、直接、取り出す方法ないですか?
意味不明
Format関数つかえば?
誤爆でした。スマソ。
VB の DSUM 関数みたいなことをやるにはどうしたらいいでしょうか? TQuery 使えよって言われそうですが、 すでに Query1 に合計を求めたいレコードが抽出してあるので、 それを利用したいんです。 たとえば Query1 の SQL : select * from order.db where (いろいろ条件) の時に、 Query2 の SQL : select sum(price) from order.db where (いろいろ条件) と書けば目的のことはできるんですが、両方に条件書くのはいかにも 無駄っぽい。 Query1 の結果をテンポラリテーブルに書き出せばいいんでしょうけど、 Query1 を DBGrid に表示させている場合は、別のクエリを用意しなければ いけないので、それはさらに無駄っぽい。 SumOfPrice := DSum('price',Query1) みたいなことをしたいんです。 VB にできるんだから、Delphi にできないはずはないと思うんですが・・・。 よろしくお願いします。
例外エラーのエラーメッセージを取り込みたいのですがどうすればいいでしょうか? try s := IdHTTP1.Get(url); except on E: EIdHTTPProtocolException do begin end; end;
>>687 > VB にできるんだから、Delphi にできないはずはないと思うんですが・・・。
愉快なご意見。
CでできるんだからDelphiにできないはずはないと思うんですが・・・。
691 :
デフォルトの名無しさん :04/05/07 05:20
E.Message
Delphi は VB 以下ですか・・・
function DSUM(const FieldName: String; AQuery:TQuery):Int64; begin Result := 0; with AQuery do begin Open; First; while not Eof do begin Result := Result + FieldByName(FieldName).AsInteger; Next: end; end;
ありがとうございます。 クエリで sum を使う方向でしか考えてなかったものですから、 自分で全部足す方法は思いつきませんでした。
695 :
デフォルトの名無しさん :04/05/07 13:43
うちではアップデートしてもエラーは何もでてないよ。
698 :
デフォルトの名無しさん :04/05/07 13:54
>>696 それは素晴らしい。漏れもやってみようかな・・・
D8 付属の D7 は大丈夫。 D7 初期出荷版だとだめ。 ということだそうだ
700 :
デフォルトの名無しさん :04/05/07 14:01
700get
>699 そりゃバカにしてるな・・・ 付属のD7の時点で、一部アップデートされてるって事か?
テストミスか製品管理ミスか。 まぁ、まだ日本ではアナウンスされていないわけだし。
D8の付属版D7って以前のと全く同じじゃんグルァ って話じゃなかったっけ?
同じじゃなかった。ってことでしょ? 同じだといっていたのは誰?
そこら中の人々
706 :
デフォルトの名無しさん :04/05/07 15:51
>>699 ニュースソースはどこよ?
Updateしてみたが、バージョン上がらないのは確か・・・欝死
>691 Thx!!
>>703 D7インスコして環境構築し終わった時点で、D8付属のCDの方は番号が1あがってるのに気づいた。
が、なんか入れなおすのが怖いのとマンドクサイので放置...してたのにーーー。
710 :
デフォルトの名無しさん :04/05/11 11:02
Delphiで、MACのPICTファイルを扱えますか?
扱えます
712 :
デフォルトの名無しさん :04/05/11 14:37
MACのPICTファイルには、 Windowsで扱いやすいものと扱い難いものと2種類あると聞きましたが、 両方扱えますか? 扱うとは、ファイル操作だけでなくて、描画や画像形式変換も含みます。
どのレベルで扱いたいんだ? ライブラリが欲しいのか、フォーマットが知りたいのか。 ライブラリが欲しい場合、DLLでいいのかexeにスタティックリンクしたいのか。
714 :
デフォルトの名無しさん :04/05/11 15:05
>ライブラリが欲しいのか、フォーマットが知りたいのか。 Yes、Noでつ。 >ライブラリが欲しい場合、DLLでいいのかexeにスタティックリンクしたいのか。 どちらでも良いから欲しいでつ。(スタティックリンクの方が楽は楽ですが)
質問の内容がはっきりしたところで、Delphi PICT でぐぐって下さいでつ。
ググっても、PICTのライブラリは無さそうですね。 拡張子辞典ばかりひっかかる。
susie
Delphi PICT でぐぐると、先頭にPICT→Jpeg変換の質問がでてくる。 それを見ればとりあえず解決方法はわかる。 また、その中にPICTのフォーマットについてのリンクもある。 もう少し、検索を上手く使えるようになるといいね。
>>718 日本語ページの検索だとそうなるけど、その次のサイトが・・・。
susieのコンポーネント調べましたが、 オブジェクトモジュールだけのソース無しでした。 使うの怖い。 (コンポーネントはちゃんとしているんでしょうが、将来の話として)
>>722 一部抜き出したので、これで勘弁。
procedure TSPI.GetBitmap(ms: TMemoryStream; bm: TBitmap);
var
hBmpInfo, hBitmap: HLOCAL;
pBmpInfo, pBitmap: Pointer;
BmpInfo: PBitmapInfo;
begin
GetPicture(ms.Memory, ms.Size, 1, hBmpInfo, hBitmap, nil, 0);
pBmpInfo := GlobalLock(hBmpInfo);
pBitmap := GlobalLock(hBitmap);
BmpInfo := pBmpInfo;
bm.Width := BmpInfo^.bmiHeader.biWidth;
bm.Height := BmpInfo^.bmiHeader.biHeight;
SetDiBits(bm.Canvas.Handle, bm.Handle, 0, BmpInfo^.bmiHeader.biHeight, pBitmap, BmpInfo^, DIB_RGB_COLORS );
GlobalUnlock(hBmpInfo);
GlobalUnlock(hBitmap);
GlobalFree(hBmpInfo);
GlobalFree(hBitmap);
end;
何言ってんだ・・・? Delphian Worldにソース付きのがあるじゃん。 Del7のコンパニオンディスクにも入ってた奴。 まあ、俺はそのままでは使いにくかったので、それを参考に自作したけど。
>725 「Susie Plug-in 読込コンポとビットマップ」 World行ってspiで検索すれば、それらしいのはひとつしか出てこない。 もう一回言おうか? もう少し、検索を上手く使えるようになるといいね。
susie で検索して出てきた別の奴にもソースついてた。 むしろ、ソースが付いていなかったのはどれなのかが知りたくなってきた・・・
と思ったらあったよ。ゴミレスすまん。 ま、上記のやつを参考に頑張ってみておくれ。
Susieプラグ印がそんなにDelphiに普通に繋がる良質なインターフェースとは思わなかった。 それともDelphiが賢い? とりあえず、勉強になった。
730 :
デフォルトの名無しさん :04/05/12 22:08
会社には開発ツール(デル)が無い。 そこでデルがインストールされた自分のノートPCで仕事中に勝手に(指示なく) 業務用プログラムを書いた。 私は「著作権は私が保有する。しかし会社には自由に使用する権利を与える」とした。 これに対し会社は「仕事中に作ったのなら著作権は会社のもの」と主張。 しかし、開発ツールさえ所有していない会社に著作権が所属してしまうものなのだろうか? なんか会社の都合のいいことになりそうなんですが。。。
731 :
デフォルトの名無しさん :04/05/12 22:10
業務上横領age
732 :
デフォルトの名無しさん :04/05/12 22:44
「その業務用プログラムを、開発環境フリーなC#に移植して使う」 が正解。あおりじゃなくてね。物と金がなければフリーの使う。 そういうもんだろ。
道具の持ち込み如何にかかわらず、 給与をもらって作ったんだから会社の物では?
734 :
デフォルトの名無しさん :04/05/12 23:25
こういう場合、作者が会社に著作権を渡すことは デルのライセンス上問題ないんでしょうかね。
735 :
デフォルトの名無しさん :04/05/12 23:32
>>730 著作権法第15条の2
「法人その他使用者の発意に基づきその法人等の業務に従事する者が職務上作成するプログラムの著作物の著作者は、その作成の時における契約、勤務規則その他に別段の定めがない限り、その法人とする」
736 :
デフォルトの名無しさん :04/05/13 04:51
業務プログラムなら会社から給料と 時間をもらっているんでしょ。 その場合は著作権は主張できないよ。 あまりごねると別の人にCかJAVAでつくらせて 左遷かくびになるんじゃない。
仕事中に書いたんならダメだろ・・・
>>729 プラグインのインターフェースが良いわけでもDelphiが賢いわけでもない。
DelphiでDLLを利用する、それだけの話。
Susieプラグインコンポを使えば簡単に扱えますね.
自分のプログラムから自己解凍形式のファイルを出力というか 作成したいのですが、なにかライブラリとかコンポとか簡単な実現方法は ありますか? あと参考になるサイトがあれば是非教えてください。
742 :
デフォルトの名無しさん :04/05/14 06:54
著作権についていろいろ意見ありがとうございました。 素直に会社に明け渡す事にします。
>723
これだと、中身がビットマップのPICTしかサポートできない。
712は扱いやすい物と扱いにくい物の両方が可能か聞いているが、これは前者のみ。
本来PICTはWindowsのWMFに相当するフォーマットで、QuickDraw(Win32のGDIに相当)描画命令全般の記録ができる。
所がMacにはBMPに対応するフォーマットが無いので、ビットマップ画像もPICTを使って保存されている。
Susieは前者しかサポートしていない。
もしもすべてのPICTのサポートが必要であれば、QuickTimeのイメージインポーターに対応するのが確実。
これはAppleが作っていて、QuickDrawの命令をフルサポートしている。
ヘッダは下記から取得できる。
ttp://www.delphi-jedi.org/TEAM_QTM_HOME:347231
∫,,,,,,,,,∧,,∧ そういうことを ⊂,,,,,,,,,つ,,゚Д゚ミつ ウダウダいう会社には 正直、委託ない。
About Delph は更新が止まってるらしくて 最近のログが検索できないんですが、 ほかにメーリングリストの過去ログ 検索できるサイトないですか?
更新が止まっているんじゃなくて、1000毎に追加されることになってる 模様。あと少しで追加されるんじゃないかな。ありがたや。 ほかにはない、と思うよ。
て言うか、
>>730 みたいなことされたら、すげー迷惑だよ。
>>730 がいなくなったら誰が保守するんだ ?
ていうか、保守出来ないならはじめから著作権主張するなよ。
また、話の流れが読めてないヴァカがきたよ...。
LightReport2 を使っています。 見積書を作ろうと思い、TLRGridPanel に LRItemR を貼り付けて、 Aligh = alClient LineBottom = lsSingle LineLeft = lsSingle LineRight = lsSingle LineTop = lsSingle としました。 しかしこれだと、スキマがあいてしまって、二重線で書いたように なってしまいます。 どこか間違ってますでしょうか? よろしくお願いしますでつ。
「でつ」を使う香具師には、なんだか教えても無駄になるような気がして
よろしくお願いします。
754 :
デフォルトの名無しさん :04/05/19 12:49
Turn := First; while not Game.Finished do begin Player := Players[Turn]; Player.Think; ShowGame; Turn := GetNextTurn(Turn); end; のようなゲームのメインルーチンがあったとします。 この形を崩さずにイベントドリブンなアプリに組み込むにはどうすればいいですか? いろんなところでApplication.ProcessMessageばら撒いておけばよさそうですが もっと賢い方法がないですかね。
> もっと賢い方法がないですかね。 なにをもって「賢い」とするかで意見がわかれるな
>>755 お前が無能なのはわかったからだまっとけ
「もっと賢い方法」があると思ってる時点でアウト
イベントドリブンなアプリのメインルーチンはメッセージループ ほかをメインループにしたいなら、メッセージループの代わりをさせる。 そうでなきゃ、メッセージループにそれを組み込む。 Delphi では、TApplication を継承できないので、前者しかない。
>>754 別にPlayerに代入する必要なくないか?
760 :
デフォルトの名無しさん :04/05/19 16:19
PICTファイルを描画するためにJQTComponent_Demoをダウソしてデモを実行しましたが、 >JQTFileDialog1.execute; がダンマリでつ。 同様のライブラリを使ったことある方居られますか? Apple提供のライブラリが動作しないと困りますね。
QuickTime をインストールしたら動作しました。 ファイル選択ダイアログが動作したけど、 画像描画は別というかデモに無さそうですね。
DLLだけじゃ動作しないみたい。 QuickTimeランタイムを配布して良いのだろうか...
>>760 配布しちゃダメだと思う。
つーか、それ以上はスレ違いになりそうな予感。
>>740 流れを読む以前にスレをよく読んでいなかったようで…_| ̄|○…失礼しました.
ところでエンプラ以外で英語環境でも動くアプリを作る場合,どうすればいいのでしょうか.
うちのD5ProにあるリソースDLLウィザードはいまいちよくわかりません.
(ウィザードがはき出したRCファイルはコンパイルしようとするとエラーになりました)
これを使わないとなると
自分で日本語と英語の文字列リソースからリソースDLLを作って
私の頭では実行時に必要な方を読み込む方法ぐらいしか思い浮かびませんでしたが,
私のウィザードの使い方が悪いのでしょうか.またもっとスマートな解決方法はありますでしょうか.
…と思ったらリソースDLLウィザードで作れました. 一部の日本語文字列が(なぜか変換できない)のと ウィザードがはき出すリソースDLLのプロジェクトファイルが リソース行をだぶって書き出してしまっているようですが, 前者は該当行を英文に書き換えることで(それが目的なのですが), 後者はだぶった行を削除することでとりあえず動作しました.
ななしへたぐらまさん、今日は名前どおりみたいだね
フォームに貼り付けたボタンを矢印キーで動作を変えたいのですが、 通常のアプリでは正常に動きますが、ActiveXFormだと正常に動きません。 procedure TActiveFormX.Start; //HTML側で呼び出しています。 begin DefButtonWndProc := Button2.WindowProc; Button2.WindowProc := ButtonWndProc; end; procedure TActiveFormX.ButtonWndProc(var Msg:TMessage); begin if Msg.Msg = CN_KEYDOWN then begin case Msg.WParam of VK_DOWN: begin PostMessage(0, WM_KEYDOWN, VK_TAB, 0); Exit; end; end; end; DefWndProc(Msg); end; なんか別のイベントがあるのでしょうか?教えてください Win2K IE5.5Sp2 Delphi7Pro
追記 WM_KEYDOWNでもダメ何でだろう。 普通のキー(aやbなど)ではいいみたいなのに・・・ 実際、矢印キーでTABSTOPがFalseの奴までフォーカスが逝ってしまうので それを制御するようなコンポーネントを作成中なのですが if Msg.WParam = VK_DOWN then Exit; 見たいにしても、フォーカスが移っていく不思議。
フォーカス遷移は、メッセージ処理より低レベルなメッセージループのなかで 行われるので、アクティブフォームの場合はしらないけど、普通のアプリでは、 Application.OnMessage でキー入力をトラップして制御できるよ。
>>768 ボタンコントロールは矢印キーを受け取らないので、代わりにフォーム側で
CM_DIALOGKEY を捕まえたらどう?
カスタムコンポーネントで矢印キーを受け取りたい場合は WM_GETDLGCODE を
捕まえて、Result に DLGC_WANTARROWS を追加してやる必要がある。
フォーカスの移動も PostMessage を使うと割り込みが入る可能性があるので、
該当コントロールの親の FindNextControl で次のコントロールを特定して、
フォームの FocusControl を呼ぶ方がいいと思う。
CM_DIALOGKEY でどうかな。
フォーカスがボタンにあるときにその親であるフォームに CM_DIALOGKEY メッセージ が送られてくるの? どうして?
VCLがそういう設計だから
パネルにのってたらパネルにくるの?
メインフォームで全てのメッセージを処理しる
パネルにはこない
>カスタムコンポーネントで矢印キーを受け取りたい場合は WM_GETDLGCODE を >捕まえて、Result に DLGC_WANTARROWS を追加してやる必要がある。 でうまく動くようになりました。 PostMessageはコンポーネントのさいは使ってませんでしたので、気づかいありがとうございます。 みなさん勉強になりました。本当にありがとうございました。またよろしくお願いします
ファイルの削除などの際に表示される(コモン?)ダイアログの アニメーションを変更するにはどうすれば良いのでしょうか? インストールしておけば、自分のアプリだけでなく 何処から呼び出されても変更された状態であってほしいのですが。
>>780 shell32.dll の中にあるけど、これを変更するのはやめるべきだと思う。
というか何のためにそうしたいの?
コモンダイアログの「コモン」の意味について考えてみる
783 :
デフォルトの名無しさん :04/05/24 22:45
DBExpress + DataAccess + DBGrid を使ってデータを更新しようと したんだけど、Borlandの教え通りClientDataSet.ApplyUpdates(0); を呼んでもデータが書き込まれなかった。なぜでしょう?誰か教えて ください。
784 :
デフォルトの名無しさん :04/05/24 23:13
>783 追記 ベンダーはInterBase7 Delphi8 Ent ソースは if CDS_CustomerMemo.ChangeCount > 0 then begin if CDS_CustomerMemo.Active then CDS_CustomerMemo.CheckBrowseMode; CDS_CustomerMemo.ApplyUpdates(0); SQRY_CustomerMemo.Close; SQRY_CustomerMemo.Open; CDS_CustomerMemo.Active := False; CDS_CustomerMemo.Active := True; end; に書いてみました。 ちなみに BLOB SubType Text は書き込めるのかなぁ~? おっと、「~」はFireBirdでうまく書き込めないみたい? hさんガンバレ~応援してますよ~。
785 :
デフォルトの名無しさん :04/05/25 10:30
巨大なデータを移し替えるとき、 LoadFromStreamってリソースエラーをおこすときってありますよね? バグなのかな。 何か回避する方法ありますか?
> LoadFromStreamってリソースエラーをおこすときってありますよね? そりゃ、一時的に同内容の巨大なデータがメモリ上に二つ存在する事になるからでは
メモリを「巨大なデータ」サイズの10倍くらい積んだらいい
Delphiもだんだん高級な使い方の質問が増えてきたな BlockRead/Writeの頃はこんな質問なかったのに
789 :
デフォルトの名無しさん :04/05/25 11:25
さらに良くわからないのが、Syncronizedするとエラーが出なくなります。 同じ処理を同時に行うところをSyncronizedして直るならその通りですが、 ストリームの移し変えが1つしか走ってない場合にも同様です。 Syncronizedって他スレッドを完全止めちゃうのかな。 なら分かるんだけど。 そういえば、以前リッチエディットの巨大な文字列を移し変えるとき、 一旦TMemoryStreamに移して、元のStreamをクリアして次のStreamに移すと、 エラーが出なくなる、といった経験もあったけど、今回もそうすれば直るかなぁ。
> Syncronizedするとエラーが出なくなります。 はぁ? 別スレッドからメインスレッドの何かにアクセスしてるの? > Syncronizedって他スレッドを完全止めちゃうのかな。 いや、呼び出したスレッドが止まってコードがメインスレッドで実行される Syncronizedして直るなら、スレッドセーフでないVCLコンポにアクセス してるか、競合してるかです。 > ストリームの移し変えが1つしか走ってない場合にも同様です。 だからメインレッドだって休んでいるんじゃないんだよ。アイドルしてるかもしれんけど
なるほど、何が起きてるか、感覚的に分かったような。
>>791 IndyのHTTP受信コンポーネント使ってて、
受信時にスレッドが生成されその中で
ストリームの移し替えで画像変換を行ってます。
画像コンポーネントがスレッドセーフじゃないのかも。
それと、メインスレッドが関係してるかも知れないと思ったのが、
大した処理じゃないとき、
マウスで画面動かしたときに同様の現象が起きたときがあったので、
メインスレッドと画像変換スレッドが競合してるのかも。。。
メインいじってるときにメインのものを他からつつくな ただそれだけのこと
>>793 重要な感じは受けるのですが、今ひとつ意味が分かりません。
噛み砕いて教えて下ちい。
今回の回避策は、
スレッドセーフじゃなさそうな部分をSyncronizedで回避、
と納得しとけば良いのかなぁ。
グラフィックコンポーネントはネットで落としたソースでつ。
796 :
デフォルトの名無しさん :04/05/25 18:08
>>795 トランザクションは使っていないです。使わなきゃダメですか?
ちなみに、Delphi6pro + InterBase6 では トランザクションを
使わなくても出来ました。プロパティに違いが何かあるのかな?
下ちい。 でつ。 < バカっぽくておしえたくねぇー
798 :
デフォルトの名無しさん :04/05/25 20:55
Delphi6でXML読み書きするサンプルってないですか?
>>796 漏れは
>>795 じゃないけど、データベースに対して
変更処理をしたら、直後に必ず明示的に
Transaction.Commitしたほうがいいですよ。
とくにサーバで複数のクライアントがアクセス
するような場合、commitしないと、他のクライアントで
変更がなかなか反映されない。
それと、例外処理でRollBackも。
800 :
デフォルトの名無しさん :04/05/25 23:42
>>799 とりあえず、テストで開発していたのでまだトランザクションをかけていなかったのです。
それと、解決しました。
TSQLTable,TSQLDataSet だと上手くいき、TSQLQueryだとダメでした。
なのでTSQLDataSetを採用していきたいと思います。
まだ、Delphi8の製品登録をしていないので、Update2はやっていないです。
明日、製品登録をしてから、もう一度チャレンジしてみようかと思います。
他の方で、TSQLQuery でBLOB Subtype 1 を 更新できた方がいらっしゃったら
教えてください。
あぁ。疲れた。やっと、次へ進めそうです。それにしても、Delphi8は良く落ちる。
ここまでくるのに5回落ちた。
Delphiで作ったEXEファイルをバイナリエディッタで開いてみると オブジェクト名とか読めるんですけど、コンパイルってこんなもんなんですか?
Del厨ってXMLもろくに使えないんですね。失望しました。VB.NETを使うことにします。さようなら。
エディッタ・・・?
>>803 「失望しました。」
なにを期待してたんだか・・・・(w
浅ましい乞食ですね。
>>805 >803はGoogleも知らない、自分で探すことすらできないアマチュアなんだよ。
たまにいるから仕方がない。
こいつはVB.NETを使ってもまあこの程度なんだろうな。
まぁ、そこで、C# にいかず、VB.NET に言ってしまうあたりが自らの レベルを暴露してるわけだが。
まぁ、Del7以前にとどまったり、D8に走るよりは何倍もましだが
Del5使いなんですが、Win32のアプリっていつまで使えますか? 次のWindowsからは動かなくなるんでっか?そもそも.NETでなんでっか? Longhornって何時ごろでるんでっか?
自分で調べる
812 :
デフォルトの名無しさん :04/05/27 17:02
日本語版で作ったアプリをWindows英語版で実行すると、 中のコンポーネントが激しくはみ出ます。 何ででしょう?対処法教えて下さい。
Scaledをfalseにすると何とか大丈夫ですが、 このプロパティ、フォームの中で変えても手遅れですね。 IDEで全部変えなきゃだめなのかな。 大変。
>>809 いまだにWin16のアプリがとりあえずといえども動作している現状から類推しる。
> いまだにWin16のアプリがとりあえずといえども動作している現状から類推しる。 動作するけど、実際に使ってるユーザはごく少数、と。
ゲイシにメールでも撃てや。
>>809 この先10年は確実に現役。
Longhornが出たからと言ってもWin2k/XPから積極的に移行する理由もないし、
Win95時代と違って古いPCだからといってそれほど困る事もないからPCの買い換え需要は伸びないかと
> この先10年は確実に現役。 はははは、ありえない。
818は自分の書いたことを日付とともにしっかり覚えておくように。
821 :
デフォルトの名無しさん :04/05/28 15:23
>>818 Longhorn・・・2年後+α=3年後?
XP・・・Longhorn登場直前に買えば、3~5年は使用
8年は確実の予感
あのね、Windows95 が出た時点で Windows3.1 専用開発環境は引退。
>>821 のような数え方なら、いまならまだ Delphi1 が現役。そういう意味ならOK。
つくったもののユーザが自分だけならね。
つくったものが動作する = 現役 とか思ってるんじゃないの? 実務やフリーウェアとして公開できるほどのアプリが作れる = 現役 という定義なら長角出た時点でアウト。
>>822 Win32アプリはいつまで使えるかっていう話じゃないの?
> Windows95 が出た時点で Windows3.1 専用開発環境は引退。
っていう理屈が、どうも分からん
>>823 素人さんでつか?
公開ソフトなんて関係ない
企業内で業務に使われているソフトが動いている間=現役
マイクロソフトが未だにNTやWIN98を切れない理由も、その辺りにある
使えるかって話と、実際に使う人がいるのか、って話はぜんぜん別なのね。 おれは 16bit 版の秀丸エディタのユーザだった。なかなかよいエディタだった がそれをそのまま Win32 で使うことはなかった。
3.1→95とWin32→WinFXは大分状況が異なるだろ。 95ではユーザー側に大きなメリットがあったけどLonghornってなにかこれといったメリットあるのか?
オマエラ、スレ違いですよ
>> マイクロソフトが未だにNTやWIN98を切れない理由
玄人さんは、過去むけでがんばってくださいね。
>>821 のような数え方で
8年後も Del5 を使って仕事してるようじゃ、つらいものがあるね。
そのころ Del5-7 つかって遊んでる素人さんは一桁もいないと思うよ。
> Longhornってなにかこれといったメリットあるのか? そんなことは知らんが、Win32 アプリが古めかしく見られて 使われなくなることは確実。
>>826 だからさ、個人ユーザーがどうしようと関係ないの
メーカーが気にしているのは、企業ユーザー
>>827 なんて上司に言われちゃったら反論できないだろ>826
パソコンは時間とともに確実に壊れて、新規の需要が生まれる。 売ってるパソコンが長角しかOSの選択肢がなければ、どんどん普及していく。 今だって、Win2000pro をOSとして新規購入するのはかなりつらい。
> 個人ユーザーがどうしようと関係ないの 関係あるの。プロは需要があるうちは使っていればいい。どんなに古くてもね。 Delphi のように圧倒的にアマチュアが支えてきたツールでは、8年後はDel5-7は アマチュアにとって現役じゃないでしょ。
>>832 ゆっくりっと代替わりしていくんでないの?
>>833 アマチュアが支えてこなかったから、某に見捨てられたんだろ
新しいバージョン出ても買い換えない。ケチ臭いDel 使いが多いからさ
> アマチュアが支えてこなかったから、某に見捨てられたんだろ うん、そうだね。どっちが見捨てたかは見方によるが、某が個人ユーザを 重視していないことだけははっきりと分かる。新ジャージョンが買い換える だけの魅力があったか、とうことも見方によるが。 ま、これからはプロが某を支えてくださいね。
> ゆっくりっと代替わりしていくんでないの? 実際はね。プロと違ってアマチュアはあえて古い方の環境をターゲットに することはないから、開発ツールとしては劇的に代替わりすると思うよ。
>>836 > 開発ツールとしては劇的に代替わりすると思うよ。
どうなんだろ?某は、劇的変化を演出したいみたいだけど
Kylix、C#Builder、Delphi8と失敗続き・・・
劇的代替わり=某倒産。日本撤退?
で、MSの宣伝の影で、WIN32アプリがしぶとく残る。7~8年
> 劇的代替わり=某倒産。日本撤退? 某は Java とか、なんとかという上流開発支援ツールとかで生き延びればいい。 某の将来と Delphi のそれは無関係じゃないけど、某はどうなったってかまわない が Delphi はなんとか生き延びてくれないものか?
ロングホーンが出れば、一般ユーザ向けの製品とか、フリーソフトなんかは 確かにさっさとWin32環境を捨てるだろう。 でも、企業向けのシステムやアプリを作る場合は、確実にWin32が残る。 だって、企業のPCは一般市場に比べて環境移行は遅いから。 だから、そういう仕事する分にはDel5-7でもしばらくは問題ないだろうさ。 それこそ10年単位で生き残るんじゃないの? まあ、今のコボラ―のような扱いは受けるかもしれんがね・・・。
>>838 > Delphi はなんとか生き延びてくれないものか
漏れも信者だから、そう願っているが・・・
エンプラ版の出荷量が増えれば、日某も振り向くんだろうけど
現状でも、日某のサポート=終了っていう感じだからな・・・
これから先は海外のDel 信者と連携して生き残っていくしかない予感
>> MSの宣伝の影で、WIN32アプリがしぶとく残る。7~8年 長角出て1年が限界と見た。 絶滅しない程度にはどこかで動いているだろ、という程度になる。 実はおれは Windows3.1 の時に買ったゲームがまだ動いていて、ほとんど 毎日起動している。でも、そういう程度であって、決して第一線のままで いることはない。
>> 長角出て1年が限界と見た。 あっ、企業内アプリは別ね。アマチュアから見て、ということにしてください。
***結論*** Delphi滅亡まで アマ・・・長角出荷1年後(残り3~4年) プロ・・・長角出荷5年後(残り7~8年)
>>843 なんか、もう駄目駄目じゃん>Delphi
と思ってたけど、まだそんなに長い間使えるのか
宝くじ当選>D6 Personal(無料)使用者
Delphi6per無料厨はC#Bがソース、バイナリ配布不可だったので行き場を失いますた Delを知らなかったら喜んでVC++使ってただろうに
ところでDelphi終わったら何使ったらいいの?
JAVA 言語も、C/C++ に比べて、 Delphi 言語に対する親和性が高いと感じました。
Delphi しか prog 言語を知らない人間にとって、 JAVA は C/C++ に比べて親しみやすい、と言う意味です。 MFC では Hello World を表示する window を作るのに3日かかりましたが、 Swing では3分でした。 開発効率は、およそ1000倍(3分>30分>300分>3日)です。
>>847 デスクトップ・アプリ開発という意味なら
JAVA・・・速度遅すぎて、デスクトップ・アプリには向かない
DOTNET・・・まだ実験段階。コンポーネントも揃っていない
を考えると、ここ1~2年はノンビリDelphi
+ちょっとだけDOTNETがお勧め
Delphi 9の出来を見て、DOTNET本格移行を考えるべし
_______________ ∧.,,∧ /スレタイに従った人があつまろうよ。 ミ.,,゚Д゚彡< ミ つ目(ミ . \なんで低級者以下ばかりが・・・ ~ミ,,O,,,,,,つ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
去年の1月辺りに、この板のほぼ全てのスレに書かれていた
意味無しコピペの集合を思い出してしまった。
>>815-855
>>856 Delフサギコ は中級者なの? 自称するなら、だれが来ても同じだろ。
>>857 なにを思い出そうと勝手だが、個人的な感慨はスレ違い
857は「意味無し」とか思いながら全部読んだみたいだな(藁
さぁ、おもしろくなってまいりました。
談話室スレ逝けよ。
質問! さいきんデルファイ8に興味あるんだけどさ デルファイ5でつくったソースは使えんのかな?(変換とかやっぱあんの?) いままでデルファイ3、5しかやったことないからその辺が心配なんだよね 誰かおしえてー!
BDNの賢い歩き方ってある? CodeCentralあたりをうろついているのだが、どうも使いにくくて・・・
>>852 Delphi9?
たしかDelphiって8で打ち止めですよね?
もうPascalコンパイラは作らないとかって某がコメントしてませんでした?
Del7のアップデート、まだ入れてないけど、ヘルプがいきなり使えなくなったりとか 終了時に死ぬほどエラーでたりとか、不安定な部分って直ったのかな? 新バージョンもいいけど、フォローもきっちりやって欲しい・・・
>>866 Code Central玉石混交だね・・・
基本的には、素人さんが多いのかな?
で、こっそりSharewareが混ざっている(ウザ)
アメリカ人が多いが、スペイン語やフランス語も結構ある。
案外、堂々と書いても許される予感>日本語
もっと日本からの投稿が増えると良いな~
だって、誰でもアップロードできる空間だから。>Code Central よいネタには Borland からお金が出るし、ものによってはコンパニオン CD に収録される。
>よいネタには Borland からお金 マジ?幾らぐらい出るの?
873 :
デフォルトの名無しさん :04/06/01 21:17
質問です。delphiとは無関係になってしまうかもしれませんが、 プログラム起動時ワトソン博士が出る事が30回に1回あり、調べてみると ファンクション: RtlTraceDatabaseEnumerate でエラーが落ちているみたいです。 色々調べましたが、RtlTraceDatabaseEnumerateが引っかかって こないのでこの場所に出して見ました。 環境は Win2000 + Delphi5 update1 InterBase6.0 です。 何かヒントになる事があれば教えてください。 お願いします。困っています。
>>875 オレへのレス?単純にその方が分かりやすいと思っただけだけ。
だけだけって何だよ…。トホホ。 ↓だけだけ
ワトソン博士に怒られてしまいましたとさ。 めでたしめでたし・・・
DelphiにPackage機能(クラス・ライブラリ?)があるって本当? どうやって使うの?
>>879 ヘルプのキーワードに「パッケージ」といれろやハゲ。
>どうやって使うの?
激しく意味不明。
使ってねえのか?
てめーでパッケージ作りてえのか?
>>874 >>875 ありがとうございます。
意味もなく、プロジェクトソースにSleep(5000)を入れたら全然でなくなった。
スタートアップに登録して起動/終了を100回やってもワトソン君はでない。
ヨカッタ。
>>880 おお!「パッケージ」だとヘルプ出ますね
> てめーでパッケージ作りてえのか?
はい。コンポーネントの入れ物じゃなくて、
Javaみたいに、Unitを集めた、クラスライブラリみたいな物を
作りたいんです。
あんまり使われている所を見た事無いんですけど、
これってありですか?
>>882 中級スレで質問するからにはもうちょっと自分で調べてください。
885 :
デフォルトの名無しさん :04/06/18 13:43
Oracle接続で教えてください。 クライアント側の作業はプログラム本体のインストールだけにしたいのですが、 ODBC,oo4o,DBexpress どれでやっても接続できません。 オラクルクライアントをインストールすれば接続できます。 オラクルクライアントは絶対必要なのでしょうか? Delphi7entを使っています。
文字の描画で教えてください。 文字を円弧にそって曲げて描写するには、どうしたらいいでしょうか? 一文字ずつ角度をつけて、自分で位置を調整して書くしかないんでしょうか?
>>885 どうあがいても無理なものは無理。
自分で実装してみたら?
もし実装できたらリバースだといって訴えられるかもしれんがw
ODBC,oo4o,DBexpress のどれも Oracle が提供するライブラリの上で動くからね。 >どれでやっても接続できません。 当たり前です。 目的がクライアント側インストールのコスト低減にあるのなら、 データアクセスサーバーとして一台だけに Oracle クライアントを導入し、 ほんとのクライアントとは別のインターフェース(WebService とか)でつなげたら? Enterprise 版なら道具は全部そろっているし。
普通は、Oracle Client なしにオラクルには接続できない。 けど、方法はあるよ。 スタンダードな方法なら ASTA,kbmMW,RemObjects/DataAbstractとかで3階層C/S構築。 2階層なら Core' Lab の ODAC Net Optionで出来る。 自力で SQL Net と OCI を実装してる脅威のミドルウェアメーカー。
つか、MDACにMicrosoftのOracle ODBC Driver 入ってなかったっけ?
そもそも
>>885 のクライアント環境がわからん。
どなたかRSA暗号のソースかコンポーネント知りませんか?
ttp://swiss.torry.net/crypting.htmで PGP Components for Delphi v.3.3.5 っての見つけたんで早速入れたら
PGP Software Development Kit Core Library not foundってエラーが出て起動しなくなった・・
Libraryなんて見つからないし、、もうだめぽ..
ぉ、キターーー・・ 、、DL出来ね・・ Delphi入れなおしてきます・・ λ,,. .
コンポーネント系がおかしくなって起動できない場合は Delphi6\Projects\Bpl\dclusr60.bpl をいったん消してあげれば直るんですね。 直ったところでもっかいトライしてみます。
>>896 早速使ってみます。
どうもありがとうございました。
898 :
デフォルトの名無しさん :04/06/22 13:31
質問です。 IntraWeb+WebBroker(exe型cgi)で、ページを表示させることはできたのですが、 ボタンを押しても、フォームの内容がリセットされるだけで、イベントが発生している様子がありません。 確認してみる点などありますでしょうか?
どうも、ボタンを押しても、環境変数CONTENT_LENGTHが0のようなのです。 submit関係で注意すべきプロパティでもあるのでしょうか
で、まあ、無理やりデバッグ用データ(CONTENT_LENGTHと標準入力)を渡したところ、 TCGIRequestまではデータは渡るのですが、IntraWebに伝わってないみたいなのです IntraWebのソース欲しい…
901 :
デフォルトの名無しさん :04/06/23 10:35
TDateTimePickerの文字列を消すことは出来ませんか?
902 :
デフォルトの名無しさん :04/06/23 11:08
interface type THoge1 = class end; THoge2 = class private FHoge1: THoge1; public end; implementation private でしか使用しない THoge1 を interface 部で晒さなきゃいけない ことに納得できないのですがこういうもんですか?
そういうもの。 イヤならinterfaceとインスタンス生成用関数だけ晒すとか コンパイルして.dcuと情報削った.int飲み公開とかするしかない。
>>902 THoge1をTObjectなんかの上位クラスにしとけば、
interfaceにさらす必要ないよ。
ただ、FHoge1を生成するときはTHoge1をCreateすること。
その場合、 implementation の下にTHoge1の入ったソースをusesするか、 THoge1のオブジェクトを外からTHoge2に設定してやるか、 のどちらかをやる必要がある。
クラス自体にはアクセス制限はないでしょ。THoge1 自体には private であること とは関係ない。THoge2 のフィールドとして private であるだけで、どうせ外からは THoge2 クラスを使う部分からは見えないんだし。気持ち悪ければ、THoge1 をなにか の abstract なメソッドを宣言しておき、抽象クラスにすると。そして、実装部で それから派生した具体クラス宣言・実装をつくり、実際に THoge2 の FHoge1 は その具体クラスのインスタンスとして作ればよい。VCLでは常套手段だよ。
> implementation の下にTHoge1の入ったソースをusesするか、 それじゃ、そもそも interface で FHoge1 を宣言できないじゃないの
904 の方法だと、実装部でいつもキャストする必要があるでしょ。
Delphiにはクラスにアクセス指定できないから気にせずやるしかないよ。 無理してやってもメリットは薄い。
>>907 FHoge1: TObect;
と書いといて、
FHoge1にTHoge1のオブジェクトを入れれるんだよ。
>>908 別に、privateに、そういうpropertyを用意してもいいし
アハァ?
>>911 property FHog1: THoge1 write ....
とかのように THoge1 がそもそも使えないんじゃ実装部でキャストするしかないでしょ
>>914 class helper…ごにょごにょ
>>906 のがまともだろ。例えば TMemo.Lines は抽象クラス TStrings 型だけど
実際は実装部で宣言実装されている TStrings の派生具象クラス TMemoStrings
のインスタンスが代入されている。ユーザは TStrings のメソッドを呼び出しても
多態性により実際は TMemoStrings クラスのメソッドが実行される。
>>916 話がずれとる。
拡張性の話とは無関係だよ。
こう書きたいんだろ。Del8なら可能だったような。 THoge2 = class private class THoge1 = class end; FHoge1: THoge1; public end;
>>918 単に晒したくないって理由で抽象クラスを用意するというのは
Delphi的にはまっとうなやり方ではないよ。
> Delphi的にはまっとうなやり方ではないよ。 だからまっとうなやり方を教えてよ。
まっ、意見の相違だな。宣言部で TObject で実装部でキャストしまくるのが まっとうだとは思わないな。
>>923 説明としてTObjectを使っただけであって、
TWinControlでもTComponentでも構わない。
あぅ、気にするな、っていうのがまっとうだと。それはそうかも。
902はどうした? 902の結論は?
みなさんありがとうございます。ちょっと期待してたのですが残念です。 気にしなければいいのですけど名前衝突のリスクとか考えると 表に出さなくていいものは出したくないですよね・・・・・ でもそのためにキャスト多用というのもちょっと・・・ですし。 Del8で可能かもですか・・・Del8未満を切り捨てられる時代は まだまだ先のような木もするので当面我慢して使うしかないですね・・・・ ありがとうございました。
928 :
デフォルトの名無しさん :04/06/23 18:15
ところで、文字列の長さが255までと決まってるなら 明示的にShortString使ったほうが速度面その他で有利とかありますかね?
そんなことは気にしない
AnsiStringを取る関数の引数に使ったりすると変換入って逆に不利になるし やるなら全部ShortStringで完結させるつもりでGO
>>927 >ちょっと期待してたのですが残念です。
なにをどう期待してたのか分からないのですが?
>>902 には納得できない、としか
書いてないけど。
AnsiStringを取る関数の引数に使ったりすると変換入って逆に不利になるし やるなら全部ShortStringで完結させるつもりでGO
なんかいい隠蔽方法が無いか期待してたんだろ
>>927 > 名前衝突のリスクとか考えると
THoge2 の private で宣言するのはよくて、同じユニットで THoge1 を宣言すると
どうして名前衝突のリスクが増えることになるんですか?
> なんかいい隠蔽方法が無いか期待してたんだろ だから TObject にするとか、抽象クラスをつくるとか提案があったでしょ。 隠蔽方法としてはよい提案でしょ。902 がそれを採用しないのは、隠蔽を必要 とする度合いが、キャストやら抽象クラスをつくる手間より小さいからでしょ。 つまり、簡単な方法があれば採用するけどめんどくさいのはいや、ってことね。
>>935 結論
> あぅ、気にするな、っていうのがまっとうだと。それはそうかも。
>>927 クラス名の衝突はユニット名が異なれば起こらないから
ビルドできなくなることはないよ。
問題はたまたま同名クラスの同名メソッドを呼び間違える可能性があることだけど
それほど神経質になることはないと思うよ。
>>935 おっしゃるとおりです。
interface
type
TFunc = procedure(A, B, C: integer) of object;
THoge2 = class
private
FFunc: TFunc;
public
end;
implementation
ちなみに TFuncを隠蔽するにはどう宣言しとくのがよいでしょう?
気にしないことにしたのですが隠蔽も覚えておいた方がいいかと思いまして。
うーむ、今回の件は
>>909 のいうとおり
>Delphiにはクラスにアクセス指定できないから気にせずやるしかないよ。
>無理してやってもメリットは薄い。
だと思う。いろいろ手をつくしても得られるメリットがそれに見合ってないよね。
いろいろなところで質問があるんだけど、回答する方は、なんとか解決しようとする。
でも、質問者は軽い気持ちで、簡単ならいいけど面倒ならまぁいいや、ってことも
あって、回答者はガックリ、ということも多い。質問者は、一応回答を得たなら、
実際に採用するかどうかはともかく、「参考にさせていただきます」とか答えて
おけばいい。
いっぽう、どんな方法でもいいから絶対解決したい、という質問もあるので、
そこらへんの見極めが難しいんだよね。
適当な質問には答えないのも節度かもね。
>>939 Delphiには型宣言にアクセス指定できないから気にせずやるしかないよ。
無理してやってもメリットは薄い。
>>940 デフォルトは簡単でまともなやり方を答えつつ
無理な方法が存在することを匂わせとけば十分。
それを聞きたきゃ再度聞けばいいだけだし。
迷うのは最初からまともでないやり方を指定した質問。
直接答えるべきか勘違いを指摘しつつ代案を示すべきか。
まともでないことを自覚しつつ後者の返答をもらうと
なぜまともでないことをやりたいのかを
説明しないといけないから割にウザかったりするんだよな。
何かおおげさなことに(^^;) こんな当たり前のことができないはずはない、私の知識不足だ、 D5ぐらいからは対応してるはず、と思っていたので 「期待してたのですが残念です」と書いたのですが・・・・ もしかして触れてはいけない話題だったのかな(^^;) おとなしく.NET勉強します・・・
> こんな当たり前のことができないはずはない、 そうか、ここら辺の感覚が違うのね。そんなことのために .NET 勉強するってのも なんかちょっと違う感じ。 たいした弊害があるわけでもないことが重大なことに思えるのかなぁ。
えーと(^^;)こんな隠蔽もできない言語といわれてくやしいとかそういうことですか? たいした弊害でもない、といってる時点で初心者丸出しですが。
なんだ、手の込んだ釣りだったのか
>たいした弊害でもない、といってる時点で初心者丸出しですが。 しかし、あれば便利だけどなくてもこれまでやってこれたし、なんか つまらないことをほじって釣りしてる感じだね。多重継承ができない から不便、begin end がダサイ、とかと同じレベルのような。
902 は隠蔽したいから.NETを勉強するんだとさ。
なんつうか・・・ どこが重要で、なにが重要じゃないのかってのが正しく見極められない人間は、 どーでもいいことで拘るから仕事も遅いし融通が利かなくて使えない。 もう少し、柔軟な思考能力を身に付けられるといいな。
902は釣り確定だな こんなのにいつまでも相手しなくていいよ ↓ はい、次の方どうぞ
句読点を使い分けて荒らしと言ってみるテスト。
>>901 なにをしたいかよくわからんが、
DateTimePicker.Format := ' ';
とでもしておけばとりあえず非表示になる。
955 :
デフォルトの名無しさん :04/06/25 16:51
くだすれでスルーされてしまいましたので、 こちらで質問させてください。 今、TPersistentを継承したTData1,TData2...TDataNという いくつかのクラスをファイル入出力させるためTHogeというクラスを作り、 Dataプロパティに先ほどのTDataクラスを保持させるようにしています。 THoge = class(TComponent) published property Data: TPersistent read FData write SetData; end; WriteComponentできちんと書き込みは出来ているのですが、 実行時のDataプロパティの実際の型が不定のため、 ReadComponentでうまく読み込むことが出来ません。 やはりDataプロパティの実際の型をTHogeにプロパティとして持たせ、 Dataプロパティを偽プロパティを使って、 ストリームからの読み込み時にその型を判別し 個々の読み込みを行うという方法をとるしかないのでしょうか? なにかスマートな方法がありましたら教えてください。
>WriteComponentできちんと書き込みは出来ているのですが、 THogeのインスタンスをWriteComponentしても Dataのプロパティまでは書き込み出来ない気がしますが。
>>956 TPersistent.GetOwner
使ったことはないが
>>955 TDataN を THoge の中に置くのではなく、クラスの外に作って THoge から
参照するだけにしておけばどうですか?
この場合、TDataN は TPersistent ではなく TComponent から派生します。
そうすれば Read/Write や Create/Destroy の面倒は Owner (フォームや
データモジュール) が見てくれるので、特に何もする必要はありません。
>>958 dData = record
case DataType: Integer of
{Data1..Nのデータ型を定義}
end;
THoge = class(TComponent)
public
property Data: dData read FData write SetData;
end;
みたいのじゃダメなの?的外れならスマソ
>>959 955 じゃないが書き込み可能なメンバーにレコードを使うのは
何かと不便だと思うけど。
・パブリッシュできない。つまり dfm に保存することができない。
・Data.X := Data.X + 1 みたいな操作ができない。
いろいろなご意見、ありがとうございます。
>>956 Dataへの代入時にFDataを実際の型でCreateしてますんで、
WriteComponent時にはきちんと保存できているようです。
>>958 TComponentから派生させるように作り直すことも考えたのですが、
先ほど簡便性のためにTData1,TData2...TDataNなど書いたクラス群は
実際にはTCustomDataA,TCustomDataBとあり、
さらにTCustomDataAを継承したTDataA1,TDataA2...というクラスが
数十個、すでに構築されてますんで、これをすべてやり直すのも
いかがなものかと思ったわけなんです。
どうせTHogeは、ファイル入出力時に一時的にCreateするだけですし。
>>959 近いものとして、以下のようにしようかとも思いました。
THoge = class(TComponent)
public
property Data: TPersistent read FData write SetData;
published
property DataType: TClass read FDataType;
end;
Dataプロパティへの代入時、FDataTypeへその型を代入しておいて、
読み込み時にはFDataTypeに代入されている型をもとにFDataをCreateさせようかと。
もっともそのためにはDataプロパティを偽プロパティを設定して
読み書きする必要があるかと思うんですが。
なんか途方もなく無駄なことをしようとしてるような気が。
詳細はともかく、最終的に実現したいことを素朴に書いてみたら
>>955
>>963 簡単に書くと、
・TData...のクラスの内容をファイル入出力したい。
・TData...の構成はできればあまりいじりたくない。
の、2点のみですw
>>962 で書いたことを試してみたんですが、ちょっとうまくできませんでした。
やっぱりTData...をTComponentから派生させたほうが楽なのかな…
965 :
デフォルトの名無しさん :04/06/29 15:06
閉店間際ですが、質問させてください。 Delphi 7 + dbExpress を利用して、ローカルの MySQL を操作しようとしています。 カラム数が 11 あるテーブルに対して、TSQLQuery 経由で 'select * from hoge...' としたところ、TSQLQuery.FieldCount が 6 を返します。頭 6 つ分しか取得できて いないようです。 同じ問い合わせを SQL エクスプローラから行うと、正しく 11 カラム返って来ます。 MySQL のバージョンは 4.0.20a です。MySQL も dbExpress も初めてなので、問題の 切り分けができず困っています。心当たりのある方、いらっしゃいませんか。
MySQLではないけど Last;First; をしないと件数正しく返さないことがありました。 参考になるかどうか。 MySQL4は情報少ないよなあ。
>966 その件数ってレコード件数のことではなくて?
>>966 情報ありがとうございます。ただ残念ながら、今回は TSQLQuery.Open メソッドの
直後で FieldCount の値が決まっているので、それが直接の原因ではないようです。
なお、insert や update では 10 以上のカラムを同時に挿入・更新できました。
今のところ、select 文を発行するときは * を使わずに 6 つ以下のカラム名を列挙
してごまかしています。
何か分かったらここに還元します。
Delphi + BDE で Paradox 形式のデータファイルを使用している スタンドアロンのデータベースアプリがあります。 これをC/S型DBアプリにする方法を教えてください。 データベースソフトに Firebird を入れて、BDE系のコンポーネントを IB系に換えれば いいのかなぁ?と漠然と考えてますが、C/S型は作るのが初めてなのでどうしたら いいのかよくわかりません。 クライアントは Windows XP のマシンが2台(将来的には6台程度まで増えるかもです)。 サーバーはこれから用意するので、Unix 系でも Windows でもどっちでもいいです。 開発言語は Delphi6 Professional です。 参考になるURLだけでもいいので、よろしくお願いします。
970 :
デフォルトの名無しさん :04/07/05 04:25
| 何について調べますか? | ┌────────────┐ | | おまえの消し方 | | | | | └────────────┘ | [ オプション(O) ] [ 検索(S) ] | `──────────┐ ┌─── , '´l, ..| ./ , -─-'- 、i_ |/ __, '´ ヽ、 ',ー-- ● ヽ、 `"'ゝ、_ ', 〈`'ー;==ヽ、〈ー- 、 ! `ー´ ヽi`ヽ iノ ! / r'´、ヽ `´ヽノ
>>969 > データベースソフトに Firebird を入れて、BDE系のコンポーネントを IB系に換えれば
> いいのかなぁ?と漠然と考えてますが、
そんな感じでどうぞ。
でも、差し替えるのならBDEからdbExpressもおすすめです。
サーバはライセンス関連でUnix系がおすすめ
ただ、差し替えるにあたってデットロックが起こらないように
トランザクション関係はしっかりね
>>971 レスありがとうございます。
昨日、Firebird を入れてみました。
今日、Marathon を入れてみましたが、
使いかたがわかんね;;
いそいでないのでゆっくりやります。
973 :
デフォルトの名無しさん :04/07/07 02:03
>>973 非常におもしろいんだが、スレ違いだと思う。
Office アシスタントはMSですら失敗だったと認めるくらいだが。
パーソナル版ユーザーが カスタムコンポーネントを製作する事は無謀なのでしょうか。 Unicode 対応 TMemo 派生コンポーネントを製作したのですが、 どうも挙動が不審です(終了時にメッセージを処理しきれていない模様)。 プロフェッショナル版を買うべきか、悩んでいます。
C#買え
>>978 VCLがどの様にメッセージを処理しているのか、
VCLのソースが参考になると思っているのですが。
>>977 スターターアップキャンペーンでしたっけ?
アレが終わってしまったので、今は買う気はありません。
パーソナル版はVCLのソースがついてこないんだっけ? あれば確かに参考になるけど、他のコンポーネントのソースでも参考になるとおもわれ
982 :
デフォルトの名無しさん :04/07/09 01:56
>>982 Win98だとまともに動かないんです。
Win9x で正しく動かないのは .NET Framework も同じ。 ELPack がつかえるぞ
>>984 どうも動かすには、Pro版に含まれる
コンポーネント(masks.pas)が必要なようです。
いやはや。やはりPro版を買うかなぁ。
いまから Pro 版買うのは無駄。UNICODE 対応エディタつくるんなら C# で やっておけばいい。無駄にならないし。ベータだけど Express 版なら無料で DLできる。あとすこしで。
ベータなんて軽々しく進めるもんじゃないと思うが。 システム側に不具合出るって報告もあるし。
>>986 >C# でやっておけばいい。無駄にならないし。
言い切るのはどうかと。.NETイラネっていわれてるし。
Delphi8 をすすめるべきなんだろうが、ベータにも達してないし
>>989 ちょっとびっくりするほど認識不足だと思うよ。
> システム側に不具合出るって報告もあるし。 ソースキボン
994 :
デフォルトの名無しさん :04/07/10 01:11
>>987 このセキュリティ証明書は、信頼できる会社から発行されていません。
証明書を表示して、この証明機関を信頼するかどうか決定してください。
とか出るし(w
流石MS
> とか出るし(w だから何?