Autor |
Beitrag |
caia
Hält's aus hier
Beiträge: 2
|
Verfasst: Di 26.11.13 20:16
Hallo ich übe fleißig;
nun um ein Programm zum Sudoku lösen habe ich 81 Tlabel
Nun möchte ich per Schleife (for i = 1 to 81) diesen Labels eine Wert per Caption zuweisen.
Wie spreche ich die Label (Label1 bis Label81) in dieser Schleife an?
vielen Dank
caia Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 27.11.2013 um 12:15
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 26.11.13 20:26
Hallo und
caia hat folgendes geschrieben : | ... habe ich 81 Tlabel
Nun möchte ich per Schleife (for i = 1 to 81) diesen Labels eine Wert per Caption zuweisen. |
Das ist möglich über Findcomponent, z.B. mit
Delphi-Quelltext 1: 2: 3: 4:
| for i:=1 to 81 do begin TLabel(FindComponent('Label'+IntToStr([i]))).caption:= ... ; end; |
Dabei müssen die Namen Label1 bis Label81 sein. Insbesondere die Auswertung eines Sudokus mit 81 Labels wird aber eine Menge Tipparbeit.
Ich rate Dir daher lieber eine andere Komponente zu nutzen, z.B. ein Stringgrid. Dort kannst Du die einzelnen Zellen über ihre Koordinaten einfacher ansprechen.
Natürlich kannst Du auch 81 Labels während der Laufzeit auch als Feld selbst dynamisch erzeugen. Ich vermute aber, dass Du das nicht willst.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Di 26.11.13 20:30, insgesamt 1-mal bearbeitet
|
|
caia 
Hält's aus hier
Beiträge: 2
|
Verfasst: Di 26.11.13 22:34
Vielen Dank
nur in der Zeile
TLabel(FindComponent('Label'+IntToStr([i]))).caption:= ... ;
wird mir FindComponent als "nicht deklarierter Bezeichner" mit einer Fehlermeldung bedacht.
was mach ich falsch
Gruß
Caia
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 26.11.13 22:41
Hallo,
mein Fehler, Entschuldigung. Die eckigen Klammern waren zuviel, d.h.
Delphi-Quelltext 1:
| TLabel(FindComponent('Label'+IntToStr(i))).caption:= ... ; |
ist richtig. Ich hatte erst mit einem Feld getestet und vergessen die [] wegzumachen.
Kommt die Meldung, dass FindComponent "nicht deklariert" ist, immer noch, prüfe bitte, ob in der uses-Liste die Unit classes fehlt. Kann aber eigentlich nicht sein.
Gerade ist mir noch eine andere Idee gekommen. Am Besten Du zeigst mal den Quelltext der Methode, in der Du die Labels ansprechen willst.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
GuaAck
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Di 26.11.13 23:26
Hallo Mathmatiker,
ich generiere solche Felder gerne zur Laufzeit. Ich habe (auch für Soduku) einfach TEDitfelder genommen. Die kan man leicht einfärben, auf Ereignisse reagieren, Hints zuweisen usw.
Zur Laufzeit habe ich per MOD 3 immer einen kleine Abstand zwischen den Dreier-Blöcken eingebaut.
Unter eine Code Schnipsel dazu.
Gruß
GuaAck
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| PROCEDURE TForm1.FormCreate(Sender: TObject); CONST groesse = 24; zeichengroesse = 16; VAR i, j: integer; x0, X, Y: integer; sliste: t_sliste; b, anmerkung: STRING; BEGIN x0 := 340; Y := 90;
FOR i := 0 TO zeile_max DO BEGIN X := x0; FOR j := 0 TO spalte_max DO BEGIN gitter[i, j].e := TEdit.Create(Self); gitter[i, j].idnr := i * (spalte_max + 1) + j; gitter[i, j].e.Parent := Self; gitter[i, j].e.AutoSize := false; gitter[i, j].e.Font.Size := zeichengroesse; gitter[i, j].e.Width := groesse; gitter[i, j].e.Height := groesse; gitter[i, j].e.left := X; gitter[i, j].e.Top := Y; gitter[i, j].e.visible := true; gitter[i, j].e.OnExit := Edit1Click; gitter[i, j].e.OnKeyPress := Edit1KeyPress;
X := X + groesse + 2; IF (j MOD 3) = 2 THEN X := X + 5; END; Y := Y + groesse + 2; IF (i MOD 3) = 2 THEN Y := Y + 5; END; END; |
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 27.11.13 10:21
Gehört die Prozedur, in der du bist, wenn FindComponent nicht gefunden wird, denn zu deinem Formular?
Sprich: Delphi-Quelltext 1: 2: 3:
| procedure TFormX.MyMethod... begin ... | Oder ist es eine separate Prozedur: Delphi-Quelltext 1: 2: 3:
| procedure MyProcedure... begin ... | Denn wenn die Prozedur nicht als Methode zu deinem Formular gehört, kennt es das dort auch nicht. FindComponent ist jedoch eine Methode des Formulars.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mi 27.11.13 17:41
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| var Feld : Array [1..81] of TLabel;
implementation
procedure TForm1.Create;
var i : integer; begin for i := 1 to 81 do begin Feld[i] := TLabel(FindComponent('Label'+IntToStr(i))); end; end;
Feld[i].Caption := IntToStr(Wert); |
Wäre eine Alternative. Du belegst Das TLabel-Array beim Constructor Create mit den Komponenten der 81 Label und kannst dann die einzelnen Komponenten über dieses Array (kann auch zweidimensional sein) ansprechen.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 27.11.13 17:56
Oder man macht eine Kombination aus den bisherigen Vorschlägen (ungetestet):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var Feld: array[1..9, 1..9] of TLabel;
procedure TSomeForm.CreateLabels; const BREITE = 40; HOEHE = 30; var Row, Column: integer; NewLabel: TLabel; begin for Row := Low(Feld) to High(Feld) do for Column := Low(Feld[Row]) to High(Feld[Row]) do begin NewLabel := TLabel.Create(self); NewLabel.Parent := self; NewLabel.Left := Column * BREITE; NewLabel.Top := Row * HOEHE; Feld[Column, Row] := NewLabel; end; end; |
|
|