Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Eintrag nur hinzufügen wenn nicht in Listview vorhanden (https://www.delphipraxis.net/182254-eintrag-nur-hinzufuegen-wenn-nicht-listview-vorhanden.html)

LordGinn 13. Okt 2014 19:03

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:
   
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. :)

DeddyH 14. Okt 2014 07:12

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

LordGinn 14. Okt 2014 08:02

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.

jensw_2000 14. Okt 2014 08:05

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:

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 ...
Delphi-Quellcode:
  if assigned(fEindeutigeEintraege) then fEindeutigeEintraege.free;

DeddyH 14. Okt 2014 08:07

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

Zitat von LordGinn (Beitrag 1275807)
@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.

Gegen Crossposts an sich spricht erst einmal nichts. Allerdings sollte man die Threads dann untereinander verlinken, damit die Hilfewilligen sich ein Bild vom aktuellen Stand machen können. Es ist immer ärgerlich, wenn man sich den Kopf für ein Problem zerbricht, das in einem anderen Forum längst gelöst wurde.

jensw_2000 14. Okt 2014 08:19

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

Zitat von LordGinn (Beitrag 1275807)
@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.

Man sollte schon darauf mit den entsprechenden Links darauf hinweisen, dass man die Frage in mehreren Foren gestellt hat.
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:

LordGinn 14. Okt 2014 13:31

AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden
 
Da habt ihr Recht!

Ich seh mir den Code morgen an.

LordGinn 15. Okt 2014 17:35

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:
  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;
Bei
Delphi-Quellcode:
(form1.ListView1.Items[i].Caption=edit1.text)
gibt er mir einen sigsegv Fehler wenn das Programm läuft und die Procedure gefordert ist.

cookie22 15. Okt 2014 18:41

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:

Zitat von LordGinn (Beitrag 1276071)
Ich habe jetzt folgenden Code geschrieben, da ich eure nicht verstehe und es eine einfache Lösung geben muss.

Delphi-Quellcode:
...
    if form2.RadioButton1.checked=true
...

Du sollest nicht auf True oder False testen. Das kann zu Problemen führen.

Delphi-Quellcode:
if Form2.RadioButton1.Checked
für True.

Delphi-Quellcode:
if not Form2.RadioButton1.Checked
für False.

So ist es besser.

himitsu 15. Okt 2014 18:52

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:
FügeHinzu(Text1, Text2, Text3, Text4: string)
-Methode


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz