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
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation beim Schreiben von Daten in Datei oder Stream

Ein Thema von DualCoreCpu · begonnen am 3. Aug 2015 · letzter Beitrag vom 4. Aug 2015
 
DualCoreCpu
(Gast)

n/a Beiträge
 
#12

AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream

  Alt 3. Aug 2015, 18: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
 


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 18:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz