![]() |
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:
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???
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 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??? |
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:
Vielleicht findet sich ja noch jemand, der mir bei der Suche hilft?!
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 Vielen Dank im Voraus. Gruß Jürgen. |
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; |
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; |
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 |
Re: Warum "System.ArgumentOutOfRangeExeption"
Zitat:
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