トップページ⇒tech
946コメント287KB

C++Builder相談室 Part6

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++Builderに関する質問・回答や議論等を行う相談室スレッド。
過去スレ・関連サイトは>>2-10あたり。


0263デフォルトの名無しさんNGNG
>>262
100%そういうのにまわせるわけじゃないだろ
米も味噌も買わにゃならんし、部屋代だってかかるべ
あくまでアルバイトだっていってるじゃん、それも多分単発だろ?
たいした額にゃなるまいて
0264デフォルトの名無しさんNGNG
おじさんが若いころは、そういうバイトそのものが無かったのでアレだが、
普通、開発ツールは発注元が提供するものではないのか?
たぶん、足元見られているんだと思う。
0265デフォルトの名無しさんNGNG
>>248
BCB4で起きてる現象と同じだとすると、
ステータスバーのコンポーネントを使わないでパネルとラベルとかでそれっぽく作る。

ヒントイベントは発生してるのを確認したけどステータスバーに表示されなかった
98/XP(+manifest) = ×
2K/XP = ○
0266デフォルトの名無しさんNGNG
マルチポストになるかもしれませんが...
C++スレで、
C++ではenumの要素数を取得したり、pascalでいう、lowやhiを取れない、
とレスされました。

BCBだと拡張されてて取れる、とかないですか?
0267デフォルトの名無しさんNGNG
できないよ。
0268デフォルトの名無しさんNGNG
>>266
なぜそれが必要なのかが知りたいな
0269266NGNG
あー、ごめん。C++スレで話が続いてるな。
0270266NGNG
Delphi言語で書けて、C++で書けないことってありますよね。
(templateみたいに、逆もあるけど、Delphi言語は、なんか小回りが効くような)

BCBで拡張されてないと、困るような...
0271デフォルトの名無しさんNGNG
LowやHiは別にVCLを使うために必須じゃないから、拡張されてなくても困らないんでない。
0272デフォルトの名無しさんNGNG
BCBでもRTTI で Highに相当する情報はひらえるだろう。それで十分。

そもそもC++では配列の添え字に列挙型を使ったりしないし、出来ない。
それはC++の文化とは合わないしね。
0273デフォルトの名無しさんNGNG
enum { A, B, C };

std::string strs[3];
strs[A] = "AAA";
strs[B] = "AAA";
strs[C] = "AAA";

std::cout << strs[C] << strs[B] << strs[A] << std::endl;
0274デフォルトの名無しさんNGNG
出来ないこたないだろう
0275デフォルトの名無しさんNGNG
かぶた
0276デフォルトの名無しさんNGNG
配列使わずにstd::vector使えとかそういう話?
要素数も取れるし、速度は同じ、メモリ消費は全体でポインタ2,3個分の違い。
0277デフォルトの名無しさんNGNG
>>373
だから Delphi的に配列の添え字に列挙型を使えるとるという意味はさ

enum TABC { A, B, C };
と列挙型を定義したら

int MyArray[ TABC ]; と配列を定義出来て

for( TABC i = TABC.Low() ; i<TABC.High() ; i++) とループして MyArray[i]; とアクセス出来ないと
0278デフォルトの名無しさんNGNG
>>277
とりあえずもちつけ
0279デフォルトの名無しさんNGNG
enum { A, B, C, es=3 };

std::string strs[es];
strs[A] = "AAA";
strs[B] = "AAA";
strs[C] = "AAA";

for(int i=0; i<es; i++)
 std::cout << strs[i] << std::endl;
0280デフォルトの名無しさんNGNG
>>279
enum { A, B, C, SIZE }; でOK
0281デフォルトの名無しさんNGNG
だからさ、
int i; で strs[i] と書いたら文法エラーにならないとさ
0282デフォルトの名無しさんNGNG
すでにenumの話じゃないし
0283デフォルトの名無しさんNGNG
>>270
関数内関数とか、クラス参照型(typeid相当)からのクラスメソッドの多態した呼び出しとか、
messageハンドラとか(BCBのマクロのやつはDispatchをオーバーライドしてる)、
{$L ....obj}をDelphiのユニットに別々に閉じ込めると識別子が重複してもきちんと解決してくれるとか、
externalでインポートライブラリ無しにいきなり.dllを呼べるとか、
\0が途中にある文字列定数を文字列として扱えるとか、implementsとか、そういう話?

ちなみにC++で同じことが書けなくても、間接的に利用さえできればいいので困らない。
後、enumを添え字にした配列より、0以外から始まってる配列の方が辛い気がするぞ。
(templateでどうにでもなるけど)
0284デフォルトの名無しさんNGNG
関数内関数

hoge()
{
struct Func
{
int operator()() { return 500; }
};

cout << Func() << endl;

}
0285デフォルトの名無しさんNGNG
>>284
それって、親のローカル変数に触れる?そこが最大の焦点。
(じゃないと、単に名前空間を解決しただけで機能的には普通の関数)
0286デフォルトの名無しさんNGNG
>>285
んなもん参照渡しすればいいだろ。
0287デフォルトの名無しさんNGNG
hoge()
{
struct Local
{
int nanika, aa[50], b[6];
string moji, iroiro[752];
} local;

struct Func
{
int operator()(Local &local)
{
cout << moji << endl;
return accumlate(aa, aa+50, 0);
}
};

cout << Func(local) << endl;
}

利用するローカル変数が少なければ構造体に詰めないでそのまま参照渡ししても可。
0288デフォルトの名無しさんNGNG
×
int operator()(Local &local)
{
cout << moji << endl;
return accumlate(aa, aa+50, 0);
}

○
int operator()(Local &local)
{
cout << local.moji << endl;
return accumlate(local.aa, local.aa+50, 0);
}
0289デフォルトの名無しさんNGNG
TStringGridで任意の行を非表示できますか?
0290デフォルトの名無しさんNGNG
>>286
Cには、グローバル変数、ローカル変数、の二段階しかないけど、
Pascalは好きなだけネストが可能で、内側からは外側が見えるので、
グローバル変数は単に一番外側の変数に過ぎず、間に層をいっぱい作れるわけだ。
この性質を真似できないと、ちょっと認められないなあ。

これはトップダウン式パーサとか、概念的にもネストした状態を持つものを書く時非常に都合がいい。
0291デフォルトの名無しさんNGNG
そうなんだよね。 関数内関数で外側のローカル変数との処理ってホントどう解決してるのか不思議。
単純に2段ならいいけど3段でしかも再帰してたりすると、実装どうやってるんだろ?
0292デフォルトの名無しさんNGNG
実装は拍子抜けするほど単純ですよ。二通り知ってるけど、

親のEBPの配列を保持する方式

・x86にはenter、leaveという関数内関数を実現するための命令がある

Delphi方式(スタックフレームを利用してEBPのリンクリスト)

・関数内関数を持つ関数(要するに親になる関数)は必ずスタックフレームを作る
・子を呼ぶ時は自分のEBPを隠しパラメータで渡す
・親の変数には [親のEBP + n]
・親の親には、[[親のEBP] + n] 以下同様
・兄弟を呼ぶ時は親のEBPを渡す
・親を呼ぶ時は[親のEBP]にそのまた親のEBPが入っているのでネストの段数差だけ逆にたどって取得、渡す
0293デフォルトの名無しさんNGNG
そうか。 という事は 2段以上にするのはあんまり速度的には良くなさそうだね。
0294デフォルトの名無しさんNGNG
クリティカルな処理でも無い限り別にいいじゃん。
0295デフォルトの名無しさんNGNG
>>292
あなたの言う「enter/leave」と「Delphi方式」って同じものなんですけど。
enter/leave が遅いし融通が利かないから、多くの処理系では同等の複数の命令に
分割しているだけ。

Enter/Leave は、スタックフレームを作る/開放する命令。
作成した EBP とそのチェーンを手繰って、呼び出しもとのスタックフレームを参照するのは
個々のコードの仕事。具体的には EBP のチェーンを参照することになる。
0296デフォルトの名無しさんNGNG
>速度的には良くなさそうだね。
これは真実。

さて。名前(空間)の衝突を考えなければ、親関数のローカル変数と子関数のローカル変数は
同一のストレージにとることができる。スコープと寿命の問題はメモリ実体とは切り離して考
えることができるからね。

本質的にスタックフレームを作らなければいけないのは、直接/間接に再起呼び出しを行う場合
だけだ。ある関数が再帰呼び出しされるかどうか、その結果本質的に同じ名前の変数を複数生成
し、かつ弁別する必要があるかどうかをコードからコンパイラが知ることは非常に困難だ。
だからほとんどの処理系では再帰呼び出しされても大丈夫なようにスタックにフレームをとる。

しかし、現実のアプリケーションにおいて再帰呼び出しが起きることは非常にまれだ。

ということで、意味的にローカル変数であるものをすべてグローバル変数として領域を割り当てる。
もし再帰呼び出しが発生したら、そのときに、古い(ローカル)変数群をスタックに保存。
再帰関数が終了した時点で、スタックから古い変数の値を復元。

という処理系が存在した。ローカル変数をスタックに取らないため、ほとんどすべての変数参照が
絶対アドレス参照となり、再帰使わなくても高速。

0297デフォルトの名無しさんNGNG
>>295
 勘違いしてるカモ

 Delphi方式というのは
  function f1(x:Integer):Integer;
var y:Integer;
  procedure f2;
  begin if x>0 then begin dec(x); f2; end; //2
  end;
begin
  f2; //1
  Result:=y;
end;
とあったとき、
//1では push EBP; call f2 と渡されて この渡された スタックフレームを基準にして x,y を処理する
//2 では f2内部で作ったEBPでなく、この渡された 値をpush してゆく
0298デフォルトの名無しさんNGNG
>>296
キャッシュがあるCPUでは、ローカル変数よりスタックフレームの方が速いかもしれないね。
スタックだと、キャッシュ上で上書きされる率が高く、上書きされたら実際に書き込みをする必要が無くなるから
0299デフォルトの名無しさんNGNG
>>295
enterの場合、例えば三重ネストなら、親のEBP、と、親の親のEBPが、スタックに配列状に置かれる。
あと>>297のようにEBPをパラメータで受け取る必要は無い。enterの値に応じて集めてくれる。

>>296
今だとマルチスレッドがあるから、グローバルに領域を取るとまずいかもね
0300デフォルトの名無しさんNGNG
コンストラクタとOnCreate、デストラクタとOnDestroyの違いがよくわかりません。
どういう違いがあり、どう使い分ければいいでしょうか?
0301_NGNG
http://homepage.mac.com/hiroyuki44/
0302デフォルトの名無しさんNGNG
>>300
C++の場合、virtual関数を多態して呼びたい時は、OnCreate/OnDestroyかな。
0303デフォルトの名無しさんNGNG
コンストラクタに記述すると、そのクラスの動作を変更したわけだから、
すべてのインスタンスで有効になる。
OnCreate に記述すると、イベントだから、インスタンス毎に異なる動作を
記述できる。

違いはこれでわかるかな?
0304デフォルトの名無しさんNGNG
win2kとwinNT4でまったく同じプロジェクトをコンパイルしても
win2kのほうが20Kくらい大きいexeが出来上がるのですが、
そういうものなのでしょうか?
0305デフォルトの名無しさんNGNG
CBuilder で NT4 での動作保証していたのってバージョンいくつまでだっけ?
>>304 そういった話を聞いたことはありませんが、.map を出してみて比較すると
自己解決するのではないかと。
おそらくは何かコンパイルオプションが食い違っているのではないかと。
0306デフォルトの名無しさんNGNG
void unc(double t)

 中略

void func(double t)
{
if(RadioButton1->Checked == true ) {
中略
}

って関数作っても
[C++ エラー] Unit1.cpp(162): E2451 未定義のシンボル RadioButton1
です
ほかのところではRadioButton1はちゃんと読めてるみたいなんだけど
自分で勝手に作った関数じゃうまく動いてくれない
何が考え方おかしいの、どうすりゃ動いてくれるかな、help me

BCCでつくったのをBCB6に移植しようとしてます
0307デフォルトの名無しさんNGNG
>>306
RadioButton1はどっかのフォームのメンバ変数じゃないの?
そのフォームクラスに所属してない関数からならアクセスできるわけないが。
0308デフォルトの名無しさんNGNG
Form1->RadioButton1->Checked 〜
0309デフォルトの名無しさんNGNG
>>307
class TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
   TRadioButton *RadioButton1;
以下略

unit1.hでこんな風に宣言されてる
俺が作ったfuncという関数はこのフォームクラスに所属してないの?
どうすれば所属させられる?
0310デフォルトの名無しさんNGNG
>>308
さんくす、超出来たっぽい
ありがとございます
0311デフォルトの名無しさんNGNG
DB〜というコンポーネントなんですが
これって使用する際はDBのセッションを開きっぱなしにしないといけないのですが?
DBをクローズすると内容とかなくなっちゃいますよね?
0312デフォルトの名無しさんNGNG
コンポーネントの新規作成で、TIBQueryを派生させて、
MyQuery->SQL->Text = "select * from ATABLE";
みたいなことすると、「Empty query.」という変なエラーがでます。
それも、MyQuery->SQLをTStrings*でdynamic_castしてもOKだし、
Strings->Clear(); Strings->Add(Ssql);とすると、Addで同エラー。
すげー変。
0313312NGNG
それも、同じソースの場所で、
TIBQueryを素で使って同じことをすると、何も起こりません。

みなさんも試してみて下さい。
0314デフォルトの名無しさんNGNG
>>313
ソース追ってみたら?
0315312NGNG
コンポーネントの新規作成せずに、TIBQueryの空の派生、つまり名前を変えるだけの派生をすると、
newしているところで、
>[C++ エラー] : E2125 コンパイラは 'default constructor' クラスの を作成できない
というような、エラーとなります。
コンストラクタが消える???

ちなみにBCB6でつ。
0316312NGNG
>>314
ソース追った結果が、TIBQuery->SQLの実態はTStrings*でつ。
また、dynamic_castでも、それが正しいという結果です。
VCLの中をデバッグしようとすると、汗画面に飛びます。
0317デフォルトの名無しさんNGNG
>>316
ソース見ると、OnChangeに代入してるQueryChangedが呼ばれてるはずということもわかるね
0318デフォルトの名無しさんNGNG
>>315
親が引数をとるコンストラクタしか持ってないから、
派生したクラスでコンストラクタを省略することは出来ないよ。
0319312NGNG
>>318
はつみみですた。
>>317
確かに、
>TStringList(SQL).OnChange := QueryChanged;
こういう行ありますね。
ウワーン何が起こってるのか分からないYO〜
0320デフォルトの名無しさんNGNG
>>319
だからTStringListはOnChangeにコールバックが設定されていると
内容の変更があったときにそれを呼んでくれるの。
だからエラーはそのコールバック(設定されているTIBQuery.QueryChanged)の
中で起きてるんでしょう。
ってその中でブレークポイントとかって設定できないんだっけ?
<BCBは最近使ってないのでスマソ
0321320NGNG
>>320
プロジェクトオプションのリンカタブで
デバッグライブラリを使う(D)
をチェックしとけばデバッガで中を追えるはずか。
0322312NGNG
VCLデバッグはしてますが、ブレイクポイント無いと、汗画面でした。

>procedure TIBQuery.QueryChanged(Sender: TObject);
>var
> List: TParams;
>begin
> if not (csReading in ComponentState) then
> begin
> Disconnect;

ここでエラー起こしてます。
Disconnectなんてされても困るな...
0323312NGNG
もう一つ分からないのが、派生前と派生後(名前変えただけ...)で動作が違うのは???
0324デフォルトの名無しさんNGNG
どう違うの
0325312NGNG
>>324
派生しない場合も、Disconnectの中に入ってました。

で、派生後クラスのDisconnectの中に入ると、
>function TIBCustomDataSet.PSGetTableName: string;
>begin
>// if not FInternalPrepared then
>// InternalPrepare;
> { It is possible for the FQSelectSQL to be unprepared
> with FInternalPreprepared being true (see DoBeforeTransactionEnd).
> So check the Prepared of the SelectSQL instead }
> if not FQSelect.Prepared then
> FQSelect.Prepare;
ここに飛んで落ちます。
0326312NGNG
それも、F7を押した瞬間、Disconnectメソッドに飛ばずに、
「TIBCustomDataSet.PSGetTableName」に入るので、???です。
0327デフォルトの名無しさんNGNG
これインストールしたときなんか向こうの鯖にアクセスしてたんだけど、これってXPのアクティベーションみたいなやつ?
一本のソフトで複数のコンピュータに入れることは出来ないの?
0328デフォルトの名無しさんNGNG
>>327
できます。
0329デフォルトの名無しさんNGNG
OleVariant() ってもしかしてやばい?
MSComm取り込んで、MSComm->Output=OelVariant(AnsiString hoge);
とかやると、リークしまくるのだが。
0330デフォルトの名無しさんNGNG
>>328
わかりました、ありがと
0331  NGNG
C++Builder6で使用している Direct X のバージョンは?
ボーランドのサイトではC++Builder3までしか書いてないので教えてください。
0332デフォルトの名無しさんNGNG
>>331
意味不明
0333デフォルトの名無しさんNGNG
最初から入ってるのは7.0かな。
0334331NGNG
新たにDirectXSDKをインストールしなくてもプログラムをコンパイルできるのはってことでした。
>>333
ありがとう。
0335312NGNG
ibquery.pasで、
>TStringList(SQL).OnChange := QueryChanged;
こんなキャストがあるけど、これって大丈夫なのかな?
0336デフォルトの名無しさんNGNG
>>335
FSQLを設定する部分でしっかりTStringListしか入れないようにさえなってれば
大丈夫でしょ。
0337312NGNG
その通りでした。>>336
>FSQL := TStringList.Create;
になってますね。

ところで、
>constructor TIBQuery.Create(AOwner: TComponent);
を派生した場合は、派生したメソッドで
TIBQuery::Create
をコールする必要とかありましたっけ?
BCBからVCL派生はやっぱ慣れないと分からない部分とかありますよね。
0338デフォルトの名無しさんNGNG
必要というか、親のコンストラクタは、初期化リストで呼んでるでそ?
0339312NGNG
じゃ、不要ですか。>>338

「派生前と派生後(名前変えただけ...)で動作が違う」原因が分からないと、気持ち悪いよ。
というか、開発進むと行き詰まりそう。
0340デフォルトの名無しさんNGNG
は?
引数付きのコンストラクタは初期化リストでしか呼べないし、
引数付きのコンストラクタしかないクラスから派生したクラスは、
初期化リストで初期化しなきゃエラーだろ。

動作が違うとしたら「デフォルトコンストラクタが呼ばれてる」だけだから。
0341312NGNG
あ、読み間違えちゃった。 >>338 >>340

つまり、派生後のコンストラクタで、
TIBQuery::Create(AOwner: TComponent);
をコールすれば良い?
0342デフォルトの名無しさんNGNG
まず、「初期化リスト」という単語を知っている?

だいたい、ObjectPascalのコンストラクタは
C++から通常の関数のように明示的にCreateで呼び出せるの?
delphiでもinherited使うしかないんじゃなかった?
0343デフォルトの名無しさんNGNG
仮に呼び出せたとしても、
「デフォルトコンストラクタ」と「引数付きコンストラクタ」の両方を呼び出して
正常に動くとはとても思えないけど。
0344312NGNG
>>342-343
Delphiのinheritedを行うために、「TIBQuery::TIBQuery(Owner);」と書くのかな、
と思ってたんだけど違うの?

実行させても動作しないから違うみたいだね...
0345デフォルトの名無しさんNGNG
__fastcall TMyQuery::TMyQuery(TComponent* owner) : TIBQuery(owner)
{
}
こうなってれば他に特に何もしなくていいということでそ。
>>325の動作が違うって件は、わからないけど。
0346デフォルトの名無しさんNGNG
Visual C++とBCBってどれくらい違うの?
0347デフォルトの名無しさんNGNG
Borland C++ Builder 6.0 のランタイムをインストールしないでも動くようなexeファイルって作れない?
無理?
0348デフォルトの名無しさんNGNG
>>346
VC=C++ Onlyで開発できる。
BCB=Pascalが必要な上にC++と互換性がない拡張がなされている。
0349デフォルトの名無しさんNGNG
>>348
VCの方がよく見えるのですけど
0350デフォルトの名無しさんNGNG
じゃあVC使えばいい
0351デフォルトの名無しさんNGNG
>>347
できる
0352デフォルトの名無しさんNGNG
>>348
VC =C++ Onlyでしか開発できない。Visualという名前に負けている。
BCB=C++のみでも可能だが、DelphiのVCLを利用してVisualにGUI開発が出来る
0353デフォルトの名無しさんNGNG
>>351
どうやるのですか、ご教授してください
0354デフォルトの名無しさんNGNG
>>352
BCBの方がよく見えるのですけど
0355デフォルトの名無しさんNGNG
>>353
ヘルプで パッケージ のキーワードのところを順に見てけばそのうち判ると思うよ
0356デフォルトの名無しさんNGNG
>>353
プロジェクトオプションを開く
リンカタブの「共有 RTL DLL を使う」のチェックを外す
パッケージタブの「実行時パッケージを使って構築」のチェックを外す
0357デフォルトの名無しさんNGNG
>>355
thanks

>>356
どうもありがとうっ!
ファイルサイズかなりでかくなったけど出来たよ
0358デフォルトの名無しさんNGNG
>354

じゃあBCB使えばいい
0359312NGNG
度々すみませんが、「派生前と派生後(名前変えただけ...)で動作が違う」原因というかバグを把握しないと、コンパイラとして不安があるなと思ってます。

BCBオタの皆さんも312の内容を試してみて頂けないでしょうか?
0360デフォルトの名無しさんNGNG
>>359
>BCBオタの皆さん

こんな書き方すると荒らし扱いされるぞ
気をつけな
0361デフォルトの名無しさんNGNG
InterBaseインストールしてないや
0362デフォルトの名無しさんNGNG
リソースファイル(*.rc)にBMP以外の画像を埋め込みたいんですが
なぜか成功しませぬ。

[sample.rc]
RC_TITLE001 BITMAP "title.bmp"
RC_CHAR001 PNG "stand001_all.png"
RC_BM001_1 JPEG "back_test0_big.jpg"

ファイル名を直接指定した場合は描画できるんですけど
リソースIDでやった場合、BMP以外は描画不能。

ユーザに直接画像を覗かれない方法があったら教えてママン(´・ω・`)
■ このスレッドは過去ログ倉庫に格納されています