In den Crossposts bereits geklärt. Hier noch einmal etwas ausführlicher in einer anderen Variante
Delphi-Quellcode:
interface ...
type
// später leichter lesbar ...
TEindeutigeEintraegeAddResult = (arVorhanden, arNeu);
TMainForm: class(TForm)
...
private
// Feld, in dem die Stringlist Instanz gespeichert wird
fEindeutigeEintraege : TStringList
// read only Property für die Liste "EindeutigeEintraege".
// Über diese Property wird aus dem Programm auf die Liste zugegriffen!!
property EindeutigeEintraege:TStringList read get_EindeutigeEintraege;
// Getter für die Property "EindeutigeEintraege"
function get_EindeutigeEintraege:TStringList;
function EindeutigeEintraegeAdd(const neuerEintrag:String):TEindeutigeEintraegeAddResult;
protected
procedure ButtonIrgendwasClick(Sender:TObject)
public
end;
implementation
// Getter für die Property "EindeutigeEintraege"
function TMainForm.get_EindeutigeEintraege:TStringList;
begin
// gibt es die Liste schon als Instanz im Speicher? > wenn ja zurückgeben
if assigned(fEindeutigeEintraege) then exit(fEindeutigeEintraege);
// anderenfalls neue Instanz erstellen, Liste konfigurieren und zurückgeben
fEindeutigeEintraege := TStringList.Create;
fEindeutigeEintraege.sorted := true; // muss sein, damit der Duplettencheck greift. ist auch schneller!
fEindeutigeEintraege.Duplicates := dupIgnore; // Liste erstellt keine doppelten Einträge (ignoriert diese ohne Fehler zu werfen)
// fertig konfigurierte Listeninstanz zurückgeben
exit(fEindeutigeEintraege);
end;
function TMainForm.EindeutigeEintraegeAdd(const neuerEintrag:String):TEindeutigeEintraegeAddResult;
var lCount:Integer;
begin
lCount := EindeutigeEintraege.Count;
EindeutigeEintraege.add(neuerEintrag);
// wurde ein neuer Eintrag hinzugefügt oder ist die Anzahl der Einträge gleich?
// den Eintrag gab es schon
if lCount = EindeutigeEintraege.Count then exit(arVorhanden); // neuerEintrag war bereits vorhanden
// den Eintrag gab es noch nicht
exit(arNeu);
end;
procedure TMainForm.ButtonIrgendwasClick(Sender:TObject);
var lMachWas:Boolean;
begin
// check: muss etwas getan werden?
if form2.RadioButton1.checked then
lMachWas := EindeutigeEintraegeAdd(edit1.text) = arNeu;
// ab hier ist durch den ersten Aufruf sichergestellt, dass fEindeutigeEintraege instanziert ist
try
if lMachWas then begin
// "with" ist nicht immer von Vorteil. aber um bei deinem Beispiel zu bleiben ...
with form1.listview1.items.add do begin
caption:=edit1.text;
subitems.add(edit2.text);
subitems.add(edit3.text);
subitems.add(edit4.text);
end;
showmessage('Eintrag wurde hinzugefügt');
except
// Verarbeitung ist in die Grütze gegangen . vorgemerkten eindeutigen Eintrag wieder entfernen
EindeutigeEintraege.delete(edit1.text);
end;
end;
Dann im MainForm.Destroy Event aufräumen ...
if assigned(fEindeutigeEintraege) then fEindeutigeEintraege.free;