Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Warum "System.ArgumentOutOfRangeExeption" (https://www.delphipraxis.net/77132-warum-system-argumentoutofrangeexeption.html)

gfjs 15. Sep 2006 03:45


Warum "System.ArgumentOutOfRangeExeption"
 
Guten Morgen, Allerseits.

Auf einem Formular sollen sich mehrere Panels befinden, in denen jeweils mehrere Labels platziert werden. Um alle Labels in einer Schleife durchlaufen zu können, wollte ich die Parent-Eigenschaft der Labels ändern. Ich habe das mit einem Panel und 18 Labels so versucht:
Delphi-Quellcode:
  for I := 0 to Panel3.Controls.Count - 1 do
  begin
    Panel3.Controls[i].Parent := Self.Panel1
  end;   // for I := 0 to Panel3.Controls.Count - 1 do
Nach dem 8. Durchlauf brach das Programm mit der im Titel erwähnten Fehlermeldung ab. Ich habe dann die Anzahl der Labels im Panel auf sieben reduziert; darauf brach das Programm nach dem dritten Schleifendurchlauf ab. Mit nur einem Label klappt es, mit zwei Labels nicht mehr. Warum???

Gruß Jürgen

<Edit>
Dem Fehler bin ich jetzt auf die Spur gekommen: Durch die Änderung der Parent-Eigenschaft verringert sich die Zahl der Labels auf dem Panel, so dass nach der Hälfte der ursprünglich vorhandenen Labels die Exception ausgelöst wird. Das lässt sich dadurch lösen, dass man die Schleife rückwärts durchläuft. Der gewünschte Erfolg ist aber trotzdem ausgeblieben: Jetzt sind die Labels nicht mehr sichtbar (trotz BringToFront). Außerdem hat Self.Controls.Count nach dem durchlaufen der Schleife noch immer den Wert 1, Panel3.Controls.Count hat jetzt den Wert 0 - was bedeuten würde, dass die Labels aus dem Panel verschwunden sind, ohne sich jetzt im Formular zu befinden. Wo sind sie???

gfjs 16. Sep 2006 04:18

Re: Warum "System.ArgumentOutOfRangeExeption"
 
Guten Morgen.

Ich bin noch immer auf der Suche nach meinen Labels, bei denen ich die Parent-Eigenschaft geändert habe!
Delphi-Quellcode:
for I := 0 to Panel3.Controls.Count - 1 do
  begin
    Panel3.Controls[i].Parent := Self.Panel1 
  end;   // for I := 0 to Panel3.Controls.Count - 1 do
Vielleicht findet sich ja noch jemand, der mir bei der Suche hilft?!

Vielen Dank im Voraus.

Gruß Jürgen.

himitsu 16. Sep 2006 12:03

Re: Warum "System.ArgumentOutOfRangeExeption"
 
Du entfernst ja die Controls aus Panel3, damit werden es weniger und nach etwa der Häfte bist du mit dem Index hinter dem Letzten. :warn:

Code:
for I := [b][color=#ff0000]Panel3.Controls.Count - 1 downto 0[/color][/b] do
  Panel3.Controls[I].Parent := Self.Panel1;

// oder

for I := 0 to Panel3.Controls.Count - 1 do
  Panel3.Controls[[b][color=#ff0000]0[/color][/b]].Parent := Self.Panel1;

Elvis 16. Sep 2006 13:57

Re: Warum "System.ArgumentOutOfRangeExeption"
 
Da du .Net 1.1 benutzt hier mal ein Bleistift mit der ArrayList:

Delphi-Quellcode:
var
  panelControls : ArrayList;
  childControl : Control;
begin
  panelControls := ArrayList.Create(deinPanel.Controls); //kopie der collection

  for childControl in panelControls do
    childControl.Parent := andererParent;

gfjs 17. Sep 2006 04:46

Re: Warum "System.ArgumentOutOfRangeExeption"
 
@ himitsu

Diesen Fehler hatte ich bereits entdeckt - siehe <Edit> im ersten Beitrag. Trotzdem vielen Dank für Deine Mühe. Hat mir aber trotzdem noch was gebracht, weil ich die zweite Variante noch nicht kannte.

@ Elvis

Super! Das war genau das, was ich gebraucht habe. Es wäre schön, wenn Du mir noch erklären könntest, warum meine Version nicht geklappt hat.

Vielen Dank und noch einen schönen Tag.

Gruß Jürgen

Elvis 17. Sep 2006 08:42

Re: Warum "System.ArgumentOutOfRangeExeption"
 
Zitat:

Zitat von gfjs
@ Elvis
Super! Das war genau das, was ich gebraucht habe. Es wäre schön, wenn Du mir noch erklären könntest, warum meine Version nicht geklappt hat.

Hatten meine Vorredner doch schon erklärt. ;)
Du hast die Collection verändert während du durch sie durchliefst. In meinem Schnipsel bekommst du eine Kopie dieser Collection, Himitsus Code ging immer auf das erste Element.
Beides sollte funktionieren und welche Variante man nimmt sollte man einfach nach ästhetischen Punkten auswählen. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz