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

C++Builder相談室 Part13

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/02/15 20:58:38
C++Builderに関する質問・回答や議論等を行う相談室スレッド。

過去スレ・関連サイトは>>2-6あたり。
0611デフォルトの名無しさん2005/04/30(土) 19:52:47
>>610
それMFC?
C++BuilderならWideStringやstd::wstringで書きまくるべし
Win9xはごく一部のUnicode関数しか実装していないのよねぇ
06126102005/04/30(土) 20:02:59
MFCではないです。
知りたいことだけを言えば、
『エントリポイント関数を、 WinMain から wWinMain にするには
どうすれば良いか?』ということです。
0613デフォルトの名無しさん2005/04/30(土) 22:25:37
>>612
プロジェクトオプション→ディレクトリ/条件タブ→条件定義に「_UNICODE」を追加。
又はオプションソースを開いて、コマンドラインオプションに「-WU」を追加。

#include <windows.h>
#include <tchar.h>

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
  return 0;
}
06146102005/05/01(日) 00:02:04
>>613
解決しませんでした。
メイク可能なプロジェクトファイル一式をうpしてくれたら幸いです。
0615デフォルトの名無しさん2005/05/01(日) 00:29:48
あれ?じゃあオプションソースに「c0w32.obj」があったら「c0w32w.obj」に書き換えて。
BCB上で書き換えても反映されないかもしれないから、BCB終了して適当なエディタで。

それでもできなければうpする。
06166102005/05/01(日) 00:46:25
>>615
無理でした。

メイクファイルを作成して、そのc0w32.objを書き直した場合は成功しますが、
手間がかかるので、より簡単な方法があるなら知りたいです。
0617デフォルトの名無しさん2005/05/01(日) 00:58:20
うちでは出来てるからなぁ。お手上げ。
06186102005/05/01(日) 01:31:58
いまいちよくわからないけど、教えられたことをいじりまくっていたら、
開発環境から UNICODE モードでコンパイルできるようになりました。
thx
0619デフォルトの名無しさん2005/05/01(日) 09:32:45
C++ Builder6 使っているんですが プログラム中で
aを√したい場合と aをcos場合どうすればいいでしょうか?
sqrt(a) cos(a) してもうまくできないです。
0620デフォルトの名無しさん2005/05/01(日) 09:35:15
ちなみにcos
a=float cos(float a);
でもやってみたのですが、ぜんぜんうまくいきませんでした。
0621デフォルトの名無しさん2005/05/01(日) 09:54:52
CppWebBrowserでブラウザを作ったけど、
現在表示されてるページのURLをEditに表示するには
どうしたらいいのでしょうか。
0622デフォルトの名無しさん2005/05/01(日) 10:18:54
memo のなかに memo1というのが常に表示されているのですが、これを消したいのですが
どうすればいいですか?
0623デフォルトの名無しさん2005/05/01(日) 11:48:54
>>619-620
ヘルプを読む。
それでも分からなかったら、
自分の書いたソース晒して何がどう上手くいかなかったのか具体的にかけ。

>>621
TCppWebBrowser::LocationURL

>>622
TMemo::Lines

ってか人に聞く前にヘルプちゃんと読め。
0624デフォルトの名無しさん2005/05/01(日) 11:57:11
タスクバーを除くデスクトップサイズを取得するにはどうしたらよいのでしょうか?
0625デフォルトの名無しさん2005/05/01(日) 11:58:06
ここの回答者もヘルプ機能の一種ですから、
ここで質問することとヘルプを参照することはイコールです。
0626デフォルトの名無しさん2005/05/01(日) 12:09:22
>>624
TMonitor::WorkareaRect
0627デフォルトの名無しさん2005/05/01(日) 12:09:24
>>624
TRect r;
SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);//rにディスプレイのタスクバーを除く
      //デスクトップ領域が代入される

int width = r.Right - r.Left;  // Width
int height = r.Bottom - r.Top; // Height
06286242005/05/01(日) 12:55:54
親切な回答、ありがとうございます。
0629デフォルトの名無しさん2005/05/01(日) 13:21:05
次回作は?
0630デフォルトの名無しさん2005/05/01(日) 15:03:05
>>622
オブジェクトインスペクタでMemo1、Linesプロパティの右の...をクリック。
文字列リストの設定ダイアログで"Memo1"の文字列を削除。
0631デフォルトの名無しさん2005/05/01(日) 15:53:18
>>629
っ[BCB9]
0632デフォルトの名無しさん2005/05/01(日) 17:13:00
次回作っつーと映画みたいだな
0633デフォルトの名無しさん2005/05/01(日) 19:30:15
ボタンを押して、TabControlでタブを追加するやり方って
どうやるのですか?
0634デフォルトの名無しさん2005/05/01(日) 21:29:17
TabControlを使ってます。TabControl上にいくつかコンポーネントを
つけました。

buttonを押すとタブを自動的にひとつ追加することはできたのですが、
新しくできたタブ上にもともとあったコンポーネントと同じものを追加するにはどうすればいいのでしょうか。

(簡単に言うとTabControl上にEditがあり、buttonを押すとタブが1つ増えて、新しくできたそのタブ上にもEditが自動的にできるようにしたい、ということでです。)
0635デフォルトの名無しさん2005/05/01(日) 21:51:05
>>634

VCLリファレンスヘルプから引用
>TTabControl は異なるコントロールを格納する
>複数のページを持たない単一のオブジェクトです。
>現在のタブが変わると,タブコントロールは変更を
>反映するために OnChange イベントハンドラで
>直接コントロールの内容を更新しなければなりません。
引用終わり

>新しくできたタブ上にもともとあったコンポーネントと同じものを追加する
不可能。TPageControlのことか?
0636デフォルトの名無しさん2005/05/01(日) 22:30:43
>>635
あ、間違えました。ご指摘のとおりTPageです
0637デフォルトの名無しさん2005/05/01(日) 23:43:04
>>636
TPageなんてコンポーネントは存在しないぞ。
質問するときゃコンポーネント名くらい正確に書け。

複数のタブシートで同種のコンポーネントを使いたいなら
それこそTTabControlを使えばいい。
TPageControlは動的にページを追加するような使い方はあまりしない。

どうしてもやりたかったら追加したいコンポーネントをnewしてシート上に
配置するしかない。
複数のコンポーネントを扱うならフレームにまとめておけば一発で配置できる。

しかし、TTabControlを使うことを考えたほうが利口だとは思う。
0638デフォルトの名無しさん2005/05/02(月) 05:26:20
StatusBarの中にProgressBarを表示したいのですが、どうしたら出来るのでしょうか?
0639デフォルトの名無しさん2005/05/02(月) 06:49:08
ProgressBar->Parent = StatusBar
位置はてきとーに調整
0640デフォルトの名無しさん2005/05/02(月) 06:50:26
C++Builderで作ったGUIはなんか
VisualC++でつくったのよりキビキビしてない気がするんですが
気のせいですか?
0641age2005/05/02(月) 08:48:49
気のせい
0642デフォルトの名無しさん2005/05/02(月) 09:32:53
VCLはメッセージをいろいろ処理してるのでもっさりしてるようです
0643デフォルトの名無しさん2005/05/02(月) 11:34:45
>>640
パソコンをグレードアップしろ。2GHz未満のCPUなぞ使うな。
0644デフォルトの名無しさん2005/05/02(月) 12:39:06
>>643
2GHzのCeleronは1.4GHzのCeleronより早いですか?
0645デフォルトの名無しさん2005/05/02(月) 12:49:19
>>644
CPU自体の速度はそんなに変わらないだろうが、メモリ周りが明らかに速い。
0646デフォルトの名無しさん2005/05/02(月) 13:00:08
>>640
GUIでC++BuilderとVCのスピードの差などない。
本当にC++Builderで作ったのか?
Javaじゃないのか?
0647デフォルトの名無しさん2005/05/02(月) 13:26:23
>>646
ワロタ
0648デフォルトの名無しさん2005/05/02(月) 13:46:25
>>646
Javaはおそいねぇ。個人的にはこれがクライアントアプリケーションで使われなくなった最大の原因だと思うのだが(言語仕様的には好きなんだけどね)
0649デフォルトの名無しさん2005/05/02(月) 16:03:11
C++Builder1でTListViewにチェックボックスを付ける方法を教エロ
0650デフォルトの名無しさん2005/05/02(月) 16:26:55
げ、TEditとかTLabeledEditにOnMouseWheel系が無いのかよ。
マンドクセ
0651デフォルトの名無しさん2005/05/02(月) 16:39:33
>>649
TListViewを継承して作ったらいいんじゃない?
0652デフォルトの名無しさん2005/05/02(月) 20:51:46
ProgressBar1->Parent = StatusBar1;
0653デフォルトの名無しさん2005/05/02(月) 20:59:33
ProgressBar1->Parent = StatusBar1;

ProgressBar1->Top = 1;
ProgressBar1->Left = 1;
0654デフォルトの名無しさん2005/05/02(月) 21:06:09
ProgressBar1->Parent = StatusBar1;
ProgressBar1->Top = 2;
ProgressBar1->Left = 2;
0655デフォルトの名無しさん2005/05/02(月) 21:35:51
実行後に、ボタンを押して、Memoを増やす方法ってどうやるのですか?
はじめはフォームにButton1とMemo1がありますが、実行後に
Button1を押すとMemo2、Memo3・・・を表示することです
0656デフォルトの名無しさん2005/05/02(月) 21:45:23
動的にコントロールを作成する

C++ Builderで、実行時にTEditなどのコントロールを動的に作成するには、以下のようにします。
Parentを必ず設定する必要があります。

TEdit *DynamicEdit = new TEdit(Form1);
DynamicEdit->Parent = Form1;
DynamicEdit->Name = "DynamicCreateTEdit";
DynamicEdit->Left = 100;
DynamicEdit->Top = 100;
0657デフォルトの名無しさん2005/05/02(月) 21:47:20
コンポーネントの動的な作成方法



コンポーネントを動的に作成するにはどうすればいいのでしょうか?


下記のように記述すれば可能です。
注意として必ず,Parentプロパティに親となるコンポーネント(Form,Panel等)を 指定するようにしてください。
これにより,不特定多数のコンポーネントを使用したり,配列でコンポーネントをコ ントロールできるようになります。


//ユニットのヘッダのprivateに以下の一行を記述
TLabel *labels[9];

//以下の記述をボタンのクリック時のイベントに記述
//また,Form1にPanel1というパネルを事前にはっておいてください

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i=0;i<=9;i++)
{
labels[i]=new TLabel(Form1);
labels[i]->Top=i*20;
labels[i]->Caption="Label"+IntToStr(i);
labels[i]->Parent=Panel1;
}
}
0658デフォルトの名無しさん2005/05/02(月) 21:49:12
http://cgi38.plala.or.jp/flash100/Accesslog.cgi
こういうヤツの作り方ってどうやるんですかね?
0659デフォルトの名無しさん2005/05/02(月) 21:58:32
CGIの作り方ならWEBプログラミング板でないかい
0660デフォルトの名無しさん2005/05/02(月) 22:46:47
>>657ありがとうございます。それとCppWebBrowserも
動的に増やしたいのですが、TCppWebBrowserってしたらエラーがでたのですが・・
0661デフォルトの名無しさん2005/05/02(月) 23:06:17
TCppWebBrowser *CppWebBrowser = new TCppWebBrowser(this);
0662デフォルトの名無しさん2005/05/02(月) 23:10:04
 
TCppWebBrowser *CppWebBrowser = new TCppWebBrowser(this);

だったのを

TCppWebBrowser *CppWebBrowser = new TCppWebBrowser(Owner);
0663デフォルトの名無しさん2005/05/03(火) 00:54:51
>>660
TCppWebBrowserのParentの設定は、CppWebBrowser1->TOleControl::Parent = 〜
ってしないとだめ。
0664デフォルトの名無しさん2005/05/03(火) 00:56:40
って別にParentの設定でエラーが出たとは書いてないか。たぶんそうだと思うんだけど。
エラーが出たら、最低限エラーメッセージを書こうぜ。
0665デフォルトの名無しさん2005/05/03(火) 01:06:53
PageControlでタブシートを1から2へ切り替えたとき
1のコンポーネントが前に出っ放し。
1のコンポーネントが邪魔で2のコンポーネントが
見えない・・・・・。
誰か助けて・・・・
0666デフォルトの名無しさん2005/05/03(火) 01:28:50
>>665
シートの切り替えはどうやってる?
0667デフォルトの名無しさん2005/05/03(火) 08:18:53
切り替えるというか・・・自分の説明不足でした。スマソ。
PageControl上にCppWebBrowserを乗っけて、実行後
新しいウィンドウで開くを選ぶと別のタブが自動的にできるように
してある。ただ、新しいタブ上のCppWebBrowserが隠れて見えない。
それに新しいタブ上のCppWebBrowserで新しいウィンドウで開くを選ぶと
IEが起動してしまいます・・・。
0668デフォルトの名無しさん2005/05/03(火) 08:29:06
2つのTCppWebBrowserを用意して、
CppWebBrowser1を表示用のブラウザ、
CppWebBrowser2を、
表示されないブラウザ用とします。(CppWebBrowser2の
Width, Height を0にしておきます。)

そして、CppWebBrowser1のOnNewWindow2で、
新しいページを一度CppWebBrowser2に表示させ、
そのURLを所得して、
CppWebBrowser1からNavigateすることで、
新しいウィンドウを開かずに、表示することが
できると思います。

コードだと

void __fastcall TForm1::CppWebBrowser1NewWindow2(TObject *Sender,
LPDISPATCH *ppDisp, TOLEBOOL *Cancel)
{
*ppDisp = CppWebBrowser2->Application;
}
//------------------------------------------------------------------------ - --
void __fastcall TForm1::CppWebBrowser2NavigateComplete2(TObject *Sender,
LPDISPATCH pDisp, TVariant *URL)
{
CppWebBrowser1->Navigate(CppWebBrowser2->LocationURL);
}

という感じになります。
他にも方法はいろいろあるのかも知れません。
0669デフォルトの名無しさん2005/05/03(火) 11:36:36
>>667
(´-`).。oO(ただ単にActivePageが切り替わってないだけじゃ…)
0670デフォルトの名無しさん2005/05/03(火) 12:01:46
>>668
>>669
ありがとうございます。しかしなぜかできませんでした。
たしかに、ActivePageを切り替えてるのですが・・・


タブブラウザ風にしたいのです。
void __fastcall TForm1::CppWebBrowser1NewWindow2(TObject *Sender,
LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel)
{

TTabSheet *TabSheet = new TTabSheet( this );
TabSheet->PageControl = PageControl1;
TabSheet->Parent=PageControl1;
PageControl1->ActivePage = TabSheet;
TCppWebBrowser *CppWebBrowser=new TCppWebBrowser(this);
CppWebBrowser->TOleControl::Parent=TabSheet;
CppWebBrowser->Align=alClient;
*ppDisp = CppWebBrowser->Application;
としたのですが・・。

なぜかCppWebBrowser1が常に一番先頭に出てきてしまいます。
新しいタブ上のCppWebBrowserはCppWebBrowser1でほとんど
隠れてしまいますが、端っこだけ見れます。そこで
新しいウィンドウで開くを選ぶと IEが起動してしまうのですけども・・。

どうもCppWebBrowser1以外は新しいウィンドウで開くを選ぶと IEが起動
してしまいます。


0671デフォルトの名無しさん2005/05/03(火) 12:28:49
>>670
うちでは隠れなかったので、隠れるというのは分からないけど、
IEが起動するのは、単に新しく作ったCppWebBrowserのOnNewWindow2イベントを設定してないからでは?
0672デフォルトの名無しさん2005/05/03(火) 13:17:45
>>671
動的に作ったCppWebBrowserのOnNewWindow2イベントの設定ってどうやれば
いいのですか?CppWebBrowserは実行前は1つしかありません・・・
0673デフォルトの名無しさん2005/05/03(火) 13:22:49
例えば>>670のイベントを使うなら、
CppWebBrowser->OnNewWindow2 = CppWebBrowser1NewWindow2;
ってすればいい。
0674デフォルトの名無しさん2005/05/03(火) 13:33:40
>>673
やっとできました。ありがとうございます!
0675デフォルトの名無しさん2005/05/03(火) 14:04:06
必要ないダイアローグをプロジェクトから削除したら、が表示されなくなった。
「フォーム作成中にエラーが発生しました。継承元の'TOKBottomDlg'がみつかりません」とのこと。
必要なダイアローグ、表示するにはどうすればいいのでしょう?
0676デフォルトの名無しさん2005/05/03(火) 14:04:35
必要ないダイアローグをプロジェクトから削除したら、必要なダイアローグが表示されなくなった。
「フォーム作成中にエラーが発生しました。継承元の'TOKBottomDlg'がみつかりません」とのこと。
必要なダイアローグ、表示するにはどうすればいいのでしょう?
0677デフォルトの名無しさん2005/05/03(火) 14:44:16
メインフォーム上のPanelをalign=clientでフォームいっぱいまでのばしているソフトで、
例えばパネルの大きさを100*100にしたいときに、メインフォームの大きさはどのように
して計算すればよいのでしょうか?
0678デフォルトの名無しさん2005/05/03(火) 15:22:32
Screen->Width
GetDeviceCaps(Canvas->Handle, HORZRES);
0679デフォルトの名無しさん2005/05/03(火) 15:24:05
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();

Memo1->Lines->Add(Format("物理画面の幅 = %d mm",
ARRAYOFCONST(((int)GetDeviceCaps(Canvas->Handle, HORZSIZE)))));
Memo1->Lines->Add(Format("物理画面の高さ = %d mm",
ARRAYOFCONST(((int)GetDeviceCaps(Canvas->Handle, VERTSIZE)))));
Memo1->Lines->Add(Format("ディスプレイの幅 = %d pixels",
ARRAYOFCONST(((int)GetDeviceCaps(Canvas->Handle, HORZRES)))));
Memo1->Lines->Add(Format("ディスプレイの高さ = %d pixels",
ARRAYOFCONST(((int)GetDeviceCaps(Canvas->Handle, VERTRES)))));
Memo1->Lines->Add(Format("各ピクセルのビットの数 = %d",
ARRAYOFCONST(((int)GetDeviceCaps(Canvas->Handle, BITSPIXEL)))));
}
0680デフォルトの名無しさん2005/05/03(火) 16:40:19
>>677
フォームのClientWidthとClientHeightを100にすれば勝手に必要な大きさになるけど、
そうじゃなくて、ClientWidthとかを設定しないで、計算で求めたいということ?
0681デフォルトの名無しさん2005/05/03(火) 19:20:30
ProgressBar1->Parent = StatusBar1;
ProgressBar1->Top = 2;
ProgressBar1->Left = 2;
0682デフォルトの名無しさん2005/05/04(水) 04:09:57
MediaPlayerではコーデックが入っていてもmp3は再生できないのでしょうか?
0683デフォルトの名無しさん2005/05/04(水) 11:35:26
>>682
TMediaPlayerならMCIのラッパだから再生できるはずだぞ。

try
{
MediaPlayer1->FileName = "C:\\Music\\music.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
}
catch(Exception &e)
{
ShowMessage(e.Message);
}
0684デフォルトの名無しさん2005/05/04(水) 15:17:13
FastNetもしくはIndyを使ってのメールのUIDLの取得方法を教えてください
0685トラックバック ★2005/05/04(水) 15:24:51
【トラックバック来たよ】 (ver. 0.11)
[タイトル] ↓
[発ブログ] ニー速@2ch掲示板
http://ex10.2ch.net/test/read.cgi/neet4vip/1115187035/l50
( ref= http://ex10.2ch.net/test/read.cgi/neet4vip/1115187035/l50 )

[=要約=]
↓

0686デフォルトの名無しさん2005/05/04(水) 18:24:20
>>677
それやめたほうがいいんじゃね?
子の側のコントロールのサイズを固定にして、
親の側をサイズ自動にしたら?

あるいはそうやって表示した後で
こっそり切り替えるというのはどう?
思いつきだけど
0687デフォルトの名無しさん2005/05/04(水) 19:20:14
http://www.borland.co.jp/cppbuilder/papers/cb4guide/cb4guide08.html

[]
上下、左右の空きの比 率を一定に保つ
コンポーネントのサイズ は変わらない



[akLeft, akTop, akRight, akBottom]
上下、左右の間隔を一 定に保つように、
コンポーネントのサイズ を変更する
0688デフォルトの名無しさん2005/05/05(木) 04:21:43
二重起動を防止しつつ、既存の方に情報を渡すにはどうしたらよいのでしょうか?
具体的には、メディアプレーヤーのように開かれるべきファイル名を渡したいのですが。
0689デフォルトの名無しさん2005/05/05(木) 06:20:32
アプリケーションの二重起動防止
http://www.borland.co.jp/qanda/cbuilder/c0003242.html
アプリケーションを 2 つ以上同時に起動しないようにしたい場合は?
0690デフォルトの名無しさん2005/05/05(木) 07:04:33
>>689
それだと、2つめが起動しないだけで、既存の方に情報を渡せないんです。
0691デフォルトの名無しさん2005/05/05(木) 11:12:36
>>690
すでにアプリが起動してたら適当なプロセス間通信手段を使って既存アプリにデータを渡す。
前者はWM_COPYDATAとかあるし後者はメモリマップドファイルとかがある。
0692デフォルトの名無しさん2005/05/05(木) 11:13:45
と、まあWM_USERで通知して共有メモリに書き込んでおいて、既存側はメッセージ受けたら共有メモリ覗けばいいだけか
0693デフォルトの名無しさん2005/05/05(木) 20:40:18
同じアプリ間だからてこずってんだろ?
0694デフォルトの名無しさん2005/05/05(木) 22:31:20
同じとか同じじゃないとか関係ないと思うが?
0695デフォルトの名無しさん2005/05/06(金) 03:09:43
boostは使えますか?
0696デフォルトの名無しさん2005/05/06(金) 04:08:30
>>695
クラスによりけり。
http://www.meta-comm.com/engineering/boost-regression/cvs-head/developer/index.html
それぞれのborland- 5_6_4のとこを見る。
0697デフォルトの名無しさん2005/05/06(金) 07:07:39
このソフトは有料ですか
0698デフォルトの名無しさん2005/05/06(金) 16:53:34
メインスレッドでSleepをかけた時、そのプログラムから作られた他のスレッドも同じくsleep状態になりますか?
0699デフォルトの名無しさん2005/05/06(金) 17:41:51
>>698
他のスレッドにまで影響したら、Sleep() は使い物にならない。
0700デフォルトの名無しさん2005/05/07(土) 02:52:38
スレッドがまだ実行中か終了したかを判別するにはどうしたらよいのでしょうか?
0701デフォルトの名無しさん2005/05/07(土) 03:00:25
OnTerminateでフラグを立てるとか
0702デフォルトの名無しさん2005/05/07(土) 13:29:35
子スレッドが、親スレッドへ、子スレッドが終わったよと何かしらの
方法で伝えればよい
0703デフォルトの名無しさん2005/05/07(土) 21:04:19
グローバル変数でフラグ立ては微かに危険?
0704デフォルトの名無しさん2005/05/07(土) 21:50:03
どんなプロシージャもグローバル変数なしで
記述できる

グローバル変数はいわば手抜き
0705デフォルトの名無しさん2005/05/07(土) 22:34:02
>>703
スレッドが一つなら正解だよ
0706デフォルトの名無しさん2005/05/08(日) 10:29:27
TThread.Terminatedってプロパティ無い?
0707デフォルトの名無しさん2005/05/08(日) 12:32:23
>>706
そいつは終了したかどうかの判定には全く使えない
0708デフォルトの名無しさん2005/05/08(日) 16:30:28
CppWebBrowzerだっけ?スペル忘れたが・・・
これで表示してるWebページのURL
をRichEditに表示するにはどうすればいいの?
0709デフォルトの名無しさん2005/05/08(日) 16:35:06
>>708
RichEdit1->Lines->Add(CppWebBrowser1->LocationURL);
0710デフォルトの名無しさん2005/05/08(日) 17:14:30
>>709
乙
サンクス
■ このスレッドは過去ログ倉庫に格納されています