C++Builder相談室 Part6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG過去スレ・関連サイトは>>2-10あたり。
0263デフォルトの名無しさん
NGNG100%そういうのにまわせるわけじゃないだろ
米も味噌も買わにゃならんし、部屋代だってかかるべ
あくまでアルバイトだっていってるじゃん、それも多分単発だろ?
たいした額にゃなるまいて
0264デフォルトの名無しさん
NGNG普通、開発ツールは発注元が提供するものではないのか?
たぶん、足元見られているんだと思う。
0265デフォルトの名無しさん
NGNGBCB4で起きてる現象と同じだとすると、
ステータスバーのコンポーネントを使わないでパネルとラベルとかでそれっぽく作る。
ヒントイベントは発生してるのを確認したけどステータスバーに表示されなかった
98/XP(+manifest) = ×
2K/XP = ○
0266デフォルトの名無しさん
NGNGC++スレで、
C++ではenumの要素数を取得したり、pascalでいう、lowやhiを取れない、
とレスされました。
BCBだと拡張されてて取れる、とかないですか?
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNGなぜそれが必要なのかが知りたいな
0269266
NGNG0270266
NGNG(templateみたいに、逆もあるけど、Delphi言語は、なんか小回りが効くような)
BCBで拡張されてないと、困るような...
0271デフォルトの名無しさん
NGNG0272デフォルトの名無しさん
NGNGそもそもC++では配列の添え字に列挙型を使ったりしないし、出来ない。
それはC++の文化とは合わないしね。
0273デフォルトの名無しさん
NGNGstd::string strs[3];
strs[A] = "AAA";
strs[B] = "AAA";
strs[C] = "AAA";
std::cout << strs[C] << strs[B] << strs[A] << std::endl;
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG0276デフォルトの名無しさん
NGNG要素数も取れるし、速度は同じ、メモリ消費は全体でポインタ2,3個分の違い。
0277デフォルトの名無しさん
NGNGだから Delphi的に配列の添え字に列挙型を使えるとるという意味はさ
enum TABC { A, B, C };
と列挙型を定義したら
int MyArray[ TABC ]; と配列を定義出来て
for( TABC i = TABC.Low() ; i<TABC.High() ; i++) とループして MyArray[i]; とアクセス出来ないと
0278デフォルトの名無しさん
NGNGとりあえずもちつけ
0279デフォルトの名無しさん
NGNGstd::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デフォルトの名無しさん
NGNGenum { A, B, C, SIZE }; でOK
0281デフォルトの名無しさん
NGNGint i; で strs[i] と書いたら文法エラーにならないとさ
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG関数内関数とか、クラス参照型(typeid相当)からのクラスメソッドの多態した呼び出しとか、
messageハンドラとか(BCBのマクロのやつはDispatchをオーバーライドしてる)、
{$L ....obj}をDelphiのユニットに別々に閉じ込めると識別子が重複してもきちんと解決してくれるとか、
externalでインポートライブラリ無しにいきなり.dllを呼べるとか、
\0が途中にある文字列定数を文字列として扱えるとか、implementsとか、そういう話?
ちなみにC++で同じことが書けなくても、間接的に利用さえできればいいので困らない。
後、enumを添え字にした配列より、0以外から始まってる配列の方が辛い気がするぞ。
(templateでどうにでもなるけど)
0284デフォルトの名無しさん
NGNGhoge()
{
struct Func
{
int operator()() { return 500; }
};
cout << Func() << endl;
}
0285デフォルトの名無しさん
NGNGそれって、親のローカル変数に触れる?そこが最大の焦点。
(じゃないと、単に名前空間を解決しただけで機能的には普通の関数)
0286デフォルトの名無しさん
NGNGんなもん参照渡しすればいいだろ。
0287デフォルトの名無しさん
NGNG{
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デフォルトの名無しさん
NGNGint 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デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGCには、グローバル変数、ローカル変数、の二段階しかないけど、
Pascalは好きなだけネストが可能で、内側からは外側が見えるので、
グローバル変数は単に一番外側の変数に過ぎず、間に層をいっぱい作れるわけだ。
この性質を真似できないと、ちょっと認められないなあ。
これはトップダウン式パーサとか、概念的にもネストした状態を持つものを書く時非常に都合がいい。
0291デフォルトの名無しさん
NGNG単純に2段ならいいけど3段でしかも再帰してたりすると、実装どうやってるんだろ?
0292デフォルトの名無しさん
NGNG親のEBPの配列を保持する方式
・x86にはenter、leaveという関数内関数を実現するための命令がある
Delphi方式(スタックフレームを利用してEBPのリンクリスト)
・関数内関数を持つ関数(要するに親になる関数)は必ずスタックフレームを作る
・子を呼ぶ時は自分のEBPを隠しパラメータで渡す
・親の変数には [親のEBP + n]
・親の親には、[[親のEBP] + n] 以下同様
・兄弟を呼ぶ時は親のEBPを渡す
・親を呼ぶ時は[親のEBP]にそのまた親のEBPが入っているのでネストの段数差だけ逆にたどって取得、渡す
0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNG0295デフォルトの名無しさん
NGNGあなたの言う「enter/leave」と「Delphi方式」って同じものなんですけど。
enter/leave が遅いし融通が利かないから、多くの処理系では同等の複数の命令に
分割しているだけ。
Enter/Leave は、スタックフレームを作る/開放する命令。
作成した EBP とそのチェーンを手繰って、呼び出しもとのスタックフレームを参照するのは
個々のコードの仕事。具体的には EBP のチェーンを参照することになる。
0296デフォルトの名無しさん
NGNGこれは真実。
さて。名前(空間)の衝突を考えなければ、親関数のローカル変数と子関数のローカル変数は
同一のストレージにとることができる。スコープと寿命の問題はメモリ実体とは切り離して考
えることができるからね。
本質的にスタックフレームを作らなければいけないのは、直接/間接に再起呼び出しを行う場合
だけだ。ある関数が再帰呼び出しされるかどうか、その結果本質的に同じ名前の変数を複数生成
し、かつ弁別する必要があるかどうかをコードからコンパイラが知ることは非常に困難だ。
だからほとんどの処理系では再帰呼び出しされても大丈夫なようにスタックにフレームをとる。
しかし、現実のアプリケーションにおいて再帰呼び出しが起きることは非常にまれだ。
ということで、意味的にローカル変数であるものをすべてグローバル変数として領域を割り当てる。
もし再帰呼び出しが発生したら、そのときに、古い(ローカル)変数群をスタックに保存。
再帰関数が終了した時点で、スタックから古い変数の値を復元。
という処理系が存在した。ローカル変数をスタックに取らないため、ほとんどすべての変数参照が
絶対アドレス参照となり、再帰使わなくても高速。
0297デフォルトの名無しさん
NGNG勘違いしてるカモ
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キャッシュがあるCPUでは、ローカル変数よりスタックフレームの方が速いかもしれないね。
スタックだと、キャッシュ上で上書きされる率が高く、上書きされたら実際に書き込みをする必要が無くなるから
0299デフォルトの名無しさん
NGNGenterの場合、例えば三重ネストなら、親のEBP、と、親の親のEBPが、スタックに配列状に置かれる。
あと>>297のようにEBPをパラメータで受け取る必要は無い。enterの値に応じて集めてくれる。
>>296
今だとマルチスレッドがあるから、グローバルに領域を取るとまずいかもね
0300デフォルトの名無しさん
NGNGどういう違いがあり、どう使い分ければいいでしょうか?
0301_
NGNG0302デフォルトの名無しさん
NGNGC++の場合、virtual関数を多態して呼びたい時は、OnCreate/OnDestroyかな。
0303デフォルトの名無しさん
NGNGすべてのインスタンスで有効になる。
OnCreate に記述すると、イベントだから、インスタンス毎に異なる動作を
記述できる。
違いはこれでわかるかな?
0304デフォルトの名無しさん
NGNGwin2kのほうが20Kくらい大きいexeが出来上がるのですが、
そういうものなのでしょうか?
0305デフォルトの名無しさん
NGNG>>304 そういった話を聞いたことはありませんが、.map を出してみて比較すると
自己解決するのではないかと。
おそらくは何かコンパイルオプションが食い違っているのではないかと。
0306デフォルトの名無しさん
NGNG中略
void func(double t)
{
if(RadioButton1->Checked == true ) {
中略
}
って関数作っても
[C++ エラー] Unit1.cpp(162): E2451 未定義のシンボル RadioButton1
です
ほかのところではRadioButton1はちゃんと読めてるみたいなんだけど
自分で勝手に作った関数じゃうまく動いてくれない
何が考え方おかしいの、どうすりゃ動いてくれるかな、help me
BCCでつくったのをBCB6に移植しようとしてます
0307デフォルトの名無しさん
NGNGRadioButton1はどっかのフォームのメンバ変数じゃないの?
そのフォームクラスに所属してない関数からならアクセスできるわけないが。
0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNGclass TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
TRadioButton *RadioButton1;
以下略
unit1.hでこんな風に宣言されてる
俺が作ったfuncという関数はこのフォームクラスに所属してないの?
どうすれば所属させられる?
0310デフォルトの名無しさん
NGNGさんくす、超出来たっぽい
ありがとございます
0311デフォルトの名無しさん
NGNGこれって使用する際はDBのセッションを開きっぱなしにしないといけないのですが?
DBをクローズすると内容とかなくなっちゃいますよね?
0312デフォルトの名無しさん
NGNGMyQuery->SQL->Text = "select * from ATABLE";
みたいなことすると、「Empty query.」という変なエラーがでます。
それも、MyQuery->SQLをTStrings*でdynamic_castしてもOKだし、
Strings->Clear(); Strings->Add(Ssql);とすると、Addで同エラー。
すげー変。
0313312
NGNGTIBQueryを素で使って同じことをすると、何も起こりません。
みなさんも試してみて下さい。
0314デフォルトの名無しさん
NGNGソース追ってみたら?
0315312
NGNGnewしているところで、
>[C++ エラー] : E2125 コンパイラは 'default constructor' クラスの を作成できない
というような、エラーとなります。
コンストラクタが消える???
ちなみにBCB6でつ。
0316312
NGNGソース追った結果が、TIBQuery->SQLの実態はTStrings*でつ。
また、dynamic_castでも、それが正しいという結果です。
VCLの中をデバッグしようとすると、汗画面に飛びます。
0317デフォルトの名無しさん
NGNGソース見ると、OnChangeに代入してるQueryChangedが呼ばれてるはずということもわかるね
0318デフォルトの名無しさん
NGNG親が引数をとるコンストラクタしか持ってないから、
派生したクラスでコンストラクタを省略することは出来ないよ。
0319312
NGNGはつみみですた。
>>317
確かに、
>TStringList(SQL).OnChange := QueryChanged;
こういう行ありますね。
ウワーン何が起こってるのか分からないYO〜
0320デフォルトの名無しさん
NGNGだからTStringListはOnChangeにコールバックが設定されていると
内容の変更があったときにそれを呼んでくれるの。
だからエラーはそのコールバック(設定されているTIBQuery.QueryChanged)の
中で起きてるんでしょう。
ってその中でブレークポイントとかって設定できないんだっけ?
<BCBは最近使ってないのでスマソ
0322312
NGNG>procedure TIBQuery.QueryChanged(Sender: TObject);
>var
> List: TParams;
>begin
> if not (csReading in ComponentState) then
> begin
> Disconnect;
ここでエラー起こしてます。
Disconnectなんてされても困るな...
0323312
NGNG0324デフォルトの名無しさん
NGNG0325312
NGNG派生しない場合も、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;
ここに飛んで落ちます。
0326312
NGNG「TIBCustomDataSet.PSGetTableName」に入るので、???です。
0327デフォルトの名無しさん
NGNG一本のソフトで複数のコンピュータに入れることは出来ないの?
0328デフォルトの名無しさん
NGNGできます。
0329デフォルトの名無しさん
NGNGMSComm取り込んで、MSComm->Output=OelVariant(AnsiString hoge);
とかやると、リークしまくるのだが。
0330デフォルトの名無しさん
NGNGわかりました、ありがと
0332デフォルトの名無しさん
NGNG意味不明
0333デフォルトの名無しさん
NGNG0335312
NGNG>TStringList(SQL).OnChange := QueryChanged;
こんなキャストがあるけど、これって大丈夫なのかな?
0336デフォルトの名無しさん
NGNGFSQLを設定する部分でしっかりTStringListしか入れないようにさえなってれば
大丈夫でしょ。
0337312
NGNG>FSQL := TStringList.Create;
になってますね。
ところで、
>constructor TIBQuery.Create(AOwner: TComponent);
を派生した場合は、派生したメソッドで
TIBQuery::Create
をコールする必要とかありましたっけ?
BCBからVCL派生はやっぱ慣れないと分からない部分とかありますよね。
0338デフォルトの名無しさん
NGNG0339312
NGNG「派生前と派生後(名前変えただけ...)で動作が違う」原因が分からないと、気持ち悪いよ。
というか、開発進むと行き詰まりそう。
0340デフォルトの名無しさん
NGNG引数付きのコンストラクタは初期化リストでしか呼べないし、
引数付きのコンストラクタしかないクラスから派生したクラスは、
初期化リストで初期化しなきゃエラーだろ。
動作が違うとしたら「デフォルトコンストラクタが呼ばれてる」だけだから。
0341312
NGNGつまり、派生後のコンストラクタで、
TIBQuery::Create(AOwner: TComponent);
をコールすれば良い?
0342デフォルトの名無しさん
NGNGだいたい、ObjectPascalのコンストラクタは
C++から通常の関数のように明示的にCreateで呼び出せるの?
delphiでもinherited使うしかないんじゃなかった?
0343デフォルトの名無しさん
NGNG「デフォルトコンストラクタ」と「引数付きコンストラクタ」の両方を呼び出して
正常に動くとはとても思えないけど。
0344312
NGNGDelphiのinheritedを行うために、「TIBQuery::TIBQuery(Owner);」と書くのかな、
と思ってたんだけど違うの?
実行させても動作しないから違うみたいだね...
0345デフォルトの名無しさん
NGNG{
}
こうなってれば他に特に何もしなくていいということでそ。
>>325の動作が違うって件は、わからないけど。
0346デフォルトの名無しさん
NGNG0347デフォルトの名無しさん
NGNG無理?
0348デフォルトの名無しさん
NGNGVC=C++ Onlyで開発できる。
BCB=Pascalが必要な上にC++と互換性がない拡張がなされている。
0349デフォルトの名無しさん
NGNGVCの方がよく見えるのですけど
0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNGできる
0352デフォルトの名無しさん
NGNGVC =C++ Onlyでしか開発できない。Visualという名前に負けている。
BCB=C++のみでも可能だが、DelphiのVCLを利用してVisualにGUI開発が出来る
0353デフォルトの名無しさん
NGNGどうやるのですか、ご教授してください
0354デフォルトの名無しさん
NGNGBCBの方がよく見えるのですけど
0355デフォルトの名無しさん
NGNGヘルプで パッケージ のキーワードのところを順に見てけばそのうち判ると思うよ
0356デフォルトの名無しさん
NGNGプロジェクトオプションを開く
リンカタブの「共有 RTL DLL を使う」のチェックを外す
パッケージタブの「実行時パッケージを使って構築」のチェックを外す
0358デフォルトの名無しさん
NGNGじゃあBCB使えばいい
0359312
NGNGBCBオタの皆さんも312の内容を試してみて頂けないでしょうか?
0360デフォルトの名無しさん
NGNG>BCBオタの皆さん
こんな書き方すると荒らし扱いされるぞ
気をつけな
0361デフォルトの名無しさん
NGNG0362デフォルトの名無しさん
NGNGなぜか成功しませぬ。
[sample.rc]
RC_TITLE001 BITMAP "title.bmp"
RC_CHAR001 PNG "stand001_all.png"
RC_BM001_1 JPEG "back_test0_big.jpg"
ファイル名を直接指定した場合は描画できるんですけど
リソースIDでやった場合、BMP以外は描画不能。
ユーザに直接画像を覗かれない方法があったら教えてママン(´・ω・`)
■ このスレッドは過去ログ倉庫に格納されています