Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Bild-Inhalt der Zwischenablage abspeichern?

  Alt 25. Mär 2010, 20:44
Hi!

Du hast zwar dein Problem bereits gelöst, dennoch möchte ich dir erklären, warum folgender Code nicht funktioniert hat:

Zitat von Pascal95:
Außerdem gibt diese Prozedur:
Delphi-Quellcode:
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;
... einige Errors:

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
Dein Problem ist hier, das der Typ Graphics.TBitmap, den du eigentlich verwenden wolltest, vom Record Windows.TBitmap, der ein Alias auf Windows.BITMAP ist, überschrieben wird. Das sieht man auch gut in deiner Uses:

Zitat von Pascal95:
Das ist bei mir in der uses:
Delphi-Quellcode:
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, StdCtrls, Windows, CLipBrd, LCLIntf, LCLType;
Windows befindet sich hier hinter Graphics, weswegen alle Typen, die sowohl in der einen, als auch in der anderen Unit sind, sich komplett auf die hintere Unit beziehen. Du hättest eventuell auch in Lazarus mit gedrückter Strg-Taste auf TBitmap klicken können und er hätte dich womöglich an die "richtige" Deklaration in Windows geschickt - allerdings kann ich hier auch falsch liegen.

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:
type
  TBitmap = Graphics.TBitmap
Dadurch wäre der Windows-Typ mit dem richtigen Typ überschrieben worden.

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 von Pascal95:
Liegt es daran, dass cih mit Lazarus arbeite?
Nein, das hätte dir auch mit Delphi passieren können

Ich hoffe ich konnte dir etwas Klarheit verschaffen.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat