Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#4

AW: ein Video der letzten 10 Sekunden erzeugen

  Alt 30. Jul 2021, 14:32
Muss es denn direkt ein Video sein?

Hiermit kannst Du ja schonmal ein Bildschirmfoto des angegebenen Formulars machen.
Delphi-Quellcode:
procedure HardCopy(sJpegFile : String; fm : TForm);
Var
          FStream : TStream;
          FBmp : TPicture;
          FJpeg : TJpegImage;
begin
  if SysUtils.FileExists(sJpegFile) then SysUtils.DeleteFile(sJpegFile);
  FStream := TFileStream.Create(sJpegFile,fmCreate);
  fm.WindowState := wsNormal;
  fm.Show;
  fm.Refresh;
  FJpeg := TJpegImage.Create;
  FBmp := TPicture.Create;
  try
    FBmp.Bitmap.Assign(fm.GetFormImage);
    FJpeg.Assign(FBmp.Bitmap);
    FJpeg.SaveToStream(FStream);
  finally
    FStream.Free;
    FJpeg.Free;
    FBmp.Free;
  end;
end;
Wenn man jetzt hergeht und die Fehlerbehandlung der Routine, die Ursprung der Idee war, anpasst
Delphi-Quellcode:
procedure TRWForm.doMouseActivate(AControl: TControl);
begin
  if (not WinControlValid(Self)) or IsDestroying then
    Exit;
  FLastClickedControl := AControl;
  if (Self <> rwScreen.ActiveForm) then
  begin
    try
      if (Visible and CanFocus) then
        SetFocus; // Hier wird Exception ausgelöst!
      rwScreen.ActiveForm := Self;
    except
      on e : Exception do begin
        MessageDlg(e.Message,mtError,[mbOk],0); // <- könnte man auch weglassen.
        if Assigned(Self) and (Self is TForm) then begin
          HardCopy('Einen eindeutigen Dateinamen erstellen, Datum Uhrzeit, GUID oder sowas.', Self);
          // Sinnvollerweise sollte man dann hier auch noch e.Message in eine Logdatei ...
          // schreiben und dabei direkt vermerken, welches Bild zur Fehlermeldung gehört.
        end;
      end;
    end;
  end;
end;
könnte man zumindest schonmal ein Bisserl von dem sehen, was da gerade so auf dem Bildschirm los war.

Ist's kein TForm, so könnte man die Kette der Parents nach oben laufen, bis man was vom Typ TForm findet.

Oder, man macht einfach Hardcopys von allen Formularen:
Delphi-Quellcode:
for i := 0 to Screen.FormCount - 1 do begin
  sJPeg := Format('%s.Error.Jpg',[Screen.Forms[i].Name]);
  HardCopy(sJPeg, Screen.Forms[i]);
end;
Man könnte aber auch z. B. alle x Sekunden per Timer auf diese Art ein Bild machen und davon dann die letzten 10 (oder so) erhalten und jeweils die älteste Datei überschreiben. Beim Programmende wird dann auch dort aufgeräumt. (Frei nach dem Motto: Überwachungskameras zeichnen ja (zum Teil) auch nur alle paar Sekunden ein Bild auf und die Aufnahme werden nach 'ner Weile wieder gelöscht.)

Per Dialog oder Konfiguration könnte man auch den Anwender fragen, ob man im Fehlerfalle Bildschirmfotos erstellen darf ..., wenn nicht, dann lässt man es halt.

Achso: Alles nur unausgegorene Ideen, aber eventuell kannst Du damit ja was anfangen
  Mit Zitat antworten Zitat