くだすれC++Builder(超初心者用)その3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/02/12(月) 03:39:51もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
C++Builder使いが優しくコメントを返しますが、
お礼はC++Builderの布教と初心者の救済をお願いします。
Borland Home Page http://www.borland.co.jp/
<過去スレ>
くだすれC++Builder(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1117225464/l50
くだすれC++Builder(超初心者用)その2
http://pc10.2ch.net/test/read.cgi/tech/1144308804/l50
<兄弟スレ>
くだすれDelphi(超初心者用)その39
http://pc10.2ch.net/test/read.cgi/tech/1169386914/l50
0784デフォルトの名無しさん
2008/11/04(火) 15:16:55はい、falseでした。
一度動くようになると、PCを再起動してもtrueですね・・・。
なぜでしょう?
>>783
汚い書き方ですが、
OpenDialog1->FileName = OpenDialog1->InitialDir;
をExecute()の前に置いたら動作しました。
Execute()で最初に開くフォルダはFileNameのフォルダで、InitialDirでは無いってことでよろしいでしょうか?
0785デフォルトの名無しさん
2008/11/04(火) 17:13:51こっちも忙しいんだから早くして下さいね。
0786デフォルトの名無しさん
2008/11/04(火) 23:57:41>一度動くようになると
パスが通ってるから。
想定される状況で通るように場合分けしたら?
フォルダを開くという概念がどうもね。
0787デフォルトの名無しさん
2008/11/07(金) 17:01:27指定時間後に自動的に閉じることって可能でしょうか?
可能であればどうすればいいのでしょうか?
0788デフォルトの名無しさん
2008/11/07(金) 17:24:430789デフォルトの名無しさん
2008/11/07(金) 17:47:09TSplashForm
0790デフォルトの名無しさん
2008/11/07(金) 23:35:090791デフォルトの名無しさん
2008/11/08(土) 00:16:07Close();
Release();
で閉じれるね
0792デフォルトの名無しさん
2008/11/08(土) 02:51:270793デフォルトの名無しさん
2008/11/08(土) 04:17:33ってか、大麻付きダイアログを作ればいいだけだけど。
0794デフォルトの名無しさん
2008/11/08(土) 04:38:460795デフォルトの名無しさん
2008/11/10(月) 09:41:380796デフォルトの名無しさん
2008/11/10(月) 16:04:46pass = 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の配列データです。
0797デフォルトの名無しさん
2008/11/10(月) 16:16:550798796
2008/11/10(月) 16:25:20AnsiStringでいいです。別のところでそれぞれの配列を使って計算したいので。。
どういう風に書けば9個格納できるでしょうか。
0799デフォルトの名無しさん
2008/11/10(月) 16:36:030800デフォルトの名無しさん
2008/11/10(月) 16:46:49char 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;
}
0801796
2008/11/10(月) 17:26:07うまくいきません。
Memo1->Lines->Add(A1)で確認してみたのですがうまく読み込めていませんでした。
読み込むファイルが数百行というのは関係あるのでしょうか。
A1 = 1回目に読み込んだ配列
A2 ・・・
という感じでやりたいのですが。。。
とりあえずがんばってやってみます。
0802デフォルトの名無しさん
2008/11/10(月) 17:35:33んじゃさ、TStringList使えばいいんでないの?
TStringList *sl = TStringList();
sl->LoadFromFile("ファイル名"");
for( int i = 0; i < sl->Count; i ++ ){
aa = sl->Strings[i];
}
こんな感じでどうよ?
0803デフォルトの名無しさん
2008/11/10(月) 17:59:23AnsiString kekka;
for(int I=0;I<20; I++){
kekka = Memo1->Lines->Strings[I];
}
という風に試したのですがMemo1に表示させてある内容と違う値が出てしまいました。
わからないのでアドバイスください。
0804デフォルトの名無しさん
2008/11/11(火) 00:44:15kekkaは一つしか無いでしょ。
Memo1->Lines->Stringis[I]は20個あるでしょ。
20回ループまわしてもkekkaは一つしか無いでしょ。
0805デフォルトの名無しさん
2008/11/11(火) 10:28:51っていうか俺のTStringListは無視か!!
それにkekkaを配列にすりゃいいって最初に言っただろう!
0806デフォルトの名無しさん
2008/11/11(火) 14:56:40それで出来るようになるのってちゃんとしたプログラムがいくつも書けるようになってからだろうに。
クラス図とかメモリマップとか妄想絵図とか、何でもいいからソースコード以外の何かで書いてみたら
自分がどこに引っかかってるのか分かるような気がする。
0807デフォルトの名無しさん
2008/11/11(火) 19:02:060808デフォルトの名無しさん
2008/11/11(火) 21:27:18妄想を紙に書いてみると
自分のアホさが
よくわかる。
0809デフォルトの名無しさん
2008/11/13(木) 10:39:08・BCB5
・複数のカラム追加したListViewを設置
・上記カラムの1つはAutoSize
このListViewにデータを流し込んだ時に後から発生した
縦スクロールバー分の幅が自動調整されないんだけど
これを自動調整するには何がベストなんでしょうか?
今は仕方なくデータを流し込んだ後にListViewの幅を
-1 >> +1として調整してます
0810デフォルトの名無しさん
2008/11/13(木) 10:58:48ListViewの幅か?カラムか?
0811デフォルトの名無しさん
2008/11/13(木) 11:53:38右端が発生したスクロールバーで隠れるのよ・・・
0812デフォルトの名無しさん
2008/11/14(金) 10:51:350813デフォルトの名無しさん
2008/11/17(月) 12:48:11・やりたいこと
クライアントアプリ(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 が参照)
と出て、うまくいきません。
足りない操作、間違った操作をやっていたら教えてください。
お願いします。
0814デフォルトの名無しさん
2008/11/17(月) 15:35:150815デフォルトの名無しさん
2008/11/17(月) 15:39:130816デフォルトの名無しさん
2008/11/17(月) 15:56:250817デフォルトの名無しさん
2008/11/17(月) 15:59:290818デフォルトの名無しさん
2008/11/17(月) 16:00:010819デフォルトの名無しさん
2008/11/17(月) 16:19:590820デフォルトの名無しさん
2008/11/17(月) 16:25:56プログラム板がID制になってもいいのか
0821デフォルトの名無しさん
2008/11/17(月) 16:28:33大賛成
0822デフォルトの名無しさん
2008/11/17(月) 16:29:030823デフォルトの名無しさん
2008/11/17(月) 16:46:110824814
2008/11/17(月) 19:14:130825デフォルトの名無しさん
2008/11/17(月) 19:24:180826デフォルトの名無しさん
2008/11/18(火) 00:41:260827デフォルトの名無しさん
2008/11/18(火) 10:17:080828デフォルトの名無しさん
2008/11/18(火) 10:32:490829デフォルトの名無しさん
2008/11/18(火) 10:47:530830811
2008/11/18(火) 16:14:59変化するイベントで自分で再設定すれば出来るのは知っているんですが
コンポーネントのサイズ変更を行えば自動でやってくれる以上
なんとかそれを直接行えないかなと思ってるんですか・・・
0831デフォルトの名無しさん
2008/11/21(金) 18:14:21読み込み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行並んでいます。
0832デフォルトの名無しさん
2008/11/21(金) 18:24:180833デフォルトの名無しさん
2008/11/21(金) 18:34:24Memo2にLoadFromfileなどでxを書き出すと
-2.06167
-2.05553
-2.04654
-2.04326
・
・
yを書き出すと
EEE
RRR
EEE
RRR
(空白の場合もあるのでそれも一行として数える)
・
・
・
などといった具合にxとyに格納したいのです。
TStringといいましたが格納の仕方がそれだけしかしらないので
AnsiStringなどでもできるのでしたらどちらかアドバイスお願いします。
0834デフォルトの名無しさん
2008/11/22(土) 19:34:06for( 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列目の情報
}
0835デフォルトの名無しさん
2008/11/23(日) 17:20:19遅くなってしまってすいません、そして説明不足でした・・・。
できればMemo1の内容を再利用したいのですが、c++builderのバージョンが5なので
Delimiterが使えないようなのです・・・
お手数ですがDelimitedText以外での表し方を教えていただけないでしょうか。
0836デフォルトの名無しさん
2008/11/23(日) 18:50:25TStringList* 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列目の情報
}
0837デフォルトの名無しさん
2008/11/23(日) 19:30:27返信ありがとうございます.
おっしゃられたように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);
}
0838デフォルトの名無しさん
2008/11/23(日) 20:05:59TStringList* Values = new TStringList;
使用後
delete Values;
0839デフォルトの名無しさん
2008/11/24(月) 19:39:22{
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だけでなく同じ行数文だけスペースも含め格納したいのですが、これは無理でしょうか?
0840デフォルトの名無しさん
2008/11/24(月) 19:53:320002, -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で格納していきたいのです。
無理難題を言ってしまいすいません。
0841デフォルトの名無しさん
2008/11/24(月) 19:55:12もしよろしければアドバイスお願いします。
0842デフォルトの名無しさん
2008/11/25(火) 00:27:26ループ中で何度も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 で出ているデータが本物のデータからのコピーなら、ピリオドとカンマが
入力ミスで混ざってて、自動で正しく分離する事は無理。
0843デフォルトの名無しさん
2008/11/28(金) 02:16:31TColorは24bit専用なのでしょうか?完全な白の時は透過になるのですが、それ以外は全く透過しません。
色によって透過度を変えたいのですが、上手くいかないのが現状です。
PixelFormatで32bitの指定はしているのですが・・・。
すいませんがよろしくお願いします。
0844デフォルトの名無しさん
2008/11/28(金) 11:26:00BDS2006を使っています。
ファイルの数が多くなってきたので
ヘッダファイルを、header1.hというファイルにまとめて
#include "Main.h"
#include "About.h"
・・・
という感じに記述して
.cppファイルの方には、
#include header1.h
と記述するようにしました。
このように変更してから、
再構築を行い、プログラムを実行し
バージョン情報を表示すると、EClassNotFound
TImageが見つかりませんというエラーがたまに出るようになりました。
About.cppをコンパイルし直すと正常に動作します。
他のクラスでも同じように、エラーが発生し再コンパイルすると正常になることがあります。
どうしてこのようなことが発生し、どうすれば回避できるのでしょうか。
ヘッダをまとめて1個のファイルにしてしまうのはダメなのでしょうか。
0845デフォルトの名無しさん
2008/11/28(金) 14:26:150846デフォルトの名無しさん
2008/11/28(金) 15:43:040847デフォルトの名無しさん
2008/11/28(金) 15:49:080848デフォルトの名無しさん
2008/11/29(土) 01:55:440849デフォルトの名無しさん
2008/11/29(土) 09:34:25TSearchRecのSize変数から取ったのですが、
ファイルサイズが大きいと戻り値がマイナスになってしまいます。
大きいファイルサイズでも正確に取得するには
どうすればいいのでしょうか。
0850デフォルトの名無しさん
2008/11/29(土) 10:20:560851デフォルトの名無しさん
2008/11/29(土) 10:22:520852デフォルトの名無しさん
2008/11/29(土) 10:33:20TSearchRec.FindData.nFileSizeLow
0853デフォルトの名無しさん
2008/11/29(土) 10:34:580854デフォルトの名無しさん
2008/11/29(土) 17:44:27これで行けるはずなんだが・・・うーんわからん
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;
}
0855デフォルトの名無しさん
2008/11/30(日) 00:35:28Win32スレで聞いているうちにバグの原因がわかったので、
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();
0856デフォルトの名無しさん
2008/11/30(日) 00:36:10Application->NormalizeTopMosts();
Application->MessageBox(str, L"AlphaBlend()でエラーが起きました", MB_OK);
Application->RestoreTopMosts();
}
delete bt;
}
0857デフォルトの名無しさん
2008/11/30(日) 00:42:59ありますが、これがまさにアルファ値そのものです。
ですからここにアルファ値をセットしてAlphaBlend()を呼び出せば、
期待通りの結果が得られます。
もちろんPixelFormatはpf32bitでなければなりません。
0858843
2008/11/30(日) 19:35:36丁寧にありがとうございます。
WideStringのところでひっかかったり、AlphaBlendが見つからなかったり(wingdi.hをインクルードするだけじゃダメなのかな?)していてまだ確認できていませんが、
いろいろ調べてやってみます。
ありがとうございました。
0859デフォルトの名無しさん
2008/11/30(日) 20:26:46BCB6だと、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使えばいいよ。
0860843
2008/11/30(日) 21:16:16はい、BCB6を使用しています。
CBuilder6\Lib\Psdkに同名のファイルがあるので、パスが通っていれば良いのかと思っていました。
インポートライブラリを作成したところ、動作しました。
ありがとうございます。
ところで実行結果ですが、これでよろしいのでしょうか?
http://www3.uploda.org/uporg1823015.jpg.html
rgbq.rgbReserved = k;の部分で透明度が変わるはず・・・ですよね?
ti->Transparent = true;
ti->Canvas->Brush->Style = bsClear;
を入れてみてもダメでした。
0861デフォルトの名無しさん
2008/11/30(日) 22:14:10それで合っています。
どうしても疑問に思われるなら、rgbq.rgbReservedにいろんなアルファ値(0〜255)
を入れてやってみて下さい。
0862デフォルトの名無しさん
2008/11/30(日) 22:16:02明らかに実行結果が変わります。
あとこういうグラデーション画面ではなくて、画像のbitmapを
使うとよくわかります。
0863デフォルトの名無しさん
2008/11/30(日) 22:21:09ti->Canvas->FillRect(Rect(0, 0, 255, 255));
こんな感じでImageコントロールを赤色で塗りつぶしてから
AlphaBlend()を掛けるとよく効果がわかります。
デフォルトでは白色ですからわかりにくいと思います。
0864843
2008/11/30(日) 22:38:05ひとつのImageで二つの画像を重ね合わせるのですね。
これを二つのImageで行うことは不可能でしょうか?
下の画像に、上のImageを透明〜半透明色で塗った物を重ねたかったので。
Formをアルファブレンドした場合、全体を均一に同じ透明度で半透明になってしまいますよね?
0865デフォルトの名無しさん
2008/11/30(日) 22:46:24AlphaBlend()に与えるパラメータBLENFUNCTIONの最後のパラメータが
0だと、3つ目のパラメータが全体に与える透過度になります。
しかし今回はピクセル毎に透過度を指定する方法を敢えて選んでいます。
そちらのやり方を欲しておられるように読めたので。
その時は3番目のパラメータを255に、4番目のパラメータをAC_SRC_ALPHA
にして、rgbReservedにピクセル毎のアルファ値を入れる事になるのは説明
した通りです。
もし上のImageを透明〜半透明色で塗った物を合成したいのならば、二回
AlphaBlend()を呼び出さなければなりません。
0866デフォルトの名無しさん
2008/11/30(日) 22:48:04ようになっているからです。MSDNをよく読んで見て下さい。
つまり上の画像を別の単色の画像か何かでアルファブレンド、次いで
その画像を下の画像とアルファブレンド、という二段階になります。
0867843
2008/12/01(月) 00:48:02ありがとうございましたー。
0868デフォルトの名無しさん
2008/12/04(木) 17:03:59アドバイスありがとうございます!そして返事が遅れて本当にすいません;
これでやってみたのですが2列目の情報はMemo2に書き出すことができたのですが
4列目の情報を書き出そうとするとなぜかエラーがでてしまい。リストのインデックスが範囲を超えていますとでてしまいます。
原因がどうしてもわからず、困っています。
何かよい書き出し方法はもしくは格納方法はないでしょうか?
当方C++builder5を使用しています。
格納方法もしくは書き出し方法はEEEやRRRがないときは元のテキストのようにスペースとして一行あけて
書き出したいのですがどなたかよろしければアドバイスお願いします。
0869843
2008/12/05(金) 19:42:25>>855に>>863を加えたのですが
rgbq.rgbReserved = k; のkを0にすると、以下のようになりますよね。
http://www2.uploda.org/uporg1833847.jpg.html
透過度を0にすれば上にかかる色は消えますが、色の濃さは残るようで赤色にグラデーションがかかってしまいます。
濃さも消すことはできないのでしょうか?
0870デフォルトの名無しさん
2008/12/05(金) 20:02:48「4つめがEEEでもRRRでもなく空の時」って「Values->Strings[ 3 ]」が生成されないってことはないよな?
ブレイクポイント貼るかステップ実行するかして、どのリストからどんな風にはみ出してるのかデバッガ使って変数の値見ておいで。
0872デフォルトの名無しさん
2008/12/20(土) 20:13:435.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の間で線形補間)といった感じです。
0873デフォルトの名無しさん
2008/12/20(土) 20:16:460 があったらその値とそこまでの距離を使って
線形補完すればよろし。
ところで端に 1 があった場合はどうすんの?
0874デフォルトの名無しさん
2008/12/20(土) 20:19:20int 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++;
}
}
0875デフォルトの名無しさん
2008/12/20(土) 20:20:31for(int X = s; X< u+1; X++){
Memo1->Lines->Strings[X] = (B - A)/(u+1) * X + A;
Memo2->Lines->Strings[X] = 0;
}
u = 0;
}
このような感じで組んでみたのですが線形補間もうまくできておらず、
エラーが起こる場合もあります、よろしければアドバイスお願いします
0876デフォルトの名無しさん
2008/12/20(土) 20:22:45返信ありがとうございます。
その場合は手動で0が端にくるようにしたいと思います。
0877デフォルトの名無しさん
2008/12/20(土) 20:23:24memo1 のデータを保存する必要がないなら、
memo1 のデータをあらかじめ補間した値ですげ替えておけば良い。
メモリに余裕があるなら、memo1 とは別にそういうテーブルを用意してもいい。
最初に一気に補間すると時間がかかるなら無理かもしれないが。
0878デフォルトの名無しさん
2008/12/20(土) 20:26:010879デフォルトの名無しさん
2008/12/20(土) 20:34:28文字列を引き算したり
A に Memo2 の値を入れたり
整数を StrToInt したり
'0' じゃなくて 0 と比較してたり
X の範囲がおかしかったり
線形補間の分母がおかしかったり
おかしいところがありすぎて困っちゃう。
あと、今はまあいいんだけど、
最終的には補間後に i を補間の終了した地点にまで移動させた方が効率がいい。
0880デフォルトの名無しさん
2008/12/20(土) 20:35:26変数名は分かりやすい意味のある名前をつけよう。
0881デフォルトの名無しさん
2008/12/20(土) 21:39:53返信、アドバイスありがとうございます><
プログラム知識も浅く見様見真似で作ったのでこんな形になってしまいました・・
おかしい言われたところも自分ではどのようにして変えていけばよいのかわからず
困り果てています。
線形補間をしてmemo1に書き換えるにはどのようにプログラムを組めばよいでしょうか・・
0882デフォルトの名無しさん
2008/12/20(土) 22:08:35とりあえず考え方として
Memoから値を文字列→数値に変換して配列とかvectorに格納する
数値に必要に応じて線形補完する
数値を文字列に変換してMemoに格納する
というように、やるべきことを自分が理解できるところまで分解してみてはいかが?
自分で理解できないものを作ることはできないんだし。
0883デフォルトの名無しさん
2008/12/21(日) 07:27:35戻す操作は一般に遅いので>>882さんみたいにvectorに入れる
など考えた方がいいよ
■ このスレッドは過去ログ倉庫に格納されています