AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EAccessViolation beim Schreiben von Daten in Datei oder Stream

EAccessViolation beim Schreiben von Daten in Datei oder Stream

Ein Thema von DualCoreCpu · begonnen am 3. Aug 2015 · letzter Beitrag vom 4. Aug 2015
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 13:00
Ich persönlich würde CreateWnd nicht benutzen. Im FormCreate das erstellen was man braucht und im FormDestroy alles wieder freigeben.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#12

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 14:33
Die Frage die ich mir grad stelle: Wenn du FormCreate verwendet, wofür benötigst du jetzt noch CreateWnd?
Und angenommen das
Delphi-Quellcode:
  FStream := TFileStream.Create('Testfile.def', fmCreate);
   FFileWriter := TWriter.Create(FStream,1024);
steht jetzt im FormCreate, wo tritt denn die AccessViolation auf?

Darüberhinaus solltest du ggf. auch prüfen, ob den TFilestream.Create auch von Erfolg gekrönt ist, bevor du ihn an den TWriter weitergibst.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo ( 3. Aug 2015 um 14:36 Uhr)
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#13

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 19:44
Die Frage die ich mir grad stelle: Wenn du FormCreate verwendet, wofür benötigst du jetzt noch CreateWnd?
Und angenommen das
Delphi-Quellcode:
  FStream := TFileStream.Create('Testfile.def', fmCreate);
   FFileWriter := TWriter.Create(FStream,1024);
steht jetzt im FormCreate, wo tritt denn die AccessViolation auf?

Darüberhinaus solltest du ggf. auch prüfen, ob den TFilestream.Create auch von Erfolg gekrönt ist, bevor du ihn an den TWriter weitergibst.
Die Exception tritt auf, wenn ich schreiben will.

@baumina:

Schon richtig, aber ich habe noch ein anderes Problem. Ich will einen Optionsdialog bauen, der links so eine Baumstruktur hat, wie im aktuellen Lazarus der Projektoptionen-Dialog. Dabei will ich, wenn der Dialog erzeugt ist, die Baumstruktur abhängig von den aktuell gewünschten Einzustellenden Optionen unterschiedlich aufbauen. Dazu muss einerseits der Dialog vollständig erstellt sein, andererseits darf die Baumstruktur noch nicht fertig sein, weil ich dem Dialog gerne über eine Eigenschaft einen Parameter migeben will, der dann über den jeweiligen Aufbau der Baumstruktur entscheidet. Nach Formcreate ist der Dialog einsatzbereit. Wenn nun CreateWnd danach erst aufgerufen würde, wäre CreateWnd möglicherweise mein Freund. Allerdings natürlich nur, wenn CreateWnd nicht vor Show/ShowModal aufgerufen wird. Wenn doch, brauche ich CreateWnd eigentlich nicht und kann hier @bauminas Tipp beherzigen.

Daher die alles entscheidende Frage: Wo wird CreateWnd aufgerufen?

Hallo,

@frankyboy1974:

Kann sein, das das inherited gefehlt hat.

Der folgende Code funktioniert wie er soll, unter Verwendung von CreateWnd:

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);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FStream: TFileStream;
    FFileWriter: TWriter;
    FTestFields: TTestRec;
  public
    { Public declarations }
    procedure CreateFileSystem;
    procedure CreateWnd; override;
  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.CreateFileSystem;
var
  Directory: String;
begin
  Directory := GetCurrentDir;
  if Directory[Length(Directory)]<>'\then Directory := Directory + '\';
  FStream := TFileStream.Create(Directory+'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;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //CreateFileSystem; //das war vorher mein CreateWnd ohne inherited
end;

procedure TForm1.CreateWnd;
begin
  inherited;
  CreateFileSystem; //jetzt wird CreateWnd korrekt aufgerufen.
end;

end.
Kann also sein, das ich das inherited vorher versehentlich gelöscht habe.

Nun aber noch die Frage, wann wird CreateWnd aufgerufen?:

- im Create - constructor (dann wohl in einem Vorfahren, vielleicht TWinControl)

[EDIT] --- Hab soeben mal im VCL Ouellcode nachgeschaut. In TWinControl.Create ist kein CreateWnd. ----

Weiß zufällig jemand, an welcher Stelle CreateWnd aufgerufen wird. In welcher Unit steht das?

Bitte nur wenn es zufällig jemand weiß. Ich besitze die VCL Quelltexte!
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#14

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 19:51
Leider kann ich den vorigen Beitrag nicht mehr bearbeiten, deshalb hier:

Habe soeben den Aufruf von CreateWnd gefunden.

In TScrollingWinControl.Create.

Damit brauche ich für den geplanten Optionsdialog einen anderen Ansatz und kann ebenso gut Bauminas Rat beherzigen.

Danke für alle Eure Antworten.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 23:35
Wenn du den Debugger benutzt, dann brauchst du nicht suchen, sondern du findest die Stelle ganz automatisch.

Haltepunkt auf das begin und dann mit F7 in das inherited hineinsteppen. Schwupps bist du da ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#16

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 4. Aug 2015, 08:12
Es fehlt allerdings noch das Exceptionhandling. Und für die Pfadnamen verwende doch besser die TPath und TDirectory records.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#17

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 4. Aug 2015, 09:08
Ist es überhaupt empfelenswert TWriter für Records zu benutzen ?

Zitat:
Do not directly create writer objects. Writers are automatically created in stream object methods or in global routines that initiate the streaming process. These include:

The global routine ObjectTextToBinary procedure, which directly creates a writer.
The global WriteComponentResFile function, which creates a file stream that creates a writer.
The WriteDescendent method of TStream, which creates a writer object.
Das ist doch eigentlich für Component-Streaming gedacht, habe das zumindest nie für
andere Zwecke ausprobiert.

Rollo
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#18

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 4. Aug 2015, 11:39
Es fehlt allerdings noch das Exceptionhandling.
Ok, danke. Werd ich in der fertigen Version berücksichtigen.

Und für die Pfadnamen verwende doch besser die TPath und TDirectory records.
TDirectory gibt e sin D7 auf jeden Fall, aber TPath???? Ab welcher Delph Version also gibt es Tpath? Neben Delphi 7 habe ich noch Turbo Delphi und Lazarus Portable Version 1.2.6 mit fpc Version 2.6.4.

Allerdings verstehe ich den Einwand nicht. Ich habe zum Erhalt des Directoties die Funktion GetCurrent Dir verwendet, weil mein Tesfile im Verzeichnis der Testanwendung liegt.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 4. Aug 2015, 11:47
GetCurrentDir
Returns the name of the current directory.

GetCurrentDir returns the fully qualified name of the current directory.

Es liefert also nicht zwangsläufig den Pfad Deiner Anwendung zurück.

ExtractFilePath(ParamStr(0)) wäre vielleicht sinnvoller.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#20

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 4. Aug 2015, 11:50
Sorry, ich konnte nirgendwo die verwendete Delphi Version sehen. Du solltest das aber trotzdem besser so machen (geht auch mit D7):
Directory := IncludeTrailingPathDelimiter(ExtractFilePath(Paramstr(0))); Wie teilweise auch schon von Klaus vorgeschlagen.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
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