線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5108
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

如何Memo裡顯示的值抓出並做比對

答題得分者是:ikk
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-22 20:17:14 IP:123.110.xxx.xxx 訂閱
各位大大好
小弟用C Builder 6寫了一個程式 利用scanline的方式將 image某一列的y值和像素值掃進Memo裡並顯示出來
小弟現在想在迴圈裡加寫 把Memo裡的值抓取出來 並將字串轉成整數 兩兩做大小比對 再把值顯示在Label
這是小弟寫的迴圈

for(int y=50;y<=150;y )
{
ptr2=(Byte*) TempBitmap2->ScanLine[y];
for(int x=1445;x<1446;x )
{
Bmapbuf1[0]=ptr2[x];
Label30->Visible=true;
Label30->Caption=x;
Memo2->Lines->Add(IntToStr(y) ":" IntToStr(ptr2[x]));
}
}

這是Memo裡顯示的值
Y值 :像素值
50:1
51:1
52:1
53:1
54:1
55:1
56:1
57:1
58:1
59:1
60:1
61:1
62:1
63:1
64:1
65:1
66:1
67:1
68:1
69:1
70:1
71:1
72:1
73:1
74:1
75:1
76:1
77:1
78:1
79:1
80:1
81:1
82:1
83:1
84:1
85:1
86:1
87:1
88:1
89:1
90:1
91:1
92:1
93:1
94:1
95:1
96:1
97:1
98:1
99:1
100:1
101:1
102:1
103:1
104:1
105:1
106:1
107:1
108:1
109:1
110:1
111:1
112:1
113:1
114:1
115:1
116:1
117:1
118:1
119:1
120:2
121:1
122:6
123:3
124:8
125:8
126:14
127:22
128:43
129:28
130:149
131:121
132:190
133:181
134:190
135:174
136:175
137:189
138:198
139:212
140:196
141:161
142:123
143:151
144:140
145:124
146:154
147:144
148:138
149:124
150:102

小弟要做比對是為了取像素值的分水嶺就像 126-132的值 小弟要在這忽然從小變大的值做比對
126:14
127:22
128:43
129:28
130:149
131:121
132:190
先從50和51兩個做比對 到128 129 130的值做比對 a為128 b為129 c為130 a不能大於100 b和c大於100 ac
因為每一張圖的像素值大小位置不一樣 小弟想將值的比對停在大於100的前5個像素值 像130-134
128:43
129:28
130:149
131:121
132:190
133:181
134:190
小弟之前有加入一些程式在迴圈但是Memo裡的值會被消除取代掉
希望各位大大指導小弟 小弟會認真學習
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-23 10:07:03 IP:163.28.xxx.xxx 訂閱
那你應該是一次取出6個值來比對吧..
129:28 --> a
130:149 --> b -->(1) > 100
131:121 --> c
-->(2) > 100
132:190 -->(3) > 100
133:181 -->(4) > 100
134:190 -->(5) > 100
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-23 20:36:08 IP:123.110.xxx.xxx 訂閱
KK大大抓6個值就太多了
因為過了131之後
就不重要了 主要是要取數字從小最大的那個位址
126:14
127:22
128:43
129:28
130:149
131:121
132:190
像129和130 看的出數字變化的差距
要抓取的就是130這位址
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-24 08:36:07 IP:163.28.xxx.xxx 訂閱
這樣的比對只要一個For迴圈即可完成..
你的困難點??
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-24 21:07:44 IP:123.110.xxx.xxx 訂閱
KK大大您好
我要將比對之後的值連同y的值一起指到Label
127:22
128:43
129:28
130:149
131:121
我要顯示 y 值 :像素值 ----> 130:149
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-25 09:02:54 IP:163.28.xxx.xxx 訂閱
還是不懂,  困難點在?? 從memo取出值? 比對值? 顯示值?
你的code??
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-25 09:20:30 IP:123.110.xxx.xxx 訂閱
kk大大您好
我現在卡在要從memo裡抓出值來做比對
這是小弟寫的程式

for(int y=50;y<=200;y )
{
ptr2=(Byte*) TempBitmap2->ScanLine[y];
for(int x=666;x<667;x )
{
Bmapbuf1[0]=ptr2[x];
Label29->Visible=true;
Label29->Caption=x;
if(ptr2[x]>1 && ptr2[x]<190) <---------- kk大大有沒有辦法讓ptr2[x]的值列出 1~ 190 超過的不要
{
break;
}
{
Memo1->Lines->Add(IntToStr(y) ":" IntToStr(ptr2[x]));
{
AnsiString s1;
int a;
int buff[100];
for(int i=0;i<=150; i ) <-------這個迴圈要做抓出值做比對 小弟現在卡在這
{
s1=Memo1->Lines->Strings[i];
buff[0]=ptr2[x];
s1=Memo1->Lines->Strings[i 1];
buff[1]=ptr2[x];
buff[0] }

Label32->Visible=true;
Label32->Caption=IntToStr(ptr2[x]);
}
}
}
}
希望大大 能給一些指導
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-25 09:29:37 IP:163.28.xxx.xxx 訂閱
比較好的方式, 是將取出的值先存入一個buffer, 再從buffer取出值比對....

另外就是記錄前一個值, 與目前取出的值比對...

從你的code看不出比對的地方在哪....
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-25 11:45:22 IP:123.110.xxx.xxx 訂閱
KK大大
我將 s1=Memo1->Lines->Strings[i];
buff[0]=s1;
讓s1的值顯示在label上 可以卻看不到值 出現的是空白的 是我的型態變錯了嗎?
比對的地方我試了 if的寫法 還是無法讓值做出比對
大大能舉個例子讓小弟參考一下嗎?
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-03-25 11:55:27 IP:163.28.xxx.xxx 訂閱
s1=Memo1->Lines->Strings[i];

抓出來的字串應該是
129:28 這樣的格式,
所以應該要來要把28抓出來比對..
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-03-25 12:12:27 IP:123.110.xxx.xxx 訂閱
kk大大
bcb裡有類似 split的函式嗎?
用s1=s.SubString(3,4);會抓到冒號
Label33->Caption=s1; 還是會看不見s1的值
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-03-25 12:28:56 IP:163.28.xxx.xxx 訂閱
找出 : 之後的字串

[code cpp]
AnsiString asGet;
int index;

index = Memo1->Lines->Strings[i].Pos(':');
index = 1; //skip ':'

asGet = Memo1->Lines->Strings[i].SubString(index,32);

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-03-25 13:38:29 IP:123.110.xxx.xxx 訂閱
kk大 大  您好
index = 1; <-------這是去尋找:之後有1的值就回傳嗎??

if(ptr2[x]>1 && ptr2[x]<190)
{
break;
}
大大為什麼我限制2[x] >1和 <190 其它的值就全都不見了 有什麼辨法可以讓值停在第一個值為190的地方其它的值一樣也顯示著
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-03-25 13:42:48 IP:163.28.xxx.xxx 訂閱
index += 1; skip ':'
只是不把 ':' 抓出來而已, 只抓':'後面的字串


"讓值停在第一個值為190的地方其它的值一樣也顯示著"
不懂你的意思.
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-03-25 14:01:01 IP:123.110.xxx.xxx 訂閱
讓y值和像素值停在第一個像素為190的地方

60:1
61:1
62:1
63:1
64:1
65:1
66:1
67:1
68:1
69:1
70:1
71:1
72:1
73:1
74:1
75:1
76:1
77:1
78:1
79:1
80:1
81:1
82:1
83:1
84:1
85:1
86:1
87:1
88:1
89:1
90:1
91:1
92:1
93:1
94:1
95:1
96:1
97:1
98:1
99:1
100:1
101:1
102:1
103:1
104:1
105:1
106:1
107:1
108:1
109:1
110:1
111:1
112:1
113:1
114:1
115:1
116:1
117:1
118:1
119:1
120:2
121:1
122:6
123:3
124:8
125:8
126:14
127:22
128:43
129:28
130:149
131:121
132:190
memo的顯示像這樣子就停止不就寫入
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-03-25 14:16:34 IP:163.28.xxx.xxx 訂閱
找到190後, 跳出x 和 y 的迴圈吧..
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-03-25 14:20:37 IP:123.110.xxx.xxx 訂閱
大大 x值的迴圈不用跳出
只要跳出y迴圈不讓memo繼續寫入
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-03-25 14:32:18 IP:163.28.xxx.xxx 訂閱
你不跳出x迴圈, 怎麼跳出y迴圈?
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-03-25 14:35:01 IP:123.110.xxx.xxx 訂閱
我還以為只要跳出y迴圈就好了......
------
丫風
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2009-03-25 14:53:31 IP:123.110.xxx.xxx 訂閱
大大請問要用那一種指令去中斷迴圈會比較好
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#21 引用回覆 回覆 發表時間:2009-03-25 15:01:07 IP:163.28.xxx.xxx 訂閱
用break就行了吧

if ( SomeValue == 190 )
bNeedBreak = true;

if ( bNeedBreak )
break;
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#22 引用回覆 回覆 發表時間:2009-03-25 15:13:31 IP:123.110.xxx.xxx 訂閱
大大
我寫這樣子 190的值會不見可是迪圈還是跑到底....
if(ptr2[x]==190)
{
break;
}
你寫的我看不懂不知道要怎麼轉成bcb用的
------
丫風
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#23 引用回覆 回覆 發表時間:2009-03-25 23:03:41 IP:123.110.xxx.xxx 訂閱
kk大大您好  謝謝你的指導 
我寫了一些程式
AnsiString s1;
int n = Memo1->Lines->Strings[i].Pos(":");
n = 1; //skip ':'
s1= Memo1->Lines->Strings[i].SubString(n,3);

Label33->Visible=true;
Label33->Caption=s1;
這s1抓取出來的值是 104 <------像素值
但是小弟要把這值存進 buff[0] ------------> buff[0]=StrToInt(s1);
執行出現了錯誤是我把型態認錯了嗎?

------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#24 引用回覆 回覆 發表時間:2009-03-26 08:17:28 IP:163.28.xxx.xxx 訂閱
你可以試著debug, s1到底是那裡出現不是數字
還有AnsiString 有ToInt() 可以用...
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#25 引用回覆 回覆 發表時間:2009-03-26 11:29:10 IP:123.110.xxx.xxx 訂閱
kk大大謝謝你的指導
找到問題點了 s1= Memo1->Lines->Strings[i].SubString(n,3);
應該出錯在這行, 不是寫法錯, 而是遇上意外情況, 例如: 當後面的值只有1位數或2位數時,
下一行在轉成Int時就會出錯.
大大像這種數值不確定有幾位數時要怎麼去宣告才不會有誤
------
丫風
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#26 引用回覆 回覆 發表時間:2009-03-26 11:38:14 IP:123.110.xxx.xxx 訂閱
大大請問一下 要怎麼清楚memo裡上一張圖片的像素
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#27 引用回覆 回覆 發表時間:2009-03-26 11:42:32 IP:163.28.xxx.xxx 訂閱
只有1位應該不會錯...
你可以再看字串實際抓的是什麼吧...
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#28 引用回覆 回覆 發表時間:2009-03-26 11:52:49 IP:123.110.xxx.xxx 訂閱
大大 我試過了有2位數也有3位的
先前只有1位數那是我加了這一行程式

if(ptr2[x]>1 && ptr2[x]<190) 這只會列出1和190的地方
{
break;
我現在把這多加的刪除了 像素值 有1~190
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#29 引用回覆 回覆 發表時間:2009-03-26 12:56:37 IP:163.28.xxx.xxx 訂閱

[code cpp]
TImage * pImage;

pImage = new TImage(Memo1);
pImage->Parent = Memo1;

pImage->Width = 100;
pImage->Height = 100;

pImage->Picture->LoadFromFile("D:\\temp\\20.jpg");
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
seiken
一般會員


發表:9
回覆:29
積分:7
註冊:2008-11-21

發送簡訊給我
#30 引用回覆 回覆 發表時間:2009-03-26 13:11:42 IP:123.110.xxx.xxx 訂閱
大大 我加寫了求字串的長度
AnsiString s,s1;
int n = Memo1->Lines->Strings[i].Pos(":");
n = 1; //skip ':'
s = Memo1->Lines->Strings[i];
int a = s.Length(); <------我在讓 a = s的字串長度
s1= Memo1->Lines->Strings[i].SubString(n,(a 1)-n); <--------我讓(a 1)-n是抓取我要的字串長度 可是s1的值是NULL
buff[0]=StrToInt(s1);
Label33->Visible=true;
Label33->Caption=s1;
我有設錯嗎? (n,(a 1)-n) <===== (4,1)
------
丫風
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#31 引用回覆 回覆 發表時間:2009-03-26 13:41:07 IP:163.28.xxx.xxx 訂閱
我試過沒問題,,
我想你最好把這時候的.
Memo1->Lines->Strings[i]
印出來看看....
------
FPGA驗證, FPGA開發平台, http://smims.com
[<<] [1] [2] [>>]
系統時間:2024-04-25 1:51:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!