![]() |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Ich persönlich würde CreateWnd nicht benutzen. Im FormCreate das erstellen was man braucht und im FormDestroy alles wieder freigeben.
|
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Die Frage die ich mir grad stelle: Wenn du FormCreate verwendet, wofür benötigst du jetzt noch CreateWnd?
Und angenommen das
Delphi-Quellcode:
steht jetzt im FormCreate, wo tritt denn die AccessViolation auf?
FStream := TFileStream.Create('Testfile.def', fmCreate);
FFileWriter := TWriter.Create(FStream,1024); 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. |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Zitat:
@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:
Kann also sein, das ich das inherited vorher versehentlich gelöscht habe.
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. 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! |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
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. :cheers: |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Wenn du den Debugger benutzt, dann brauchst du nicht suchen, sondern du findest die Stelle ganz automatisch.
Haltepunkt auf das
Delphi-Quellcode:
und dann mit F7 in das inherited hineinsteppen. Schwupps bist du da ...
begin
|
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Es fehlt allerdings noch das Exceptionhandling. Und für die Pfadnamen verwende doch besser die TPath und TDirectory records.
|
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Ist es überhaupt empfelenswert TWriter für Records zu benutzen ?
Zitat:
andere Zwecke ausprobiert. Rollo |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Zitat:
Zitat:
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. |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
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 |
AW: EAccessViolation beim Schreiben von Daten in Datei oder Stream
Sorry, ich konnte nirgendwo die verwendete Delphi Version sehen. Du solltest das aber trotzdem besser so machen (geht auch mit D7):
Delphi-Quellcode:
Wie teilweise auch schon von Klaus vorgeschlagen.
Directory := IncludeTrailingPathDelimiter(ExtractFilePath(Paramstr(0)));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 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