Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung (https://www.delphipraxis.net/243-zugriffsverletzung.html)

Privateer3000 24. Jun 2002 18:21


Zugriffsverletzung
 
Hi Leuts,

gleich krieg ich die Mücken...
In welche Tüte kann man diese Fehlermeldung stecken??

Zitat:

Zugriffsverletzung bei Adresse 006BFC07.Schreiben von Adresse 7B10FEB9.
Dies kommt beim Start.Der Debugger findet nichts...und ich auch nicht :(
Gibts da ne pauschale Aussage...oder muss man genauer suchen.
Ich frag bloss...weil ich nicht 1100 Zeilen in den Beitrag stellen wollte.

Uff

Tpercon 24. Jun 2002 18:31

Der FormCreate Code kann bestimmt nicht schaden!

thomasdrewermann 24. Jun 2002 18:44

Auch die OnShow und OnActivate Prozedure....

sakura 24. Jun 2002 19:14

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 ...

Privateer3000 24. Jun 2002 20:31

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:
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;
Weil erst nach dem ich die Ini eingebaut habe, kommen diese Meldungen.
Aber IMHO ist diese völlig in Ordnung und wird auch freigegeben.Da diese im Programm, mehrmals aktualisiert wird.

by Daniel B; Einrückungen

RomanK 24. Jun 2002 20:38

hast du IniSet deklariert ??

Christian Seehase 24. Jun 2002 20:41

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.

Daniel B 24. Jun 2002 20:44

Hi,

schreib doch mal alles in OnShow anstatt in OnCreate, ich befürchte das es etwas zu Früh ist

Privateer3000 24. Jun 2002 21:06

nee nee nee
bringt alles nix...keiner der Tips

nur wenn ich die Ini weglasse geht alles seinen Gang

Es ist zum Haareraufen :twisted:

RomanK 24. Jun 2002 21:14

Also mach entwerder
Code:
with IniSet do
  begin
oder das IniSet vor
Code:
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;
raus!!!

Weil "doppelt gemoppelt" hält vielleicht besser kann aber auch zu fehlern führen :D

Daniel B 24. Jun 2002 21:18

Hi,

Das with IniSet do
begin nach dem Try. Aber das Create auf jedenfall davor.

Privateer3000 24. Jun 2002 21:34

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:

RomanK 24. Jun 2002 21:40

Kannst du die "Merken"-Speicher-Prozedure mal posten!!!

Privateer3000 25. Jun 2002 06:52

Merk-Proze für die Checkbox

Code:
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;
hmm

Tpercon 25. Jun 2002 06:58

Ist was kürzer:
Code:
IniSet:=TIniFile.Create('.\sndset.ini');
try
IniSet.WriteBool('Musik','zustand',Checkbox1.Checked)
finally
IniSet.Free;
end;

MrSpock 25. Jun 2002 07:09

Hallo Privateer3000,

eine Zeile ist mir auch nicht ganz klar:

Zitat:

check(passw = passwrd);
Wird passwrd bereits vorher schon ein Wert zugewiesen oder ist es eine Konstante?

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');

Privateer3000 25. Jun 2002 07:47

:o)
 
stimmt :shock:

Privateer3000 25. Jun 2002 20:23

Hi Spocki,

passw ist eine const..passt scho

Erklär mir bitte mal diese näher:
Code:
IniSet:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'sndset.ini');
Extractfilepath ist klar aber applic...aaahhhhh alles klar :PLatzhalter für den Anwendungsname,ok ok
mmhhh..und das hilft?
Ich probiers

Danke Spocki

PS: Ja, habe den ini-Name geändert

Daniel B 25. Jun 2002 20:27

Zitat:

Zitat von Privateer3000
Extractfilepath ist klar aber applic...aaahhhhh alles klar :PLatzhalter für den Anwendungsname,ok ok
mmhhh..und das hilft?

Damit wird nicht nur die ini im gleichen Verzeichnis wie die exe angelegt, sondern bekommt auch den namen der exe. Somit heisst deine ini: MeinProg.ini und ist im gleichen Ordner wie die exe. Soweit Klar?

Nachtrag: das sndset.ini fällt dann natürlich weg. Du schreibst dann nur noch .ini rein.

MrSpock 25. Jun 2002 20:30

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');

Privateer3000 25. Jun 2002 20:33

yep, danke Spocki

d3g 25. Jun 2002 20:34

Um es noch kürzer zu machen:

Code:
Ini := TIniFile.Create('.\settings.ini');
Die alten DOS-Zeiten sind noch an mir hängengeblieben *g*

MfG,
d3g

MrSpock 25. Jun 2002 20:35

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?

Privateer3000 25. Jun 2002 20:37

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

Privateer3000 25. Jun 2002 20:39

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

MrSpock 25. Jun 2002 20:50

Hallo Privateer3000,

noch einen Tip: Wenn du
Code:
with IniSet do
schreibst, kannst du die Methoden von IniSet ohne den Zusatz "IniSet" aufrufen, also einfach ReadBool(...) anstatt IniSet.ReadBool.

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!?

Privateer3000 25. Jun 2002 21:15

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

Christian Seehase 26. Jun 2002 09:07

Moin d3g,

Zitat:

Zitat von d3g
Code:
Ini := TIniFile.Create('.\settings.ini');

ist aber nicht ungefährlich, weil Du damit relativ zum Arbeitsverzeichnis arbeitest, und das kann sich zur Laufzeit des Programmes verändern. ;-)
Ein fester Pfad ist da sicherer, ausser man erzeugt das Objekt beim Programmstart, und zerstört es erst wieder beim Programmende.

Privateer3000 26. Jun 2002 21:50

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?

Daniel B 26. Jun 2002 22:06

Zitat:

Zitat von Privateer3000
Ist das möglich, dass ein Radio-Klick nicht in der Lage ist eine ini zu schreiben?

Du musst doch nur in der Prozedur des RadioClick nur den einen Wert in die INI schreiben und nicht alles neu. Wo ist das Problem?

Oder ist der vorher schon gecheckt? Dann müsstest du vorher noch auf ckecked abfragen.

Privateer3000 26. Jun 2002 22:10

Interessante Frage...
Ich probiers mal..klar eine Radio kann nur checked sein.
Danke..melde mich wieder

Privateer3000 26. Jun 2002 22:14

Ich sollte die Radios zu einer Radiogroup zusammen fassen und mit den Indexen ansprechen.Einzeln scheint es ja nicht zu gehen.

Privateer3000 27. Jun 2002 07:11

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?

Privateer3000 27. Jun 2002 19:41

Hallo :cry:

RomanK 27. Jun 2002 19:42

Code???

Privateer3000 27. Jun 2002 20:15

Code:
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;
Iniset ist deklariert :wink:

jbg 27. Jun 2002 21:06

Und wo ist in dieser Methode denn Iniset := TIniFile.Create(...) denn du gibst Iniset ja am Ende des EventHandlers frei.

Luckie 27. Jun 2002 21:24

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.

Privateer3000 27. Jun 2002 21:32

Genau deswegen hatte ich noch mal zusammengefasst,siehe obe:
Zitat:

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.
Das wollt ich nur noch wissen,bevor ich von der Brücke spring :wink:

RomanK 28. Jun 2002 15:50

Wenn du immer
Code:
Iniset.free;
machst musst du auch immer
Code:
Iniset := TIniFile.Create(...);
machen, sonst ist dieses ja nach dem ersten mal nicht mehr deklariert!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.
Seite 1 von 2  1 2      

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