![]() |
Zugriffsverletzung
Hi Leuts,
gleich krieg ich die Mücken... In welche Tüte kann man diese Fehlermeldung stecken?? Zitat:
Gibts da ne pauschale Aussage...oder muss man genauer suchen. Ich frag bloss...weil ich nicht 1100 Zeilen in den Beitrag stellen wollte. Uff |
Der FormCreate Code kann bestimmt nicht schaden!
|
Auch die OnShow und OnActivate Prozedure....
|
Starte doch mal Deine App nicht mit F9, sondern nutze F7 und gehe Schritt für Schritt durch die Zeilen...
Hört sich nach einer nicht initialisierten Objektvariable an - oder ein ungültiger Pointer oder ... |
wenn ich mit F7 durchgehe, hab ich immer einen grünen Pfeil.Meckert auch sonst nicht.
Das lustige ist, die Fehlermeldung(s.o.) kommt mal...dann wieder nicht. Habe aber das Gefühl es liegt an der Ini.Datei die um Einstellen genutzt wird , hier mal die Formcreate:
Code:
Weil erst nach dem ich die Ini eingebaut habe, kommen diese Meldungen.
procedure TForm1.FormCreate(Sender: TObject);
begin IniSet := TIniFile.Create('setting.ini'); passw := inputbox('Testversion', 'Bitte Freischaltcode eingeben!', ' '); check(passw = passwrd); with IniSet do begin try RadioButtonP1.Checked := IniSet.ReadBool('Sound', 'mpause', False); RadioButtonP2.Checked := IniSet.ReadBool('Sound', 'vpause', False); RadioButtonP3.Checked := IniSet.ReadBool('Sound', 'opause', False); CheckBox1.Checked := IniSet.ReadBool('Musik', 'zustand', False); finally IniSet.Free; end; end; Timer3.Enabled := False; Button1.Enabled := False; Fertig.Enabled := False; meld := inputbox('Eingabe', 'Bitte den Namen eingeben!', ''); Label16.Caption := meld; i := 0; Form1.Height := 330; end; Aber IMHO ist diese völlig in Ordnung und wird auch freigegeben.Da diese im Programm, mehrmals aktualisiert wird. by Daniel B; Einrückungen |
hast du IniSet deklariert ??
|
Moin Privateer,
für die INI Datei hast Du Dir aber, gerade bei dem Namen, einen gefährlichen Platz ausgesucht. Wenn Du keinen Pfad angibst, wird auf das Windowsverzeichnis zugegriffen. Vielleicht benutzt noch ein Programm eine SETTING.INI, die auch im Windows Verzeichnis liegt, und dadurch kommt es zu Kollisionen. |
Hi,
schreib doch mal alles in OnShow anstatt in OnCreate, ich befürchte das es etwas zu Früh ist |
nee nee nee
bringt alles nix...keiner der Tips nur wenn ich die Ini weglasse geht alles seinen Gang Es ist zum Haareraufen :twisted: |
Also mach entwerder
Code:
oder das IniSet vor
with IniSet do
begin
Code:
raus!!!
try
RadioButtonP1.Checked := IniSet.ReadBool('Sound', 'mpause', False); RadioButtonP2.Checked := IniSet.ReadBool('Sound', 'vpause', False); RadioButtonP3.Checked := IniSet.ReadBool('Sound', 'opause', False); CheckBox1.Checked := IniSet.ReadBool('Musik', 'zustand', False); finally IniSet.Free; end; Weil "doppelt gemoppelt" hält vielleicht besser kann aber auch zu fehlern führen :D |
Hi,
Das with IniSet do begin nach dem Try. Aber das Create auf jedenfall davor. |
Alles schon ausprobiert...
Auffallend kommt jetzt hinzu, dass er sich die Einstellungen merkt,das heisst die Radios.Nur die Checkbox merkt er sich nicht.Wenn ich Prog starte die Radios verändere und die Checkbox auch...merkt er sich nur die Radios. Ausserdem kommt jetzt zusätzlich eine Accessviolation Fehlermeldung an Adresse sowieso! Ich fahr gleich in den Urlaub..wenn's so weitergeht :lol: |
Kannst du die "Merken"-Speicher-Prozedure mal posten!!!
|
Merk-Proze für die Checkbox
Code:
hmm
procedure TForm1.CheckBox1Click(Sender: TObject);
begin IniSet:=TIniFile.Create('.\sndset.ini'); try if Checkbox1.Checked then IniSet.WriteBool('Musik','zustand',True) else IniSet.WriteBool('Musik','zustand',False); finally IniSet.Free; end; end; |
Ist was kürzer:
Code:
IniSet:=TIniFile.Create('.\sndset.ini');
try IniSet.WriteBool('Musik','zustand',Checkbox1.Checked) finally IniSet.Free; end; |
Hallo Privateer3000,
eine Zeile ist mir auch nicht ganz klar: Zitat:
Ist es so gewollt, dass der Dateinname der Ini-Datei beim Einlesen und in der neu geposteten CheckBoxClick Methode nicht übereeinstimmen oder hast du den Namen geändert? Außerdem solltest du den Pfad angeben z.B über:
Code:
IniSet:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'sndset.ini');
|
:o)
stimmt :shock:
|
Hi Spocki,
passw ist eine const..passt scho Erklär mir bitte mal diese näher:
Code:
Extractfilepath ist klar aber applic...aaahhhhh alles klar :PLatzhalter für den Anwendungsname,ok ok
IniSet:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'sndset.ini');
mmhhh..und das hilft? Ich probiers Danke Spocki PS: Ja, habe den ini-Name geändert |
Zitat:
Nachtrag: das sndset.ini fällt dann natürlich weg. Du schreibst dann nur noch .ini rein. |
Hallo Privateer3000,
Application.Exename enthält den Programmnamen einschließlich kompletten Pfad und der .EXE Endung. Du kannst deshalb ExtractFilePath auf diesen Dateinamen anwenden und erhälst den Pfad einschließlich dem abschließenden Backslash (\). Ich nenne meine Ini-Dateien immer genauso, wie das Programm und ersetze so nur die Endung .EXE durch .INI, dazu gibt es noch eine Funktion, die das für mich macht:
Code:
Ini := TIniFile.Create(ChangeFileExt(Application.ExeName), '.INI');
|
yep, danke Spocki
|
Um es noch kürzer zu machen:
Code:
Die alten DOS-Zeiten sind noch an mir hängengeblieben *g*
Ini := TIniFile.Create('.\settings.ini');
MfG, d3g |
Noch eine Frage:
Hast du die Funktion Check selbst geschrieben? Oder benutzt du hier die Check Funktion aus der Unit DBTables? Falls ja, könnte ich mir hier gut eine Zugriffsverletzung vorstellen? Falls nicht, wie ist Check dann definiert? |
bringt nix...Fehler, immer noch
HerrGott was ist es denn nur... Ich hole mal mein Backup hervor(was ich vor der Sache erstellt habe) und fange noch mal an |
diese Check-funktion stammt aus einem früherem post...ich glaube sogar von dir
die ist in Ordung...wenn ich ich sie kommentiere ändert sich garnichts..liegt also nicht daran |
Hallo Privateer3000,
noch einen Tip: Wenn du
Code:
schreibst, kannst du die Methoden von IniSet ohne den Zusatz "IniSet" aufrufen, also einfach ReadBool(...) anstatt IniSet.ReadBool.
with IniSet do
Ansonsten sieht der Code eigentlich gut aus, daher vermute ich den Fehler, wie schon vorher geschriebne wurde, in der OnActivate oder aber beim FormCreate einer der anderen Forms, die automatisch erstellt werden!? |
ich check mal die anderen Forms...denke aber nicht...da ich diese seit ich die inis gebastelt habe, nicht angefasst habe.
Aber vielleicht hat es ja doch einen anderen Einfluss auf die Forms.... Übrigens, ob mit with IniSet do oder ohne habe alles schon probiert, ist halt nur ein Überbleibsel von den Tests |
Moin d3g,
Zitat:
Ein fester Pfad ist da sicherer, ausser man erzeugt das Objekt beim Programmstart, und zerstört es erst wieder beim Programmende. |
Jetzt habe ich einen interessanten Effekt:
hab alles nochmal umgestülpt, dabei hat sich herausgestellt das die Zugriffsverletzung nur dann entsteht wenn ich per Radiobutton-Klick was in die Ini schreibe.Mach ich es per Mainmenu ist alles Banane. Um es vorweg zu nehmen.Habe es getrennt, also nicht beides gleichzeitig.Entweder Radios oder Menu. Ist das möglich, dass ein Radio-Klick nicht in der Lage ist eine ini zu schreiben? |
Zitat:
Oder ist der vorher schon gecheckt? Dann müsstest du vorher noch auf ckecked abfragen. |
Interessante Frage...
Ich probiers mal..klar eine Radio kann nur checked sein. Danke..melde mich wieder |
Ich sollte die Radios zu einer Radiogroup zusammen fassen und mit den Indexen ansprechen.Einzeln scheint es ja nicht zu gehen.
|
Auch das zusammenfassen zu einer Radiogroup hat nichts gebracht.
Auffallen tut: der erste Klick auf einen der Radios geht noch gut, aber der zweite erzeugt eine "externe Exception".Also sobald der Index der Radios wechselt.In die Ini schreiben tut es aber nur den ersten Klick. Vielleicht kann jemand was damit anfangen? |
Hallo :cry:
|
Code???
|
Code:
Iniset ist deklariert :wink:
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin try case RadioGroup2.ItemIndex of 0: with Iniset do WriteInteger('pause','mpause',0); 1: with Iniset do WriteInteger('pause','mpause',1); 2: with Iniset do WriteInteger('pause','mpause',2); end; finally Iniset.Free; end; |
Und wo ist in dieser Methode denn Iniset := TIniFile.Create(...) denn du gibst Iniset ja am Ende des EventHandlers frei.
|
Wäre es nicht sinnvoll mal ganz von vorne anzufangen und alles noch mal sauber zu programmieren? Denn nach drei Seiten im Forum dürfte dein Code eigentlich nur noch ein Flickwerk sein, durch das niemand mehr durchsteigt. Und der Fehler dürfte sich mittlerweiel in ein Predator im Amazonas Dschugel verwandelt haben, sprich nicht mehr auffindbar sein.
Wenn das Projekt zu komplex ist, sollte man zu mindest alles rausschmeissen was mit der Ini-Datei den Optionsfelder etc. zu tun hat. Und zumindest diesen Teil noch mal neu, von vorne sauber implementieren. Denn so wie das hier aussieht, hatt es keinen Sinn mehr hier noch länger weiter zu machen. Meine Erfahrung hat gezeigt, dass in den meisten Fällen, wenn nach zwei Seiten in einem Forum keine Lösung gefunden wurde, es keine großen Sinn mehr macht. |
Genau deswegen hatte ich noch mal zusammengefasst,siehe obe:
Zitat:
|
Wenn du immer
Code:
machst musst du auch immer
Iniset.free;
Code:
machen, sonst ist dieses ja nach dem ersten mal nicht mehr deklariert!!
Iniset := TIniFile.Create(...);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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