Stochastische Access Violation beim Schließen einer Form!

Rund um die LCL und andere Komponenten
Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von Euklid »

Patito hat geschrieben:@Euklid:
Ist es mit TForm.Create(nil) immer noch derselbe AV?
Habe deinen Vorschlag soeben in meiner Version von Promathika umgesetzt. Bin gespannt, ob es noch zur AV kommt.

Application.CreateForm() ist auf jedenfall falsch wenn man das Formular selbst freigeben will.
TForm.Create(nil) sollte zumindest erst mal das Problem in DoIdleActions() lösen.
Ok, dann steckt hier eine mögliche Fehlerquelle. Im Laufe des Tages wollte der CPU-Quäler sich nochmal auf Bugsuche begeben, nehme an, er wird deinen Vorschlag auch probieren. Mit Windows wird er wesentlich früher sagen können, ob die AV noch auftritt.
Es gibt aber wie gesagt noch einen Haufen weiterer Fehlerquellen, auf die man achten muß.
Ja, mir erscheint der richtige Umgang mit Forms in der Tat recht undurchschaubar - gerade weil, wie du schilderst, so viele Prozesse im Hintergrund ablaufen, über die man als jemand, der nicht in die Internas zur Formverwaltung eingeweiht ist, kaum einen Überblick hat. Deshalb wäre ich dafür, dass von Lazarus aus Funktionen angeboten werden, die die Formprogrammierung entsprechend vereinfachen.

Viele Grüße, Euklid

EDIT:
So. Habe das gerade probiert:
Wenn ich

Code: Alles auswählen

Application.CreateForm(tFFuncEdit, FFuncEdit);
durch

Code: Alles auswählen

FFuncEdit:=tFFuncEdit.create(nil);
ersetze, setzt er FFuncEdit offenbar auf nil und es kommt bei der nächsten Wertzuweisung zu einer AV. War der Tipp möglicherweise anders gemeint?

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von theo »

Euklid hat geschrieben: durch

Code: Alles auswählen

FFuncEdit:=tFFuncEdit.create(nil);
ersetze, setzt er FFuncEdit offenbar auf nil und es kommt bei der nächsten Wertzuweisung zu einer AV. War der Tipp möglicherweise anders gemeint?
Wie meinst du das?

Sowas geht bei mir ohne Probleme:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Aform:=TForm2.create(nil);
  Aform.Caption:='test';
  Aform.ShowModal;
  Aform.free;
end;

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von CPU-Quaeler »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Aform:=TForm2.create(nil);
  Aform.Caption:='test';
  Aform.ShowModal;
  Aform.free;
end;
@Theo: Nachdem ich deinen zitierten Vorschlag nochmals ausprobiert habe, hatte ich schon beim Öffnen der Forms Zugriffsverletzungen, aber andere. Aber das war dadurch begründet, dass ich "OnCreate" schon versucht habe, an der Form veränderungen umzusetzen und aktualisierungs-Routinen aufzurufen (wobei ich noch nicht so ganz nachvollziehen kann, warum - schließlich hat es vorher schon so funktioniert). Also hab ich die ganzen Routinen, die mit der Erzeugten Form arbeiten (und schon einmal beim Öffnen der Form ausgeführt werden müssen), in das "OnShow"-event verlagert, und siehe da...keine AV mehr....zumindest nicht nach ca. 50mal Öffnen, aktualisieren, Optionen ändern und schließen. :mrgreen: Ich hoffe mal, das Problem hat sich damit ein für alle mal erledigt. In Win7x64 tritt es nicht mehr auf. Jetzt muss es nur noch in Ubuntu funktionieren => Test folgt! Vielen Dank nochmal, auch an die anderen, die sich an der Diskussion beteiligt haben.

Euklid und ich werden berichten, ob das Problem damit auch in Linux behoben ist.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von Socke »

CPU-Quaeler hat geschrieben:@Theo: Nachdem ich deinen zitierten Vorschlag nochmals ausprobiert habe, hatte ich schon beim Öffnen der Forms Zugriffsverletzungen, aber andere. Aber das war dadurch begründet, dass ich "OnCreate" schon versucht habe, an der Form veränderungen umzusetzen und aktualisierungs-Routinen aufzurufen (wobei ich noch nicht so ganz nachvollziehen kann, warum - schließlich hat es vorher schon so funktioniert). Also hab ich die ganzen Routinen, die mit der Erzeugten Form arbeiten (und schon einmal beim Öffnen der Form ausgeführt werden müssen), in das "OnShow"-event verlagert, und siehe da...keine AV mehr....zumindest nicht nach ca. 50mal Öffnen, aktualisieren, Optionen ändern und schließen. :mrgreen: Ich hoffe mal, das Problem hat sich damit ein für alle mal erledigt. In Win7x64 tritt es nicht mehr auf. Jetzt muss es nur noch in Ubuntu funktionieren => Test folgt! Vielen Dank nochmal, auch an die anderen, die sich an der Diskussion beteiligt haben.

Euklid und ich werden berichten, ob das Problem damit auch in Linux behoben ist.
Das OnCreate wird in TCustomForm.Create aufgerufen. Alles was man von Hand im Code es abgeleiteten Constructors bearbeitet ist noch nicht vorhanden. Alternativ muss man das Event am Ende des eigenen Constructors von Hand aufrufen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von piper62 »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Aform:=TForm2.create(nil);
  Aform.Caption:='test';
  Aform.ShowModal;
  Aform.free;
end;
Der schon zitierte Code sollte einwandfrei auf jedem OS laufen.
Wie schon angedeutet ist genau darauf zu achten wie das Create aber auch das Free ablaufen. Ev. kommt es hier mit anderen dynamisch erzeugten Objekten auf die zugegriffen wird zu Kollisionen.
Wir erzeugen in unserer Anwendung dauernd Forms dynamisch, auch mit Zugriff auf Datenbanken, und haben nur dann Probleme gehabt wenn an folgenden Stellen nicht sorgfältig vorgegangen wurde:
-OnCreate
-OnShow
-OnActivate
-OnClose, bzw. dem anschließenden Free.

Mein Tipp ist hier nochmal nachzuforschen wie die abhängigen Objekte erzeugt und wieder freigegeben werden.

Grüße,
Piper

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von Patito »

Wie ich das beobachtet habe schieben Delphi-Entwickler gerne per Trial&Error Code zwischen OnCreate, OnShow, OnActivate hin und her bis die Anwendung nicht mehr crasht. (Insesondere wenn man es mit mehrere Formulare gleichzeitig zu tun hat).

Ein wenig solider ist es gleich eine View-Klasse zu erstellen, die dann für die Erstellung und Entsorgung der Daten zuständig ist.

z.B. sowas:

Code: Alles auswählen

TMyView = class(TObject)
public
  Form1: TForm1;
  Form2: TForm2;
 
  constructor Create;
  destructor Destroy; override;
end;
 
constructor TMyView.Create()
begin
  self.Form1 := TForm1.Create;
  self.Form2 := TForm2.Create;
  //...erstellen der Zusatzdaten
  //..... self.Form1.xyz:= 
end;
TMyView kann dann die Zusatz-Daten erzeugen und initialisieren. Damit hat man die Reihenfolge deutlich besser im Griff. Und man hat auch noch einen Ort, an dem man leicht verschiedene Init() und CleanUp() Prozeduren ablegen kann.
Zuletzt geändert von monta am Mo 19. Okt 2009, 20:06, insgesamt 1-mal geändert.
Grund: Highlighter auf Pascal gesetzt

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von Euklid »

CPU-Quaeler hat geschrieben:Euklid und ich werden berichten, ob das Problem damit auch in Linux behoben ist.

Hallo Leute,

ich freue mich, Euch berichten zu können: Auch unter Linux scheinen alle Probleme behoben zu sein!

Nocheinmal ein Dank an alle, die uns hier mit Rat und Tat geholfen haben!

Viele Grüße, Euklid

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von monta »

@euklid: na dann...ich warte ;)
Johannes

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Stochastische Access Violation beim Schließen einer Form!

Beitrag von Euklid »

monta hat geschrieben:@euklid: na dann...ich warte ;)
Promathika V1.0 is coming soon... ;)

Antworten