Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zur Laufzeit erstellte Komponenten im Array verwalten (https://www.delphipraxis.net/181513-zur-laufzeit-erstellte-komponenten-im-array-verwalten.html)

Rued 21. Aug 2014 13:34

Zur Laufzeit erstellte Komponenten im Array verwalten
 
Hallo!

Ich weise 13 zur Laufzeit erstellte RadioGroups einem Array[1..13] zu, um mir Findcomponent zu sparen. Ebenso verfahre ich mit 13 Checkboxen, die einem Array[1..13] zugewiesen werden. Bei den Checkboxen gibt es kein Problem, ich kann auf alle zugreifen. Bei den RadioGroups wird mit der 13. Zuweisung das erste Feld des Array eliminiert, so dass Array[1] nil ist. Anders formuliert, würde die Schleife bei 12 enden, würde der Zugriff auf alle dem Array zugewiesenen Komponenten funktionieren, mit Nummer 13 wird aber Komponente Nummer 1 "rausgekegelt". Nachtrag: Letzter Satz stimmt so nicht. Habe die Schleife jetzt `mal bis 12 gezogen, auch da wurde Array[1] mit der letzten Zuweisung "rausgekegelt".

Ich habe so etwas noch nicht erlebt. Dasselbe passiert übrigens auch, wenn ich das Array auf 14 dimensioniere. Bis zur Klärung habe ich mir so geholfen, dass ich Array[1] puffer und nach dem Durchlauf der Schleife dem Array[1] den Puffer zuweise.

Hat da jemand einen Tipp?

Gruß

Rüd

himitsu 21. Aug 2014 13:45

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Das Wichtigste: Wie sieht dein Code aus und wie soll dir jemand ohne das helfen können?

Hast du mal die Bereichsprüfung in den Projektoptionen aktiviert?

Und was sagt der Debugger, wenn du mal nach dem Wert schaust, während sich das Array langsam füllt?

Dejan Vu 21. Aug 2014 14:15

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
<Glaskugel mode="on">
Die beiden Arrays liegen in der Deklaration hintereinander, Du vertust dich bei deinem Arrayindex um +1 und anstatt auf das letzte Element des ersten Arrays zuzugreifen, greifst Du auf das erste Element des zweiten Arrays zu:
Delphi-Quellcode:
var
  Array1 : Array [0..12] Of TFoo;
  Array2 : Array [0..12] Of TFoo;

begin
  Array1[13] := Bar; // Hier wird Array2[0] beschrieben!
</Glaskugel>

PS: Hör auf himitsu.

Rued 21. Aug 2014 15:36

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Das ist der betreffende Code, der mit der Krücke klappt. TFrfrTippFeld ist ein Frame, deren Komponenten über Findcomponent angesprochen werden.

Delphi-Quellcode:
var
  FMain: TFMain;
  PSpiele:array[1..11] of TPanel;
  Edits:array[1..11,0..3] of TEdit;
  RGTipps:array[1..11] of TRadioGroup;
  cbTipps:array[1..11] of TCheckBox;
implementation
...........
...........
procedure TFMain.FormCreate(Sender: TObject);
var
    FRA:TFrame;
    a,b:integer;
    RGPuf:TRadioGroup;
begin
 for a := 1 to 11 do begin

 FRA := TFrfrTippFeld.Create(FMain);

   with FRA do begin
   left := 0;
   top := 10+ (a-1)*51;
   name := 'frSpiel'+inttostr(a);
   height := 45;
   width := 900;
   end;
   FRA.parent := PFeld;
   PSpiele[a] := TPanel(Fra.findcomponent('PSpiel'));
   PSpiele[a].Color := MitFarben[1];
   TLabel(Fra.findcomponent('LNr')).Caption := 'Spiel '+inttostr(a);
   for b := 0 to 4 do Edits[a,b] := TEdit(Fra.findcomponent('Edit'+inttostr(b)));
   RGTipps[a] := TRadioGroup(Fra.findcomponent('RGTipp'));
   cbTipps[a] := TCheckBox(Fra.findcomponent('cbTippen'));
   if a = 1 then RGPuf := RGTipps[a];                         //Krücke Teil 1
end;
   RGTipps[1] := RGPuf;                                      ////Krücke Teil 2 

...........
...........
Zitat:

Und was sagt der Debugger, wenn du mal nach dem Wert schaust, während sich das Array langsam füllt?
Wie ich schrieb, klappt alles bis zur letzten Zuweisung. Heißt, das Array füllt sich korrekt - dann kommt die letzte Zuweisung, auch die klappt, aber dann ist RGTipps[1] = nil.

Gruß

Rüd

DeddyH 21. Aug 2014 15:40

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Zitat:

Delphi-Quellcode:
Edits:array[1..11,0..3] of TEdit;

Zitat:

Delphi-Quellcode:
for b := 0 to 4 do Edits[a,b] := TEdit(Fra.findcomponent('Edit'+inttostr(b)));

Ich würde an Deiner Stelle immer mit High() und Low() arbeiten, dann kann Dir so etwas nicht passieren. Außerdem ist es kein Fehler, die Bereichsprüfung zu aktivieren, aber das wurde IIRC bereits erwähnt.

baumina 21. Aug 2014 15:44

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Auf den ersten Blick :

Delphi-Quellcode:
var
  Edits:array[1..11,0..3] of TEdit;    // <- 0..3

...........
...........
   // aber 0..4 -> PENG
   for b := 0 to 4 do Edits[a,b] := TEdit(Fra.findcomponent('Edit'+inttostr(b)));
...........
...........
EDIT : Hach, immer isser schneller *wein

DeddyH 21. Aug 2014 15:44

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Hast aber lange geblickt, wie? :zwinker:

baumina 21. Aug 2014 15:46

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Irgendwas hat an meinem Text nicht gestimmt, der hat immer behauptet dass mein Text zu kurz sei und dann musst ichs x-mal abändern *schnief ... wertvolle Zeit verloren dadurch.

DeddyH 21. Aug 2014 15:50

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Die Welt ist eben hart, aber ungerecht. Nächstes Mal bist Du dann wieder schneller *tröst*

himitsu 21. Aug 2014 16:13

AW: Zur Laufzeit erstellte Komponenten im Array verwalten
 
Und am Ende läuft es auf Eines hinaus ... hätte man mal probehalber die Bereichsprüfung aktiviert
oder sich zumindestens mal die Array-Bereiche mit den Zugriffen verglichen, dann wäre das Problem "sofort" aufgefallen.
Man hätte auch mal mit dem Debugger schauen können und dann wäre da eventuell aufgefallen, daß sich der Wert beim Zugrüff auf das andere Array ändert.


Codeformatierung = na ja
Und warum gibt es hier so viele globale Variablen? (die gehören doch wohl eher ins Private der Form)

@baumina: alle Zitate (qoute) wegdenken, Leerzeichen wegdenken und der Rest muß eine gewisse Länge haben.
Und wenn der Rest auch noch nur aus Großbuchstaben besteht, dann wird alles automatisch klein gemacht. :wall: (selbst wenn es sich um eine großgeschriebene Abkürzung handelt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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