У меня есть статус, который хранится в виде строки заданной длины либо в файле, либо в базе данных.
Я ищу, чтобы перечислить возможный статус'
У меня есть следующий тип для определения возможного статуса'
Type TStatus = (fsNormal = Ord('N'),fsEditedOnScreen = Ord('O'),
fsMissing = Ord('M'),fsEstimated = Ord('E'),fsSuspect = Ord('s'),
fsSuspectFromOnScreen = Ord('o'),fsSuspectMissing = Ord('m'),
fsSuspectEstimated = Ord('e'));
Во-первых, это действительно хорошая идея? или у меня должен быть отдельный массив const для хранения преобразований char? Это означало бы более одного места для обновления.
Теперь преобразуйте строку в массив состояния. У меня есть следующее, но как я могу проверить, действителен ли символ, не перебирая перечисление?
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i] := TStatus(Value[i]); // I don't think this line is safe.
end;
end;
После некоторого тестирования подозрительная строка безопасна (она не падает!), но просто добавляет (за пределы) значения, которые затем необходимо отфильтровать.
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i-1] := TStatus(Value[i]);
end;
for i := 0 to Length(Result) - 1 do
begin
case Result[i] of
fsNormal: ;
fsEditedOnScreen: ;
fsMissing: ;
fsEstimated: ;
fsSuspect: ;
fsSuspectFromOnScreen: ;
fsSuspectMissing: ;
fsSuspectEstimated: ;
else
Result [i] := fsNormal;
end;
end;
end;
Это позволяет всем состояниям и их относительным значениям Char быть в одном месте и предотвращает зацикливание каждого состояния для каждого символа в строке. (Так что в моей голове, по крайней мере, должно быть немного быстрее)
AFAIK, это должно подойти для повторного преобразования.
Function StatusToStr(Value : TStatusArray):String;
var
i: Integer;
begin
for i := 0 to Length(Value) - 1 do
Result := Result + Chr(Ord(Value[i]))
end;
Я использую Делфи 2007