Autor Beitrag
caia
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 27.11.2013 um 12:15
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 26.11.13 20:26 
Hallo und :welcome:
user profile iconcaia hat folgendes geschrieben Zum zitierten Posting springen:
... 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 26.11.13 22:41 
Hallo,
mein Fehler, Entschuldigung. Die eckigen Klammern waren zuviel, d.h.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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

ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.11.13 10:21 
Gehört die Prozedur, in der du bist, wenn FindComponent nicht gefunden wird, denn zu deinem Formular?
Sprich:
ausblenden Delphi-Quelltext
1:
2:
3:
procedure TFormX.MyMethod...
begin
...
Oder ist es eine separate Prozedur:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 27.11.13 17:41 
ausblenden 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..81of 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;





// Belegung

//   Wert = zu speichernder Wert, kann auch ein Array sein ...
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 27.11.13 17:56 
Oder man macht eine Kombination aus den bisherigen Vorschlägen (ungetestet):
ausblenden 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..91..9of 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;