Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [FEHLER] PowerPoint mit Delphi ansteuern (https://www.delphipraxis.net/130501-%5Bfehler%5D-powerpoint-mit-delphi-ansteuern.html)

Jens Schumann 9. Mär 2009 19:16

Re: [FEHLER] PowerPoint mit Delphi ansteuern
 
Hallo,
ich bin mir nicht sicher ob der Hinweis hier passt.
Aber Versuch macht klug. Vor einigen Jahren konnte ich Excel ansprechen, aber nicht Word.
Das lag an einer Einstellung in der Registry. Leider lässt mich meine Erinnerung ziemlich im Stich.
Es lag an dem Anti-Virus PlugIn für Office. MS-Support
Damals hatte ich kein Norton, aber trotzdem Probleme. Das Anti-Virus PlugIn ließ sich in
der Registry deaktivieren (weiß aber nicht mehr wo). Damit war das Problem gelöst.
Evt. gibt es ja ähnliche Probleme mit O2k7.

Bernhard Geyer 9. Mär 2009 19:35

Re: [FEHLER] PowerPoint mit Delphi ansteuern
 
Falls du ein altes Office drauf hattest ist es fast schon Normal das Updates *irgendwelche* Problem bereiten. Besser ist es erst alles zu deinstallieren (evtl. Registry putzen) und dann alles neu zu installiern. Auf keinen Fall eine Parallelinstallation von alten Office übrig lassen.

T3rm1 9. Mär 2009 23:54

Re: [FEHLER] PowerPoint mit Delphi ansteuern
 
Office neu installiert. Funktioniert alles!

berens 18. Apr 2024 14:54

AW: [FEHLER] PowerPoint mit Delphi ansteuern
 
Werte Kollegen, bitte verzeiht mir, dass ich dieses uralte Thema ausgrabe.
Aufgrund eines aktuellen Datenschutzvorfalls möchte ich alle Leser auf folgendes Problem hinweisen:

TL;DR: Wenn der Kunde vor Programmstart bereits PowerPoint offen hat, exportiert + zerstört die Prozedur von OP *diese* Präsentation (falls nicht gespeichert), statt die mit dem Dateinamen übergebene Präsentation umzuwandeln!

In Länge:
Ich wollte solche Probleme bereits im Vorfeld vermeiden und habe immer mit einer leeren PowerPoint-Instanz mit "PowerPoint := CoPowerPointApplication.Create" gearbeitet, statt mich auf die bestehende PowerPoint-Instanz "draufzuschalten". (Spoiler: Nein, sie ist nicht leer!)

Aber auch wenn die von OP beschriebene Ermittlung (AppWasRunning) weggelassen wird, ob eine PowerPoint-Instanz bereits läuft oder nicht, wird mit "PowerPoint := CoPowerPointApplication.Create;" KEINE neue PowerPoint-Instanz erzeugt, FALLS bereits PowerPoint mit einer anderen Datei geöffnet ist. Das PowerPoint-Handle zeigt stattdessen auf die bereits geöffnete Instanz.

Im vorliegenden Fall verwendet OP (wissentlich) die bestehende Instanz von PowerPoint, falls diese bereits geöffnet war.
Ich habe sie unwissentlich/unfreiwillig verwendet, wegen: siehe Oben.

Daraus resultiert:
1) In der Prozedur von OP wird die in PowerPoint bereits vor Programmstart geöffnete Präsentation nun als Bild gespeichert. NICHT die Präsentation, die über Open() geöffnet wird. (Die Zufälligerweise-bei-Programmstart-geöffnete-PowerPoint mit sensiblen Daten wird als Bild gespeichert und weiterverarbeitet, nicht die mit "Path" übergebene! --> PowerPoint.Presentations.Item(1) = schon offene PowerPoint, Item(2) wäre die eben von uns geöffnete!
2) Nach der Umwandlung in ein Bild wird die "erste" PowerPoint-Präsentation (ohne Speichern) geschlossen: PowerPoint.Presentations.Item(1).Close . Evtl. hat der Benutzer schon den ganzen Tag an der Präsentation gearbeitet ohne zu Speichern, will kurz in deinem Programm was machen und dann wird ihm die Präsentation kommentarlos zugemacht.

Keine Anschuldigung, keine Beschwerde! Ich arbeite ja auch mit dem Code, und bin dankbar für die Mitarbeit in der Community, und mir ist es ja auch vorher nicht aufgefallen.

Mein Lösungsvorschlag, bitte korrigiert ihr mich hier gerne:
Bei "Open()" erhält man das Handle/Interface/was-auch-immer auf die eben geöffnete PowerPoint-Datei (hier die Variable "SelectedPresentation", nehmt gerne einen sinnvolleren Namen). Nur damit arbeiten!

Delphi-Quellcode:
function ConvertPowerPoint(var _FileName: String; _RootFolder: string; _SubFolder: string; _ForceSubdirectory: Boolean = False): Boolean;
const
  P = 'ConvertPowerPoint';
var
  PowerPoint: PowerPointApplication;
  AppWasRunning: Boolean;
  OleResult: HRESULT;
  Unknown: IUnknown;
  SelectedPresentation: _Presentation;
begin
  Result := False;
  try
    // ...

    AppWasRunning := False;
    OleResult := GetActiveObject(CLASS_PowerPointApplication, nil, Unknown);
    if (OleResult = MK_E_UNAVAILABLE) then begin
      PowerPoint := CoPowerPointApplication.Create;
    end else begin
      OleCheck(OleResult);
      OleCheck(Unknown.QueryInterface(PowerPointApplication, PowerPoint));
      AppWasRunning := True;
    end;

    if assigned(PowerPoint) then begin
      try
        SelectedPresentation := PowerPoint.Presentations.Open(_FileName, msoTrue, msoFalse, msoFalse);
        if SelectedPresentation <> NIL then begin
          try
            // ...
            SelectedPresentation.Export(TargetFolder, 'png', w, h);
          finally
            SelectedPresentation.Close;
          end;
        end;
      finally
        if not AppWasRunning then PowerPoint.Quit;
      end;
    end else begin
      LogP(M, P, 'Unable to connect to PowerPoint!', '', ws_SEVERITY_FAILED);
    end;
Vielen Dank für eure Aufmerksamkeit!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz