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!