Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt (https://www.delphipraxis.net/206383-runtime-error-216-beim-schliessen-des-programs-nur-wenn-save-opendialog-ausgefuehrt.html)

AuronTLG 16. Dez 2020 09:15

Delphi-Version: 10.4 Sydney

Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Moin,

ich habe ein seltsames Problem:

Ich bekomme den Runtime Error 216 nach dem Schließen, aber nur dann, wenn ein OpenDialog oder SaveDialog ausgeführt wurde.
Das Programm wird durch Schließen der Hauptmaske beendet, kein ExitProcess o.Ä., bezüglich Delphi Versionen sowohl in 10.3.3 als auch 10.4.1 nachvollziehbar. ExitProcess unterbindet das Ganze logischerweise.
Weiterhin ist es unerheblich, wie der Dialog gehandhabt wird. Ob nun die Komponente in der Designeransicht auf der Form liegt oder nur im Quellcode erzeugt wird macht keinen Unterschied.
Was damit genau gemacht wird ist ebenfalls unerheblich. Ich hab zum Testen einen OpenDialog implementiert, der nichts weiter tut als ne ShowMessage mit dem FileName auszugeben und das reicht bereits.

Was der Runtime Error 216 aussagt ist mir klar, nur ergibt der Zusammenhang mit den Dialogs überhaupt keinen Sinn für mich. Wenn jemand das Problem schonmal hatte oder nen Ansatz weiß wäre das sehr hilfreich.

Bernhard Geyer 16. Dez 2020 11:13

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Mit dem Ausführen des Open/Save-Dialogs werden alle im Windows Explorer registierten Extensions geladen.
Ich vermute mal das eines davon nicht in einem Delphi/VCL-Programm lauffähig ist, weil es irgendwelchen Mist baut.

Hatte auch mal Probleme mit einem (hoffnungslos veralteten) Plugin aus dem Corel-Umfeld.

Aviator 16. Dez 2020 11:25

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Wenn es an veralteten Shell Extensions liegen sollte, dann würde ich vorschlagen, dass du mal versucht, diese nacheinander mit den Sysinternals Autoruns zu deaktivieren. Mit Windows 10 kann man ja recht gut den Windows Explorer per TaskManager neu starten. Wenn du aber auf Nummer Sicher gehen willst, dann kannst du auch den Rechner komplett rebooten.

AuronTLG 16. Dez 2020 11:28

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Hmm...

Ich habe es bei mehreren Programmen nachvollziehbar, aber es ist kein grundlegendes Problem.
Zum einen kann ich in einem kleinen Testprogramm problemlos nen Dialog öffnen, ohne dass der Runtime Error kommt.
Zum anderen gibt es ein paar Forms mit Dialogs, die den Runtime Error am Schluss nicht auslösen.
Haben die Open/Savedialogs Attribute/Einstellungen, die irgendeinen Einfluss darauf haben? Optionen habe ich mal verglichen, scheinen aber keine Auswirkungen darauf zu haben.

Bernhard Geyer 16. Dez 2020 12:29

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
kann meherer Ursachen habe.
Hast du evtl. eine TWebbrower der nicht im IE7-Modus laufen muss?
Hast du evtl. irgendwas mit DirectX?
...

AuronTLG 16. Dez 2020 13:12

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Neue Erkenntnis:
Problem tritt nur mit TSaveDialog & TOpenDialog auf. Die neueren TFileOpenDialog & TFileSaveDialog lösen es nicht aus.
Damit hätte ich zumindest schonmal nen Workaround. Die Komponenten sollte ich ja sowieso mal austauschen in Anbetracht der Tatsache, dass die Letzteren deutlich moderner sind.

himitsu 16. Dez 2020 13:42

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Zitat:

Zitat von AuronTLG (Beitrag 1479249)
Problem tritt nur mit TSaveDialog & TOpenDialog auf. Die neueren TFileOpenDialog & TFileSaveDialog lösen es nicht aus.

Interessant ist aber, dass die intern genutzten Dialoge (genutzte WinAPI) bei Beidem im aktuellen Delphi identisch sind,
außer Du hast ofOldStyleDialog benutzt oder NewStyleControls auf False gestellt.

Wenn, dann kann es ja nur noch bei der Weiterleitung von der alten Klasse auf neue API einen Fehler geben, wie z.B. ein Interface, welches nicht freigegeben wird.


Da man WinXP/9x eh nicht mehr unterstützen will, gibt es aber sowieso keinen Grund immernoch die "alten" Klassen zu benutzen.

AuronTLG 16. Dez 2020 14:03

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Ich habe eben mal rumprobiert, nachdem ich unter Anderem diesen Link hier gefunden habe.

Komischerweise scheint das bei mir aber nicht so zu funktionieren wie dort beschrieben:
Der Dialog, den ich durch expliziten TFileOpenDialog erhalte, ist definitiv der Moderne (mit Vorschau und Suche etc) im Gegensatz zu dem Alten, den ich durch TOpenDialog erhalte, auch wenn die im Link beschriebenen Bedingungen eingehalten werden.
TOpenDialog gibt mir immer den alten (zumindest optisch), ganz egal was ich tue.

AuronTLG 16. Dez 2020 14:17

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Okay, so wie es aussieht ist mein Styling dafür verantwortlich...
Sobald das Programm mit TStyleManager.TrySetStyle/SetStyle gestylt wurde, rufen die TOpenDialogs den alten auf. Ohne Stil rufen sie den neuen auf.

himitsu 16. Dez 2020 14:54

AW: Runtime Error 216 beim Schließen des Programs nur wenn Save/Opendialog ausgeführt
 
Delphi-Quellcode:
function TOpenDialog.DoExecute(Func: Pointer; ParentWnd: HWND): Bool;
...
begin
  if (Win32MajorVersion >= 6) and UseLatestCommonDialogs and
     not (TStyleManager.IsCustomStyleActive and (shDialogs in TStyleManager.SystemHooks)) and
     IsNewCommonCtrl and (Template = nil) and IsAppThemed and
     not (Assigned(FOnIncludeItem) or Assigned(FOnClose) or Assigned(FOnShow)) then
  begin

    // über TFileDialogWrapper den TFileOpenDialog verwenden

    Exit;
  end;
 
  // das die alte API benutzen (eventuell noch durch NewStyleControls das OFN_EXPLORER deaktivert)

end;
Eventuell hilft shDialogs in TStyleManager.SystemHooks ??


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz