AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ClipboardListener Fehler

Ein Thema von Incocnito · begonnen am 15. Mär 2023 · letzter Beitrag vom 17. Mär 2023
Antwort Antwort
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

ClipboardListener Fehler

  Alt 15. Mär 2023, 10:25
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
Angehängte Dateien
Dateityp: zip ClipboardListener2.zip (8,5 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ClipboardListener Fehler

  Alt 15. Mär 2023, 13:05
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#3

AW: ClipboardListener Fehler

  Alt 16. Mär 2023, 09:01
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

Geändert von Incocnito (16. Mär 2023 um 09:13 Uhr)
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#4

AW: ClipboardListener Fehler

  Alt 16. Mär 2023, 11:14
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.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#5

AW: ClipboardListener Fehler

  Alt 16. Mär 2023, 17:29
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]
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: ClipboardListener Fehler

  Alt 16. Mär 2023, 22:20
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.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#7

AW: ClipboardListener Fehler

  Alt 16. Mär 2023, 23:09
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: ClipboardListener Fehler

  Alt 17. Mär 2023, 11:07
besser?

😊
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 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