2014-06-05 63 views
-1

我想用r的元素填充最後三個Edit。不知何故,我的價值沒有改變。請看一看!Delphi中的數組實現xe6

procedure TForm1.Button1Click(Sender: TObject); 
    var 
     r: Array of Real; 
     cod,h,N,code,i: Integer; 
     value: Real; 
    begin 


     Val(Edit1.Text, cod, code); 
     Val(Edit2.Text, h, code); 
     Val(Edit3.Text, N, code); 

     Edit1.Text := Edit1.Text; 
     Edit2.Text := Edit2.Text; 
     Edit3.Text := Edit3.Text; 
     setlength(r, N); 
     i:= 0; 
     while i<= N do 
     begin 

      r[i] := cod/2 + h*i; 
      i := i + 1; 
     end; 

     Edit4.Text := formatfloat('#.0', r[0]); 
     Edit5.Text := formatfloat('#.0', r[1]); 
     Edit6.Text := formatfloat('#.0', r[2]); 
    end; 

    end. 
+0

唯一的原因,我可以看到'i'不改變將會是一個錯誤閱讀'N'。我可能會使用StrToInt來覆蓋val,儘管 –

+2

而不是供應代碼,它涉及到我們只能猜測其內容的GUI控件,請提供帶有硬編碼輸入的SSCCE。或者,我向你推薦優秀的調試器。 –

+0

@JamesBarrass:在這種情況下,如果結果不被忽略,TryStrToint可能會更好。在這裏,'code'從不檢查錯誤,它簡單地被忽略。我也不明白「Edit.Text:= Edit1.Text」應該做什麼,或者爲什麼使用while循環而不是for循環。 –

回答

2

您的代碼中包含大量無用的錯誤代碼。所以我會盡可能地解決這個問題。我加了一個前綴L所有本地變量

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Lr : Array[0..2] of Real; 
    Lcod, Lh : Integer; 
    LIdx : Integer; 
begin 

    // throws an exception if Edit1.Text cannot converted to an Integer 
    Lcod := StrToInt(Edit1.Text); 
    // throws an exception if Edit2.Text cannot converted to an Integer 
    Lh := StrToInt(Edit2.Text); 

    for LIdx := 0 to 2 do 
    Lr[LIdx] := Lcod/2 + Lh*LIdx; 

    Edit4.Text := FormatFloat('#.0', Lr[0]); 
    Edit5.Text := FormatFloat('#.0', Lr[1]); 
    Edit6.Text := FormatFloat('#.0', Lr[2]); 
end; 
+0

+1用於爲局部變量名稱加前綴。我用一個小寫字母作爲前綴,但我認爲這是很久以前我的camelCase同事的一個讓步。 –

+0

另外,'Real'數據類型有* long *因爲已被棄用 - 它當前映射到'double',所以應該使用它。 「Real」是一個奇怪的鴨子6字節浮點類型,在上個世紀的某個時候已經過時了。 –

+0

@SirRufo非常感謝,它的作品!順便說一句,我是新來的德爾福,只是有一些Python的初學者經驗,所以你可以建議一些幫助指南或類似的東西?我需要編寫一個完整的繞組模型,這將是一個很大的幫助。 謝謝。 – Vivek30