Autor |
Beitrag |
Hajoseb
Beiträge: 42
|
Verfasst: Sa 09.06.07 21:50
Hallo, an die Expertenrunde :-) Ich nutze zur Zeit Delphi PE 2005 und würde gerne auf Turbo Delphi .net umsteigen. ABER (das große) ... Ich habe bisher noch keine Screenshot-Funktion finden können, die mit "echtem" .net arbeitet. Alle Lösungen, die ich bisher im I-net gefunden habe und auch nutze, benutzen "normale" Windows-aufrufe. Ich schrecke also vor dem Schritt zurück, da ich nicht weis, ob meine Programme (Bis auf die Screencopy komplett in .net) dann noch nutzbar sind. Gibt es irgendeine Lösung, einen Screencopy (für den gesammten Bildschirm, auch außerhalb meines Programm) in echtem .net zu realisieren und unter Turbo Delphi .net zu nutzen. Vielen Dank im Vorraus. P.S: Falls ich die Antwort auf diese Frage hier im Bord nur übersehen habe, bitte einen kutzen Tip auf den Thread. !!! Aber bitte nur, auf Lösungen, die auch mit .net funktionieren !!! Moderiert von Christian S.: Topic aus Multimedia / Grafik verschoben am Sa 09.06.2007 um 21:52
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 09.06.07 22:10
Hallo!
Du willst wirklich mit Delphi .NET programmieren? Tu Dir einen Gefallen und benutze eine Sprache und IDE, die mindestens .NET 2.0 unterstützt. Das von Delphi unterstütze 1.1 ist seit Jahren veraltet
Hier eine Lösung, die zumindest unter 2.0 läuft. Müsste aber auch bei 1.1 gehen:
Chrome Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| uses System.Drawing.Imaging;
var thisScreen := Screen.PrimaryScreen; var screenBmp := new Bitmap(thisScreen.Bounds.Width, thisScreen.Bounds.Height, PixelFormat.Format32bppRgb); using grScreenBmp := Graphics.FromImage(screenBmp) do grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); pictureBox1.Image := screenBmp; |
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Sa 09.06.07 22:41
Was, so einfach :-O ...
Das muss ich doch morgen gleich mal testen
Alle Lösungen, die ich bisher gesehen habt (ohne .net) waren viel umständlicher...
mfg hajoseb
P.S. Ich bin froh, erst mal wieder in Delphi rein gekommen zu sein (hatte früher nur Turbo-Pascal) und das ich überhaupt .net durchblicke (Oberfläche *g*).
Wenn das so klappt, steige ich ersst mal auf Turbo-Delphi .net um und harre der Dinge die da kommen *g*
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Mo 11.06.07 10:00
Hi.
Test war leider erfolglos.
Das Teil funktioniert nicht mit .net 1.1
-----
Chrome Quelltext 1: 2: 3:
| using grScreenBmp := Graphics.FromImage(screenBmp) do grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); |
using kennt Delphi 2005 PE nicht, was aber wichtiger ist:
CopyFromScreen gibt es im .net 1.1 nicht.
-----
Gibt es alternative Lösungen ???
Mfg Hajoseb
Moderiert von Christian S.: Quote- durch Delphi-Tags ersetzt
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 11.06.07 10:13
Hajoseb hat folgendes geschrieben: | Chrome Quelltext 1: 2:
| using grScreenBmp := Graphics.FromImage(screenBmp) do grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); |
using kennt Delphi 2005 PE nicht, was aber wichtiger ist: |
Ach so, stimmt, das heißt soviel wie:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| grScreenBmp := Graphics.FromImage(screenBmp); try grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); finally grScreenBmp.Dispose; end; | Eigentlich legt Dir Chrome dann noch die Variable an und verpackt das ganze in einen with-Block, aber ob Delphi .NET das kann, weiß ich nicht.
Hajoseb hat folgendes geschrieben: | CopyFromScreen gibt es im .net 1.1 nicht.
-----
Gibt es alternative Lösungen ??? |
.NET 2.0 benutzen Nee, im Ernst, was anderes fällt mir da leider nicht ein. .NET 1.1 war einfach noch in vielen Punkten unfertig und umständlich.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Mo 11.06.07 10:32
Danke erst mal.
Falls es keine Lösung gibt ... kennt jemand eine Hypnoschulung für c#
Hajoseb (der die Hoffnung noch nicht aufgegeben hat)
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 11.06.07 10:45
Hallo Hajoseb,
mit einer fertigen Lösung kann ich nicht dienen. Mein Verfahren Formular/Control drucken oder als Bitmap speichern befasst sich mit Controls (und abgeleiteten Klassen), nicht mit dem gesamten Screen.
Ich musste mich dabei ebenfalls mit den Unterschieden zwischen NET 1.1 und 2.0 befassen. Für 1.1 habe ich die folgende Routine benutzt; sie kann vermutlich für den Screen nachgearbeitet werden (ich habe das aber nicht erledigt, sondern nur kurz in den Stichpunkten in der Doku geprüft):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| [DllImport("gdi32.dll")] private static extern long BitBlt( IntPtr hdcDest, int xDest, int yDest, int nWidth, int nHeight, IntPtr hdcSource, int xSrc, int ySrc, Int32 dwRop);
const int SRCCOPY=13369376;
private Bitmap GetBitmap(Control Ctrl) {
Graphics grCtrl = Graphics.FromHwnd(Ctrl.Handle); Bitmap Result = new Bitmap(Ctrl.Width, Ctrl.Height, grCtrl);
IntPtr hdcCtrl = grCtrl.GetHdc(); Graphics grDest = Graphics.FromImage(Result); IntPtr hdcDest = grDest.GetHdc();
int SourceX, SourceY; if (Ctrl is Form) { SourceX = Ctrl.ClientSize.Width - Ctrl.Width + 4; SourceY = Ctrl.ClientSize.Height - Ctrl.Height + 4; } else { SourceX = 0; SourceY = 0; } BitBlt(hdcDest, 0, 0, Ctrl.Width, Ctrl.Height, hdcCtrl, SourceX, SourceY, SRCCOPY);
grCtrl.ReleaseHdc(hdcCtrl); grDest.ReleaseHdc(hdcDest);
return Result; } |
Zu beachten ist außerdem, dass BitBlt() ziemlich langsam ist.
Gruß Jürgen
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 11.06.07 10:53
Hajoseb hat folgendes geschrieben: | DFalls es keine Lösung gibt ... kennt jemand eine Hypnoschulung für c# |
Nicht unbedingt Hypno aber sehr zu empfehlen: www.galileocomputing...ual_csharp/index.htm
@JüTho: Das benutzt ja aber auch wieder PInvoke und wenn ich das richtig verstanden habe, war eine Lösung ohne das gesucht.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Mo 11.06.07 11:31
@ JüTho
Ich schau es mir mal an.
Die Grundfrage: Läuft das dann auch uter Turbo Delphi .net ???
Das ist meine bisherige Lösung. Kann man die mal unter Turbo Delphi .net testen?
Mfg Hajoseb
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| unit uScreencopy;
interface
uses System.Drawing, System.Windows.Forms, System.Drawing.Imaging;
function CopyScreen : Image;
implementation
uses windows;
var g2 : Graphics; img : Image;
function CopyScreen : Image; var dc1 : HDC; dc2 : IntPtr;
begin dc1 := GetDC(0); dc2 := g2.GetHdc();
BitBlt(HDC(dc2), 0, 0, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, dc1, 0, 0, 13369376); ReleaseDC(0,dc1); g2.ReleaseHdc(dc2);
Result := img; end;
begin img := system.Drawing.Bitmap.Create(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height); g2 := Graphics.FromImage(img); end. |
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 11.06.07 12:26
@Hajoseb,
das musst Du schon selbst ausprobieren. Auf den ersten Blick hat es große Ähnlichkeiten mit meinem Verfahren. Allerdings habe ich den Eindruck, dass begin-end und die einzelnen Schritte nicht richtig zusammenpassen; das kann aber auch am Kopieren liegen.
@Christian
Das mit dem Invoke ist mir bewusst. Aber Du hast ja schon vorher geschrieben, dass es unter NET 1.1 nicht anders geht; und nachdem es Hajoseb Dir nicht geglaubt hat, hat er es jetzt auch von Bernhard Geyer gelesen.
Jürgen
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Mo 11.06.07 14:22
Hallo, Jütho.
Ich habe ihm schon geglaubt, aber eben die Hoffnung nicht vollends aufgegeben
Das mit den begin-end würde mich schon interessieren.
Mit dem
Delphi-Quelltext 1: 2: 3: 4: 5:
| begin img := system.Drawing.Bitmap.Create(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height); g2 := Graphics.FromImage(img); end. |
habe ich in der Initialisierung des Modul, damit nicht bei jedem neuen Aufruf mit create eine neue Bitmap im speicher erzeugt wird, sondern nur einmal am Anfang. Sonst ist der Speicher doch gleich voll...
Und hier
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function CopyScreen : Image; var dc1 : HDC; dc2 : IntPtr;
begin dc1 := GetDC(0); dc2 := g2.GetHdc();
BitBlt(HDC(dc2), 0, 0, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, dc1, 0, 0, 13369376); ReleaseDC(0,dc1); g2.ReleaseHdc(dc2);
Result := img; end; |
wird dann "nur" kopiert.
... oder sehe ich da etwas falsch ???
Mfg Hajoseb
P.S. Und mit dem sleber probieren, beißt sich die Katze in den Schwanz ...
ich möchte Turbo Delphi .net ja erst installieren, wenn ich weis das es geht.
|
|
Robert_G
Beiträge: 416
Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
|
Verfasst: Di 12.06.07 20:50
Hajoseb hat folgendes geschrieben: | P.S. Und mit dem sleber probieren, beißt sich die Katze in den Schwanz ...
ich möchte Turbo Delphi .net ja erst installieren, wenn ich weis das es geht. |
Sozusagen ein Wallach mit Plüschfell?
btw: Das dürfte schwer werden, jemanden zu finden, der Turbo Delphi.Net drauf hat. Denn derjenige hätte dann kein Turbo Delphi32.
Spar dir den Ärger und kiek dir C# Express an. Kostet nix und lässt Delphi.Net alt aussehen. Hauptsächlich die IDE Features, aber auch die Sprache selbst geht einen in .Net viel leichter von der Hand.
|
|
Hajoseb
Beiträge: 42
|
Verfasst: Mi 13.06.07 12:35
Ich lese mir gerade das C#-Buch durch und werde dann mal versuche, mein Programm auf c# zu convertieren
Ansonsten erst mal Danke an alle !!!
|
|
|