Problem/Question/Abstract:
I am sure every one at some time has wanted to use a case structure with strings but that is not possible with delphi case structures. So this is my solution which I have used over and over...
Answer:
I created a function called string index that returns the index of a string within an array of strings. The function returns -1 if the string was not found and is not case sensitive.
Usage:
Simply use like this
case StringIndex('Edit', ['Post', 'Edit', 'Cancel']) of
0: ; // Do somthing for Post "command"
1: ; // Do somthing for Edit "command"
2: ; // Do somthing for Cancel "command"
end;
{. }
{. }
{. }
or
if StringIndex('Edit', ['a', 'ab', 'rth']) = -1 then
// something
else
// something
StringIndex returns -1 if the string does not exist. This function is not case sensitive.
Of course the first string 'Edit' would be some variable.
Happy Coding!
Source:
unit Fn_StringIndex;
interface
uses
SysUtils;
function StringIndex(const SearchString: string; StrList: array of string): Integer;
implementation
function StringIndex(const SearchString: string; StrList: array of string): Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to High(StrList) do
if CompareText(SearchString, StrList[I]) = 0 then
begin
Result := I;
Break;
end;
end;
end.
SOME EXAMPLES OF USAGE
I decided it would be good for me to show all the places where I have used this function, so it is clearer the purpose I made it.
These are cuts directly from live code.
I hope this helps and maybe spark some ideas.
In this case I used it to determine my action if the OrdProp was Boolean or WordBool
EnumVal := GetOrdProp(Instance, PropInfo);
if StringIndex(PropInfo^.PropType^^.Name, ['Boolean', 'WordBool']) <> -1 then
begin
{ ... }
// to much to explain here
{ ... }
end
else
{ ... }
Here I am determining what kind of text to return based on the float type name
tkFloat: case StringIndex(Info.PropInfo^.PropType^^.Name,
['Currency', 'TDateTime']) of
0:
begin
Result := CurrToStr(GetFloatProp(Instance, PropInfo));
end;
1: Result := DateTimeToStr(GetFloatProp(Instance, PropInfo));
else
Result := FloatToStr(GetFloatProp(Instance, PropInfo));
end;
This converts a text string S to a boolean value.
function TRTTIModifier.TextToBool(S: string): Boolean;
begin
Result := StringIndex(S, ['', 'F', 'False', '0', 'No']) = -1;
end;
Taken from a web server application, to replace the passed tag "TagString" with whatever its suppose to. This I think would be a must for anyone using borlands web server architech.
procedure TSite.StateHTMLTag(Sender: TObject; Tag: TTag;
const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
case StringIndex(TagString,
['UserID', 'UserCreationDate', 'UserSiteAccessTime', 'APPCreationDate',
'UserList', 'Host'])
of
0: ReplaceText := IntToStr(User.ID);
1: ReplaceText := DateTimeToStr(User.CreationDateTime);
2: ReplaceText := DateTimeToStr(User.LastUserAccess);
3: ReplaceText := DateTimeToStr(App.CreationDateTime) + ' RefCount=' +
IntToStr(App.ReferenceCount);
4: ReplaceText := 'User List has been disabled';
5: ReplaceText := App.Host;
end;
end;
Another snip from a web server app where the command was passed on the url. I am only giving a small snip of it, but I think you get the idea.
else
case StringIndex(Command,
['EDITOBJECT', 'MODIFY', 'GENFORM', 'DELETE',
'PREVIEW', 'EDIT', 'CREATESITE', 'Reload',
'CreateSubSite', 'LogOut', 'HistoryBack', 'HistoryForward',
'PublishSite', 'Copy']) of
0:
begin
Response.Content := EditObject(PassedObject, SubCommand);
end;
1:
begin
This is taken from a some laser controler software I wrote.... You can see that I am determining what method to call based on the file extension.
procedure TBoneEditorData.LoadAnyFile(const FileName: string);
var
Ext: string;
begin
Ext := ExtractFileExt(FileName);
case StringIndex(Ext, ['.fmc', '.ild', '.fbz', '.fgp', '.fif']) of
0: LoadMotionFile(FileName);
1: LoadIldaFile(FileName);
2: LoadBonesFile(FileName);
3: LoadCombo(FileName);
4: LoadImageFile(FileName);
else
raise Exception.CreateFmt('Cannot load files of this type extension "%s"', [Ext]);
end;
end;
This takes a code from a database field and converts it to an ord type
function TMDBSchedule.GetFrequency: TFrequency;
const
FreqArray: array[0..4] of string = ('Y', 'M', 'W', 'D', 'N');
var
FreqInput: string;
FreqOrd: integer;
begin
FreqInput := UpperCase(DataSet.FieldByName('Frequency').AsString);
FreqOrd := StringIndex(FreqInput, FreqArray);
case FreqOrd of
0: Result := frYearly;
1: Result := frMonthly;
2: Result := frWeekly;
3: Result := frDaily;
4: Result := frNone;
else
Result := frNone;
end;
end;
Thats all the most important stuff.... have fun!
Component Download: http://www.baltsoft.com/files/dkb/attachment/fn_stringindex.ziphttp://www.baltsoft.com/files/dkb/attachment/fn_stringindex.zip
Nincsenek megjegyzések:
Megjegyzés küldése