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
784 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 15:16:55 ] >>782 はい、falseでした。 一度動くようになると、PCを再起動してもtrueですね・・・。 なぜでしょう? >>783 汚い書き方ですが、 OpenDialog1->FileName = OpenDialog1->InitialDir; をExecute()の前に置いたら動作しました。 Execute()で最初に開くフォルダはFileNameのフォルダで、InitialDirでは無いってことでよろしいでしょうか?
785 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 17:13:51 ] さっさと教えてくださいよ。グズは嫌いですよ。 こっちも忙しいんだから早くして下さいね。
786 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 23:57:41 ] >>784 >一度動くようになると パスが通ってるから。 想定される状況で通るように場合分けしたら? フォルダを開くという概念がどうもね。
787 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 17:01:27 ] ShowMessage()で表示したメッセージを 指定時間後に自動的に閉じることって可能でしょうか? 可能であればどうすればいいのでしょうか?
788 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 17:24:43 ] 根性
789 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 17:47:09 ] >>787 TSplashForm
790 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:35:09 ] タイマーで閉じればいいじゃん。
791 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:16:07 ] タイマーイベントを設定して Close(); Release(); で閉じれるね
792 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:51:27 ] Delphi/C++Builderにはスプラッシュウィンドウが用意されてなかったっけ?
793 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 04:17:33 ] VC++には昔っからあるのにね。 ってか、大麻付きダイアログを作ればいいだけだけど。
794 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 04:38:46 ] 面倒くさい。とか言ってる奴がBCB使うわけで。
795 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 09:41:38 ] あるある
796 名前:デフォルトの名無しさん [2008/11/10(月) 16:04:46 ] for (int I = 1; I <=9 ; I++){ pass = ID +"0"+IntToStr(I); fp = fopen(pass.c_str(), "rb" ); fread(data,2,10,fp); fclose(fp); } と途中まで作ったのですが、この9個の読み込んだ配列データ(data)を9個別々に A1〜A9(AnsiString)で格納したいのですがやりかたがわからないのでアドバイスください。 A1にはID01の読み込んだ配列データ・・・A9にはID09の配列データです。
797 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 16:16:55 ] AnsiStringの配列じゃダメなのか?
798 名前:796 [2008/11/10(月) 16:25:20 ] >>797 AnsiStringでいいです。別のところでそれぞれの配列を使って計算したいので。。 どういう風に書けば9個格納できるでしょうか。
799 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 16:36:03 ] AnsiStringの配列でいいじゃないかw
800 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 16:46:49 ] 普通に配列使おうぜ? char wk[128]; AnsiString A[10]; for (int I = 1; I <=9 ; I++){ pass = ID +"0"+IntToStr(I); fp = fopen(pass.c_str(), "rb" ); fread(wk,2,10,fp); fclose(fp); A[i] = wk; }
801 名前:796 [2008/11/10(月) 17:26:07 ] >>800 うまくいきません。 Memo1->Lines->Add(A1)で確認してみたのですがうまく読み込めていませんでした。 読み込むファイルが数百行というのは関係あるのでしょうか。 A1 = 1回目に読み込んだ配列 A2 ・・・ という感じでやりたいのですが。。。 とりあえずがんばってやってみます。
802 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 17:35:33 ] >>801 んじゃさ、TStringList使えばいいんでないの? TStringList *sl = TStringList(); sl->LoadFromFile("ファイル名""); for( int i = 0; i < sl->Count; i ++ ){ aa = sl->Strings[i]; } こんな感じでどうよ?
803 名前:デフォルトの名無しさん [2008/11/10(月) 17:59:23 ] Memoに表示された20行の数字をkekkaに入れたくて AnsiString kekka; for(int I=0;I<20; I++){ kekka = Memo1->Lines->Strings[I]; } という風に試したのですがMemo1に表示させてある内容と違う値が出てしまいました。 わからないのでアドバイスください。
804 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:44:15 ] >>803 kekkaは一つしか無いでしょ。 Memo1->Lines->Stringis[I]は20個あるでしょ。 20回ループまわしてもkekkaは一つしか無いでしょ。
805 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 10:28:51 ] >>803 っていうか俺のTStringListは無視か!! それにkekkaを配列にすりゃいいって最初に言っただろう!
806 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 14:56:40 ] 頭の中だけでなんとなく考えてるんだろうなぁ・・・ それで出来るようになるのってちゃんとしたプログラムがいくつも書けるようになってからだろうに。 クラス図とかメモリマップとか妄想絵図とか、何でもいいからソースコード以外の何かで書いてみたら 自分がどこに引っかかってるのか分かるような気がする。
807 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:02:06 ] プログラミングに限らず、段取りをすっ飛ばした想像しか出来ない奴っているからな。
808 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 21:27:18 ] んだんだ。 妄想を紙に書いてみると 自分のアホさが よくわかる。
809 名前:デフォルトの名無しさん [2008/11/13(木) 10:39:08 ] 非常に今更な感があるけど出来たら教えて欲しいことが・・・ ・BCB5 ・複数のカラム追加したListViewを設置 ・上記カラムの1つはAutoSize このListViewにデータを流し込んだ時に後から発生した 縦スクロールバー分の幅が自動調整されないんだけど これを自動調整するには何がベストなんでしょうか? 今は仕方なくデータを流し込んだ後にListViewの幅を -1 >> +1として調整してます
810 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 10:58:48 ] 何で調整したいんだ? ListViewの幅か?カラムか?
811 名前:デフォルトの名無しさん [2008/11/13(木) 11:53:38 ] カラムの方 右端が発生したスクロールバーで隠れるのよ・・・
812 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 10:51:35 ] TListView::OnInsertでTListView::ClientWidth読んで調整すればいいんじゃない?
813 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 12:48:11 ] C++B 6をつかっています。 ・やりたいこと クライアントアプリ(C++B)からPostgreSQLへ接続したい。 ・やったこと 1.Windows版 Postgres8.2.6(日本語版)をインストール (インストールのさいC開発モジュールも一緒にインストールしました) 2.インストールされたlibpq.dllを使って、impdll libpq-bc.lib libpq.dll 3.できたlibpq-bc.libをアプリフォルダへコピー 4.Postgresのincludeフォルダにある、libpq-fe.hをアプリフォルダへコピー 5.プロジェクトの追加から、libpq-bc.libを追加。 6.myapp.hに #include "libpq-fe.h" 7.myapp.cppで、とりあえず接続テスト PQconnectdbを実行 コンパイルすると [リンカ エラー] 外部シンボル '_PQconnectdb' が未解決(略\APPLICATION\MYAPP.OBJ が参照) と出て、うまくいきません。 足りない操作、間違った操作をやっていたら教えてください。 お願いします。
814 名前:デフォルトの名無しさん [2008/11/17(月) 15:35:15 ] ”バリアントの型変換が不正です”って出たのですがどういうときに出るんですか?
815 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:39:13 ] バリアントの型変換が不正な時に出るんだろうよ
816 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:56:25 ] バリアントの型変換が不正な時に出るんだよ
817 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:59:29 ] バリアントの型変換が不正な時に出るんよ
818 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:00:01 ] バリアントの型変換が不正な時に出るよ
819 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:19:59 ] バリウム飲んだから白いうんこが出るんだよ
820 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:25:56 ] お前らあんまり荒らすな プログラム板がID制になってもいいのか
821 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:28:33 ] >ID制 大賛成
822 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:29:03 ] ごみん
823 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 16:46:11 ] 大貧民
824 名前:814 [2008/11/17(月) 19:14:13 ] ありがとうございます。解決しました
825 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:24:18 ] むしろID制にしてくれ
826 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:41:26 ] むしろBe強制に
827 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 10:17:08 ] むしろ実名が表示されちゃうでいいよもう
828 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 10:32:49 ] 実名が表示されたら俺が超紳士なことがバレちゃうじゃないかやめろ
829 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 10:47:53 ] んじゃ(仮名)てつけば問題ないよな
830 名前:811 [2008/11/18(火) 16:14:59 ] >>812 変化するイベントで自分で再設定すれば出来るのは知っているんですが コンポーネントのサイズ変更を行えば自動でやってくれる以上 なんとかそれを直接行えないかなと思ってるんですか・・・
831 名前:デフォルトの名無しさん [2008/11/21(金) 18:14:21 ] memo1にcsv形式で書き出したのですがコンマ区切りで2列目の配列と4列目の配列だけをCommaTextなどを使って最後まで 読み込みA1とA2にTStringlistとして格納したいのですが格納したいのですがどのようなプログラムにすればよいのでしょうか。 0001, -2.06167, -719.351, EEE 0002, -2.05553, -710.148, RRR 0003, -2.04654, -698.637, EEE 0004, -2.04326, -689.907, RRR ・ ・ ・ 1499, -2.03713, -678.463, RRR 1500, -2.03099, -667.071, RRR このような感じの配列で1500行並んでいます。
832 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:24:18 ] どういう風に格納したいんだ
833 名前:デフォルトの名無しさん [2008/11/21(金) 18:34:24 ] 2番目の列だけの格納をx 4番目の列だけの格納をyとしたときに Memo2にLoadFromfileなどでxを書き出すと -2.06167 -2.05553 -2.04654 -2.04326 ・ ・ yを書き出すと EEE RRR EEE RRR (空白の場合もあるのでそれも一行として数える) ・ ・ ・ などといった具合にxとyに格納したいのです。 TStringといいましたが格納の仕方がそれだけしかしらないので AnsiStringなどでもできるのでしたらどちらかアドバイスお願いします。
834 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:34:06 ] memo1に自分で書き出しているのなら、あとふたつTStringListを用意しておいて、memo1に各行を出力する裏で同時に書き込めばいいんじゃないの? for( int i = 0; i < 1500; i++ ){ memo1->Lines->Add( 1行分のcsv文字列 ); x->Add( 2列目の情報 ); y->Add( 4列目の情報 ); } どうしてもmemo1の内容を再利用するしかないなら項目分離用TStringListを用意して TStringList* Values; Values->Delimiter = ','; for( int i = 0; i < 1500; i++ ){ Values->DelimitedText = memo1->Lines->Strings[ i ]; x->Add( Values->Strings[ 1 ] ); //2列目の情報 y->Add( Values->Strings[ 3 ] ); //4列目の情報 }
835 名前:デフォルトの名無しさん [2008/11/23(日) 17:20:19 ] >>834 遅くなってしまってすいません、そして説明不足でした・・・。 できればMemo1の内容を再利用したいのですが、c++builderのバージョンが5なので Delimiterが使えないようなのです・・・ お手数ですがDelimitedText以外での表し方を教えていただけないでしょうか。
836 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 18:50:25 ] じゃあこんなかんじで TStringList* Values; for( int i = 0; i < 1500; i++ ){ Values->CommaText = memo1->Lines->Strings[ i ]; x->Add( Values->Strings[ 1 ].Trim() ); //2列目の情報 y->Add( Values->Strings[ 3 ].Trim() ); //4列目の情報 }
837 名前:デフォルトの名無しさん [2008/11/23(日) 19:30:27 ] >>836 返信ありがとうございます. おっしゃられたようにButton1にこのように付け加えてMemo2とMemo3に書き出すようにしたいのですが Memo1に排出されたあとボタンを押すと読み込み違反が起こってしまいます。 これは何が原因となってるんでしょうか Memo2と3に書き出すプログラムは後から付け加えたものなので それ以前のところでエラーが起こっているようです。 TStringList* Values; TStringList* x; TStringList* y; for( int i = 0; i<Memo1->Lines->Count; i++ ){ //1500行のみとは限らない場合があるため Values->CommaText = Memo1->Lines->Strings[ i ]; x->Add( Values->Strings[ 1 ].Trim() ); y->Add( Values->Strings[ 3 ].Trim() ); Memo2->Lines->AddStrings(x); Memo3->Lines->AddStrings(y); }
838 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:59 ] ちゃんと Values、x、y は new して使ってる? TStringList* Values = new TStringList; 使用後 delete Values;
839 名前:デフォルトの名無しさん [2008/11/24(月) 19:39:22 ] new TStringListは入れてませんでした。ありがとうございます。 { TStringList* Values = new TStringList; TStringList* x = new TStringList; TStringList* y = new TStringList; for( int i = 0; i<Memo1->Lines->Count; i++ ){ Values->CommaText = Memo1->Lines->Strings[ i ]; x->Add( Values->Strings[ 1 ].Trim() ); y->Add( Values->Strings[ 3 ].Trim() ); Memo2->Lines->AddStrings(x); Memo3->Lines->AddStrings(y); delete Values; delete x; delete y; } } このような形でやってみて読み込み違反は回避できたのですが、次はリストの インデックスは範囲を超えていますといわれてしまいます。 CSV形式なのですがコンマの後、数字の桁数を合わせようと半角スペースもついてしまっており それまで読み込んでいるので、それが原因だとは思うのですが.Trim()がついているので 実際何が原因なのかわからない状況です; またEEE,RRRのところは空行であるときもありその際にはスペースがつけられているのですが そこをEEE,RRRだけでなく同じ行数文だけスペースも含め格納したいのですが、これは無理でしょうか?
840 名前:デフォルトの名無しさん [2008/11/24(月) 19:53:32 ] 0001, -2.06167, -719.351, EEE 0002, -2.05553, -710.148, RRR 0003, -2.04654, -698.637, EEE 0004, -2.04326, -689.907, RRR 0005, -2.04440, -898.545, 0006, -2,03434, -434.434, EEE 0007, -2,67665, -775,443, 0008, -2.34443, -566,886, RRR ・ ・ ・ 実際このような感じのCSV形式の配列で格納したい配列は xに yに -2.06167 EEE -2.05553 RRR -2.04654 EEE -2.04326 RRR -2.04440 (空行) -2,03434 EEE -2,67665 (空行) -2.34443 RRR ・ ・ ・ ・ ・ ・ このようにTStringで格納していきたいのです。 無理難題を言ってしまいすいません。
841 名前:デフォルトの名無しさん [2008/11/24(月) 19:55:12 ] delete の位置は何度も変えてみましたが結果は同じでした。 もしよろしければアドバイスお願いします。
842 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 00:27:26 ] >>839 試行錯誤中のコードだろうけど、どうみても一度しかnewしていない変数を ループ中で何度もdeleteするのがおかしいことに気付かないとまずいよ。 Memo2にxをAddStringsするのもループを抜けてからじゃないと、 1,1,2,1,2,3,1,2,3,4,1,2,3,4,5,…みたいに行の登録が重複する。 Memo1が1500行だとMemo2、Memo3は(Σk=n(n+1)/2になるので)1125750行になってしまうよ。 それだけ大きいとTMemoコンポーネントのメモリ制限に引っかかってるんじゃないかな? てかMemo2、Memo3が最初からあるのならx、yなんて不要。直接入れればいい。 4つめがEEEでもRRRでもなく空の時にスペース三つ出力したいなら this->Memo2->Lines->Clear(); this->Memo3->Lines->Clear(); TStringList* Values = new TStringList; AnsiString asSpacer = " "; //スペース三つ for( int i = 0; i < Memo1->Lines->Count; i++ ){ Values->CommaText = Memo1->Lines->Strings[ i ]; this->Memo2->Lines->Add( Values->Strings[ 1 ].Trim() ); AnsiString as4thValue = Values->Strings[ 3 ].Trim(); this->Memo3->Lines->Add( as4thValue.IsEmpty() ? asSpacer : as4thValue ); } delete Values; あと >>840 で出ているデータが本物のデータからのコピーなら、ピリオドとカンマが 入力ミスで混ざってて、自動で正しく分離する事は無理。
843 名前:デフォルトの名無しさん [2008/11/28(金) 02:16:31 ] 32BitのBitmapへ色を塗る時、アルファチャンネルの指定はどのように行えばよろしいのでしょうか? TColorは24bit専用なのでしょうか?完全な白の時は透過になるのですが、それ以外は全く透過しません。 色によって透過度を変えたいのですが、上手くいかないのが現状です。 PixelFormatで32bitの指定はしているのですが・・・。 すいませんがよろしくお願いします。
844 名前:デフォルトの名無しさん [2008/11/28(金) 11:26:00 ] 教えてください。 BDS2006を使っています。 ファイルの数が多くなってきたので ヘッダファイルを、header1.hというファイルにまとめて #include "Main.h" #include "About.h" ・・・ という感じに記述して .cppファイルの方には、 #include header1.h と記述するようにしました。 このように変更してから、 再構築を行い、プログラムを実行し バージョン情報を表示すると、EClassNotFound TImageが見つかりませんというエラーがたまに出るようになりました。 About.cppをコンパイルし直すと正常に動作します。 他のクラスでも同じように、エラーが発生し再コンパイルすると正常になることがあります。 どうしてこのようなことが発生し、どうすれば回避できるのでしょうか。 ヘッダをまとめて1個のファイルにしてしまうのはダメなのでしょうか。
845 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 14:26:15 ] 一度プリコンパイルヘッダ消せ
846 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 15:43:04 ] いいやお前が消えろ!
847 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 15:49:08 ] ヒント:あらしはスルーwww
848 名前:デフォルトの名無しさん [2008/11/29(土) 01:55:44 ] すいません、どなたか>>843 にも答えていただけないでしょうか。
849 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 09:34:25 ] ファイルのサイズを取得したくて TSearchRecのSize変数から取ったのですが、 ファイルサイズが大きいと戻り値がマイナスになってしまいます。 大きいファイルサイズでも正確に取得するには どうすればいいのでしょうか。
850 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:20:56 ] APIのFindFirstFile、GetFileSize、GetFileSizeEx
851 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:22:52 ] もしくはバージョンうp。今はTSearchRecのSizeは__int64になってるらしいので。
852 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:33:20 ] TSearchRec.FindData.nFileSizeHigh TSearchRec.FindData.nFileSizeLow
853 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:34:58 ] あ、そうか。失礼。
854 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 17:44:27 ] >>848 これで行けるはずなんだが・・・うーんわからん void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap* bt = new Graphics::TBitmap; BLENDFUNCTION blend = {AC_SRC_OVER, 0, 100, 0}; TCanvas* ti = Image1->Canvas; RGBQUAD rgbq; bt->Width = 256; bt->Height = 256; bt->PixelFormat = pf32bit; for (int i = 0; i < 255; i++) { int* sc = reinterpret_cast<int*>(bt->ScanLine[i]); for (int j = 0; j < 255; j++) { rgbq.rgbBlue = i; rgbq.rgbGreen = j; sc[j] = reinterpret_cast<int&>(rgbq); } } BOOL RESULT = ::AlphaBlend(ti->Handle, 0, 0, Image1->Width, Image1->Height, bt->Handle, 0, 0, bt->Width, bt->Height, blend); if (RESULT == FALSE) { Application->MessageBox(L"失敗!", L"", MB_OK); } delete bt; }
855 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:35:28 ] >>843 Win32スレで聞いているうちにバグの原因がわかったので、 AlphaBlend per Pixelのプログラムを貼っておきます。 void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap* bt = new Graphics::TBitmap; BLENDFUNCTION blend = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; TImage* ti = Image1; RGBQUAD rgbq; bt->Width = 256; bt->Height = 256; bt->PixelFormat = pf32bit; int k = 0; for (int i = 0; i < 255; i++, k++) { int* sc = reinterpret_cast<int*>(bt->ScanLine[i]); for (int j = 0; j < 255; j++) { rgbq.rgbBlue = i; rgbq.rgbGreen = j; rgbq.rgbRed = 0; rgbq.rgbReserved = k; sc[j] = reinterpret_cast<int&>(rgbq); } } BOOL RESULT = ::AlphaBlend(ti->Canvas->Handle, 0, 0, ti->Width, ti->Height, bt->Canvas->Handle, 0, 0, bt->Width, bt->Height, blend); int err = GetLastError(); const wchar_t* str = WideString().sprintf(L"失敗!%d", err).c_bstr();
856 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:36:10 ] if (RESULT == FALSE) { Application->NormalizeTopMosts(); Application->MessageBox(str, L"AlphaBlend()でエラーが起きました", MB_OK); Application->RestoreTopMosts(); } delete bt; }
857 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:42:59 ] 補足ですが、rgbq.rgbReserved must be zero.とMSDNには書いて ありますが、これがまさにアルファ値そのものです。 ですからここにアルファ値をセットしてAlphaBlend()を呼び出せば、 期待通りの結果が得られます。 もちろんPixelFormatはpf32bitでなければなりません。
858 名前:843 mailto:sage [2008/11/30(日) 19:35:36 ] >>855-857 丁寧にありがとうございます。 WideStringのところでひっかかったり、AlphaBlendが見つからなかったり(wingdi.hをインクルードするだけじゃダメなのかな?)していてまだ確認できていませんが、 いろいろ調べてやってみます。 ありがとうございました。
859 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 20:26:46 ] >>858 BCB6だと、AlphaBlend()やTransparentBlt()使うときインポートライブラリ作らないといけないよ。 implib.exe msimg32.lib msimg32.dll でインポートライブラリを作り tlib.exe lib\import32.lib + msimg32.lib 上記dll内のAPIをimport32.libに追加 これでいつでもAlphaBlend()が使えるはず。(BCB5以前ならネットからAlphaBlend()の関数定義もコピって来る) >>855 は多分BCB2009にあわせてユニコード使ってるだけなので、BCB2007以前ならWideStringの代わりにAnsiString使えばいいよ。
860 名前:843 mailto:sage [2008/11/30(日) 21:16:16 ] >>859 はい、BCB6を使用しています。 CBuilder6\Lib\Psdkに同名のファイルがあるので、パスが通っていれば良いのかと思っていました。 インポートライブラリを作成したところ、動作しました。 ありがとうございます。 ところで実行結果ですが、これでよろしいのでしょうか? www3.uploda.org/uporg1823015.jpg.html rgbq.rgbReserved = k;の部分で透明度が変わるはず・・・ですよね? ti->Transparent = true; ti->Canvas->Brush->Style = bsClear; を入れてみてもダメでした。
861 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 22:14:10 ] >>860 それで合っています。 どうしても疑問に思われるなら、rgbq.rgbReservedにいろんなアルファ値(0〜255) を入れてやってみて下さい。
862 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 22:16:02 ] 例えばrgbq.rgbReserved = 100; にしたりすると 明らかに実行結果が変わります。 あとこういうグラデーション画面ではなくて、画像のbitmapを 使うとよくわかります。
863 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 22:21:09 ] ti->Canvas->Brush->Color = clRed; ti->Canvas->FillRect(Rect(0, 0, 255, 255)); こんな感じでImageコントロールを赤色で塗りつぶしてから AlphaBlend()を掛けるとよく効果がわかります。 デフォルトでは白色ですからわかりにくいと思います。
864 名前:843 mailto:sage [2008/11/30(日) 22:38:05 ] すいません、やっと理解できました。 ひとつのImageで二つの画像を重ね合わせるのですね。 これを二つのImageで行うことは不可能でしょうか? 下の画像に、上のImageを透明〜半透明色で塗った物を重ねたかったので。 Formをアルファブレンドした場合、全体を均一に同じ透明度で半透明になってしまいますよね?
865 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 22:46:24 ] >>864 AlphaBlend()に与えるパラメータBLENFUNCTIONの最後のパラメータが 0だと、3つ目のパラメータが全体に与える透過度になります。 しかし今回はピクセル毎に透過度を指定する方法を敢えて選んでいます。 そちらのやり方を欲しておられるように読めたので。 その時は3番目のパラメータを255に、4番目のパラメータをAC_SRC_ALPHA にして、rgbReservedにピクセル毎のアルファ値を入れる事になるのは説明 した通りです。 もし上のImageを透明〜半透明色で塗った物を合成したいのならば、二回 AlphaBlend()を呼び出さなければなりません。
866 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 22:48:04 ] と言うのも、AlphaBlend()関数はソースのアルファ値しか参考にしない ようになっているからです。MSDNをよく読んで見て下さい。 つまり上の画像を別の単色の画像か何かでアルファブレンド、次いで その画像を下の画像とアルファブレンド、という二段階になります。
867 名前:843 mailto:sage [2008/12/01(月) 00:48:02 ] 上の画像に模様をつけて、それをさらにマウスで変形させようとするとすっごく大変なことになりそうですね。 ありがとうございましたー。
868 名前:デフォルトの名無しさん [2008/12/04(木) 17:03:59 ] >>842 アドバイスありがとうございます!そして返事が遅れて本当にすいません; これでやってみたのですが2列目の情報はMemo2に書き出すことができたのですが 4列目の情報を書き出そうとするとなぜかエラーがでてしまい。リストのインデックスが範囲を超えていますとでてしまいます。 原因がどうしてもわからず、困っています。 何かよい書き出し方法はもしくは格納方法はないでしょうか? 当方C++builder5を使用しています。 格納方法もしくは書き出し方法はEEEやRRRがないときは元のテキストのようにスペースとして一行あけて 書き出したいのですがどなたかよろしければアドバイスお願いします。
869 名前:843 mailto:sage [2008/12/05(金) 19:42:25 ] たびたびすいません。 >>855 に>>863 を加えたのですが rgbq.rgbReserved = k; のkを0にすると、以下のようになりますよね。 www2.uploda.org/uporg1833847.jpg.html 透過度を0にすれば上にかかる色は消えますが、色の濃さは残るようで赤色にグラデーションがかかってしまいます。 濃さも消すことはできないのでしょうか?
870 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 20:02:48 ] >>868 「4つめがEEEでもRRRでもなく空の時」って「Values->Strings[ 3 ]」が生成されないってことはないよな? ブレイクポイント貼るかステップ実行するかして、どのリストからどんな風にはみ出してるのかデバッガ使って変数の値見ておいで。
871 名前:843 mailto:sage [2008/12/05(金) 22:13:17 ] >>869 ですが、自己解決しました
872 名前:デフォルトの名無しさん [2008/12/20(土) 20:13:43 ] memo1 memo2 5.6 0 6.1 0 6.1 0 7.2 ← 0 10 1 9.0 1 10 1 4.0 1 7.5 ← 0 5.9 0 5.4 0 5.5 0 5.4 ← 0 10 1 10 1 4.5 1 5.2 ← 0 6.1 0 ・ ・ ・ ・ ・ ・ このようにMemo1とMemo2に書き出されており0は正常値、1はエラー値でそれに対応する値が左の数字です。 1が出た場合前後の0の値から線形補間をしていきたいのですがどのように組んでいけばよいのでしょうか 上記の場合であれば(7.2と7.5の間で線形補間、5.4と5.2の間で線形補間)といった感じです。
873 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 20:16:46 ] memo2 の値が 1 なら前後に 0 を検索して 0 があったらその値とそこまでの距離を使って 線形補完すればよろし。 ところで端に 1 があった場合はどうすんの?
874 名前:デフォルトの名無しさん [2008/12/20(土) 20:19:20 ] AnsiString A,B; int s,u; u = 0; for( int i = 0;i<Memo2->Lines->Count; i++ ){ if(Memo2->Lines->Strings[i] == '1'){ A = Memo2->Lines->Strings[i-1]; s = StrToInt(i); u = StrToInt(i); while(Memo2->Lines->Strings[u] == 0){ u++; } }
875 名前:デフォルトの名無しさん [2008/12/20(土) 20:20:31 ] B = Memo1->Lines->Strings[u]; for(int X = s; X< u+1; X++){ Memo1->Lines->Strings[X] = (B - A)/(u+1) * X + A; Memo2->Lines->Strings[X] = 0; } u = 0; } このような感じで組んでみたのですが線形補間もうまくできておらず、 エラーが起こる場合もあります、よろしければアドバイスお願いします
876 名前:デフォルトの名無しさん [2008/12/20(土) 20:22:45 ] >>873 返信ありがとうございます。 その場合は手動で0が端にくるようにしたいと思います。
877 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 20:23:24 ] >>873 memo1 のデータを保存する必要がないなら、 memo1 のデータをあらかじめ補間した値ですげ替えておけば良い。 メモリに余裕があるなら、memo1 とは別にそういうテーブルを用意してもいい。 最初に一気に補間すると時間がかかるなら無理かもしれないが。
878 名前:デフォルトの名無しさん [2008/12/20(土) 20:26:01 ] すいません、バージョンはc++builder5です。
879 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 20:34:28 ] memo1 を書き換えたのでいいのね。 文字列を引き算したり A に Memo2 の値を入れたり 整数を StrToInt したり '0' じゃなくて 0 と比較してたり X の範囲がおかしかったり 線形補間の分母がおかしかったり おかしいところがありすぎて困っちゃう。 あと、今はまあいいんだけど、 最終的には補間後に i を補間の終了した地点にまで移動させた方が効率がいい。
880 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 20:35:26 ] こういうことが起こるのも、変数名が 1 文字で分かりにくいからってのはあると思うぜ。 変数名は分かりやすい意味のある名前をつけよう。
881 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 21:39:53 ] >>879 >>880 返信、アドバイスありがとうございます>< プログラム知識も浅く見様見真似で作ったのでこんな形になってしまいました・・ おかしい言われたところも自分ではどのようにして変えていけばよいのかわからず 困り果てています。 線形補間をしてmemo1に書き換えるにはどのようにプログラムを組めばよいでしょうか・・
882 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 22:08:35 ] こっちもどうアドバイスしていいのかわからんレベルなんだが…。 とりあえず考え方として Memoから値を文字列→数値に変換して配列とかvectorに格納する 数値に必要に応じて線形補完する 数値を文字列に変換してMemoに格納する というように、やるべきことを自分が理解できるところまで分解してみてはいかが? 自分で理解できないものを作ることはできないんだし。
883 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 07:27:35 ] Memoとかコントロールに入っている値を取りだしてどうこうしてまた 戻す操作は一般に遅いので>>882 さんみたいにvectorに入れる など考えた方がいいよ
884 名前:デフォルトの名無しさん [2008/12/21(日) 16:35:08 ] vectorの格納とはいったいどういうものなんでしょうか? 今日調べていたのですが使い方もわからずじまいでした; 動作速度は遅くてもよいので具体的にこのように memo1とmemo2を見比べてエラー値のあった部分は前後の0(正常値)から 線形補間していきmemo3のように線形補間された配列を書き出すプログラムを作りたいのですが どのように書いていけばよいのでしょうか? お手数ですがよろしくお願いします。 memo1 memo2 memo3 5.6 0 5.6 6.1 0 6.1 6.1 0 6.1 7.2 ← 0 7.2 10 1 7.26 9.0 1 7.32 10 1 7.38 4.0 1 7.44 7.5 ← 0 7.5 5.9 0 5.9 5.4 0 5.4 5.5 0 5.5 5.4 ← 0 5.4 10 1 5.35 10 1 5.3 4.5 1 5.25 5.2 ← 0 5.2 6.1 0 6.2 ・ ・ ・ ・ ・ ・