Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler beim Aufruf von eigener gebastelter Prozedur?!?!?


Thunder - Mo 05.01.04 02:44
Titel: Fehler beim Aufruf von eigener gebastelter Prozedur?!?!?
Moin,

Ich habe folgenden Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Autostart
  If ParamStr(1) = '/autostart' then
    Autostart
  Else
...


Um diese Prozedur aufzurufen:

Delphi-Quelltext
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:
//Autostart-Prozedur
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???


Delete - 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 - Mo 05.01.04 12:51

Hast du deiner Anwendung denn mindestens einen Parameter übergeben?


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


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


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


Delete - 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 - Mo 05.01.04 22:30

was wie feld/member wasn das wie mach ich das??