V programování v Delphi, v případě práce s Excelem, je často nutné zkontrolovat, zda je soubor Excel aktuálně otevřený. To může být nutné například k zabránění souběžnému přístupu k souboru z více aplikací nebo k provádění určitých akcí v závislosti na stavu otevřenosti souboru.
K provedení této kontroly používá Delphi jednu z funkcí z knihovny Ole - GetActiveObject. Tato funkce umožňuje získat ukazatel na již otevřený objekt podle jeho ProgID (ID programu) nebo CLSID (jedinečný identifikátor třídy).
Poznámka: Pro použití této funkce je nutné do projektu přidat modul podpory knihovny OLE-importovat typy a funkce z knihovny " ole32.s pomocí směrnice .
Proces kontroly otevřenosti souboru aplikace Excel se omezuje na volání funkce GetActiveObject s uvedením požadovaného ProgID (pro Excel je to "Excel.Application") a ověření přijatého ukazatele na hodnotu nil. Pokud ukazatel není roven nil, pak je soubor již otevřen.
Jak zjistit, že excel soubor je otevřen v Delphi
Při práci se soubory Excel v Delphi je někdy nutné zkontrolovat, zda je soubor aktuálně otevřený nebo ne. To může být užitečné například pro vyloučení možnosti souběžné úpravy souboru různými uživateli.
K určení stavu souboru lze použít funkci ShellWindows z modulu ActiveX. Umožňuje vám získat informace o všech aktivních oknech systému, včetně otevřených souborů aplikace Excel.
Níže je uveden příklad kódu, který ukazuje, jak zkontrolovat, zda je soubor excel otevřený:
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;
V tomto příkladu funkce IsExcelFileOpen přijme název ověřeného souboru a vrátí True, pokud je soubor otevřený, nebo False, pokud soubor není otevřený. Funkce používá objekt ShellWindows k získání seznamu aktivních oken operačního systému. Poté zkontroluje každé okno a jeho typ, a pokud typ okna odpovídá oknu aplikace Excel, provede další kontrolu otevřené knihy s daným názvem souboru.
Volání funkce IsExcelFileOpen probíhá pomocí obslužného programu události, například stisknutím tlačítka. V závislosti na výsledku kontroly se zobrazí příslušná zpráva uživateli.
Pomocí tohoto kódu je tedy možné určit, zda je excel otevřený soubor v Delphi a na základě těchto informací provést požadované kroky.