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

C++Builder相談室 Part15

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2005/08/21(日) 17:48:30
C++Builderに関する質問・回答や議論等を行う相談室スレッド。


過去スレ・関連サイトは>>2-7あたり。
0830デフォルトの名無しさん2005/12/30(金) 13:44:03
>>829
何が聞きたいんだ?
STLのVectorを使ってるかと聞きたいのか?
それともアルゴリズムとしてVectorなのかと聞きたいのか?
STLのVector(実際にはTstringsだが)使ってないんじゃないの?
Delphiとの絡みも有るし・・・
0831デフォルトの名無しさん2005/12/30(金) 13:45:24
>>829
VCLの実装はすべてDelphi(ObjectPascal)言語で書かれています。
0832本田2006/01/01(日) 06:01:33
> VCLの実装はすべてDelphi(ObjectPascal)言語で書かれています。
それじゃ遅いので一部ASM。
0833デフォルトの名無しさん2006/01/01(日) 13:42:26
一部ASMもDelphi言語の仕様のうちだろ
0834デフォルトの名無しさん2006/01/02(月) 07:09:16
本田ってTEditorの人?
0835デフォルトの名無しさん2006/01/02(月) 09:28:28
Civic のひと
0836本田2006/01/03(火) 03:49:27
>>834
> 本田ってTEditorの人?

別人。
0837本田2006/01/03(火) 05:20:36
私です。
0838本田2006/01/03(火) 13:42:12
そうです。
0839デフォルトの名無しさん2006/01/03(火) 13:45:56
スゲー
0840本田2006/01/03(火) 22:21:36
この贋物どもめっ
0841デフォルトの名無しさん2006/01/04(水) 14:33:02
美奈子です。
0842デフォルトの名無しさん2006/01/05(木) 18:25:56
dll内にvclのフォームを作ってもFormCreateだけでは
Timerが動きません。ShowModalしないとうんともすんとも
いわないのは仕様ですか?
0843デフォルトの名無しさん2006/01/06(金) 07:52:08
それ当たり前。メッセージポンプがないから。モーダルループで動くのも当たり前。
0844デフォルトの名無しさん2006/01/06(金) 09:43:01
Windows の仕様だ、とも言える。常識だが。
0845デフォルトの名無しさん2006/01/06(金) 13:48:33
親持たないTTimer作ればいいじゃない。
親がなければ自分でメッセージ処理用ウィンドウ作るし。
0846デフォルトの名無しさん2006/01/07(土) 01:13:09
ウィンドウつくってもメッセージポンプがないと動かないっしょ。
ここほんとに C++ スレなのか? Windows のプログラムについて知ってる人いないの?
0847デフォルトの名無しさん2006/01/07(土) 10:24:00
TTimerとsdkのtimerがごっちゃになってるな
0848デフォルトの名無しさん2006/01/07(土) 14:37:27
TStringList *tmpList = new TStringList;
tmpList->Text = "AAA";
tmpList->Text += "AAA";
tmpList->Text += "AAA";
tmpList->Text += "AAA";
ShowMessage(tmpList->Text);
delete tmpList;

これ、1行しか表示されないんだけど、どうしてなの?
Ansistring型に+=は有効なのに。
0849デフォルトの名無しさん2006/01/07(土) 14:55:07
>848
BCB6ならヘルプ>キーワード>プロパティ,代入演算子,
0850デフォルトの名無しさん2006/01/07(土) 15:18:01
>849
どうもありがとう〜
ダメなのは前から知ってたけど、やっと理由が分かってスッキリしました。
0851デフォルトの名無しさん 2006/01/08(日) 00:26:05
こんにちは。
BCB5でプログラムを作成しています。
プログラムが日本語版のWindowsで動いているか、そうでないかをプログラム中で
判別したいのですが、検索エンジンでさがしても適当なものを見つけることが
できませんでした。ご存知の方、よろしくお願いします。
0852デフォルトの名無しさん2006/01/08(日) 00:30:23
>>851
GetACPとかGetUserDefaultLangIDとか。
0853デフォルトの名無しさん2006/01/08(日) 12:20:41
C++Builder6を使用していますが
メモリ管理のことで少々不明な点があるので教えてください

builderのコンパイラ性能がいまいちなので重い計算をする部分を
Intelコンパイラを使ってLib or DLLで作り、それをBuilderでつくったソフトから
呼び出すような形態を想定しています。

その際に問題になるのがメモりマネージャーの違いだとおもうのですが
同じBuilder同士や、たとえばVC同士でもランタイムバージョンの違いで
問題になるようです。
今回のケースのような場合はどうすればよいのでしょう?
ふつうにnew deleteを使うと問題がおきますよね?
0854デフォルトの名無しさん2006/01/08(日) 12:50:44
>>853
WinAPIのHeapAlloc系を使うようにすれば、ヒープハンドルさえ同じなら平気。
0855デフォルトの名無しさん2006/01/08(日) 13:21:44
ICCがVC++と同じだと仮定して、

VC++はHeapAllocをほぼそのまま呼び出してる。
一方、BCB(VCL)はHeapAllocで確保した領域を、さらに自前で管理している。
なので、呼び出し側と開放側が一致しないとまずい。

共用するには、>854の言うように、
HeapAllocなりで確保した領域をplacement newなりで初期化して使えばいいと思う。
deleteも、デストラクタを呼び出してからHeapFreeするようにして。
(VCLオブジェクトが内部で確保した領域は、開放もそっちを使うので問題ない)
0856デフォルトの名無しさん2006/01/08(日) 13:31:01
構造体(POD)ならHeapAllocでいいけど、
クラスならoperator new/deleteをオーバーロードするとすっきりする。
0857デフォルトの名無しさん2006/01/08(日) 17:46:03
>>853
dll内に実装したクラスをapp側からnewして利用したいって話?COMみたいなやり方は駄目?

外部へ公開するインタフェイス(抽象クラス)
interface ITest
{
  virtual int Get( void ) = 0;
  virtual void Set( int val ) = 0;
  virtual int Release( void ) = 0;
};
実装(構築子やら参照カウンタは省略)
class TTest : public ITest
{
  int m_val;
  int Get( void ){ return m_val; }
  void Set( int val ){ m_val = val; }
  int Release( void ){ delete this; }
};
インスタンス作成関数
ITest* CreateTest( void )
{
  return new TTest;
}

app側
ITest* Test = CreateTest();
Test->Set( 100 );
Test->Release();
0858デフォルトの名無しさん2006/01/08(日) 22:55:06
BCBでnewした領域はBCBでdelete
ICでnewした領域はICでdelete

これじゃだめなのか?
0859デフォルトの名無しさん2006/01/09(月) 08:35:32
それに加え、ICで作ったクラスの非仮想関数を呼び出すのなら、クラス自体のエクスポートが必要。
逆にBCBで作ったクラスの非仮想関数をICで呼び出すことはできない。
0860デフォルトの名無しさん2006/01/12(木) 17:26:59
メモリの話題で思い出した。ビルダー6のメモリ管理周り怪しくね?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //A
  BYTE *p = new BYTE[ 640*480*4 ];
  Memo1->Lines->Add( (DWORD)p );
  //B
  Graphics::TBitmap *Image = new Graphics::TBitmap;
  Image->PixelFormat = pf32bit;
  Image->Width = 100;
  Image->Height = 100;
  Image->Canvas->FillRect( TRect( 0, 0, 99, 99 ) );
  delete Image;
  //C
  delete[] p;
}

Button1を押すと初回と二回目以降でアドレス変わるし
二回目以降に受け取る領域はStretchDIBits()の転送元にしようとしても失敗する
(A→C→Bと並び換えたり、確保する領域を310432バイト以下にすると問題は起きない)

VCのソースを基に自作したmalloc()とfree()を組み込んで回避したけど
新しいビルダーでは直ってるかな
0861デフォルトの名無しさん2006/01/12(木) 18:09:21
>>860
> ビルダー6のメモリ管理周り怪しくね?

藻前の日本語の方が怪しいよ。


# > 初回と二回目以降でアドレス変わるし
# 何の?
# > 二回目以降に受け取る領域は
# 何の?
0862デフォルトの名無しさん2006/01/12(木) 18:53:01
> 新しいビルダーでは直ってるかな
つ http://sourceforge.net/projects/fastmm/
0863デフォルトの名無しさん2006/01/12(木) 18:55:49
BCB6が未だにバグだらけなのは確かにそうだけど、どうしようもないんだよな
0864デフォルトの名無しさん2006/01/12(木) 23:12:45
まあ >>861の方が阿呆だな。
関数名を見れば簡単に理解できるじゃん。
0865デフォルトの名無しさん2006/01/12(木) 23:39:06
頭が狂った>>861が居るスレはここですか?
0866デフォルトの名無しさん2006/01/13(金) 06:01:03
頭が狂ってるんじゃなくて、頭が悪いんです。単純に。
0867デフォルトの名無しさん2006/01/13(金) 23:31:12
最近C++Builderのver6を使いはじめました。
IDEのエディタで、イベントハンドラなどを追加すると、
自動的に挿入される //----------------------- の横線がウザいです。
これを停止するオプションは無いのでしょうか?
0868デフォルトの名無しさん2006/01/13(金) 23:37:48
>>860
自分もBuilder6を使って同じ現象を確認した。


オフトピだがFillRect()の記述が間違っていると思う。
正しくは、

Image->Canvas->FillRect( TRect( 0, 0, 100, 100 ) );

この関数の引数は、数学的に言うと左閉右開区間です。

Builder6のヘルプより引用
----------------------------------------------------------------------
FillRect メソッドはキャンバス上の指定した四角形を現在のブラシで塗りつぶします。

void __fastcall FillRect(const TRect &Rect);

説明

FillRect メソッドを呼び出すと,現在のブラシを使って四角形の領域を塗りつぶすこと
ができます。指定の領域を塗りつぶす場合,四角形の左と上の端は領域に含まれます
が,右と下の端は含まれません。
----------------------------------------------------------------------
0869デフォルトの名無しさん2006/01/13(金) 23:46:44
俺もありえねーだろと思いつつ試してたんだけど、StretchDIBitsでまじでおかしくなったな。
メモリの確保をnew以外にするだけで直るんだけど、どういう理屈なんだこれ。
0870デフォルトの名無しさん2006/01/14(土) 09:13:13
>>867
$(BCB)\Bin\bcb.bcfというファイルをエディタで編集します。
[Code Formatting]
Divider Line=
Divider Line Break=
を追加すると仕切り線が作られなくなります。
ヘルプのキーワードは「生成されたコード」です。
08718602006/01/14(土) 16:49:56
>>862
ありがとう、今から落としてみるよ。
>>868
TRect/RECT
指摘、解説してくれてありがとう。
いろいろ値を変更しながら実験してた途中のコードを貼り付けて
しまったので前述のようになってしまった次第。


問題回避用に組み込んだコード(骨子のみ)

HANDLE g_hHeap;
void *malloc( size_t szAllocation ){ return HeapAlloc( g_hHeap, 0, szAllocation ); }
void free( void *Unused ){ HeapFree( g_hHeap, 0, Unused ); }
void _SetupHeap( void ){ g_hHeap = HeapCreate( 0, 4096, 0 ); }
void _CleanupHeap( void ){ HeapDestroy( g_hHeap ); }
#pragma startup _SetupHeap 0
#pragma exit _CleanupHeap 0

ヒープAPIに丸投げです(realloc()calloc()も同様)
0872デフォルトの名無しさん2006/01/14(土) 17:50:10
グローバルのoperator new/new[]/delete/delete[]を自分で定義したらどう?
0873デフォルトの名無しさん2006/01/19(木) 18:30:10
例のまんまコピペしてlocaltime関数を使うとCodeGuardでエラーになるんですが、なぜでしょうか?
0874デフォルトの名無しさん2006/01/19(木) 18:40:48
BCB6のコードガードはUpdate1を適用すると支障が出るようになります。
0875デフォルトの名無しさん2006/01/19(木) 18:56:17
確かにUpdate1してますが・・・
ではこの関数自体は問題なくCodeGuardオフでコンパイルしたらいいですか?
0876デフォルトの名無しさん2006/01/19(木) 21:21:44
>>875
BDS2006を買って下さい。
0877デフォルトの名無しさん2006/01/20(金) 15:06:26
そうするとBCB6のプロジェクトがコンパイルできなくなるけどな
0878デフォルトの名無しさん2006/01/20(金) 16:57:57
>>877
詳しく
0879デフォルトの名無しさん2006/01/20(金) 17:32:43
>>878
通称"Label2"バグが出る。
<property category="build.node" name="packages" value=
に、使われていないパッケージが入っていると出るようだ。

コンポーネントを登録したら、以降どのプロジェクトもコンパイルできなく
なったりする。その時は Dafault.bdsproj だったかそんな名前のファイル
から、使ってないコンポーネント名を手で削除しなければならない。
0880デフォルトの名無しさん2006/01/20(金) 18:30:34
2006買ってないけど2006のコンパイラまわりだけ6に移植が正解なのかね‥‥
0881デフォルトの名無しさん2006/01/20(金) 19:05:21
2006のコンパイラ廻りって6と比べてなんか良くなってるの?
0882デフォルトの名無しさん2006/01/20(金) 20:08:16
>>881
boostのコンパイルが通る
0883デフォルトの名無しさん2006/01/20(金) 20:22:31
6ではlexical_castが通ったの確認したけど
それ以外どれが通るの?
0884デフォルトの名無しさん2006/01/20(金) 22:27:08
>>882
嘘つけ。あまり変わってないぞ。
0885デフォルトの名無しさん2006/01/21(土) 20:25:57
>884
Re: boost
news://newsgroups.borland.com:119/[email protected]
0886デフォルトの名無しさん2006/01/21(土) 21:29:34
>>885
リンク切れ
0887デフォルトの名無しさん2006/01/21(土) 22:44:49
>886
おやおや。先週の投稿なのに。

boostに、最新版のコンパイラだと不要なワークアラウンドコードが入ってるから、
その辺解決するパッチを今作ってるよ、という話。
0888デフォルトの名無しさん2006/01/21(土) 23:34:37
>>887
情報サンクス。期待して待ってみます。
0889デフォルトの名無しさん2006/01/22(日) 00:13:04
2006にするとGUIとか変わるの?
TStringGridとか機能アップしているのか気になる
0890デフォルトの名無しさん2006/01/22(日) 06:58:28
あれは昔から糞だから期待しない方が
0891デフォルトの名無しさん2006/01/22(日) 15:50:07
BCB6はインテリセンスがVC++より賢い。
VC++だと出ない候補も出してくれる(shared_ptrの中とか)
0892デフォルトの名無しさん2006/01/22(日) 16:30:19
そういやSpeedFix入れてると「::」から補完動作してもIDEのエラー出なくなるのね。
(メッセージウィンドウにコンパイラ内部エラーが出て補完は出来ないけど)
0893デフォルトの名無しさん2006/01/22(日) 20:21:14
ここの
ttp://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-015.html

// AnsiStringを返す

AnsiString BoolToStr(bool val)
{
return (val!=0) ? AnsiString("TRUE") : AnsiString("FALSE");
}

これって
関数のスコープ抜けて戻ってきた時点で
AnsiString("〜")は破棄されてるんじゃないですか?
0894デフォルトの名無しさん2006/01/22(日) 20:47:36
>>893
戻り値はreturnに指定された値のコピーが作られ、そいつが返されるので問題ない。
あとそのコピーは最適化で省略されるようになっているかもしれない。
0895デフォルトの名無しさん2006/01/22(日) 20:48:05
>>893
一時変数にコピーされてる
0896デフォルトの名無しさん2006/01/23(月) 00:09:12
コンパイラはC99に対応しましたか?
0897デフォルトの名無しさん2006/01/23(月) 00:40:48
>>896
だめだ。可変長配列が蹴られた(BCC 5.8.1)。
long long intは5.6の頃から使えるしなぁ。
0898デフォルトの名無しさん2006/01/23(月) 01:11:24
VC8.0も今回はC99対応見送りだしなあ・・・・・
このままメジャーなコンパイラでは、C99対応は立ち消えか?
gccがせめて100%対応になってくれれば。
0899デフォルトの名無しさん2006/01/23(月) 08:42:07
可変長配列はどうでもいいが可変長引数マクロは対応して欲しい‥‥
0900デフォルトの名無しさん2006/01/23(月) 11:59:47
ICCはメジャーじゃないのか…
0901デフォルトの名無しさん2006/01/24(火) 00:30:43
すみません

オブジェクト名を文字列で指定する方法ってありますでしょうか・・?

たとえば

String strTest = Edit1;
strTest->Text = "ω";

いろいろ調べましたが・・・
わかるかたいらっしゃったら教えていただけますでしょうか。
よろしくお願いします
0902デフォルトの名無しさん2006/01/24(火) 00:58:30
>>901
リフレクションがないから無理だろ。
0903デフォルトの名無しさん2006/01/24(火) 01:08:13
RTTIって使えないの?
0904デフォルトの名無しさん2006/01/24(火) 01:23:42
対象がコンポならFindComponentがあるけども
0905デフォルトの名無しさん2006/01/24(火) 16:41:29
aaa
0906デフォルトの名無しさん2006/01/24(火) 18:55:56
新バージョンは最高ですか?
09079012006/01/25(水) 00:41:11
解決しました!
FindComponentでなんとかなりましたー
0908デフォルトの名無しさん2006/01/25(水) 04:04:32
>906
BCB6よりはいいと思うよ。
その代わりメモリ1Gいるけど。
0909デフォルトの名無しさん2006/01/25(水) 04:19:48
>>908
ではMMXPentium200MHzメモリ96MBの僕では無理ですね。
諦めて6使い続けます。
0910デフォルトの名無しさん2006/01/25(水) 09:06:19
Celeron850MHz メモリ768MB(最大まで搭載)の漏れでも無理ですね。
0911デフォルトの名無しさん2006/01/25(水) 17:48:44
ちとこのスレの趣旨とは異なるかもしれませんが質問です。
いままでBCBでプログラミングしてきたのですが
BDSでASP.netのプログラムを組む必要が出てきました。
で、DELPHIとC#でどっちを選べばいいのか迷ってます。
VCLがつかえるDELPHIか、C/C++の文法に近いC#か・・
どっちがいいでしょうかね?
ちなみにDELPHIもC#もプログラム経験はありません。
0912デフォルトの名無しさん2006/01/25(水) 17:58:00
でるふぃどとねと
0913デフォルトの名無しさん2006/01/25(水) 18:41:30
.NET 1.1で良い+BDSで組んでもOK=Delphi.NET
.NET 2.0が必要=VS Expressを入手してC#で
09149112006/01/25(水) 22:43:40
>>912,913
レスありが�d
.NETが2.0でなければDELPHIのほうがいいのですね。
特にその辺は何も言われていないので1.1でも大丈夫です。
開発ツールも指定はないです。
Delphi.netでやってみようと思います。

(BCBは.net対応になったりしないんですかね?^^;)
0915デフォルトの名無しさん2006/01/25(水) 23:13:15
> DELPHIのほうがいいのですね。
お仕事みたいですね。
とするとC#で作りはじめた方が安全かも。

余裕がある・趣味ならDelphiを押しますけど。
0916デフォルトの名無しさん2006/01/26(木) 00:56:52
どっちも経験がないなら Delphi.NET を選ぶ理由はないだろ。
C# に比べてドマイナーで情報もほとんど無いし。

Delphi.NET は既存の Delphi ユーザが、しかたなく .NET やらなければ
ならないときにしぶしぶ使うくらいしか存在理由はないだろ。
0917デフォルトの名無しさん2006/01/26(木) 08:47:15
>C# に比べてドマイナーで情報もほとんど無いし。

C丼なんて存在も知られない超ドマイナー土着言語だ罠。
0918デフォルトの名無しさん2006/01/27(金) 02:17:57
テンプレにある JCL,JVCL が使えません。まずは自宅PCを実験台にしようと。
BCB6パーソナル(1万円のやつ)sp4、WinXP
ググってwiki2個あったけど、インスコしろとしか書いてません
verをそろえろって書いてあったが、1個を解凍して、JCL,JVCL 2個でるタイプだから大丈夫だと思う

パーソナル版でJVCL使えた人いたら、教えて下さい
ちなみにJVCLってのは、フリーでボタンとかいっぱい入ってるやつです。
0919デフォルトの名無しさん2006/01/27(金) 05:39:25
>>918
JVCLなんか使うなやカス
0920デフォルトの名無しさん2006/01/27(金) 09:29:45
最初にJCLをインストールしてますか?
09219182006/01/27(金) 09:30:11
会社のプロ版では問題なくできた

>919
みなさんのオススメのコンポーネント群ってなんですか?
0922デフォルトの名無しさん2006/01/27(金) 10:31:06
>>919
なぜ?俺は愛用しているけど。
0923デフォルトの名無しさん2006/01/27(金) 19:36:32
次回作は期待出来ますか?
0924デフォルトの名無しさん2006/01/28(土) 05:04:57
TComboBox の OnMouseMove イベントってないですね。
自分でイベントを実装したいときはどうやればいいですか?
0925デフォルトの名無しさん2006/01/28(土) 09:51:08
OnMouseMoveを__publishedに書いて公開してやればいいだけだけど、
スタイルによっては内部にEditコントロールを持ってるから、その部分のマウス移動まで捕らえたいなら、そいつをサブクラス化かな。
09269242006/01/28(土) 15:25:09
>>925
はい、やってみます。
0927デフォルトの名無しさん2006/01/28(土) 20:14:07
継承元の'Label2'の解消法..まじかよ。
しばらくやる気なし。
0928デフォルトの名無しさん2006/01/28(土) 21:21:07
ただプロジェクト作って元のプロジェクトからファイルぶち込むだけじゃん。

あ、他作コンポーネント使ってたら大変だね。
俺はコンポーネント使わず自前の関数で標準VCLいじって利用しているからなんの問題もなかった。
0929デフォルトの名無しさん2006/01/29(日) 02:53:41
私の所ではBCB6で実行ファイルのサイズが大きくなると正常にコンパイルされなくなってしまいます。
バグなのか環境依存なのか・・・
レス数が900を超えています。1000を超えると表示できなくなるよ。