AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zur Laufzeit erstellte Komponenten im Array verwalten

Zur Laufzeit erstellte Komponenten im Array verwalten

Ein Thema von Rued · begonnen am 21. Aug 2014 · letzter Beitrag vom 22. Aug 2014
Antwort Antwort
Seite 1 von 2  1 2   
Rued

Registriert seit: 14. Mai 2008
Ort: Dortmund => Münster => Dresden => Chemnitz
44 Beiträge
 
Delphi 2010 Professional
 
#1

Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 12:34
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
Rüdiger Droste

Geändert von Rued (21. Aug 2014 um 12:52 Uhr) Grund: Siehe Nachtrag.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 12:45
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 13:15
<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.

Geändert von Dejan Vu (21. Aug 2014 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Rued

Registriert seit: 14. Mai 2008
Ort: Dortmund => Münster => Dresden => Chemnitz
44 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:36
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
Rüdiger Droste
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.858 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:40
Zitat:
Edits:array[1..11,0..3] of TEdit;
Zitat:
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:44
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
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.858 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:44
Hast aber lange geblickt, wie?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:46
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.858 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 14:50
Die Welt ist eben hart, aber ungerecht. Nächstes Mal bist Du dann wieder schneller *tröst*
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Zur Laufzeit erstellte Komponenten im Array verwalten

  Alt 21. Aug 2014, 15:13
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. (selbst wenn es sich um eine großgeschriebene Abkürzung handelt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (21. Aug 2014 um 15:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf