| Autor |
Beitrag |
Thunder
      
Beiträge: 145
WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 02:44
Moin,
Ich habe folgenden Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormCreate(Sender: TObject); begin If ParamStr(1) = '/autostart' then Autostart Else ... |
Um diese Prozedur aufzurufen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| procedure Autostart; var s1,s2: String; Dateien: TStringList; begin If FileExists(ExtractFilePath(ParamStr(0)) + 'start.ini') then begin Form6.Show; Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'start.ini'); Dateien := TStringList.Create; try Anzahl := Ini.ReadInteger('Bilder', 'Anzahl', 0); for i := 0 to Anzahl Do Dateien.Add(Ini.ReadString('Bilder', 'Bild' + IntToStr(i), '')); If Ini.ReadBool('Optionen', 'Zufall', True) then Repeat i := Random(Dateien.Count) Until i <> Ini.ReadInteger('Bilder', 'LetztesBild', -1) Else i := Ini.ReadInteger('Bilder', 'LetztesBild', -1) + 1; If i > Anzahl then begin Ini.WriteInteger('Bilder', 'LetztesBild', -1); i := 0; end; SetBackground(Dateien.Strings[i]); Ini.WriteInteger('Bilder', 'LetztesBild', i); finally Ini.Free; Dateien.Free; end; Sleep(1500); Form6.Hide; Application.Terminate; end Else begin s1 := 'Die Datei mit den Informationen zum automatischen Wechsel beim Windows-Start (start.ini) wurde nicht gefunden.'; s2 := 'Bitte stellen Sie sicher, dass die Datei im Stammverzeichnis von AutoHG ist oder führen Sie die entsprechenden Einstellungen in AutoHG erneut aus um die Datei durch AutoHG erstellen zu lassen.'; Application.Messagebox(PChar(s1 + #13 + #13 + s2), 'Informationsdatei nicht gefunden', 0+16); Application.Terminate; end; end; |
Ich bekomme immmer eine Zugriffsverletzung und die Zeile "Autostart" im ersten Code is markiert. Wo is der Fehler???
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.04 07:05
Also das einzigste, was ich jetzt so sehe ist, dass du eine Instanz von TIniFile einer Varaiablen zu weißt (ini), die in der Varaibelen Liste der Prozedur Autostart nicht auftaucht. Ist die Variable ini global? Wenn ja ist es Blödsinn, da du ihr lokal ein Objekt zuweißt und es in der gleichen Prozedur wieder zerstörst.
Wie sieht es mit Form6.Show aus? Existiert das Formular schon? Spricht ist es bei den Projekt Optionen in der Liste der automatisch zu erzeugenden Formulare?
|
|
TomT
      
Beiträge: 116
Suse 9.1 WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 12:51
Hast du deiner Anwendung denn mindestens einen Parameter übergeben?
_________________ ...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 05.01.04 12:58
| Luckie hat folgendes geschrieben: | | Wie sieht es mit Form6.Show aus? Existiert das Formular schon? Spricht ist es bei den Projekt Optionen in der Liste der automatisch zu erzeugenden Formulare? |
Selbst wenn es in der Liste der automatisch zu erzeugenden Formulare ist.. ich gehe mal davon aus, dass Form1 die MainForm ist und damit als erstes erzeugt wird, d.h. Form6 ist in diesem Fall noch nicht erstellt und daher nicht verfügbar. Daraus folgt dann wahrscheinlich auch die EAccessViolation..
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Thunder 
      
Beiträge: 145
WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 14:07
daran, das Form6 erst nach Form1 created wird wirds wohl liegen.
Wie umbastel ich das?? Soll ich die Reihenfolge der FormCreates ändern???
PS.: Ini is global definiert, da ich es in vielen Prozeduren verwende. Da brauche ich nich für jede Prozedur ne neue Variable TIniFile setzen.
Das ist der globale "var":
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Form1: TForm1; Ini: TIniFile; SpeichernOK, i, Anzahl, Fehlerzahl, Intervall1, Intervall2, Counter, PreCounter, Ende, Zeilen: Integer; s, Hauptfehler, Beschreibung, Datei, Benutzer: String; Assistent, Gespeichert: Boolean; Merlin: IAgentCtlCharacter; mHandle: THandle; TrayIcon: TIcon; Bild: TBitmap; |
|
|
Thunder 
      
Beiträge: 145
WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 14:09
Geil, hab das jetz geändert:
Form1 wird nach Form6 created, aber NOCH VOR Form8, da Form8 ne Kompo in Form1 abfragt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| begin Application.Initialize; Application.Title := 'AutoHG'; Application.CreateForm(TInfoDlg, InfoDlg); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.CreateForm(TForm5, Form5); Application.CreateForm(TForm6, Form6); Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm7, Form7); Application.CreateForm(TForm8, Form8); Application.Run; end. |
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.04 17:14
| Thunder hat folgendes geschrieben: | PS.: Ini is global definiert, da ich es in vielen Prozeduren verwende. Da brauche ich nich für jede Prozedur ne neue Variable TIniFile setzen.
|
Also aus purer Faulheit verschwendest du speicher und verstößt gegen das OOP Komzept?
|
|
Thunder 
      
Beiträge: 145
WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 20:07
hä??
wieso pure faulheit? es ist doch so deutlich einfacher und besser.
und macht das deklarieren einer TIniFile-Variable soviel Speicher aus??
Wo kann ich den das geheiligte OOP-Konzept nachlesen?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.04 21:26
Faulheit weil du zu faul bist sie jedes mal lokal zu deklarieren. Gefährlicvh, weil wenn du mal vergißt sie frei zugeben du eventeull mit der "alten" arbeitest. Solche Fehler sind schwer zu finden, wenn dein Programm nicht das macht, was du erwartetst.
OOP Konzept: In diesem Fall globale Variablen vermeiden, Sichtbarkeit einschränken. Ich hoffe du hast die Varieble zu mindest zu einem Feld / Member der Klasse TForm gemacht, dann könnte man es noch verschmerzen.
|
|
Thunder 
      
Beiträge: 145
WinXP
D6 Pers
|
Verfasst: Mo 05.01.04 22:30
was wie feld/member wasn das wie mach ich das??
|
|