2013-02-26 49 views
0

我想添加一個附件,並且每次添加附件時都會增加表單的長度,以便爲包含標籤附件信息的行騰出空間,而某些16X16圖像。爲此,我選擇使用動態數組(不確定是否最好)。每次添加附件時,我都想創建這些對象的新實例。我的代碼似乎不工作。以下代碼有什麼問題?在delphi中遇到動態數組timage和tlabel的問題

procedure TVisionMail.AddAttachment(FileString: String); 
var 
I: Integer; 
begin 
    AttCount := AttCount + 1; // increment attachment count 

    //set attachment file name 
    if (AttCount <> 0) and (edAttachment.Text <> '') then 
     edAttachment.text := edAttachment.text + ';'; 
    edAttachment.text := edAttachment.text + FileString; 

    //move objects position down to allow space for attachment line 
    VisionMail.Height := VisionMail.Height + 25; 
    Panel1.Height  := Panel1.Height + 25; 
    btnSend.Top  := btnSend.Top + 25; 
    btnExit.Top  := btnExit.Top + 25; 
    StatusMemo.Top := StatusMemo.Top + 25; 
    Memo1.Top   := Memo1.Top + 25; 
    lblBody.Top  := lblBody.Top + 25; 

     //Allocate memory for arrays 
     SetLength(newImg, AttCount); 
     SetLength(newlbl, AttCount); 
     SetLength(newDel, AttCount); 
     SetLength(newPin, AttCount); 

     //create new instance and set parents, positions, color, events 
     newImg[AttCount]:= TImage.Create(VisionMail); 
     with newImg[AttCount] do 
     begin 
       Parent  := Panel1; 
       Top  := Memo1.Top - 25; 
       Left  := 408; 
       Height  := 16; 
       Width  := 16; 
     end; 
     newlbl[AttCount]:= TLabel.Create(VisionMail); 
     with newlbl[AttCount] do 
     begin 
       Parent  := Panel1; 
       Top  := newImg[I].Top + 2; 
       Left  := 397; 
       Height  := 3; 
       Width  := 13; 
       BiDiMode := bdRightToLeft; 
     end; 
     newDel[AttCount] := TAdvToolButton.Create(VisionMail); 
     with newDel[AttCount] do 
     begin 
       Parent  := Panel1; 
       Top   := newImg[I].Top; 
       Left   := 440; 
       Height  := 16; 
       Width  := 16; 
       color  := clBtnFace; 
       colorChecked := clBtnFace; 
       colorDown := clBtnFace; 
       colorHot  := clBtnFace; 
       OnClick  := btnDelAttClick; 
       OnMouseEnter := btnDelAttMouseEnter; 
       OnMouseLeave := btnDelAttMouseLeave; 
     end; 
     newPin[AttCount] := TImage.Create(VisionMail); 
     with newDel[AttCount] do 
     begin 
       Parent  := Panel1; 
       Top  := newImg[I].Top; 
       Left  := 425; 
       Height  := 16; 
       Width  := 16; 
     end; 
     //get Icon for extension of file 
     lstIcons.GetBitmap(GetIcon(ExtractFileExt 
          (OpenDialog1.FileName)), 
          newImg[AttCount].Picture.Bitmap); 
     newlbl[AttCount].Caption := ExtractFileName(FileString); 

end; 
+0

你的數據結構都是錯誤的。你需要一個記錄來保存4個組件。然後'TList '保存所有記錄。 – 2013-02-26 10:58:53

+0

現在,你也說「我的代碼似乎不工作」。這對我們沒有用處。你必須描述它是如何失敗的。準確地解釋你對代碼的期望,以及它未能達到預期的方式。這會花更多的時間。並節省我們的時間。這是必須的。 – 2013-02-26 11:08:31

回答

1

最明顯的缺陷是你正在註銷所有數組的末尾。例如,你寫

SetLength(newImg, AttCount); 

,這意味着,爲newImg有效指數0AttCount-1包容性。但你寫

newImg[AttCount] := ... 

,這是一個出界訪問,因爲最後一個索引是AttCount-1。你對所有的數組訪問都做同樣的事情。

如果您在啓用範圍檢查的情況下編譯,編譯器將生成一個運行時錯誤,解釋您做錯了什麼。

我個人認爲你會使用記錄來保存你的四個組成部分是更好:

TAttachmentControls = record 
    Img: TImage; 
    Lbl: TLabel; 
    .. etc. 
end; 

,並使用TList<TAttachmentControls>爲你的容器。