Einzelnen Beitrag anzeigen

DualCoreCpu
(Gast)

n/a Beiträge
 
#13

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