C++Builder相談室 Part17
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/08(水) 02:01:27【前スレ】
C++Builder相談室 Part16
http://pc8.2ch.net/test/read.cgi/tech/1138766165/l50
過去スレ・関連サイトは>>2-7あたり。
※Borland C++ Compiler 5.5.1についての質問は以下のスレへ
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/l50
※BDS(Borland Developer Studio)の総合スレはこちら
Borland Developer Studio 2006 No.10
http://pc8.2ch.net/test/read.cgi/tech/1162262669/l50
0345デフォルトの名無しさん
2007/04/22(日) 00:17:04リアルタイムで動画データ生成してるなら変わるだろうけど。
0346デフォルトの名無しさん
2007/04/22(日) 12:45:02長いあいだそういうものだと思ってたんですが、Turbo C++の只版を古いマシンに
入れてみたらそっちの方が補完が早くて。
何か設定がまずいのでしょうか。
0347デフォルトの名無しさん
2007/04/22(日) 13:49:33BCB6だと動いていたんですけど、2006では
CCyUSBDevice *usbdevice = new CCyUSBDevice(Handle);
でaccess violationを吐いて動かなくなってしまいました。
なにかヒントを下さいませ。。
0348デフォルトの名無しさん
2007/04/22(日) 14:06:2864ビット対応はまだなのか?
0349デフォルトの名無しさん
2007/04/22(日) 15:53:36vistaが普及してからでも遅くない
0350デフォルトの名無しさん
2007/04/22(日) 19:46:42Panel->WindowProc(CallBack)
void __fastcall TForm::CallBack(Messages::TMessage & msg)
{
switch(msg.Msg)
{
case WM_LBUTTONDOWN:
ShowMessage("WM_LBUTTONDOWN\n");
break;
case WM_KEYDOWN:
ShowMessage("WM_KEYDOWN\n");
break;
default:
break;
}
}
のように設定しようとしてみましたが、うまくいきません。
ヘルプをみてもそれらしい記述はないので、困っています。
パネルへのコールバック関数はどのように指定してやればよいのでしょうか?
お手数おかけしますが、よろしくお願い致します。
0351デフォルトの名無しさん
2007/04/22(日) 20:07:42TPanel::WndProcをオーバーライド
class TMyPanel : public TPanel {
private:
void WndProc(Message& msg);
};
void TMyPanel::WndProc(Message& msg) {
switch(msg.Msg) { //略
}
TPanel::WndProc(msg);
};
0352デフォルトの名無しさん
2007/04/22(日) 20:08:450353デフォルトの名無しさん
2007/04/22(日) 21:53:28宣言うまくいきました。
ありがとうございます。
もうひとつお聞きしたいのですが、
SendMessage(Form->Panel->Handle,WM_PAINT,0,0);
のような感じでPanelに対してメッセージを送ってみましたが、
コールバック関数が発動しません。
別途発動条件がいるのでしょうか?
0354デフォルトの名無しさん
2007/04/22(日) 22:08:19そのPanelの型がTMyPanelじゃなくてTPanelってオチだと予想。
意地でも継承クラス使いたくないってなら::SetWindowLong(HWND, GWL_WNDPROC,〜);のほうが楽。
コールバック関数はstaticメソッドか通常の関数である必要があるからPanelのインスタンス渡したりが面倒だけど。
VCL的には前者の方法が正当だとおもう。
0355デフォルトの名無しさん
2007/04/22(日) 23:48:07おっしゃるとおりでした。
下記のコードのように修正してみましたが、コンパイル時に宣言の訂正を要求されます。
コンポーネントの継承クラスの使い方を間違っていると思うのですが、調べてもよくわかりませんでした。
TMyPanelクラスをnewで生成しようとしても、うまくいきませんでした。
たびたび申し訳ないのですが、どこがおかしいのか教えていただけませんでしょうか。
class TMyPanel:public TPanel{
protected:
void __fastcall WndProc(Messages::TMessage &msg);
};
class TFormMain : public TForm
{
__published: // IDE 管理のコンポーネント
// TPanel *Panel; 元々Panelをフォーム上に置いたときの宣言
TmyPanel *Panel; こう宣言しなおしてみたら、コンパイル時にエラーがでます
public: // ユーザー宣言
__fastcall TFormMain (TComponent* Owner);
};
0356デフォルトの名無しさん
2007/04/23(月) 07:16:26パネルのWindowProcにメソッドポインタを代入すれば
パネルを継承クラスしなくてもウィンドウプロシージを乗っ取る事が出来るよ。
でも、
VCLは せっかくメッセージ1つに1つのメッセージハンドラが呼べるような構造になってるのだから
それを使わないのは勿体ないよ
なんで、SDKスタイルに固執するの?
0357デフォルトの名無しさん
2007/04/23(月) 08:25:34SDKスタイルに固執するというよりも、
VCしかつかったことがないので、VCLに置き換える方法がわかってないのだと思います。
理解できれば、もっと楽に組めそうな気がするのですが。
VCL的スタイルをもう少し調べてみます。
アドバイスありがとうございます。
0358デフォルトの名無しさん
2007/04/23(月) 08:31:30WM_PAINT の処理を書きたいのなら、BCBの場合は
パネルを貼り、その上にSystemタブのPaintBoxを貼り、
貼ったPaintBoxをダブルクリックして ソコに書けばいい
0359デフォルトの名無しさん
2007/04/23(月) 22:29:42その方法で思った通りの実装ができました
おつきあいくださり、ありがとうございました。
勉強になりました。
0360デフォルトの名無しさん
2007/04/26(木) 13:06:37BDS2006で作っているプログラムを何度かコンパイルしていると、あるときから急に
「[C++ エラー] Sysconst.hpp(24): E2316 'ResourceString' は 'System' のメンバーではない」
「[C++ エラー] Sysconst.hpp(24): E2040 宣言が正しく終了していない」
というエラーが大量に出るようになってしまいました。
エラーが出る直前(と思われる)の内容に書き戻してみても結果は変わりません。
ネットで調べると、プロジェクトの作り直しで直るとの情報があったのですが、結果は変わりませんでした。
includeの順番によっては出るという情報もあったのですが、正常に動いている別プログラムと比べても違いを
確認できませんでした。
回避方法がわかる方がおられたら教えてください。
よろしくお願いします。
0361デフォルトの名無しさん
2007/04/26(木) 13:08:22それだけの情報で原因が分かったらエスパーだよ。
「ある時から急に」じゃなくて絶対にソースに何か手を加えたな。
0362デフォルトの名無しさん
2007/04/26(木) 13:23:021ってListItemにAssignは無いんですよね・・・
0363デフォルトの名無しさん
2007/04/26(木) 13:27:34すみません、「コンパイルしていると」の手前に「修正しながら」という言葉をつけるのを忘れてました・・・。
ただ、短いプログラムとはいえ5000行程度あるので、それをすべてここに記載するのは難しいですし、
CPPファイルのイベントハンドラの中しか触っていないのに、Sysconst.hppがエラーを吐くようになるのは
単純にソースを触ったということとは別の、何か原因があるのでは?と思って質問した次第です。
0364デフォルトの名無しさん
2007/04/26(木) 13:28:54今言えるのはclass ResourceString が正しく宣言されてないと
いう事だけだ。
0365360=363
2007/04/26(木) 14:40:27理由が判明しました。
フォームのひとつにSEARCH.cppという名前のものを作っていたのですが、
このファイルのヘッダファイルをインクルードしたとき、includeフォルダ内の
search.hを見に行っていたのが原因でした。
そのため、SEARCH.cppの名前を変更することでエラーが発生しなくなりました。
なぜ急にincludeフォルダのほうを見に行ったのかは謎のままですが・・・。
0366デフォルトの名無しさん
2007/04/26(木) 18:01:29#include "search.h"
書き方を間違えたとか
0367360=363
2007/04/27(金) 13:38:14残念ながら、そこまでおばかではなかったです。
それにしても、何で急に別ファイルを見に行ったか気になるところではありますね。
search.hなんてわかりやすいのはともかく、includeフォルダ内のファイルを全部洗って、それにかぶらない名前を
つけないといけないなんて面倒でしょうがないですし。
0368デフォルトの名無しさん
2007/04/27(金) 14:08:110369デフォルトの名無しさん
2007/04/27(金) 21:14:26宣言の順番で変わったりするし、何か別のincludeファイルを追加したとか
0370デフォルトの名無しさん
2007/05/05(土) 13:03:38オブジェクトインスペクタ の goRowMoving を true にすることによって問題
なくできていたのですが,プログラムの他の部分を弄っている間に動かせなく
なくなりました。新規の Form1 に 1個の StringGrid だけを置いたプロジェク
トで試してみましたが,同樣に駄目です。因みに goRowSelect, goEditing
などは false→true で可能です。原因が分りません。どなたか教えて下されば
幸です。
0371デフォルトの名無しさん
2007/05/05(土) 13:05:29プリコンパイルヘッダを消せ。
0372デフォルトの名無しさん
2007/05/05(土) 13:59:59>371 さんの仰せは「プロジェクト/オプション」で「プリコンパイルヘッダ」
の「使用しない」をチェックすることで宜しいのでしょうか。そうしてみました
が,(テスト用プロジェクトでも)上手くゆきません。
0373デフォルトの名無しさん
2007/05/05(土) 14:04:37ちがうお
そこはチェックのままでいいお
BINフォルダを開いて、中にあるbc32def.#nnとかbc32def.csmという
ファイルを消すお
それからLIBフォルダを開いてVCL何とかというタイムスタンプが最新の
ファイルも消すお
0374デフォルトの名無しさん
2007/05/05(土) 15:49:01原因は別のところにありました。同じ質問とそれに対する解答は
http://www.tek-tips.com/viewthread.cfm?qid=907480
にあり,拙生の場合も Fixed Cols の値がゼロになってました。
(StringGrid を配置した時点では fixed column が2列設けてあったのですが,
後に迂闊に消したのを気付かないでいました。)
有難うございました。
0375デフォルトの名無しさん
2007/05/07(月) 21:48:49BCB6ってVistaで不具合ある?
0376デフォルトの名無しさん
2007/05/07(月) 23:04:37ttp://pc11.2ch.net/test/read.cgi/tech/1171498766/1-2
0377デフォルトの名無しさん
2007/05/08(火) 00:05:59thx.
やっぱだめなのか・・・。
0378デフォルトの名無しさん
2007/05/08(火) 00:21:400379デフォルトの名無しさん
2007/05/08(火) 18:40:19http://www.microsoft.com/japan/windows/virtualpc/default.mspx
コレでWin98でも動かせばいいと思う
0380デフォルトの名無しさん
2007/05/09(水) 08:25:25LIBファイルを作り直したら動作する様になったのだが、こんどはIE6で動作しなくなった。
2種類準備すべきなんだろうか?
0381デフォルトの名無しさん
2007/05/09(水) 08:46:270382380
2007/05/09(水) 17:50:03やっぱりそうするしかないのか。ちょっと面倒だ。
0383デフォルトの名無しさん
2007/05/09(水) 17:59:190384デフォルトの名無しさん
2007/05/09(水) 18:14:130385383
2007/05/09(水) 18:23:47http://www.skybound.nl/products/delphi/
0386デフォルトの名無しさん
2007/05/10(木) 19:01:49TDateTime型はどのように追加したらいいのでしょうか?
0388デフォルトの名無しさん
2007/05/11(金) 15:25:25ResizeってFormの端っこをつまみますが、それってWindowsMessageじゃ取れないんですよね。
0389デフォルトの名無しさん
2007/05/11(金) 18:38:48どこを設定すると書き込みできるようになりますか?
0390デフォルトの名無しさん
2007/05/11(金) 19:15:14レコード追加は INSERT SQLの方がよくね?
もしくは TQuery + TUpdateSQLの組み合わせ。
>>389
RequestLiveを Trueに。
0391デフォルトの名無しさん
2007/05/11(金) 19:19:57ありがとうございます!
RequestLiveを Trueで正常に書き込みができました。
ところで質問なのですが、
TQueryならSQLを使うべきですか?
AppendRecordを使っても特に問題はないですよね?
まだDBは不慣れで何をどう使っていいのやらわかっていなくて・・・
0392デフォルトの名無しさん
2007/05/11(金) 19:28:10どんなSQLが流れてるか確認できるからいい。
あと、複数のテーブルをジョインしている場合でも
追加や編集、削除ができる。
あ、それからデータベースがOracleとかだと、
Appendや Editがたまにうまくいかないことがあった。
0393デフォルトの名無しさん
2007/05/11(金) 19:29:47Delphiだけど。
ttp://www.wwlnk.com/boheme/delphi/dbtips/css0350.htm
0394デフォルトの名無しさん
2007/05/11(金) 19:44:09ありがとうございます。
そのサイトで勉強してみます!
ちなみにDBはMySQLを使ってます。
0395デフォルトの名無しさん
2007/05/11(金) 22:10:15増殖してるんだけど、これプリコンパイルヘッダとかいうやつですか?
0396デフォルトの名無しさん
2007/05/11(金) 22:14:50そうです。タイムスタンプも新しいだろ?
実際時々プリコンパイルヘッダは壊れる事があるので定期的に削除を
お勧めする。*.csmというのもプリコンパイルヘッダ。
0397デフォルトの名無しさん
2007/05/11(金) 22:45:52ありがとう
csmが数十メガとかなってた
0398デフォルトの名無しさん
2007/05/13(日) 12:45:09try{
try{
if( ...) return false;
}
catch(...){
}
}
__finally{
}
return true;
これってtryのifでreturnしたら__finallyに入らないんですが書き方間違ってますか?
0399デフォルトの名無しさん
2007/05/13(日) 14:22:23C++の規格に __finally なんてものはない。
0400デフォルトの名無しさん
2007/05/13(日) 15:16:07んじゃC++Builderの話でいいんだね
んで、これ書き方間違ってる?
0401デフォルトの名無しさん
2007/05/13(日) 15:18:57ごめん、独自拡張まわりの仕様なんて知らね。
0402デフォルトの名無しさん
2007/05/13(日) 15:58:550403デフォルトの名無しさん
2007/05/13(日) 16:08:20入ったよ???
#include <iostream>
main()
{
using namespace std;
try
{
try
{
if(1) return 1;
throw;
}
catch(...)
{
cout << "..." << endl;
}
}
__finally
{
cout << "finally" << endl;
}
}
finally
0404デフォルトの名無しさん
2007/05/13(日) 16:45:160405デフォルトの名無しさん
2007/05/14(月) 08:55:09ANSI。
>__try (と__finally)
独自文法に使われている。
しかし、某C++、VC++、gccにはあるみたい
0406デフォルトの名無しさん
2007/05/14(月) 11:03:20C++ならスタックにインスタンス取ればデストラクタを自動的に呼べるが
Delphiはヒープにしかインスタンスが作れない。
だから、確実に解放するにはfinallyの導入が必要。
インスタンスを確実に解放するための仕掛けだから、
例外だろうがreturn だろうがgotoだろうが、ブロックを抜けるなら必ず実行されなければいけない。
0407デフォルトの名無しさん
2007/05/14(月) 11:39:32ぅぅ、やっぱりifのreturnでサックリと関数から抜けちゃって__finally無視されてます・・・
try{
try{
if(1) return;
}
catch(...){
Caption = "catch";
}
}
__finally{
Caption = "finally";
}
ちなみに、C++Builder5 Proです。
0408407
2007/05/14(月) 11:46:210409デフォルトの名無しさん
2007/05/14(月) 11:50:20tryを二重に重ねているからだめなんだろう。
内側のtryブロックにも__finallyを書いたらどうか。
0410407
2007/05/14(月) 11:51:18try{
if(1) return;
}
__finally{
Caption = "finally";
}
以前誰かが↓を最強って言ってたけどなんでうまくいかないのかなあ?
try{
try{}
catch(...){}
}
__finally{}
なにかプロジェクトオプションで設定がいるとかですかね?
0411407
2007/05/14(月) 11:52:52あ、すみません。
それは具体的にはどういうコードになるでしょうか?
0412デフォルトの名無しさん
2007/05/14(月) 11:54:31BCC5.8.2でやったらちゃんと__finallyの部分が実行された。
0413デフォルトの名無しさん
2007/05/14(月) 11:55:33いや、>>409は無視してくれ。
俺の所ではちゃんと__finally節が実行されたわ。
0414407
2007/05/14(月) 11:57:36すんません、C++Builderで議論をお願いします。
0415デフォルトの名無しさん
2007/05/14(月) 12:01:02だからC++Builderでやってるって。何ファビョってんの?
0416407
2007/05/14(月) 12:03:30ブチ切れないで下さい><
0417デフォルトの名無しさん
2007/05/14(月) 12:04:46文法が規定されていない。
対処として、
・try __finallyはC++らしくないので使わない
・try のネストは規定されてないので使わない
じゃね?
0418407
2007/05/14(月) 12:06:19それが正解ですね。
0419デフォルトの名無しさん
2007/05/14(月) 12:09:02catchとの組み合わせまで考えてなかったんだろな。
catch(...) を __except(true) にすれば動作はすると思うよ
0420デフォルトの名無しさん
2007/05/14(月) 12:12:36ちゃんと動くみたいだぞ。
0422デフォルトの名無しさん
2007/05/14(月) 12:28:07>ちゃんと動くみたいだぞ。
規定されてない文法に、ちゃんともちゃんとじゃないも無い。
ANSIがこの領域を定めた時点で、コンパイルエラー扱いになったり、
挙動が変更されるとか、ヤバイだけだよ。
0423デフォルトの名無しさん
2007/05/14(月) 13:38:53ただ、引数で受け取った変数はreturn文でfinallyに入った時に操作しようとすると参照先が無くなっててコケるっぽい。
後処理の中で使用する場合に予め関数内に定義した変数にコピーする必要があった。
0424407
2007/05/14(月) 14:25:58catch(...) を __except(true)にしてやってみました。
確かにreturnで抜けてもちゃんと__finallyに行ったのですが
今度は例外を発生させると「C++ Exception」ってエラーがでます・・・
0425407
2007/05/14(月) 14:33:05例外はthrow 1;で発生させたらC++ Exceptionエラーがでるのですが、
普通?に0除算エラーならちゃんと__excepに入って__finallyに入りました。
これちなみに、わざと例外を発生させたい場合はthrow何て記述すればいいですか?
0426デフォルトの名無しさん
2007/05/14(月) 14:35:240428デフォルトの名無しさん
2007/05/14(月) 21:21:55throw; ってやると受け取った例外を再スローできるのも覚えておいて。
0429407
2007/05/15(火) 09:58:57おはようございます。
え、それは知らなかった・・・
throw;ってやるとそこでエラーが出てたんですよ
だからthrow 1;とかしてた・・・
あ、やばい。この辺の仕様がいまいちわかってない
0430デフォルトの名無しさん
2007/05/15(火) 10:00:44catchの中でやってるんだよね?
それとcatch()の括弧の中も正しく書いてるよね?
0431デフォルトの名無しさん
2007/05/15(火) 10:26:26これなんのエラー?
0432407
2007/05/15(火) 10:35:55いえthrow;はcatchに行かせたくてtryでやってました。
エラーはAbnomal program terminationが出ます・・・
これをthrow 1;とかにするとエラーが出ずにちゃんとcatchに入るのですが・・・
0433デフォルトの名無しさん
2007/05/15(火) 10:39:52の後ろの( ) はどうなってる?
0434407
2007/05/15(火) 10:43:55catch(...){}
ってしてます・・・
0435デフォルトの名無しさん
2007/05/15(火) 10:51:13これじゃ、投げられた例外オブジェクトを、拾ってなくね?
0436407
2007/05/15(火) 10:55:23なんでも拾おうとしてたんですが、普通はこういう使い方はしないもんですか?
0437デフォルトの名無しさん
2007/05/15(火) 11:01:04しません。
何をthrowしたのか受けられないからです。
で、catchってswitch文みたく書けるので、エラーオブジェクトを受ける書き方をして、
該当するところが無かった場合のためにcatch(...)も入れときますがそれはswtich文のdefaultみたいな扱い。
0438407
2007/05/15(火) 11:10:39switch使ってるくせにdefaultのみって感じでしたか・・・
そういう風に言われると確かに意味ないしそんな使い方はしないですよね
はぁ、この辺勉強不足だなあ
気分的には
if (...){
OK
}
else{
ERROR
}
みたいな感じで例外が発生したらオブジェクトが何であろうと全て一括中止処理をと・・・
0439デフォルトの名無しさん
2007/05/15(火) 11:16:40いや、それは正しいんだけど、エラーオブジェクトをキャッチしなきゃ。
catch(...)だとキャッチしてないじゃん。
0440気まぐれアナスイ
2007/05/15(火) 11:17:190441デフォルトの名無しさん
2007/05/15(火) 11:18:58こういう風に、catch(...)は最後の砦。
0442デフォルトの名無しさん
2007/05/15(火) 11:20:49> } catch (Exception &exception) {
で受けなきゃ。
DB系ライブラリとかIndyとかはExceptionクラスを派生したものを投げてくるので、
派生クラスでcatchすれば、もっとエラー情報を取れるお。
■ このスレッドは過去ログ倉庫に格納されています