Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Excel mit SendMessage ohne Speicher-Nachfrage beenden (https://www.delphipraxis.net/201561-excel-mit-sendmessage-ohne-speicher-nachfrage-beenden.html)

Ykcim 1. Aug 2019 13:10

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:
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;
Vielen Dank
Patrick

Neutral General 1. Aug 2019 13:17

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Wahrscheinlich nur hart mit TerminateProcess

jfheins 1. Aug 2019 13:22

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Hat dein Excel Workbook eventuell eine Close Methode?

Delphi-Quellcode:
FExcelApp.Workbooks.Close(false)
?

https://docs.microsoft.com/en-us/off...workbook.close

Ykcim 1. Aug 2019 13:42

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...

Forensiker 1. Aug 2019 13:47

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Delphi-Quellcode:
SendMessage(h, WM_DESTROY, 0, 0)
?

Bernhard Geyer 1. Aug 2019 13:50

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);

Forensiker 1. Aug 2019 13:53

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Dann schließe halt nur das gewünschte Workbook
Zitat:

Jetzt habe ich aber das Problem, dass Excel fragt, ob die Datei gespeichert werden soll.
Dann kommt die abfrage später, spätestens dann wenn Exel geschlossen wird.

Bernhard Geyer 1. Aug 2019 14:04

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Forensiker (Beitrag 1438815)
Zitat:

Dann schließe halt nur das gewünschte Workbook
Zitat:

Jetzt habe ich aber das Problem, dass Excel fragt, ob die Datei gespeichert werden soll.
Dann kommt die abfrage später, spätestens dann wenn Exel geschlossen wird.

Also wir nutzen das mit

Delphi-Quellcode:
FWorkBook.Close(SaveChanges:=False);
schon Jahrelang und haben noch nie eine Nachfrage gesehen.

Hast du denn auch SaveChanges:=False drin in deinem Code?

Forensiker 1. Aug 2019 14:11

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
http://www.office-loesung.de/ftopic55819_0_0_asc.php
https://groups.google.com/forum/#!to...el/hXokhMegNuc

ghubi01 1. Aug 2019 15:00

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;

Ykcim 1. Aug 2019 15:00

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Kurze Frage:

Zitat:

FWorkBook := FExcel.WorkBooks.Open(FileName, False, True);
...
FWorkBook.Close(SaveChanges:=False);
Was sind FWorkbook und FExcel für Typen? OleVariant?
Den Befehl Close(SaveChanges...) habe ich nämlich nicht...

Danke Patrick

Bernhard Geyer 1. Aug 2019 15:11

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Ykcim (Beitrag 1438833)
Kurze Frage:

Zitat:

FWorkBook := FExcel.WorkBooks.Open(FileName, False, True);
...
FWorkBook.Close(SaveChanges:=False);
Was sind FWorkbook und FExcel für Typen? OleVariant?
Den Befehl Close(SaveChanges...) habe ich nämlich nicht...

Danke Patrick

Ja. Bei später Bindung ist es identisch. Nur das hier dann "SaveChanges" evtl. der 5te Parameter der Close-Methode ist und du die 4 zuvor passend belegen musst.

Neutral General 1. Aug 2019 15:13

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1438834)
Ja. Bei später Bindung ist es identisch. Nur das hier dann "SaveChanges" evtl. der 5te Parameter der Close-Methode ist und du die 4 zuvor passend belegen musst.

Ich bin mir ziemlich sicher, dass die Syntax Methode(ParameterX := 123) in Delphi nicht gültig ist. Kommst du vielleicht grad von Java o.ä.?
Weil das hat in Delphi noch nie funktioniert.

Bernhard Geyer 1. Aug 2019 15:17

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Neutral General (Beitrag 1438835)
Ich bin mir ziemlich sicher, dass die Syntax Methode(ParameterX := 123) in Delphi nicht gültig ist. Kommst du vielleicht grad von Java o.ä.?
Weil das hat in Delphi noch nie funktioniert.

Ich habe das vorhin aus unserem Quellcode kopiert.
Lief schon mit Delphi 6

peterbelow 1. Aug 2019 15:21

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Neutral General (Beitrag 1438835)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1438834)
Ja. Bei später Bindung ist es identisch. Nur das hier dann "SaveChanges" evtl. der 5te Parameter der Close-Methode ist und du die 4 zuvor passend belegen musst.

Ich bin mir ziemlich sicher, dass die Syntax Methode(ParameterX := 123) in Delphi nicht gültig ist. Kommst du vielleicht grad von Java o.ä.?
Weil das hat in Delphi noch nie funktioniert.

Doch, aber nur bei Aufruf von COM-Servermethoden via late binding, d.h. IDispatch in einem OleVariant.

Chemiker 1. Aug 2019 22:59

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:
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;
Bis bald Chemiker

Ykcim 2. Aug 2019 11:23

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:
ExcelApp.DisplayAlerts:=False;
brachte den gewünschten Erfolg.

So sieht die ganze Procedure aus:
Delphi-Quellcode:
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;
Vielen Dank
Patrick

Delphi.Narium 2. Aug 2019 13:28

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Zitat von Ykcim (Beitrag 1438989)
Hallo Zusammen,

vielen Dank für die Hilfe. Ich konnte es damit lösen.
Die Zeile
Delphi-Quellcode:
ExcelApp.DisplayAlerts:=False;
brachte den gewünschten Erfolg.

So sieht die ganze Procedure aus:
Delphi-Quellcode:
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;
Vielen Dank
Patrick

Das mag ja sein, dass das jetzt für Dich funktioniert, wenn aber der Anwender mal Excel schließt und vergessen hat, da irgendwas zu speichern, bekommt er wohl auch keine Meldung mehr. Ist das wirklich erwünscht?

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.

Forensiker 2. Aug 2019 16:27

AW: Excel mit SendMessage ohne Speicher-Nachfrage beenden
 
Zitat:

Die Zeile ExcelApp.DisplayAlerts:=False;brachte den gewünschten Erfolg.
Glückwunsch.


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