2014-02-16 23 views
-1

我試圖在我的程序中使用類。編輯類中的成員變量時出現錯誤

TStack = Class 
Public 
    constructor Create; Overload; 
    Procedure Add(Frm:TForm); 
    Procedure Remove(); 
    Procedure Do_Close; 

Private 
    List : Array[1..Max_Forms] of Rec; 
    Count : Byte; 
End; 

構造:

constructor TStack.Create; 
begin 
    Self.Count := 0; 
end; 

Procedure TStack.Add(Frm:TForm); 
begin 
    Inc(Self.Count); 
    List[Count].Form  := @Frm; 
    List[Count].Width := Frm.Width; 
    List[Count].Height := Frm.Height; 
    List[Count].left  := Frm.Left; 
    List[Count].Top  := Frm.Top; 
end; 

我不能改變計數變量的值!它會導致運行時錯誤:訪問衝突....寫入地址000001E4

什麼問題?

有關詳情:

我想要一個指針給每個窗體保存在這樣的結構:

Rec = Record 
     Form  : ^TForm; 
     Maximized : Boolean; 
     Width, 
     Height, 
     left, 
     Top  : Integer; 
    End; 

然後

Procedure TStack.Do_Close; 
var 
    i  : integer; 
    MyForm : TForm; 
begin 
i := .....some code here.......; 
MyForm := @List[i].Form; 
ShowMessage('I will close '+MyForm.Caption); 
MyForm.Close; 
end; 

,並調用構造函數這樣初始化「計數」:

Stack.Create; 
+0

哪一行崩潰了,在構造函數中還是在Add中? – Blorgbeard

+0

很多問題。可能傷害你的那個是你沒有正確創建對象。你沒有顯示該代碼。請做。使用整數來計數,而不是字節。不要使用靜態數組。使用動態數組或'TList '。從0開始索引數組。不要取本地變量的地址。 –

+0

是的,'Stack.create'不工作,但'stack = Tstack.create'解決了一些問題(爲什麼?!)!爲什麼我不應該使用靜態數組?你是什​​麼意思關於「不要接受局部變量的地址」!謝謝你們:) – Jessica

回答

4

正如在註釋中描述您正試圖創建的對象是這樣的:

var 
    Stack: TStack; 
.... 
Stack.Create; 

這是一個經典的錯誤,一個我們都犯。您正在調用未初始化的實例變量的方法。

爲了實例,你需要寫一個類:

Stack := TStack.Create; 

最重要的是我有如下意見:

  1. 數組從零開始使用索引。除了不合時宜的字符串之外,這是德爾福各處的慣例。甚至在更新的版本中,情況正在改變。
  2. 除非您有足夠的理由這樣做,否則不要將靜態數組用於堆棧。你只會冒着空間不足的風險。或者分配比你需要的更多的內存。使用動態數組。
  3. 而不是動態數組,您可以使用TList<T>
  4. 即便如此,人們還是會奇怪爲什麼當你有完美的TStack<T>時,你正在製作自己的班級。
  5. 您在堆棧中存儲本地變量的地址。在TStack.Add中,您將@Frm添加到容器中。只要TStack.Add返回,@Frm是沒有意義的。這是因爲Frm是一個局部變量,它的生命終止於擁有它的函數返回。我想你想拿一份Frm

更詳細地拿起項目5,你的記錄聲明如下:

Rec = Record 
    Form  : ^TForm; 
    Maximized : Boolean; 
    Width, 
    Height, 
    left, 
    Top  : Integer; 
End; 

它是使用^TForm一個錯誤。這是一個指向變量的指針,該變量持有指向對象的指針。這是兩個層面的間接,一個太多了。您必須聲明Form字段的類型爲TForm。我建議你修改Delphi對象引用變量的工作方式。 Delphi類是所謂的參考類型。 TMyClass類型的變量,其中TMyClassclass(...)已經是一個指針。當您使用.運算符訪問成員時,語言會自動取消引用該指針。

相關問題