TStringlist 真難用 |
尚未結案
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
大家好,
我以為 TStringlist 是由很多 string 組合起來的一長串,
如果是,則每一個元素就是一個 string,可是事實並非如此。
我在 Form 的 OnKeyPress 處理輸入的字元: 是可見的字元則: stringlist[y] := stringlist[y] key; // 加在最後 是倒退鍵則:
Delete ( stringlist[y], Length(stringlist[y] -1 , 1);
// 刪除最後一個字元 可是 Delphi 回應說 stringlist[y] 是 constant object 不可以成為
Delete 的引數。 然後我就隨便宣告 var s : string = 'abcde';
再照樣 Delete ( s , Length(s) -1 , 1); // 這樣就可以通過編譯。 請問:
1.如果 TStringlist 不能當 Delphi 眾多內定字串函數的引數,那它根本
就沒甚麼用,只能當做資料展示而已。
2.有辦法對 TStringlist 裡面的 string 運用Delphi 內定的字串處理函數嗎? 謝謝
|
likush
高階會員 發表:5 回覆:235 積分:103 註冊:2002-10-08 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
cancer 你好 ●Delete的宣告如下:
procedure Delete(var S: string; Index, Count:Integer);
Var S: String ; S是個可變參數(前面多個Var) ●StringList[n] 相當於StringList.Strings[n]的縮寫,所以它是物件的屬性,而不是變數。 ●綜合以上說明:把物件的屬性當成可變參數,delphi 是不允許的(反過來說就是可變參數不能接受物件的屬性為其實際參數),原因我不清楚。
引言: 1.如果 TStringlist 不能當 Delphi 眾多內定字串函數的引數,那它根本 就沒甚麼用,只能當做資料展示而已。若因此而說它不好用,還真是冤枉它了,TStringList存在的意義並不在於此,它的功用在於字串串列的管理(字串的儲存、搜尋、排序及串列存檔讀檔等功能以及作為其他需要此功能的物件的基礎物件屬性) 了解每個類別(物件)擅長的特點及不足的地方,並善用其特長避開其不足,這是設計師的責任啊! 引言: 2.有辦法對 TStringlist 裡面的 string 運用Delphi 內定的字串處理函數嗎? 你可以改用Copy的方式來達到相同的目的: StringList[y] := Copy(StringList[y],1,StringList[y]-1);_______________________________________ 深藍的魚,祝您好運..........連連 |
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
各位好,
一次回應兩位大大,首先 Likush 大大,我是打算用 Delphi 寫個文字編輯
器來玩玩,寫文字編輯器是磨練程式功力的好對象,因為這都要自己處理鍵
盤、滑鼠事件,還要輸出文字,剪下、複製、貼上,Menu、popup menu、
toolbar ...等等很多很多的事情要自己親手撰寫,搞不定比寫資料庫程式
還要難,而且我還希望文字像 Delphi 程式碼視窗一樣能夠按照不同的識別
字以不同的顏色來顯示,但又不必儲存文字的顏色值。我試過以 notepad
打開 Delphi 的 .dpr 檔,一樣看到內容,所以 Delphi 並不是以 RichEdit
之類的格式來儲存程式檔案。
我一開始的想法就是以最直覺的方式來做,把文字編輯器的內容放在
TStringlist 裡面,以 #13 Carriage Return 字元當做分隔字元區分
TStringlist 每個 String,這算是最簡單直接的方法了吧!我也想不出還
有甚麼現成的類別可用了。 Chance36 大大,文字編輯器中,如果使用者每按 Back space 鍵一次,就得
呼叫 Copy() 一次,效率可能不會很好吧?尤其是一列的總字元數太多的時
候,就更明顯了。而且我希望我的文字編輯器能對我自訂的保留字以不同的
顏色來顯示,也就是說,每按一次 Back space 程式都得重新分析游標所在
的那一列,看看原本的保留字是否已經不再是保留字,或者原本不是保留字
的卻變成保留字。如果刪除字串最後一個字元就要呼叫 copy()一次,那麼
刪除字串中間的某一個字元,就必須呼叫 copy() 兩次了,因為前半段要
用 Copy,後半段又要用 Copy。
現階段我只想到一個辦法,就是先宣告一個 String, 當游標移到某一列後,
就把該列的全部字元 Copy 到這個 String,使用者對該列的任何改變,都
對只針對該 String,當使用者把游標移到其他列後,就把該 String 直接
設給 TStringlist 的某一索引,不必用到 Copy ,這可能會比較快,當然
如果使用者有事無事就一直把游標移上移下,那就會慢下來了。 謝謝大大們
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 針對你說利用 copy 會導致效能不好的問題, 弟提出來做個討論. 在刪去最後一個字元上, 使用 delete 相對於 copy 的變通解法, 會有很好的效能沒錯, 但在加入字元時, 不也是用 stringlist[y] := stringlist[y] key 這種整個取出加完後再寫回的方法嗎? 效能也是不好的啊. 對於這個部分可能沒有比較理想的作法, 除非改用固定長度字串, 但也會面臨字串大於該固定長度時的處理, 最後你會發現, 還是這樣就 ok 了, 相同的, 用 copy 來解決, 也是一種變通的方式啊, 當然, 最後你選擇使用暫存的 string 來解決, 也是很好的方法囉, 不過對於加字元進去或減字元出來這種處理上, 要有最好的效能, 還是用固定長度字串處理才有較佳的結果. 以上拙見供參考.
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
timhuang 大大,謝謝您參與討論,
最後我找到了折衷方法,是這樣的,
TStringList[x] 雖然不能作為Delete() 都 Insert() 引數,
但可以
var s : string;
s : stringlist[x];
Delete(s, 3, 3); // 或任何字串處理函式。
stringlist[x] := s; 如果改用 Copy() 就麻煩了:
stringlist[x] := Copy(stringlist[x], 1, 2)
Copy(stringlist[x], 4, Length(stringlist[x]) - 4 1);
程式碼看起來又夠囉嗦。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |