C++Builder5.0の質問です。
フォーム(Form1)に複数のボタンを配置し、メニュー画面としました。
ボタンを押すと他の画面(Form2~5)に移れるようにしました。
ボタンには

TForm2 *Form2 = new TForm2(this);
Form2 -> Show();
Close();

Form2からForm5まであります。
と記述し、

Form2から5には「戻る」ボタンを設け、Form1(メニュー画面)に
戻れるようにしました。

Form2~5の「戻る」ボタンには
TForm1 *Form1 = new TForm1(this);
Form1 -> Show();
Close();
と記述しました。

また、全てのフォームのFormCloseイベントには自分のフォームを破棄するために
delete Form2;
等と記述しました。

この状態でメニュー画面からForm2~5を開いたり閉じたりすることを
繰り返すと、不定期的に動作が固まってしまいます。
この原因はなんでしょうか。
Ver.はBCB5.0(Pro.)です。

御回答をよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

そんなにメモリは食わないと思います、としか言えないです。


少なくとも10個、20個ぐらいでは実用に耐えうる程度のメモリ
しか食わないと思います。

で、補足説明と自分の若干の質問の勘違いとを修正して考えますと、
若干の疑問と問題点がうかびました。

まず、Form1だけを自動生成している以上、Form1をClose();
したらアプリが終わってしまう気がするんですが(^^;;
ですのでForm1->Visible = false;が適当かと。
あとForm1もdeleteしてないかどうかご確認願います。
(自動生成しているのでしちゃまずいです)

次にForm1を自動生成していることから、Form1のインスタンスは
既にできているので、Form1->Show();かForm1->Visible = true;
でいいかと。

どうせなら全部自動生成しない方がいいかもしれないですね。

なんか回答というかアドバイスにしかならなくて申し訳ないです。
    • good
    • 1
この回答へのお礼

御返事頂きましてありがとうございました。

間違いがありましたので訂正します。
Form2~5を表示させた後、Form1のClose()は行ってはおらず、Form1->Hide();としていました。
また、Form2からForm1へ戻る時は、Form1->Show();
としていました。

すべてのフォームを自動生成する方法で行いたいと
思います。

お礼日時:2001/03/12 10:02

一般的にC++Builderでフォームを新規作成すると


自動的にインスタンスは生成される仕様になっているのですが、
その対策はされているのでしょうか?
#プロジェクト-オプションのフォームタブの自動生成の対象

Builderではフォームはnewせずにそのままコンパイラに生成させて
FormX->Show();してFormX->Close();するのが自然だと思います。
ただしForm1だけはClose();するとプログラム閉じてしまうんで、
Form1->Visible = false;
するのが適当だと思います。
Close()はForm1以外はインスタンスは残ったままです。

ちなみにデストラクトも自動でやってくれるはずです。

メモリの関係でどうしても自分でインスタンスを生成したい場合は
ヘルプでTFormを検索して関連項目を当たってください。
ほぼ必要な項目はこの中にあるはずです。

この回答への補足

御返事有り難うございました。

自動生成に対象にはForm1だけを指定しています。
「コンパイラに生成させて」とは、自動生成の対象に
全てのフォームを指定するという意味でしょうか。
その場合、メモリが大量に消費されてしまうという
問題は発生しないのでしょうか。
よろしければ御回答をお願いします。

補足日時:2001/03/12 01:03
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++Builderで別Formから呼び出したFormを終了させるには

C++Builderで別Formから呼び出したFormを終了させるには
わかりにくくてすいませんが

Form1から Form2を呼び出し
そのForm2からForm1を終了させたいのですが
もちろんForm2も終了されてもかまいません
又はアプリケーションごと
すべて終了させてもかまいません

よろしくお願いいたします

Aベストアンサー

>Form1から Show()でForm2を立ち上げて
>そのForm2からClose()で
>Form1ごと閉じたかったのですが閉じれなかったので
>もちろん
>Form1 = new TForm1(this);
>Form1->Close();
>はしたのですが やり方がおかしかったのでしょうか?

 インスタンスとクラスの関係を理解しましょう。
Form2のインスタンス中でそんなことやったら、Form1の今表示されているウインドウ(に関連するメモリ)は宙に浮き、新しいウインドウが作られ、それを閉じる、というようなことをやっています。

 Form2にForm1を参照させて、Form1->Close();だけで閉じませんでした?
#「終了」は、Closeで良かったかいな??

Q”wchar_t*型は渡せない”というエラー

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupported)GetProcAddress(hSPI, "IsSupported");

このように宣言していて、


typedef int __stdcall (*ProcIsSupported)(LPSTR,DWORD);


このようなプログラムなのですが、解決方法を教えて頂けませんでしょうか?

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupport...続きを読む

Aベストアンサー

質問するには、もう少し情報があった方がいいでしょう。
既にある回答の情報から、C++ Builder のようですが、2009 or 2007 以降、ダイアログにある文字データの型が AnsiString から、UnicodeString に替わりました。
このため、c_str() をとっても、char * ではなく、wchar_t* が帰ってきます。

で、横着をするのなら、UnicodeString が AnsiString にキャスト可能であることを使って、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )

を、

if( IsSupported(static_cast<AnsiString>(OpenDialog->FileName).c_str(),theFile) != 0 )

と、一度 AnsiString にしてから、.c_str() をとると、char * が帰ってきます。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QC++ Builderで文字列をバイトにする方法

C++ Builderでプログラミングをやっているのですが、

String memo1 = "あいうえお";


という文字列を

unsigned char test_bin[1000];

バイトで宣言した配列に



test_bin[0] = memo1の1バイト目;
test_bin[0] = memo1の2バイト目;
test_bin[0] = memo1の3バイト目;
test_bin[0] = memo1の4バイト目;
test_bin[0] = memo1の5バイト目;


このように、文字列データのバイト数値を数値変数に代入させることはできますでしょうか?


どうぞ、ご教授の程よろしくお願い致します。

Aベストアンサー

No1です
>このようにコピーした時には文字コードは考慮されないのでしょうか?
何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です
少なくても strcpy 関数にて文字コードが変化することはありません

元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ
SJISであればSJISの文字コードがそのままコピーされます

Q文字列がNULLか空文字列かの判定

Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0)
文字列の扱いについて、質問します。

関数 int func(char *str) があると仮定します。
パラメータとして、strは以下のような状態あるとします。
(strは関数が呼ばれる前にcalloc()で領域確保済み)
 シンボル名 値
 str      0x00000001 ""
上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。
どうしたらよいのでしょうか。アドバイスをお願いします。

Aベストアンサー

No1の方の回答にあるように、calloc()で取れた領域のアドレスを正しく渡せてないように思えますが...

#defineERROR(-1)

int func(char *str)
{
  if( (!str) || (!strlen(str)) ) return ERROR;
  return strlen(str);
}

void main()
{
  char *p=(char*)calloc(10,10);
  printf("%d\n",func(p));
}

QC++Builder Ver6.0.でコンポーネントを追加方法?

C++Builder Ver6.0を使っていますが

「 CommX.pas, CommX.dcr をライブラリパスの通ったフォルダにコピーし、
CommX.pas をインストールして下さい。」

とあるのですがどのように進めたらよいのでしょうか?
手順を教えてください。

コンポーネントのインストールの方法手順のサイト
がありましたら宜しくお願いします。

Aベストアンサー

参照設定がされていないのでしょう。
コンパイル時に参照されるフォルダにコピーするか、
任意のフォルダに置いておいて、そのフォルダをリンク用のフォルダとして追加してください。
私の場合ですと、私的に手に入れたものは標準のコンポーネントとは区別しておいておきたいので、ビルダーのあるフォルダ(C:\Program Files\Borland\CBuilder6\)に
\MyVCL
というフォルダをつくり、そこに保存しています。
こうすると、ビルダー自体がバージョンアップしたときに持っていく作業が楽になりますからね。
で、ビルダーを立ち上げて、[プロジェクト]-[オプション]を開き、[ディレクトリ/条件]タブを出します。
インクルードパスとライブラリパスにそれぞれ
;$(BCB)\MyVCL
を追記して、最下部のデフォルトのチェックボックスにチェックを入れてOKを押します。
これで、次回からのデフォルト設定で、MyVCLフォルダも参照してもらえます。

ここまで終わったら、コンポーネントのインストールで、ユニットファイルにコンポーネント(ここではCommX.pasですね)を指定して、パッケージに入れて、コンパイルします。
最後に、パッケージファイルを保存するのをお忘れなく。
これで、うまくいけば、コンポーネントファイルで指定されたタブにアイコンが追加されるはずです。(CommXだとLibというタブになるのかな?)

参照設定がされていないのでしょう。
コンパイル時に参照されるフォルダにコピーするか、
任意のフォルダに置いておいて、そのフォルダをリンク用のフォルダとして追加してください。
私の場合ですと、私的に手に入れたものは標準のコンポーネントとは区別しておいておきたいので、ビルダーのあるフォルダ(C:\Program Files\Borland\CBuilder6\)に
\MyVCL
というフォルダをつくり、そこに保存しています。
こうすると、ビルダー自体がバージョンアップしたときに持っていく作業が楽になりますからね。
で、...続きを読む

Q子フォームから親フォーム上のコントロールを操作したい

VC++.NET(C++/CLI)にてアプリケーションを開発しております。
親フォーム(FormParent)と子フォーム(FormChild)があり
子フォームから親フォーム上にあるtextBox1を操作したいのですがうまくいきません。

親フォームからはFormChild.hをインクルードすることで
親フォームのインスタンスを得て、子フォームを表示させているのですが
これに加えて子フォームからFormParent.hをインクルードすると循環参照(と言うのですか?)
となる為にエラーになってしまいます。

よろしくお願いします。

Aベストアンサー

VC++は使ってませんのでC/C++一般の問題としての回答です。

子フォームのヘッダファイル内で親ファイルのヘッダをインクルードしてませんか?
それなら、子フォームのソースファイル(*.cpp)内でインクルードするようにすればよいはずです。

ただ、子フォームから親フォームが見えるようにする(親フォームのヘッダをまるまるインクルードする)のはあまり綺麗な設計とは思えません。

子フォームにtextBoxを操作する関数を作り、引数としてtextBoxのポインタなり参照なりを渡すようにすれば、子フォームが親フォームのヘッダをインクルードする必要はなくなりますが。
※子フォームは当然textBoxの型は知っているという前提。

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む


人気Q&Aランキング