Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zwischenablage auslesen - kein Bild, kein einfacher Text, .. (https://www.delphipraxis.net/96717-zwischenablage-auslesen-kein-bild-kein-einfacher-text.html)

benst 29. Jul 2007 23:29


Zwischenablage auslesen - kein Bild, kein einfacher Text, ..
 
Moin,

folgendes Anliegen. Ich möchte die Zwischenablage auslesen...
Ich benutze unter anderem das Programm EasyGPS und dort kann ich einen Wegpunkt in die Zwischenablage kopieren. Diesen kann ich jedoch nicht in einen Text-Editor einfügen und auch die Zwischenablage-Anzeige von Windows kann damit nichts anfangen. Ich kann ihn nur wieder in EasyGPS einfügen. Mit Delphi habe ich schon einiges versucht und auch im Forum geschaut, aber ich bin noch nicht an den Inhalt gekommen. Es ist kein einfacher Text, denn sonst würde das ja gehen...
Wie kann ich mit Delphi (oder notfalls Alternativen) auf die Zwischenablage zugreifen, wenn dort etwas anderes drin ist als z.B. Text oder Bilder?

Gruß
Ben

semo 29. Jul 2007 23:39

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
mir fällt da spontan die unit Clipbrd ein....

edit: zusätzlich schau dir mal die "FORMATETC" struktur an.

marabu 30. Jul 2007 08:00

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Guten Morgen Ben,

das ClipBoard-Format von EasyGPS ist XML. Ich kann es so auslesen:

Delphi-Quellcode:
uses
  ClipBrd,
  Msxml2;

const
  CF_GPX = 49628;

function LoadXmlFromClipboard(doc: IXMLDOMDocument2; cf: Word): Boolean;
var
  ch: THandle;
  pwc: PWideChar;
begin
  Result := ClipBoard.HasFormat(cf);
  if Result then
  begin
    ClipBoard.Open;
    try
      ch := Clipboard.GetAsHandle(cf);
      pwc := GlobalLock(ch);
      Result := doc.loadXML(WideCharToString(pwc));
      GlobalUnlock(ch);
    finally
      Clipboard.Close;
    end;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  doc: IXMLDOMDocument2;
begin
  doc := CoDOMDocument40.Create;
  doc.async := False;
  if LoadXmlFromClipboard(doc, CF_GPX) then
    ShowMessage(doc.xml);
  doc := nil;
end;
Grüße vom marabu

benst 30. Jul 2007 10:00

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Danke marabu,

leider kenne ich mich noch nicht so viel mit XML aus. Ich habe MSXML 4.0 SP 2 installiert, aber Delphi meckert immer noch (Datei nicht gefunden: Msxml2.dcu).
Hast du eine Tipp für mich?

Gruß
Ben
P.S.: Delphi 5 Standard, Win XP
P.P.S.: Müsste es nicht auch erst einmal ohne XML gehen? Ich weiß, dass wäre nicht schlau, wenn man mit diesen Daten weiterarbeiten möchte, aber könnte ich mir nicht den "XML-Code" anzeigen lassen, ohne mit XML Komponenten zu arbeiten?

marabu 30. Jul 2007 10:08

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Hallo Ben,

klar kannst du dir das XML-Dokument auch als String besorgen:

Delphi-Quellcode:
function ClipboardXmlToStr(cf: Word): string;
var
  ch: THandle;
  pwc: PWideChar;
begin
  if ClipBoard.HasFormat(cf) then
  begin
    ClipBoard.Open;
    try
      ch := Clipboard.GetAsHandle(cf);
      pwc := GlobalLock(ch);
      Result := WideCharToString(pwc);
      GlobalUnlock(ch);
    finally
      Clipboard.Close;
    end;
  end else Result := '';
end;
Die Unit MSXML2 kannst du dir über TLIBIMP erzeugen.

Freundliche Grüße

benst 30. Jul 2007 17:04

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
So in der Art hatte ich das schon mal probiert. Mein Problem war und ist weiterhin nur. Was übergeben ich an "Clipboard.GetAsHandle(???)".
In deinem ersten Code hast du "CF_GPX" übergeben, aber das kennt Delphi bei mir nicht.

In der Hilfe bei "TClipboard.GetAsHandle" steht:
"... Die Methode HasFormat führt einige verfügbare Formate auf, die für den Parameter Format verwendet werden können. Zusätzlich können Anwendungen eigene Formate definieren und registrieren. Nähere Informationen hierzu finden Sie in der Windows-API-Hilfe."

Ich habe im Internet danach gesucht, um eigene Formate zu definieren oder zu erfahren, welche es alle gibt, aber habe nichts entsprechendes gefunden.
Was muss ich dort übergeben oder wo finde ich weitere Informationen?

Gruß
Ben
P.S.: Delphi 5 Standard, Win XP

shmia 30. Jul 2007 17:13

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Schau dir mal mein Open Source Programm Clipboard Explorer an.
http://www.delphipraxis.net/internal...ct.php?t=59549
Damit sollte es kein Problem sein, die verschiedenen Datenformate in der Zwischenablage anzuzeigen.

xaromz 30. Jul 2007 17:44

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Hallo,
Zitat:

Zitat von benst
So in der Art hatte ich das schon mal probiert. Mein Problem war und ist weiterhin nur. Was übergeben ich an "Clipboard.GetAsHandle(???)".
In deinem ersten Code hast du "CF_GPX" übergeben, aber das kennt Delphi bei mir nicht.

den Wert hat marabu aber in Quellcode definiert:
Delphi-Quellcode:
const
  CF_GPX = 49628;
Gruß
xaromz

shmia 30. Jul 2007 17:57

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Man darf das Clipboard-Format nicht als hartcodierte Nummer verwenden, sondern muss
die Funktion RegisterClipboardFormat() verwenden:
Delphi-Quellcode:
var
  CF_GPX: Word; // globale Variable

initialization
  // Falls EasyGPS das Format schon registriert hat, bekommen wir hier den
  // gleichen Wert, den auch EasyGPS verwendet
  CF_GPX := RegisterClipboardFormat(PChar('GPX'));
  if CF_GPX=0 then
     RaiseLastWin32Error;
Es gibt übrigens keine Funktion, um das Clipboard-Format zu deregistrieren.

marabu 31. Jul 2007 09:07

Re: Zwischenablage auslesen - kein Bild, kein einfacher Text
 
Hallo Andreas,

da ich den Formatbezeichner nicht kannte, habe ich den Formatcode ermittelt und als Konstante verwendet um auf die Daten zugreifen zu können. Da mich das Installieren von EasyGPS schon mehr Zeit gekostet hat als ich eigentlich investieren wollte, sei mir dieser Kunstgriff verziehen. Im Nachhinein habe ich die Konstante CF_GPX genannt, weil mir das irgendwie naheliegend erschien. Wenn der Formatbezeichner wirklich GPX ist, dann ist das Zufall. Wenn es also trotz RegisterClipBoardFormat() nicht klappt, dann hast du dich von meinem Konstantennamen CF_GPX in die Irre führen lassen.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.
Seite 1 von 2  1 2      

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