![]() |
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:
Folgende Meldung kommt:
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; Zitat:
Naja, die Frage steht im Titel... |
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:
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...
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; 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. |
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: |
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
Zitat:
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...) |
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:
Fehler bleibt gleich...
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 |
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; |
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
ne... das gibt bei mir eine AV an 0... warum auch immer.
|
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! |
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:
Knallt dann nur "woanders", also AV irgendwo.
Showmessage('CF_BITMAP');
h := Clipboard.GetAsHandle(CF_BITMAP); b.Handle := h; |
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.
|
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
Vielleicht hilft dies:
![]() |
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. |
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.
|
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:
@SirT: Ja, vermute ich auch... allerdings funktionierts mit einem Windows-Screenshot.
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; |
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
ich pushe hier nochmal... :cry:
|
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
Delphi-Quellcode:
Also DAS funktioniert bei mir!
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; Gruß Neutral General |
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.
|
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? |
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
Hmm... hab eine GDI+-Kapselung im Internet gefunden. Und die kanns auch nicht.
|
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. |
Re: Was kann Paint, was ich nicht kann? ( Clipboard pasten )
Interessanter Ansatz... wie würd ich das aus der Zwischenablage rausholen und dann interpretieren?
|
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] |
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: ![]() Mein Code:
Delphi-Quellcode:
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).
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; |
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 ;) . |
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. |
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:
|
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