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

C++Builder相談室 Part15

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


過去スレ・関連サイトは>>2-7あたり。
07787762005/12/18(日) 22:21:34
>>777
Key = 0;
やってみたけど状況が変わらない。
どうしてだろ?
0779デフォルトの名無しさん2005/12/19(月) 01:26:20
新コンポ作ってみたら、親ウインドウがないとか言って起動してくれません。
どういう事ですか?><
0780デフォルトの名無しさん2005/12/19(月) 09:09:47
#include <mmsystem.h>

PlaySound(0,0,SND_PURGE);
0781デフォルトの名無しさん2005/12/19(月) 10:30:18
>>776
フォームにメニューかポップアップメニューを貼り付けているのなら、
そのメニューのアイテムにmnuExitを追加して、以下の様にする。

void __fastcall TForm::FormCreate(TObject *Sender)
{
  ・
  ・
  ・
  mnuExit->ShortCut=ShortCut( VK_ESCAPE, TShiftState() );
  ・
  ・
  ・
}

void __fastcall TForm::mnuExitClick(TObject *Sender)
{
  Close();
}
0782デフォルトの名無しさん2005/12/19(月) 10:44:07
Edit1に例えば にしむら と入力して変換押すと 西村 になって確定したときに
Edit2に にしむら とその変換する前の読みが入るようにするにはどうしたらいい?
07837792005/12/19(月) 16:41:04
ParentプロパティをパブリッシュしてParentをメインウィンドウのフォームにしたら
今度はParentプロパティが無いとか言って起動してくれません><
0784デフォルトの名無しさん2005/12/19(月) 17:45:41
>>783=779
まず、日本語から勉強してくれ。
07857832005/12/19(月) 18:19:11
TCustomControlから自作コンポーネントを作ろうと思いました。
インストールした後、フォームにポトペタしてビルドしアプリを実行しました。
すると親ウィンドウが無いという実行時の例外を発して起動しませんでした。
それで今度はコンポーネントにParentプロパティを__publish部に宣言して、
インストールし直してから、オブジェクトインスペクタのParentプロパティがポトペタしたフォームに
なっている事を確認した上で再度ビルドし実行しました。
しかし今度も実行時の例外を発して起動しませんでした。
その時は、プロパティParentが存在しませんと言われました。

日本語訳するとこんな感じです><
0786デフォルトの名無しさん2005/12/19(月) 20:38:58
>785
正直チンプンカンプンですな。
ヘルプの、目次>カスタムコンポーネントの作成>コンポーネント作成の概要
 >インストール前のコンポーネントのテスト
と次の
 >インストールしたコンポーネントのテスト
あたりをしっかり読んでみてはどうですか。
0787デフォルトの名無しさん2005/12/19(月) 22:14:11
>>785
ヘッダをアップすれ。
きっと一目で原因が判明する。
コンストラクタ宣言の引数が間違っているのではないかな。
0788デフォルトの名無しさん2005/12/20(火) 02:10:56
コンストラクタ内(もちろんコンストラクタから呼び出される関数の中含めて)で
Canvasに何か書くと、親ウィンドウが無いってエラー出るよ
0789デフォルトの名無しさん2005/12/20(火) 02:14:05
あ、でもこれは設計時にフォームに貼った時点で出るから>>785のとは違うか
0790デフォルトの名無しさん2005/12/20(火) 02:16:15
>>786
よく読んだら起動しました><

>>787
ご心配おかけしました。
0791デフォルトの名無しさん2005/12/20(火) 02:17:38
>>788
勉強になりました><
0792デフォルトの名無しさん2005/12/20(火) 10:49:26
>>782
確定した時にKeyPressが呼ばれるから無理ぽじゃね?
0793デフォルトの名無しさん2005/12/20(火) 11:58:53
>>782(+>>792)
IME 関連のメッセージを調べると幸せになれるかもしれない
0794デフォルトの名無しさん2005/12/20(火) 13:09:41
「ポトペタ」てなんやねん
0795デフォルトの名無しさん2005/12/20(火) 14:41:04
関西人にはわからない
0796デフォルトの名無しさん2005/12/20(火) 19:09:43
ポトっと落としてペタっと貼りつけることです。
0797デフォルトの名無しさん2005/12/21(水) 11:14:41
現在C++Builder5を使用中。
OSはWin2000およびXP。

起動すると、たまにコンポーネントパレットから一部のコンポーネントのアイコンが消えてしまうのですが、原因分かる方いますでしょうか?
自分で登録したものだけでなく、インストール時に標準で入っていたものまでなんです。
再インストールすると復活するのですが。
頻度としては年間で2、3回だけなんですけどね。
0798デフォルトの名無しさん2005/12/21(水) 12:11:39
>>797
memtest汁。
0799デフォルトの名無しさん2005/12/21(水) 12:27:26
>>798
メモリのテストですか。
一応調べてみます。ありがとうございました。

でもメモリの問題で特定のファイルだけ壊れるなんてありえるんでしょうか・・・
0800デフォルトの名無しさん2005/12/21(水) 12:41:31
あと怪しげなファイルクリーナーやレジストリクリーナーを走らせたりしているとか。
いろいろ試してみろ。
0801デフォルトの名無しさん2005/12/21(水) 12:57:09
>>797
5 は確かにあったね。6 にしてから、一度も起こってないから、そういうもんなんじゃないかな。
0802デフォルトの名無しさん2005/12/21(水) 13:01:12
俺は5でもそんな馬鹿げた現象は起きた事がなかった。
ぜってー何か原因がある。
08038012005/12/21(水) 13:07:22
思い出した。5 じゃないや。
マシントラブルで消えてたんだった。失礼。
0804デフォルトの名無しさん2005/12/21(水) 14:52:26
Delphi の場合だと、デスクトップのプロパティーから[設定][詳細]から
ハードウェアアクセレレーションの設定の仕方で直る場合があったと思う。
うるおぼえですまんが。
0805デフォルトの名無しさん2005/12/21(水) 19:01:29
おれもBuilder5で同ような現状に遭遇したことが1度だけある。
アイコンが消えるっても、本当に消える訳ではなく、表示がおかしくなるだけだったが。
まあ、バグなんだろうな。
ディスプレイドライバとの相性とかがあるのかもしれん。
0806デフォルトの名無しさん2005/12/21(水) 19:18:14
>804
http://www.tt.rim.or.jp/~rudyard/hirago014.html
0807デフォルトの名無しさん2005/12/21(水) 19:29:08
情けは人のためならず
情緒 じょうちょ/じょうしょ
0808デフォルトの名無しさん2005/12/22(木) 09:03:56
>>806
Del覚え
0809デフォルトの名無しさん2005/12/22(木) 17:39:22
質問させてください!!

BorlandC++を使用しています。

A.DLLでは、B.DLLの変数_bを使用します。
AのdefファイルのIMPORTSセクションに、B._bを記載しています。

B.lib(インポートライブラリ)をリンクしていないので、
リンクエラーになると思ったのですが、エラーになりません。
defファイルの記載を消すとリンクエラーになります。

defファイルのIMPORTセクションに
記載するれば、インポートライブラリを
リンクしなくてもよいのでしょうか?

よろしくお願いいたします。
0810デフォルトの名無しさん2005/12/23(金) 07:32:29
いいえ
0811デフォルトの名無しさん2005/12/23(金) 09:06:51
自作コンポーネントでプロパティでCanvasを利用するよう宣言した場合、
下位のブラシとかペンとかもろもろインスタンスの生成などはきちんと自動でしてくれますか?

それとも自分でnew TCanvasとかする必要有りですか?
0812デフォルトの名無しさん2005/12/23(金) 15:33:06
>>811
そら継承元次第
TCustomControl以下から継承したならCnavasは実装済みだな
0813デフォルトの名無しさん2005/12/23(金) 20:00:18
>>812
そうですか。
なんでブラシの色とかにアクセスしようとしたら落ちるんだろ…
0814デフォルトの名無しさん2005/12/23(金) 23:44:20
そりゃバグっているからに決まってるじゃん。
0815デフォルトの名無しさん2005/12/23(金) 23:44:29
Borland Developer Studioって21日出荷予定に
なってるけど、もう届いた人っている?
0816デフォルトの名無しさん2005/12/23(金) 23:59:06
http://pc8.2ch.net/test/read.cgi/tech/1133634136/l50
0817デフォルトの名無しさん2005/12/24(土) 09:30:55
>>813
自前でCanvas用意してるならTCanvas::HandleにDCハンドル入れないと動かないぞ
TCanvasは単なるWindowsGDI APIのWrapperに過ぎないし。
0818デフォルトの名無しさん2005/12/24(土) 10:31:59
TControlCanvasを使え。
0819デフォルトの名無しさん2005/12/24(土) 17:19:51
TListViewをvsReportで使用し、マウス直下の項目のすぐ下に
ラインを引きたいんですが一番いい方法は何でしょうか。
Canvasに直接描画すると項目を変更したときにラインを消す
処理をしたくないんでスマートな方法を教えてください。
0820デフォルトの名無しさん2005/12/24(土) 17:40:39
マウスのある行に下線を引くなら簡単だけど
マウスのある項だけに下線を引くのは、自分で描画するしかないんじゃないの。
0821デフォルトの名無しさん2005/12/26(月) 06:02:48
DLL内のフォーム(vcl使用)を表示させるとタスクバーに
そのウィンドウに対応したタブ(?)が出来ちゃいます。

これを表示させたくないんですがどうやれば表示せずに
ウィンドウを表示できますか?
0822デフォルトの名無しさん2005/12/26(月) 14:27:19
Delphi では FAQ です。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=058420
0823デフォルトの名無しさん2005/12/26(月) 15:26:42
>>822
解決しますた、ありがとうございました。
0824デフォルトの名無しさん2005/12/28(水) 08:49:33
タブコントロールのタブの切り替えで、コントロールの配置を変更してるのですが、
コントロールの数が多いせいか、チラつきます。

BeginUpdate()、EndUpdate()のような感じの関数はないでしょうか?
0825デフォルトの名無しさん2005/12/28(水) 09:29:19
>>824
コントロールの移動の前後で、LockWindowUpdate をフォームに対して行ったら、だいぶ更新速度は速くなる様子。
(TabControlに対して行っても同じ効果だけど、うちの環境だとなぜか他のウィンドウやデスクトップがちらついた)
0826デフォルトの名無しさん2005/12/28(水) 10:12:25
>824
Left Top じゃなくて SetBounds使う
0827デフォルトの名無しさん2005/12/28(水) 14:11:08
->DoubleBuffed()
0828デフォルトの名無しさん2005/12/29(木) 02:43:41
DoubleBufferdは意味ないんじゃない?
グラフィックコントロールばかりならいいだろうけど。
0829デフォルトの名無しさん2005/12/30(金) 13:24:56
質問です
TStringListは内部にvectorを使用していますか?
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のプロジェクトがコンパイルできなくなるけどな
■ このスレッドは過去ログ倉庫に格納されています