Einzelnen Beitrag anzeigen

Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Eigene Druckvorschau mit TMetafile und TImage

  Alt 4. Jan 2021, 22:27
Der Ansatz von TurboMagic ist glaub ich das, was ich möchte, allein: es funktioniert leider noch nicht

Ich habe bisher folgendes:
Delphi-Quellcode:
var
  fmVorschau: TfmVorschau;
  AnzPages, AktPage : integer;
  PrevMeta : TMetaFile;
  PrevMetaCanvas : TMetaFileCanvas;
  MFList : TObjectList<TMetaFile>;

procedure TfmVorschau.FormCreate(Sender: TObject);
var I : integer;
begin
AnzPages := 1;
AktPage := 1;
MFList := TObjectList<TMetafile>.Create;
end;

procedure TfmVorschau.CreateMetaFile;
begin
PrevMeta := TMetafile.Create;
PrevMeta.Enhanced := true;
PrevMeta.SetSize(PWidth,PHeight); //Größe des Metafiles, je nach Papierformat
PrevMetaCanvas := TMetafileCanvas.Create(PrevMeta,0); //Canvas erzeugen
PrintUtils.AktCanvas := PrevMetaCanvas; //aktuellen Canvas für Unit PrintUtils festlegen, diese enthält die Basisdruckroutinen
SetMapMode(AktCanvas.Handle,MM_TEXT);
SetTextAlign(AktCanvas.Handle,TA_BaseLine);
end;

...

procedure TfmVorschau.NewPage;
begin
//Freigabe des MetafileCanvas der VORHERIGEN Druckseite
PrevMetaCanvas.Free;
//PrevMeta.SaveToFile('D:\Test_Firebird_Server\' + IntToStr(AnzPages) + '.emf'); //diese Variante funktioniert

//Metafile der VORHERIGEN Druckseite in Objektliste ablegen und freigeben
MFList.Add(PrevMeta);
PrevMeta.Free;

//neue Seite erzeugen
Inc(AnzPages);
CreateMetafile; //neues Metafile für nächste Seite erzeugen
end;

//Abschlussprozedur nach dem Erzeugen der letzten Druckseite
procedure TfmVorschau.FinishPreview;
begin
PrevMetaCanvas.Free;
//PrevMeta.SaveToFile('D:\Test_Firebird_Server\' + IntToStr(AnzPages) + '.emf'); //siehe oben
MFList.Add(PrevMeta);
PrevMeta.Free;
end;

...

//die Anzeigeprozedur produziert nur leere Seiten
//die Liste weist genau so viele Einträge auf, wie Seiten vorher gedruckt und in der Liste abgelegt wurden
procedure TfmVorschau.ShowAktPage;
var CurrMetaFile : TMetafile;
begin
CurrMetaFile := TMetafile.Create;
//CurrMetaFile.LoadFromFile('D:\Test_Firebird_Server\' + IntToStr(AktPage) + '.emf'); //Anzeige funktioniert auf diese Art und Weise

//Eintrag der gewünschten Seite auf Metafile-Liste holen --> ist das richtig so ???
CurrMetafile := MFList.Items[AktPage-1];
    
//Seitengröße entsprechend der gewählten Zoomstufe einstellen
CurrMetaFile.SetSize(PageP1.Width,PageP1.Height);

//mit dem Vorschauimage verbinden
PrevIMG.Picture.Assign(CurrMetaFile);

//Freigabe
CurrMetafile.Free;
Label1.Caption := 'Seite ' + IntToStr(AktPage);
end;
Wie schon im Quelltext angemerkt, funktioniert das Ganze, wenn ich jede einzelne Druckseite als Datei auf Festplatte abspeichere und für die Anzeige wieder einlese. Das will ich natürlich nicht.
Hab ich einen Fehler in der Prozedur des Ablegens der Metafiles in der Objektliste oder in der Prozedur für das Auslesen aus dieser?

Geändert von runningsoft ( 4. Jan 2021 um 22:35 Uhr)
  Mit Zitat antworten Zitat