AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Screenshots von 2 übereinanderliegenden Forms
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshots von 2 übereinanderliegenden Forms

Ein Thema von Helmi · begonnen am 6. Jan 2015 · letzter Beitrag vom 9. Jan 2015
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#1

Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 21:18
Hallo,

mittels dem nachfolgenden Code mach ich Screenshots von einer Form (MainForm):

Delphi-Quellcode:
procedure ScreenShot_erstellen(const Pfad: String);

  function DateiName(Pfad, Name, Endung: String): String;
  var
    i: Integer;

  begin
    //Variablen vordefinieren
    Result := '';
    i := 1;

    //Pfad mit einem Backslash enden lassen
    Pfad := IncludeTrailingPathDelimiter(Pfad);

    while true do
      begin
        //Dateinamen zusammenstellen
        Result := Pfad + Format('%s%.3d.%s', [Name, i, Endung]);

        //wenn Datei nicht vorhanden, dann Schleife beenden
        If not FileExists(Result) then
          break;

        inc(i);
      end;
  end;

 var
  Png : TPngImage;
  Bitmap : TBitmap;
  BitmapRect: TRect;
  i_Width : Integer;
  i_Height : Integer;

begin
  //Bitmap erzeugen
  Bitmap := TBitmap.Create;

  //PNG erzeugen
  Png := TPngImage.Create;

  //Höhe und Breite des Client-Bereiches ermitteln
  i_Width := Application.MainForm.ClientWidth;
  i_Height := Application.MainForm.ClientHeight;

  try
    //prüfen ob der ScreenShot-Ordner besteht, wenn nicht, dann erstellen
    //wenn er nicht erstellt werden konnte, dann Log schreiben
    If not DirectoryExists(Pfad) then
      If not CreateDir(Pfad) then
        begin
          InfoLog(Format('ScreenShot: Pfad "%s" nicht vorhanden und konnte nicht erstellt werden!', [Pfad]));

          exit;
        end;

    //Rect des Clientbereiches definieren
    BitmapRect := Rect(0, 0, i_Width, i_Height);

    //Bitmap-Größe angeben
    Bitmap.Width := i_Width;
    Bitmap.Height := i_Height;

    //Bild-Bereich in Bitmap kopieren
    Bitmap.Canvas.CopyRect(BitmapRect, Application.MainForm.Canvas, BitmapRect);

    //Bitmap als PNG speichern
    Png.Assign(Bitmap);
    Png.CompressionLevel := 7;
    Png.SaveToFile(DateiName(Pfad, 'Bild', 'png'));
  finally
    //Bitmap löschen und freigeben
    FreeAndNil(Bitmap);

    //PNG löschen und freigeben
    FreeAndNil(Png);
  end;
end;
funktioniert tadellos

Nur über die MainForm setz ich noch eine 2. Form.

Jetzt hätt ich gerne einen Screenshot von allem - also so wie ich es auf dem Bildschirm sehe
die MainForm im Hintergrund und die andere Form darüber

wie kann ich das am besten realisieren?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.049 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 21:26
Mit Fensterrahmen?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 21:29
Mit Fensterrahmen?
dafür hab ich grad diesen Code gefunden

aber ich bräuchts ohne Rahmen (jedenfalls von der MainForm)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.049 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 21:45
Ohne Fensterrahmen des Unterfensters kann man das ganz einfach mit Copyrect machen.

Delphi-Quellcode:
Temp := Point(Subform.Left + (SubForm.Width - SubForm.ClientWidth) div 2, Subform.Top + SubForm.Height - SubForm.ClientHeight - (SubForm.Width - SubForm.ClientWidth) div 2); // angenommen, das Fenster hat unten so viel Rahmen wie links und rechts
Bitmap.CopyRect(Rect(Temp.X, Temp.Y, Temp.X + SubForm.ClientWidth, Temp.Y + SubForm.ClientHeight), SubForm.Canvas, Rect(0, 0, SubForm.ClientWidth, SubForm.ClientHeight));
Setzt voraus, dass das Unterfenster im Überfenster liegt. Wenn nicht, muss man das auch abfangen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 21:57
so bekomm ich jetzt nur ein weisses Rechteck, in der Größe der MainForm und da drauf die 2. Form

vermutlich hab ich irgendwas falsch übernommen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.049 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 22:47
Du musst das nach dem bestehenden CopyRect in deinen Quelltext einfügen (und den TPoint deklarieren natürlich). Wenn einfach nur das Bild der ersten Form fehlt, scheint das ja nicht ganz falsch zu sein so weit.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 6. Jan 2015, 22:54
Dank dir - jetzt hab ich beides drauf
nur die Position der 2. Form im Bitmap entspricht nicht der eigentlichen Position

Das bekomm ich aber noch raus
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Screenshots von 2 übereinanderliegenden Forms

  Alt 9. Jan 2015, 21:08
bei mir schaut jetzt die Erweiterung für die 2. Form (MessageForm) so aus:

Delphi-Quellcode:
    If MessageForm.Visible then
      begin
        Rahmenbreite_MaskForm := (MaskForm.Width - MaskForm.ClientWidth) div 2;

        X := MessageForm.Left - (MaskForm.Left + Rahmenbreite_MaskForm);
        Y := MessageForm.Top - (MaskForm.Top + (MaskForm.Height - Rahmenbreite_MaskForm - MaskForm.ClientHeight));

        DestRect := Rect(X, Y, X + MessageForm.ClientWidth, Y + MessageForm.ClientHeight);
        SourceRect := Rect(0, 0, MessageForm.ClientWidth, MessageForm.ClientHeight);

        Bitmap.Canvas.CopyRect(DestRect, MessageForm.Canvas, SourceRect);
      end;
damit wird die 2. Form im Bitmap genau an die gleiche Stelle gesetzt, wie auch im Programm.
Dummerweise muss man etwas rumprogrammieren um die Höhe der Titelleiste der 1. Form (MaskForm) rauszubekommen
Code:
(Höhe Titelleiste = Form.Höhe - Rahmenbreite - Form.ClientHöhe)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (10. Jan 2015 um 14:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 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