2014-11-02 18 views
-3

德爾福2010我需要有人來解釋從輸入框

我在出用戶在他們的名字和姓氏進入一個過程,然後我提取姓和名分成兩個不同的字符串提取這些字符串。有人可以解釋代碼中+1,3和pos的意義嗎?這些值何時需要改變?(例如爲什麼是+1而不是+2)謝謝

procedure TForm1.GenerateOnceoffPassword1Click(Sender: TObject); 
var 
suser, ssurname, sname, spassword : string; 
arrpassword : array[1..150] of string; 
begin 
inc(icounter); 
suser := inputbox('Enter name and surname','lower case ONLY',''); 
ssurname := copy(suser,pos(' ',suser)+1, 3); 
sname := copy(suser, 1, pos(' ',suser)-1); 
+4

所以,你會問每一個'Pos'和'Copy'用例?這不是浪費時間嗎?對你來說,瞭解這些功能是如何工作的會更好嗎? – TLama 2014-11-02 19:25:54

+0

我不明白的是爲什麼我們需要使用+1,3和1 = 1。根據我的理解,這意味着從第一個字符開始直到下一個字符結束。 (例如:從arrsurname的第一個字母到第三個字母拷貝(arrsurname [k],1,3)是否正確? – Lucas999 2014-11-02 19:33:18

+0

如果你不明白他們爲什麼會這樣,那麼**把他們拿走**並比較差異。應該沒有必要用手來回答這樣的簡單問題 - 做一些實驗來嘗試自己弄清楚事情。你在最後一個問題中得到了信息,但似乎沒有努力從答案中實際** **。 – 2014-11-02 23:16:45

回答

1

我假設你已經查閱了OLH或其他地方的Copy和Pos函數。所以,在你的q中處理你的觀點和評論:

a。 「copy(suser,pos('',suser)+1,3)」中的「+1」表示對Copy的調用應該在第一次出現由呼叫返回的suser中的空格字符後的第一個字符處開始到Pos()。如果Pos()在suser中找不到空格,它將返回0,因此複製將從suser的第一個字符開始。請參見下面的第2點。

b。 「3」表示複製應該從被告知從「pos()+ 1」開始複製的位置複製(最多)3個字符。我說「最多」,因爲這就是Copy()的工作方式,並且代碼中的任何內容都不會強制用戶在第一個空格後輸入一個包含3個或更多字符的字符串。似乎有點奇怪,姓應該限制在最多3個字符,順便說一句。

c。大概在你的評論中提到「1,= 1」,你實際上是指「1,= - 1」。無論如何,第二次調用Copy()時的「1」意思是「從suser的第一個字符開始複製」, 「pos() - 1」表示最多複製X個字符,其中X比調用pos()返回的值小1,換句話說,在第一次出現空格之前將字符從suser複製到1。如果suser中沒有空格,這將導致sname爲空。

注意:

  1. 當使用像波什()和複印件()函數來拆分串起來,這是一個好主意,進入使用TRIM()函數來消除任何的習慣來自子字符串的前導或尾隨空格。在點a。在上面,你寫的代碼忽略了用戶可能鍵入兩個(或更多)連續空格的可能性。

  2. 而不是提示用戶只使用小寫字母,最好養成寫代碼的習慣,而不管大小寫。顯然這不是你q中特定代碼的問題,但無論如何。

  3. 傳統上,Delphi中的字符串是基於1的,這意味着如果非空白的話,可以像訪問字符串那樣以一個起始索引爲1的數組來訪問該字符串。較新版本的編譯器比D2010更新,也就是說)對於像Android這樣的移動平臺,使用基於0的字符串,這會導致像你這樣的代碼的算法在未經修改的情況下使用會產生問題。