Hoe los je nou op een nette manier het opslaan van een bestand op, net zoals als bijvoorbeeld Office-applicaties dat doen? Je hebt
Opslaan, maar ook
Opslaan als.... Als je een nieuw bestand hebt gemaakt, maar nog geen bestandsnaam hebt opgegeven, moet altijd het dialoogvenster
Opslaan als... verschijnen, zelfs als je op
Opslaan drukt. De onderstaande code doet dat. Hij gaat ervanuit dat je een button FileSave en een button FileSaveAs hebt.
Delphi:
1
2
3
4
5
6
7
8
9
| procedure TForm1.FileSaveClick(Sender: TObject);
begin
Save; // simpelweg bestand opslaan
end;
procedure TForm1.FileSaveAsClick(Sender: TObject);
begin
SaveAs; // dialoogvenster 'Opslaan als...', daarna bestand opslaan
end; |
Tot zover piece of cake, nu nog Save en SaveAs implementeren.
Delphi:
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| var
FullFileName: string; { pad + bestandsnaam. Aanvankelijk leeg. }
function TForm1.Save: Boolean;
var
OldCursor: TCursor;
begin
if FullFileName = '' then
Result := SaveAs
else
try
OldCursor := Screen.Cursor;
Screen.Cursor := crHourglass;
try
{ Hier proberen je document daadwerkelijk op te slaan. }
finally
Screen.Cursor := OldCursor;
end;
Result := True;
except
Application.HandleException(Self);
Result := False;
end;
end; |
SaveAs is wat ingewikkelder.
Delphi:
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| function TForm1.SaveAs: Boolean;
var
IDList: PItemIDList;
Path: array[0..MAX_PATH] of Char;
OldFileName: TFileName;
begin
if FullFileName = '' then
begin
{ Proberen de map 'Mijn Documenten' te vinden. }
if SHGetSpecialFolderLocation(Application.Handle, CSIDL_PERSONAL,
IDList) = S_OK then
begin
SHGetPathFromIDList(IDList, @Path);
SaveDialog.InitialDir := Path;
end;
SaveDialog.FileName := 'Nieuw document';
end
else
SaveDialog.FileName := FullFileName;
if SaveDialog.Execute then
begin
if ExtractFileExt(SaveDialog.FileName) = '' then
{ Standaardextensie: .txt - dit kan ook iets anders zijn. }
SaveDialog.FileName := SaveDialog.FileName + '.txt';
OldFileName := FullFileName;
FullFileName := SaveDialog.FileName;
Result := Save;
if not Result then
FullFileName := OldFileName;
end
else
Result := False;
end; |
De
Filter property van SaveDialog moet als volgt zijn ingesteld (
FilterIndex = 2):
code:
1
| Alle bestanden (*.*)|*.*|Tekstbestanden (*.txt)|*.txt |
Een goede grap mag vrienden kosten.