Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: Verständnisfrage zu Formular-Variable

  Alt 29. Okt 2006, 09:03
Hallo Jürgen,

ich bin mir nicht sicher, ob ich Dein Problem richtig verstanden habe; aber auf jeden Fall hast Du folgende Probleme an den folgenden Stellen:
Delphi-Quellcode:
for i := 0 to 11 - 1 do
  begin
    Labels[i] := NewLabel.Create;
    with Labels[i] do
    begin
      Text := 'Label ' + i.ToString;
      Left := 20;
      Top := 20 + i*40;
      BackColor := System.Drawing.Color.White;
      BorderStyle := System.Windows.Forms.BorderStyle.Fixed3D;
      Self.Controls.Add(Labels[i]);
      Include(Labels[i].Click, Self.Dummy_Click);
    end;
  end; // for i := 0 to 11 - 1 do
  StartLabels := Labels;
  StartKonfig := Labels;
  • Mit NewLabel.Create erzeugst Du ein Label, dessen Adresse (!) in Labels[i] gespeichert wird. (Der Compiler registriert wegen der Deklaration zusätzlich, dass diese Adresse auf ein Label verweist.)
  • Für das Array Labels wird automatisch der Platz für n Adressen reserviert; dieser Platz erhält selbst eine eigene Adresse.
  • Mit StartLabels := Labels; teilst Du dem Programm nur mit, dass unter der Adresse der Variablen StartLabels die Inhalte der Variablen Labels zu finden sind.
  • Mit StartKonfig := Labels; teilst Du dem Programm nur mit, dass unter der Adresse der Variablen StartKonfig die Inhalte der Variablen Labels zu finden sind.
Unter allen drei Array-Variablen finden sich also die gleichen 11 Labels. Wenn Du eines dieser Labels änderst, findest Du die Änderungen bei allen drei Array-Variablen wieder.

Für weitere Erläuterungen verweise ich Dich auf die [oh]NET-Doku:[/oh]
  • Array.Clone gibt Dir nähere Informationen zu Deinem Verfahren.
  • Array.Copy liefert (ohne dass ich es genauer durchdacht habe) wahrscheinlich wirklich die von Dir gewünschte Kopie.
Generell sind auch für Dein Verfahren die Klassen Array und ArrayList besser geeignet. Leider sind sie unter NET 1.1 von allgemeiner Struktur, und Du musst immer ein cast() anwenden. (Die generischen Klassen von NET 2.0 bieten mehr Möglichkeiten.)

Viel Erfolg! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat