Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 21.03.22 14:33 
Hallo!

Ich möchte ein Icon in die Zwischenablage kopieren, mit Clipboard.Assign(aIcon); funktioniert das aber nicht. Ich kann das Icon natürlich zuvor in ein Bitmap konvertieren und dieses der Zwischenablage zuweisen, dabei verliere ich aber die eigenschaft Transparent. aber es muss doch auch direkt gehen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mo 21.03.22 14:42 
Das wird vermutlich nicht funktionieren, dazu müßte es ein eigenes Zwischenablageformat für Icons geben.

Lt.

docs.microsoft.com/d...hg/clipboard-formats

ist dem aber nicht so
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 21.03.22 16:18 
Der Internet Explorer kannte ein Format dafür:
docs.microsoft.com/e...is/aa359736(v=vs.85) hat folgendes geschrieben:
CFSTR_MIME_X_ICON TEXT("image/x-icon"), Internet Explorer 9. Windows icon (.ico) MIME type.


Die Frage ist aber was du damit machen möchtest. Möchtest du ein Icon für eine andere Anwendung kopieren oder innerhalb deiner eigenen? Bei einer fremden Anwendung könntest du dort eins kopieren, wenn möglich, und schauen welches Format verwendet wird.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 21.03.22 19:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist aber was du damit machen möchtest. Möchtest du ein Icon für eine andere Anwendung kopieren
Ja, genau das. In die Windows-Zwischenablage. Ich würde ja auch das Bitmap-Format akzeptieren, wenn Transparent bei der Konvertierung erhalten bleibt.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 21.03.22 19:32 
Irfan View kann das. Habe ich vor Jahren verwendet um herauszufinden wie die ContentId's sind um zu identifizieren was man vor sich hat.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 21.03.22 22:50 
Man kann die Formate auch selbst mit EnumClipboardFormats durchgehen, wenn das Zielprogramm das gewünschte Format selbst dort abgelegt hat:
docs.microsoft.com/e...enumclipboardformats
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 23.03.22 17:42 
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Irfan View kann das.
Mein Programm soll's aber auch können! :mrgreen:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Man kann die Formate auch selbst mit EnumClipboardFormats durchgehen
Ist also nicht so einfach, wie ich hoffte.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 24.03.22 09:18 
Die Zwischenablage ist eine recht komplexe Struktur. Microsoft hat einiges geändert über die Jahre was Zugriff und Benachrichtigung von lauschenden Prozessen angeht, das war mal wirklich grausig.
Aber die Zwischenablage in der Lage alles an Daten zu halten und transportieren was es gibt. Sogar parallele Daten sind möglich. Zum Beispiel eine HTML und eine Text Version des gleichen Dokumentes.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.03.22 09:31 
Nicht nur das, man kann sogar nur einen Verweis auf den Inhalt hinterlegen. Erst wenn der Inhalt dann wirklich benötigt wird, muss er geliefert werden. Dadurch kann man auch große Datenmengen sehr schnell in die Zwischenablage kopieren.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 24.03.22 17:22 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Man kann die Formate auch selbst mit EnumClipboardFormats durchgehen, wenn das Zielprogramm das gewünschte Format selbst dort abgelegt hat:
docs.microsoft.com/e...enumclipboardformats
Da blicke ich leider nicht durch. Und es ist nicht das Zielprogramm, das das Icon in der Zwischenablage ablegt, sondern mein Delphi-Programm. Das Zielprogramm soll das Icon dann von dort einlesen.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Nicht nur das, man kann sogar nur einen Verweis auf den Inhalt hinterlegen. Erst wenn der Inhalt dann wirklich benötigt wird, muss er geliefert werden.
Gut und schön, aber das hilft mir nicht weiter! Dass die Zwischenablage Icons nicht so ohne Weiteres verarbeiten kann, finde ich schon seltsam. Schliesslich sind Icons ja eine "typische" Windows-Sache und kein exotisches Datenformat!

Wie also bereite ich die Zwischenablage vor? :nixweiss:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 24.03.22 18:56 
Soll der Anwender dann mit einem anderen Programm interagieren oder soll es nur innerhalb deines Programms zum Kopieren des Icons benutzt werden?
Wenn du ein anderes Programm kennst, welches das Icon-Format unterstützt, dann kannst du mit dem FreeClipboardViewer das Format dir anschauen.

Du kannst auch selber ein Clipboard-Format erstellen: Register and use a custom clipboard format in Delphi (Stichwörter: Get/SetAsHandle).

Aber was genau funktioniert bei Clipboard.Assign(aIcon) denn nicht?
Ich habe in der Doku zu Clipboard.Assign nachgeschaut und gesehen, daß alle TPersistent-Klassen unterstützt werden sollten, also auch TIcon.
Oder wird eine Exception erzeugt?

Und warum sollte eine transparente Bitmap nicht funktionieren? Mit TBitmap.TransparentColor kann man doch bestimmen, welche Pixel als transparent angesehen werden.
Oder wird diese Transparenz dann nicht in die Zwischenablage übernommen?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 25.03.22 10:53 
Keine Ahnung mit welcher Delphi Version du arbeitest und was da alles schon enthalten ist. Damals, mit Delphi 7, habe ich mir was eigenes geschrieben und fand da MSDN Clipboard sehr hilfreich.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 25.03.22 17:35 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Soll der Anwender dann mit einem anderen Programm interagieren oder soll es nur innerhalb deines Programms zum Kopieren des Icons benutzt werden?
Es soll dann ausserhalb meines Programmes allgemein verfügbar sein, zB. soll man es mit IcoFX (ein Programm zum Erzeugen und Bearbeiten von Icons) aus der Zwischenablage laden können.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du ein anderes Programm kennst, welches das Icon-Format unterstützt, dann kannst du mit dem FreeClipboardViewer das Format dir anschauen.
Zuerst möchte ich versuchen, es so hinzubekommen.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst auch selber ein Clipboard-Format erstellen:
Ziemlich verwirrend... Welchen Datentyp muss ich denn in RegisterClipboardFormat angeben?

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Aber was genau funktioniert bei Clipboard.Assign(aIcon) denn nicht?
Ich habe in der Doku zu Clipboard.Assign nachgeschaut und gesehen, daß alle TPersistent-Klassen unterstützt werden sollten, also auch TIcon.
Oder wird eine Exception erzeugt?
Mit Clipboard.Assign(aIcon) erhalte ich die Meldung
Zitat:
Zwischenablage unterstützt keine Symbole.


user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und warum sollte eine transparente Bitmap nicht funktionieren? [...]
Oder wird diese Transparenz dann nicht in die Zwischenablage übernommen?
Ich habe alles versucht, was mit Transparenz zusammenhängt - erfolglos. Es ist wohl so, dass die Transparenz nicht in die Zwischenablage übernommen wird.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.03.22 19:49 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Es soll dann ausserhalb meines Programmes allgemein verfügbar sein, zB. soll man es mit IcoFX (ein Programm zum Erzeugen und Bearbeiten von Icons) aus der Zwischenablage laden können.
IcoFX kann nur die Bilddaten eines einzelnen Formats (z.B. 256x256 mit alpha) aus einem Icon in die Zwischenablage kopieren oder daraus laden. Ein ganzes Icon kann es von dort gar nicht laden.

IcoFX verwendet 32-Bit Bitmaps mit Alphakanal. Lazarus kann damit gut umgehen, bei Delphis TBitmap ist der Support etwas... verbesserungswürdig. Deshalb würde ich für Delphi eher Bibliotheken wie Graphics32 verwenden.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 25.03.22 20:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
IcoFX kann nur die Bilddaten eines einzelnen Formats (z.B. 256x256 mit alpha) aus einem Icon in die Zwischenablage kopieren oder daraus laden. Ein ganzes Icon kann es von dort gar nicht laden.
Ich weiss, was du meinst - stimmt, ja.

Wenn das also nicht einfach mit Boardmitteln geht, dann belasse ich es erstmal so, wie es ist. Alternativ kann ich ja das Icon als Datei speichern.
Ich nehme mit Erstaunen zur Kenntnis, dass die Windows-Zwischenablage das Icon-Format nicht (ohne weiteren Aufwand) unterstützt. :hair:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.03.22 10:05 
Warum verwendest du denn nicht einfach ein PNG? Das kannst du inkl. Transparenz mit Bordmitteln per Assign in die Zwischenablage packen und das wird von IcoFX auch korrekt transparent verwendet.

Man kann zwar auch ein Bitmap mit Alphakanal z.B. in ein TImage werfen, dann wird das auch transparent dargestellt (wenn man Transparent auf False hat), aber das Assign für die Zwischenablage kann das offenbar nicht.

Aber wie geschrieben:
Mit einem PNG klappt es mit IcoFX und anderen problemlos.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 27.03.22 20:28 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Warum verwendest du denn nicht einfach ein PNG?
Weil die Quelle ein Icon ist! Ich müsste also zunächst einen Weg finden, das Icon in ein PNG zu konvertieren, da bin ich gerade dabei, aber noch ohne Erfolg.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.03.22 09:16 
Ich kenne leider keine sinnvolle Variante ein Icon mit Delphi zu öffnen oder zu editieren. TIcon kann das nur sehr rudimentär. Ich habe danach aber auch noch nie gesucht.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 28.03.22 17:58 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich kenne leider keine sinnvolle Variante ein Icon mit Delphi zu öffnen oder zu editieren. TIcon kann das nur sehr rudimentär. Ich habe danach aber auch noch nie gesucht.
Ich habe danach gesucht und das hier gefunden: torry.net/pages.php?id=84, siehe dort TIconDialog, das öffnet den "Anderes Symbol"-Dialog von Windows. Mit etwas Umbau des Codes funktioniert die Komponente auch mit Delphi 10.3.
Diese Icons möchte ich - wie gesagt - in die Zwischanablage kopieren.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.03.22 20:35 
Aber das ist eben nicht so einfach. Denn der Dialog wählt ja nur das Icon aus, aber du brauchst danach ja noch die Auswahl innerhalb der Icon-Datei welches Format du haben möchtest.

Wäre es da nicht einfacher das Icon schlicht komplett an IcoFX zu übergeben? Dort hast du diese Auswahl, kannst kopieren und einfügen, automatisch resizen für neue Formate, ...