Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EAccessViolation beim Schreiben von Daten in Datei oder Stream (https://www.delphipraxis.net/186096-eaccessviolation-beim-schreiben-von-daten-datei-oder-stream.html)

DualCoreCpu 3. Aug 2015 09:48

EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Hallo,

ich weiß nicht mehr weiter. Ich versucher einen Record mit Stringdaten in einen TFileStream zu schreiben. Leider wird nichs geschrieben.

Hier der Quellcode:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileServer, StdCtrls;

type
  TTestRec = record
    Feld1: String;
    Feld2: String;
    Feld3: String;
  end;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    btnOk: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormDestroy(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure btnOkClick(Sender: TObject);
  private
    { Private declarations }
    FStream: TFileStream;
    FFileWriter: TWriter;
    FTestFields: TTestRec;
  public
    { Public declarations }
    procedure CreateWnd;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnOkClick(Sender: TObject);
begin
  FFileWriter.WriteString(FTestFields.Feld1);
  FFileWriter.WriteString(FTestFields.Feld2);
  FFileWriter.WriteString(FTestFields.Feld3);
end;

procedure TForm1.CreateWnd;
begin
  FStream := TFileStream.Create('Testfile.def', fmCreate);
  FFileWriter := TWriter.Create(FStream,1024);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  FTestFields.Feld1 := Edit1.Text;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  FTestFields.Feld2 := Edit2.Text;
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
  FTestFields.Feld3 := Edit3.Text;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FFileWriter.Free;
end;

end.
Vorher hatte ich es mit dem Typ File versucht, hatte aber auch keinen Erfolg. Auch mit TFileStream funktioniert es nicht. Bei letzterem hatte ich exta Shortstrings folgender Form verwendet:

Delphi-Quellcode:
type
  TMyTestRec = record
    Feld1: String[30];
    Feld2: String[255];
    Feld3: String[20];
  end;
Auch die Klammerung des Records mit {$H-}{$H+} führt nicht zum Erfolg.

Habe soeben mal getestet, ob ich bei gestartetem Programm eine Dati in mein Projektverzeichnis kopiren kann. Dies funktioniert, weshalb ich nicht an fehlende Schreibrechte glauben kann. Wo aber liegt dann die Ursache für mein Problem?

mkinzler 3. Aug 2015 09:54

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Hast Du es mal mit der Angabe des kompletten Pfades probiert? Schreibrechte vorhanden?

Union 3. Aug 2015 09:57

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Und wer ruft CreateWnd auf? Override ist Dein Freund ;)

baumina 3. Aug 2015 09:58

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Ich sehe auch kein FormCreate, welches CreateWnd aufrufen würde.

Union 3. Aug 2015 10:01

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Du brauchst kein FormCreate. Das macht der TReader. Es ist zwar gefährlich das so zu tun, weil die Komponenten evtl. noch nicht vollständig initialisiert sind, aber in dem speziellen Fall funktioniert das.

baumina 3. Aug 2015 10:05

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Aber wenn doch CreateWnd nirgends aufgerufen wird, wie lautet denn dann der Dateiname?

Sir Rufo 3. Aug 2015 10:09

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Debugger nehmen, Haltepunkt auf die Zeile, wo der FileStream erzeugt wird und im Debug-Mode starten.

Hält der Debugger jetzt dort an?

Nein -> Dann sorg dafür, dass die Methode auch aufgerufen wird.

So einfach kann einfach sein.

Union 3. Aug 2015 10:11

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Zitat:

Zitat von Sir Rufo (Beitrag 1310757)
So einfach kann einfach sein.

Wenn einfach einfach einfach ist ;)

DualCoreCpu 3. Aug 2015 10:42

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Danke für die Antwort!

Komplette Pfadangabe hilft leider nicht.

Wie war das gleich noch mal mit dem Feststellen ob Schreibrechte, aus dem Programm heraus?

Wenn das Progaramm gestartet ist, kann ich zumindest Dateien in das Verzeichnis kopieren, in welchem das Programm liegt.

@baumina, @Union:

Ja, danke Euch, CreateWnd war das Problem.

Allerdings erhalte ich jetzt eine EFCreateError Exception, egal, ob ich CreateWnd in FormCreate aufrufe oder nicht.

Hieraus ergibt sich neben der Ursache meines Problems eine Verständnisfrage:

- Wie ist die Aurufreihenfolge?

Gewöhnlich wird ein Create Konstruktor zur Initilalisierung der Klasse aufgrufen, im Formular kommt noch FormCreate dazu.

Wann in dieser Reihenfolge wird CreateWnd aufgerufen? Danach oder zwischen Create und Formcreate?

Oder muss ich zwingend selber für den Aufruf sorgen.

Bei mir allerdings kommt die EFCreateError Exception, wenn ich das OVERRIDE dahinter schreibe. Ohne override funktioniert es jatzt. Was ein Workaround wäre, aber nun würd ich gerne wissen wie die korrekte Aufrufreihenfolge ist.

frankyboy1974 3. Aug 2015 11:17

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
 
Hallo,

ich würde jetzt mal vermuten da fehlt ein inherited; in der Methode CreateWnd. Ich musste mich auch erst mal einlesen, ich habe das gefunden

'CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. '.

Soweit ich mich erinnere, muss du wenn du eine Funktion überschreibst auch ein inherited aufrufen (Ich bin kein Delphi-Guru).:pale:

mfg

frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz