トップページ⇒tech
1001コメント292KB

C++Builder相談室 Part17

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/08(水) 02:01:27
C++Builderに関する質問・回答や議論等を行う相談室スレッド。

【前スレ】
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
0357デフォルトの名無しさん2007/04/23(月) 08:25:34
>>356
SDKスタイルに固執するというよりも、
VCしかつかったことがないので、VCLに置き換える方法がわかってないのだと思います。
理解できれば、もっと楽に組めそうな気がするのですが。
VCL的スタイルをもう少し調べてみます。
アドバイスありがとうございます。


0358デフォルトの名無しさん2007/04/23(月) 08:31:30
>>357 回り道に思えても、Delphiを使ってみると理解が早いかもね

WM_PAINT の処理を書きたいのなら、BCBの場合は
パネルを貼り、その上にSystemタブのPaintBoxを貼り、
貼ったPaintBoxをダブルクリックして ソコに書けばいい
0359デフォルトの名無しさん2007/04/23(月) 22:29:42
>>358
その方法で思った通りの実装ができました
おつきあいくださり、ありがとうございました。
勉強になりました。
0360デフォルトの名無しさん2007/04/26(木) 13:06:37
過去ログを漁ってみたのですが、少なくともよう見つけられなかったので教えてください。
BDS2006で作っているプログラムを何度かコンパイルしていると、あるときから急に
「[C++ エラー] Sysconst.hpp(24): E2316 'ResourceString' は 'System' のメンバーではない」
「[C++ エラー] Sysconst.hpp(24): E2040 宣言が正しく終了していない」
というエラーが大量に出るようになってしまいました。
エラーが出る直前(と思われる)の内容に書き戻してみても結果は変わりません。

ネットで調べると、プロジェクトの作り直しで直るとの情報があったのですが、結果は変わりませんでした。
includeの順番によっては出るという情報もあったのですが、正常に動いている別プログラムと比べても違いを
確認できませんでした。

回避方法がわかる方がおられたら教えてください。
よろしくお願いします。
0361デフォルトの名無しさん2007/04/26(木) 13:08:22
>>360
それだけの情報で原因が分かったらエスパーだよ。
「ある時から急に」じゃなくて絶対にソースに何か手を加えたな。
0362デフォルトの名無しさん2007/04/26(木) 13:23:02
C++Builder1のTListViewのListItemの入れ替え方法を教えてください。
1ってListItemにAssignは無いんですよね・・・
0363デフォルトの名無しさん2007/04/26(木) 13:27:34
>>361
すみません、「コンパイルしていると」の手前に「修正しながら」という言葉をつけるのを忘れてました・・・。
ただ、短いプログラムとはいえ5000行程度あるので、それをすべてここに記載するのは難しいですし、
CPPファイルのイベントハンドラの中しか触っていないのに、Sysconst.hppがエラーを吐くようになるのは
単純にソースを触ったということとは別の、何か原因があるのでは?と思って質問した次第です。
0364デフォルトの名無しさん2007/04/26(木) 13:28:54
>>363
今言えるのはclass ResourceString が正しく宣言されてないと
いう事だけだ。
0365360=3632007/04/26(木) 14:40:27
すみません。
理由が判明しました。
フォームのひとつにSEARCH.cppという名前のものを作っていたのですが、
このファイルのヘッダファイルをインクルードしたとき、includeフォルダ内の
search.hを見に行っていたのが原因でした。
そのため、SEARCH.cppの名前を変更することでエラーが発生しなくなりました。
なぜ急にincludeフォルダのほうを見に行ったのかは謎のままですが・・・。
0366デフォルトの名無しさん2007/04/26(木) 18:01:29
#include <search.h>
#include "search.h"

書き方を間違えたとか
0367360=3632007/04/27(金) 13:38:14
>>366
残念ながら、そこまでおばかではなかったです。
それにしても、何で急に別ファイルを見に行ったか気になるところではありますね。
search.hなんてわかりやすいのはともかく、includeフォルダ内のファイルを全部洗って、それにかぶらない名前を
つけないといけないなんて面倒でしょうがないですし。
0368デフォルトの名無しさん2007/04/27(金) 14:08:11
それがC/C++の一番ダメな所だな。 名前空間を作ったって、肝心の所がダメなまま
0369デフォルトの名無しさん2007/04/27(金) 21:14:26
>>367
宣言の順番で変わったりするし、何か別のincludeファイルを追加したとか
0370デフォルトの名無しさん2007/05/05(土) 13:03:38
StringGrid の行をプログラム実行中に動かせるようにしたく,暫く前までは
オブジェクトインスペクタ の goRowMoving を true にすることによって問題
なくできていたのですが,プログラムの他の部分を弄っている間に動かせなく
なくなりました。新規の Form1 に 1個の StringGrid だけを置いたプロジェク
トで試してみましたが,同樣に駄目です。因みに goRowSelect, goEditing
などは false→true で可能です。原因が分りません。どなたか教えて下されば
幸です。
0371デフォルトの名無しさん2007/05/05(土) 13:05:29
>>370
プリコンパイルヘッダを消せ。
0372デフォルトの名無しさん2007/05/05(土) 13:59:59
>370 です。
>371 さんの仰せは「プロジェクト/オプション」で「プリコンパイルヘッダ」
の「使用しない」をチェックすることで宜しいのでしょうか。そうしてみました
が,(テスト用プロジェクトでも)上手くゆきません。
0373デフォルトの名無しさん2007/05/05(土) 14:04:37
>>372
ちがうお
そこはチェックのままでいいお

BINフォルダを開いて、中にあるbc32def.#nnとかbc32def.csmという
ファイルを消すお

それからLIBフォルダを開いてVCL何とかというタイムスタンプが最新の
ファイルも消すお
0374デフォルトの名無しさん2007/05/05(土) 15:49:01
>>373
原因は別のところにありました。同じ質問とそれに対する解答は
http://www.tek-tips.com/viewthread.cfm?qid=907480
にあり,拙生の場合も Fixed Cols の値がゼロになってました。
(StringGrid を配置した時点では fixed column が2列設けてあったのですが,
後に迂闊に消したのを気付かないでいました。)
有難うございました。
0375デフォルトの名無しさん2007/05/07(月) 21:48:49
Vistaに移行しようかと思ってるんだが
BCB6ってVistaで不具合ある?
0376デフォルトの名無しさん2007/05/07(月) 23:04:37
>>375
ttp://pc11.2ch.net/test/read.cgi/tech/1171498766/1-2
0377デフォルトの名無しさん2007/05/08(火) 00:05:59
>>376
thx.
やっぱだめなのか・・・。
0378デフォルトの名無しさん2007/05/08(火) 00:21:40
ググってみりゃわかるが、全く動かないわけじゃないみたいよ。
0379デフォルトの名無しさん2007/05/08(火) 18:40:19
どうしてもダメなら
http://www.microsoft.com/japan/windows/virtualpc/default.mspx
コレでWin98でも動かせばいいと思う
0380デフォルトの名無しさん2007/05/09(水) 08:25:25
WININETを使ってBCB5で作ったアプリがIE7で動作しなくなった。
LIBファイルを作り直したら動作する様になったのだが、こんどはIE6で動作しなくなった。
2種類準備すべきなんだろうか?
0381デフォルトの名無しさん2007/05/09(水) 08:46:27
wininet.dll の静的リンクをやめて、動的なリンクにしたらどう?
03823802007/05/09(水) 17:50:03
>>381
やっぱりそうするしかないのか。ちょっと面倒だ。
0383デフォルトの名無しさん2007/05/09(水) 17:59:19
同じ名前で関数ポインタにするだけじゃない。 正規置換で修正したらそんなに手間じゃないさ
0384デフォルトの名無しさん2007/05/09(水) 18:14:13
そんな問題じゃないんですよ馬鹿ごみ
03853832007/05/09(水) 18:23:47
動的リンクするパスカルユニット見つけたから、これを使えばもっと簡単だよ
http://www.skybound.nl/products/delphi/
0386デフォルトの名無しさん2007/05/10(木) 19:01:49
TTableでレコード追加する時にTVarRecにTDateTimeを指定するとエラーになるのですが
TDateTime型はどのように追加したらいいのでしょうか?
03873802007/05/10(木) 20:55:24
>>385
使ってみたけどエラー取れるまで時間がかかりそうだ。
0388デフォルトの名無しさん2007/05/11(金) 15:25:25
FormのResizeをするとき、マウスのボタンを離すまでResizeを抑制するにはどうすればいいのでしょう?
ResizeってFormの端っこをつまみますが、それってWindowsMessageじゃ取れないんですよね。
0389デフォルトの名無しさん2007/05/11(金) 18:38:48
TQueryでAppendRecordをすると書き込み禁止エラーがでるのですが
どこを設定すると書き込みできるようになりますか?
0390デフォルトの名無しさん2007/05/11(金) 19:15:14
>>386
レコード追加は INSERT SQLの方がよくね?
もしくは TQuery + TUpdateSQLの組み合わせ。

>>389
RequestLiveを Trueに。
0391デフォルトの名無しさん2007/05/11(金) 19:19:57
>>390
ありがとうございます!
RequestLiveを Trueで正常に書き込みができました。
ところで質問なのですが、
TQueryならSQLを使うべきですか?
AppendRecordを使っても特に問題はないですよね?
まだDBは不慣れで何をどう使っていいのやらわかっていなくて・・・
0392デフォルトの名無しさん2007/05/11(金) 19:28:10
TQuery+TUpdateSQLの組み合わせの方が
どんなSQLが流れてるか確認できるからいい。
あと、複数のテーブルをジョインしている場合でも
追加や編集、削除ができる。

あ、それからデータベースがOracleとかだと、
Appendや Editがたまにうまくいかないことがあった。
0393デフォルトの名無しさん2007/05/11(金) 19:29:47
TUpdateSQLの使い方については以下のページをどぞ。
Delphiだけど。
ttp://www.wwlnk.com/boheme/delphi/dbtips/css0350.htm
0394デフォルトの名無しさん2007/05/11(金) 19:44:09
>>392-393
ありがとうございます。
そのサイトで勉強してみます!
ちなみにDBはMySQLを使ってます。
0395デフォルトの名無しさん2007/05/11(金) 22:10:15
TurboC++で何か作る度にLibフォルダにvcl100.#00とかvcl100.#0Aとか
増殖してるんだけど、これプリコンパイルヘッダとかいうやつですか?
0396デフォルトの名無しさん2007/05/11(金) 22:14:50
>>395
そうです。タイムスタンプも新しいだろ?
実際時々プリコンパイルヘッダは壊れる事があるので定期的に削除を
お勧めする。*.csmというのもプリコンパイルヘッダ。
0397デフォルトの名無しさん2007/05/11(金) 22:45:52
>>396
ありがとう
csmが数十メガとかなってた
0398デフォルトの名無しさん2007/05/13(日) 12:45:09
ちょっとC++の話になるかもですが
try{
 try{
  if( ...) return false;
 }
 catch(...){
 }
}
__finally{
}
return true;

これってtryのifでreturnしたら__finallyに入らないんですが書き方間違ってますか?
0399デフォルトの名無しさん2007/05/13(日) 14:22:23
>>398
C++の規格に __finally なんてものはない。
0400デフォルトの名無しさん2007/05/13(日) 15:16:07
>>399
んじゃC++Builderの話でいいんだね
んで、これ書き方間違ってる?
0401デフォルトの名無しさん2007/05/13(日) 15:18:57
>>400
ごめん、独自拡張まわりの仕様なんて知らね。
0402デフォルトの名無しさん2007/05/13(日) 15:58:55
おいおい、ここのスレタイを嫁w
0403デフォルトの名無しさん2007/05/13(日) 16:08:20
>>398
入ったよ???
#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:16
try と __try に違いはあるんですか?
0405デフォルトの名無しさん2007/05/14(月) 08:55:09
>try

ANSI。

>__try (と__finally)

独自文法に使われている。
しかし、某C++、VC++、gccにはあるみたい
0406デフォルトの名無しさん2007/05/14(月) 11:03:20
BCBでの__finally は パスカルユニットを使うのに必要だから導入したのだろ
C++ならスタックにインスタンス取ればデストラクタを自動的に呼べるが
Delphiはヒープにしかインスタンスが作れない。
だから、確実に解放するにはfinallyの導入が必要。

インスタンスを確実に解放するための仕掛けだから、
例外だろうがreturn だろうがgotoだろうが、ブロックを抜けるなら必ず実行されなければいけない。
0407デフォルトの名無しさん2007/05/14(月) 11:39:32
>>403
ぅぅ、やっぱりifのreturnでサックリと関数から抜けちゃって__finally無視されてます・・・
try{
 try{
  if(1) return;
 }
 catch(...){
  Caption = "catch";
 }
}
__finally{
 Caption = "finally";
}
ちなみに、C++Builder5 Proです。
04084072007/05/14(月) 11:46:21
ちなみに、tryの中でreturnではなくて例外でcatchを通るとちゃんと__finallyに入ります
0409デフォルトの名無しさん2007/05/14(月) 11:50:20
>>407
tryを二重に重ねているからだめなんだろう。
内側のtryブロックにも__finallyを書いたらどうか。
04104072007/05/14(月) 11:51:18
さらにちなみに↓の場合でも__finallyに入ってくれます。
try{
 if(1) return;
}
__finally{
 Caption = "finally";
}

以前誰かが↓を最強って言ってたけどなんでうまくいかないのかなあ?
try{
try{}
catch(...){}
}
__finally{}
なにかプロジェクトオプションで設定がいるとかですかね?
04114072007/05/14(月) 11:52:52
>>409
あ、すみません。
それは具体的にはどういうコードになるでしょうか?
0412デフォルトの名無しさん2007/05/14(月) 11:54:31
>>408
BCC5.8.2でやったらちゃんと__finallyの部分が実行された。
0413デフォルトの名無しさん2007/05/14(月) 11:55:33
>>411
いや、>>409は無視してくれ。
俺の所ではちゃんと__finally節が実行されたわ。
04144072007/05/14(月) 11:57:36
>>412-413
すんません、C++Builderで議論をお願いします。
0415デフォルトの名無しさん2007/05/14(月) 12:01:02
>>414
だからC++Builderでやってるって。何ファビョってんの?
04164072007/05/14(月) 12:03:30
>>415
ブチ切れないで下さい><
0417デフォルトの名無しさん2007/05/14(月) 12:04:46
つまり、try __finallyが1つあって、かつtryがネストになってる場合は、
文法が規定されていない。

対処として、
・try __finallyはC++らしくないので使わない
・try のネストは規定されてないので使わない
じゃね?
04184072007/05/14(月) 12:06:19
>>417
それが正解ですね。
0419デフォルトの名無しさん2007/05/14(月) 12:09:02
Delphiからの移植の為だから、
catchとの組み合わせまで考えてなかったんだろな。

catch(...) を __except(true) にすれば動作はすると思うよ
0420デフォルトの名無しさん2007/05/14(月) 12:12:36
BCB5までは動作がおかしいんかな。BCB6とBDS2006では
ちゃんと動くみたいだぞ。
04214072007/05/14(月) 12:13:52
>>419
でもreturnじゃなくて例外ではちゃんといきましたよ。

>>420
BCB6で試してみます。
0422デフォルトの名無しさん2007/05/14(月) 12:28:07
>>420
>ちゃんと動くみたいだぞ。

規定されてない文法に、ちゃんともちゃんとじゃないも無い。

ANSIがこの領域を定めた時点で、コンパイルエラー扱いになったり、
挙動が変更されるとか、ヤバイだけだよ。
0423デフォルトの名無しさん2007/05/14(月) 13:38:53
BCB6にてtry-catchとtry-finallyを5〜6重で使いまくってますが正常に動いてますよ。

ただ、引数で受け取った変数はreturn文でfinallyに入った時に操作しようとすると参照先が無くなっててコケるっぽい。
後処理の中で使用する場合に予め関数内に定義した変数にコピーする必要があった。
04244072007/05/14(月) 14:25:58
>>419
catch(...) を __except(true)にしてやってみました。
確かにreturnで抜けてもちゃんと__finallyに行ったのですが
今度は例外を発生させると「C++ Exception」ってエラーがでます・・・
04254072007/05/14(月) 14:33:05
あ、補足。

例外はthrow 1;で発生させたらC++ Exceptionエラーがでるのですが、
普通?に0除算エラーならちゃんと__excepに入って__finallyに入りました。
これちなみに、わざと例外を発生させたい場合はthrow何て記述すればいいですか?
0426デフォルトの名無しさん2007/05/14(月) 14:35:24
throw Exception("わざと");
04274072007/05/14(月) 14:41:00
>>419、>>426
激しく感謝です!!!
これでやっと思い通りのあれになりました!

色々教えてくれた皆さんに感謝です^^
0428デフォルトの名無しさん2007/05/14(月) 21:21:55
>>427
throw; ってやると受け取った例外を再スローできるのも覚えておいて。
04294072007/05/15(火) 09:58:57
>>428
おはようございます。
え、それは知らなかった・・・
throw;ってやるとそこでエラーが出てたんですよ
だからthrow 1;とかしてた・・・
あ、やばい。この辺の仕様がいまいちわかってない
0430デフォルトの名無しさん2007/05/15(火) 10:00:44
>throw;ってやるとそこでエラーが出てたんですよ

catchの中でやってるんだよね?
それとcatch()の括弧の中も正しく書いてるよね?
0431デフォルトの名無しさん2007/05/15(火) 10:26:26
make***[]Error
これなんのエラー?
04324072007/05/15(火) 10:35:55
>>430-431
いえthrow;はcatchに行かせたくてtryでやってました。
エラーはAbnomal program terminationが出ます・・・
これをthrow 1;とかにするとエラーが出ずにちゃんとcatchに入るのですが・・・
0433デフォルトの名無しさん2007/05/15(火) 10:39:52
>catch

の後ろの( ) はどうなってる?
04344072007/05/15(火) 10:43:55
>>433
catch(...){}
ってしてます・・・
0435デフォルトの名無しさん2007/05/15(火) 10:51:13
>catch(...){}

これじゃ、投げられた例外オブジェクトを、拾ってなくね?
04364072007/05/15(火) 10:55:23
とにかく例外が発生したらそこで止めようと思っていたので
なんでも拾おうとしてたんですが、普通はこういう使い方はしないもんですか?
0437デフォルトの名無しさん2007/05/15(火) 11:01:04
>普通はこういう使い方はしないもんですか?

しません。
何をthrowしたのか受けられないからです。
で、catchってswitch文みたく書けるので、エラーオブジェクトを受ける書き方をして、
該当するところが無かった場合のためにcatch(...)も入れときますがそれはswtich文のdefaultみたいな扱い。
04384072007/05/15(火) 11:10:39
なるほど・・
switch使ってるくせにdefaultのみって感じでしたか・・・
そういう風に言われると確かに意味ないしそんな使い方はしないですよね
はぁ、この辺勉強不足だなあ
気分的には
if (...){
OK
}
else{
ERROR
}
みたいな感じで例外が発生したらオブジェクトが何であろうと全て一括中止処理をと・・・
0439デフォルトの名無しさん2007/05/15(火) 11:16:40
>例外が発生したらオブジェクトが何であろうと全て一括中止処理をと・・・

いや、それは正しいんだけど、エラーオブジェクトをキャッチしなきゃ。
catch(...)だとキャッチしてないじゃん。
0440気まぐれアナスイ2007/05/15(火) 11:17:19
此処ではerror.の出力を教えないのですね?
0441デフォルトの名無しさん2007/05/15(火) 11:18:58
ttp://www5c.biglobe.ne.jp/~ecb/cpp/03_07.html

こういう風に、catch(...)は最後の砦。
0442デフォルトの名無しさん2007/05/15(火) 11:20:49
で、VCLが投げてくるエラーは先ず、
> } catch (Exception &exception) {
で受けなきゃ。

DB系ライブラリとかIndyとかはExceptionクラスを派生したものを投げてくるので、
派生クラスでcatchすれば、もっとエラー情報を取れるお。
0443気まぐれアナスイ2007/05/15(火) 11:21:24
>>440『続』
error.出力を提示して貰った方が分かり易そうです、ね?
04444072007/05/15(火) 11:22:44
>>439
あ、catchに入ればそれでいいとおもっておりました・・・

>>441
参考にさせていただきます。
04454072007/05/15(火) 11:25:18
>>442
なるほど、それで故意に例外を発生させたい場合は>>426でやるってことですね?
0446デフォルトの名無しさん2007/05/15(火) 11:26:16
> } catch (Exception &exception) {

で受けとけば、
exception.Message
にエラーの内容が入ってるんだよ。

VCLがセットした論理的なエラーメッセージの場合もあるし、
Win32APIのエラーコードからエラー文字列を設定している場合もあるし。

だから、exception.Messageを書かずに、BCBスレで質問すること自体反則!
0447デフォルトの名無しさん2007/05/15(火) 11:27:22
>>445
>throw Exception("わざと");
を
> } catch (Exception &exception) {
で受けると、
>exception.Message
の中身は、"わざと"。
0448デフォルトの名無しさん2007/05/15(火) 11:28:51
で、
> } catch (Exception &exception) {
の中で、throw; と書くと、exceptionを投げることになるが、
> } catch (...) {
て書いたって投げるもん無いやん。
あえて言えば、throw NULL; になってるかも。
0449気まぐれアナスイ2007/05/15(火) 11:32:07
>>446
なるほど?
つまり、
>}catch(exception&exception){
取り除く訳ですか?
04504072007/05/15(火) 11:35:27
>>446-447
今Exceptionのヘルプみました。
Messageプロパティにメッセージ入ってました。

>>448
えっと根本が間違ってるかもしれませんが
catch (...)と記述すると投げるものがなくてもcatchに入るので(catch内ではオブジェクトの評価はしない)
とにかくエラーはreturnで返して処理を中止って発想でした
0451デフォルトの名無しさん2007/05/15(火) 17:52:06
誰か…>>388に答えて…
0452デフォルトの名無しさん2007/05/15(火) 18:37:12
>>451
サイズを変更できないウィンドウにしておいて、
プログラムでサイズを変更するようにすればいんじゃね?
0453デフォルトの名無しさん2007/05/15(火) 20:30:06
>>451
どういう状況なのかイマイチ分からんのだが
サイズ変更を抑制してたらどれくらい変更するのか決められないじゃないか
0454デフォルトの名無しさん2007/05/15(火) 21:00:09
WM_ENTERSIZEMOVE, WM_ENTERSIZEMOVEあたりが思い浮かんだ
0455本田2007/05/15(火) 23:36:27
>New C++ IDE from CodeGear^(TM) Brings Rapid Application Development to Windows Vista^(TM)
http://www.codegear.com/article/36464/
>SCOTTS VALLEY, Calif. - May 14, 2007 - CodeGear, a leader in developer tools,
> today announced C++Builder? 2007 -
>the world's only native C++ rapid application development (RAD) integrated development environment (IDE) for Microsoft? Windows.
>C++Builder 2007 provides support for Microsoft Windows Vista,
>enabling developers to seamlessly upgrade existing C++ applications to support Vista
> and rapidly build new Windows applications that take advantage of the new Vista Aero user interfaces.
0456388=4512007/05/16(水) 10:18:39
>>454
SplThx!
■ このスレッドは過去ログ倉庫に格納されています