Entwickler-Ecke

Sonstiges (Delphi) - Eintrag nur hinzufügen wenn nicht in Listview vorhanden


LordGinn - Mo 13.10.14 18:45
Titel: 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-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
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;


Danke schon mal. :)

Crosspost http://www.delphipraxis.net/182254-eintrag-nur-hinzufuegen-wenn-nicht-listview-vorhanden.html

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt


jaenicke - Mo 13.10.14 20:48

Hallo und :welcome:

Ich würde dir raten zusätzlich eine TStringList zu verwenden und darüber festzustellen, ob ein Eintrag schon vorhanden ist.

Sprich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TYourForm = class(TForm)
  //...
  private
    FAvailableEntries: TStringList;
  end;

// in OnCreate deines Formulars:
  FAvailableEntries := TStringList.Create;

// im OnDestroy deines Formulars:
  FAvailableEntries.Free;

Nun kannst du beim Hinzufügen einfach den Wert auch in deine Liste einfügen:

Delphi-Quelltext
1:
  FAvailableEntries.Add(...);                    

Und auch prüfen, ob ein Eintrag schon vorhanden ist:

Delphi-Quelltext
1:
2:
  if FAvailableEntries.IndexOf(...) < 0 then
    //noch nicht vorhanden

Das ist viel schneller, als in der TListView die Einträge zu durchsuchen, auch wenn das theoretisch auch geht. Da gibt es glaube ich auch ein Find oder IndexOf oder so.

// EDIT:
Korrigiert, danke für den Hinweis


ub60 - Mo 13.10.14 21:15

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
  if FAvailableEntries.IndexOf(...) <= 0 then
    //noch nicht vorhanden


Bei =0 ist der Eintrag vorhanden, und zwar an oberster Stelle. Besser so:


Delphi-Quelltext
1:
2:
  if FAvailableEntries.IndexOf(...) < 0 then 
    // bzw. ... = -1


ub60


LordGinn - Di 14.10.14 08:04

Danke euch.

Jetzt auf Anhieb hab ich es noch nicht verstanden mit der StringList. Wo muss man dann edit1.text bzw edit1.text und edit4.text reinpacken?


jaenicke - Di 14.10.14 13:28

In diese Liste, sprich bei Add und IndexOf musst du den Wert einsetzen, anhand dessen du feststellen willst, dass der Eintrag schon vorhanden ist.
Wo dieser eindeutige Wert drin steht, kannst nur du wissen, das muss ja nicht zwangsläufig die erste Spalte sein.

Ich vermute aber du möchtest Edit1 benutzen, also ...Add(Edit1.Text) und ...IndexOf(Edit1.Text).


LordGinn - Sa 18.10.14 08:03

Danke für die Antworten.

Es wird ne Weile dauern, bis ich das verstehe, aber ich hab die Zeit. ;)


LordGinn - So 19.10.14 10:54

Ich habe jetzt die Radiobuttons entfernt und dafür auf der Form1 mehrere Buttons erstellt, das hat einiges vereinfacht.
Jetzt hat jede Listview einen eigenen Button fürs Hinzufügen und die Überprüfung funktioniert.

Ich muss dann nur noch herausfinden, wie man folgendes schreibt:
Wenn edit1.text und edit4.text in der selben Zeile der Listview auftauchen ist vorhanden true.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm7.Button1Click(Sender: TObject);
var i: integer; vorhanden: boolean;
begin
   vorhanden:=false;
   for i := 0 to Form1.Listview2.Items.Count - 1 do
    if (form1.ListView2.Items[i].Caption=edit1.text) then vorhanden:=true;
    if vorhanden=true then showmessage('Eintrag ist bereits vorhanden');
    if vorhanden=false then
    begin with
    form1.listview2.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;
end;


LordGinn - Di 21.10.14 15:18

Ich habs geschafft. ^^


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm4.Button1Click(Sender: TObject);
var i: integer; vorhanden: boolean;
begin
   vorhanden:=false;
   for i := 0 to Form1.Listview7.Items.Count - 1 do
    if (form1.ListView7.Items[i].Caption=edit1.text)
    and (form1.ListView7.Items[i].subitems[2]=edit4.text)then vorhanden:=true;
    if vorhanden=true then showmessage('Eintrag ist bereits vorhanden');
    if vorhanden=false then
    begin with
    form1.listview7.items.add do begin
    caption:=edit1.text;
    subitems.add(edit2.text);
    subitems.add(edit3.text);
    subitems.add(edit4.text);
    subitems.add(edit5.text);
    showmessage('Eintrag wurde hinzugefügt');
    end;
    end;
end;