2012-10-14 14 views
2

我想編寫一個數獨解算器,我想控制81個TEdit控件數組,但他們的名字是Edit1Edit2Edit3代替Edit[1]Edit[2]控制多個TEdits作爲陣列

我不要爲所有81個控件單獨鍵入OnChange事件處理程序。

我該如何解決這個問題?

+3

爲什麼不使用單個9x9 TStringGrid呢? :-) –

+0

或者如果花式圖片是必須的,我會使用TButton + TPopupMenu來更改數字。那些智能手機。 –

回答

5

您可以動態創建的編輯。

一定要設置的所有者和編輯框的父。

procedure TForm1.OnCreate(Sender: TObject); 
var 
    x, y : Integer; 
begin 
    for y := 1 to 9 do begin 
    for x := 1 to 9 do begin 
     FEdit[x,y] := TEdit.Create(self); 
     FEdit[x,y].Parent := self; 
     FEdit[x,y].Left := // function based on x 
     FEdit[x,y].Top := // function based on y 
     FEdit[x,y].Name := // function based on x and y 
     FEdit[x,y].Width  // any value you like 
     FEdit[x,y].Height // any value you like 
     FEdit[x,y].Tag = 10*y + x; 
     FEdit[x,y].OnChange = OnHandleChange; 
    end; 
    end; 
end; 

procedure TForm1.OnHandleChange(Sender: TObject); 
var 
    x,y : Integer; 
begin 
    if not Sender is TEdit then Exit; 
    y := TEdit(Sender).Tag div 10; 
    x := TEdit(Sender).Tag mod 10; 
    // Add check if x and y are valid 

// You now know that FEdit[x,y] is changed and you can handle accordingly. 
end; 

FEdit是窗體的二維數組字段。

+0

你錯過了展示如何通常處理'OnChange'事件(我猜是什麼問題)以及如何從'OnChange'事件發送者的'FEdit'數組座標獲得。 – TLama

+1

添加了一個事件處理程序。 –

+1

只是一個小提示:運行時生成的組件不必獲取'Name'。因爲無論你給它什麼名字,你都不會再使用它;沒有變量,數組元素現在是它的引用。 – NGLN

2

你可以做這樣的事情:

var 
    myedit: array[1..81] of TEdit; 
    i: integer; 
... 
begin 
... 
for i := 1 to 81 do begin 
    myedit[i] := TEdit.Create(form1); 
    with myedit[i] do begin 
    width := 50; 
    top := 50 + (i * 55); 
    left := 50; 
    text := 'mytext '+inttostr(i); 
    parent := form1; 
    // more properties... 
    end; 
    end; 
... 

您可以創建任何你想要動態地使用類似的代碼。

+2

哇,這將是一個多層數獨:-) – TLama

+0

@TLama,很好的猜測;) – Wh1T3h4Ck5

+0

我想你的意思是:用myedit [我]。 –

6

你不需要一個做一個。 您可以使用shft-click或ctrl-drag選擇一個窗體上的多個控件,並通過矩形選擇它們。

所以一般:

  • 使用Object Inspector來設置onChange處理一個編輯
  • 可選其重命名爲一個更一般的名稱使用對象檢查
  • 選擇上的所有其他編輯形式
  • 選擇您剛剛使用對象檢查創建的處理程序。 它將被分配給您選擇的所有編輯。
+0

我同意這種做法,表單控件可以共享相同的事件處理程序。 –

2

除了使用常用的OnChange事件處理程序並創建編輯運行時,還可以使用designtime製作的控件填充數組。

正如我最近在this answer解釋,你可以添加設計時做出控制,以您的一維或二維數組:用FindComponent搜索他們的名字,有一個環形的Tag屬性搜索它們,或者通過手動將其添加到該數組通過鍵入他們的81個變量。

+0

我設法寫這些,但這是另一個問題,「在模塊中的地址訪問衝突」。代碼: procedure TForm1.OnHandleChange(Sender:TObject); var bx,by,x,y,len:Integer; 開始 ...如果不是(MyEdit [bx,by,文本:= ''; .... end; 因此,我搜索互聯網1小時,這似乎是一個共同的問題。 –

+1

@Hasan這是一個完全不同的問題(如何實現一個特定的解決方案?),這在單個評論中很難解決。請在新的問題中提出。 – NGLN