![]() |
Excel mit SendMessage ohne Speicher-Nachfrage beenden
Hallo Zusammen,
ich mache eine Tabellen-Ausdruck mit Excel und möchte nach dem Ausdruck Excel wieder schließen. Dazu suche ich mir das entsprechende Fenster und gebe dann über SendMessage den Schliesse-Befehl. Jetzt habe ich aber das Problem, dass Excel fragt, ob die Datei gespeichert werden soll. Kann ich das mit SendMessage umgehen?
Delphi-Quellcode:
Vielen Dank
procedure TExcelExport.ShowTemp(Pfad: string; Drucken: boolean);
var h: hwnd; begin OpenTemp; FExcelApp.Workbooks.open(pfad); if Drucken then begin FExcelApp.Worksheets.PrintOut; h := FindWindowByTitle(copy(pfad, Length(pfad)-25,21)); //Hier wird das entsprechende Fenster gesucht if h <> 0 then SendMessage(h, WM_SYSCOMMAND, SC_CLOSE, 0) // und hier schließe ich es. Gibt es hier einen Parameter, der die Speicherfrage unterdrückt? else ShowMessage('not found.'); end else begin FExcelApp.Visible := True; end; end; Patrick |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Wahrscheinlich nur hart mit TerminateProcess
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Hat dein Excel Workbook eventuell eine Close Methode?
Delphi-Quellcode:
?
FExcelApp.Workbooks.Close(false)
![]() |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Ich habe mich für die SendMessage-Variante entschieden, weil ich verhindern wollte, dass dem User andere geöffnete Excel-Applikationen ungefragt geschlossen werden. Sonst hätte ich das über das Workbook gemacht. Aber die Nachfrage killt meinen Plan, weil das nicht handlebar für den Benutzer ist, immer erst in Excel auf "NEIN" zu klicken...
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Delphi-Quellcode:
?
SendMessage(h, WM_DESTROY, 0, 0)
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Dann schließe halt nur das gewünschte Workbook
Delphi-Quellcode:
FWorkBook := FExcel.WorkBooks.Open(FileName, False, True);
... FWorkBook.Close(SaveChanges:=False); |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
Zitat:
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
Delphi-Quellcode:
schon Jahrelang und haben noch nie eine Nachfrage gesehen.
FWorkBook.Close(SaveChanges:=False);
Hast du denn auch SaveChanges:=False drin in deinem Code? |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Hallo,
um andere Excel-Anwendungen nicht in die Quere zu kommen, öffne doch kurzzeitig einene neue Instanz von Excel die nach dem Drucken wieder geschlossen wird.
Delphi-Quellcode:
procedure TExcelExport.ShowTemp(Pfad: string; Drucken: boolean);
var ExcelApp: OleVariant; begin ExcelApp:=CreateOleObject('Excel.Application'); ExcelApp.Visible:=True; ExcelApp.WorkBooks.open(Pfad); //Hier drucken oder auch nicht ExcelApp.DisplayAlerts:=False; // schaltet die unerwünschte Nachfrage ab //ExcelApp.WorkBooks.close; // schliesst nur das Workbook ExcelApp.Quit; // schliesst die Excel-Inszanz wieder end; |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Kurze Frage:
Zitat:
Den Befehl Close(SaveChanges...) habe ich nämlich nicht... Danke Patrick |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
Weil das hat in Delphi noch nie funktioniert. |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
Lief schon mit Delphi 6 |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
|
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Hallo Ykcim,
hier eine Routine die das Workbook ausdruckt, ich habe nur die Seitenansicht angestellt. Da eine neue Excel - Instanz geöffnet wird sind keine Probleme mit anderen Excel - Instanzen die geöffnet sind zu erwarten.
Delphi-Quellcode:
Bis bald Chemiker
procedure Excel_Export(DateiName: TFileName; Drucken: boolean);
var oEXCEL : OLEVariant; begin try oEXCEL := CreateOleObject('Excel.Application'); except ShowMessage('Excel konnte nicht gestartet werden !'); Exit; end; oEXCEL.Visible:= TRUE; oEXCEL.Workbooks.Open (Filename:=DateiName,ReadOnly:=TRUE); if Drucken then begin oExcel.ActiveSheet.PrintOut (Preview:=TRUE); //Seitenansicht angestellt end; if NOT VarIsEmpty(oEXCEL) then begin oEXCEL.ActiveWorkBook.Saved:= TRUE; oEXCEL.Quit; oEXCEL:= Unassigned; end; end; |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Hallo Zusammen,
vielen Dank für die Hilfe. Ich konnte es damit lösen. Die Zeile
Delphi-Quellcode:
brachte den gewünschten Erfolg.
ExcelApp.DisplayAlerts:=False;
So sieht die ganze Procedure aus:
Delphi-Quellcode:
Vielen Dank
procedure TExcelExport.ShowTemp(Pfad: string; Drucken: boolean);
var h: hwnd; begin OpenTemp; FWorkBook :=FExcelApp.Workbooks.open(pfad); if Drucken then begin FExcelApp.Worksheets.PrintOut; FExcelApp.DisplayAlerts:=False; h := FindWindowByTitle(copy(pfad, Length(pfad)-25,21)); if h <> 0 then SendMessage(h, WM_SYSCOMMAND, SC_CLOSE, 0) else ShowMessage('not found.'); end else begin FExcelApp.Visible := True; end; end; Patrick |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
Zumindest solltest Du dann am Ende Deiner Routine FExcelApp.DisplayAlerts wieder auf den Ursprungswert setzen. Bernhard Geyer Lösungsvorschlag ist allerdings der deutlich intelligentere. Was ich sehr befremdlich finde: Du hast die Excelinstanz, mit der Du arbeitest im Zugriff. Und um die zu beenden suchst Du sie mittels "irgendwelcher Stringmanipulation", in der Hoffnung, dass die auch immer so funktioniert, um die bekannte und im Zugriff befindliche Excelinstanz zu schließen. Und wenn das nicht klappt bekommt der Anwender ein überaus aussagefähiges "not found." zu Gesicht, auf das er sicherlich absoulut sinnvoll reagieren kann? Keine Chance, dies bei uns durch den Test und die Qualitätssicherung zu bekommen. |
AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr. |
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