![]() |
Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Hallo :)
Ich möchte Einträge aus Editfeldern in eine Listview übertragen, aber nur wenn sie nicht schon in dieser zu finden sind. Mit meinem derzeitigen Code kann ich nur einen Eintrag hinzufügen und danach keinen mehr. Das sehe ich auch an dem Code. ;) Zwei Varianten möchte ich gerne verstehen: 1. Wo muss ich edit1.text einfügen? (Wenn edit1.text schon in der ersten Spalte zu finden ist, soll kein neuer Eintrag erstellt werden und eine showmessage folgen) 2. Wo muss ich edit1.text und edit4.text einfügen? (So wie oben nur wenn edit1.text und edit4.text in der selben Zeile vorhanden sind) Bitte so einfach wie möglich, bin Anfänger.
Delphi-Quellcode:
Danke schon mal. :)procedure TForm2.Button1Click(Sender: TObject); begin if form2.RadioButton1.checked=true and assigned (form1.listview1.items[0])=false then begin with form1.listview1.items.add do begin caption:=edit1.text; subitems.add(edit2.text); subitems.add(edit3.text); subitems.add(edit4.text); showmessage('Eintrag wurde hinzugefügt'); end; end; |
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
|
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
@DeddyH
Hi :) Ist das nicht gern gesehen, wenn man das gleiche in zwei Foren postet? Kann ja sein, dass jemand der die Lösung weiß nur in einem Forum registriert ist. |
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
In den Crossposts bereits geklärt. Hier noch einmal etwas ausführlicher in einer anderen Variante
Delphi-Quellcode:
Dann im MainForm.Destroy Event aufräumen ...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;
Delphi-Quellcode:
if assigned(fEindeutigeEintraege) then fEindeutigeEintraege.free;
|
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Zitat:
|
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Zitat:
Wenn die Frage in einem Forum vollständig beantwortet wurde, dann brauchen sich die Leute aus dem anderen Forum nicht die Mühe machen und eine unnötige neue Antwort zusammentippen ... Zeit ist ja auch irgendwo ein wertvolles Gut. Richtig ? :wink: |
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Da habt ihr Recht!
Ich seh mir den Code morgen an. |
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Ich habe jetzt folgenden Code geschrieben, da ich eure nicht verstehe und es eine einfache Lösung geben muss.
Delphi-Quellcode:
Bei
procedure TForm2.Button1Click(Sender: TObject);
var i: integer; begin if form2.RadioButton1.checked=true then for i := 0 to 50 do if (form1.ListView1.Items[i].Caption=edit1.text) then showmessage('Eintrag bereits vorhanden') else begin with form1.listview1.items.add do begin caption:=edit1.text; subitems.add(edit2.text); subitems.add(edit3.text); subitems.add(edit4.text); showmessage('Eintrag wurde hinzugefügt'); end; end;
Delphi-Quellcode:
gibt er mir einen sigsegv Fehler wenn das Programm läuft und die Procedure gefordert ist.
(form1.ListView1.Items[i].Caption=edit1.text)
|
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Warum zählst du denn hier bis 50?
Delphi-Quellcode:
for i := 0 to Form1.Listview1.Items.Count - 1 do
Zitat:
Delphi-Quellcode:
für True.
if Form2.RadioButton1.Checked
Delphi-Quellcode:
für False.
if not Form2.RadioButton1.Checked
So ist es besser. |
AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Außerdem erst alle Einträge duchsehen, und danach (außerhalb der For-Schleife) dann auswerten, ob es gefunden wurde, oder nicht.
Eventuell gibt es zum Suchen auch eine Methode ala IndexOf, so wie bei vielen Listen/Collections. Anderrum geht es bei "mache etwas, wenn nicht vorhanden" nunmal nicht. Bei "mache etwas, wenn vorhanden, dann kann man die Liste durchgehen, beim Fund etwas machen und dann mit Break abbrechen, falls nicht weitere Funde ebenfalls behandelt werden sollen. Warum benutzt du die Variable Form2, wo der Code schon in TForm2 drin steht? Und die oftmalige Verwendung der Variable Form1 sollte dir ebenfalls ein Hinweis sein, daß hier ein Designproblem vorliegt. Denn der Code gehört ja wohl eindeutig in TForm1 rein, da öfters auf Komponenten dieser Form zugegriffen werden, als auf was Anderes. z.B. in eine
Delphi-Quellcode:
-Methode
FügeHinzu(Text1, Text2, Text3, Text4: string)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz