判斷取出有效字串 |
尚未結案
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
procedure GetSubStr(str: string; var strls: TStrings); var TempStrLs: TStrings; Temp: string; i: integer; begin StrLs.Clear; Temp := Str; while Str <> '' do begin StrLs.Add(Copy(Temp, 1, 2); Delete(Temp, 1, 3); end; if StrLs.Count < 6 then begin StrLs.Clear; StrLs.Add('字串長度不够。'); exit; end; TempStrLs := TStringList.Create; for i := 0 to StrLs.Count - 1 do begin if (StrLs.Strings[i] = '02') and (StrLs.Strings[i 1] = '01') and (StrLs.Strings[i 4] = '02') and (StrLs.Strings[i 5] = '01') then TempStrLs.add(StrLs.Strings[i 2]); TempStrLs.add(StrLs.Strings[i 3]); end; StrLs.Clear; StrLs.AddStrings(TempStrLs); TempStrLs.Free; end;---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
這問題會不會太單?
var i,k: Integer; Str,StrMark,NewStr: String; StrList: StringList; ~~~ 中略 ~~ StrMark := '02 01'; k := Length(StrMark); i := Pos(StrMark,Str); if i = 1 then begin Str := Copy(Str,i k,Length(Str)); i := Pos(StrMark,Str); end; whilt i > 0 then begin NewStr := Copy(Str,1,i-1); Str := Copy(Str,i k,Length(Str)); StrList.Add(NewStr); i := Pos(StrMark,Str) end; if Length(Str) > 0 then StrList.Add(Str);發表人 - syntax 於 2005/08/06 17:20:31 |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
感謝h@visli,syntax兩位大大的解答! to:h@visli大大:
有參考試過h@visli大大的方法,會出現錯誤信息:out of memory to:syntax大大:
可以通過,但是這樣判斷(StrMark := '02 01';)會有一個問題:當str字串如果是:01 開頭(如: str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02';,則取得的第一組個有效數據不對,(結果為:01 12 B5),其他組數據沒有問題,不知有何改善方法?謝謝!
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
var Str,MarkStr,S:String; i :Integer; begin MarkStr:='02 01'; Str :='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02'; Delete(Str,1,Pos(MarkStr,Str) Length(MarkStr));//<-消掉1~MarkStr間的無效字串 repeat i:=Pos(MarkStr,Str); List.Add(Copy(Str,1,i-1)); Delete(Str,1,i Length(MarkStr)); until(i<=0); end;發表人 - jest0024 於 2005/08/08 12:36:03 |
jeff377
初階會員 發表:9 回覆:60 積分:33 註冊:2004-08-10 發送簡訊給我 |
procedure GetSubStr(Text: String; List: TStrings); var P1,P2: Integer; sTemp: String; sValue: String; begin List.Clear; sTemp:= Text; P1:= Pos('01',sTemp); if P1<=0 then exit; sTemp:= Copy(sTemp,P1 2,Length(sTemp) 1); sTemp:= Trim(sTemp); While P1>0 do begin P2:= Pos('02',sTemp); if P2<=0 then exit; sValue:= Trim(Copy(sTemp,1,P2-1)); List.Add(sValue); sTemp:= Copy(sTemp,P2 2,Length(sTemp) 1); P1:= Pos('01',sTemp); if P1<=0 then exit; sTemp:= Copy(sTemp,P1 2,Length(sTemp) 1); end; end; |
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
function TForm1.SplitString(S, Delimiter: string): TStringList; begin Result := TStringList.Create; Result.Text := StringReplace(S, Delimiter, #13, [rfReplaceAll]); end; procedure TForm1.Button1Click(Sender: TObject); var S: string; I, J: Integer; L: TStringList; begin S := #$27#$02#$01#$F8#$25#$02#$01#$F8#$23#$02#$01#$F8#$21#$02#$01#$F8#$2C#$02#$01; L := SplitString(S, #$02#$01); try for I := 0 to L.Count-1 do begin S := ''; for J := 1 to Length(L[I]) do S := S Format('%.2x', [Ord(L[I][J])]); ListBox1.Items.Add(S); end; finally L.Free; end; end;發表人 - jow 於 2005/08/08 13:49:43 |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: 感謝h@visli,syntax兩位大大的解答! to:h@visli大大: 有參考試過h@visli大大的方法,會出現錯誤信息:out of memory to:syntax大大: 可以通過,但是這樣判斷(StrMark := '02 01';)會有一個問題:當str字串如果是:01 開頭(如: str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02';,則取得的第一組個有效數據不對,(結果為:01 12 B5),其他組數據沒有問題,不知有何改善方法?謝謝!妳的問題很奇怪 既然妳設定 "01 02" 為關鍵字 當然 只有 01 沒有 02 時,就是一般資料啊 不然妳就只要用 01 當關鍵字就好了,幹嘛用 "01 02" ? |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
syntax大大,非常感謝!
因為是要判斷首'01',尾'02'同時符合條件資料.
而如果我們一開始就判斷StrMark := '02 01';那么如果是'01'開頭的資料就會第一組資料不對了.
比如說的:str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02'
後來我加上判斷
if leftstr(str,2) = '01' then str := '02 ' str;可以了.非常感謝!!!!!這么多大大關心回答我的問題.一分實在是不夠分,還請見應諒啦!感恩! |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: syntax大大,非常感謝! 因為是要判斷首'01',尾'02'同時符合條件資料. 而如果我們一開始就判斷StrMark := '02 01';那么如果是'01'開頭的資料就會第一組資料不對了. 比如說的:str:='01 12 B5 02 01 a6 B3 02 01 b6 B2 02 01 c6 B1 02 01 aa bb 02' 後來我加上判斷if leftstr(str,2) = '01' then str := '02 ' str;可以了.非常感謝!!!!!這么多大大關心回答我的問題.一分實在是不夠分,還請見應諒啦!感恩! >>< face="Verdana, Arial, Helvetica"> 這就是你的資料結構在設計上的問題了 這樣的設計,必須檢查 「首」 與 「尾」 有必要嗎? 同時你使用了一般符號來作為分隔用,這樣符號可以用來當資料的範圍就少了兩個,也就是說你的資料中不可以有 "01" 或 "02" 要是哪天你忘記,產生中的資料有 "01" 或 "02",而去被當成分隔符號而不是資料符號時,你的程式就會大亂 可以的話,建議你直接用 TStringList 的特性,可以少寫很多程式,直接用 Delphi 幫你設計好的,這本來就是 Delphi 的用意 而分隔符號就會是 #13#10,當然 TStringList 也有自己指定分隔符號的能力,所以是很方便的元件 甚至可以使用 Name = Value 的方式 這樣可以大大提升你的效率與簡化你的時間 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |