-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLIB_ClipSave_UDef.pas
More file actions
138 lines (116 loc) · 3.62 KB
/
Copy pathLIB_ClipSave_UDef.pas
File metadata and controls
138 lines (116 loc) · 3.62 KB
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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
unit LIB_ClipSave_UDef;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TEscChar = (ecPrefix,ecDelimiter,ecExt,ecMsec);
ECreateFileNameErr = class(Exception);
const
ArEscChar:array[0..3] of char = ('p','r','e','i');
StrEsc='\';
MaxItem=6; //0オーダー
ArItem:array[0..MaxItem] of char=('y','m','d','h','n','s','i');
function ReplaceEscChar
(EscChar:TEscChar;StrRepl,StrUDef:String):String;
function ReplaceEscChars(StrUdef:String;ArRepl:array of String):String;
function CreateFileName(StrUDef,StrPrefix,StrDelimiter,StrNum:String):String;
function CheckUdefString(StrUdef, StrPrefix, StrDelimiter:String):Boolean;
implementation
//エスケープキャラクターを置換する関数
function ReplaceEscChar
(EscChar:TEscChar;StrRepl,StrUDef:String):String;
var
StrTmp:String;
intEsc:Integer;
begin
while Pos(StrEsc+ArEscChar[Ord(EscChar)],StrUdef) > 0 do
begin
intEsc:=Pos(StrEsc+ArEscChar[Ord(EscChar)],StrUdef);
StrTmp:=Copy(StrUDef,0,intEsc -1);
if StrRepl<>'' then
StrTmp:=StrTmp+'"'+StrRepl+'"';
StrTmp:=StrTmp+Copy(StrUDef,intEsc+Length(StrEsc+ArEscChar[Ord(EscChar)]),
Length(StrUdef));
StrUdef:=StrTmp;
end;
Result:=StrUdef;
end;
//エスケープキャラクタを置換する関数の元関数
function ReplaceEscChars(StrUdef:String;ArRepl:array of String):String;
begin
StrUdef:=ReplaceEscChar(ecPrefix,ArRepl[Ord(ecPrefix)],StrUdef);
StrUdef:=ReplaceEscChar(ecDelimiter,ArRepl[Ord(ecDelimiter)],StrUdef);
StrUdef:=ReplaceEscChar(ecExt,ArRepl[Ord(ecExt)],StrUdef);
StrUdef:=ReplaceEscChar(ecMSec,ArRepl[Ord(ecMSec)],StrUdef);
Result:=StrUdef;
end;
//ユーザー定義文字列からファイル名を作成する関数
function CreateFileName(StrUDef,StrPrefix,StrDelimiter,StrNum:String):String;
var
i,j:Integer;
blItem:Boolean;
wHour, wMin, wSec, wMs: Word;
begin
Result := '';
//設定されたユーザー定義文字列を初期化する
//すべて小文字に変換し、前後の空白を取り除く
StrUDef := AnsiLowerCase(Trim(StrUDef));
//ユーザー定義文字列のチェック
//有効な文字以外が入力されていないか確認する
For i:=1 to Length(StrUdef) do
begin
if not IsDelimiter('\',StrUdef,i) then
begin
blItem:=False;
//エスケープキャラクタチェック
For j:=0 to High(ArEscChar) do
begin
if StrUdef[i] = ArEscChar[j] then blItem:=True;
end;//Next j
//形式文字列チェック
For j:=0 to High(ArItem) do
begin
if StrUdef[i] = ArItem[j] then blItem:=True;
end;//Next j
//ArEscChar,ArItemのどれともマッチしない文字がある場合False
if blItem=False then
begin
Application.MessageBox('無効な文字が含まれています','警告',MB_OK);
Exit;
end;
end;
end;//Next i
//EscCharsを置換する
// Get milliseconds from current time
DecodeTime(Now, wHour, wMin, wSec, wMs);
StrUdef:=ReplaceEscChars(StrUdef,[StrPrefix,
StrDelimiter,
StrNum,
IntToStr(wMs)]);
//StrUdefが空文字の場合エラーになるからねぇ
if (StrUdef <> '') then
Result:=formatDateTime(StrUDef,Now())
else
raise ECreateFileNameErr.Create('ファイ名が生成できません');
end;
function CheckUdefString(StrUdef, StrPrefix, StrDelimiter:String):Boolean;
begin
Result := True;
if (StrUdef = '') then
begin
ShowMessage('ユーザー定義文字列が空です');
Result := False;
Exit;
end;
try
CreateFileName(StrUdef, StrPrefix, StrDelimiter, '001');
except
on E:ECreateFileNameErr do
begin
ShowMessage('不正なユーザー定義文字列です');
Result := False;
Exit;
end;
end;
end;
end.