Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Was kann Paint, was ich nicht kann? ( Clipboard pasten ) (https://www.delphipraxis.net/71585-kann-paint-ich-nicht-kann-clipboard-pasten.html)

DGL-luke 17. Jun 2006 19:36


Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Hallo,

wenn ich in GIMP einen Bildbereich in die Zwischenablage kopiere, kann MS Paint den wunderbar einfügen. Mein Programm aber nicht:

Delphi-Quellcode:
procedure TFMain.SBPasteClick(Sender: TObject);
var pic: TPicture;
    b: TBitmap;
begin
  pic := TPicture.Create;

  {if Clipboard.HasFormat(CF_PICTURE) then
    begin
      Showmessage('CF_PICTURE');
      pic.Assign(Clipboard);
    end
  else} if Clipboard.HasFormat(CF_BITMAP) then
    begin
      Showmessage('CF_BITMAP');
      pic.Bitmap.Assign(Clipboard);
    end
  {else if Clipboard.HasFormat(CF_METAFILEPICT) then
    begin
      ShowMessage('CF_METAFILEPICT');
      pic.Metafile.Assign(Clipboard);
    end}
  else
    Exit;

  LoadImage(pic);
  pic.Free;
end;
Folgende Meldung kommt:

Zitat:

---------------------------
JPEG-Kompressor
---------------------------
Format der Zwischenablage wird nicht unterstützt.
---------------------------
OK
---------------------------
:gruebel:

Naja, die Frage steht im Titel...

Muetze1 17. Jun 2006 19:56

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Ich sehe da 2 Möglichkeiten: Die JPEG Kompression von GiMP ist "komisch anders" bzw. nicht von TJPEGImage unterstützt (siehe Titel der MessageBox) oder das Format des ClipBoards ist komisch. Dort könnte ja vllt. mal helfen heraus zu bekommen, wie denn das Format heisst, in welchem das Bild in der Zwischenablage vorliegt:

Delphi-Quellcode:
Uses
  Windows;

...

Function NameOfClipBoardFormat(Const AFormatId: LongWord): String;
Var
  lStr: String;
Begin
  SetLength(lStr, 2049);
  SetLength(lStr, GetClipBoardFormatName(AFormatId, PChar(lStr), 2048));
  Result := lStr;
End;
EDIT: Über die Eigenschaft FormatCount und Formats[] des TClipBoard's bzw. der globalen Instanz ClipBoard kannst du auch mal eroieren, welche Formate GiMP denn in die Zwischenablage ablegt, vllt. findest du ja noch ein besseres als das bisher selektierte...
EDIT2: GetAsHandle() ist die Methode von TClipBoard um ein bestimmtes Format zu erhalten, wenn du dich im Formats[] Array für ein anderes entschieden hast.

DGL-luke 17. Jun 2006 20:01

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da gehts nicht um JPEGs :P

Das Format ist CF_BITMAP.

Wenn du dir meinen Code angesehen hättest, wäre dir das doch wohl auch aufgefallen :gruebel:

ich kann ja gerne mal die datei anhängen, um dies geht, sollte einigen bekannt vorkommen...

//Dein EDIT: Naja... CF_BITMAP sollte eigentlcih doch genügen...

EDIT: wie kann ich denn sicherstellen, dass das tpicture.bitmap auch mein CF_BITMAP format lädt?
EDIT2: Wir unterhalten uns hier jetzt nur noch über Edits, oder? :lol:

Muetze1 17. Jun 2006 20:04

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Zitat:

Zitat von DGL-luke
Da gehts nicht um JPEGs :P

Das Format ist CF_BITMAP.

Wenn du dir meinen Code angesehen hättest, wäre dir das doch wohl auch aufgefallen :gruebel:

Naja, dein Code sagt nicht viel, ausser das du nur noch mit Bitmaps umgehen kannst - und das Format scheint wohl gerade nicht kompatibel zu sein, oder?

Und wenn es nicht um JPEG's geht, warum hat dann die Fehlermeldung in der Caption "JPEG-Kompressor"?? Was meinst du denn, wie ich bei ausgeklammerten Code auf JPEG komme? Doof bin ich nicht... (dachte ich bisher...)

DGL-luke 17. Jun 2006 20:08

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
ja, is klar ^^ es ist ja nicht der ganze code auskommentiert :P

also, im moment gehts erstmal nur um bitmaps.

Wo tu ich das Handle denn hin, das ich von GetAsHandle kriege?

EDIT: Code sieht jetzt so aus:

Delphi-Quellcode:
if Clipboard.HasFormat(CF_BITMAP) then
    begin
      Showmessage('CF_BITMAP');
      h := Clipboard.GetAsHandle(CF_BITMAP);
      pic.Bitmap.LoadFromClipboardFormat(CF_BITMAP,h,CLipboard.GetAsHandle(CF_PALETTE));
    end
Fehler bleibt gleich...

Muetze1 17. Jun 2006 20:36

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Das ist dann zumindest komisch. Im Normalfall sollte es klappen - aber ich bin mir nicht sicher, ob noch extra eine Palette mit in das ClipBoard gelegt wird - ist ja auch nicht immer nötig (siehe PixelFormat).

Ansonsten wäre noch dies möglich:

Delphi-Quellcode:
 if Clipboard.HasFormat(CF_BITMAP) then
 begin
   h := Clipboard.GetAsHandle(CF_BITMAP);
   pic.Bitmap.Handle := h;
 end;

DGL-luke 17. Jun 2006 20:51

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
ne... das gibt bei mir eine AV an 0... warum auch immer.

Muetze1 17. Jun 2006 23:08

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Hmm, meine Glaskugel funktioniert zur Zeit wieder recht gut, glaube ich. Sie ist endlich von der Eichung zurück, daher lass mich mal aufschreiben, was ich in ihr sehen konnte:

1. h wird ordentlich befüllt mit einem Handle
2. Picture ist ungleich Nil, da vorher angelegt
3. Picture.Bitmap ist Nil, da nicht vorher angelegt
4. Es knallt beim Zugriff auf die Eigenschaft Bitmap von TPicture, da nicht vorher angelegt.
5. Mein Glaskugel munkelt, dass dies auch der Fehler vorherigen Versuche sein wird, da Methoden von Bitmap aufgerufen wurden, welche an keine Instanz gebunden waren, da Bitmap auch dort Nil war.

Du hast den Code, du hast somit auch die Macht... ... den Debugger zu benutzen und zu schauen ob meine Glaskugel Recht hatte. Nutze die Macht, Luke!

DGL-luke 17. Jun 2006 23:31

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
meine glaskugel sagt, dass wenn ein bitmap nil ist, dass es dann nicht sagen kann "Format der Zwischenablage wird nicht unterstützt."
Mir ist klar, dass eine Av bei 0 meistens ein zugriff auf einen nil-pointer ist... ich habe deswegen vorübergehend pic.bitmap durch ein zuvor erzeugtes TBitmap ersetzt:

Delphi-Quellcode:
Showmessage('CF_BITMAP');
      h := Clipboard.GetAsHandle(CF_BITMAP);
      b.Handle := h;
Knallt dann nur "woanders", also AV irgendwo.

Muetze1 18. Jun 2006 00:13

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Naja, das knallen mit einer AV ist aber ungesund und nicht normal, daher unbedingt diese erstmal abstellen würde ich raten.

Garfield 18. Jun 2006 10:11

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Vielleicht hilft dies: http://www.swissdelphicenter.ch/de/showcode.php?id=1981

Elvis 18. Jun 2006 11:23

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Hast du neben deiner 2005PE nch eine "richtige" SKU einer früheren Delphi Version?
Wenn ja würde ich das ganz mal durch die VCL Sourcen debuggen. Irgendwo wird dir schon der nay-sayer äh nil-pointer begegnen.

SirThornberry 18. Jun 2006 11:59

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Ich vermute es liegt schlicht weg an dem Bitmapformat. Ich hab ein Programm das unter windows95 pefekt funktionierte. Wenn ich im Windows einen Screenshot mache und diesen einfügen will knallts und das Programm ist zu. Wenn ich den Screenshot ist in Paint einfüge, und von dort aus erneut in die Zwischenablage kopiere dann klappt es da Paint vermutlich das unkomprimierte Format in die Zwischenablage legt.

DGL-luke 18. Jun 2006 12:02

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
@Elvis: Sorry, bin da nicht so bestückt... ich werd aber heute noch die D2006 Pro SSL bestellen.
(D3 Professional hab ich noch...)
(btw: SKU?)

@Muetze1: Ich hab aber keine Ahnung, wo die AV herkommt. Die Breakpoints wollen nämlich irgendwie nicht, deshalb auch das showmessage-zeugs. Ich poste hier noch mal die komplette routine:

Delphi-Quellcode:
procedure TFMain.SBPasteClick(Sender: TObject);
var pic: TPicture;
    b: TBitmap;
    h: HBITMAP;
begin
  pic := TPicture.Create;
  b := TBitmap.Create;

 if Clipboard.HasFormat(CF_BITMAP) then
    begin
      Showmessage('CF_BITMAP');
      h := Clipboard.GetAsHandle(CF_BITMAP);
      b.Handle := h; // Ich glaube, die AV kommt hier. Eventuell muss man dem bitmap ja noch sagen, es soll ein WinAPI-Handle jetzt bekommen?!
    end
  else
   Exit;

  LoadImage(pic);
  pic.Free;
end;
@SirT: Ja, vermute ich auch... allerdings funktionierts mit einem Windows-Screenshot.

DGL-luke 30. Aug 2006 20:33

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
ich pushe hier nochmal... :cry:

Neutral General 30. Aug 2006 20:49

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var pic: TPicture;
    h: HBITMAP;
begin
  pic := TPicture.Create;

  if Clipboard.HasFormat(CF_BITMAP) then
    begin
      h := Clipboard.GetAsHandle(CF_BITMAP);
      Pic.Bitmap.LoadFromClipboardFormat(CF_BITMAP,h,CF_PALETTE);
    end
  else
   Exit;

  Image1.Picture := Pic;
  pic.Free;
end;
Also DAS funktioniert bei mir!

Gruß
Neutral General

3_of_8 30. Aug 2006 20:58

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Ich weiß nur, dass die Fehlermeldung immer dann kommt, wenn man versucht, eine jpeg Datei zu öffnen für die Delphis JPEG Unit zu dummdie Delphis JPEG Unit nicht unterstützt. Da hilft dann immer mit GIMP öffnen und neu abspeichern.

DGL-luke 30. Aug 2006 22:22

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
@Neutral General: Auch wenn du die Zwischenablage mit GIMP füllst?

Bei mir nicht....

@all: Wie würde man denn das auf reiner WinAPI-Basis machen?

DGL-luke 31. Aug 2006 13:39

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Hmm... hab eine GDI+-Kapselung im Internet gefunden. Und die kanns auch nicht.

franktron 31. Aug 2006 14:03

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Sgat mal kann das sein das Gimp ein OS2 BMP erzeugt hat ???? und kein Windows BMP,
wiel Paint kann komischerweise OS2 BMP.

DGL-luke 31. Aug 2006 22:47

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Interessanter Ansatz... wie würd ich das aus der Zwischenablage rausholen und dann interpretieren?

Khabarakh 31. Aug 2006 23:15

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Mit der Clipboard-Klasse von .Net funktionier alles tadellos :| . Vielleicht finde ich etwas Interessantes im Reflector.

[edit]
Etwas komplex, das Ganze *g* . Der Hauptunterschied ist jedenfalls, dass die VCL GetClipboardData und die BCL OleGetClipboard nutzt.
[/edit]

DGL-luke 31. Aug 2006 23:34

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Hallo,

danke für deine Bemühungen, Khabarakh. Die Lib namens "gdiplus" gibts bei torry, hier: http://www.torry.net/quicksearchd.ph...plus&Title=Yes

Mein Code:

Delphi-Quellcode:
procedure TFMain.SBPasteClick(Sender: TObject);
var pic: TPicture;
    bitmap: TGPBitmap; //GDI-bitmap
    g: TGPGraphics; //GDI-"Canvas"
begin
  pic := TPicture.Create;

  if Clipboard.HasFormat(CF_BITMAP) then
    begin
      bitmap := TGPBitmap.Create(Clipboard.GetAsHandle(CF_BITMAP),0);
      pic.Bitmap.SetSize(bitmap.GetWidth,bitmap.GetHeight);
      g := TGPGraphics.Create(pic.Bitmap.Canvas.Handle);
      g.DrawImage(bitmap,0,0);
      bitmap.Free;
      g.free;
    end
  else
   Exit;

  if not pic.Bitmap.Empty then //schlägt bei GIMP-Auschnitt an
    LoadImage(pic);
  pic.Free;
end;
Bei meinen Versuchen schien das Bild selbst übrigens gleichgültig zu sein(habe mehrere ausprobiert, allerdings jeweils nur mit GIMP, Vergleich war ein einfacher Screenshot per Druck-Taste), entscheidend war der "Export" mit GIMP (Version 2.2.8).

Khabarakh 31. Aug 2006 23:55

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
(Edit oben)

Hab mal schnell (pinvoke.net sei Dank ^^ ) TClipboard nachprogrammiert, damit kommt es auch unter dotNet zu einem GDI-Fehler. Nun, das Nachprogrammieren von System.Windows.Forms.Clipboard + DataObject + OleConverter wird wohl nicht ganz so schnell vonstatten gehen ;) .

DGL-luke 31. Aug 2006 23:59

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Du siehst also keine Möglichkeit, da irgendwas schon auf WinAPI-Ebene abzuzweigen? Dieses OLE-Dings zum Beispiel?

Mal ne andere Frage: Wie bekomm ich die Daten (ausgehend vom handle) komplett aus der zwischenablage raus, meinetwegen in einen Stream?

Dann kann ich ja mal mit diversen Hämmern, ich meinte Dateiformate, an die Sache rangehen. Wird ja wohl ne OS/2-Bitmap-Lib geben oder zumindest n RFC.

Khabarakh 1. Sep 2006 00:10

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
[quote="DGL-luke"]Du siehst also keine Möglichkeit, da irgendwas schon auf WinAPI-Ebene abzuzweigen? Dieses OLE-Dings zum Beispiel?[quote]Wie gesagt, OleGetClipboard. Auch das Framework kann nicht zaubern, irgendwo muss es noch auf der WinAPI aufsetzen ;) . Aber auch mit dem IDataObject ist erst die Hälfte der Arbeit getan, die .Net-Klassen kannst du als Beispielimplementierung verwenden.

Zitat:

Mal ne andere Frage: Wie bekomm ich die Daten (ausgehend vom handle) komplett aus der zwischenablage raus, meinetwegen in einen Stream?

Dann kann ich ja mal mit diversen Hämmern, ich meinte Dateiformate, an die Sache rangehen. Wird ja wohl ne OS/2-Bitmap-Lib geben oder zumindest n RFC.
Tja, im (nicht OLE-, soweit ich das verstanden habe) Clipboard liegt leider nur ein Handle, und ein einzelner 32Bit-Wert kann nun wirklich alles sein ;) .

DGL-luke 1. Sep 2006 12:27

Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
 
Ok... werd mir das mal ansehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

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 by Thomas Breitkreuz