Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OLE - Word - Eingebettete Grafik (https://www.delphipraxis.net/153565-ole-word-eingebettete-grafik.html)

Painterxyz 8. Aug 2010 18:55


OLE - Word - Eingebettete Grafik
 
Hallo,

beim speichern eines Word-Dokuments mit einer eingebetteten, 1 MB großen Grafik, kommt es zu einer Exception.

Ein Word-Dokument mit einer eingebetteten Grafik wird über OLE geöffnet und befüllt. Beim Speichern des Dokuments kommt dann die Fehlermeldung "Nicht genug Speicher, um den Vorgang auszuführen".

Außerdem enthalten die Dokumente Formfelder.

Ich verwende:
  • Delphi 5 Enterprise
  • MS Office 2003

Wie kann man ein Word-Dokument nun mit einer oder mehreren großen eingebetteten Grafiken über die Word-OLE-Schnittstelle speichern?

p80286 9. Aug 2010 09:30

AW: OLE - Word - Eingebettete Grafik
 
Hallo Painterxyz,

Ist nicht ganz einfach auf Dein Problem einzugehen, da insbesonders Word sich manchmal arg "zickig" anstellt.
Die üblichen Fragen nach genügend Arbeitsspeicher, Anzahl der Word-Instanzen usw. spar ich mir mal, das hast Du schon selbst überprüft (?)

Was verstehst Du denn unter Befüllen?
Und wie nimmst Du das Einbetten konkret vor? (SourceCode)

Und in welchem Format willst Du speichern?

Gruß
K-H

Painterxyz 9. Aug 2010 10:58

AW: OLE - Word - Eingebettete Grafik
 
Hi p80286,

der Form halber die fehlenden Informationen: 300 MB freier RAM und bei der Ausführung läuft eine Word-Instanz.

Exemplarisch sieht mein Quelltext wie hier aus.

Unter Befüllen verstehe ich das Suchen und Ersetzen von Platzhaltern.

Das Format ist *.doc (Word 2003)

Ich hab außerdem noch einmal geprüft welche Auflösung die Grafik hat. Auflösung 2480 x 3507.
Das Seitenformat in den Word-Dateien steht bei mir auf A4.
Das Interessante ist das A4-Format entspricht einer Auflösung von 3508 x 2480.
Und noch interessanter wirds, Word interessiert es gar nicht ob es eine verlinkte oder eingebettete Grafik ist. Erst wenn die Auflösung kleiner ist als die der A4-Auflösung gibt es keine Fehlermeldung.

MfG Painterxyz

p80286 9. Aug 2010 12:30

AW: OLE - Word - Eingebettete Grafik
 
Hallo Painterxyz,

da M$-Produkte immmer besser wissen, was für den Benutzer gut ist, solltest Du ggf. einmal das (Speicher-)Format Deines "Bildes" anschauen. Bei der Auflösung die Du genannt hast, sind es bei 256 Farben/Punkt ca 8,5 MB, ist es noch etwas bunter, wird es schon eng. Da Du etwas von 1 MB schreibst, gehe ich von einer SW-Graphik aus, aber nicht alles was SW ist wird als SW gespeichert!

Und wenn man konkret sieht wie Du die "Bilder" einbindest, kann man sich äußern. Wenn ich mich recht erinnere gibt es drei oder vier unterschiedliche Methoden ein "Bild" in ein Worddokument zu packen, und jede verhält sich anders.
Und da auch die Möglichkeit an der Darstellung zu drehen könnte es schon sein, daß Word der Speicher ausgeht.
Die Fehlermeldung besagt auch nur, daß Word der Speicher ausgegangen ist. Auf dem Rechner kann noch einiges frei sein.
Meist half es ,unter anderem Format zu speichern (.RTF) und dann wieder nach .doc zurück holen. (Bei Handbetrieb!)

Gruß
K-H

Edith:
So hab ich bisher wenig Probleme gehabt:
Code:
msword.selection.inlineshapes.addpicture(filename:=dummy, linktofile:=false, savewithdocument:=true).lockaspectratio:=true;

Painterxyz 9. Aug 2010 12:46

AW: OLE - Word - Eingebettete Grafik
 
Danke p80286 für deine Antwort,

unglücklicherweise habe ich ein paar Sachen ausgelassen. :oops: Der Link auf den Quellcode sollte nur zeigen was ich so ungefähr mit Word-Dokumenten anstelle. Anstelle des Beispiels öffne ich ein Word-Dokument das bereits eine montröse eingebettete JPEG-Grafik enthält. Dann wird das Suchen und Ersetzen durchgeführt und schließlich gespeichert.

MfG Painterxyz

p80286 9. Aug 2010 13:20

AW: OLE - Word - Eingebettete Grafik
 
Hallo Painterxyz,

zunächst möchte ich auf die Ergänzung meines letzten Beitrags verweisen,
damit kann ich so ziemlich alles, was mir über den Weg läuft, in ein Word-Dokument packen, aber das ist auch schon einmal schief gegangen, weil Word einem nie erzählt was es mit "Bildern" wirklich anstellt.
Soweit ich weiß, erfolgt vor bzw. während des Speicherns eine Umrechnung der Rohdaten, was den Speicherverbrauch in die Höhe treibt. Ggf. solltest Du das Speichern zwischendurch mehrere Male machen, aber das leert nicht zwangsläufig den Hauptspeicher.

Gruß
K-H

Painterxyz 10. Aug 2010 09:51

AW: OLE - Word - Eingebettete Grafik
 
Hallo 80286,

dein Code-Schnipsel hat funktioniert und ich konnte die Grafik ohne Fehlermeldung einfügen. Danke.

Die Eigentliche problematische Stelle habe ich nun gefunden und auf einen Beispielcode reduziert.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, OleCtnrs;

type
  TForm1 = class(TForm)
    OleContainer1: TOleContainer;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


const QUELLE = 'D:\Delphi-Experimente\Word\Speichern_grosse_Bilder\Dokument_mit_grosser_Grafik.doc';

procedure TForm1.FormShow(Sender: TObject);
begin
  try
    OleContainer1.CreateObjectFromFile(QUELLE,False);
  except
    on e:Exception do
    begin
      MessageDlg('Öffnen: ' +
                 e.Message, mtWarning, [mbOK], 0);
      Exit; // wenn kein Olecontainer geladen werden kann, kann abgebrochen werden
    end;
  end;

  try
    OleContainer1.Run;
    OleContainer1.DoVerb(0);
  except
    on X:Exception do
    begin
      MessageDlg('Ausführen: ' + X.Message, mtWarning, [mbOK], 0);
      try
        OleContainer1.Close;
        OleContainer1.DestroyObject;
      except
      end;
      Exit;
    end;
  end;

  try
    OleContainer1.SaveAsDocument(ExtractFilePath(QUELLE)+'\01_'+ExtractFileName(QUELLE));
  except
    on e:Exception do
    begin
      ShowMessage('Speichern: ' + e.Message);
    end;
  end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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