- 1 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 03:39:51 ]
- このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 C++Builder使いが優しくコメントを返しますが、 お礼はC++Builderの布教と初心者の救済をお願いします。 Borland Home Page www.borland.co.jp/ <過去スレ> くだすれC++Builder(超初心者用) pc8.2ch.net/test/read.cgi/tech/1117225464/l50 くだすれC++Builder(超初心者用)その2 pc10.2ch.net/test/read.cgi/tech/1144308804/l50 <兄弟スレ> くだすれDelphi(超初心者用)その39 pc10.2ch.net/test/read.cgi/tech/1169386914/l50
- 433 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 10:08:31 ]
- どもです。
>OpenProcessの戻り値をHWNDに入れてる。 OpenProcessの戻り値はHANDLE型。 ちょっと見えてきました。 まずは型の勉強をしてみます。 APIの型ってよくわからないんです。 でも、実行では動くのにビルドでは動かない。 ビルドはできるのに。ちくしょう! 夜やってみます。キャストの件ありがとうございます。
- 434 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:53:33 ]
- OpenProcess()の直後
GetLastError()を調べたところ、 5が帰ってきました。 p://onegland.hp.infoseek.co.jp/wincgi/help/winerror.txt によると5は 5: アクセスは拒否されました。 とあり、悲しい限りです。 なんらかの対策はないでしょうか?
- 435 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:56:41 ]
- OS側が拒否しないようにセットアップしておく。
- 436 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:36:34 ]
- OpenProcessで要求するアクセス権を必要最小限に
- 437 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 19:34:26 ]
- dwDesiredAccessの値を全部試してみましたが、
だめでした。 「ウインドウハンドル ファイル名」でググッて 実装しているんですが。 GetForegroundWindowして、希望のexeがトップかどうかを 調べてるだけなんです。。。 ほかにいい方法ありませんか? あきらかにAPIの問題だけど、あのスレ結構きついんだなぁ。 BCBしかわからんし。すれ違いかな?しつこくて申し訳ないです。
- 438 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 19:58:21 ]
- というか、何がしたいのか全くわからん
- 439 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 20:09:03 ]
- アクティブなウインドウが特定のアプリかどうかを
調べたいのです。 そのため、GetForegroundWindowでウインドウハンドルを求めて、 アプリ名を検出し、特定のアプリかどうかの文字列判定をしています。 というわけで、アプリ名を知りたいのではないのです。 具体的には、作ってるのはユーティリティで、特定のアプリを 操作しているときに、激しく自前ソフトを実行し、 非特定アプリを操作しているときは、特定のアプリかどうかの 判定のみを実行するのです。ぅ〜ん、うまくいかないなぁ。 実行とビルド実行でこれだけ差がでるとつらいなぁ。
- 440 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 20:29:05 ]
- うちの似たようなことしてるソースだとこれで動いてるけど
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pid);
- 441 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 20:44:04 ]
- >>440
おみごと! どうにか動きました。よくわかんないけど。 いろいろありがとうございました。
- 442 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 20:44:14 ]
- フルパス必要なきゃこっちの方が手軽かも
DWORD pid; GetWindowThreadProcessId(hWnd, &pid); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,pid); PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); bool ret = Process32First(snapshot, &pe32); while(ret) { if( pid == pe32.th32ProcessID ) ShowMessage(pe32.szExeFile); ret = Process32Next(snapshot, &pe32); } CloseHandle(snapshot);
- 443 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:09:03 ]
- ども。参考にさせていただきます。
9xにも対応させたいし。って対応可能?? では。
- 444 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 01:15:57 ]
- 9xはProcess32First/Nextでフルパス返してくる(NT系はファイル名のみ)
NT系でフルパス取るにはやっぱりPSAPIで取らないとだめ。 あと9x対応にするにはGetModuleFileNmaeExとEnumProcessModulesをLoadLibrary/GetProcAddressでロードしないとエラーが出る。
- 445 名前:デフォルトの名無しさん [2008/03/12(水) 02:01:47 ]
- 質問です
TListViewにて ListView1->ViewStyle=vsReport;にして ListView1->Columns->Items[0]->Alignment=taRightJustify; としても、文字列表示が左寄せのままです。 他の列はちゃんと右寄せに表示されます。 先頭列を右寄せで表示するにはどうすればいいでしょうか。
- 446 名前:デフォルトの名無しさん [2008/03/12(水) 06:14:06 ]
- TValueListEditorコンポーネントの行数設定は、どうすればできますか?
- 447 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:31:11 ]
- >445
最初のカラムのAlignmentが無効なのはコモンコントロールの仕様じゃなかったっけ?
- 448 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:01:53 ]
- リストボックスをコンボボックスのように一行で表示して
プルダウンリストで表示するプロパティを探しているのですが、 わかりません。教えていただければ助かります。 リストボックスでなくてもいいです。 コンボボックスのように入力は受け付けたくありません。 例としてはIEのインターネットオプションのプログラムタグの HTMLエディタや電子メールといったリストボックスです。
- 449 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:25:27 ]
- コンボボックスのStyleプロパティにcrDropDownListで問題あるの?
- 450 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:28:39 ]
- OKでした。節穴でした。
ありがとございました。
- 451 名前:デフォルトの名無しさん [2008/03/20(木) 22:39:55 ]
- テキストファイルを読み込ませるにはどうすればいいんですか?
今までGCCでやっていたときには同じフォルダにテキストファイル おいておけばよかったんですが Turbo C++に変えてからは同じフォルダに置いてもできません
- 452 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:50:54 ]
- カレントディレクトリ?ファイル名は絶対パスで扱うほうが間違いないと思うけどね。
- 453 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:22:49 ]
- >>452
できました テキストファイルをプロジェクトファイルにおいていました 実行ファイルはDebug_Build内に作られるんですね
- 454 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:43:11 ]
- WinMainの先頭に
SetCurrentDirectory(ExtractFileDir(Application->ExeName).c_str()); とか書いておけばいい
- 455 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 23:52:20 ]
- それはちょっと…。カレントディレクトリはいつ変更されるかわからんから。
- 456 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 01:10:47 ]
- win2000でBCB6を使用しています。
TListViewでチェックボックスを表示した場合とTCheckListBoxに表示される チェックボックスでは見た目が違うのですが(TListViewに表示される方が枠が黒く太い) これをTCheckListBoxで使われているようなチェックボックスに変える簡単な方法は ないでしょうか?
- 457 名前:デフォルトの名無しさん [2008/03/27(木) 09:12:23 ]
- 教えてください。
ダイアログボックスでOKボタンが押されたときに、TEditの内容が未入力だったら TEditにカーソルを持っていき、入力をしてもらうようにしたいと考えています。 カーソルを持っていくには、 Edit1->SetFocus();で出来たのですが OKボタンがおされたときに、OKBtnClick(TObject *Sender)で Edit1のなかみを調べて、何も入っていなければ Edit1->SetFocus();を実行しても、ダイアログが閉じてしまいます。 これは、ボタンにModalResult=mrOkを指定しているからだとは思います。 OKボタンがおされたときに、Edit1がカラならEdit1へ ちゃんと入力されていれば、そのままダイアログを閉じたいのですが どうすればよいでしょうか。
- 458 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:23:51 ]
- if (Edit1->Text.IsEmpty()) {
Edit1->SetFocus(); ModalResult = mrNone; }
- 459 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:30:42 ]
- TForm::OnCloseQueryで中身をチェックする
- 460 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 11:18:26 ]
- >>458
>>459 できました。 どうもありがとうございます。
- 461 名前:デフォルトの名無しさん [2008/04/04(金) 07:54:34 ]
- 三項演算子の使い方を教えてください。
AnsiString str; int index; if(index!=0) str="AAA"; else str="BBB"; これは、 str= index!=0 ? str="AAA" : str="BBB"; このように書けば良いのはわかるのですが、 if(index!=0) str.printf("%d",a); else str.printf("%d",b); これの三項演算子での記述の仕方がわかりません。 indext!=0 ? (str=str.printf("%d",a)) : (str=str.printf("%d",b)); とすると、strにはstrの長さが文字として入ってしまいました。
- 462 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 08:04:16 ]
- index!=0 ? str.printf("%d",2) : str.printf("%d",3);
- 463 名前:デフォルトの名無しさん [2008/04/04(金) 08:36:01 ]
- >>462
できました。ありがとうございます。 すいませんがもう一つ教えてください。 if(index!=0) str.printf("%d",a); else str="あいうえお"; の場合はどうすればよいでしょうか。 index!=0 ? str.printf("%d",a) : str="あいうえお"; ではエラーになってしまいます。
- 464 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 08:46:40 ]
- 型を合わせる
index!= 0 ? (void)str.printf("%d", a) : (void)(str = "あいうえお");
- 465 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 08:58:40 ]
- >>464
なるほどー すごい勉強になりました。 E2034 'AnsiString' 型は 'int' 型に変換できない というエラーの意味が全然わからなかったのですが、 三項演算子は、両方で同じ型にしないとダメなんですね。 どうもありがとうございます。
- 466 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 12:25:42 ]
- てゆーかさ、普通は
str = index != 0 ? "AAA" : "BBB"; とか str.printf("%d", index != 0 ? a : b); と書くんだよ。 あと、コンストラクタの初期化リスト等、どうしても「式」が必要な場所とか。 だから、「同じ型」の「式」が並ぶのが当然なの。「式文」じゃないから。
- 467 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 14:06:01 ]
- 質問ですが、VSSとBCBを連携させることはできますか?
- 468 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 15:49:54 ]
- 連携ってどういうふうに?
相互にobjを使うのは形式が違うから誰か変換ツール作らないと無理だけど 同じC++言語だから変換する意味無いでしょうから誰も作らない。
- 469 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 16:11:21 ]
- Visual SourceSafe ?
- 470 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 16:12:28 ]
- CVSならコンポあった気がしないでもない
- 471 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 01:04:43 ]
- まさかC++の方もフリーカーソルだったりしますか?
- 472 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 08:13:59 ]
- モチロンソウヨ
- 473 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:15:44 ]
- 絶望した
- 474 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:34:37 ]
- GExpert?
- 475 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 15:13:54 ]
- C++Builder2007で開発をしております。
C++Builder6で作られたプロジェクトのビルドができません。 エラー内容は以下の通りです。 [BCC32 エラー] functional(135): E2093 < 演算子が使われたがクラス string には定義が存在しない。 どなたか教えて頂けますか。
- 476 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 16:19:18 ]
- >>472
いい事言うなあお前。 みんなが頭じゃわかっててもなかなか実践できない事を口に出して言えるなんざ大した自信だよ。 それで出来てなかったらあのインチキ占いのバアさんと一緒だぞお前。 そんなに当たり前の事を言いたかったら尼さんにでもなって言行等しくなってから説教したらどうだ。
- 477 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:31:56 ]
- おk
- 478 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:25:46 ]
- >>475
いい事言うなお前。
- 479 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:05:26 ]
- >475
newsgroupで質問した人?エスパー求むってのもちょっとねぇ。 最小限の再現状況をさらしなさいな。
- 480 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 02:33:06 ]
- >>475
最低限、エラー行を書けよ。 そんな質問の仕方では誰も答えねえぞ。
- 481 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:42:20 ]
- 型のチェックが厳密になってるから
曖昧な表現はすべて確定的表現にしないとダメよ
- 482 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:50:01 ]
- 475です。
>>479>>480>>481 質問の仕方が悪くてごめんなさい。 このエラーで困ってたのは 私(とnewsgroupで質問してた人)の関係者なのですが、解決したとのことです。 詳しい事は聞いてないのですが エラーが出る直前にコンパイル中のCPPに#include <string>を追加したら通ったそうです。 どうもありがとうございました。
- 483 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 15:48:42 ]
- >482
関係者なんですね?わかります。 ともあれnewsgroupにもなんか書いておいたほうがいいと思いますよ。
- 484 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 18:28:24 ]
- 批判されたら他人のせいにするのは、ゆとりの常套手段。
- 485 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 15:47:08 ]
- 初心者ですが質問させてください。
特殊フォルダを取得したいためSHGetSpecialFolderPath()を使いたいのですが、 定義されていないというエラーが出ます。 #include <shlobj.h>を先頭に挿入すると、さらに大量のエラーが出ます。 どうすれば、よいのでしょうか。 この系統の方法以外で特殊フォルダのパス名を取得する方法はありますか?
- 486 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:46:18 ]
- とりあえず、質問するときにはBuilderのバージョンを書いてね。
それが礼儀っちゅうもん。 #include "shlobj.h"するには、 NO_WIN32_LEAN_AND_MEAN を追加しなければ、二重定義エラーがでる。 設定方法は、Builderのバージョンによりちょいと異なる。
- 487 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 23:09:59 ]
- >>486 様
すみません、これから気をつけます。 バージョンに関してですが、Turbo C++です。 無料に引きつけられて勉強を始めましたが、国民機時代のTurbo君とは 名前だけが同じだけで後は全く別物でした。(汗) Turbo C++をもう少し使ってみて、ものになりそうでしたら製品版の Builderを買おうと思っています。 本題につきまして、 NO_WIN32_LEAN_AND_MEAN を#defineしましたら、問題なく動きました。 本当にありがとうございました。 今後も調べても分からないことを質問させて頂きますのでよろしく お願いいたします。
- 488 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 23:19:36 ]
- >>487
こっちのTurbo君などはいかが? dn.codegear.com/article/21751 ちなみに新TurboのExplorerエディションはコンポーネントの追加が出来ない以外はほぼProfessionalと同等の機能持ってた気がする。 ちなみに自作や他作コンポーネントはRAD環境で使えないだけでソース上でnewすればExplorerでも使える。
- 489 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:57:30 ]
- C++Builder6.0で、VBのMidBみたいに指定した場所の文字を抜き出すにはどうやったらいいのでしょうか?
ググったらBuilder3で、専用の関数を作ったりしてましたが・・・6.0でも簡単にはできないのでしょうか?
- 490 名前:489 mailto:sage [2008/05/01(木) 23:21:32 ]
- あ、文字は半角のみで全角は扱いません
- 491 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:20:10 ]
- 文字を?c_str/dataで。文字列を?Copyで。
- 492 名前:489 mailto:sage [2008/05/02(金) 00:36:04 ]
- ああっ、AnsiStringのSubStringとかで出来たんですね
すいませんでした&ありがとうございました
- 493 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:44:32 ]
- 別にAnsiString使わなくても::strncpy(dest, src + 先頭オフセット, 抜き出す長さ);でいいじゃない。
- 494 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:59:51 ]
- AnsiStringがずっと便利じゃん。
バッファとか考えなくてイイ。
- 495 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:06:11 ]
- 速度を取るか簡便性を取るかは自由
- 496 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:17:55 ]
- TStringGrid を継承したクラスを作ろうとしたら、「型名が必要」というエラーがでてしまいました。
新規作成→アプリケーション から、ヘッダファイルでとりあえず、classの宣言をしただけなんですが 「Unit1.h」 : #include <Forms.hpp> //--------------------------------------------------------------------------- typedef class TMyStringGrid : public TStringGrid { // ← ここんとこで 「[C++ エラー] Unit1.h(12): E2303 型名が必要」 と怒られます private: public: __fastcall TMyStringGrid(TComponent* Owner); }TMyStringGrid; //--------------------------------------------------------------------------- class TForm1 : public TForm : 「TStringGrid」 を「TForm」や「TCheckBox」に変更すれば、問題なくコンパイルされるので 「タイプミスか?」と何度もチェックしてみたのですが、、、 環境は BCB6pro、cb6_upd4_pro修正パッチ適用済、WinXP pro SP2 です。ご指導の程、よろしくお願いいたします <(_ _)>
- 497 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:28:29 ]
- >>496
まずはVCLリファレンスの読み方でも勉強しようか TStringGrid ユニット Grids 結論から言うと宣言されてない型から継承したクラスをどうやって作るのかと。
- 498 名前:496 mailto:sage [2008/05/07(水) 13:33:21 ]
- すんません、自己解決しました。
#include <Grids.hpp> これが必要だったみたいです (^^;;;; ども、お騒がせでした
- 499 名前:496 mailto:sage [2008/05/07(水) 13:36:14 ]
- >>497
あ、すいません、前後してしまいました いや、なんかそこらへんのクラスに必要なヘッダってのは最初っから インクルードされてるもんだと思ってました (^^;;;; ありがとうございました <(_ _)>
- 500 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:38:16 ]
- >>499
パレットからフォームにコンポーネント置けば勝手にヘッダファイルが追加されるけど、ソース上でのみ宣言だと手動でヘッダincludeしないとダメだお ついでにtypedefはいらん気もするけど。
- 501 名前:496 mailto:sage [2008/05/07(水) 14:09:51 ]
- >>500
なるほど、そういう仕組みでしたか。 typedef しとかないと、宣言のときに一々 class xxxx って 頭にclassをつけなきゃいけなくなると思っていたのですが、 あれ?typedef しなくても、「 class 」って記述抜きで通っちゃいました なんでだろう???? 色々とありがとうございました <(_ _)>
- 502 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 10:21:49 ]
- そして、ドナドナ
- 503 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 06:35:46 ]
- unixのソースをPC上に移植したいと考えています。
・別階層に同名のファイルやフォルダって作れますか?( ・一気にサブフォルダを含めてプロジェクトに作成する事はできますか? (一つずつ、フォルダを掘って作成しないといけませんか?ドロップできなくて..)
- 504 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:04:01 ]
- コンポーネントのアンインストール方法
コンポーネントを試作中なのですが コンポーネントをインストールした状態でのテストをしてみたいと考えています。 (オブジェクトインスペクタがどんな感じになるかとか。。。) ということで 1.テストコンポーネントのインストール 2.コンポーネントのテスト 3.テストコンポーネントのアンインストール 4.コンポーネントの手直し という手順を繰り返したいのですが 3.をどうやってやったらよいのかがわかりません bcb6proです。 ご指導の程よろしくお願いします <(_ _)>
- 505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:12:20 ]
- パッケージのインストールのダイアログで該当パッケージのチェックボックスを外すでいいんじゃないの?
てかアンインストールしなくてもテスト>手直し>コンポのビルド>インストールで問題ない。
- 506 名前:504 mailto:sage [2008/05/09(金) 17:55:26 ]
- >>505
なるほど!それでやってみます ありがとうございました <(_ _)>
- 507 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:08:30 ]
- 複数のフォームで同一の関数を使うにはどうしたらよいのでしょうか?
ヘッダファイルのpublicに入れるだけではダメですよね? ソフトはBCB6.0Proです。 よろしくお願いします。
- 508 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:35:37 ]
- 入門書嫁としか
- 509 名前:507 mailto:sage [2008/05/10(土) 00:51:44 ]
- 調べたところ、以下の本が良い、とのことで注文してみましたが・・・載っていますでしょうか?
田舎なので本屋に置いてないので、見てから買うことが出来ないため、来るまでわからないんです。 www.amazon.co.jp/C%2B%2BBuilder6-%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E6%B4%BB%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89- %E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%88Vol-2%E3%80%89%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%8 3%8B%E3%83%83%E3%82%AF%E7%B7%A8-%E7%94%B0%E4%B8%AD-%E5%92%8C%E6%98%8E/dp/4877830626/ref=sr_1_22?ie=UTF8&s=books&qid=1210348178&sr=1-22
- 510 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 13:26:42 ]
- とりあえず関数の宣言が書いてあるヘッダファイルを
全部のフォームのソースにインクルードしときゃいいんじゃね?
- 511 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 13:59:05 ]
- 派生コンポーネントでのプロパティのオーバーライド
アクセッサの再利用について。 bcb6.0pro / WinXP SP2 pro 例えば、TEdit を継承して TMyEdit というコンポーネントを作成し、 そこで、BorderStyle プロパティをオーバーライドして BorderStyle を変更するときに、サイズも一緒に変化させるようにしたい場合、 新規の writeアクセッサ の中で従来のアクセッサを再利用することは出来ないもんでしょうか? つまり // QMyEdit.h //--------------------------------------------------------------------------- class PACKAGE TMyEdit : public TEdit { private: void __fastcall SetMyBorderStyle(TBorderStyle BorderStyle); // Myアクセッサ宣言 TBorderStyle FBorderStyle; // ここで再宣言?しないと // 「'FBorderStyle' は 'TMyEdit' のメンバーではない」 と怒られる protected: public: __fastcall TMyEdit(TComponent* Owner); __published: __property TBorderStyle BorderStyle = // プロパティオーバーライド {read=FBorderStyle, write=SetMyBorderStyle, // ←ここのwriteを拡張したい default=bsSingle}; }; //---------------------------------------------------------------------------
- 512 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 14:01:05 ]
- // QMyEdit.cpp
//--------------------------------------------------------------------------- void __fastcall TMyEdit::SetMyBorderStyle(TBorderStyle BorderStyle) // Myアクセッサ実装 { if(BorderStyle != FBorderStyle) if(BorderStyle == bsSingle) this->Width += 10; // なんだかんだで else this->Width -= 10; // ぐちゃぐちゃやってから TCustomEdit::SetBorderStyle(BorderStyle); // 基底のアクセッサを呼び出す } //--------------------------------------------------------------------------- と、こんな感じのソースなのですが [C++ エラー] QMyEdit.cpp(39): E2247 '_fastcall TCustomEdit::SetBorderStyle(const TBorderStyle)' はアクセスできない と怒られてしまいます。 っていうかよく考えたら、元々こいつらはprivateで宣言されてるはずなので 当たり前っつっちゃ、当たり前なんですが、なんとかして SetBorderStyle ってのを 再利用できないものでしょうか? それともやっぱり、ゴリゴリと一から実装し直さないと駄目なのものなのでしょうか? よろしくお願い致します <(_ _)>
- 513 名前:507 mailto:sage [2008/05/10(土) 15:49:09 ]
- >>510
それはやっているんですけど、動かないので・・・。 メインのフォームに書かれている関数なので、そのヘッダファイルは他のフォームでもインクルードしているのですが、 未定義の関数として見られてしまうんです。
- 514 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:40:20 ]
- TEdit から継承されたBorderStyleに値を突っ込めばええだけだろ。
- 515 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:51:18 ]
- >>513
メインフォームのメンバ関数として定義してりゃそりゃ見つからんだろ。 普通の関数にしないと。
- 516 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:26:48 ]
- >>514
なるほどっ!! // this->BorderStyle = FBorderStyle; // ←これじゃBorderStyleが変わるわけがない TEdit::BorderStyle = FBorderStyle; // ←こっちでバッチリ!! オーバーライドされる前のやつってのも、こうすれば使えるんっすね!! ありがとうございましたぁーーーーっ!!!
- 517 名前:507 mailto:sage [2008/05/10(土) 18:55:18 ]
- >>515
あー、そゆことですか ありがとうございました
- 518 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:38:35 ]
- >>517
C++Builderの入門書じゃなくてC/C++そのものの入門書読むことをすすめとく。 STLもvectorくらいは最低覚えとけ。
- 519 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:48:44 ]
- プロパティエディターを登録しようとしても「'__classid' には VCL 形式のクラス型が必要」となってしまう。
enum TMyEnum {meA = 3, meB = 6, …… }; という型のプロパティを、オブジェクトインスペクタでプルダウンリストから選択して設定できるようにしたい。 ということで、プロパティエディターに TEnumProperty を使って登録しようと思ったのですが、ヘルプを参考に #include <DesignEditors.hpp> namespace Tenumproperty { void __fastcall PACKAGE Register() { RegisterPropertyEditor(__typeinfo(TMyEnum), 0L, "", __classid(TEnumProperty)); } } とやっても、 [C++ エラー] BinEdit.cpp(52): E2242 '__classid' には VCL 形式のクラス型が必要 というエラーが出て通りません。 インクルードするヘッダを <VCLEditors.hpp> と取り替えたり、両方記述してみたり、 あるいは、「Designeditors::TEnumProperty」としてみたりとか色々と試行錯誤してみましたが駄目でした。 class DELPHICLASS TEnumProperty; class PASCALIMPLEMENTATION TEnumProperty : public TOrdinalProperty というのは「VCL 形式のクラス型」ではないのでしょうか? ご指導の程、よろしくお願いいたします。 <(_ _)>
- 520 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:46:19 ]
- すみません。RegisterPropertyEditor のヘルプをよく読んでいませんでした。
エラーが出ていたのは、__classid(TEnumProperty) ではなく、__typeinfo(TMyEnum) の方でした。 TMyEnum はクラスではないので、 PTypeInfo TypeInfo; PPropInfo PropInfo = GetPropInfo(__typeinfo(TForm), "BorderStyle"); if (PropInfo) TypeInfo = *(PropInfo->PropType); という具合にしないといけないようですが、GetPropInfo がよくわかりません。 ヘルプを見ても引数が void のものしかありませんし、 Win32API の方で GetProp というのが該当する様ですが、こちらに変えてもうまくゆきませんでした。 enum型の型情報ポインタってのは、いったいどうやったら取得できるのでしょうか (´;ω;`)
- 521 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 19:02:40 ]
- ヘルプに記載はありませんでしたが、
extern PACKAGE PPropInfo __fastcall GetPropInfo(PTypeInfo TypeInfo, const AnsiString PropName)/* overload */; こんな関数がオーバーライドされているようでした。 コンポーネント本体のヘッダ、ソースと同じパッケージに突っ込むことで なんとかこれで「TMyEnum型の型情報ポインタ」とやらを取得できているっぽいです。 これで、プロパティエディタを登録できたはず! と思いきや、全然反映されていません(´;ω;`) 素のTEnumPropertyじゃ駄目なのかと、継承クラスを作ってもみましたが、やっぱりだめ Designintf::TPropertyAttributes __fastcall TAlignmentProperty::GetAttributes(void){ return TPropertyAttributes() << paValueList << paRevertable; } AnsiString __fastcall TAlignmentProperty::GetValue() { int iValue = GetOrdValue(); switch(iValue) { 〜中略〜 default : return AnsiString("dtUnknown"); } } void __fastcall TAlignmentProperty::SetValue(const AnsiString asValue) { if(asValue == AnsiString("dtLeftTop") ) SetOrdValue(DT_LEFT + DT_TOP + DT_SINGLELINE + DT_NOCLIP); else SetOrdValue(NULL); } TEnumPropertyを継承したときのオーバーライドってこれで合ってますでしょうか よろしくお願いします <(_ _)>
- 522 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:06:01 ]
- 動的にフォームを出したいのですが、
TfmOption *fmOption = new TfmOption(this); fmOption->ShowModal(); delete fmOption; どうもうごきません。 それとモーダルもしたくないのですが、 普通にメインウィンドウと同等のウィンドウとしたいのです。 オプションで初期にはロードしたくありません
- 523 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 07:43:32 ]
- >>522
TForm::Visibleをチェック。 新規作成したフォームはデフォルト値がfalseになってる。
- 524 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 10:04:48 ]
- ShowModal();すると、自動的にVisible=trueに設定されるから
Visible=trueは必要ないハズ。 >>522は基本的にOKだと思う。 動かないとは、表示されないという意味なのだろうか。 モーダルにしたくないなら、 fmOption->Show();
- 525 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:42:51 ]
- //---------------------------------------------------------------------------
void __fastcall Tform1::Button1Click(TObject *Sender) { *fmOption = new TfmOption(this); fmOption->Show(); } //--------------------------------------------------------------------------- void __fastcall Tform1::Button2Click(TObject *Sender) { delete fmOption; } //--------------------------------------------------------------------------- //ヘッダ private: // ユーザー宣言 TfmOption *fmOption ; まず、*fmOptionの*すらわからずやってます。 やりたいことは、オプションのコンポーネントがおおすきるので、 fmOptionの起動に時間がかかります。 それで、exe起動時に起動画面をだし、その間にオプションを出すよていです。 自動生成フォームとして提供したら起動画面がオプションがロードされた後 出てきて意味がないのです。 で、メインフォームのprivate変数にオプション保持用の変数をもって、 ロードしたいのですが、簡単そうでむずかしくて・・・。
- 526 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:43:57 ]
- ネット見てもShowModalしか出てこなくて。
- 527 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:21:12 ]
- で?
- 528 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 01:06:04 ]
- つかC/C++の基本だけでも勉強しないとにっちもさっちもいかなんじゃないかな。
その気がないならDelphiのほうがまだましだと思う。
- 529 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 17:06:13 ]
- >>525も低脳だが、
>>528の方がもっと低脳 の件について
- 530 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 19:49:26 ]
- なんでー?
- 531 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 19:58:38 ]
- >525
ヒント:ヘルプ
- 532 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 17:59:51 ]
- >>529
× の件 ○ な件
- 533 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 18:07:55 ]
- ものすごく素朴な質問なんですがエディットボックスがあるとして
buf[0]の値が255であるとき Edit->Text.printf("%02X",buf[0]); ヘキサの[FF]と表示されるようにしたいのですが、やはり AnsiString ss.printf("%02X",buf[0]); Edit->Text = ss; のように代入するしか方法はないのでしょうか?先人の方教えて 頂けませんか?
|

|