- 1 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 16:30:32 ]
- C++Builderに関する質問・回答や議論等を行う相談室スレッド。
※2008/07よりCodeGear(Borland IDE/DB部門)はBorlandからEmbarcaderoに移動しました 【前スレ】 C++Builder相談室 Part18 pc11.2ch.net/test/read.cgi/tech/1188607282/ 過去スレ・関連サイトは>>2-7あたり。 ※Borland C++ Compiler 5.5.1についての質問は以下のスレへ タダで使えるBorland C++ Part5 pc11.2ch.net/test/read.cgi/tech/1135127048/ ※BDS(Borland Developer Studio)の総合スレはこちら Borland Developer Studio 2006 No.13 pc11.2ch.net/test/read.cgi/tech/1175861395/ ※CodeGear(Borland/Embarcadero)関連はこちら 【CodeGear】Embarcaderoオッチャ その10 pc11.2ch.net/test/read.cgi/tech/1216250111/ <関連スレ> くだすれC++Builder(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1171219191/ [Tips]Borland C++Builder ちょいテク No.01 pc11.2ch.net/test/read.cgi/tech/1154580209/ 【Delphi】 Indyコンポーネント 【C++Builder】 pc8.2ch.net/test/read.cgi/tech/1093654251/
- 101 名前:貧乏学生 [2008/09/30(火) 20:38:00 ]
- >>100
そうです。お教えください。よろしくお願いします。
- 102 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:39:30 ]
- 貧乏な学生達はD&Dのことをスクロールダウンというのか・・・
- 103 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:48:38 ]
- どこの国からの留学生だヨ。
- 104 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:20:09 ]
- >>101
DragAcceptFiles を使う。 あとは DragQueryFile 辺りを調べてみて。
- 105 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 03:17:36 ]
- コンポなかったっけ?まあ、APIでやったほうがパッケージ管理の必要ないから楽だけど。
>>102 D&Dっていったらダンジョンズ・アンド・ドラゴンズだろ
- 106 名前:デフォルトの名無しさん [2008/10/01(水) 08:27:09 ]
- アイコンにファイルをドラッグ&ドロップしたら
アプリが起動するって どういう仕組みになってるんだろ?
- 107 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 08:41:02 ]
- >>106
それをやるのが OS の GUI。
- 108 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 09:47:12 ]
- >>106
コマンドラインパラメータにドラッグ&ドロップされたファイル名が入ってくるから, _argv[]とかParamStr()で取れるよ...って,そういう話じゃないのかな?
- 109 名前:デフォルトの名無しさん [2008/10/01(水) 11:32:30 ]
- C++B 2009のトライアル版を使っています。
各コンポーネントのCaption表示をリソース管理でローカライズすることは 出来たのですが、動的に表示を変える場合に用意した文字列を、リソース管理 でのローカライズ方法が分かりません。どなたか御教授下さい。 ちなみに、Caption表示等のリソースファイル(dfm, rc)とは別に文字列を定義 するファイルを作らないといけないんですかね?
- 110 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 12:09:25 ]
- EXEといっしょにリソース入れるなら分けた意味ないだろ。
入れ替えたいなら、普通DLLでリソース持つわな。
- 111 名前:デフォルトの名無しさん [2008/10/01(水) 13:38:11 ]
- DLLですか・・・。
C++Bのエディットで表示したソース上で日本語以外のワイド文字が 入力出来ないみたいなんで、入力が出来るトランスレーションエディ タで一緒に編集できる方法があればと思ったのですが。
- 112 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 14:05:49 ]
- 簡単に編集したかったら
>>109 のように独自定義ファイル作って、実行時に読み込んで割り付けると楽だと思うが。 別にリソースでわざわざ持たせなくてもいいんだろ?
- 113 名前:106 [2008/10/01(水) 15:21:24 ]
- >>108
そういうことダス。 ベリベリサンキュ。
- 114 名前:デフォルトの名無しさん [2008/10/01(水) 15:26:33 ]
- そうですね。
独自定義ファイルやDLLを作成するにしても外部ファイルが増 えてしまうので、出来れば増やしたくないってのがありますが 結局リソースファイル作る時点で増えるんで、独自定義ファイル でまとめたほうが楽ですね。
- 115 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 15:32:12 ]
- そうそう、独自定義ファイルをUTF-8で作っておいたら無問題。
それと編集しやすいファイル記述形式は、 >AAA=menu click みたいな1行単位。 これだと、TStringListにロードさせたあとは、Valuesで取れるし、 テキトーにファイルにコメント書いても悪影響ないし、 それとか、いざ、Win以外の開発が発生してもロードクラスを簡単に作れる。
- 116 名前:115 mailto:sage [2008/10/01(水) 15:35:45 ]
- さらに自分の場合、
>Form1="送信フォーム" >Form1.Label1="送信設定" >Form1.Button1="送信" みたいにしといて、 TStringListを渡しておいたら、 勝手にフォームのコントロールを検索してのキャプション書き換える クラス作ちゃったw 注意点は、メモ帳でファイル書き換えても自分の直した行しか変わらず問題ないが、 ワードパッドとかで書きかえるとファイル保存するときにUNICODE勝手にいじられちゃう。
- 117 名前:115 mailto:sage [2008/10/01(水) 15:40:46 ]
- ついでにヒントを書いておくと、
・ファイルロードするTStringListクラスを保持したLangListクラス ・ロードしたものでコントロールのキャプション書き換えるクラス は別々にしておいた方が良い。 なぜかというと、ロードしたクラスのみを使う場合があります。 例) throw Exception(LangList.ValuesAnsi("MSG.CannotCreateFile") + SDestFile); (LangListからUTF8でとるときは、LangList.ValuesUtf8("MSG.CannotCreateFile")とか書く)
- 118 名前:デフォルトの名無しさん [2008/10/01(水) 15:55:30 ]
- 109です。
>>115 似たようなことをやっていたのですが、 自分の場合リストからロードする時にValue使わずに、 わざわざ文字列比較して引っかけてたんで、すごく 参考になります。 わざわざ、独自定義ファイルの作り方を教えて下さって ありがとうございます!!
- 119 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ]
- このあいだのデベロッパーキャンプで高橋さんが.pasファイルにresourcestringを書いといて
リンクすればいい、ってのをやってた希ガス。標準的な手法があるなら独自にやるのは無駄では? ttp://dn.codegear.com/jp/article/38706 これのB3かな?あとは ttp://dybdahl.dk/dxgettext/ こゆのとか。
- 120 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:26:23 ]
- なるほど。それはいいことを聞いた。
で、ヘルプの「アプリケーションのローカライズ」で検索したらなんか出てきたよ。 今勉強中。
- 121 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:35:37 ]
- AnsiStringで文字列末に\0を二つ追加したいのですが、
AnsiString str; str += "\0\0"; ではだめそうでした。char* に変換するのも面倒で、 なんかいい方法無いでしょうか。
- 122 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/10/03(金) 15:45:35 ]
- >>122-123 おお、cat_printfなんてものがあるんですね、
ありがとうございました! 使うところはもちろんSHFileOperationなのでした。
- 125 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 14:57:15 ]
- >>125
リリースノートによると、画像処理のパッケージがVCLJPGからVCLIMGに代わったからその影響みたい。 ttps://forums.codegear.com/thread.jspa?messageID=17336䎸 その、VCLIMGパッケージがリンクできていないようだから、どこか適当なソースに、 #pragma link "vclimg.lib"か#pragma link "vclimg.bpi"を追加すれば出来た。
- 127 名前:125 mailto:sage [2008/10/07(火) 22:40:45 ]
- >>126
さんきゅ 動いたよ! 今後の事考えると面倒なんで、Pnglang.hppに#pragma link "vclimg.lib"書き加えたw
- 128 名前:デフォルトの名無しさん [2008/10/09(木) 22:29:52 ]
- フォームにパネルを均等に配置してるのですが、
最大化した時に、フォームのサイズに合わせて配置したパネルも一緒に拡大する方法を教えてください オブジェクトインスペクタの設定でできますか?
- 129 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 23:41:18 ]
- >128
Anchors
- 130 名前:デフォルトの名無しさん [2008/10/10(金) 20:41:01 ]
- データダイアグラムの使い方がよくわかりません
誰か教えて
- 131 名前:デフォルトの名無しさん [2008/10/11(土) 01:36:14 ]
- >>129
アンカーでどうやって均等配置できるんですか?? LeftとRightをtrueですか? そうしたらLeftの位置は変わらないからRightが伸びてパネルがかぶるし・・・ どうすればいいんでしょうか?
- 132 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 12:25:15 ]
- >>131
どういう状態にしたいかがよく分からんが、新しくPanelを作ってBevelOuter をbvNoneにし、その上に今のPanelを置いてAnchorsを変えればいいんじゃない?
- 133 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 18:54:02 ]
- >>128
OnResizeイベントでダメなん?
- 134 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/10/12(日) 14:09:50 ]
- >>135
それが普通かどうかはわかりませんが オブジェクトインスペクタで設計時にやる方法があるのかなって思ってききました できないならやはりResizeで自分で計算するしかないですよね
- 137 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 15:38:01 ]
- >136
OnResizeで全部自前計算でFA。
- 138 名前:132 mailto:sage [2008/10/12(日) 21:32:48 ]
- >>134
ん〜...... 色々試してみたが、今の所できんかった。 こういうのって半分パズルだよなぁ...... できない事はないのかもしれんが、オレはちょっとできんかった。
- 139 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:40:16 ]
- >>134
へたにフォームのプロパティでぐちゃぐちゃやるより、手で書いた方が良いと思う。
- 140 名前:デフォルトの名無しさん [2008/10/13(月) 12:33:23 ]
- >>137
やっぱそれでFAですかね。 >>138 何か出来そうな気はするんですよね。でもたぶんできないっぽいような >>139 アンカーとかである程度はできるから簡単にできるのなっておもいまして とりあえずResizeでFindComponentでパネル取ってやりまーす エロい人達ありがとう
- 141 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:24:22 ]
- >>140
>134の状態だと、例えば1ピクセルだけフォームを広げてみた場合、パネルと隙間の増分ピクセル数が 小数になっちゃう Anchorとかのプロパティでは、フォームのリサイズのピクセル数がそのまま各コントロールに影響するの で、根本的に無理があるね
- 142 名前:デフォルトの名無しさん [2008/10/17(金) 17:47:42 ]
- C++Builder6のIDEで質問があります。
ソース内の関数使用箇所から実装部へジャンプする操作(マウス・キーコンビネーションなど) はないのでしょうか。 MyFunc(); をクリックか何かして void MyFunc(void) { ... } へジャンプするみたいな感じです。あちこちで調べたんですが、どうしてもわかりません。
- 143 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:22:16 ]
- >>142
右クリック→定義の検索、ではだめなん?
- 144 名前:デフォルトの名無しさん [2008/10/17(金) 22:37:16 ]
- 142です。
右クリック->定義の検索 だと宣言部(.hの方)にジャンプしますよね? .cppの方を見たいのです。人の作ったソースを追っかける時にこの機能が無いと不便で仕方ないんです… それとも何か条件で.hに行ったり.cppに行ったりするのかな? VC++だと一度ビルドしてクラス情報を生成しないとダメ、みたいなのがあるけど、BCBにもあるんですかね? 一応このプロジェクトはビルドしてEXE作ってるけど…
- 145 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 23:54:34 ]
- .hに飛ぶのは、.cppの方がすでにビルドされていてバイナリになって
不可視になってる事があるからじゃない? 例えば配布されているライブラリとかそうじゃん。 .cppはいつもCtrl+Fで検索してるけど。
- 146 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 10:07:29 ]
- test
- 147 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 16:15:58 ]
- 2007でエディタにアウトラインっぽいのがありますがこれOFFにできますか?
- 148 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:19:58 ]
- できない
- 149 名前:デフォルトの名無しさん [2008/10/23(木) 11:56:54 ]
- Memo1に60行の乱数を出したんですけど、この60行の配列の平均を取った数字を
Edit1に出したいのですがなかなかどうすればいいんでしょうか・・ どなたかアドバイスお願いします。
- 150 名前:デフォルトの名無しさん [2008/10/23(木) 13:19:28 ]
- ヒント
Lines->Strings StrToInt
- 151 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/10/23(木) 16:01:04 ]
- 》150》151》152 ありがとうございました!おかげさまでなんとかつくり終えることができました
- 154 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:03:10 ]
- そういう安価のつけかたもあんか
いや、あるんか
- 155 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:14:07 ]
- >>153, >>154
さすがにコンパイルエラーになったけど, 150 >> 151 >> 152; ならコンパイル通ったw
- 156 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:18:52 ]
- そう言えばC++Builderの<<、>>演算子のキモい使い方があったような
何に使うんだっけ? 確かビットを立てたり外したりするのに使った記憶が
- 157 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:27:23 ]
- 集合型のエミュレーションだね
Set型
- 158 名前:155 mailto:sage [2008/10/23(木) 16:29:41 ]
- >>156
ヲイヲイ,<< と >> はCの時代からビットシフト演算子だよ。C++になってから >> cout とか別の使い方で 定義されるようになった。>>155だってビットシフトの意味があるからコンパイルが通るだと思う。 150数ビットもシフトしてどうすんの?...なんだけどw
- 159 名前:155 mailto:sage [2008/10/23(木) 16:30:30 ]
- あぁ,スマソ。そっちの話か。
- 160 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:34:11 ]
- >>157
ああ、それだ。滅多に使わないから忘れかけてた。 Delphiならスマートに書けるのだがC++Builderならムリヤリ感が。 >>158 まあそういう事だ。
- 161 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:44:00 ]
- >>160
普段はオブジェクトインスペクタからいじっちゃうからね コードでいじる場合はどうしてもヘルプ頼りに
- 162 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:52:42 ]
- そういやオープン配列もだいぶ無茶してたよなあ
TVarRecとか カッコを二重に書かなければならないのを時々忘れる
- 163 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:54:48 ]
- オープン配列は大抵Formatに使うことが多いから、Format使わずにAnsiString::sprintf()でやってるな
- 164 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん [2008/10/30(木) 16:49:46 ]
- ブタ共さっさと教えてください
- 166 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 16:53:58 ]
- Indyでやるだろ、jk。
- 167 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 16:58:20 ]
- 最近の子はマニュアル読んでとりあえずできるかテストしてみようって事しないんだな
- 168 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:02:53 ]
- Indyならフォームにペタっと貼るだけ。
- 169 名前:デフォルトの名無しさん [2008/10/30(木) 18:41:08 ]
- 知らないならレスしないで下さいよ。ウザくてかなわん
- 170 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:02:18 ]
- その程度ができないのになんでプログラムなんて書いてるの?バカなの?
- 171 名前:デフォルトの名無しさん [2008/10/31(金) 15:32:06 ]
- アイコン化されたフォームを元に戻す方法を教えてブタ共よ
- 172 名前:デフォルトの名無しさん [2008/10/31(金) 15:37:40 ]
- Application->Restoreでできたわ
ほんとお前らって何の役にも立たないブタだよな・・・
- 173 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 16:27:08 ]
- 役に立たないブタはageます
- 174 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 00:31:47 ]
- 自力でできたということは、自力でやらせようとした人間達の狙いは大成功したということで、
役に立たないどころかすべてが計算通りに進んだということですw
- 175 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:44:28 ]
- AnsiString as;使ってなくね
いらないけどさ
- 180 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:46:46 ]
- >>179
ごめんそうです 削ってくらはい
- 181 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:56:09 ]
- >>177>>178
ありがとうございます! csv形式のテキストはオープンダイアログから読み込みその中から抽出することはできるのでしょうか また先ほどの文で DelimiterとDelimitedTextはTStringListのメンバーではないと言われるのですが 何か宣言文などが必要なのでしょうか。 まだまだ初心者でして;いろいろご迷惑かけてすいません。
- 182 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:17:26 ]
- >>181
>csv形式のテキストはオープンダイアログから読み込みその中から抽出することはできるのでしょうか できます。 TOpenDialog->Filesに入ります。 >DelimiterとDelimitedTextはTStringListのメンバーではないと言われるのですが >何か宣言文などが必要なのでしょうか。 えっもしかしてC++Builderのバージョンは5以前ですか?
- 183 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:29:47 ]
- >>183
返事が遅れてすいません。ありがとうございました!大変感謝しています こちらのやり方で動きました。c++builderはver5を使っています あと桁数をコンマの数をかえるとのことなのですが、 桁数を変える場合は5桁表示するならpos 5 にすればよいことはいじっていてわかったのですが コンマの位置を変える場合どの部分を変えていけばよいのでしょうか・・・ よろしければアドバイスお願いします>< 実際の応用テキストではさらに数字が多く6番目数字(コンマ5つ目)が00:00:00(桁数は変化しない)以外の時に 11番目(コンマ10個目)の数字を表示するようにしたいのです。実際に表示したい数字も小数点を含む5.55(桁数は変化しない)などです。
- 185 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:21:50 ]
- public:
__property AnsiString Cells [int rows] [int cols]= {read=GetCell, write=SetCell}; こんなメンバ持たせたCSVクラス作って使ってるなぁ
- 188 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:29:44 ]
- >>187
BCBはDelphiとのインターフェースが割合簡単に取れるから、 Delphiで書かれたcsvパッケージでも入れたら楽でしょうね。
- 189 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:33:23 ]
- >>189
今回のプログラムは00:00:00の桁数については決め打ちしていませんので "00:00:00"を"00:00:00:00"に変更すればいいです。
- 191 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:56:52 ]
- >>190
わざわざありがとうございます;;どうやら勘違いしていたようでした。 実際の00:00:00:00のテキストのほうではコンマごとにわかりやすいように半角スペースがついており 半角スペース5列数字、半角スペース1列数字、半角スペース1列数字、半角スペース3列数字・・・ などのように書かれており上記のプログラムで半角スペースも認識されるため正しい数字が出せていないようでした。 (半角スペースを全部埋めていった場合正しい数字がでました。) 半角スペースを含んだ上で数値を出したいのですがこういう場合どのようにすればいいのでしょうか。
- 192 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:03:36 ]
- >>191
これ以上後出し条件はやめてください。 どこかのロダにそのテキストをうpしていただけませんか。
- 193 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:06:59 ]
- つーかもうC++Builderの話題じゃなくなってるし
TStringsListのバージョンは古くて使えないしだから C++相談室にでも書いてみたら?
- 194 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:08:06 ]
- まぁ・・・ね
あなた専用のサポートスレではないんですよって感じですかね
- 195 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:13:55 ]
- 例えサポートスレだとしてもこんな感じで次々に条件を変えられたら
イラッと来ると思うけどね
- 196 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:18:54 ]
- おれは、CSV文字列1行を
TStringListに分解する関数を作って使ってる。 この関数1個あれば、CSVを全然意識せずに文字列として扱える。
- 197 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:25:44 ]
- 全然関係ない話だけど俺はBCB3から2009まで買ってきたなあ
最初の頃は全然使い方が分からなくて、その頃に丁度Delphi6 のフリー版が出たので、Delphi本をBCBに翻訳しながら打ち込んで 動かす事で覚えたっけ。 お陰様でBCB6からは自由自在に使えるようになった。参考書も BCB用が皆無の頃でDelphi本を買って参考にしたっけ。
- 198 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:31:37 ]
- せっかく教えて頂いたのに重ね重ね申し訳ありませんでした・・・;;
次からはもう少し慎重に確認していくように注意します。 ここから先は自己解決していきたいと思います。 何度も教えていただきありがとうございました!!
- 199 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 21:32:21 ]
- VCLがObject Pascalで書かれているのでそれをC++で動かすために
少しの言語拡張とC++のクラスの柔軟性とマクロの多用で対応して いるが、今見ても頭がおかしい人が設計したんじゃないかと思う事がある
- 200 名前:デフォルトの名無しさん [2008/11/05(水) 09:16:56 ]
- >>196
CommaTextというプロパティがあってね・・・ 1例だけ特殊対応しなければいけないけど大抵はこのプロパティだけで大丈夫だな
- 201 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:43:08 ]
- CommaTextでは正しく解釈できない場合があるし
CSVの記述が正確ではない場合 悲惨な結果をもたらすことになる。 趣味なら笑って済ますことも出来るだろうが 業務用プログラムでは、 とてもじゃないが、CommaTextは使えない。
|

|