Wir haben hier in einem unserer Projekte eine äusserst merkwürdige Sache: In einem Formular, in welchem Meldungen bearbeitet werden, geschieht seit der Implementation einer Dateiauswahl via Opendialog folgendes: Bei Query1.Post erscheint die Fehlermeldung, dass Query2 weder im Editier- noch im Einfügemodus sei. Query2 kommt aber in diesem Formular gar nicht vor! Wird der OpenDialog zwischen Query1.Edit und Query1.Post nicht bemüht, erscheint der Fehler nicht. Mit dem OpenDialog soll in ein neues Feld der Tabelle ein Dateiname eingefügt werden. Der Opendialog wird nur ausgeführt, wenn sich Query1 im Editier- oder Einfügemodus befindet. Nachdem wir testweise in der Methode, in der normalerweise der Dateiname ausgewählt und eingefügt werden soll, via Code einen fixen Dateinamen einfügen, erscheint der Fehler nicht.
Im Projekt MyProblemProjekt.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Query2: Datenmenge weder im Editier- noch im Einfügemodus' aufgetreten.
Ein weitres seltsames Phänomen besteht darin, dass beim Debuggen der Formular-Post-Methode kein Fehler entsteht und die via OpenDialog ausgewählte Datei einwandfrei in die dafür vorgesehene Spalte eingetragen wird. Auch bei Query1.Cancel entsteht kein Fehler, immer nur bei Query1.Post:
Delphi-Quellcode:
procedure TFormMeldung.Lbl_AnhangDblClick(Sender: TObject);
var
Datei : string;
begin
if EditModus then
begin
OpenDlg.Title := 'Datei öffnen';
if OpenDlg.Execute then
begin
Datei := OpenDlg.FileName;
if FileExists(Datei) then
DM.Query1.FieldByName('DATEI').AsString := Datei;
end;
end;
end;
procedure TFormMeldung.MM_PostClick(Sender: TObject);
begin
if AppendModus Or
DM.Query1.FieldByName('DATUM').IsNull Then
DM.Query1.FieldByName('DATUM').AsDateTime := Now;
DM.Query1.Post; // hier entsteht der Fehler, jedoch nicht beim Debuggen, aber auch im Debugmodus
end;
Wir hatten auch schon an defekte Hardware gedacht, konnten den Fehler aber auf zwei anderen Firmenrechnern reproduzieren. Wir arbeiten an diesem Projekt mit Delphi XE7 Architect. Nun waren wir erst einmal ratlos.
Im Laufe des Abends, nachdem die Kollegen am frühen Nachmittag schon alle wegwaren, bin ich dann auf die Ursache gestossen: Das betreffende Formular ist ein modales Fenster, das Hauptformular, das Query2 verwendet, liegt dahinter. Nach dem Beenden des OpenDialogs lag das Hauptfenster zwar noch immer hinter dem modalen Fenster, hatte aber den Fokus erhalten. Mit einem simplen Self.SetFocus am Ende von
procedure TFormMeldung.Lbl_AnhangDblClick(Sender: TObject); war der Fehler behoben.
Kennt jemand von euch diese Problematik? Und wenn ja, wie hast du, habt ihr sie gelöst?
Einige Bezeichner sind nicht Original, die muss ich laut Chef verschleiern, wenn ich öffentlich über Internas unserer Projekte schreibe.