Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Edit-Felder => array of integer (https://www.delphipraxis.net/128303-edit-felder-%3D-array-integer.html)

Z4ppy 27. Jan 2009 16:31


Edit-Felder => array of integer
 
Ich programmiere zurzeit an einem Sudoku Solver ;)
Nun hab ich eine Variable Sudoku (array[1..9,1..9] of integer), die die gegebenen Zahlen enthalten soll. Eingegeben wird alles über 81 Editfelder :mrgreen: (Kommt mir jetzt nicht mit Kritik, ich solle es mit StringGrid machen, ich wills mit Editfeldern lösen ;))

Ich habe die Editfelder allerdings schlau benannt, nämlich nicht einfach Edit1, Edit2 usw., sondern so:
1. Zeile des Sudokus: Edit11, Edit12, Edit13, ... , Edit19
2. Zeile des Sudokus: Edit21, Edit22, Edit23, ... , Edit29
usw.

Nun zu meinem Problem:
Ich könnte das ganze natürlich so einspeichern:
Delphi-Quellcode:
Sudoku[1,1]:=StrToInt(Edit11.Text);
Sudoku[1,2]:=StrToInt(Edit12.Text);
{...}
Sudoku[9,8]:=StrToInt(Edit98.Text);
Sudoku[9,9]:=StrToInt(Edit99.Text);
Allerdings bin ich zu faul, das so zu lösen :D Gibts eine klügere Methode? z.B. mit einer for-Schleife like this:
Delphi-Quellcode:
for i:=1 to 9 do
  for j:=1 to 9 do
    Sudoku[i,j]:=StrToInt(Editij.Text);
Natürlich wird das so nicht funktionieren wegen dem "Editij", aber ich denke, ihr wisst, was ich meine ;)

MfG Z4ppy

PS.: Ja, ich weiss, ich muss testen ob in den Edit-Feldern ein Integer steht und das mach ich vorher auch, daher ist das StrToInt da sicher kein Problem ;)

himitsu 27. Jan 2009 16:37

Re: Edit-Felder => array of integer
 
Delphi-Referenz durchsuchenFindComponent / Hier im Forum suchenFindComponent

Z4ppy 27. Jan 2009 16:40

Re: Edit-Felder => array of integer
 
Wäre das dann so richtig?
Delphi-Quellcode:
for i:=1 to 9 do
  for j:=1 to 9 do
    Sudoku[i,j]:=StrToInt(TEdit(FindComponent('Edit'+IntToStr(i)+IntToStr(j))).Text);
MfG Z4ppy

nahpets 27. Jan 2009 16:41

Re: Edit-Felder => array of integer
 
Hallo,

mal ganz schmutzig hingeschrieben ohne Test...:
Delphi-Quellcode:
for i:=1 to 9 do
  for j:=1 to 9 do
    Sudoku[i,j] := StrToInt(TEdit(FindComponent('Edit' + IntToStr(i) + IntToStr(j))).Text);
[OT]Ihr seid mir heute zu schnell :cry: [/OT]

himitsu 27. Jan 2009 16:43

Re: Edit-Felder => array of integer
 
jupp, oder
Delphi-Quellcode:
Sudoku[i,j]:=StrToInt(TEdit(FindComponent(Format('Edit%d%d', [i, j]))).Text);
eventuell noch 'ne Fehlerbahandlung z.B. ala StrToIntDef/TryStrToInt

Z4ppy 27. Jan 2009 16:46

Re: Edit-Felder => array of integer
 
Alles klar, danke für die schnelle Hilfe :)

MfG Z4ppy

PS.: Das mit dem Testen is schon klar :)

Z4ppy 29. Jan 2009 08:31

Re: Edit-Felder => array of integer
 
Nochmal hierzu: Wie kann man FindComponent auch ausserhalb der Form1.Create benutzen? Delphi 7 meckert dann, dass er die Funktion nicht kennt -.-

MfG Z4ppy

globetrotter77 29. Jan 2009 09:53

Re: Edit-Felder => array of integer
 
wie wär's denn ungefähr so:

Delphi-Quellcode:
const maxidx = 9;

type
  TForm1 = class(TForm)
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    ...
    Edit21: TEdit;
    Edit22: TEdit;
    Edit23: TEdit;
    ...
    Edit91: TEdit;
    Edit92: TEdit;
    Edit93: TEdit;
    ...
    Edit99: TEdit;

    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    EditCompNo: array[1..maxidx,1..maxidx] of integer;
    function myEditName(i,j: integer): string;
    function myEdit(i,j: integer): TEdit;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.myEditName(i, j: integer): string;
begin
  Result:='Edit'+IntToStr(i)+IntToStr(j);
end;

function TForm1.myEdit(i, j: integer): TEdit;
begin
  Result:=Components[EditCompNo[i,j]] as TEdit;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j: Integer;
    Editname: string;
begin
  for i:=1 to maxidx do
  begin
    for j:=1 to maxidx do
    begin
      Editname:=myEditName(i,j);
      EditCompNo[i,j]:=FindComponent(Editname).ComponentIndex;
    end;
  end;

end;

procedure TForm1.FormShow(Sender: TObject);
var i,j: Integer;
begin
  for i:=1 to maxidx do
    for j:=1 to maxidx do
      myEdit(i,j).Text:=IntToStr(i)+IntToStr(j);
end;
nur so als Gedanke ... und statt die Felder einzeln hinzuzappeln, könntest du dir auch ne Routine schreiben, um ein TEdit beim Create zu erzeugen. Damit könntest du dann alle Edit-Felder in einem Rutsch mit allen Eigenschaften definieren, positionieren und ganz nebenbei auch EditCompNo belegen.

mit myEdit(i,j) hast du dann immer Zugriff auf die Felder

uligerhardt 29. Jan 2009 09:59

Re: Edit-Felder => array of integer
 
Zitat:

Zitat von globetrotter77
wie wär's denn ungefähr so:

<snip>

nur so als Gedanke ... und statt die Felder einzeln hinzuzappeln, könntest du dir auch ne Routine schreiben, um ein TEdit beim Create zu erzeugen. Damit könntest du dann alle Edit-Felder in einem Rutsch mit allen Eigenschaften definieren, positionieren und ganz nebenbei auch EditCompNo belegen.

mit myEdit(i,j) hast du dann immer Zugriff auf die Felder

:thumb:

Stutz 29. Jan 2009 10:07

Re: Edit-Felder => array of integer
 
ein dynamisches Array hätte auch den Vorteil dass du mal ein "Hexadoku"(also 16X16) oder ein 4x4 Sudoku machen könntest ohne gleich eine neue Form schreiben zu müssen -> is flexibler

(nur so als Anregung)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz