2013-07-13 75 views
0

我是Delphi的新手。Delphi7,創建許多具有相同屬性的控件

我想創建一個應用程序,其中將創建一些按鈕。聲明一個Tbuttons數組並且創建按鈕1並不是很令人滿意,因爲它令人困惑並且花費了很多時間。使用Command For也不令人滿意,因爲如果需要,我將無法更改某些按鈕的屬性,例如他們的位置。

所以我決定在TForm1類中聲明一個過程,它根據我發送給過程的屬性創建按鈕。但是,由於某種原因,它不工作(有沒有任何語法錯誤):

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ExtCtrls; 

type 
    TForm1 = class(TForm)      //Declaring the procedure 
    procedure CreateButton(Button: TButton; L: Integer; T: Integer); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    B1, B2: TForm1;   //Declaring controls 
implementation 

{$R *.dfm} 

procedure TForm1.CreateButton(Button: TButton; L: Integer; T: Integer); 
begin 
    Button:= TButton.Create(Self); 
    Button.Parent:= Self; 
    Button.Width:= 100; Button.Height:= 50; 
    Button.Left:= L; Button.Top:= T; 
end; 


procedure TForm1.FormCreate(Sender: TObject); 
Var 
    Button1, Button2: TButton; 
begin 
    B1.CreateButton(Button1, 100, 50);   //Sending properties 
    B2.CreateButton(Button2, 200, 40);   //Sending properties 
end; 

end. 
+0

你是什麼意思「不工作」?什麼時候 ?哪些錯誤?沒有人可以跳進你的頭,用你的眼睛看。請閱讀http://www.catb.org/~esr/faqs/smart-questions.html –

+1

在CreateButton中有兩個Button.Height ...將第二個更改爲Button.Top:= T; – Bill

+0

我是sry,我的意思是沒有創建按鈕1,2 –

回答

0

AS:與主題啓動通信中接聽長得太。總的結果是一樣http://pastebin.ca/2426760

procedure TForm1.CreateButton(VAR Button: TButton; CONST L: Integer; CONST T: Integer); 

也就是說Pascal語言的基礎知識,如何將參數傳遞給過程/函數。

http://docwiki.embarcadero.com/RADStudio/XE4/en/Parameters_(Delphi)

其實,我不認爲這是與參數
按鈕=零,這意味着「Button1的」和「將Button2」的值的任何問題都不會發送,但是

http://pastebin.ca/2427238


Kudoes比爾爲察覺THI秒。使用單獨的屬性來定位控件既效率低下,又容易出現複製粘貼錯誤。

使用第二個鏈接:

procedure TForm1.CreateButton(out Button: TButton; const L: Integer; const T: Integer); 
begin 
    Button:= TButton.Create(Self); 
    Button.Parent:= Self; 
    Button.SetBounds(L, T, 100, 50); 
end; 

其實你是做什麼用的指針到新創建的按鈕? 在你的代碼中,你只需要鬆開它們!

procedure TForm1.FormCreate(Sender: TObject); 
Var 
    Button1, Button2: TButton; 
begin 
... 
end; 

在這個代碼中,這些指針會丟失!如果你確實需要這些值 - 在程序之外傳遞它們。如果你不 - 不問他們 - http://en.wikipedia.org/wiki/YAGNIhttp://en.wikipedia.org/wiki/KISS_principle

Procedure TForm1.CreateButton(const L, T: Integer); 
begin 
    With TButton.Create(Self) do begin 
     Parent := Self; 
     SetBounds(L, T, 100, 50); 
     Caption := 'Caption at ' + IntToStr(T); 
     Name := 'Name at ' + IntToStr(L); 
    End; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    B1.CreateButton(100, 50);   //Sending properties 
    B2.CreateButton(200, 40);   //Sending properties 
end; 

我們的B1,B2 ......

你聲稱要在表格上的2個按鈕,但你的代碼顯示您嘗試在第二張表格上製作三條表格和一個按鈕,並在第三張表格上單擊一個按鈕。那麼你真的想要什麼?你是否檢查過B1和B2表單是否是在嘗試添加按鈕時創建的?

也許你真的想

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    SELF.CreateButton(100, 50);   //Sending properties 
    SELF.CreateButton(200, 40);   //Sending properties 
end; 

然後一起去DRY原則,並保持所有的變量在一個地方。

http://docwiki.embarcadero.com/Libraries/XE2/en/System.Types.TPoint

Procedure TForm1.CreateButtons(const a: array of TPoint); 
Var p: TPoint; 
Begin 
    for p in a do 
     CreateButton(p.x, p.y); 
End; 

type TPointDynArray = array of TPoint; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    CreateButtons(TPointDynArray.Create(
     Point(100,50), Point(200, 40))); 
end; 

榮譽給Delphi array initialization

之後,您可以隨時添加更多的座標數組,並保持一致。 好,打倒這個德爾福7個異能會 - 有些冗餘 - 編碼像

const BtnCnt = 2; 
     BtnLocations : array [1..BtnCnt] of TSize = (
     (cx: 100, cy: 50), (cx: 200, cy: 40) 
    ); 

Procedure TForm1.CreateButtons(const a: array of TSize); 
Var i: integer; 
Begin 
    for i := Low(a) to High(a) do 
     with a[i] do 
      CreateButton(cx, cy); 
End; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    CreateButtons(BtnLocations); 
end; 

不過,雖然德爾福5和Delphi的7是偉大的版本,他們是非常不合時宜的。我絕對建議你要麼upgradeing德爾福XE或更近,或側邁向CodeTyphon


TForm1 = class(TForm)      //Declaring the procedure 
    procedure CreateButton(Button: TButton; L: Integer; T: Integer); 

聲明,在窗體類的出版部分中的一個通用的過程也不是一個很好的風格。你最好在PRIVATE部分聲明它們。堅持「最低可見度」將有助於使相互依賴性得到控制。否則一年之內你的計劃就會變成意大利麪條混亂,你不能在不破壞其他一切的情況下改變任何東西。我現在正在做一個擁有10多年曆史的項目,我看到「一切都是公開的」後果非常明顯。這是一個很大的痛苦!

+0

其實我不認爲參數有問題。 –

+0

@NikolaidisDimitris那麼你有意將第一個參數聲明爲'CreateButton'? 「Button」參數從「FormCreate」轉移到「CreateButton」以及後者如何使用它? –

+0

B1和B2是2個按鈕。 OnFormCreate過程發送這2個按鈕的參數。 B1 Button的Name = Button1,left = 100,top = 50.因此,CreateButton的變量「Button,L,T」取值爲:Button:= Button,T:= 50 = Button.Top; L:= 100 = Button.Left –

相關問題