全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2561
推到 Plurk!
推到 Facebook!

請問該如何做出儲存檔案及開啟檔案的功能

答題得分者是:pceyes
lirick2003
一般會員


發表:17
回覆:16
積分:11
註冊:2007-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-19 15:14:20 IP:123.204.xxx.xxx 訂閱
請問?
假設今日我要在程式裡加入儲存檔案和讀取檔案的功能...
那麼...我該怎麼去儲存Edit / CheckBox / ComboBox 各元件的值?
不是寫在登入檔內...
我想用SaveDialog來儲存成副檔名為.stb
開啟也只能用OpenDialog來開啟.stb檔案
請教要如何做...才能達到...
foxelf
初階會員


發表:9
回覆:42
積分:30
註冊:2003-03-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-19 16:27:40 IP:211.78.xxx.xxx 訂閱
你可以先用TStringList儲存元件的值,利用TStringList.SaveToFile儲存檔案
OpenDialog.Filter 設定 *.stb|*.stb

===================引 用 lirick2003 文 章===================
請問?
假設今日我要在程式裡加入儲存檔案和讀取檔案的功能...
那麼...我該怎麼去儲存Edit / CheckBox / ComboBox 各元件的值?
不是寫在登入檔內...
我想用SaveDialog來儲存成副檔名為.stb
開啟也只能用OpenDialog來開啟.stb檔案
請教要如何做...才能達到...

lirick2003
一般會員


發表:17
回覆:16
積分:11
註冊:2007-02-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-20 14:14:48 IP:123.204.xxx.xxx 訂閱
請問要怎麼做...看不太董
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-21 10:33:07 IP:203.66.xxx.xxx 訂閱
可以使用foxelf 大大說的,或是直接用
ReadComponentRes WriteComponentRes
來做這樣的功能,比如:

[code delphi]
procedure TForm1.FormCreate(Sender: TObject);
var
FS: TFileStream;
i: integer;
resFileName: String;
begin
resFileName := Application.ExeName '.res';
if FileExists(resFileName) then begin
FS := TFileStream.Create(resFileName, fmOpenRead);
try
for i := 0 to ComponentCount - 1 do begin
try
FS.ReadComponentRes(Components[i]);
except
on E: Exception do begin
MessageDlg(Components[i].Name '初始化狀態失敗!' #13#10 E.Message #13#10 '請刪除' resFileName, mtError, [mbOk], 0);
Application.Terminate;
Abort;
end;
end;
end;
finally
FS.Free;
end;
end;
end;
[/code]

[code delphi]
procedure TForm1.FormDestroy(Sender: TObject);
var
FS: TFileStream;
i: integer;
begin
FS := TFileStream.Create(Application.ExeName '.res', fmCreate);
try
for i := 0 to ComponentCount - 1 do
FS.WriteComponentRes(Components[i].Name, Components[i]);
finally
FS.Free;
end;
end;

[/code]
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-22 18:55:01 IP:220.141.xxx.xxx 訂閱
------
努力會更接近成功
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-23 22:37:58 IP:220.141.xxx.xxx 訂閱

[code delphi]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
CheckBox1: TCheckBox;
ComboBox1: TComboBox;
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Fn : Tstringlist; // 宣告Tstringlist

implementation
{$R *.dfm}
// 存檔
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then begin
try
Fn.values['Edit1'] := Edit1.text;
Fn.values['Combobox1'] := Combobox1.text;
if Checkbox1.Checked then
Fn.values['Checkbox1'] := '選取'
else
Fn.values['Checkbox1'] := '不選';
Fn.SaveToFile(SaveDialog1.FileName);
except
showmessage('寫檔失敗');
end;
end;
end;

// 開啟檔案
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Fn.LoadFromFile(OpenDialog1.FileName); // 載入檔案
try
edit1.text := Fn.values['Edit1'];
Combobox1.Text := Fn.values['Combobox1'];
if Fn.values['Checkbox1']='選取' then
Checkbox1.Checked := true
else
Checkbox1.Checked := false;
except
showmessage('讀檔失敗');
end;
end;
end;

// TStringList產生
procedure TForm1.FormCreate(Sender: TObject);
begin
Fn := TStringList.Create;
end;

// TStringList釋放
procedure TForm1.FormDestroy(Sender: TObject);
begin
Fn.Free;
end;

end.
[/code]
------
努力會更接近成功
lirick2003
一般會員


發表:17
回覆:16
積分:11
註冊:2007-02-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-24 11:08:10 IP:123.204.xxx.xxx 訂閱
那在請教一下~我用xml那個範例弄得...
請問要如何儲存SpinEdit的值?
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-24 12:01:19 IP:122.118.xxx.xxx 訂閱

// 讀
SpinEdit1.Value := xmlc.ReadInteger('sec1','SpEd1',0);
// 寫
xmlc.WriteInteger('sec1','SpEd1',SpinEdit1.Value);
------
努力會更接近成功
lirick2003
一般會員


發表:17
回覆:16
積分:11
註冊:2007-02-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-09-24 13:34:44 IP:123.204.xxx.xxx 訂閱
非常感謝~已經沒問題了...
不過在請教一下...
若今日共有幾百個物件要Save...那程式碼不就要弄幾千行?
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-09-24 15:42:40 IP:220.141.xxx.xxx 訂閱
摘自 careychen 大大的作品修改,因未徵得他的同意,若堅持反對將予以刪除,以尊重智慧財產權,特此聲明。

[會員作品發表區(限本人創作發表) » 懶惰鬼自動登入器 - (利用 Delphi 控制網頁的 Demo)]
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95258

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
begin
Fn := Tstringlist.Create;
for I := 0 to ComponentCount - 1 do
if Components[I] is TMemo then
Fn.values[TMemo(Components[I]).Name] := TMemo(Components[I]).Lines.Text
else if Components[I] is TComboBox then
Fn.values[TCombobox(Components[I]).Name] := TCombobox(Components[I]).Text
else if Components[I] is TEdit then
Fn.values[TEdit(Components[I]).Name] := TEdit(Components[I]).text
else if Components[I] is TListBox then
Fn.values[TListBox(Components[I]).Name] := TListBox(Components[I]).Items.Text
else if Components[I] is TCheckbox then
if TCheckbox(Components[I]).Checked then
Fn.values[TCheckBox(Components[I]).Name] := 'Y'
else
Fn.values[TCheckBox(Components[I]).Name] := 'N'
end;

[/code]
------
努力會更接近成功
lirick2003
一般會員


發表:17
回覆:16
積分:11
註冊:2007-02-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-09-27 10:45:26 IP:123.204.xxx.xxx 訂閱
謝謝~已經有了初步的了解
系統時間:2024-05-05 5:56:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!