C++Builder相談室 Part6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG過去スレ・関連サイトは>>2-10あたり。
0685デフォルトの名無しさん
NGNGタイマーイベントで↓のSDK版の関数にフォームのハンドルを渡して呼ぶ。
http://techtips.belution.com/ja/vc/0012/
0686デフォルトの名無しさん
NGNGお答えどうもです。
SetForegroundWindowは既に試していたのですが、どうにも最上位に
表示してくれませんでした。ちなみにForm1は非表示にして>>684はForm2で
行っているのですが、そこら辺がうまくいかないのと関係しているのでしょうか?
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNGすまん、さっきちゃんと読んだら何か書いてた。ありりん
0689デフォルトの名無しさん
NGNG0690デフォルトの名無しさん
NGNG0691デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
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・空の dest を定義する。
・gotdat から dest へ、1文字ずつ加えていく。ただし、その文字が '\0' なら、加えない。
・gotdat = dest;
とか?
AnsiString の機能を知らないので、嘘かも。
0694デフォルトの名無しさん
NGNGlng_pos = gotdat.Pos('\0');
strtmp = gotdat.SubString(1,lng_pos-1);
gotdat = strtmp + Trim(gotdat.Delete(1,lng_pos));
}
0695692
NGNGありがとうございます
それ、やってみたんですが、やはり遅いです。
AnsiStringで一文字ずつというのは遅いようです。char*でやれば早いのかも
>>694
ありがとうございます
十分早いです。それで行きます。
0696デフォルトの名無しさん
NGNGint 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デフォルトの名無しさん
NGNG0698692
NGNGありがとうございます
>>694の方法と比較してみましたら、>>696の方法の方が格段に早いです。
GetTickCount()で計測、6回試行しましたが概ね10msずつ早い
それに>>694の方法はある程度\0がまとまっている事を期待している感じですが、
>>696はまったくそういった依存関係が無い
やはりこういった処理はAnsiStringではなくchar*なんですね、勉強になりました。
ありがとうございました。
0699692
NGNG他の領域を使わないから、また更に早いと思っていいでしょうか?
ループの中でクラスを呼んでないことが一番効いているのだとは思いますけど。
0700デフォルトの名無しさん
NGNGconst char*じゃなくてchar*だったっけ・・・。
0701デフォルトの名無しさん
NGNG> 自分自身の領域の中で前に詰めていき、最後に後ろを切って捨てるってことですよね。
たとえばstd::removeがとってる手法もこれだね。
こっちは後ろを「切って捨てる」のではなく、「新しい最後尾」を指すポインタなり
イテレータなりを返す仕様だけど。
0702デフォルトの名無しさん
NGNGそりゃあ時間かかるよな。
'\0'の位置がまとまってなくてランダムな配置なら、
悲惨なほど時間がかかる。(250KBで試してるけど、いつまで経っても終わらない)
0703692
NGNGc⌒っ*゚ー゚)っφ メモメモ...
>>702
>ループのたびに'\0'の位置を検索したり、文字の長さを変えたりすれば
仰せのとおりですね、毎回関数を呼んでいるからか・・・
0704692
NGNGもっとポインタを活用することを学ばねば・・・
0705デフォルトの名無しさん
NGNG4しか取れないんですけど、コレってどういうことですか?
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNG0708デフォルトの名無しさん
NGNGpublic変数をそのまま書けばいいんじゃねーの?
0709デフォルトの名無しさん
NGNGclass SerializeableObject
{
public:
virtual std::string Serialize() = 0;
virtual void Unserialize(const std::string &str) = 0;
}
ファイルから読み書きできるようにしたいクラスをここから継承して実装書く。
0710デフォルトの名無しさん
NGNG最適なスレッドかホームページがありそうですが、知らないので。
TYPE *p; と定義したとき、
sizeof(p) と sizeof(TYPE*) はポインタ変数のサイズで、sizeof(*p) と sizeof(TYPE) は TYPE の大きさです。
たぶん。
0711デフォルトの名無しさん
NGNG複数呼び出そうとしています。
複数、表示することは可能なのですが、
サブForm毎に制御することが出来ません。
良い方法はないでしょうか?
宜しくお願い致します。
0712デフォルトの名無しさん
NGNG何のこっちゃ
0713デフォルトの名無しさん
NGNGそしてサブ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デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNG分かりづらかったですかね。
簡単に言うと、Main画面はSub画面を呼び出す。
Sub画面はボタンにより、Formサイズの変更を行ったりします。
この動作を、MainからSubを複数、呼び出し、
Sub毎に制御を行いたいのですが、上手く動いてくれないのです。
>>713
ちょっとよく分かり辛いのですが。
すみません。
0716デフォルトの名無しさん
NGNG0717デフォルトの名無しさん
NGNG動作をさせることです。
0718デフォルトの名無しさん
NGNGvoid __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これだとhogeが動作したときにボタンが押されたと認識して、
サイズが変わってしまいますよね。
でも、これを参考にして作ったらできました。
どうもありがとうございます。
0720デフォルトの名無しさん
NGNGtypedef struct{
int A1:1;
int A2:4;
} GG;
これでコロンの右の数字ってビット数ですか?
この構造体のサイズは4byteでA1ってHighになってるのでしょうか?
A1に1って代入してA1の値をみてみるとー1ってなってるのですが・・
0721デフォルトの名無しさん
NGNGそれはビットフィールドだろ?
コロンの右の数字はメンバーに割り当てるビット数。
0722デフォルトの名無しさん
NGNGありがとうございます。
でA1はLowとHighのどっちにとられるんですか?
0723デフォルトの名無しさん
NGNG処理系依存。
0724デフォルトの名無しさん
NGNGここはC++Builderスレな罠。
0725デフォルトの名無しさん
NGNGおお、そうだった(笑)
ビットフィールドのビットレイアウトを想定した記述はすべきでないから
どっちから詰められるかを意識したこともないわけだが、
いざ調べてみるとヘルプみても標準の処理系定義項目の設定内容がどこにあるのかわからん・・
0727デフォルトの名無しさん
NGNG0728デフォルトの名無しさん
NGNGBCBでビットフィールドをあえて使う理由ってあるの?
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNGそれ、ビットフィールドのビットレイアウトを頭に入れないと・・・。
0731デフォルトの名無しさん
NGNG数理計画とかやってるとすごいことにる。
0732デフォルトの名無しさん
NGNGC++ならビットレイアウトをクラスで隠蔽して、クラス内部でビット演算
すりゃいいじゃんと言うか正攻法だと思うんだけど。
>>731
せいぜい数百Mのデータしか扱ったことがないので気がつかなかった。
0733デフォルトの名無しさん
NGNG>せいぜい数百Mのデータ
・・・紙テープ換算か何か?ああ、DATか。
0734デフォルトの名無しさん
NGNGこういう突っかかり方も珍しいな
0735デフォルトの名無しさん
NGNGそっとしといてやれ。
常人の「寒い」が彼の「鋭い」なんだ。
0736デフォルトの名無しさん
NGNG0738_
NGNG0739デフォルトの名無しさん
NGNGBorland C++Builder 6 アップデートパック #4
を入れたらコンパイル時にリンカエラーとかが発生するようになって、
説明書のチュートリアル進められなくなったんでインスコし直したよ。
旧バージョンに戻したらコンパイルうまくいった。
環境Win98SE
Personal版 C++builder
0740デフォルトの名無しさん
NGNG0741デフォルトの名無しさん
NGNG0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNG0744デフォルトの名無しさん
NGNGそんなウンコなOSを使うのは今すぐやめましょう
0745デフォルトの名無しさん
NGNGfor (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デフォルトの名無しさん
NGNGOSもVCもうんこ。このメーカー自体うんこだから( ´,_ゝ`)
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGdeleteに変数並べるのはじめて見たけど、
それだとbmp2のデストラクタが呼ばれないみたいよ。
0749745
NGNGあ〜、そうだったんですか。
ありがとう。
deleteのとこでなんか違和感を感じてたら…
0750デフォルトの名無しさん
NGNG0751デフォルトの名無しさん
NGNG0752デフォルトの名無しさん
NGNG0753デフォルトの名無しさん
NGNG{$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デフォルトの名無しさん
NGNGInitメソッドで初期化しないで、TTestA,TTestBにコンストラクタ作って、
そこで初期化しないと。
0755デフォルトの名無しさん
NGNG言語ガイドに詳しく書いてある。
0756デフォルトの名無しさん
NGNG俺はとくに書くことがないんだが・・・
0757デフォルトの名無しさん
NGNG仮にコンストラクタでなんかの変数やクラスをnewすることがあっても、君はdeleteすることなく放置か?
0758デフォルトの名無しさん
NGNG初心者なのでまだnewって使ったことないっすw そっか、deleteするときに使うんだね・・
0759デフォルトの名無しさん
NGNG逆の気が…
0760デフォルトの名無しさん
NGNG0761デフォルトの名無しさん
NGNGdeleteがしたくてしたくてたまらないからnewするんだよ!
悪いかよ!
0762デフォルトの名無しさん
NGNGでもdeleteするモノがないからnewする
0763デフォルトの名無しさん
NGNGが、年の離れた兄貴のいる加戸は
「ヤッターマンコーヒーライター」
などという言葉を知っているいわば勇者的存在であった。
で、穴があることを知った俺たちだが、どうしてもそれが信じられない。
で、むしろ逆にガキであることを利用して調べようと思った。
ターゲットは音楽の教師である。美人だった。今にして思えば
20歳くらいだったのではないだろうか。短大出てすぐだったように思う。
実行はいたって単純。ガキ特有のカンチョーというあれである。
あれを前に突き刺すというのだ。
ガキなら許されるであろうという勝手な発想だが、
たしかにマンコすら知らない奴がほとんどだったからナイスな判断だったろう。
で、実行は加戸だった。
加戸はなんの躊躇もなくやった。
思い切り。
思い切ってやっちゃいかんだろ、と思った。なぜにおまえはフルパワーなのだ、と。
音楽教師は泣いた。20歳前後という年齢を考えればギャグでもきつい。
ガキからすれば大人だったのだが、今思うと娘だ。
むしろ、処女だった可能性すらある。すまん先生。
が、加戸も泣いていた。
両手人差し指骨折だった。第2関節より下で折れていた。
もろに刺さったんだと感心した。やはり勇者だ。
しかも、救急隊員に、マンコに指が刺さって折れましたと泣きながら事情を説明していた。
あの姿も相当かっこよかった
0764デフォルトの名無しさん
NGNGわざわざdeleteしなくてもいいんじゃねえの?
一緒にdeleteされるべ?
0765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNGDatabase1->LoginPrompt = true;
ですが。
0767デフォルトの名無しさん
NGNGあら
0768766
NGNGBCBからinitializationをどうやって走らせるのやら。
ボタンがウィンドウの幅一杯に広がってしまいます。
小さくして2個とも一列に表示しようと思ってボタンをリサイズしても自動的ににウィンドウの幅一杯に広がってしまいます。
どうしたらいいのですか?
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG今BCB4PROでGUIのソフト作ってます。
ClipCursorでマウスの移動範囲を制限したいのですが、
SetCursorPosやmouse_event、ShowMessageなんかでも制限が勝手に解除されてしまいます。
これらの関数を実行しなければ制限は有効なままなのですが、
制限した後にmouse_eventでマウスクリック処理などをするため困っています。
何か前もって実行しなければならない関数などあるのでしょうか。
0773デフォルトの名無しさん
NGNGフォーム右クリでポップアップメニューを設定してそのメニューで「前面」項目があって
それをチェックされるとFormStyle = fsStayOnTopとして、外れると FormStyle = fsNormal;
としているのですが、うまく動作しません。
デバッガでステップ実行してるとちゃんと前面になるのですが、普通に実行すると前面になりません
なにが原因なのでしょうか?
0775デフォルトの名無しさん
NGNG少なくともうちのBuilder5のヘルプには
>注意実行時に FormStyle の値をなるべく変更しないでください。
って書いてあるよ。実行時に制御するためのプロパティじゃないでしょう。
素直にTControl::BringToFrontとかAPIのBringWindowToTop(HWND)で
Zオーダー変えるんじゃ駄目なの?
0776デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG実行時に使うなとは書いてないんですね( ´,_ゝ`)
0778デフォルトの名無しさん
NGNG俺の経験。FormStyle を実行時に変更したら、
ファイルのドラドラを受け付けるようにする DragAcceptFiles() の
効果が切れたよ。
何故か?までは追わなかったけど、FormStyle を変える事によって
ウィンドウが作り直されて、Handle プロパティが変わるからじゃないかな?
という事から考えて、Handle が不変であるという前提に拠っている
コードが悪影響を受けるから、ヘルプでは FormStyle を変更するなと
書いているんじゃないかな。
0779デフォルトの名無しさん
NGNGFormStyle を使うのをあきらめて、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プロパティ変える方法だと、
例え出来てもチラつくしフォーカスも消えるし>>778さんの言うように変更後DragAcceptFiles()やらないとD&D効かなくなるし、
私は>>779さんのようにAPIでゴリッと変更する、に同意です。
0781デフォルトの名無しさん
NGNG>>775
C++Builder1のヘルプにも書いてますね。
>>776
なるべくとは書いてないですね^^
>>777
書いてないですね
>>778
それは私も経験あります
でも確かShowイベでそれ書いておくと大丈夫だったような気がしましたが
>>779
あ、別にFormStyleじゃなくても、他のウィンドウより手前・戻すができればいいので
そのAPIを試してみます。情報有難うございます。
>>780
ええ、さっそくAPIを試してみます。
みなさん、ありがとうございます。
0782デフォルトの名無しさん
NGNGSetWindowPosでもダメでした・・
HWND_BOTTOMだとちゃんと他のウィンドウより背面にいくのですが、
HWND_TOPMOSTでは前面にきてくれないです・・
これフォームが前面にできない要因が考えられるとしたら
どのようなことでしょうか?
0783デフォルトの名無しさん
NGNG日頃の行い
0784デフォルトの名無しさん
NGNGApplication->BringToFront();
してみるとか。
■ このスレッドは過去ログ倉庫に格納されています