Zum Hauptinhalt springen

Wie kann ich überprüfen, ob eine Excel-Datei bereits in Delphi geöffnet ist

Bei der Delphi-Programmierung müssen Sie bei der Arbeit mit Excel häufig überprüfen, ob eine Excel-Datei gerade geöffnet ist. Dies kann beispielsweise erforderlich sein, um den gleichzeitigen Zugriff auf eine Datei aus mehreren Anwendungen zu verhindern oder abhängig vom Status der Datei, die geöffnet ist, bestimmte Aktionen auszuführen.

Delphi verwendet eine der Funktionen aus der OLE-Bibliothek GetActiveObject, um diese Überprüfung durchzuführen. Mit dieser Funktion können Sie einen Zeiger auf ein bereits geöffnetes Objekt anhand seiner ProgID (Programm-ID) oder CLSID (eindeutiger Klassenbezeichner) abrufen.

Anmerkung: Um diese Funktion verwenden zu können, müssen Sie dem Projekt ein Unterstützungsmodul für die OLE-Bibliothek hinzufügen - Typen und Funktionen aus der ole32-Bibliothek importieren.dll" mit einer Direktive .

Bei der Überprüfung der Offenheit einer Excel-Datei wird die Funktion GetActiveObject mit der gewünschten ProgID aufgerufen (für Excel ist dies "Excel.Application") und Überprüfen des resultierenden Zeigers auf den Wert nil. Wenn der Zeiger nicht gleich null ist, ist die Datei bereits geöffnet.

Wie finde ich heraus, dass eine Excel-Datei in Delphi geöffnet ist

Wenn Sie mit Excel-Dateien in Delphi arbeiten, müssen Sie manchmal überprüfen, ob die Datei gerade geöffnet ist oder nicht. Dies kann beispielsweise nützlich sein, um zu verhindern, dass verschiedene Benutzer eine Datei gleichzeitig bearbeiten können.

Sie können die ShellWindows-Funktion des ActiveX-Moduls verwenden, um den Status einer Datei zu bestimmen. Es ermöglicht Ihnen, Informationen über alle aktiven Fenster des Systems zu erhalten, einschließlich geöffneter Excel-Dateien.

Im folgenden Beispielcode wird veranschaulicht, wie überprüft wird, ob eine Excel-Datei geöffnet ist:

usesActiveX, ComObj;function IsExcelFileOpen(const FileName: WideString): Boolean;varShellWindows: OleVariant;i: Integer;Doc: IDispatch;Handle: HWND;ExcelApp: Variant;ExcelBooks: Variant;ExcelBook: Variant;ExcelFileName: WideString;beginResult := False;// Получаем список всех активных оконShellWindows := CreateOleObject('Shell.Application').Windows;// Перебираем все окна и проверяем тип документаfor i := 0 to ShellWindows.Count - 1 dobeginDoc := ShellWindows.Item(i);if (Doc.QueryInterface(IDispatch, Doc) = S_OK) thenbegin// Получаем дескриптор окнаHandle := FindWindow('XLMAIN', PChar(Doc.Name));if Handle <> 0 thenbegin// Получаем объект ExcelExcelApp := CreateOleObject('Excel.Application');// Получаем список открытых книгExcelBooks := ExcelApp.Workbooks;// Получаем количество книгfor i := 1 to ExcelBooks.Count dobegin// Получаем текущую книгуExcelBook := ExcelBooks.Item[i];// Получаем имя файла текущей книгиExcelFileName := ExcelBook.FullName;// Если имя файла совпадает с проверяемым, значит файл открытif SameText(ExcelFileName, FileName) thenbeginResult := True;Break;end;ExcelBook := Unassigned;end;ExcelBooks := Unassigned;ExcelApp.Quit;ExcelApp := Unassigned;end;end;end;end;procedure TForm1.Button1Click(Sender: TObject);beginif IsExcelFileOpen('C:\Book1.xlsx') thenShowMessage('Файл открыт')elseShowMessage('Файл не открыт');end;

In diesem Beispiel nimmt die Funktion IsExcelFileOpen den Namen der zu überprüfenden Datei an und gibt True zurück, wenn die Datei geöffnet ist, oder False, wenn die Datei nicht geöffnet ist. Die Funktion verwendet ein ShellWindows-Objekt, um eine Liste der aktiven Fenster des Betriebssystems abzurufen. Sie überprüft dann jedes Fenster und seinen Typ, und wenn der Fenstertyp dem Excel-Fenster entspricht, wird eine zusätzliche Überprüfung der geöffneten Arbeitsmappe mit dem angegebenen Dateinamen durchgeführt.

Der Aufruf der Funktion IsExcelFileOpen erfolgt über einen Ereignishandler, z. B. durch Klicken auf eine Schaltfläche. Je nach Testergebnis wird eine entsprechende Meldung an den Benutzer angezeigt.

Auf diese Weise können Sie mit diesem Code feststellen, ob eine Excel-Datei in Delphi geöffnet ist, und anhand dieser Informationen die erforderlichen Schritte ausführen.