![]() |
Seltsame Exception
Ich habe eine Klasse TProfileWriter zum Massenschreiben von Registryeinträgen.
Delphi-Quellcode:
TProfileWriter = class
private Reg: TRegistry; Keys: TStringList; procedure FindKeys; public constructor Create; destructor Destroy; override; procedure WriteBinaryValue(const Name: string; var Value: array of byte); procedure WriteProfile(const Profile: TProfile); end;
Delphi-Quellcode:
Wenn ich jetzt in einem ActionExecute-Event des Hauptforumulars WriteProfile mit einem Profil (ebenfalls eine Klasse mit einer Stringlist "Settings") aufrufe, kommt es in folgender Zeile zu einer Exception:
procedure TProfileWriter.WriteBinaryValue(const Name: string; var Value: array of byte);
var i: cardinal; begin if (Keys.Count > 0) and (Length(Value) > 0) then for i := 0 to Keys.Count - 1 do begin Reg.OpenKey(Keys.Strings[i], false); Reg.WriteBinaryData(Name,Value[0],Length(Value)); Reg.CloseKey; end; end; procedure TProfileWriter.WriteProfile(const Profile: TProfile); var pc: PAnsiChar; a: array of byte; i: cardinal; begin SetLength(a, 4); GetMem(pc, 5); try FillChar(pc,5,0); with Profile.Settings do begin if Count > 0 then for i := 0 to Count - 1 do begin pc := PChar(LowerCase(ValueFromIndex[i])); HexToBin(pc,pc,4); CopyMemory(@a[0],pc,4); WriteBinaryValue(Names[i],a); end; end; finally FreeMem(pc); end; end;
Delphi-Quellcode:
if (Keys.Count > 0) and (Length(Value) > 0) then
Zitat:
Wenn ich WriteBinaryValue im OnCreate des Hauptformulars zum Test so aufrufe, tritt die Exception nicht auf und die Registryeinträge werden korrekt geschrieben. Anscheinend ist Keys = nil beim Aufruf aus WriteProfile, aber das dürfte doch gar nicht sein!? :? |
Re: Seltsame Exception
Erzeugst du auch eine Instanz der Klasse?
|
Re: Seltsame Exception
Ja.
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
var F: TSearchRec; i: integer; item: TListItem; begin ProfileWriter := TProfileWriter.Create; |
Re: Seltsame Exception
Und wo wird die private variable Keys gefüllt?
|
Re: Seltsame Exception
Keys wird im Konstruktor von TProfileWriter erstellt.
Delphi-Quellcode:
FindKeys füllt die Stringliste Keys mit Einträgen.
constructor TProfileWriter.Create;
begin inherited; Reg := TRegistry.Create; Keys := TStringList.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; FindKeys; end; |
Re: Seltsame Exception
Hm, ich geb dir mal recht, wenn du die Instanzen so erzeugst wie gepostet dürfte dass nicht sein. Dann solltest du gucken, ob a) das was scheint auch so ist, am besten ein
Delphi-Quellcode:
vor die Zeile mit dem Fehler (mag überflüssig erscheinen, aber so kann man halt leicht auf Nummer sicher gehen!), ok, Debugger und den Wert von Keys tuts natürlich auch. Und wenn der sicher nil / 0 ist, dann muss
if not assigned(keys) then
begin ShowMessage('NACHRICHT'); end; a) die Zeile Keys = TStringList.Create nie aufgerufen werden oder b) Keys irgendwo wieder freigegeben werden, bevor der Aufruf von WriteBinaryValue auftritt. Dann heißt's nach dieser Stelle suchen. Vielleicht ein versehentlich zu frühes Free oder ein setzen von Keys = nil oder oder so. F c) fällt mir gerade ein, ActionExecute könnte vor dem OnCreate Ereignis aufgerufen werden. Dann solltest du vor dem Aufruf prüfen ob Keys schon angelegt wurde oder (wozu ich dir dann raten würde) die Ereignisbehandlungsroutine (also dass was zu OnActionExecute gehört) erst im OnCreate zuweisen (nicht im Objekt Inspektor). Gruß Der Unwissende |
Re: Seltsame Exception
Zitat:
Zitat:
Zitat:
Zitat:
---- Seltsam. Mache ich die Methoden virtuell, tritt der Fehler schon hier auf:
Delphi-Quellcode:
WriteBinaryValue(Names[i],a);
|
Re: Seltsame Exception
Etwas dumme Frage, aber rufst du es in einem OnClick Event des Buttons auf, oder im OnActionExecute des Hauptformulars? Wäre hier doch ein gewaltiger unterschied
Zitat:
|
Re: Seltsame Exception
Solangsam deutet alles darauf hin, dass du doch nicht korrekt eine Instanz von TProfileWrite erzeugst.
|
Re: Seltsame Exception
Zitat:
Ich rufe es im OnExecute der Aktion auf. Zitat:
Wenn ich WriteProfile im OnCreate aufrufe, kommt wieder der gleiche Mist. Ich denke der Fehler ist im WriteProfile. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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