Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmap von DirectX will nicht in die Zwischenablage (https://www.delphipraxis.net/211648-bitmap-von-directx-will-nicht-die-zwischenablage.html)

KodeZwerg 17. Okt 2022 13:59

Bitmap von DirectX will nicht in die Zwischenablage
 
In dieser Post zeigte ich wie ich ein Bild erstelle.
Jetzt wollte ich etwas total simples machen, dieses Bild in die Zwischenablage einfügen um damit Global eine Möglichkeit zu haben es irgendwo einzufügen.
Bei einem TBitmap generiert mit der GDI-Technik (BitBlt) funktioniert es, bei einem TBitmap generiert mit der DirectX Variante tut sich gar nichts.
Auf diese Weise wollte ich ans Ziel kommen: (FBitmap ist ein TBitmap)
Delphi-Quellcode:
procedure TkzSnapShot.CopyToClipboard;
var
{
  DataStream: TMemoryStream;
  Data: Pointer;
  DataHandle: THandle;
}
  Image: TImage;
begin
  Image := TImage.Create(Self.Owner);
  try
    Image.Picture.Bitmap.Assign(FBitmap);
    Image.Invalidate;
    Clipboard.Assign(Image.Picture.Graphic);
  finally
    Image.Free;
  end;
(*
  //MessageBox(0, 'CopyToClipboard', 'CopyToClipboard', MB_OK);
  DataStream := TMemoryStream.Create;
  try
    FImage.SaveToStream(DataStream);

    DataHandle := GlobalAlloc(GHND or GMEM_SHARE, DataStream.Size);
    try
      Data := GlobalLock(DataHandle);
      try
        DataStream.Position := 0;
        DataStream.ReadBuffer(Data^, DataStream.Size);
      finally
        GlobalUnlock(DataHandle);
        if OpenClipboard(0) then
          begin
            EmptyClipboard;
            SetClipboardData(FClipboardFormat, DataHandle);
            CloseClipboard;
          end;
      end;
    except
      GlobalFree(DataHandle);
      Raise;
    end;
  finally
    DataStream.Free;
  end;
*)
end;
Leider funktioniert weder das reguläre noch wenn ich die Daten roh sende.
Was übersehe ich hier?

KodeZwerg 17. Okt 2022 14:04

AW: Bitmap von DirectX will nicht in die Zwischenablage
 
:wall: Hat sich erledigt, der Aufruf der CopyToClipboard methode hatte bei DirectX gefehlt :oops:

himitsu 17. Okt 2022 15:57

AW: Bitmap von DirectX will nicht in die Zwischenablage
 
Zitat:

Delphi-Quellcode:
  Image := TImage.Create(Self.Owner);
  try
    Image.Picture.Bitmap.Assign(FBitmap);
    Image.Invalidate;
    Clipboard.Assign(Image.Picture.Graphic);
  finally
    Image.Free;
  end;

Effektiv macht dein Code das hier
Delphi-Quellcode:
Clipboard.Assign(FBitmap);


Invalidate macht nichts, das das TImage eh nicht sichtbar ist

Delphi-Quellcode:
Image := TImage.Create(Self.Owner);
try
  Image.Picture.Bitmap.Assign(FBitmap);
  Clipboard.Assign(Image.Picture.Graphic);
finally
  Image.Free;
end;
von TImage wird garnicht benutzt, also TPicture
Delphi-Quellcode:
Picture := TPicture.Create(Self.Owner);
try
  Picture.Bitmap.Assign(FBitmap);
  Clipboard.Assign(Picture.Graphic);
finally
  Picture.Free;
end;
im Graphic ist das Bitmap drin, wodurch Graphic = Bitmap,
also
Delphi-Quellcode:
Clipboard.Assign(Picture.Bitmap);

Picture.Bitmap erstellt ein TBitmap (wenn/da noch Keines drin ist), und es wird unverändert als TBitmap weiterverwendet,
womit auch das TPicture praktisch garnicht verwendet wird
Delphi-Quellcode:
Bitmap := TBitmap.Create(Self.Owner);
try
  Bitmap.Assign(FBitmap);
  Clipboard.Assign(Bitmap);
finally
  Bitmap.Free;
end;
und dann kopierst du den Inhalt des einen Bitmaps nur in ein Anderes, womit das auch wegfallen könnte, weil sich doch nichts verändert,
also
Delphi-Quellcode:
Clipboard.Assign(FBitmap);

KodeZwerg 17. Okt 2022 16:56

AW: Bitmap von DirectX will nicht in die Zwischenablage
 
@himitsu
Ich hatte im Vorfeld Deine gezeigten Variationen durchprobiert aber da scheint doch etwas anderes zu passieren weil wenn ich direkt
Delphi-Quellcode:
Clipboard.Assign(FBitmap);
aufrufe, ist das Bild zwar in der Zwischenablage aber ich kann es nicht von dort in andere Anwendungen rauskopieren (vielleicht in einigen aber nicht da wo ich es oft benötige), deshalb der Umweg über ein TImage/Graphic, das funktioniert dann zumindest in meinen Versuchen immer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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