Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Scrennsaver Adressenverletung bei 0000000 (https://www.delphipraxis.net/140499-scrennsaver-adressenverletung-bei-0000000-a.html)

Johannes013 19. Sep 2009 13:03


Scrennsaver Adressenverletung bei 0000000
 
Hi, :-D

mein Bildschirmschoner macht mir Arger! Diese Befehlszeile meldet "Zugriffsverletzung bei Adresse 000000000":

Delphi-Quellcode:
SetIni.WriteString('Main','ColorValue',ColorToString(ColorD.Color));
:?:

mfg Johannes(013)

himitsu 19. Sep 2009 13:07

Re: Scrennsaver Adressenverletung bei 0000000
 
ist SetIni initialisiert?

was ist ColorD und wurde es, falls nötig, auch initialisert?

Johannes013 19. Sep 2009 21:06

Re: Scrennsaver Adressenverletung bei 0000000
 
sorry, hab vergessen das zu sagen:

-SetIni ist (natürlich) unter var deklariert (sie wird auch erstellt)
-ColorD ist ein ColorDialog, der user soll die Farbe selbst bestimmen können

naja, das ist alles.

dank im voraus

himitsu 19. Sep 2009 21:19

Re: Scrennsaver Adressenverletung bei 0000000
 
hmmmm :gruebel:

OK, dann ... bist'e sicher, daß es diese Zeile ist und nicht die davor?
(wenn der Debugger nach der Exception angehalten hat, ist er schon eine Zeile weiter)

Ansonsten bleibt dir nur der Weg diese Zeile in ihre Bestandteile zu zelegen und alles einzeln zu prüfen.

Johannes013 19. Sep 2009 22:26

Re: Scrennsaver Adressenverletung bei 0000000
 
ja, die zeile davor ist "
Delphi-Quellcode:
begin
".

Hier ist der Code des Timers:

Delphi-Quellcode:
procedure TSettings.Timer1Timer(Sender: TObject);
begin
   SetIni.WriteString('Main','ColorValue',ColorToString(ColorD.Color)); // Farbe aus ColorDialog
   Label2.Color:=ColorD.Color; //Anzeige der Fabe
   ColorChange.Text:=ColorToString(ColorD.Color); // TComboBox
end;
und der des OnCreats:

Delphi-Quellcode:
procedure TSettings.FormCreate(Sender: TObject);
var s: string;
begin
   try
     SetIni:=TIniFile.Create(GetApplicationDirectory+'PegasusScreenSaver.ini');
     s:=SetIni.ReadString('Main','SaverType','System');
     if s='System' then begin Checker.Layout:=tlTop;TextAnim.Hide;RandPic.Hide;ChOwnType.Hide;end;
     if s='No' then begin Checker.Layout:=tlCenter;TextAnim.Hide;RandPic.Hide;ChOwnType.Hide;end;
     if s='RandPic' then
       begin
         Checker.Layout:=tlBottom; // Label mit "X" als Marker
         ChOwnType.Layout:=tlTop; // Genau das gleiche
         TextAnim.Show; // Label der Auswahl
         RandPic.Show; // Label der Auswahl
         ChOwnType.Show; // Marker
         ShowRandPic; // Prozedure die versch. Sachen zeigt.
         Label2.Color:=StringToColor(SetIni.ReadString('Main','ColorValue','clblack')); // Lesen
         ColorD.Color:=StringToColor(SetIni.ReadString('Main','ColorValue','clblack')); //Lesen
       end;
     if s='TxtAnim' then begin Checker.Layout:=tlBottom;ChOwnType.Layout:=tlBottom;TextAnim.Show;RandPic.Show;ChOwnType.Show;end;
   except
     ShowMessage('Es ist ein Fehler aufgetreten! Saver wird fortgesetz!');
   end;
Das Problem ist auch, dass trotzdem der TRY-Anweisung ein Fehler von Windows kommt.

mfg (gute nacht!) Johannes013

jaenicke 19. Sep 2009 22:48

Re: Scrennsaver Adressenverletung bei 0000000
 
Du speicherst Einstellungen des Benutzers in einem Timer? Bist du sicher, dass dein Konzept gut ist? :gruebel:

Was passiert denn, wenn du die Zeile auskommentierst? Kommt da der Fehler immer noch? ;-)

Zitat:

Zitat von Johannes013
Das Problem ist auch, dass trotzdem der TRY-Anweisung ein Fehler von Windows kommt.

Wenn du das Programm aus Delphi startest, der Debugger also läuft, wird bei jeder Exception auch angehalten, es sei denn du deaktivierst das über das Häkchen in deren Anzeige. Beim Start außerhalb von Delphi passiert das dann nicht, da das try..except das abfängt.

himitsu 19. Sep 2009 23:05

Re: Scrennsaver Adressenverletung bei 0000000
 
Wenn das Ini-Objekt OK ist
und auch die ColorBox,
dann bleibt erstmal nur noch ColorToString als Ursache

Delphi-Quellcode:
var C: TColor;
  S: String;
begin
   {$C+}   
   Assert(Assigned(ColorD));
   C := ColorD.Color;
   S := ColorToString(C);
   Assert(Assigned(SetIni));
   SetIni.WriteString('Main','ColorValue',S);
aber das mit dem Timer ist wirklich nicht so optimal (es sei denn, der wird nicht grad oft ausgeführt)

mkinzler 20. Sep 2009 09:24

Re: Scrennsaver Adressenverletung bei 0000000
 
Zitat:

(es sei denn, der wird nicht grad oft ausgeführt)
Wobei bei einem Timer nicht ausgegangen werden kann.
Ich würde dem Timer auch eine eigene TiniFile-Instanz gönnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

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