Announcement

Collapse
No announcement yet.

Richtiger Einsatz von TList und TMetaFile?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Richtiger Einsatz von TList und TMetaFile?

    Hallo beisammen,

    in Sachen Druck bzw. Vorschau mehrerer Seiten möchte ich gerne (auf Hagens Vorschlag hin) eine Liste von TMetaFiles verwenden. Da die Delphi-Dokumentation sich bei TList etwas bedeckt hält, bin ich nicht ganz sicher, wie ich damit umgehen soll. Wichtig ist mir v.a. der korrekte Umgang bzw. die Freigabe des Speichers.

    Ich hätte also gerne folgende Funktionalität:

    <UL>
    <LI>Der Ausdruck meiner Applikation soll zunächst auf ein (bzw. bei mehreren Druckseiten auf mehrere) TMetaFile(s) erfolgen.
    <LI>Nachdem die Ausgabe erfolgt ist, kann der so temporär erstellte Inhalt der Metafiles entweder auf einen Drucker, auf die Druckvorschau oder zu Archivierungszwecken in eine Datei ausgegeben werden.
    <LI>Nach der endgültigen Ausgabe auf eines der genannten "Geräte" soll der komplette Speicher wieder freigegeben werden.
    </UL>

    Da ich noch nie mit TList und TMetaFile gearbeitet habe und meine Kenntnisse in Sachen Speicherverwaltung sehr mäßig sind, poste ich hier mal einen Entwurf des Quellcodes.

    Ich würde mich über jeden Hinweis sehr freuen!

    Ralph

  • #2
    <PRE>
    // ***************************************
    // Liste und MetaFile (DIN A4) anlegen
    // ***************************************
    lsOutput := TList.Create;
    <BR>
    mfOutput := TMetaFile.Create;
    mfOutput.MMHeight := 2990;
    mfOutput.MMWidth := 2100;
    <BR>
    // ***************************************
    // auf Canvas schreiben
    // ***************************************
    with TMetafileCanvas.Create(mfOutput, 0) do
    try
    with TMetaFile.Canvas do
    begin
    TextOut(10, -10, 'Testtext')
    nRow := PenPos.y - 15;

    if nRow < nMaxRow then
    begin
    // ***************************************
    // was tun bei einem Seitenwechsel???
    // ***************************************
    end;
    <BR>
    // ***************************************
    // Canvas zu Liste hinzufügen (stimmt das so?)
    // ***************************************
    lsOutput.Add(^TMetafileCanvas);
    finally
    Free;
    end;
    <BR>
    // ***************************************
    // steht jetzt noch etwas in meiner TList oder
    // habe ich die durch das Free schon gelöscht?
    // ***************************************
    <BR>
    // ***************************************
    // alle Seiten drucken
    // ***************************************
    nMaxSeite := lsOutput.Count;
    Printer.BeginDoc;
    for nSeite := 1 to nMaxSeite do
    begin
    Printer.Canvas.Draw(0,0,lsOutput.Items[nSeite-1]);
    if nSeite < nMaxSeite then Printer.NewPage;
    end;
    Printer.EndDoc;
    <BR>
    // ***************************************
    // Listeneinträge und Liste freigeben
    // ***************************************
    for nSeite := 0 to (nMaxSeite - 1) do
    begin
    // ***************************************
    // was muss hier stehen?
    // ***************************************
    end;
    lsOutput.Free;
    </PRE&gt

    Comment


    • #3
      Hier der Code-Entwurf für die Unit "Drucken":

      <PRE>
      // ***************************************
      // Liste füllen (MetaFileCanvas bedrucken)
      // siehe nächstes Posting
      // ***************************************
      lsPages := Lieferschein;
      <BR>
      // ***************************************
      // Anzahl der Seiten feststellen
      // ***************************************
      nMaxSeite := lsPages.Count;
      <BR>
      // ***************************************
      // alle Seiten ausgeben
      // ***************************************
      if nMaxSeite > 0 then
      begin
      // ***************************************
      // Drucker setzen und einstellen
      // ***************************************
      Printer.PrinterIndex := -1;
      Printer.Copies := 1;
      Printer.Orientation := poPortrait;
      Printer.Title := 'Dokumententitel';
      Printer.BeginDoc;
      <BR>
      // ***************************************
      // Seite(n) auf Drucker ausgeben
      // ***************************************
      for nSeite := 1 to nMaxSeite do
      begin
      Printer.Canvas.Draw(0, 0, lsPages.Items[nSeite-1]);
      if nSeite < nMaxSeite then Printer.NewPage;
      end;
      <BR>
      // ***************************************
      // Drucken beenden
      // ***************************************
      Printer.EndDoc;
      end;
      <BR>
      // ***************************************
      // Liste freigeben
      // ***************************************
      lsPages.Free;
      end;
      </PRE>

      Als nächstes kommt noch der Code-Entwurf für die Unit "Lieferschein"..

      Comment


      • #4
        Hier ist der Code-Entwurf für die Unit "Lieferschein" - hier wird auf TMetaFileCanvas ausgegeben und der Liste lsPages hinzugefügt...

        <PRE>
        // ***************************************
        // Liste für ale Seiten anlegen
        // ***************************************
        lsOutput := TList.Create;
        <BR>
        // ***************************************
        // MetaFile anlegen und Größe auf A4
        // ***************************************
        mfOutput := TMetaFile.Create;
        mfOutput.MMHeight := 2990;
        mfOutput.MMWidth := 2100;
        <BR>
        // ***************************************
        // ersten Seite anlegen
        // ***************************************
        OutTarget := TMetafileCanvas.Create(mfOutput, 0);
        <BR>
        // ***************************************
        // "Druck" starten
        // ***************************************
        with OutTarget do
        begin
        MoveTo(0,0);
        SetMapMode(OutTarget.Handle, MM_LOMETRIC);
        Font.Name := 'Arial';
        <BR>
        TextOut(10, -10, 'Testtext');
        nRow := PenPos.y - 45; // nächste Druckzeile
        <BR>
        // ***************************************
        // Seitenwechsel nötig?
        // ***************************************
        if nRow < nMaxRow then
        begin
        // ***************************************
        // eben bedruckten Canvas zu Liste hinzufügen
        // ***************************************
        lsOutput.Add(OutTarget);
        <BR>
        // ***************************************
        // neuen Canvas anlegen
        // ***************************************
        OutTarget := TMetafileCanvas.Create(mfOutput, 0);
        end;
        end;
        <BR>
        // ***************************************
        // letzte Seite der Liste hinzufügen
        // ***************************************
        lsOutput.Add(OutTarget);
        <BR>
        // ***************************************
        // Liste aller Seiten zurückgeben
        // ***************************************
        Result := lsOutput;
        <BR>
        // ***************************************
        // Liste freigeben
        // ***************************************
        lsOutput.Free;
        end;
        </PRE&gt

        Comment


        • #5
          Zusatz:

          Da ich derzeit heftig an meiner Source arbeite, habe ich den oben angekündigten Code-Entwurf hier wieder gelöscht... es hat ja eh keinen interessiert ;-)

          Sollte ich weitere Fragen haben, melde ich mich wieder.

          Ralp

          Comment

          Working...
          X