Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 3  1 23      

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