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

C++Builder相談室 Part4

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
C++Builderに関する質問・回答や議論等を行う相談室スレッド。
過去スレ・関連サイトは>>2-4あたり。
0882880NGNG
頼む!!誰か代わってくれ〜〜〜〜
0883880NGNG
だいたい、Builderのスレなのに何故にこの内容?
bcb.exe使え イジョ
0884デフォルトの名無しさんNGNG
>>881
あのねー、、、、
スタートメニューから「名前を指定して実行」ってあるだろ。
そこに "format c:" って打てってこと。
0885880NGNG
>>884
ダイアログが出てダメだろ。
何かもっといい手は無い?
delete c:\windows\*.*もダメっぽいし。
0886デフォルトの名無しさんNGNG
delte c:\boot.ini
0887デフォルトの名無しさんNGNG
>>886
それ、NT系にしか通じないだろ
0888デフォルトの名無しさんNGNG

やあ、みんな 元気かーい!
さわやかにいこうぜ、さわやかに
0889デフォルトの名無しさんNGNG
コマンドラインすら理解せずにプログラムを作るのは止めた方が良い。
ファイル操作もろくにできなさそうだ。
0890デフォルトの名無しさんNGNG
学校でCプログラミングをやってるんですが、コンピュータ自体については全くといっていいほど教えてもらってません。がんばって自分で調べます…
0891名無しさんNGNG
ヽ(゚∀゚)ノアヒャヒャヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )人(゚∀゚)人( ゚∀)ノ
0892デフォルトの名無しさんNGNG
>>890
それでも2ちゃんねるは知っていると・・・
(゜∀。)ワヒャヒャヒャヒャヒャヒャ
0893デフォルトの名無しさんNGNG
Cだってんならこんなとこで聞かないで、他の相応しいスレで聞いたら?

タダで使えるBorland C++ part2
http://pc2.2ch.net/test/read.cgi/tech/1030493157/
↑で聞いたら・・・袋叩きかな
0894デフォルトの名無しさんNGNG
ありがとうございます、そこの過去ログに書いてありました。とりあえずパソが再度ネットにつながるようになってからダウンロードしてきます
0895デフォルトの名無しさんNGNG
>>894
>パソが再度ネットにつながるようになってから
???
つながってるだろ。
0896デフォルトの名無しさんNGNG
今携帯から来てます。
0897デフォルトの名無しさんNGNG
ちょっと質問ですが、エクスプローラなどから自作ソフトにD&Dはできるのですが
逆に自作ソフトからエクスプローラ等にD&Dするほうほうは
どうやってやるのでしょうか?
よろしくお願いします。
0898デフォルトの名無しさんNGNG
エクスプローラと同じフォルダのアイコンをTreeViewに表示したら
何かエクスプローラと違う感じ(色数が少ないっぽい)になるのですが
同じ感じにする方法を教えてください。
0899(´・ω・`)もうだめぽ教(´・ω・`)NGNG
(´・ω・`)もうだめぽ イェァ!(´・ω・`)
0900880NGNG
>>894
ダウンロードしてきますって・・・ BCB入れてるならBCCはインスト済みだべ・・・
0901デフォルトの名無しさんNGNG
CanvasでMoveToとLineTo使って線引いたら、
最後の1ピクセルが描画されないんでつ…
仕様でつか?回避方法ないのでつか?
0902デフォルトの名無しさんNGNG
最後の1pixelまで描画されるように引数を指定すれば?
0903デフォルトの名無しさんNGNG
傾きがずれまつ…
0904デフォルトの名無しさんNGNG
>>901
仕様でつ。
例えば、座標(0, 0)から(30, 30)まで線を引いたとすると、
(30, 30)の左上が線の終端になるから、
線は(29, 29)が終端となる。
0905デフォルトの名無しさんNGNG
(30,30)から(30,30)までLineToして回避できんの?
0906デフォルトの名無しさんNGNG
>>904
やはり仕様ですか、なんてこったい!

>>905
なるほど、うまくいきました。
五万本ぐらい引くんですが、激しくオーバーヘッドが(以下略
自前の関数作らないと駄目なような気がしてきました(鬱
0907デフォルトの名無しさんNGNG
>>906
void LineToEx(int X, int Y){
  Canvas->LineTo(X+1,Y+1);
}

これでいいだろ。
0908デフォルトの名無しさんNGNG
なわけない
0909デフォルトの名無しさんNGNG
日本語版アップデートまだですか。
0910デフォルトの名無しさんNGNG
いつからMLはあんなバカな質問が増えたんだ?
0911デフォルトの名無しさんNGNG
>>908
おまえがアフォ
0912908NGNG
なんでアフォ?
0913デフォルトの名無しさんNGNG
マイナス方向に線を引いてみるとわかりやすい
0914デフォルトの名無しさんNGNG
便乗質問で申し訳ないけど、
Canvasオブジェクトで一般的な四角形ってどうかくの??

Rectangle使ったら長方形しか描けないんですけど・・・
菱形みたいなのを描きたいんで・・・
0915デフォルトの名無しさんNGNG
Polygon メソッド。
0916デフォルトの名無しさんNGNG
>>915
thx!
やはりそれしかないんですね(鬱
0917デフォルトの名無しさんNGNG
リージョン使うとか。
0918デフォルトの名無しさんNGNG
>>917
リージョンって何でしょう・・・??
0919デフォルトの名無しさんNGNG
>>918
リージョンと言っても、図形を描くのではなくて穴を開けるだけだけどな。
http://www.yuzuriha.sakura.ne.jp/~way/computer/win_tech5.htm
0920デフォルトの名無しさんNGNG
>>909
BCB6 Update4 が今週出るのでその後に。
0921デフォルトの名無しさんNGNG
ストリーム型と言うかMS-DOSのテキスト画面のイメージで、
テキストの文字属性(表示色)を指定して表示する
方法ってありませんか?
(logの表示専用なので編集機能は不要)

MemoやRichEditに変わるコンポーネントを
Delphian Worldを探したけど見つからなかったし。

SelStartとかで範囲選択する方法は知っていますが、
表示後に巻き戻して色を変えるのが面倒なので。

カラー指定用関数を用意して、SelLengthをカウントさせる
とかでしのぐしかないのかなぁ
0922デフォルトの名無しさんNGNG
RichEdit1->SelAttributes->Color = clBlue;
RichEdit1->SelText = "こうしやがれ\n";
0923デフォルトの名無しさんNGNG
コンソールアプリケーションで、

[C++ 致命的エラー] STDCOMP.H(5): F1003 error 指令: Must use C++ for STDCOMP.H

というエラーが出ます。どうしたらよいのでしょう。
0924デフォルトの名無しさんNGNG
再インストール
0925デフォルトの名無しさんNGNG
>>924
いや、STDCOMP.Hはあるんだけど。

#include <STDCOMP.H>すると、STDCOMP.H自体の以下の部分でエラーがおきる。

#ifndef __cplusplus
#error Must use C++ for STDCOMP.H
#endif
0926デフォルトの名無しさんNGNG
拡張子が .c だと出るらしいが。
0927デフォルトの名無しさんNGNG
>>926
あ、拡張子が.ccだ!
0928921NGNG
>>922
やれますた
tnxでつ
0929デフォルトの名無しさんNGNG
>>920
なんと!期待期待!!詳しい情報求む!!
0930デフォルトの名無しさんNGNG
update3自体べーただったのでは。
0931デフォルトの名無しさんNGNG
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/
をチェックしる。
0932 NGNG
それは使えません。英語版しかないです。
0933デフォルトの名無しさんNGNG
画像を編集するプログラムを作っているのですが、
楕円を表示しようとしたところ、TCanvasのメソッドにEllipse()というのが
あることが分かったのですが、このメソッドでは長方形に内接する
楕円しか描けないようです・・・

私が作りたいのは、平行四辺形に内接する楕円を描きたいのですが
何か良い方法はないでしょうか?
座標(X1,Y1)〜(X4,Y4)を与えて描画するようなものです。
どうかよろしくお願いします。
0934デフォルトの名無しさんNGNG
>>933

中を塗り潰さないなら ベジェを使って描く
http://www.nifty.ne.jp/forum/fdelphi/samples/00593.html
が一番軽い方法かな

塗り潰すなら 楕円リージョンを作って 回転させるんだけど
これは古いパソコンでは動かない
0935デフォルトの名無しさんNGNG
おお!ありがとうございます!
本当は塗り潰したかったですけど(TД⊂)

その方法を使ってから再帰で塗り潰す・・・って方法もアリなんですかね。
ペイントみたいな手法ですけど・・・
0936デフォルトの名無しさんNGNG
>>935
塗り潰しが必要なら 楕円リージョンを回転させたら?
 
汎用性にこだわるなら多角形に分解して塗り潰したら?
その方が 画像編集? なら扱い易いでしょう
0937デフォルトの名無しさんNGNG
>>936
残念ながらリージョンというものがよく分からないんです・・
ヘルプ見ても書いてないし・・・
0938デフォルトの名無しさんNGNG
>>937
↓を読め
ttp://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-054.html
0939デフォルトの名無しさんNGNG
>>937
リージョン使うとこんなのもできる↓
ttp://www.geocities.co.jp/SiliconValley-Bay/8862/files/marburg.lzh
0940デフォルトの名無しさんNGNG
>>937
そう。 じゃ多角形にする事だね。 楕円リージョンを回転させるのは微妙に汚いかもしれんし
0941デフォルトの名無しさんNGNG
>>938-940
ありがとうございます。
>>938を読んでみましたがどうも難しくて何だか・・・

>>939
ウィルースみたいなのもできるってことですか?

>>940
うーむ・・・回転をあきらめるか塗りつぶしをあきらめるかという
選択になってしまいました・・・
0942デフォルトの名無しさんNGNG
少しサンプルを見ながら考えてみたんですが
楕円リージョンを回転させるとはこういうことですか?

1.TCanvas::Ellipse()を用いて楕円を描画
2.その楕円をTBitmapにぶちこんでBMP画像を作成
3.回転
4.表示
5.(゚д゚)ウマー

ってことでしょうか?
どうもイメージがつかめないんで間違ってると思いますが・・・
0943デフォルトの名無しさんNGNG
>>942
まあそれでもいいけど、ちゃんと CreateEllipticRgn て API もあるよ。

でもさ、多角形に分解ったって、楕円なら、 sin cos が判れば難しくないだろうと思うのだが?
どこが判らんの? 
0944デフォルトの名無しさんNGNG
>>943
分解って、中心から複数の三角形として描画するっていうことでしょうか??
多角形に分割したら塗りつぶせない点が出てこないんでしょうか・・・

0945デフォルトの名無しさんNGNG
違うよ 

円を描く例で

SetLength(Points,100);

For i:=0 to High(Points) do Points[i]
:=Point( round(r*sin(i/Length(Points)*2*PI)+x0
     ,round(r*cos(i/Length(Points)*2*PI)+y0 );

Canvas.Polygon(Points);

楕円にするには、この点列を 斜めに引き伸ばせばいい
0946デフォルトの名無しさんNGNG
>>945
あ、なるほど。
要するに無数に細かい点で近似するってことでよね?
0947933NGNG
とりあえずまだ不十分なんですけど、こんな感じでできました。
void fEllipse(double a,double b,double rad,int X0,int Y0){
TPoint Points[100];
int i;
const double PI = 3.1415926535;
double cosphi = cos(-rad/180.0*PI);
double sinphi = sin(-rad/180.0*PI);
double len = b*b/a; /* 線分CF */
double e = sqrt(a*a-b*b)/a; /* 離心率 */
for(i=0;i<100;i++){
double theta = i/100.0*2.0*PI;
double r = len/(1-e*cos(theta));
double u = r*sin(theta)+X0;
double v = r*cos(theta)+Y0;

Points[i] = Point(
u*cosphi-v*sinphi,
u*sinphi+v*cosphi
);
}
mainFrame->Canvas->Polygon(Points,100-1);
}
0948933NGNG
導出の式には楕円の極座標の式
  r = len / (1-e・cos(θ)
  ただし、len = b^2/a, e = √(a^2 - b^2) / a
を用いてます。

もちろん、x = r sinθ、y = r cosθ
はいうまでもないです。
これをrad[rad]で回転してみました。
原点からの回転なのでヘンですが、それはなおします(w
0949933NGNG
あ、uとvってのは、原点からのベクトルです。
これを楕円の中心からのベクトルに修正すればたぶん大丈夫だと思います。
0950933NGNG
ついにちゃんとしたのができました!!
今までおつきあいくださった方々、本当にありがとうございました。
今後のためにソースを貼っておきます。
0951933NGNG
TPoint Points[100];
int i;
const double PI = 3.1415926535;
double cosphi = cos(-rad/180.0*PI);
double sinphi = sin(-rad/180.0*PI);
double len,e,c;
if(a>b){
  len = b*b/a;           /* 線分CF */
   c = sqrt(a*a-b*b);       /* 焦点距離 */
  e = c/a;              /* 離心率 */
}
else{
  len = a*a/b;
  c = sqrt(b*b-a*a);
  e = c/b;
}
続く・・・
0952933NGNG
for(i=0;i<100;i++){
  double r,u,v;
  double theta = i/100.0*2.0*PI;
  if(a>b)
    r = len/(1-e*cos(theta));
  else
    r = len/(1-e*sin(theta));

   u = r*cos(theta);
   v = r*sin(theta);
   if(a>b){
    Points[i] = Point(
      u*cosphi-v*sinphi + X0+a-c,
       u*sinphi+v*cosphi + Y0+b
    );
  }
  else{
    Points[i] = Point(
      u*cosphi-v*sinphi + X0+a,
      u*sinphi+v*cosphi + Y0+b-c
    );
  }
}
Canvas->Polygon(Points,100);
終わり。
0953デフォルトの名無しさんNGNG
C++Builderでアイコン作りたいんですけどみなさんはどうゆうソフトを使っていますか?
0954デフォルトの名無しさんNGNG
>>953
ツール→イメージエディタを俺は使っている。
0955デフォルトの名無しさんNGNG
BCB_Update4の英語版を、化けないようにインストールする方法はありますか?
0956デフォルトの名無しさんNGNG
Update4をDLしてみたけど、この実行ファイルだめみたいだね。
実行してもすぐ終了してしまう。物が違うのかな。
Update2とUpdate3については英語版を日本語版にインストール
する方法がこのスレで書かれていたけど、Update4は実行ファイル
のアイコンからして違うからなあ。MS-DOSのアイコンになってる。
0957デフォルトの名無しさんNGNG
>>954
あれって糞じゃない?
ctrl+Zとかで色が化けるし。
0958デフォルトの名無しさんNGNG
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_ent.exe
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_pers.exe
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_pro.exe

これダウンロードして適用できた方いらっしゃいます?Install Shieldが
立ち上がらなくて変なんですけど。
0959デフォルトの名無しさんNGNG
CommandButtonClickハンドラ内からCreateThreadを呼び出す
と、スレッドを2回起動すると保護エラーが出てしまいます。
VCLとCreateThreadは相性が悪いのでしょうか。
ちなみにCreateThreadで呼び出した関数からはDLLを呼んで
います。
0960デルファイの名無しさんNGNG
そのDLLが複数スレッドから呼ばれることに耐性が無いのでは?
中でグローバル変数使ってるとか。

DLL呼ぶ部分をクリティカルセクションで囲ってみるとか。
それと、VCLと併用するならBeginThreadの方がよさそうな気がします。
0961デフォルトの名無しさんNGNG
>>960
ありがとうございます。グローバル変数は使っていませんが、
DLL内でMessageBoxを呼んでいる事に原因がありそうです。
ちなみにCreateThreadを使わず、ButtonClickハンドラ内から
直接DLLを呼び出すとエラーになりません。

ButtonClickハンドラを複数作り、同時に呼び出してみたりして
みましたがどうもエラーが再現しません。CreateThreadとMessageBoxの
相性が悪いようです。DLLからMessageBoxを取り除くとエラーが
出なくなります。

BeginThreadでやってみます。
0962デフォルトの名無しさんNGNG
>>959
>>733-736を見る限りMessageBoxはスレッドセーフの様ですが。

> VCLまたはCLXのオブジェクト階層にあるオブジェクトを使用する場合は,
> そのプロパティおよびメソッドは, スレッドセーフであることが保証されていません。(開発者ガイドより)
この辺でまずいことやってない?
0963デフォルトの名無しさんNGNG
>>962
ButtonClick内では、CreateThreadで作成したスレッドを、
WaitForSingleObjectで終了を待つことしかしていません。
VCLは一切触れていません。
DLLでももちろんVCLは触っていません。というか、DLLは
M$互換で作成しています。

BeginThreadに置き換えようとしたのですが、返却値がint
であったりと、不可解な仕様に戸惑っています。これでは
WaitForSingleObjectが使えないのでどうすればいいんで
しょうか?素直にTThread使った方がいいのでしょうか?
0964デルファイの名無しさんNGNG
むう、不可解ですね。

とりあえず、BeginThreadの戻り値は「BeginThread は,Windows スレッドハンドルを返します。」と書かれてます。
Integerなのは、多分、Delphi側がTHandle(HANDLE) = LongWord(unsigned long)なので、
代入互換が有るからいいやみたいなてきとーな仕様が、C++Builderで皺寄せがきてるものと。
HANDLEにキャストして問題無いでしょう。
0965デフォルトの名無しさんNGNG
>>964
やってみました。やっぱり例外エラーが出ました(T_T)。
こうなると、同じメモリ空間内の関数をCreateObjectで呼んで
いる事による、スタック回りがスレッドセーフでない事に起因する
エラーしか考えられません。

思い切ってフォームを使わずに、コンソールとDLLだけで書いて
みてエラーが再現しないか試してみます。
0966デフォルトの名無しさんNGNG
extern "C" void __declspec(dllimport) __stdcall beep(WORD wCounter);

int main(int argc, char* argv[])
{
for (int i = 0; i < 5; i++) {
func();
Sleep(500);
}
}

void func()
{
HANDLE hThread;
DWORD threadID;
WORD beepTimes = 1;

hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)beepThread,
(VOID *)beepTimes, 0, &threadID);
while (WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT);
}
//---------------------------------------------------------------------------
void beepThread(WORD beepTimes)
{
beep(beepTimes);
}
0967デフォルトの名無しさんNGNG
extern "C" void __declspec(dllexport) __stdcall beep(WORD wCounter);

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
char szBuffer[256];
switch (fwdreason) {
case DLL_PROCESS_ATTACH:
lstrcpy(szBuffer, "プロセスがアタッチされました。");
break;
case DLL_THREAD_ATTACH:
lstrcpy(szBuffer, "スレッドがアタッチされました。");
break;
case DLL_THREAD_DETACH:
lstrcpy(szBuffer, "スレッドがデタッチされました。");
break;
case DLL_PROCESS_DETACH:
lstrcpy(szBuffer, "プロセスがデタッチされました。");
break;
}
MessageBox(NULL, szBuffer, "DLL entry point message", MB_OK);

return 1;
}
0968デフォルトの名無しさんNGNG
void __declspec(dllexport) __stdcall beep(WORD wCounter)
{
WORD loop;

for (loop = 0; loop < wCounter; loop++) {
Beep(400, 100);
Sleep(1000);
}
}

これがエラーを再現する最短のプログラムです。コンソールアプリケーション
でコンパイルして実行します。
0969デフォルトの名無しさんNGNG
>>962
MessageBox って Application.MessageBoxと Windows.MessageBox と2つあるから注意

APIのMessageBoxとして文字列はどうやって作ってるのかな
0970デフォルトの名無しさんNGNG
>>967 MODAL じゃない MessageBox って事は、
そのスレッドが終ったときにも その MessageBox は開いているんじゃないの?
0971デフォルトの名無しさんNGNG
SearchTreeForFileを使うと
「[C++ エラー] ImageHlp.h(600): E2015 'LONG64' と 'System::LONG64' の区別が曖昧」
ってエラーがでます。
これの解決方法を教えて下さい。
よろしくお願いします。
0972デフォルトの名無しさんNGNG
>>970
そのモーダルでないMessageBoxが開いているのが怪しいですよね。
これをモーダルにしてやってみようかな・・・・
0973デフォルトの名無しさんNGNG
というか 作業スレッドでMessageBoxを直接使う設計がまずマズイんじゃないの?
GUI関係はメインスレッドにお願いするような設計にするべきでしょう

エラーとかステータスは、DLLからコールバックさせて、コールバック内で
SendMessage/PostMessage するのが普通だと思うけどな
0974デフォルトの名無しさんNGNG
>>973
そうしましょうか・・・・これは本の例題を改造して作った物なのですが、
元々のプログラムの設計に難がありそうですね。

DLL内でGUIを使うのも可かと思ってたのですが・・・・・ケースバイケース
のようですね。
0975デフォルトの名無しさんNGNG
メッセージボックスを出してOKボタンなどをキーボードのEnterキーで押すと
ListViewのListViewKeyUpイベントが反応してしまいます。
これを防ぐ方法を教えて下さい。
宜しくお願いします。
0976デフォルトの名無しさんNGNG
Visual-C++のように、#pragma data_segを使って、DLL間でメモリを
共有するにはどのようにしたらよいのでしょうか?
0977デフォルトの名無しさんNGNG
C++Builderには#pragma data_segがないので困っています。
0978デフォルトの名無しさんNGNG
>>976-977
共有しなくたっていいよ。
おまえみたいなグローバル変数厨は氏ね。
0979デフォルトの名無しさんNGNG
>>978
何も知らないくせにグローバル変数厨などと言うな。
お前こそ氏ね!
0980名無しさんNGNG
ヽ(゚∀゚)ノアヒャヒャヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )人(゚∀゚)人( ゚∀)ノ
0981デフォルトの名無しさんNGNG
みんな氏ねー
レス数が950を超えています。1000を超えると書き込みができなくなります。