AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Code zum Managen der Zwischenablage
Thema durchsuchen
Ansicht
Themen-Optionen

Code zum Managen der Zwischenablage

Ein Thema von Suche_Ein_Orakel · begonnen am 14. Jul 2004 · letzter Beitrag vom 14. Jul 2004
Antwort Antwort
Suche_Ein_Orakel

Registriert seit: 14. Jul 2004
4 Beiträge
 
#1

Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 15:29
Hallo allerseits.

Ich bin nicht wirklich Delphi Programmierer.. wenn ich Anwendungen selber gestrickt hab, dann bis jetzt auf VB - bis ich nun auf die Grenze gestoßen bin und mich gezwungenermaßen gleich mal in was "komplexeres" reingesteiert hab..

Es geht um das Managen der Zwischenablage..
dafür hab ich einen Delphi Sourcecode gefunden, und gleich mal ausprobiert..
Gleich vorweg: Es kommen drei Sourcecodes, die aber alle ziemlich ident sind - einmal der originale von einer Website (http://www.swissdelphicenter.ch/de/showcode.php?id=945), dann ein "fix fertiger" für die IDE (es muss nur noch ein Form mit drei Buttons angelegt werden) und dann einer, der die Funktionen als DLL zur Verfügung stellt.. (EDIT: Ursprünglich waren die Source-Codes direkt im Thread, hab aber auf Wunsch von Sakura alles in eine Datei verbannt .. siehe Anhang "Code.pdf")
Ich empfehle also, beim Durchlesen, alles nur mal zu überfliegen und meine Kommentare zwischendrin zu lesen, bevors ans "Testen" geht.
Wichtig wär mir eigentlich nur, dass der Letzte funktioniert (die DLL).. zum Debuggen sollte man aber klarerweise die Exe ranziehen. Ist der Fehler da entdeckt, ist es wohl auch kein Problem mehr, das in der DLL zu beheben. Ich Danke jetzt schon mal, zumindest fürs durchlesen, und würd mich freuen wenn jemand nem absolutem Newbie helfen könnte *g*
here we go:


[1. SOURCECODE BITTE DER ANGEHÄNGTEN DATEI CODE.PDF ENTNEHMEN]





In meiner (frisch von Borland.com runtergeladenen) IDE siehts letztendlich so aus -> siehe Anhang
"CODE.PDF", Source 2



[2. SOURCECODE BITTE DER ANGEHÄNGTEN DATEI CODE.PDF ENTNEHMEN]


Kommentar zum 2. Source:

Funktioniert sogar ^_^"

ich brauch das Ganze um die Zwischenablage -UNABHÄNGIG VOM DATENTYP, DEN SIE GERADE BEINHALTET, abzuspeichern.. sie mir kurz für meine VB-Anwendung "auszuborgen" und letztendlich wiederherzustellen.
Also hab ich mich ein ganz klein wenig in Delphi eingelesen (daran gefallen gefunden, und beschlossen das auf jeden Fall fortzusetzen.. aber das ist eine andere Geschichte *g*) und eine DLL
aus dem obigen Source gemacht - was nach ein bisschen hin und her auch funktioniert hat


[3. SOURCECODE BITTE DER ANGEHÄNGTEN DATEI CODE.PDF ENTNEHMEN]


Kommentar zum 3. Source:

Mir ist schon klar, dass es nicht 100% sauber sein wird und ich vor Allem bei "uses" viel zu viel eingebunden hab (mindestens die Graphics, Controls, Forms und Dialogs kann ich weglassen - was mir auch als Newbie klar ist ^_^" - aber es schadet ja nichts zu viel einzubinden.. und dafür dass ich erst heute damit angefangen hab, hab ichs glaub ich ganz gut hinbekommen.)
Aber daran liegt mein Problem sicher nicht.
Also.. dll erstellt, Funktionen lassen sich prima verwenden in meiner Anwendung:
BIS ich dann nicht mehr bloß Texte kopiert hab, sondern auch mal Bitmaps.. dann bekam ich einen unbekannten Anwendungsfehler.
Also zurück in die Delphi-IDE und die EXE (zweiter Source) gestartet und auch hier diesmal mit
Bitmaps probiert:
Mit dem selben Resultat .
Eigentlich hörten sich diese Funktionen so vielversprechend an und es sah genau nach dem aus, was ich gesucht habe - eben die Zwischenablage kurzfristig sichern und wiederherstellen.. unabhängig von ihrem Inhalt.
Aber irgendwie funktioniert das dann doch nicht so gut, wie vom "Erzeuger" versprochen.
Ich hoffe mir kann jemand helfen .

Liebe Grüße
Max
Ps.: Beim Kopieren der Source-Codes aus dem PDF, nicht vergessen die Zeilen zwischen den Seiten anschließend zu entfernen.
Angehängte Dateien
Dateityp: pdf code.pdf (55,4 KB, 35x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 15:32
Hi und herzlich willkommen in der

Speichere bitte mal die langen Quellcodes als Anhänge, das Lesen der Seiten wird dann viel leichter

Danke,
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 17:57
Zwei Sachen:
Wozu ist denn der exports-Abschnitt vor den ganzen Funktionenin der DLL?
Ja, ich denke, man müsste nicht so viele Units in die uses-Klausel einbinden
Julian J. Pracht
  Mit Zitat antworten Zitat
Suche_Ein_Orakel

Registriert seit: 14. Jul 2004
4 Beiträge
 
#4

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 18:46
Sorry@sakura..
Wird unter Garantie nimmer vorkommen!
(is schon editiert *g*)

@Ultimator:

Damit die Funktionen über die DLL in andere Anwendungen einbindbar sind.
Hab ich mir heute von nem Delphi Tutorial rausgepickt (in dems speziell um Delphi-Programmierung
mit DLLs ging) und es hat auch geklappt - kann die Funktionen in meine VB Anwendung packen und sie dort ganz normal verwenden.
Probleme gibts aber wenn ich eben nicht bloß nen String kopiere, sondern eben Bitmaps.. oder nen ganzen anderen Datentyp.
Und ich hatte eigentlich gedacht genau DAS sollt mit diesen Funktionen gehen.. aber sie versagen.
Sowohl wenn ich sie über die DLL verwende (Source 3 eben), als auch wenn ich sie direkt in ein Delphi-Programm einbinde (Source 2).
Wär nett, wenn jemand Source 2 mal ausprobiert und debuggt und mir sagt warum er nicht tut, wie ichs mir wünsche.. und vielleicht ja sogar ne Lösung hätte!? ^_^"
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 18:50
Zitat von Suche_Ein_Orakel:
Sorry@sakura..
Wird unter Garantie nimmer vorkommen!
(wird aber gleich editiert)
Inzwischen scheinst Du die gefunden zu haben. Glaubst Du wirklich, ich hätte es vorgeschlagen, wenn wir keine hätten. Was glaubst Du eigentlich wie fies die Leute des DP-Teams sind

Viel Spaß weiterhin bei uns

.....
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 18:55
Was Ultimator wahrscheinlich meint sind diese Zeilen.

Delphi-Quellcode:
exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
Damit erzeugt man eine ActiveX-Dll, das sind Dll's mit Com-Objecten. Das brauchst du aber nicht, wenn du nur Proceduren Exportierst. ServCom bitte gleich mit aus der Uses entfernen und die tlb-Datei aus dem Project.
Vielleicht liegt es ja daran.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Suche_Ein_Orakel

Registriert seit: 14. Jul 2004
4 Beiträge
 
#7

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 19:36
Zitat von neolithos:
Was Ultimator wahrscheinlich meint sind diese Zeilen.

Delphi-Quellcode:
exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
Damit erzeugt man eine ActiveX-Dll, das sind Dll's mit Com-Objecten. Das brauchst du aber nicht, wenn du nur Proceduren Exportierst. ServCom bitte gleich mit aus der Uses entfernen und die tlb-Datei aus dem Project.
Vielleicht liegt es ja daran.
Hoi..
Thx
Wollts auch tatsächlich zuerst als ActiveX-DLL machen.. da hats aber überhaupt nicht geklappt.
(warum auch immer - werd ich mir ohnehin noch in Ruhe ansehen)
Von dem Versuch, hab ich wohl das exports in meiner chaotischen Art reinkopiert *g* - werd ich aber wegtun.
Daran liegts aber dennoch nicht. Ich hab das Selbe Problem nämlich auch wenn ich direkt die EXE in Delphi kreiere. (Source 2)
Ich bin mir eigentlich zu 99% sicher, dass das Problem am Code liegt - die Funktionen der DLL lassen sich ja verwenden. Nur eben ausschlielich, wenn sich eine Zeichenkette im Clipboard befindet.. bei allem Anderen streikt sowohl der exterene Funktionsaufruf, als eben auch die Exe selbst.
Ruhig mal ausprobieren, mit Source 2 (wie gesagt: Eine Form mit drei Buttons und dann einfach den Source 2 einsetzen)
Mit Button 1 speichert man den Inhalt (klappt bei Zeichenketten)
Mit Button 2 löscht man den Inhalt (klappt immer)
Mit Button 3 lädt man den Inhalt aus dem File wieder ins Clipboard

Zuerst mit Zeichenketten und dann mit nem Bitmap -> würd mich freuen, wenn mir wer erklären kann, warum er dann abbricht
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 20:50
Hi,
Zitat von Suche_Ein_Orakel:
BIS ich dann nicht mehr bloß Texte kopiert hab, sondern auch mal Bitmaps.. dann bekam ich einen unbekannten Anwendungsfehler.
Das Problem besteht darin, dass einige der grafischen Zwischenablageformate (CF_BITMAP, CF_METAFILEPICT und CF_ENHMETAFILE) nicht einfach als Datenblock gespeichert werden, sondern als Handle auf ein entsprechendes Windows-GDI-Objekt.

Dein Code interpretiert aber auch diese Handles als Speicheradressen, versucht darauf zuzugreifen und führt so zu einer Schutzverletzung. Die Lösung besteht darin, die betroffenen Formate getrennt zu behandeln und zu deren Zwischenspeicherung entsprechende GDI-Objekte anzulegen.

Näheres zu den Zwischenablageformaten steht unter MSDN-Library durchsuchenClipboard Formats.

[EDIT]
Gerade noch ein bisschen rumprobiert ...

Was das Problem mit den Bitmaps anbelangt kann ich dir gleich konkret helfen:
Die Prozedur CopyStreamFromClipboard einfach um folgende Zeile direkt nach dem begin ergänzen:

Delphi-Quellcode:
if fmt = CF_BITMAP then
  Exit;
Damit werden Daten des Formats CF_BITMAP einfach ignoriert. Informationen verlierst du dadurch trotzdem nicht, da das Bitmap von Windows automatisch auch in das Format CF_DIB umgewandelt und dieses ja weiterhin gespeichert wird.
Bei CF_METAFILEPICT und CF_ENHMETAFILE führt AFAIK allerdings nichts an der Speicherung über das GDI vorbei.
[/EDIT]
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
Suche_Ein_Orakel

Registriert seit: 14. Jul 2004
4 Beiträge
 
#9

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 21:02
Zitat von Niko:
Hi,
Zitat von Suche_Ein_Orakel:
BIS ich dann nicht mehr bloß Texte kopiert hab, sondern auch mal Bitmaps.. dann bekam ich einen unbekannten Anwendungsfehler.
Das Problem besteht darin, dass einige der grafischen Zwischenablageformate (zumindest CF_BITMAP, CF_METAFILEPICT und CF_ENHMETAFILE - bei anderen bin ich mir nicht sicher) nicht einfach als Datenblock gespeichert werden, sondern als Handle auf ein entsprechendes Windows-GDI-Objekt.

Dein Code interpretiert aber auch diese Handles als Speicheradressen, versucht darauf zuzugreifen und führt so zu einer Schutzverletzung. Die Lösung besteht darin, die betroffenen Formate getrennt zu behandeln und zu deren Zwischenspeicherung entsprechende GDI-Objekte anzulegen.

Näheres zu den Zwischenablageformaten steht unter MSDN-Library durchsuchenClipboard Formats.
Hallo!

Vielen Dank!!
Das klingt ja schon mal nach was (und noch dazu einleuchtend *g*).
Jetzt kommt die spannende Frage:
Kann ich irgendwie feststellen ob ich es mit einem Handle auf ein solches GDI-Objekt zu tun habe, oder um einen "regulären Speicherverweis" - oder muss ich alle (bekannten) Formate abfragen und dementsprechend argieren (also nachsehen ob ich es eben zum Beispiel mit CF_BITMAP, CF_METAFILEPICT oder CF_ENHMETAFILE zu tun habe und dann entsprechend anders behandeln)?
Letzteres stellt mich aber dann wieder vor das Problem: Was, wenn ein unbekanntes Format vorliegt, das auch wieder nur ein Handle auf ein Windows-GDI Objekt darstellt?
Ich möchte eben genau das vermeiden, auf einzelne Formate einzugehen, sondern eben eine möglichst "globale" Lösung erzielen.
Hochgesteckte Ziele - ich weiß ^_^"
Danke auf jeden Fall mal für die Aufklärung.. jetzt weiß ich zumindest teilweise womit ich mich zu beschäftigen hab (was aber nicht heißt, dass ich für jeden Lösungsansatz von Profis dankbar wäre.. sonst sitz ich wahrscheinlich noch Wochen, wenn nicht Monate davor *g*).

EDIT: Zum Verständnis des Ganzen..
Ich habe eine VB Client-Server Anwendung.
Der Client ist nichts anderes als ein Programm das dauernd im Hintergrund (unsichtbar) auf jedem PC im Netzwerk läuft (bzw. in Zukunft laufen sollte).
Diese Anwendung registriert beim Start einen systemweiten Hotkey..
Beim Aufruf dieses Hotkeys soll der markierte Text (wenn ein Text markiert ist) des gerade aktiven Programms in eine Variable gespeichert werden.
Das stellte sich als wesentlich schwieriger heraus als gedacht..
Nach langem Suchen (und einigen Anfragen im Netz, von VB Programmierern die mal ähnliches machen wollten) hab ich gemerkt, dass es da wohl wirklich keine Standardfunktion gibt..
Mit etwas "Erfindungsreichtum" hab ichs dann ganz einfach über SendKeys "^c" gemacht.. da die Tastenkombination ohnehin im aktiven Fenster gedrückt wird, ist so auf einfache Weise das gewünschte Ergebnis erzielt.
Zusammengefasst:
Man markiert was in einer beliebigen Datenbank und drückt eine bestimmte Tastenkombination.
Das Programm im Hintergrund reagiert und sendet ein STRG+C.
Ist jetzt tatsächlich ein Text in der Zwischenablage wird der an den Server versandt, der daraufhin in einer Volltext-DB eine Suche durchführt und das Ergebnis dem Client mitteilt.. der stellt dann mit den empfangenen Daten wieder was an usw... aber das tut ja da nix mehr zur Sache.
Wirklich wichtig ist der Teil mit der Tastenkombination am Client (der Rest funktioniert eh so wie er soll und ist rein auf VB aufgebaut - also hier unwichtig).
Dadurch, dass ich (gemeinerweise) bei Betätigung der Tastenkombination ein STRG+C schreibe, verliert der Benutzer den Inhalt seiner Zwischenablage. Dabei will ich das ja gar nicht.. ich borg sie mir nur aus, da ich sonst keinen Weg habe wirklich Anwendungsübergreifend markierten Text einzulesen.
Dafür nun also meine Delphi-DLL:
Zwischenablage zuvor speichern - meine Operationen durchführen - Zwischenablage wiederherstellen.

Hab das nur geschrieben, da es ja vielleicht Alternativvorschläge gibt und dann das Beheben der derzeitigen Problmematik hinfällig ist!?
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 21:35
Sorry, hab deinen Beitrag übersehen .

Zu CF_BITMAP, CF_METAFILEPICT und CF_ENHMETAFILE - siehe Edit oben.

Ob es sich um eine Speicheradresse handelt oder nicht wirst du nur über die Formatabfrage heraufinden können. - Oder du probierst darauf zuzugreifen und wenn es kracht war es kein Pointer. Was es war erfährst du so allerdings nicht.

Bei programmeigenen Formaten muss es sich gemäß dem SDK um Pointer handeln, sollte also zu keinen Problemen führen. Allerdings kannst du nicht ganz sicher sein, ob nicht irgendein Programmierer auf die Idee kommt in der Zwischenablage Verweise auf programminterne Daten abzulegen, die er löscht, sobald du die Zwischenablage überschreibst.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  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 09:32 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