Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden

  Alt 14. Okt 2014, 09:05
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;

Geändert von jensw_2000 (14. Okt 2014 um 09:28 Uhr)
  Mit Zitat antworten Zitat