![]() |
ClipboardListener Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Zusammen,
ich habe mal versucht einen Clipboard-Listener zu bauen. Die Idee dahinter war, dass die Anwender einen bestimmten Text kopieren in dem eine Textfolge vorkommt (konkret eine KIM-Nachricht mit einem E-Rezept-Token). Dann soll im Hauptprogramm eine Meldung kommen ala "jetzt mit diesen Werten arbeiten". Ich wollte das allerdings offen halten, so dass ich da auch andere Prüfungen einbauen kann. Im ersten Schritt prüfe ich ganz billig, ob ein Schlüssel-Text vorkommt und starte dann die Funktionen aus einer anderen Unit. Ich denke ich baue das noch um, dass die ClipboardListener-Unit selbst gar nichts von den Test-Units weiß und ich nur Aufrufe als Liste habe, die ich dann durchsteppen kann. Aber das mache ich erst, wenn das so läuft. Ich habe eine Beispiel-App gebaut, die wunderbar läuft. Baue ich das Modul (ich habe es vorerst nur als Datamodule und nicht als Thread gebaut, das vielleicht später) in das Hauptprogramm ein hingegen, kommt immer einmal die Meldung "... EClipboardException mit der Meldung 'Zwischenablage Zugriff verweigert kann nicht geöffnet werden' aufgetreten." danach läuft es normal. Aber diese Meldung jedes Mal, wenn ich Strg+C drücke. Außerdem bekomme ich die Meldung 3 Mal. Das aber auch im Test-Programm. Das ist nicht schimm, aber seltsam. Vielleicht hat da auch so jemand eine Erklärung für. Liebe Grüße aus dem Norden Incocnito |
AW: ClipboardListener Fehler
Für Interprozesskommunikation gibt es so viele Möglichkeiten, dass ich mich frage, wieso du ausgerechnet die Zwischenablage verwenden möchtest?
Warum schickst du die Daten nicht einfach direkt an dein Hauptprogramm? Der Fehler kommt, wenn die Zwischenablage noch in einem Programm geöffnet ist. Das ist normal. Beim Zugriff auf die Zwischenablage musst du immer damit rechnen, dass ein anderes Programm diese gerade blockiert. Du solltest es dann einfach direkt erneut versuchen, z.B. dreimal mit einigen Millisekunden Abstand. Erst danach solltest du den Fehler durchlassen und weitergehend behandeln / anzeigen. |
AW: ClipboardListener Fehler
Moin Jaenicke,
ich kann ja schlecht für alle möglichen und unmöglichen E-Mail-Clients, die unsere Kunden verwenden ein PlugIn bauen um Infos aus den Nachrichten zu holen. Daher war die Überlegung dem Kunden zu sagen "Kopier den Text einfach in die Zwischenablage, den Rest macht unser Programm". Wenn ich dann fest stellen kann, dass im kopierten Text der zu verwendene Teil vor kommt, kann ich dem Anwender anbieten diesen zu übernehmen. Ich habe mit die Clipboard-Unit von Delphi nochmal angesehen. Leider wird hier (wenn das Open nicht klappt) direkt eine Exception geworfen. Wäre Nice, wenn es eine "TryOpen"-Funktion dort geben würde, welche zurück gibt, ob das Open geklappt hat. Da aber Delphi-Weit diese Clipboard-Unit verwendet wird und dort ein Zähler hochgezählt wird um sicherzustellen, dass nur einmal Winapi.Windows.OpenClipboard() aufgerufen wird, kann ich nicht einfach eine eigene Unit machen, die sowas kann. Exceptions finde ich nie schön, kann nichtmal genau sagen warum. Ich habe immer das Gefühl, dass damit ein unerwarteter/unkontrollierter Programmablauf erzeugt wird. Außerdem finde ich es unschön, wenn beim Debuggen Exceptions kommen (ja kann man aus schalten, nein finde ich trotzdem doof). Ich bin mir noch nicht sicher, wie ich das Problem am Besten löse. Vielleicht baue ich einen TMyClipboard der das kann und überschreibe den vorhandenen mit "SetClipboard". Edit: Nevermind "private - Ein private-Element kann nur innerhalb der gleichen Unit verwendet werden. Aus anderen Units ist ein Zugriff nicht möglich." Das geht nicht, so wie ich mir das gedacht habe. Und alle Funktionen zu kopieren scheint mir auch Quatsch. Danke schonmal für den Denkanstoß und die Zeit. Liebe Grüße Incocnito |
AW: ClipboardListener Fehler
Wie wäre es mit einem Classhelper mit den von jaenicke empfolenen Optionen:
Delphi-Quellcode:
...
TClipBoardHelper = class helper for TClipboard
public function TryOpen(TryCount: Integer = 3; TryDelay: Cardinal = 5): Boolean; end; { TClipBoardHelper }
Delphi-Quellcode:
Getestet habe ich das aber nicht und die Defauls sind nur ein Beispiel.
function TClipBoardHelper.TryOpen(TryCount: Integer = 3; TryDelay: Cardinal = 5): Boolean;
begin repeat try Open; Result := True; except Result := False; if TryCount > 0 then begin Dec(TryCount); Sleep(TryDelay); end; end; until Result or (TryCount = 0); end; |
AW: ClipboardListener Fehler
Moin zusammen!
Es ist doch eine kopierte Klasse geworden. Das Problem ist ja nicht das Open 3x zu probieren, sondern dass zuerst eine Exception gekommen ist. Er würde ja im Debugger trotzdem nervig durchschlagen. ;-) Mit der kopierten Klasse tut das nun so, wie ich mir das vorstelle, auch wenn mir eine vererbte Klasse lieber gewesen wäre. Wenn man den Rückgabewert auf "-1" setzt (keine Ahnung, wo das dokumentiert war, habe mich da nur dran erinnert, konnte aber in der MSDN nichts finden) zeigt man wohl dem Aufrufer, dass man die Nachricht verarbeitet hat, denn dann kam die nicht mehr 3x. Liebe Grüße an alle Incocnito [Closed] |
AW: ClipboardListener Fehler
Hallo,
der Zugriff auf das Clipboard wird von Windows periodisch gesperrt. Und das auch, wenn man nicht diesen Clipboard-History-Viewer (Windows+V) gerade laufen hat. Das wurde gerade ab Windows10/11 ganz schlimm. Also: try/except und im Zweifel in einer Schleife (for i=1 to 10 do TryClipboard?) versuchen, den Zugriff zu bekommen. |
AW: ClipboardListener Fehler
und noch besser ...
wenn man selber (oder wer anderes) ganz oft drauf zugreift, dann stürzen andere Programme auch öfters ab. dann knallen andere Programme auch öfters ... z.B. die Delphi-IDE :freak: |
AW: ClipboardListener Fehler
besser?
😊 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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