Autor |
Beitrag |
SunnyDream
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 12:25
Hi!
Ich bins mal wieder. Sorry für die Masse an Fragen mit der ich euch bombardiere... Zumal sie zum Großteil einfache Anfängerfragen sind, aber ich bin halt noch nicht so weit
Naja wie dem auch sei:
Ich möchte in einen HTML Konverter eine Vorschau Funtkion einbauen.
D.h. beim Klicken auf den Button "Vorschau" soll der Inhalt eines RichEdit Feldes als "temp.html" an einem festgelegten Ort gespeichert werden. Jedoch ohne dass der User nach dem Ort gefragt wird, quasi ohne sein Wissen, dass die Datei gespeichert wird.
Ich weiss zwar wie man den Inhalt des RichEdits speichert, ich weiss auch wie man einen Namen vorgeben kann, und auch wie man einen Datei-Filter einschaltet. Aber ich weiss eben nicht, wie ich die Datei speichern kann, ohne dass der User davon etwas mitbekommt.
Desweiteren möchte ich die Datei dann ausführen, und ich weiss leider garnicht wie man sowas in Delphi macht... Also eine Datei ausführt =(
Last but not least möchte ich die Datei dann bei Beendigung des Programmes dann löschen. Ratet mal? Ich habe keinen blassen Schimmer wie ich das anstelle... =(
Ich hoffe ihr könnt mir so schnell und kompetent wie bisher helfen, und dass ich euch nicht allzusehr auf die Nerven gehe =)
|
|
Hack Gott
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: So 04.06.06 12:31
Ich hatte den ganzen Text schonmal getippt, jetzt wurde der beiträg gesperrt, nochmal von vorne:
Also du erstellst deine Datei ohne SaveDialog:
Delphi-Quelltext 1:
| Listbox1.Items.SaveToFile('C:\temp.html'); |
Dann lässt du sie ausführen, dazu fügst du in deiner Form bei den Uses ShellApi hinzu. Dann kanst du folgenden Code verwenden:
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'iexplorer.exe', '"C:\temp.html"', 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL); |
Wahlweise kannst du auch SW_SHOWMINIMIZED oder SW_SHOWMAXIMIZED verwenden (ich denke der Sinn ergibt sich von selbst). Erklärung der Code startet die Datei iexplorer.exe, zusätzlich erhält der Explorer deine Datei als Paramenter, er sollte sie jetzt ausführen.
Es ist einfacher die Datei einfach bei Beenden zu löschen (es geht auch nach Schließen des IE aber das ist komplizierter...), also einfach bei deiner Form der Eigenschaft OnClose folgendes hinzufügen:
Delphi-Quelltext 1:
| if fileexists('C:\temp.html') then deletefile('C:\temp.html'); |
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 12:36
Danke!
Echt Super Erklärung und eine erstklassige Hilfstellung.
Dank dir 
Zuletzt bearbeitet von SunnyDream am So 04.06.06 12:52, insgesamt 2-mal bearbeitet
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: So 04.06.06 12:37
Hi,
Delphi-Quelltext 1:
| Richedit1.lines.savetofile('C:\temp.html'); |
Es wäre ratsam wenn du die Datei in das Temp-Verzeichnis des jeweiligen Users speicherst. Sicherheitbewusste User arbeiten nicht mit den Adminkonto und haben somit keine Rechte auf C:\ oder andere Ordner zu schreiben. Da das Temp-Verzeichnis immer wo anders sein kann solltest du die Funktion GETSHELLFOLDER verwenden.
Um die Datei aufzurufen kannst du entweder das ActiveX-Control "TWebBrowser" verwenden:
Webbrowser1.navigate('C:\temp.html'); Dies wäre also ein integrierter Browser. Willst du die Datei mit den Standard-browser des Users öffnen solltest du mal nach SHELLEXECUTE, URL suchen.
Zum Löschen kannst du mal nach DELETEFILE suchen. Das ist eine WinAPI-Funktion.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 04.06.06 12:39
Ich würde nur ggf. 'C:\tmp.html' durch etwas ersetzen, was auch ein normaler User schreiben kann. Ich darf z.B. keine Dateien im Stammverzeichnis meiner Systempartition erstellen
Besser wäre da z.B. das Anwendungsverzeichnis des Users. Das bekommt man z.B. so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| function GetShellFolder(CSIDL: integer): string; var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end;
const CSIDL_APPDATA = $001a; MeinSavePath := GetShellFolder(CSIDL_APPDATA); |
Ach Mensch. Ich bin heute echt zu langsam. Aber noch mal lösche ich meine Beitrag nicht nachträglich. 
_________________ We are, we were and will not be.
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 12:52
Danke für den Tipp mit dem Shellfolder, ich werds umsetzen aber dennoch habe ich vorerst folgendes Problem:
So, also die Datei Speichert und Löscht er wie ich es wollte, jedoch führt er den IE nicht aus.
Ich weiss nicht wo das Problem liegt deshalb poste ich einfach meine "Uses" und den Code des OnClicks:
Uses:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Spin, ShellApi, Buttons; |
Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.SBPreviewClick(Sender: TObject); begin ROutPut.PlainText:= true; ROutPut.Lines.SaveToFile('C:\temp.html');
ShellExecute(Handle, 'open', 'iexplorer.exe', '"C:\temp.html"', 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL); end; |
|
|
Hack Gott
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: So 04.06.06 12:55
Ist mein Fehler, die Datei die du ausführen müsst muss nicht iexplorer.exe heißen sondern iexplore.exe!
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 12:57
O.k. Danke - jetzt funktioniert es. Ich werde jetzt aber direkt auf die oben genannten Tipps eingehen (was den Speicherort betrifft) und versuchen diese umzusetzen!
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 13:28
So für mich hat sich nun ein Problem eröffnet.
Wenn ich oben genannte Prozedur verwende, wird ja der Pfad in den die temp.html gespeichert werden soll in die Variable "MeinSavePath" gespeichert.
Wie ist dann die korrekte Syntax bei der Pfadangabe in der Speicher/Ausführ Funktion?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.SBPreviewClick(Sender: TObject); begin ROutPut.PlainText:= true; ROutPut.Lines.SaveToFile('C:\temp.html');
ShellExecute(Handle, 'open', 'iexplore.exe', '"C:\temp.html"', 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL); end; |
so sieht es bisher aus, wie muss ich es schreiben damit er dann den in "MeinSavePath" gespeicherten Pfad verwendet?
|
|
Hack Gott
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: So 04.06.06 13:36
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.SBPreviewClick(Sender: TObject); var MeinSavePath: string; begin MeinSavePath := 'C:\temp.html'; ROutPut.PlainText:= true; ROutPut.Lines.SaveToFile(MeinSavePath);
ShellExecute(Handle, 'open', 'iexplore.exe', '"' + MeinSavePath + '"', 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL); end; |
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 13:40
Danke soweit!
Du verwendest jetzt den Pfad "MeinSavePath", enthält dieser auch den Dateinamen? Also, eigentlich wird ja nur der Systemordner "temp" gesucht, und dann der komplette Pfad in "MeinSavePath" gespeichert. Wie heisst jetzt aber die Datei? Was ja zB für das Löschen wichtig wäre, sonst würde das Programm ja beim Schließen den Ordner Temp löschen, was sicher nicht Ziel der Sache sein soll^^;
|
|
Hack Gott
      
Beiträge: 409
Windows Vista
Delphi 2005 Personal, Delphi 7
|
Verfasst: So 04.06.06 13:43
Dann must du es so machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.SBPreviewClick(Sender: TObject); begin MeinSavePath := MeinSavePath+'temp.html'; ROutPut.PlainText:= true; ROutPut.Lines.SaveToFile(MeinSavePath);
ShellExecute(Handle, 'open', 'iexplore.exe', '"' + MeinSavePath + '"', 'C:\Programme\Internet Explorer\', SW_SHOWNORMAL); end; |
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 13:49
Was den Pfad angeht, das scheint so zu funktionieren...
Aber, die Funktion "GetShellFolder" macht mir Probleme...
ich bekomme als Fehlermeldungen:
Zitat: |
Erzeugen
[Fehler] Unit1.pas(63): Undefinierter Bezeichner: 'PItemIdList'
[Fehler] Unit1.pas(66): Undefinierter Bezeichner: 'IMalloc'
[Fehler] Unit1.pas(70): Undefinierter Bezeichner: 'SHGetMalloc'
[Fehler] Unit1.pas(71): Operator ist auf diesen Operandentyp nicht anwendbar
[Fehler] Unit1.pas(7 : Undefinierter Bezeichner: 'SHGetSpecialFolderLocation'
[Fehler] Unit1.pas(81): Undefinierter Bezeichner: 'SHGetPathFromIDList'
[Fehler] Unit1.pas(8 : Operator oder Semikolon fehlt
[Fehler] Unit1.pas(380): Anweisung erwartet, aber 'CONST' gefunden
|
Der Code der Funtkion in meinem Programm sieht wie folgt aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| function TForm1.GetShellFolder(CSIDL: integer): string; var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end; |
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 14:53
Hab die "undefinierten" Bezeichner nu in die "Uses" geschrieben,da scheints zu gehen. Jedoch sacht er mir bei der PItemIdList dass er die "PItemIdList.dcu" nicht finden kann?
Woran liegt das?
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 04.06.06 14:58
Nene, das is Quatsch.
In die Uses Liste muss iirc nur ShlObj und ShellApi. Das andere sind ja Funktionen, keine Units 
_________________ We are, we were and will not be.
|
|
SunnyDream 
      
Beiträge: 36
WinXP
Delphi 7 Personal
|
Verfasst: So 04.06.06 15:02
Aber wo liegt dann das Problem mit der Funktion als solches? Er sagt nämlich immernoch das "IMalloc" ein undefinierter Bezeichner ist o.O
|
|