我想編寫一個數獨解算器,我想控制81個TEdit
控件數組,但他們的名字是Edit1
,Edit2
,Edit3
代替Edit[1]
,Edit[2]
等控制多個TEdits作爲陣列
我不要爲所有81個控件單獨鍵入OnChange
事件處理程序。
我該如何解決這個問題?
我想編寫一個數獨解算器,我想控制81個TEdit
控件數組,但他們的名字是Edit1
,Edit2
,Edit3
代替Edit[1]
,Edit[2]
等控制多個TEdits作爲陣列
我不要爲所有81個控件單獨鍵入OnChange
事件處理程序。
我該如何解決這個問題?
您可以動態創建的編輯。
一定要設置的所有者和編輯框的父。
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是窗體的二維數組字段。
你可以做這樣的事情:
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;
...
您可以創建任何你想要動態地使用類似的代碼。
你不需要一個做一個。 您可以使用shft-click或ctrl-drag選擇一個窗體上的多個控件,並通過矩形選擇它們。
所以一般:
我同意這種做法,表單控件可以共享相同的事件處理程序。 –
除了使用常用的OnChange
事件處理程序並創建編輯運行時,還可以使用designtime製作的控件填充數組。
正如我最近在this answer解釋,你可以添加設計時做出控制,以您的一維或二維數組:用FindComponent
搜索他們的名字,有一個環形的Tag
屬性搜索它們,或者通過手動將其添加到該數組通過鍵入他們的81個變量。
我設法寫這些,但這是另一個問題,「在模塊中的地址訪問衝突」。代碼: procedure TForm1.OnHandleChange(Sender:TObject); var bx,by,x,y,len:Integer; 開始 ...如果不是(MyEdit [bx,by,文本:= ''; .... end; 因此,我搜索互聯網1小時,這似乎是一個共同的問題。 –
@Hasan這是一個完全不同的問題(如何實現一個特定的解決方案?),這在單個評論中很難解決。請在新的問題中提出。 – NGLN
爲什麼不使用單個9x9 TStringGrid呢? :-) –
或者如果花式圖片是必須的,我會使用TButton + TPopupMenu來更改數字。那些智能手機。 –