Hallo zusammen,
ich habe ein ziemlich merkwürdiges Phänomen, das ich mittlerweile schon fast für einen Bug in Delphi halten würde. Vielleicht kann ja mal der ein oder andere versuchen, das bei sich nachzustellen, um das Problem zu bestätigen. Vielleicht hat aber ja auch jemand eine Erklärung und alles ist viel einfacher als gedacht.
Hintergrund: In einem etwas komplexeren Projekt kam es plötzlich mitten in der Arbeit zu einem spontanen Programmabsturz, der so fies war, dass noch nicht mal der Debugger angesprungen ist, sondern sofort Windows verkündete "Dieses Programm funktioniert nicht mehr...". Zuerst dachte ich, ich hätte mir selbst irgendeine Falle gestellt, irgendwo den Speicher zerschossen, was weiß ich. Das übliche eben.
Mittlerweile konnte ich das Verhalten allerdings mit folgendem Allereinfachst-Projekt nachstellen, wo nun wirklich nichts mehr drin sein sollte, das den Speicher zerschießt. Es handelt sich hierbei nur um ein ganz einfaches Form mit einem Button und einem MouseMove-Ereignis:
Delphi-Quellcode:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
function myDummyFunction: boolean;
private
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Execute;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
myDummyFunction;
end;
function TForm1.myDummyFunction: boolean;
begin
Result:=false;
end;
end.
Sieht doch soweit erstmal einfach aus, oder?
![Smile](images/smilies/icon_smile.gif)
Nun muss man das Programm einfach nur starten, dann einmal auf den Button klicken, dann den Öffnen-Dialog wieder schließen und dann einfach den Mauszeiger über der Form belassen (nicht über dem Button) und eine Minute warten. Nach etwa einer Minute nämlich werden offenbar einige Bibliotheken entladen, die für den Öffnen-Dialog nötig werden. Bei diesem Entladen schmiert das Programm ab, wie oben beschrieben. Es gibt also keine Fehlermeldung, nur Windows, das einem sagt, dass es das Programm beenden muss. Meistens wird das Programm beendet und man kann mit Delphi weiterarbeiten, manchmal schmiert dann Delphi gleich mit ab.
Kein Problem tritt auf, wenn man das Programm ohne Delphi bzw. Debugger startet. Wenn es wie oben schon mal abgeschmiert ist und man es dann noch mal startet, dann läuft es manchmal auch durch, aber nicht immer. Wenn man es aber direkt aus einem sauberen Delphi startet, dann lässt sich das obige immer nachvollziehen.
System: D2009 Prof., Win7 Prof. 32Bit.
Ich wäre für Rückmeldungen sehr dankbar, wie das bei euch aussieht.
Als kleinen Service gibt es noch das Test-Projekt als Anhang.
Bis denn
Bommel
edit: Anhang korrigiert, siehe Post #4.