实现自主选择路径,将数据另存为CSV档案的功能。代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShlObj,ComCtrls,ShellAPI,IniFiles,
ActiveX, wwdbdatetimepicker;
type
TForm1 = class(TForm)
Button1: TButton;
wwDBDateTimePicker1: TwwDBDateTimePicker;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetSystemPath(Folder: Integer): string;
var
PIDL: PItemIDList;//PItemIDList在ShlObj單元。
Path: LPSTR;//LPSTR在Windows單元。
AMalloc: IMalloc;//IMalloc在ActiveX單元。
begin
Path :=StrAlloc(MAX_PATH);
SHGetSpecialFolderLocation(Application.Handle, Folder, PIDL);
if SHGetPathFromIDList(PIDL, Path) then
Result :=Path;
SHGetMalloc(AMalloc);
AMalloc.Free(PIDL);
StrDispose(Path);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
mysave:TSaveDialog;
FileName,MYSTR:string;
LIST1:TStringList;
I:Integer;
begin
FileName:='我的文檔啦';
mysave:=TSaveDialog.Create(Self);//self這裡是指form1
mysave.InitialDir:=GetSystemPath(CSIDL_PERSONAL);//CSIDL_PERSONAL在ShlObj單元里,是一個16進制的數:$0005。
mysave.InitialDir:=GetCurrentDir; //直接用delphi自帶的函數GetCurrentDir(在SysUtils單元里)也能取得文件路徑。
mysave.Title:='請選擇要保存的位置啦';
mysave.FileName:=FileName;
{如何在保存時于文檔名后面加上後綴名‘.csv’?
答:是mysave.DefaultExt、 mysave.Filter、 mysave.FilterIndex 共同決定的。下面的代碼分別解釋了它們所起的作用:}
mysave.DefaultExt:='CSV';//選‘存檔類型’時這句代碼使文檔名後面有後綴且隨著所選的類型而變化相應的後綴。
mysave.Filter:='xlsx檔案|*.xlsx|xls檔案|*.xls|csv檔案|*.csv|所有檔案|*.*';//這裡羅列了4種類型。(Filter屬性有Filter Name和Filter兩個值,相當於展示值和存儲值。)
mysave.FilterIndex:=3;//存檔類型(過濾) 的下標,從1開始,1表示第一條,默認為第一條。這裡為3表示後綴名默認為‘.csv’。
mysave.Options:=mysave.Options+[ofOverwritePrompt];//相同文件名时弹出是否覆盖的对话框
//FileName:=mysave.GetNamePath;//FileName是空的,這樣不能獲取路徑。。。
if mysave.Execute then
begin
FileName:=mysave.FileName;//獲取文件保存的路徑!!
mysave.Free;
end
else
mysave.Free;
LIST1:=TStringList.Create;
MYSTR:='HAHA,TOTO,DUDU,LINGLING,PYNPYN,KIMO,GIGI,QIQI';
LIST1.Append(MYSTR);
for I:=0 TO 10 do
BEGIN
LIST1.Append('MY'+FormatFloat('00',I));
end;
LIST1.SaveToFile(FileName);{根據文件路徑找到剛剛創建并保存的文件,將列表LIST1的每行內容
按行保存到該文件中(CSV文件會把行中按逗號分隔的內容分割并保存到不同的列單元格!而
xlsx、xls文件不會識別逗號分割,只會全部保存到一個單元格里)。 }
//下面調用API函數ShellExecute打開程式文檔
//ShellExecute(Handle,'',PChar(FileName),'','',SW_SHOWNORMAL);//用空字符串的話,後面自主打開excel時會報錯!!
ShellExecute(Handle,nil,PChar(FileName),nil,nil,SW_SHOWNORMAL);//是PChar類型,所以要用nil。
//ShellExecute(Handle,null,PChar(FileName),null,null,SW_SHOWNORMAL);//報錯:Incompatible types: 'Variant' and 'PAnsiChar'
end;
结果如图: