Entwickler-Ecke

Dateizugriff - Lesefehler


ZSKing - So 23.03.08 21:54
Titel: Lesefehler
Moin Moin!
Ich habe einen gaaanz einfach HTML-Editor geschrieben und am Anfang wird ein HTML-Standard-Code aus einer *.txt-Datei geladen. Nun habe ich das Problem, dass bei einem Start über eine Verknüpfung nur auf dem Desktop (oder wo die Verknüpfung auch immer liegt) nach der *.txt-Datei gesucht wird... Natürlich könnte man ja einfach schreiben, dass C:\Programme\ .... verwendet werden soll, aber die Volumenbezeichnung kann ja von Anwender zu Anwender verschieden sein und das Installations-Verzeichnis kann man auch ändern.

Ich brauche also irgend etwas, das meinem Editor sagt wo die .exe liegt, damit er an der richtigen Stelle nach der Datei sucht! :) Wäre super wenn ihr mir weiterhelfen könntet!


ZSKing


Silas - So 23.03.08 21:58

Moin!

Dafür gibts Application.ExeName oder ParamStr(0). Für den Pfad verwendest du einfach ExtractFilePath(Application.ExeName). :wink:


ZSKing - So 23.03.08 22:00

thx


ZSKing - Mo 24.03.08 20:12
Titel: Neue Frage [Titel geändert]
Also die Fragestellung aus dem ersten Post habe ich wie folgt:

Nach der Erstellung einer String-Variable mit dem Namen Pfad ff. Code:

Delphi-Quelltext
1:
2:
pfad := ExtractFilePath(Application.ExeName);
Memo1.Lines.LoadFromFile(pfad+'Start.txt');


------------------------------------------------------------------------------------------------------------------

So und jetzt ein neues Problem. Ich bekomme bei einem anderen Teil meines Programms folgende Fehlermeldung beim Compilieren:


Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt HTMLsimple.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 004188A7 in Modul 'HTMLsimple.exe'. Lesen von Adresse 445C3A5B' aufgetreten.
---------------------------
Anhalten   Fortsetzen   Hilfe   
---------------------------



Bei Anhalten wird folgender Code hervorgehoben:

Delphi-Quelltext
1:
responseStream.free;                    



Der komplette Code der Prozedur lautet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tsimpleupdater.FormCreate(Sender: TObject);
var responseStream: TFileStream;
begin
datei := ExtractFilePath(Application.ExeName)+'HTMLUpdater.exe';
dateichar := PChar(datei);
//Download Updater Anfang
responseStream := TFileStream(datei);
IdHTTP1.Get('http://www.sascha-st.de/simple/HTMLUpdater.exe', responseStream);
responseStream.free;
//Download Updater Anfang Ende
ShellExecute(Application.Handle,'open',dateichar,nil,nil,SW_SHOW);
mainform.close;
end;



Ich denke mehr Code wird nicht benötigt, aber zur Sicherheit der komplette Code:

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:
45:
46:
47:
unit Updater;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, IdBaseComponent, IdComponent,
   IdTCPClient, IdHTTP, Shellapi, IdTCPConnection, ComCtrls;

type
  Tsimpleupdater = class(TForm)
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    StatusBar1: TStatusBar;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  simpleupdater: Tsimpleupdater; datei: string; dateichar: Pchar;

implementation

uses Main;

{$R *.dfm}


procedure Tsimpleupdater.FormCreate(Sender: TObject);
var responseStream: TFileStream;
begin
datei := ExtractFilePath(Application.ExeName)+'HTMLUpdater.exe';
dateichar := PChar(datei);
//Download Updater Anfang
responseStream := TFileStream(datei);
IdHTTP1.Get('http://www.sascha-st.de/simple/HTMLUpdater.exe', responseStream);
responseStream.free;
//Download Updater Anfang Ende
ShellExecute(Application.Handle,'open',dateichar,nil,nil,SW_SHOW);
mainform.close;
end;

END.




Ich hoffe ihr könnt helfen die Fehlermeldung zu beheben!
ZSKing


PS:
Sollte man bei der Fehlermeldung der Compilierung auf Fortsetzen klicken, kommt eine Programm-Fehlermeldung:

Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
HTML simple // Pre-Alpha
---------------------------
Zugriffsverletzung bei Adresse 004188A7 in Modul 'HTMLsimple.exe'. Lesen von Adresse 445C3A5B.
---------------------------
OK   
---------------------------


Silas - Mo 24.03.08 22:46
Titel: Re: Neue Frage [Titel geändert]
user profile iconZSKing hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tsimpleupdater.FormCreate(Sender: TObject);
var responseStream: TFileStream;
begin
datei := ExtractFilePath(Application.ExeName)+'HTMLUpdater.exe';
dateichar := PChar(datei);
//Download Updater Anfang
responseStream := TFileStream(datei);
IdHTTP1.Get('http://www.sascha-st.de/simple/HTMLUpdater.exe', responseStream);
responseStream.free;
//Download Updater Anfang Ende
ShellExecute(Application.Handle,'open',dateichar,nil,nil,SW_SHOW);
mainform.close;
end;

An der markierten Stelle castest du einen String in eine Klasse. Das kann nicht funktionieren (wundert mich, dass sich hier der Compiler gar nicht beschwert). Was du eigentlich haben wolltest, ist denke ich ein Konstruktor. Der hätte hier folgendermaßen auszusehen:

Delphi-Quelltext
1:
responseStream := TFileStream.Create(datei, fmOpenWrite or fmShareDenyRead or fmShareDenyWrite);                    

fmOpenWrite öffnet die Datei zum Schreiben, und fmShareDenyRead or fmShareDenyWrite verbietet gemeinsamen Zugriff auf die Datei. Je nach dem, wie weit du diesen erlauben möchtest, kannst du einen oder beide Werte weglassen.