C++Builder相談室 Par ..
74:デフォルトの名無しさん
08/09/21 11:28:07
要は今までANSI(ISO 8859系)で処理してたてことだよね?AnsiStringで処理しておいて
表示のみUnicodeStringにするとかそのくらいしか思い浮かばないな。
75:デフォルトの名無しさん
08/09/21 12:04:00
>>74
そういう方法しかないかなぁ......
一応試しているんだけれど、TEncodeingでUnicode化もうまくいかないんだよね......
TBytesにAnsiStringを変換しないとUnicode化はできないみたいなんだけれども、
これもうまくいかない......
76:デフォルトの名無しさん
08/09/22 07:05:05
>>75
もしよかったらバージョンいくつからの以降で、
どの程度ソースの変更が必要だったか教えて欲しい。
77:デフォルトの名無しさん
08/09/23 09:38:40
>>76
えっと、CodeGearウオッチャスレにも書いてるから、
重複するけれども、こんな感じ。
まぁ、やり方が分かれば、手間は掛かるかもだけれども難しい事はないよ。
C++Builder2007とC++Builder5からの移行だよ。
例1)MessageBoxに直接文字列セット
Applcation->MessageBox("mes","mes",MB_OK);
↓
Applcation->MessageBox(L"mes",L"mes",MB_OK);
例2)AnsiString型に文字列をセットしてMessageBox出力
AnsiString str="mes";
Applcation->MessageBox(str.c_str(),str.c_str(),MB_OK);
↓
UnicodeString str="mes";
Applcation->MessageBox(str.w_str(),str.w_str(),MB_OK);
例3)DelphiのVCL登録
Char→AnsiChar
PChar→PAnsiChar
例4)C++Builder5からの移行
C++Builder5から移行して、例1とか例2とかの修正後、
リンカエラーが出た場合の対処として、新規プロジェクトを作成
してフォームのCPPファイルを追加してコンパイルするとリンクも通る。
78:デフォルトの名無しさん
08/09/23 10:22:15
>>77
ありがとう。L マクロか。
私も5からの以降なんだけど、
フォームは作り直さないとやっぱりダメ?
>フォームのcpp ←dfm の間違いだったらいいんだけど・・・
79:デフォルトの名無しさん
08/09/23 10:55:33
>>78
あっ、フォームを作り直す必要はないよ。
作り直す必要があるのはプロジェクトファイルね。
新規でVCLフォームアプリケーションを作成して、最初にあるuit1をプロジェクト
から削除後、C++Builder5で作ったdfmのあるCPPファイルをプロジェクト
にD&Dすると、dfmとcppとhファイルが勝手に追加されるから、
その後ならリンクも正常に通るよ。
80:デフォルトの名無しさん
08/09/23 21:08:50
>>79
ありがとう!
決心しました。
明日アップグレード金振り込んできます。
デヴェロッパーズキャンプとか出たのに、
そういう肝心なことは聞きにくかった。
っていうか、Builder5 からの移行って時点で
聞きにくかった・・・。
81:デフォルトの名無しさん
08/09/23 22:42:54
>>80
お役に立てたら何よりだよ。
とりあえず、C++Builder2007でも通らなかったものはある。
具体的にはTarCtrlsっていうVCL。
これは、dsinintf.hppっていうのを使っているが、これがC++Builder2007
の時点でファイル名が変わってたっぽい。
で、そのファイル名に変更してみたんだが、クラス名も変わってるみたいで
簡単には移植できなさそうで諦めたよ。
そういったものを使ってなければ、移植に関してはそんなに問題はないと思うよ。
82:デフォルトの名無しさん
08/09/24 10:13:25
>>81
重ね重ね、ありがとう。
VCL でも整理されたクラスとかあるんだね。
TarCtrls は多分使ってないと思う。
あんまり VCL でも変わったのは使わないようにしてるから、
意外と移植の手間は少なそうな気がしてきた。
それより、Lマクロがめんどくさそう・・・。
83:デフォルトの名無しさん
08/09/24 11:56:47
AnsiString、WideString、UnicodeStringでtypedefで置き換えできる位の互換性持たせてくれと思う・・
84:デフォルトの名無しさん
08/09/25 14:07:34
2009トライアル版にBCB6のプロジェクトを読み込ませてビルドを試みてるけど,書き直しが結構大変。
>>77のMessageBoxも沢山あるんだけど,何しろヘルプがバグだらけで正しい書き直し方がわかるまでに
時間がかかる。
・UnicodeStringのc_str()メソッドはwchar_t*を返すとヘルプには書いてあるが,実際にはchar*が返される。
wchar_t*を返すのはw_str()だった。
・ExceptionクラスのMessageプロパティの型はヘルプによればAnsiStringだが,実際にはUnicodeString。
・DateTimeToString関数のプロトタイプはヘルプではDateTimeToString(AnsiString, const AnsiString, TDateTime);
となっているが,正しくはDateTimeToString(UnicodeString &, const UnicodeString, TDateTime);らしい。
結局ヘルプではAnsiString→UnicodeStringの書き換えがまともに行われてないんだということがやっとわかった。
それにしても&くらい抜かさずにちゃんと書いて欲しい...
ところで2009ではTEditのTextやTButtonのCaptionなんかが軒並みAnsiStringからTCaptionという型に変わって
るんだけど,ヘルプにはTCaptionはstringだと書いてある。これってstd::stringのことなの?
だとすると,ToInt()とかないからstd::stringstream使わなきゃなんないし,今までインデックスが1からだったのが
0からになるし,エライ騒ぎなんだが...と思ったら,違うみたい。デフォルトではstringはUnicodStringだそうな。
もーようわからん。Delphiとごっちゃになったヘルプはなんとかならのか!
85:デフォルトの名無しさん
08/09/25 15:24:28
>2009トライアル版にBCB6のプロジェクトを読み込ませてビルドを試みてるけど,
BCB6を使ってるとは同じ身だorz
誰か対応方法wiki化しる!
86:デフォルトの名無しさん
08/09/25 16:06:32
>std::stringstream使わなきゃなんないし
#define _TCAPTION(str) std::string(str.c_str())
でいいじゃん
87:84
08/09/25 16:10:03
>>86
いや,TCaption=std::stringじゃなくてTCaption=UnicodeStringだってことがわかったんでいいんだ。
紛らわしいこと書いてスマソ。
88:デフォルトの名無しさん
08/09/28 13:42:03
うにこでStringはt_str()で_TCHARが返るよ
89:デフォルトの名無しさん
08/09/28 13:44:10
うにこで初心者はここら辺見とくといいよ
URLリンク(www.ruche-home.net)
90:80
08/09/29 22:12:58
ビルダー2009コネーヨー> ヽ(´Д`)ノ
もう2日まって来なかったら、連絡してみよう・・・。
91:デフォルトの名無しさん
08/09/30 12:53:19
StrToInt では16進数文字列が変換できないの?
自分で HexToInt なる関数をつくってしまったわい。
92:デフォルトの名無しさん
08/09/30 13:19:32
>>91
変換する文字列の頭に 0x つければできるよ。
93:デフォルトの名無しさん
08/09/30 16:15:04
>>91 m9(^Д^)
94:デフォルトの名無しさん
08/09/30 16:24:31
こういうのは自作した方が良い。
95:80
08/09/30 16:25:12
今日届いた。一応解決したからかきこんどきます。スレ汚し、スマヌ。
インストールする気が全く起きん・・・。
96:デフォルトの名無しさん
08/09/30 19:00:11
>91
'$'+でももちろんおk
97:貧乏学生
08/09/30 19:27:05
質問です。
ファイルをリストボックス上にスクロールダウンして
リストボックスにファイルのパスが表示されるプログラムが
出来なくて困っています。
ご存知の方いらっしゃいましたらご指導よろしくお願いします。
98:デフォルトの名無しさん
08/09/30 19:37:26
>>97
どこの言葉だよ・・・。
99:デフォルトの名無しさん
08/09/30 20:32:09
にh(ry
100:デフォルトの名無しさん
08/09/30 20:36:32
リストボックスにD&Dでリストボックスにファイルパスを表示する
ということ?
101:貧乏学生
08/09/30 20:38:00
>>100
そうです。お教えください。よろしくお願いします。
102:デフォルトの名無しさん
08/09/30 20:39:30
貧乏な学生達はD&Dのことをスクロールダウンというのか・・・
103:デフォルトの名無しさん
08/09/30 20:48:38
どこの国からの留学生だヨ。
104:デフォルトの名無しさん
08/09/30 23:20:09
>>101
DragAcceptFiles を使う。
あとは DragQueryFile 辺りを調べてみて。
105:デフォルトの名無しさん
08/10/01 03:17:36
コンポなかったっけ?まあ、APIでやったほうがパッケージ管理の必要ないから楽だけど。
>>102
D&Dっていったらダンジョンズ・アンド・ドラゴンズだろ
106:デフォルトの名無しさん
08/10/01 08:27:09
アイコンにファイルをドラッグ&ドロップしたら
アプリが起動するって
どういう仕組みになってるんだろ?
107:デフォルトの名無しさん
08/10/01 08:41:02
>>106
それをやるのが OS の GUI。
108:デフォルトの名無しさん
08/10/01 09:47:12
>>106
コマンドラインパラメータにドラッグ&ドロップされたファイル名が入ってくるから,
_argv[]とかParamStr()で取れるよ...って,そういう話じゃないのかな?
109:デフォルトの名無しさん
08/10/01 11:32:30
C++B 2009のトライアル版を使っています。
各コンポーネントのCaption表示をリソース管理でローカライズすることは
出来たのですが、動的に表示を変える場合に用意した文字列を、リソース管理
でのローカライズ方法が分かりません。どなたか御教授下さい。
ちなみに、Caption表示等のリソースファイル(dfm, rc)とは別に文字列を定義
するファイルを作らないといけないんですかね?
110:デフォルトの名無しさん
08/10/01 12:09:25
EXEといっしょにリソース入れるなら分けた意味ないだろ。
入れ替えたいなら、普通DLLでリソース持つわな。
111:デフォルトの名無しさん
08/10/01 13:38:11
DLLですか・・・。
C++Bのエディットで表示したソース上で日本語以外のワイド文字が
入力出来ないみたいなんで、入力が出来るトランスレーションエディ
タで一緒に編集できる方法があればと思ったのですが。
112:デフォルトの名無しさん
08/10/01 14:05:49
簡単に編集したかったら
>>109 のように独自定義ファイル作って、実行時に読み込んで割り付けると楽だと思うが。
別にリソースでわざわざ持たせなくてもいいんだろ?
113:106
08/10/01 15:21:24
>>108
そういうことダス。
ベリベリサンキュ。
114:デフォルトの名無しさん
08/10/01 15:26:33
そうですね。
独自定義ファイルやDLLを作成するにしても外部ファイルが増
えてしまうので、出来れば増やしたくないってのがありますが
結局リソースファイル作る時点で増えるんで、独自定義ファイル
でまとめたほうが楽ですね。
115:デフォルトの名無しさん
08/10/01 15:32:12
そうそう、独自定義ファイルをUTF-8で作っておいたら無問題。
それと編集しやすいファイル記述形式は、
>AAA=menu click
みたいな1行単位。
これだと、TStringListにロードさせたあとは、Valuesで取れるし、
テキトーにファイルにコメント書いても悪影響ないし、
それとか、いざ、Win以外の開発が発生してもロードクラスを簡単に作れる。
116:115
08/10/01 15:35:45
さらに自分の場合、
>Form1="送信フォーム"
>Form1.Label1="送信設定"
>Form1.Button1="送信"
みたいにしといて、
TStringListを渡しておいたら、
勝手にフォームのコントロールを検索してのキャプション書き換える
クラス作ちゃったw
注意点は、メモ帳でファイル書き換えても自分の直した行しか変わらず問題ないが、
ワードパッドとかで書きかえるとファイル保存するときにUNICODE勝手にいじられちゃう。
117:115
08/10/01 15:40:46
ついでにヒントを書いておくと、
・ファイルロードするTStringListクラスを保持したLangListクラス
・ロードしたものでコントロールのキャプション書き換えるクラス
は別々にしておいた方が良い。
なぜかというと、ロードしたクラスのみを使う場合があります。
例)
throw Exception(LangList.ValuesAnsi("MSG.CannotCreateFile") + SDestFile);
(LangListからUTF8でとるときは、LangList.ValuesUtf8("MSG.CannotCreateFile")とか書く)
118:デフォルトの名無しさん
08/10/01 15:55:30
109です。
>>115
似たようなことをやっていたのですが、
自分の場合リストからロードする時にValue使わずに、
わざわざ文字列比較して引っかけてたんで、すごく
参考になります。
わざわざ、独自定義ファイルの作り方を教えて下さって
ありがとうございます!!
119:デフォルトの名無しさん
08/10/02 00:03:06
このあいだのデベロッパーキャンプで高橋さんが.pasファイルにresourcestringを書いといて
リンクすればいい、ってのをやってた希ガス。標準的な手法があるなら独自にやるのは無駄では?
URLリンク(dn.codegear.com)
これのB3かな?あとは
URLリンク(dybdahl.dk)
こゆのとか。
120:デフォルトの名無しさん
08/10/02 00:26:23
なるほど。それはいいことを聞いた。
で、ヘルプの「アプリケーションのローカライズ」で検索したらなんか出てきたよ。
今勉強中。
121:デフォルトの名無しさん
08/10/02 17:35:37
AnsiStringで文字列末に\0を二つ追加したいのですが、
AnsiString str;
str += "\0\0";
ではだめそうでした。char* に変換するのも面倒で、
なんかいい方法無いでしょうか。
122:デフォルトの名無しさん
08/10/02 21:07:52
>>121
大丈夫なようだが。
AnsiString str = "abc";
str += "\0\0";
Edit1->Text = str;
if (str.SubString(4, 1) == "\0") {
Label1->Caption = "\\0";
}
if (str.SubString(5, 1) == "\0") {
Label2->Caption = "\\0";
}
123:デフォルトの名無しさん
08/10/02 21:47:12
悪い。AnsiStringでは"\0"のデータを直接演算できないみたいだね。
cat_printf()を使ったらうまくいった。
AnsiString str = "abc";
str.cat_printf("%c%c", 0, 0);
Edit1->Text = str;
Label3->Caption = str.Length();
if (str[4] == 0)
Label1->Caption = "\\0";
if (str[5] == 0)
Label2->Caption = "\\0";
124:121
08/10/03 15:45:35
>>122-123 おお、cat_printfなんてものがあるんですね、
ありがとうございました!
使うところはもちろんSHFileOperationなのでした。
125:デフォルトの名無しさん
08/10/07 07:00:06
2009でPNG画像使おうとするとうまくいかない
新規プロジェクトのフォームに貼ったTImageにPNGを読み込ませておいてビルド→
[ILINK32 エラー] Error: 未解決の外部参照 'Pnglang::_EPngInvalidCRCText' が C:\PROGRAM FILES\CODEGEAR\RAD STUDIO\6.0\LIB\OBJ\PNGIMAGE.OBJ から参照されました
(もちろん、Pnglang.hppとPnglang.objは存在する)
読み込ませずにビルドしても同じ。TImageを貼っただけではうまくいくので、PNGを読み込ませた時に挿入さ
れた#include <pngimage.hpp>を削ってみるとビルドはとおるが、TImageの(TPictureの)LoadFromFileなどで
読み込もうとしても未サポートの拡張子と言われる
じゃあ、TPngImageを使おうと思っても、これはpngimage.hppで宣言されているのでインクルードしないとコン
パイルできないが、インクルードするとリンクエラー
試しに別のマシンに2009インストールして試してみたけど同じだった(両方ともXPマシン)
まともに使えている人いる? おかしいのは俺のところだけか?
それとも、何か情報ある?
126:デフォルトの名無しさん
08/10/07 14:57:15
>>125
リリースノートによると、画像処理のパッケージがVCLJPGからVCLIMGに代わったからその影響みたい。
URLリンク(forums.codegear.com)
その、VCLIMGパッケージがリンクできていないようだから、どこか適当なソースに、
#pragma link "vclimg.lib"か#pragma link "vclimg.bpi"を追加すれば出来た。
127:125
08/10/07 22:40:45
>>126
さんきゅ 動いたよ!
今後の事考えると面倒なんで、Pnglang.hppに#pragma link "vclimg.lib"書き加えたw
128:デフォルトの名無しさん
08/10/09 22:29:52
フォームにパネルを均等に配置してるのですが、
最大化した時に、フォームのサイズに合わせて配置したパネルも一緒に拡大する方法を教えてください
オブジェクトインスペクタの設定でできますか?
129:デフォルトの名無しさん
08/10/09 23:41:18
>128
Anchors
130:デフォルトの名無しさん
08/10/10 20:41:01
データダイアグラムの使い方がよくわかりません
誰か教えて
131:デフォルトの名無しさん
08/10/11 01:36:14
>>129
アンカーでどうやって均等配置できるんですか??
LeftとRightをtrueですか?
そうしたらLeftの位置は変わらないからRightが伸びてパネルがかぶるし・・・
どうすればいいんでしょうか?
132:デフォルトの名無しさん
08/10/11 12:25:15
>>131
どういう状態にしたいかがよく分からんが、新しくPanelを作ってBevelOuter
をbvNoneにし、その上に今のPanelを置いてAnchorsを変えればいいんじゃない?
133:デフォルトの名無しさん
08/10/11 18:54:02
>>128
OnResizeイベントでダメなん?
134:デフォルトの名無しさん
08/10/11 19:26:56
>>132
えとですね。
例えばフォームWidthが200として横に均等にパネルを4つ並べます。
こんな感じで↓(とりあえず横が分かれば縦もわかるので今は高さを考慮しない)
隙間(20)パネル(25)隙間(20)パネル(25)隙間(20)パネル(25)隙間(20)パネル(25)隙間(20)
これをフォームのWidthを倍の400にした時に
隙間(40)パネル(50)隙間(40)パネル(50)隙間(40)パネル(50)隙間(40)パネル(50)隙間(40)
こんな感じに間隔もパネル幅も倍になってほしいのですが。。。
これってプロパティだけでできますか?
>>133
自分で計算してパネルの位置と幅を調整しなさいよってことですか?
135:デフォルトの名無しさん
08/10/11 20:00:23
普通こういう風にしないか?
void __fastcall TForm1::FormResize(TObject *Sender)
{
Panel1->Width = Form1->Width * 0.5;
Panel2->Left = Form1->Width * 0.5;
Panel2->Width = Form1->Width * 0.5;
}
136:デフォルトの名無しさん
08/10/12 14:09:50
>>135
それが普通かどうかはわかりませんが
オブジェクトインスペクタで設計時にやる方法があるのかなって思ってききました
できないならやはりResizeで自分で計算するしかないですよね
137:デフォルトの名無しさん
08/10/12 15:38:01
>136
OnResizeで全部自前計算でFA。
138:132
08/10/12 21:32:48
>>134
ん〜......
色々試してみたが、今の所できんかった。
こういうのって半分パズルだよなぁ......
できない事はないのかもしれんが、オレはちょっとできんかった。
139:デフォルトの名無しさん
08/10/12 22:40:16
>>134
へたにフォームのプロパティでぐちゃぐちゃやるより、手で書いた方が良いと思う。
140:デフォルトの名無しさん
08/10/13 12:33:23
>>137
やっぱそれでFAですかね。
>>138
何か出来そうな気はするんですよね。でもたぶんできないっぽいような
>>139
アンカーとかである程度はできるから簡単にできるのなっておもいまして
とりあえずResizeでFindComponentでパネル取ってやりまーす
エロい人達ありがとう
141:デフォルトの名無しさん
08/10/15 00:24:22
>>140
>134の状態だと、例えば1ピクセルだけフォームを広げてみた場合、パネルと隙間の増分ピクセル数が
小数になっちゃう
Anchorとかのプロパティでは、フォームのリサイズのピクセル数がそのまま各コントロールに影響するの
で、根本的に無理があるね
142:デフォルトの名無しさん
08/10/17 17:47:42
C++Builder6のIDEで質問があります。
ソース内の関数使用箇所から実装部へジャンプする操作(マウス・キーコンビネーションなど)
はないのでしょうか。
MyFunc();
をクリックか何かして
void MyFunc(void)
{
...
}
へジャンプするみたいな感じです。あちこちで調べたんですが、どうしてもわかりません。
143:デフォルトの名無しさん
08/10/17 18:22:16
>>142
右クリック→定義の検索、ではだめなん?
144:デフォルトの名無しさん
08/10/17 22:37:16
142です。
右クリック->定義の検索 だと宣言部(.hの方)にジャンプしますよね?
.cppの方を見たいのです。人の作ったソースを追っかける時にこの機能が無いと不便で仕方ないんです…
それとも何か条件で.hに行ったり.cppに行ったりするのかな?
VC++だと一度ビルドしてクラス情報を生成しないとダメ、みたいなのがあるけど、BCBにもあるんですかね?
一応このプロジェクトはビルドしてEXE作ってるけど…
145:デフォルトの名無しさん
08/10/17 23:54:34
.hに飛ぶのは、.cppの方がすでにビルドされていてバイナリになって
不可視になってる事があるからじゃない?
例えば配布されているライブラリとかそうじゃん。
.cppはいつもCtrl+Fで検索してるけど。
146:デフォルトの名無しさん
08/10/20 10:07:29
test
147:デフォルトの名無しさん
08/10/21 16:15:58
2007でエディタにアウトラインっぽいのがありますがこれOFFにできますか?
148:デフォルトの名無しさん
08/10/21 22:19:58
できない
149:デフォルトの名無しさん
08/10/23 11:56:54
Memo1に60行の乱数を出したんですけど、この60行の配列の平均を取った数字を
Edit1に出したいのですがなかなかどうすればいいんでしょうか・・
どなたかアドバイスお願いします。
150:デフォルトの名無しさん
08/10/23 13:19:28
ヒント
Lines->Strings
StrToInt
151:デフォルトの名無しさん
08/10/23 13:20:52
>>149
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0; i < 60; i++) {
Memo1->Lines->Add(AnsiString(std::rand()));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double sum = 0.;
for (int i = 0; i < Memo1->Lines->Count; i++)
sum += Memo1->Lines->Strings[i].ToDouble();
Edit1->Text = AnsiString(sum / Memo1->Lines->Count);
}
152:デフォルトの名無しさん
08/10/23 13:30:27
データはコントロールじゃなくてコード内で保持した方がよくね?
std::vector<int> results;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i = 0; i < 60; i++) {
int value = std::rand();
results.push_back(value);
Memo1->Lines->Add(AnsiString(value));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double sum = 0.;
for(std::vactor<int>::iterator it = results.begin(); it < results.end(); it++)
sum += *it;
Edit1->Text = AnsiString(sum / result.size());
}
153:デフォルトの名無しさん
08/10/23 16:01:04
》150》151》152 ありがとうございました!おかげさまでなんとかつくり終えることができました
154:デフォルトの名無しさん
08/10/23 16:03:10
そういう安価のつけかたもあんか
いや、あるんか
155:デフォルトの名無しさん
08/10/23 16:14:07
>>153, >>154
さすがにコンパイルエラーになったけど, 150 >> 151 >> 152; ならコンパイル通ったw
156:デフォルトの名無しさん
08/10/23 16:18:52
そう言えばC++Builderの<<、>>演算子のキモい使い方があったような
何に使うんだっけ?
確かビットを立てたり外したりするのに使った記憶が
157:デフォルトの名無しさん
08/10/23 16:27:23
集合型のエミュレーションだね
Set型
158:155
08/10/23 16:29:41
>>156
ヲイヲイ,<< と >> はCの時代からビットシフト演算子だよ。C++になってから >> cout とか別の使い方で
定義されるようになった。>>155だってビットシフトの意味があるからコンパイルが通るだと思う。
150数ビットもシフトしてどうすんの?...なんだけどw
159:155
08/10/23 16:30:30
あぁ,スマソ。そっちの話か。
160:デフォルトの名無しさん
08/10/23 16:34:11
>>157
ああ、それだ。滅多に使わないから忘れかけてた。
Delphiならスマートに書けるのだがC++Builderならムリヤリ感が。
>>158
まあそういう事だ。
161:デフォルトの名無しさん
08/10/23 16:44:00
>>160
普段はオブジェクトインスペクタからいじっちゃうからね
コードでいじる場合はどうしてもヘルプ頼りに
162:デフォルトの名無しさん
08/10/23 16:52:42
そういやオープン配列もだいぶ無茶してたよなあ
TVarRecとか
カッコを二重に書かなければならないのを時々忘れる
163:デフォルトの名無しさん
08/10/23 16:54:48
オープン配列は大抵Formatに使うことが多いから、Format使わずにAnsiString::sprintf()でやってるな
164:デフォルトの名無しさん
08/10/29 11:22:19
すみません教えてください。。。
C++BuilderでVBスクリプト?を使ってSNMPで値の送受信を行いたいのですが
VBのソースは以下の通りです
Dim objSNMP
Set objSNMP = CreateObject("OlePrn.OleSNMP")
objSNMP.Open "192.168.0.40", "public", 2, 1000
Dim myObjectValue
ObjectValue = objSNMP.Get(".1.3.6.1.2.1.1.4.0")
WScript.Echo ObjectValue
objSNMP.Set ".1.3.6.1.2.1.1.4.0", CStr("e-mail:xxx@xxx.xxx tel:xxx-xxxx-xxxx")
Dim myChangedObjectValue
myChangedObjectValue = objSNMP.Get(".1.3.6.1.2.1.1.4.0")
objSNMP.Close()
これをC++Builderではどのような記述になるのでしょうか?
CreateObjectはたぶんこんな感じになると思うのですが
この続きの記述を教えてください。。
Variant cn = Variant::CreateObject("OlePrn.OleSNMP");
165:デフォルトの名無しさん
08/10/30 16:49:46
ブタ共さっさと教えてください
166:デフォルトの名無しさん
08/10/30 16:53:58
Indyでやるだろ、jk。
167:デフォルトの名無しさん
08/10/30 16:58:20
最近の子はマニュアル読んでとりあえずできるかテストしてみようって事しないんだな
168:デフォルトの名無しさん
08/10/30 17:02:53
Indyならフォームにペタっと貼るだけ。
169:デフォルトの名無しさん
08/10/30 18:41:08
知らないならレスしないで下さいよ。ウザくてかなわん
170:デフォルトの名無しさん
08/10/30 19:02:18
その程度ができないのになんでプログラムなんて書いてるの?バカなの?
171:デフォルトの名無しさん
08/10/31 15:32:06
アイコン化されたフォームを元に戻す方法を教えてブタ共よ
172:デフォルトの名無しさん
08/10/31 15:37:40
Application->Restoreでできたわ
ほんとお前らって何の役にも立たないブタだよな・・・
173:デフォルトの名無しさん
08/10/31 16:27:08
役に立たないブタはageます
174:デフォルトの名無しさん
08/11/01 00:31:47
自力でできたということは、自力でやらせようとした人間達の狙いは大成功したということで、
役に立たないどころかすべてが計算通りに進んだということですw
175:デフォルトの名無しさん
08/11/03 20:06:59
csv方式で
656,000,1123,5454
756,000,5454,3455
545,001,6565,4554 6565
545,002,5455,7775 → 5455
223,006,5656,9898 5656
054,004,5554,5554 5554
・ ・
・ ・
・ ・
843,022,6643,4443 6643
565,011,3434,4455 3434
656,000,3343,2432
789,000,5545,6665
こんな感じで配列が並んでいるのですが各数列の2番目数字が000以外のときに
3番目の数字だけを配列として順にMemo1にだしたいのですがどのようにすればよいでしょうか
176:デフォルトの名無しさん
08/11/03 20:10:04
ずれていたので再投稿します
csv方式で
656,000,1123,5454
756,000,5454,3455
545,001,6565,4554 6565
545,002,5455,7775 → 5455
223,006,5656,9898 5656
054,004,5554,5554 5554
・ ・
・ ・
・ ・
843,022,6643,4443 6643
565,011,3434,4455 3434
656,000,3343,2432
789,000,5545,6665
こんな感じで配列が並んでいるのですが各数列の2番目数字が000以外のときに
3番目の数字だけを配列として順にMemo1にだしたいのですがどのようにすればよいでしょうか
177:デフォルトの名無しさん
08/11/03 20:28:15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::ifstream ifs("File1.txt");
std::string str;
AnsiString as;
if (ifs) {
TStringList* Data = new TStringList;
Data->Delimiter = ',';
while (std::getline(ifs, str)) {
Data->DelimitedText = str.c_str();
if (Data->Strings[2] != "000")
Memo1->Lines->Add(Data->Strings[3]);
}
delete Data;
}
178:デフォルトの名無しさん
08/11/03 20:30:24
ごめんこっちで
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::ifstream ifs("File1.txt");
std::string str;
AnsiString as;
if (ifs) {
TStringList* Data = new TStringList;
Data->Delimiter = ',';
while (std::getline(ifs, str)) {
Data->DelimitedText = str.c_str();
if (Data->Strings[1] != "000")
Memo1->Lines->Add(Data->Strings[2]);
}
delete Data;
}
}
179:デフォルトの名無しさん
08/11/03 20:44:28
AnsiString as;使ってなくね
いらないけどさ
180:デフォルトの名無しさん
08/11/03 20:46:46
>>179
ごめんそうです
削ってくらはい
181:デフォルトの名無しさん
08/11/03 20:56:09
>>177>>178
ありがとうございます!
csv形式のテキストはオープンダイアログから読み込みその中から抽出することはできるのでしょうか
また先ほどの文で
DelimiterとDelimitedTextはTStringListのメンバーではないと言われるのですが
何か宣言文などが必要なのでしょうか。
まだまだ初心者でして;いろいろご迷惑かけてすいません。
182:デフォルトの名無しさん
08/11/03 21:17:26
>>181
>csv形式のテキストはオープンダイアログから読み込みその中から抽出することはできるのでしょうか
できます。
TOpenDialog->Filesに入ります。
>DelimiterとDelimitedTextはTStringListのメンバーではないと言われるのですが
>何か宣言文などが必要なのでしょうか。
えっもしかしてC++Builderのバージョンは5以前ですか?
183:デフォルトの名無しさん
08/11/03 23:14:27
しばらく待ってみましたが返事がないのでDelimiterを使わないバージョンを
書いてみました。
コンマの数や桁数などは決め打ちになってますので必要ならば適宜変更して
ください。
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
std::ifstream ifs(OpenDialog1->FileName.c_str());
std::string str;
if (ifs)
while (std::getline(ifs, str)) {
std::string::size_type pos = str.find(',') + 1;
if (str.substr(pos, 3) != "000") {
pos = str.find(',', pos) + 1;
Memo1->Lines->Add(str.substr(pos, 4).c_str());
}
}
}
184:デフォルトの名無しさん
08/11/04 19:29:47
>>183
返事が遅れてすいません。ありがとうございました!大変感謝しています
こちらのやり方で動きました。c++builderはver5を使っています
あと桁数をコンマの数をかえるとのことなのですが、
桁数を変える場合は5桁表示するならpos 5 にすればよいことはいじっていてわかったのですが
コンマの位置を変える場合どの部分を変えていけばよいのでしょうか・・・
よろしければアドバイスお願いします><
実際の応用テキストではさらに数字が多く6番目数字(コンマ5つ目)が00:00:00(桁数は変化しない)以外の時に
11番目(コンマ10個目)の数字を表示するようにしたいのです。実際に表示したい数字も小数点を含む5.55(桁数は変化しない)などです。
185:デフォルトの名無しさん
08/11/04 20:07:38
>>184
かなり汚いですが一応動くので載せておきます。
コンマの位置を変えるにはfor文の数字をいじればいいですが、
できればコンマn番目から次のコンマもしくは行末までの文字列を
取り出す関数を別に作ってそれを呼び出した方が綺麗に書けると
思います。
void __fastcall TForm1::Button4Click(TObject *Sender)
{
OpenDialog1->Execute();
std::ifstream ifs(OpenDialog1->FileName.c_str());
std::string str;
if (ifs)
while (std::getline(ifs, str)) {
std::string::size_type pos = 0;
for (int i = 0; i < 5; i++) {
if((pos = str.find(',', pos)) == std::string::npos)
goto next;
pos++;
}
次に続く
186:デフォルトの名無しさん
08/11/04 20:08:38
std::string::size_type pos2 = str.find(',', pos) + 1;
if (str.substr(pos, pos2 - pos - 1) != "00:00:00") {
pos = pos2;
for (int i = 0; i < 3; i++) {
if((pos = str.find(',', pos)) == std::string::npos)
goto next;
pos++;
}
pos2 = str.find(',', pos);
if (pos2 == std::string::npos)
pos2 = pos;
else
pos2++;
Memo1->Lines->Add(str.substr(pos2, 4).c_str());
}
next:;
}
}
要するにTStrings::operator[] の機能を自前で書けばすっきりするはずです。
187:デフォルトの名無しさん
08/11/04 20:21:50
public:
__property AnsiString Cells [int rows] [int cols]= {read=GetCell, write=SetCell};
こんなメンバ持たせたCSVクラス作って使ってるなぁ
188:デフォルトの名無しさん
08/11/04 20:29:44
>>187
BCBはDelphiとのインターフェースが割合簡単に取れるから、
Delphiで書かれたcsvパッケージでも入れたら楽でしょうね。
189:デフォルトの名無しさん
08/11/04 20:31:03
>>185>>186
ありがとうございます。重ね重ねすいません;;
if (str.substr(pos, pos2 - pos - 1) != "00:00:00") の部分がよくわからなくて
6番目の数字が00:00:00場合読み込まないようにするのではなく一つ増えて00:00:00:00の場合に読み込まないようにするには
どのように変更したらいいのでしょうか・・
実際11番目の数字(6.44や9.88など桁数は変らず)を表示させるときは6番目の数字が00:00:00:00以外のとき(00:00:00:45や00:00:05:35など)でこちらも桁数については変りません。
190:デフォルトの名無しさん
08/11/04 20:33:23
>>189
今回のプログラムは00:00:00の桁数については決め打ちしていませんので
"00:00:00"を"00:00:00:00"に変更すればいいです。
191:デフォルトの名無しさん
08/11/04 20:56:52
>>190
わざわざありがとうございます;;どうやら勘違いしていたようでした。
実際の00:00:00:00のテキストのほうではコンマごとにわかりやすいように半角スペースがついており
半角スペース5列数字、半角スペース1列数字、半角スペース1列数字、半角スペース3列数字・・・
などのように書かれており上記のプログラムで半角スペースも認識されるため正しい数字が出せていないようでした。
(半角スペースを全部埋めていった場合正しい数字がでました。)
半角スペースを含んだ上で数値を出したいのですがこういう場合どのようにすればいいのでしょうか。
192:デフォルトの名無しさん
08/11/04 21:03:36
>>191
これ以上後出し条件はやめてください。
どこかのロダにそのテキストをうpしていただけませんか。
193:デフォルトの名無しさん
08/11/04 21:06:59
つーかもうC++Builderの話題じゃなくなってるし
TStringsListのバージョンは古くて使えないしだから
C++相談室にでも書いてみたら?
194:デフォルトの名無しさん
08/11/04 21:08:06
まぁ・・・ね
あなた専用のサポートスレではないんですよって感じですかね
195:デフォルトの名無しさん
08/11/04 21:13:55
例えサポートスレだとしてもこんな感じで次々に条件を変えられたら
イラッと来ると思うけどね
196:デフォルトの名無しさん
08/11/04 21:18:54
おれは、CSV文字列1行を
TStringListに分解する関数を作って使ってる。
この関数1個あれば、CSVを全然意識せずに文字列として扱える。
197:デフォルトの名無しさん
08/11/04 21:25:44
全然関係ない話だけど俺はBCB3から2009まで買ってきたなあ
最初の頃は全然使い方が分からなくて、その頃に丁度Delphi6
のフリー版が出たので、Delphi本をBCBに翻訳しながら打ち込んで
動かす事で覚えたっけ。
お陰様でBCB6からは自由自在に使えるようになった。参考書も
BCB用が皆無の頃でDelphi本を買って参考にしたっけ。
198:デフォルトの名無しさん
08/11/04 21:31:37
せっかく教えて頂いたのに重ね重ね申し訳ありませんでした・・・;;
次からはもう少し慎重に確認していくように注意します。
ここから先は自己解決していきたいと思います。
何度も教えていただきありがとうございました!!
199:デフォルトの名無しさん
08/11/04 21:32:21
VCLがObject Pascalで書かれているのでそれをC++で動かすために
少しの言語拡張とC++のクラスの柔軟性とマクロの多用で対応して
いるが、今見ても頭がおかしい人が設計したんじゃないかと思う事がある
200:デフォルトの名無しさん
08/11/05 09:16:56
>>196
CommaTextというプロパティがあってね・・・
1例だけ特殊対応しなければいけないけど大抵はこのプロパティだけで大丈夫だな
201:デフォルトの名無しさん
08/11/05 12:43:08
CommaTextでは正しく解釈できない場合があるし
CSVの記述が正確ではない場合
悲惨な結果をもたらすことになる。
趣味なら笑って済ますことも出来るだろうが
業務用プログラムでは、
とてもじゃないが、CommaTextは使えない。
202:デフォルトの名無しさん
08/11/05 13:39:21
>>200
それスペースまで区切りとみなしちゃうだろ?
""で囲ってあればいいけどそうでないのってどうしてる?
203:デフォルトの名無しさん
08/11/05 13:41:32
CSVのラインを解釈してバラして保持するクラスを自作すれば無問題。
その後、TStringList系は使いまくってるけど。
204:203
08/11/05 13:42:27
さらにそのCSVの1ラインを解釈して保持するクラスに、TStringListとの入出力を持たせればおk。
205:デフォルトの名無しさん
08/11/05 13:49:10
正しく解釈出来ないのが"で括られてない項目のスペースだな
>>201CSVの記述が正確では無かったら何やっても悲惨になるんだがw
俺はStringListに分解したあとにチェック入れてる
206:デフォルトの名無しさん
08/11/05 13:57:34
TStringListのDelimiterとDelimitedTextってC++Builder5にないけど
これって6から?
207:デフォルトの名無しさん
08/11/05 13:59:24
>>206
そう
俺はBCB6から本格的にBCBを使い出したからBCB5以前の
奴とは話が時々合わず苦労する
208:デフォルトの名無しさん
08/11/05 14:01:56
5から6へのバージョンうpは安定してるし、
Indy増えるし、やっぱそれに関しては無条件バージョンうpじゃね?
6から200Xへはやったことないガクブル
209:デフォルトの名無しさん
08/11/05 14:24:24
2009使ってるけどこれどう見ても2006や2007と大差ないんだけど
Delphi + BCB で3万円が妥当な価格だと思う
エンバカは高く設定し過ぎ
210:デフォルトの名無しさん
08/11/05 16:24:57
バカだから仕方ない
211:デフォルトの名無しさん
08/11/09 20:51:23
2009出たけど配布用の仕組みって入ってる?JavaWebStartみたいな。
業務アプリはネイティブで作ると楽だけど配布がウザすぎてWebにしたくなる。
212:デフォルトの名無しさん
08/11/11 17:24:47
VCLのラジオボタンをCLXのラジオボタンと同じ動きにする方法ってありませんか?
CLXアプリをVCLアプリに書き換えてるんですが、CLXのラジオボタンがスペーキーを押すまでチェックされないみたいなので…
環境はCLX→6.0 VCL→2007です
213:デフォルトの名無しさん
08/11/11 19:38:51
>>210
バカに貢俺らって、バカ馬鹿だな
214:デフォルトの名無しさん
08/11/11 20:12:42
だがそれがいい
215:デフォルトの名無しさん
08/11/16 15:27:45
A1とA2にはTStringlistで500行の数字の配列が格納されています。
そのA1とA2の配列の計算をしたいのですが
AnsiString k1;
for(int j=0;j<500;j++){
k1 = A1->Strings[j] + A2->Strings[j];
Memo1->Lines->Add(k1);
}
こんな形でやってみたところA1とA2の同じ行が足し算されず
メモにはA1とA2の同じ行の数字が並んで表示されているだけなの
ですがこれでは配列の足し算はできていないのでしょうか?
どなたかよければアドバイスお願いします。
216:デフォルトの名無しさん
08/11/16 15:34:11
足し算できてる。文字列の足し算が。
C++のデータには「型」があるんよ。数値とか文字とか。
StrToIntとかで数値に変換してから足せ。
217:デフォルトの名無しさん
08/11/16 16:13:42
返信ありがとうございます。
型で変換してみたのですが少数を含んだ数値の配列で
strtodで
AnsiString k1;
for(int j=0;j<500;j++){
k1 = strtod(A1->Strings[j]) + strtod(A2->Strings[j]);
Memo1->Lines->Add(k1);
}
と書いたときTStringlistに格納しているものなので、AnsiStringに一致するものが見つからないと出て
しまいます。どのような変換で書いていけばよいのでしょうか
各配列の数値は 197.543545 や54.47673423のような数値の500個の配列です。
218:デフォルトの名無しさん
08/11/16 16:46:25
A1->Strings[i].ToStrInt()
219:デフォルトの名無しさん
08/11/16 16:48:05
ちごた
A1->Strings[j].ToDouble()
220:デフォルトの名無しさん
08/11/16 16:59:45
AnsiStringで受け取る必要ないのぜ。
221:デフォルトの名無しさん
08/11/16 17:04:48
>>219
ありがとうございます。
うまく変換して計算することができました。
222:デフォルトの名無しさん
08/11/16 17:24:36
2007/2009はAnsiStringTでヘルプ探さないと見つからないな
223:デフォルトの名無しさん
08/11/17 15:37:38
WINDOWS95で動くのはどのバージョンまでですか?
224:デフォルトの名無しさん
08/11/17 16:26:55
とりあえず、BCB6は動く。
225:デフォルトの名無しさん
08/11/17 16:45:24
BCB6はとりあえず動くね。
226:デフォルトの名無しさん
08/11/17 16:57:01
ただ、ヘルプ周りはWindows2000以降じゃないと‥‥
227:デフォルトの名無しさん
08/11/17 17:07:16
逆に、ヘルプ周りはWindows2000以降じゃないとアレ
228:デフォルトの名無しさん
08/11/18 02:53:53
VistaにTurbo C++ Explorerをインストールしましたが、起動時に以下のエラーが表示されて起動できません。
どのようにすれば良いのでしょうか。
モジュール 'rtl100.bpl' のアドレス 51F515BE でアドレス 00000008 に対する読み込み違反がおきました。
EPackageRegistrationException がモジュール coreide100.bpl の 000DCB21 で発生しました。
登録プロシージャ Cppproject.IDERegister (パッケージ c:\program files\borland\bds\4.0\Bin\bcdide100.pbl) が例外クラス EOleSysError を生成しました: クラスが登録されていません, ClassID: {F8FEDD39-E3CE-4B8D-A657-9CA24686881F}.
モジュール 'coreide100.bpl' のアドレス 20BA0DAF でアドレス 00000004 に対する読み込み違反がおきました。
モジュール 'designide100.bpl' のアドレス 20EE71DE でアドレス 00000000 に対する読み込み違反がおきました。
Borland® Developer Studio for Windows は動作を停止しました
問題が発生したため、プログラムが正しく動作しなくなりました。このプログラムを閉じてください。
229:デフォルトの名無しさん
08/11/18 14:04:08
Resolving the EPackageRegistrationException error in BDS 2006 on Windows Vista
URLリンク(support.codegear.com)
230:デフォルトの名無しさん
08/11/18 22:52:25
レスありがとうございます。
教えて頂いたリンク先にあった内容や、
URLリンク(support.codegear.com)にあった内容を試したのですが、全く状況に変化が見られませんでした…
どうも無理そうなので、とりあえずVista正式対応を待つことにします。
231:デフォルトの名無しさん
08/11/18 23:08:46
素直に2007か2009を買うしかないね。Turbo Explorer?正式対応?残念ながら無理でしょ…。
232:デフォルトの名無しさん
08/11/25 13:49:41
TBitmapからTIconのハンドルを取得する方法を教えてください
233:何をしたいのかを具体的に書けば有効な回答が得られるのでは?
08/11/25 22:38:53
できますん。
234:デフォルトの名無しさん
08/12/03 11:42:25
ShowHint=trueにするとコントロールにカーソルがくると自動でヒントが表示されますが
指定コントロールのヒントを手動で表示される方法を教えてください
235:デフォルトの名無しさん
08/12/03 22:57:47
そのコントロールにCM_HINTSHOWをPerformすればいいみたいだけど、パラメータが問題かな?
236:デフォルトの名無しさん
08/12/04 10:40:48
>>235
なるほど。
まずはちょっと試してみますありがとう
237:デフォルトの名無しさん
08/12/04 22:47:38
Turbo C++ ExploerのdbExpressって、リモートでFirebird2.x接続は無理?
ローカルはOK、リモートでもコネクションは繋がってテーブル名は見える。
が、テーブルを開こうとするとエラー65535がでて繋がらない。
238:デフォルトの名無しさん
08/12/08 17:23:25
メモ1に
0
0
0
0
1
1
0
0
1
1
・
・
・
1
1
0
0
0
とこのような感じで0と1が何千行と出されているのですがメモの上から順番にforで回して
1が出た場合その行数とそこから1がどれだけ続いたかカウントしていくプログラムを作成したいのですが
どういったようにつくっていけばよいのでしょうか?
239:デフォルトの名無しさん
08/12/08 17:26:46
普通に作れば良いと思うのだが、
先ず何が問題?
・C++文法
・ファイル操作
・ロジックの書き方
240:デフォルトの名無しさん
08/12/08 17:34:38
>>238
それってMemoでなくても配列の中に1がいくつ続いているかを
数えるのと同じ問題だよね
241:デフォルトの名無しさん
08/12/08 18:05:48
>>239-240
お前等が馬鹿すぎてワロタ
知らないならレスするなよクズ共
>>238は普通にTMemoでどうやって書くかを聞いてんだろw
Memo->Lines->Count
Memo->Lines->Strings[i]
242:デフォルトの名無しさん
08/12/08 18:10:12
>>241
??
243:デフォルトの名無しさん
08/12/08 18:12:35
ここはクズのすくつでつねw
244:デフォルトの名無しさん
08/12/08 18:18:49
クズって言う奴はクズじゃないんだよ
245:デフォルトの名無しさん
08/12/08 22:00:28
>>238 は
何がわからないのかを書いていない。
基本的に質問の仕方を知らない。
きっと何がわからないのかさえわからないのだろう。
そんな人は、たぶん論理的に組み上げていく
プログラミングということはムリなのではないかと思う。
丸投げで全部教えてもらいたかったら
C/C++の宿題を片付けます 119代目
スレリンク(tech板)
こっちで聞くべき
246:デフォルトの名無しさん
08/12/09 10:29:15
>>245
答え方がわからないならレスしないで下さい。ウザイだけです。
247:デフォルトの名無しさん
08/12/09 11:07:58
>>246
おいばかやめろ
Win32APIスレから出てこないでください
248:デフォルトの名無しさん
08/12/09 15:57:06
ここにまで屑が侵食してきたか・・・
249:デフォルトの名無しさん
08/12/09 23:48:23
>>238
今C++Builder動く環境にないので疑似コードで。
変数start_posに-1を代入。(-1は「カウントしてない」というマーキング)
変数iを使って、メモ1の最初から最後までループを回す。{
start_posの値が-1で、{
メモ1の行iの内容が"1"なら、{
start_posにiの値を代入。
}
}
そうじゃなくて、{
メモ1の行iの内容が"0"なら、{
start_posの値が"1"の開始位置を指しているので、これを表示。
そして(i-start_pos)の計算結果が"1"の続いた個数なので、これも表示。
次のカウントのために、start_posに-1を代入する。
}
}
}
連続したデータを処理するときはいろんなやり方があるけど、
・データの変わり目に注目する。("1"の始まりと、"1"の終わり="0"の始まり)
・変わり目でプログラムで行う処理を切り替える。(カウント中と、結果表示&カウント終了)
とするのが一つの方法。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5404日前に更新/123 KB
担当:undef