Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ClipboardListener Fehler (https://www.delphipraxis.net/212682-clipboardlistener-fehler.html)

Incocnito 15. Mär 2023 09:25

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

jaenicke 15. Mär 2023 12:05

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.

Incocnito 16. Mär 2023 08:01

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

BerndS 16. Mär 2023 10:14

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:
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;
Getestet habe ich das aber nicht und die Defauls sind nur ein Beispiel.

Incocnito 16. Mär 2023 16:29

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]

hoika 16. Mär 2023 21:20

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.

himitsu 16. Mär 2023 22:09

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:

hoika 17. Mär 2023 10:07

AW: ClipboardListener Fehler
 
besser?

😊


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.

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