neulich benötigte ich ein Set mit beliebig gemischten Daten , also (Integer , Double , String) ;
Und es sollten beliebig viele Einträge erlaubt sein, aber halt nur ein mal .
Habe im WWW gesucht , wurde aber nicht fündig.
Habe also was gebastelt.
Als Speicher für das Set dient einfach ein String;
var
StringSet:String;
Derzeit gibt es nur ein paar magere Methoden siehe unten:
Die einzelnen Daten werden im String mit einem Semikoln ';' als Delimiter getrennt.
Könnte man auch durch ein anderes Trenn-Zeichen ersetzen .
Derzeit gibt es ein Add- , Sub- und eine Abfrage , ob Wert enthalten ist.
Was noch fehlt wäre eine Schnellzuweisung für Integer- oder Char-Sequenzen, wie man es von derzeitigen Set's kennt.
Also so etwas wie :
x:=['a'..'z','A'..'Z'];
x:=[5..50];
Man könnte auch noch überlegen , ob man die Geschichte mit überladenen Operatoren ausrüstet.
Dann ist es allerdings nicht mehr beliebig unter den verschiedenen Pascalsytemen tauschbar .
Für die String-Suche könnte man noch eine Methode bauen , die eine Groß-Kleinschreibung händelt.
Wer viel Langeweile hat , kann es ja mal erweitern .
Im Anhang noch das Testprog mit Quellen.
Gruß
Frank
Code: Alles auswählen
unit T_StringSet;
{$MODE Delphi}
interface
uses SysUtils;
procedure add_string_set(wert:Integer; var string_set:string);overload;
procedure add_string_set(wert:double; var string_set:string);overload;
procedure add_string_set(wert:string; var string_set:string);overload;
procedure sub_string_set(wert:Integer; var string_set:string);overload;
procedure sub_string_set(wert:double; var string_set:string);overload;
procedure sub_string_set(wert:string; var string_set:string);overload;
function wert_in_string_set(wert:integer;string_set:string):boolean;overload;
function wert_in_string_set(wert:double;string_set:string):boolean;overload;
function wert_in_string_set(wert:string;string_set:string):boolean;overload;
procedure clear_string_set(var string_set:string);
implementation
// Löscht StringSet
procedure clear_string_set(var string_set:string);
begin
string_set:=';';
end;
// Integer-Wert an StringSet anfügen
procedure add_string_set(wert:Integer; var string_set:string);
begin
if pos(';'+inttostr(wert)+';',string_set)=0
then
begin
if length(string_set)=0 then string_set:=';';
string_set:=string_set+inttostr(wert)+';';
end;
end;
// Float-Wert an StringSet anfügen
procedure add_string_set(wert:double; var string_set:string);
begin
if pos(';'+floattostr(wert)+';',string_set)=0
then
begin
if length(string_set)=0 then string_set:=';';
string_set:=string_set+floattostr(wert)+';';
end;
end;
// String an StringSet anfügen
procedure add_string_set(wert:string; var string_set:string);
begin
if pos(';'+wert+';',string_set)=0
then
begin
if length(string_set)=0 then string_set:=';';
string_set:=string_set+wert+';';
end;
end;
//******************************
// Intergerwert aus StringSet ausschneiden
procedure sub_string_set(wert:Integer; var string_set:string);
var po:integer;
s1,s2:string;
begin
if pos(';'+inttostr(wert)+';',string_set)>0
then
begin
po:=pos(';'+inttostr(wert)+';',string_set);
s1:=copy(string_set,1,po);
s2:=copy(string_set,po+length(';'+inttostr(wert)+';'),length(string_set));
string_set:=s1+s2;
end;
end;
// Floatwert aus StringSet ausschneiden
procedure sub_string_set(wert:double; var string_set:string);
var po:integer;
s1,s2:string;
begin
if pos(';'+floattostr(wert)+';',string_set)>0
then
begin
po:=pos(';'+floattostr(wert)+';',string_set);
s1:=copy(string_set,1,po);
s2:=copy(string_set,po+length(';'+floattostr(wert)+';'),length(string_set));
string_set:=s1+s2;
end;
end;
// String aus StringSet ausschneiden
procedure sub_string_set(wert:string; var string_set:string);
var po:integer;
s1,s2:string;
begin
if pos(';'+wert+';',string_set)>0
then
begin
po:=pos(';'+wert+';',string_set);
s1:=copy(string_set,1,po);
s2:=copy(string_set,po+length(';'+wert+';'),length(string_set));
string_set:=s1+s2;
end;
end;
//******************************
// Integerwert in StringSet finden
function wert_in_string_set(wert:integer;string_set:string):boolean;
begin
result:=pos(';'+inttostr(wert)+';',string_set)>0;
end;
// Floatwert in StringSet finden
function wert_in_string_set(wert:double;string_set:string):boolean;
begin
result:=pos(';'+floattostr(wert)+';',string_set)>0;
end;
// String in StringSet finden
function wert_in_string_set(wert:string;string_set:string):boolean;
begin
result:=pos(';'+wert+';',string_set)>0;
end;
end.