AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

Eintrag nur hinzufügen wenn nicht in Listview vorhanden

Ein Thema von LordGinn · begonnen am 13. Okt 2014 · letzter Beitrag vom 21. Okt 2014
Antwort Antwort
Seite 1 von 3  1 23      
LordGinn

Registriert seit: 13. Okt 2014
16 Beiträge
 
FreePascal / Lazarus
 
#1

Eintrag nur hinzufügen wenn nicht in Listview vorhanden

  Alt 13. Okt 2014, 19:03
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.

Geändert von TBx (13. Okt 2014 um 19:26 Uhr) Grund: Quote-Tags durch Delphi-Tags ersetzt, ist so besser lesbar ;-)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 14. Okt 2014, 07:12
Crosspost
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
LordGinn

Registriert seit: 13. Okt 2014
16 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 14. Okt 2014, 08:02
@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.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

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

  Alt 14. Okt 2014, 08: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 08:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 14. Okt 2014, 08:07
@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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#6

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

  Alt 14. Okt 2014, 08:19
@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 ?
  Mit Zitat antworten Zitat
LordGinn

Registriert seit: 13. Okt 2014
16 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 14. Okt 2014, 13:31
Da habt ihr Recht!

Ich seh mir den Code morgen an.
  Mit Zitat antworten Zitat
LordGinn

Registriert seit: 13. Okt 2014
16 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 15. Okt 2014, 17:35
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 (form1.ListView1.Items[i].Caption=edit1.text) gibt er mir einen sigsegv Fehler wenn das Programm läuft und die Procedure gefordert ist.
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#9

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

  Alt 15. Okt 2014, 18:41
Warum zählst du denn hier bis 50?

for i := 0 to Form1.Listview1.Items.Count - 1 do

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.

if Form2.RadioButton1.Checked für True.

if not Form2.RadioButton1.Checked für False.

So ist es besser.
Gruß
Cookie

Geändert von cookie22 (15. Okt 2014 um 18:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 15. Okt 2014, 18:52
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 FügeHinzu(Text1, Text2, Text3, Text4: string) -Methode
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
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