Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Fehlermeldung beim Wechsel zwischen Anwendungen (https://www.delphipraxis.net/76111-fehlermeldung-beim-wechsel-zwischen-anwendungen.html)

gfjs 30. Aug 2006 03:58


Fehlermeldung beim Wechsel zwischen Anwendungen
 
Guten Morgen.

Bei der Entwicklung eines Projekts ist ein mir unerklärlicher Fehler aufgetreten:

Ich habe auf einem Formular ein Panel und darauf eine größere Anzahl von zur Laufzeit erzeugten Labels, die beim Klick auf ein Label durchlaufen werden. Beim ersten Klick ist noch alles okay, doch dann treten Fehler auf, die sich auf die Darstellung der Labels auswirkten. Das ist aber noch nicht das Problem - das ist einfach ein Fehler in meiner Programmierung, den ich versuche herauszufinden.

Um mir das zu erleichtern, wollte ich nach jedem Klick einen Screenshot machen, um zu sehen, wie sich der Fehler von Klick zu Klick fortsetzt. Dabei ist nun das eigentliche Problem aufgetreten:

Wenn ich mit <Alt/Druk> den Screenshot gemacht habe und die Anwendung wechsle (z.B. in Word) um dort den Screenshot in ein Formular zu kopieren, passiert folgendes: Wenn ich zurück in mein Projekt wechsle und auf ein weiteres Label klicke, kommt folgende Fehlermeldung: "System.IndexOutOfRangeException: Der Index war außerhalb des Arraybereichs."

Das hat aber offensichtlich nichts mit dem Ablauf innerhalb meines Projekts zu tun, denn ich kann beliebig viele Labels anklicken, ohne dass ein Fehler auftritt, solange ich nicht die Anwendung verlasse.

Kann es sein, dass mein Projekt beim Wechsel in eine andere Anwendug und zurück etwas "vergisst", bzw. dass ein Wert nach dem Wechsel undefiniert ist?

mfg Jürgen

PS. Das Ganze passiert sowohl beim Start des Projekts aus der Entwicklungsumgebung als auch mit der exe-Datei und hat auch nichts mit dem Screenshot zu tun sondern passiert jedesmal, wenn ich die Anwendung wechsle.

Bernhard Geyer 30. Aug 2006 06:35

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Schalt mal Debug-DCU's dazu und lass bei Auftreten einer Exception den Compiler anhalten. Dann solltest Du herausfinden wo das genau passiert.

gfjs 30. Aug 2006 07:18

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Guten Morgen, Bernhard.

Vielen Dank für Deinen Hinweis. Leider habe ich vom Debuggen nicht die geringste Ahnung. Das einzige, was ich auf die Schnelle rausgefunden habe ist dies:

Ereignisprotokoll:
Anwendungsdomäne geladen: DefaultDomain Prozess SudokuStar_1_0.exe (2408)
Modul laden: mscorlib. Ohne Debug-Infos. Basisadresse: $79780000. Prozess SudokuStar_1_0.exe (2408)
Thread-Start: Thread-ID: 2704. Prozess SudokuStar_1_0.exe (2408)
Prozessbeginn: Attached/Spawned Process 0x968. Prozess SudokuStar_1_0.exe (2408)
Modul laden: SudokuStar_1_0. Enthält Debug-Infos. Basisadresse: $00400000. Prozess Sudo-kuStar_1_0.exe (2408)
Modul laden: system.windows.forms. Ohne Debug-Infos. Basisadresse: $7B610000. Prozess Sudo-kuStar_1_0.exe (2408)
Modul laden: system. Ohne Debug-Infos. Basisadresse: $7B0A0000. Prozess SudokuStar_1_0.exe (2408)
Modul laden: system.drawing. Ohne Debug-Infos. Basisadresse: $7B490000. Prozess Sudo-kuStar_1_0.exe (2408)
Thread-Start: Thread-ID: 2808. Prozess SudokuStar_1_0.exe (2408)
Prozessbeginn: Attached/Spawned Process 0x968. Prozess SudokuStar_1_0.exe (2408)
Modul laden: mscorlib.resources. Ohne Debug-Infos. Basisadresse: $0B870000. Prozess Sudo-kuStar_1_0.exe (2408)
Modul laden: system.windows.forms.resources. Ohne Debug-Infos. Basisadresse: $0B8C0000. Pro-zess SudokuStar_1_0.exe (2408)
Modul entladen: SudokuStar_1_0. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: system.windows.forms. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: system. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: system.drawing. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: mscorlib.resources. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: system.windows.forms.resources. Prozess SudokuStar_1_0.exe (2408)
Modul entladen: mscorlib. Prozess SudokuStar_1_0.exe (2408)
Anwendungsdomäne entladen: DefaultDomain Prozess SudokuStar_1_0.exe (2408)
Thread-Ende: Thread-ID: 2704. Prozess SudokuStar_1_0.exe (2408)

Das hilft mir aber leider überhaupt nicht weiter. Vielleicht sagt es Dir etwas?

Gruß Jürgen

Jürgen Thomas 30. Aug 2006 07:25

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Hallo Jürgen,

könnte es sein, dass Du eines der Ereignisse FormShow/FormActivate/LabelEnter o.ä. verwendest und dort ein Index benutzt wird?

Das von der Fehlermeldung angesprochene Array könnte m.E. auch Panel.Controls o.dgl. sein.

Vielleicht hilft die Suche in dieser Richtung.

Gruß Jürgen

gfjs 30. Aug 2006 07:56

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Guten Morgen, Jürgen.

Sowohl in Form_Activated als auch in Label_Click wird ein Index verwendet. Der Fehler scheint aber ziemlich sicher in Label_Click aufzutreten, da dort mit
Delphi-Quellcode:
for i := 0 to Panel1.Controls.Count do ....
alle Labels durchlaufen werden und mit einer Variable "Anzahl" eine andere Prozedur aufgerufen wird, bei der diese Variable für den Zugriff auf ein Array verwendet wird. Ich gehe davon aus, dass diese Variable "Anzahl" entweder verändert wird oder bei der Rückkehr zu meinem Programm undefiniert ist.

Nur hilft mir dieses Wissen nicht wirklich weiter. Beim normalen Programmablauf passiert ja nichts. Erst wenn ich während der Laufzeit des Programmes in eine andere Anwendung wechsle und dann wieder zurück zu meinem Programm gehe, tritt der Fehler auf.

Leider sind meine Kenntnisse in Bezug auf das Debuggen gleich Null. :oops:

Gruß Jürgen.

RavenIV 30. Aug 2006 07:58

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Zitat:

Zitat von gfjs
servus
es muss heissen
Delphi-Quellcode:
for i := 0 to Panel1.Controls.Count - 1 do ....

wichtig ist das "-1", weil er sonst über den Index des Arrays hinausläuft.

gfjs 30. Aug 2006 08:05

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
@ RavenIV

Sorry! War ein Flüchtigkeitsfehler in meinem Post. Im Quelltext steht überall das "-1".

Trotzdem vielen Dank.

Gruß Jürgen

Jürgen Thomas 30. Aug 2006 08:50

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Zitat:

Zitat von gfjs
Sowohl in Form_Activated als auch in Label_Click wird ein Index verwendet.

Form_Activate(d) dürfte das Problem verursachen; denn diese Ereignisse werden bei jedem Wechsel zwischen Formularen - also auch zwischen Anwendungen - ausgelöst. Also musst Du dieses Ereignis genauer untersuchen (und dabei bewusst hin- und herschalten).

Wenn Du diesen Quelltext veröffentlichst, kann ich Dir vielleicht durch "genaues Hinschauen" schon helfen (ich kenne so etwas: dort, wo man selbst geschrieben hat, findet man Fehler nicht unbedingt).

Tipps zur Fehlersuche
Variante 1 (mit Debugger)
Compiler muss mit Debug-Symbolen übersetzen (Projektoptionen)
a. Haltepunkt an den Anfang einer problematischen Stelle setzen
b1. mit F7 schrittweise jeden Befehl durchgehen, oder
b2. mit F8 aufgerufene Methoden überspringen oder
b3. mit F4 bis zu einer bestimmten Quelltextzeile oder
b4. mit F9 bis zum nächsten Haltepunkt oder
c. mit Maus oder "Überwachte Ausdrücke" oder "lokale Variable" Werte überprüfen; bei Deinem Problem vor allem den Laufindex und die Bereichsgrenzen kontrollieren
d. die Stelle, an der es knallt, genauer prüfen

Variante 2 (mit Exceptions)
Damit sollten sowieso ständig alle möglichen und unmöglichen Fehler abgefangen werden. Die einfachste Variante, angepasst an Deine Situation:
Delphi-Quellcode:
for i := 0 to Panel1.Controls.Count - 1
do begin
  try
    ...
  except
    //  bei dieser Variante ist i noch bekannt
    on e:Exception
    do ShowMessage( e.Message + #13#10 
        + Format( 'Index %d', [i] ) );
  end;
end;
Übrigens gibt es ab D2005 die neue for-Konstruktion:
Delphi-Quellcode:
var ctl: TControl;
for ctl in Panel1.Controls do begin ...
Damit wird das Problem mit den array-Grenzen von i umgangen. Man kann aber i.d.R. nicht auf einen Index zugreifen. Wenn Du aber etwas mit dem betreffenden Control machen willst, ist das oft praktischer.

Hilft Dir das weiter? Gruß Jürgen

gfjs 30. Aug 2006 09:05

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Hallo, Jürgen.

Vielen Dank für Deine Mühe und die ausführliche Beschreibung. Leider ist für heute meine Zeit, die ich mir für das Tüfteln an meinem Projekt zugestanden habe, schon deutlich überschritten. Jetzt muss ich mich wieder meinem Hauptjob widmen. Ich werde mich aber gleich morgen damit beschäftigen.

Ich glaube, dass für mich der Hinweis, dass Form_Activated bei jedem Formularwechsel aufgerufen wird, der springende Punkt sein dürfte. In Form_Activated erzeuge ich nämlich zur Laufzeit die Labels, weise den Labels die Eigenschaften zu und speichere diese Einstellungen im ersten Record meines StatusArrays. Vernutlich sollte ich diese Aktivitäten in eine andere Methode verlegen - nur in welche? Dazu müsste ich wissen, in welcher Reihenfolge die Methoden beim Programmstart aufgerufen werden, damit ich das Ganze in eine Methode verlegen kann, die vor Form_Activated dran ist.

Ich hoffe, dass meine Schlussfolgerungen aus Deinen Hinweisen einigermassen richtig sind?!

Also noch mal vielen Dank und noch einen schönen Tag.

Gruß Jürgen.

PS. Ankommende Hinweise lese ich natürlich sofort, auch wenn ich erst morgen weiter machen kann.

Bernhard Geyer 30. Aug 2006 09:09

Re: Fehlermeldung beim Wechsel zwischen Anwendungen
 
Zitat:

Zitat von gfjs
Dazu müsste ich wissen, in welcher Reihenfolge die Methoden beim Programmstart aufgerufen werden, damit ich das Ganze in eine Methode verlegen kann, die vor Form_Activated dran ist.

Wie wäre es mit OnFormCreate oder einfach abchecken ob die Labels schon erzeugt wurden.


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