トップページ⇒tech
946コメント287KB

C++Builder相談室 Part6

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++Builderに関する質問・回答や議論等を行う相談室スレッド。
過去スレ・関連サイトは>>2-10あたり。


0685デフォルトの名無しさんNGNG
>>684
タイマーイベントで↓のSDK版の関数にフォームのハンドルを渡して呼ぶ。
http://techtips.belution.com/ja/vc/0012/
0686デフォルトの名無しさんNGNG
>>685
お答えどうもです。
SetForegroundWindowは既に試していたのですが、どうにも最上位に
表示してくれませんでした。ちなみにForm1は非表示にして>>684はForm2で
行っているのですが、そこら辺がうまくいかないのと関係しているのでしょうか?
0687デフォルトの名無しさんNGNG
うまくいかなかった理由と解決方法が>>685のページに書いてあるでそ。
0688デフォルトの名無しさんNGNG
>>687
すまん、さっきちゃんと読んだら何か書いてた。ありりん
0689デフォルトの名無しさんNGNG
線を描きたいんだけどどうすればいいの?わけわからん。
0690デフォルトの名無しさんNGNG
Shapeでも使ってろ
0691デフォルトの名無しさんNGNG
TCanvas::LineTo
0692デフォルトの名無しさんNGNG
質問です、よろしくお願いします。
環境はWin2000SP4,BCB6Pro UPD#4です。

250kBのAnsiStringに42kBの\0(0x00)が混じっていまして、
この\0を除去したいので下記の様にしましたら、遅くてとても実用になりませんでした。
速く処理できる方法を教えてください。

\0の数は決まっていない上に位置も不定で、必ずしも一塊になっていません。
↓のgotdatが250kBの文字列です。
//-------その部分のダメなソース--------
while ( gotdat.Pos('\0') > 0){
gotdat.Delete(gotdat.Pos('\0'),1);
}
//------------------------------------

よろしくお願いします。
0693デフォルトの名無しさんNGNG
>>692
・空の dest を定義する。
・gotdat から dest へ、1文字ずつ加えていく。ただし、その文字が '\0' なら、加えない。
・gotdat = dest;
とか?

AnsiString の機能を知らないので、嘘かも。
0694デフォルトの名無しさんNGNG
while(gotdat.Pos('\0') > 0){
lng_pos = gotdat.Pos('\0');
strtmp = gotdat.SubString(1,lng_pos-1);
gotdat = strtmp + Trim(gotdat.Delete(1,lng_pos));
}
0695692NGNG
>>693
ありがとうございます
それ、やってみたんですが、やはり遅いです。
AnsiStringで一文字ずつというのは遅いようです。char*でやれば早いのかも

>>694
ありがとうございます
十分早いです。それで行きます。
0696デフォルトの名無しさんNGNG
char* p = text.c_str();
int   oldLength = text.Length();
int   newLength = 0;

for (int i = 0; i < oldLength; i++)
{
    if (p[i] != '0')
        p[newLength++] = p[i];
}

text.SetLength(newLength);

なら、一瞬でおわるど。
0697デフォルトの名無しさんNGNG
'0' → '\0' だ
0698692NGNG
>>696
ありがとうございます
>>694の方法と比較してみましたら、>>696の方法の方が格段に早いです。
GetTickCount()で計測、6回試行しましたが概ね10msずつ早い
それに>>694の方法はある程度\0がまとまっている事を期待している感じですが、
>>696はまったくそういった依存関係が無い

やはりこういった処理はAnsiStringではなくchar*なんですね、勉強になりました。
ありがとうございました。
0699692NGNG
AnsiStringがどうたらだけでなく、自分自身の領域の中で前に詰めていき、最後に後ろを切って捨てるってことですよね。
他の領域を使わないから、また更に早いと思っていいでしょうか?
ループの中でクラスを呼んでないことが一番効いているのだとは思いますけど。
0700デフォルトの名無しさんNGNG
ああそっか、AnsiStringのc_str()の戻り値は
const char*じゃなくてchar*だったっけ・・・。
0701デフォルトの名無しさんNGNG
>>699
> 自分自身の領域の中で前に詰めていき、最後に後ろを切って捨てるってことですよね。
たとえばstd::removeがとってる手法もこれだね。
こっちは後ろを「切って捨てる」のではなく、「新しい最後尾」を指すポインタなり
イテレータなりを返す仕様だけど。
0702デフォルトの名無しさんNGNG
ループのたびに'\0'の位置を検索したり、文字の長さを変えたりすれば
そりゃあ時間かかるよな。

'\0'の位置がまとまってなくてランダムな配置なら、
悲惨なほど時間がかかる。(250KBで試してるけど、いつまで経っても終わらない)
0703692NGNG
>>701
c⌒っ*゚ー゚)っφ メモメモ...

>>702
>ループのたびに'\0'の位置を検索したり、文字の長さを変えたりすれば
仰せのとおりですね、毎回関数を呼んでいるからか・・・
0704692NGNG
C/C++を知らずにいきなりBCBで始めたものでVCLにドップリ溺れています。
もっとポインタを活用することを学ばねば・・・
0705デフォルトの名無しさんNGNG
classをnewしてsizeofすると何故かどのクラスでも
4しか取れないんですけど、コレってどういうことですか?
0706デフォルトの名無しさんNGNG
ポインタ変数のサイズ
0707デフォルトの名無しさんNGNG
次は、「じゃあどうやってクラスをファイルに書き込めばいいんですか!」かね?
0708デフォルトの名無しさんNGNG
>>707
public変数をそのまま書けばいいんじゃねーの?
0709デフォルトの名無しさんNGNG
>>707

class SerializeableObject
{
public:
 virtual std::string Serialize() = 0;
 virtual void Unserialize(const std::string &str) = 0;
}

ファイルから読み書きできるようにしたいクラスをここから継承して実装書く。
0710デフォルトの名無しさんNGNG
>>705
最適なスレッドかホームページがありそうですが、知らないので。

TYPE *p; と定義したとき、
sizeof(p) と sizeof(TYPE*) はポインタ変数のサイズで、sizeof(*p) と sizeof(TYPE) は TYPE の大きさです。

たぶん。
0711デフォルトの名無しさんNGNG
現在、メインForm(Unit1)からサブForm(Unit2)を
複数呼び出そうとしています。
複数、表示することは可能なのですが、
サブForm毎に制御することが出来ません。
良い方法はないでしょうか?
宜しくお願い致します。

0712デフォルトの名無しさんNGNG
> サブForm毎に制御
何のこっちゃ
0713デフォルトの名無しさんNGNG
サブFormをTListに入れていけば?
そしてサブForm解放時でTListから削除する。
具体的にはTサブFormとTサブFormManagerとでもして。
TサブFormManager->CreateサブForm()でサブFormを作成して返し、
こっそり内部のTListに追加しておく。ついでにサブFormのメンバ変数にTサブFormManagerを保存しとく。
そしてTサブFormのデストラクタではTサブFormManagerから自身を登録解除してもらう。
サブFormが1種類じゃなくて複数種類必要ならTサブFormを継承して使うようにすればいい。
あとはTサブFormManagerのプロパティからインデックスでTサブFormを参照できるようにしたり、
GetActiveサブForm()とか適当にメソッド入れていくと良いのではないだろうか。

TApplicationのComponentsプロパティをループ回して参照するだけでも良いけど。
0714デフォルトの名無しさんNGNG
Screen->Forms
0715デフォルトの名無しさんNGNG
>>712
分かりづらかったですかね。
簡単に言うと、Main画面はSub画面を呼び出す。
Sub画面はボタンにより、Formサイズの変更を行ったりします。
この動作を、MainからSubを複数、呼び出し、
Sub毎に制御を行いたいのですが、上手く動いてくれないのです。

>>713
ちょっとよく分かり辛いのですが。
すみません。

0716デフォルトの名無しさんNGNG
制御て何
0717デフォルトの名無しさんNGNG
>>716
動作をさせることです。
0718デフォルトの名無しさんNGNG
漏れ的解釈

void __fastcall TSubForm::Button1Click(TObject* sender)
{
  Width *= 2; // SubはボタンによりFormサイズの変更をしたりする
}

void TMainForm::hoge(void)
{
  SubForm1 = new TSubForm(this); // MainはSubを複数作って
  SubForm2 = new TSubForm(this);

  SubForm1->Button1->Click(); // Sub毎に…
  SubForm2->Button1->Click();
}
0719デフォルトの名無しさんNGNG
>>718
これだとhogeが動作したときにボタンが押されたと認識して、
サイズが変わってしまいますよね。
でも、これを参考にして作ったらできました。
どうもありがとうございます。
0720デフォルトの名無しさんNGNG
質問ですが、
typedef struct{
 int  A1:1;
 int  A2:4;
} GG;
これでコロンの右の数字ってビット数ですか?
この構造体のサイズは4byteでA1ってHighになってるのでしょうか?
A1に1って代入してA1の値をみてみるとー1ってなってるのですが・・
0721デフォルトの名無しさんNGNG
>>720
それはビットフィールドだろ?
コロンの右の数字はメンバーに割り当てるビット数。
0722デフォルトの名無しさんNGNG
>>721
ありがとうございます。
でA1はLowとHighのどっちにとられるんですか?
0723デフォルトの名無しさんNGNG
>>722
処理系依存。
0724デフォルトの名無しさんNGNG
>>723
ここはC++Builderスレな罠。
0725デフォルトの名無しさんNGNG
>>724
おお、そうだった(笑)
ビットフィールドのビットレイアウトを想定した記述はすべきでないから
どっちから詰められるかを意識したこともないわけだが、
いざ調べてみるとヘルプみても標準の処理系定義項目の設定内容がどこにあるのかわからん・・
0726724NGNG
>>725
> ビットフィールドのビットレイアウトを想定した記述はすべきでないから

はげどう つーか鉄則か。
0727デフォルトの名無しさんNGNG
ん?マジで?なんで?
0728デフォルトの名無しさんNGNG
メモリの少ない組込系ですら使ったことないんだが、
BCBでビットフィールドをあえて使う理由ってあるの?
0729デフォルトの名無しさんNGNG
ビットごとに決められているデータ(ヘッダとか)を扱いやすい。
0730デフォルトの名無しさんNGNG
>>729
それ、ビットフィールドのビットレイアウトを頭に入れないと・・・。
0731デフォルトの名無しさんNGNG
あえて使う理由→データがものすごく巨大になる時
数理計画とかやってるとすごいことにる。
0732デフォルトの名無しさんNGNG
>>729
C++ならビットレイアウトをクラスで隠蔽して、クラス内部でビット演算
すりゃいいじゃんと言うか正攻法だと思うんだけど。

>>731
せいぜい数百Mのデータしか扱ったことがないので気がつかなかった。
0733デフォルトの名無しさんNGNG
>>732
>せいぜい数百Mのデータ

・・・紙テープ換算か何か?ああ、DATか。
0734デフォルトの名無しさんNGNG
>>733
こういう突っかかり方も珍しいな
0735デフォルトの名無しさんNGNG
>>734
そっとしといてやれ。
常人の「寒い」が彼の「鋭い」なんだ。
0736デフォルトの名無しさんNGNG
ようするに>>728-735ら辺ってファイルI/Oが下手でFA
0737_NGNG
http://homepage.mac.com/hiroyuki44/jaz04.html
0738_NGNG
http://homepage.mac.com/hiroyuki44/
0739デフォルトの名無しさんNGNG
Borlandのページにあった
Borland C++Builder 6 アップデートパック #4
を入れたらコンパイル時にリンカエラーとかが発生するようになって、
説明書のチュートリアル進められなくなったんでインスコし直したよ。
旧バージョンに戻したらコンパイルうまくいった。

環境Win98SE
Personal版 C++builder
0740デフォルトの名無しさんNGNG
C++Builder7ってまだか?
0741デフォルトの名無しさんNGNG
↑VC++にしる!
0742デフォルトの名無しさんNGNG
VCなんてうんこは眼中にない
0743デフォルトの名無しさんNGNG
VC買ったんだけどWIN98じゃ動かなかった…
0744デフォルトの名無しさんNGNG
>>743
そんなウンコなOSを使うのは今すぐやめましょう
0745デフォルトの名無しさんNGNG
質問です。
for (int i = 0;i<1000;i++){
Graphics::TBitmap *bmp = new Graphics::TBitmap();
Graphics::TBitmap *bmp2 = new Graphics::TBitmap();
BitBlt(bmp->Canvas->Handle,0,0,bmp->Width,bmp->Height,bmp2->Canvas->Handle,0,0,SRCCOPY);
delete bmp,bmp2;
}
これを実行するとメモリリークするんですが、どこらへんがわるいんですかね?
ちなみに↓でもリークします。

for (int i = 0;i<1000;i++){
TImage *bmp = new TImage(Image1);
TImage *bmp2 = new TImage(Image1);
BitBlt(bmp->Canvas->Handle,0,0,bmp->Width,bmp->Height,bmp2->Canvas->Handle,0,0,SRCCOPY);
delete bmp,bmp2;
}
0746デフォルトの名無しさんNGNG
>>744
OSもVCもうんこ。このメーカー自体うんこだから( ´,_ゝ`)
0747デフォルトの名無しさんNGNG
>>746 お前がうんこ
0748デフォルトの名無しさんNGNG
>>745
deleteに変数並べるのはじめて見たけど、
それだとbmp2のデストラクタが呼ばれないみたいよ。
0749745NGNG
>>748
あ〜、そうだったんですか。
ありがとう。
deleteのとこでなんか違和感を感じてたら…
0750デフォルトの名無しさんNGNG
>>747=うんこ
0751デフォルトの名無しさんNGNG
くせースレだなおい
0752デフォルトの名無しさんNGNG
ということは俺って事か
0753デフォルトの名無しさんNGNG
program Test;
{$APPTYPE CONSOLE}
type
  TTest = class(TObject)
    procedure Init;virtual;abstract;
    constructor Create;
  end;
  TTestA = class(TTest)
    procedure Init;override;
  end;
  TTestB = class(TTest)
    procedure Init;override;
  end;
constructor TTest.Create;
begin
  Init;
end;
procedure TTestA.Init;
begin
  writeln('My name is TestA');
end;
procedure TTestB.Init;
begin
  writeln('My name is TestB');
end;
begin
  TTestA.Create.Free;TTestB.Create.Free;
end.

これと同じ事をC++でやりたいんですけどうまくいかないです。
どうすれば良いんですか?
0754デフォルトの名無しさんNGNG
コンストラクタで仮想関数呼んでも派生クラスのは呼んでくれないよ。
Initメソッドで初期化しないで、TTestA,TTestBにコンストラクタ作って、
そこで初期化しないと。
0755デフォルトの名無しさんNGNG
コンストラクタの呼び出し順(=仮想関数の決定順)がC++とobject pascalで違うからね。
言語ガイドに詳しく書いてある。
0756デフォルトの名無しさんNGNG
みんなデストラクタって何書いてる?
俺はとくに書くことがないんだが・・・
0757デフォルトの名無しさんNGNG
>>756
仮にコンストラクタでなんかの変数やクラスをnewすることがあっても、君はdeleteすることなく放置か?
0758デフォルトの名無しさんNGNG
>>757
初心者なのでまだnewって使ったことないっすw そっか、deleteするときに使うんだね・・
0759デフォルトの名無しさんNGNG
>>758
逆の気が…
0760デフォルトの名無しさんNGNG
初心者なのでまだdeleteって使ったことないっすw そっか、newしたときに使うんだね・・
0761デフォルトの名無しさんNGNG
>>759
deleteがしたくてしたくてたまらないからnewするんだよ!
悪いかよ!
0762デフォルトの名無しさんNGNG
デストラクタを使いたいからdeleteする
でもdeleteするモノがないからnewする
0763デフォルトの名無しさんNGNG
小4くらいのとき、マンコが穴だなんて思いもしなかった。
が、年の離れた兄貴のいる加戸は
「ヤッターマンコーヒーライター」
などという言葉を知っているいわば勇者的存在であった。
で、穴があることを知った俺たちだが、どうしてもそれが信じられない。
で、むしろ逆にガキであることを利用して調べようと思った。
ターゲットは音楽の教師である。美人だった。今にして思えば
20歳くらいだったのではないだろうか。短大出てすぐだったように思う。
実行はいたって単純。ガキ特有のカンチョーというあれである。
あれを前に突き刺すというのだ。
ガキなら許されるであろうという勝手な発想だが、
たしかにマンコすら知らない奴がほとんどだったからナイスな判断だったろう。
で、実行は加戸だった。
加戸はなんの躊躇もなくやった。
思い切り。
思い切ってやっちゃいかんだろ、と思った。なぜにおまえはフルパワーなのだ、と。
音楽教師は泣いた。20歳前後という年齢を考えればギャグでもきつい。
ガキからすれば大人だったのだが、今思うと娘だ。
むしろ、処女だった可能性すらある。すまん先生。
が、加戸も泣いていた。
両手人差し指骨折だった。第2関節より下で折れていた。
もろに刺さったんだと感心した。やはり勇者だ。
しかも、救急隊員に、マンコに指が刺さって折れましたと泣きながら事情を説明していた。
あの姿も相当かっこよかった
0764デフォルトの名無しさんNGNG
つかデストラクタでdeleteすんなら、そのクラスはなくなるんだから
わざわざdeleteしなくてもいいんじゃねえの?
一緒にdeleteされるべ?
0765デフォルトの名無しさんNGNG
されねーよ
0766デフォルトの名無しさんNGNG
TDatabaseのログインプロンプトが開かないんですがなんでですかね。
Database1->LoginPrompt = true;
ですが。
0767デフォルトの名無しさんNGNG
>>765
あら
0768766NGNG
Delphiのdblogdlg.pas/initializationが走ってないのが原因みたいですが、
BCBからinitializationをどうやって走らせるのやら。
0769 NGNG
クールバーにコントロール(いちばん簡単なボタンを試してみた)を2個置くと2列になってしまって
ボタンがウィンドウの幅一杯に広がってしまいます。
小さくして2個とも一列に表示しようと思ってボタンをリサイズしても自動的ににウィンドウの幅一杯に広がってしまいます。
どうしたらいいのですか?
0770デフォルトの名無しさんNGNG
クールバーにツールバーとかパネル置いてから、そこにボタンを2個置くとか
0771デフォルトの名無しさんNGNG
質問です。
今BCB4PROでGUIのソフト作ってます。
ClipCursorでマウスの移動範囲を制限したいのですが、
SetCursorPosやmouse_event、ShowMessageなんかでも制限が勝手に解除されてしまいます。
これらの関数を実行しなければ制限は有効なままなのですが、
制限した後にmouse_eventでマウスクリック処理などをするため困っています。
何か前もって実行しなければならない関数などあるのでしょうか。
0772_NGNG
http://homepage.mac.com/hiroyuki44/2ch.html
0773デフォルトの名無しさんNGNG
C++Builer1で質問ですが
フォーム右クリでポップアップメニューを設定してそのメニューで「前面」項目があって
それをチェックされるとFormStyle = fsStayOnTopとして、外れると FormStyle = fsNormal;
としているのですが、うまく動作しません。
デバッガでステップ実行してるとちゃんと前面になるのですが、普通に実行すると前面になりません
なにが原因なのでしょうか?
0774769NGNG
>>770
TCoolBandのBreakプロパティをfalseにするのを忘れてました。すいませんでした。
0775デフォルトの名無しさんNGNG
>773
少なくともうちのBuilder5のヘルプには
>注意実行時に FormStyle の値をなるべく変更しないでください。
って書いてあるよ。実行時に制御するためのプロパティじゃないでしょう。
素直にTControl::BringToFrontとかAPIのBringWindowToTop(HWND)で
Zオーダー変えるんじゃ駄目なの?
0776デフォルトの名無しさんNGNG
なるべくて
0777デフォルトの名無しさんNGNG
>>775
実行時に使うなとは書いてないんですね( ´,_ゝ`)
0778デフォルトの名無しさんNGNG
>>775
俺の経験。FormStyle を実行時に変更したら、
ファイルのドラドラを受け付けるようにする DragAcceptFiles() の
効果が切れたよ。

何故か?までは追わなかったけど、FormStyle を変える事によって
ウィンドウが作り直されて、Handle プロパティが変わるからじゃないかな?

という事から考えて、Handle が不変であるという前提に拠っている
コードが悪影響を受けるから、ヘルプでは FormStyle を変更するなと
書いているんじゃないかな。
0779デフォルトの名無しさんNGNG
>773
FormStyle を使うのをあきらめて、Windows API で

// 手前に
SetWindowPos(Form1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
// 戻す
SetWindowPos(Form1->Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

というのはどうでしょう?
0780デフォルトの名無しさんNGNG
>>773
プロパティ変える方法だと、
例え出来てもチラつくしフォーカスも消えるし>>778さんの言うように変更後DragAcceptFiles()やらないとD&D効かなくなるし、
私は>>779さんのようにAPIでゴリッと変更する、に同意です。
0781デフォルトの名無しさんNGNG
こんにちは、皆さんお答えありがとう

>>775
C++Builder1のヘルプにも書いてますね。
>>776
なるべくとは書いてないですね^^
>>777
書いてないですね
>>778
それは私も経験あります
でも確かShowイベでそれ書いておくと大丈夫だったような気がしましたが
>>779
あ、別にFormStyleじゃなくても、他のウィンドウより手前・戻すができればいいので
そのAPIを試してみます。情報有難うございます。
>>780
ええ、さっそくAPIを試してみます。

みなさん、ありがとうございます。
0782デフォルトの名無しさんNGNG
ああ・・
SetWindowPosでもダメでした・・
HWND_BOTTOMだとちゃんと他のウィンドウより背面にいくのですが、
HWND_TOPMOSTでは前面にきてくれないです・・
これフォームが前面にできない要因が考えられるとしたら
どのようなことでしょうか?
0783デフォルトの名無しさんNGNG
>>782
日頃の行い
0784デフォルトの名無しさんNGNG
じゃあ更に
Application->BringToFront();
してみるとか。
■ このスレッドは過去ログ倉庫に格納されています