![]() |
Bild-Inhalt der Zwischenablage abspeichern?
Hallo,
ich weiß, dass es dazu schon einige Beiträge im Forum gibt, doch bei funktioniert es nicht! Wie der Titel sagt, möchte ich den Inhalt der Zwischenablage (Bitmap) abspeichern. ( ![]() Momentan habe ich die Funktion einen Screenshot zu machen so gelöst:
Delphi-Quellcode:
Soweit klappt das auch. Ich kann das Bild in Paint einfügen. Nun möchte ich es aber automatisch speichern lassen.
procedure TForm1.Button1Click(Sender: TObject);
begin keybd_event(VK_SNAPSHOT , 0, 0, 0); keybd_event(VK_SNAPSHOT , 0, KEYEVENTF_KEYUP, 0); end; if Clipboard.HasFormat(CF_BITMAP) then begin Image1.Picture.Assign(Clipboard); Image1.Picture.SaveToFile('C:\temp\screenshot.bmp' ); end; klappt nicht: ![]() Ich habe es auch mit
Delphi-Quellcode:
probiert.
Image1.Picture.Bitmap.Assign(Clipboard);
Image1.Picture.Bitmap.SaveToFile('C:\temp\screenshot.bmp'); Klappt alles nicht! Würde mich freuen, wenn mir jemand helfen könnte. Ich finde hier im Forum und anderswo immer nur die obengenannte Funktion, die bei mir nicht klappt. Ich benutze FreePascal Lazarus v0.9.28.2 Beta Vielen Dank Pascal95 |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Mach das ganze am besten ohne Zwischenablage:
![]() Wenn der Anwender während der Vorgangs zufällig was in die zwischenablage kopiert, is das mit deiner Methode nämlich nicht so toll, außerdem verliert der Benutzer möglicherweise andere Daten, die er in der zwischenabhlage hat. |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Vielen Dank für die schnelle Antwort.
Jedoch habe ich den Sourcecode in mein Projekt kopiert und will ihn dann mit folgender Funktion aufrufen:
Delphi-Quellcode:
Ich weiß allerdings auch nicht genau, wie die Syntax aussehen soll, also wie ich die Prozedur aufrufen soll.
procedure TForm1.Button1Click(Sender: TObject);
begin GetScreenShot(Image1); end; Außerdem gibt diese Prozedur:
Delphi-Quellcode:
... einige Errors:
procedure GetScreenShot (var ABitmap : TBitmap);
var DC : THandle; begin if Assigned(ABitmap) then // Check Bitmap<>NIL begin DC := GetDC(); // Get Desktop DC try ABitmap.Width := Screen.Width; // Adjust Bitmapsize.. ABitmap.Height := Screen.Height; // ..to screen size BitBlt(ABitmap.Canvas.Handle, // Copy 0,0,Screen.Width,Screen.Height, // Desktop DC, // into 0,0, // the SrcCopy // Bitmap ); finally ReleaseDC(0, DC); // Relase DC end; end; end; unit1.pas(38,22) Error: Illegal parameter list unit1.pas(40,11) Error: Wrong number of parameters specified for call to "GetDC" unit1.pas(42,15) Error: Unknown record field identifier "WIDTH" unit1.pas(43,15) Error: Unknown record field identifier "HEIGHT" unit1.pas(44,22) Error: Unknown record field identifier "CANVAS" unit1.pas(60,21) Error: Call by var for arg no. 1 has to match exactly: Got "TImage" expected "BITMAP" unit1.pas(34,11) Hint: Found declaration: GetScreenShot(var BITMAP); unit1.pas(88) Fatal: There were 6 errors compiling module, stopping Warum funktioniert die Funktion nicht? Das ist bei mir in der uses:
Delphi-Quellcode:
Liegt es daran, dass cih mit Lazarus arbeite?
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, Windows, CLipBrd, LCLIntf, LCLType; Vielen Dank Pascal |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Zitat:
Zitat:
Delphi-Quellcode:
aus:
uses LCLIntf, LCLType;
... var MyBitmap: TBitmap ScreenDC: HDC; begin MyBitmap := TBitmap.Create; ScreenDC := GetDC(0); MyBitmap.LoadFromDevice(ScreenDC); ReleaseDC(ScreenDC); ... ![]() In deinem Fall würde ich es so umändern: Du hast ein Image1 auf dem Forumlar, und dann:
Delphi-Quellcode:
...
var ScreenDC:HDC;
begin ScreenDC:= GetDC(0); Image1.bitmap.loadFromDevice(ScreenDC); ReleaseDC(ScreenDC); |
Re: Bild-Inhalt der Zwischenablage abspeichern?
...Gibt wieder Errors:
Delphi-Quellcode:
unit1.pas(39,8) Error: identifier idents no member "Bitmap"
procedure TForm1.Button1Click(Sender: TObject);
var ScreenDC:HDC; begin ScreenDC:= GetDC(0); Image1.Bitmap.loadFromDevice(ScreenDC); ReleaseDC(ScreenDC); end; unit1.pas(40,19) Error: Wrong number of parameters specified for call to "ReleaseDC" unit1.pas(68) Fatal: There were 2 errors compiling module, stopping Muss vielleicht
Delphi-Quellcode:
durch
Image1.Bitmap.LoadFromDevice(ScreenDC);
Delphi-Quellcode:
ersetzt werden? Naja, das ergab dann diese Errors:
Image1.Picture.LoadFromDevice(ScreenDC);
unit1.pas(39,16) Error: identifier idents no member "loadFromDevice" unit1.pas(40,19) Error: Wrong number of parameters specified for call to "ReleaseDC" unit1.pas(68) Fatal: There were 2 errors compiling module, stopping Irgendwie kennt Lazarus "loadFromDevice" nicht...? Vielleicht findest du oder jemand Anderes noch eine Lösung für mein Problem, auch wenn ich nicht mit der Zwischenablage arbeite, ich will nur den ganzen Bildschirm in eine bmp/png/jpg datei laden. Am besten bmp. Pascal |
Re: Bild-Inhalt der Zwischenablage abspeichern?
sry, versuch es mal mit image1.picture.bitmap.LoadFromDevice
Was mit ReleaseDC los ist und welche Parameter das braucht weiß ich allerdings auch nicht. Gibts da nicht auch wie in delphi so eine Kontexthilfe wo angezeigt wird, was nun als parameter erwartet wird? |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Moin,
jetzt hab ichs!! Juhu. Ich habe noch mal in meinen Archiven nachgeguckt und eben nur noch den ReleaseDc(ScreenDC); zu ReleaseDc(0, ScreenDC); geändert. Mit folgendem Code funktioniert es wirklich super unter lazarus:
Delphi-Quellcode:
Vielen Dank. Hast mir sehr geholfen!
procedure TForm1.Button1Click(Sender: TObject);
var ScreenDC:HDC; begin ScreenDC:= GetDC(0); image1.picture.bitmap.LoadFromDevice(ScreenDC); ReleaseDc(0, ScreenDC); Image1.Picture.SaveToFile('C:\temp\screen.bmp'); end; Pascal95 (erledigt) |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Zitat:
|
Re: Bild-Inhalt der Zwischenablage abspeichern?
Hi!
Du hast zwar dein Problem bereits gelöst, dennoch möchte ich dir erklären, warum folgender Code nicht funktioniert hat: Zitat:
Zitat:
Und folgende Möglichkeiten hättest du gehabt den Fehler zu beseitigen: 1. du hättest aus jedem TBitmap ein Graphics.TBitmap gemacht 2. du hättest in deiner Unit TBitmap einfach als Alias auf Graphics.TBitmap definiert, also so:
Delphi-Quellcode:
Dadurch wäre der Windows-Typ mit dem richtigen Typ überschrieben worden.
type
TBitmap = Graphics.TBitmap 3. du hättest du Reihenfolge der Units in der Uses anpassen können. Dies ist übrigens auch der Grund, warum Windows in Delphi :!: auch sehr weit vorne steht. 4. du hättest die Windows Unit ganz rauslassen können, da die benötigten Methoden eh durch LCLIntf und LCLType (eventuell auch noch LCLProc) eingebunden werden, allerdings kann ich diesen Punkt nicht mit Sicherheit bestätigen Zitat:
Ich hoffe ich konnte dir etwas Klarheit verschaffen. Gruß, Sven |
Re: Bild-Inhalt der Zwischenablage abspeichern?
Danke auch dir Sven!
Pascal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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-2025 by Thomas Breitkreuz