Autor |
Beitrag |
spoof
      
Beiträge: 48
|
Verfasst: Fr 18.10.13 13:50
Hey, ich habe ein Programm geschrieben, welches eine Txt Datei einliest. Die Txt kann man sich vorstellen wie zb eine Liste voll mit Kundendaten.
Diese Liste wird durch mein Programm nun in meine Tabelle eingeordnet.
Momentan hab ich aber noch das Problem dass einige Dinge doppelt und dreifach auftauchen in der Tabelle da sie auch doppelt und dreifach im Txt sind.
Jetzt möchte ich es schaffen dass wenn die Daten exakt so schon vorhanden sind, dass dann nichts hinzugefügt werden soll.
Ich hab das nun so gecodet dass ich in meiner Schleife, die zum zufügen zuständig ist, eine weitere Schleife mit eingebunden ist, die die bisher erstandene Liste erst nochmal durchgeht ob die Felder die zusammengehören identisch sind mit dem was gerade hinzugefügt werden soll.
Das einzigste Problem um das noch zum laufen zu bringen ist folgendes
Delphi-Quelltext 1:
| if (SG_List.Cells[0,counter+1]:=seite) = true |
Ich muss es irgendwie schaffen dass er fragt
wenn meine Zelle den selben Inhalt hat wie die Variable, dann...
Wie kann ich das machen? Dachte zuerst an Boolean hab aber noch nie damit gearbeitet und bin mir nich sicher ob und wie es damit geht?!
mfg
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Fr 18.10.13 13:54
Suchst Du das hier?
Delphi-Quelltext 1:
| if SG_List.Cells[0,counter+1] = seite then |
[edit] Wobei das konzeptionell schon schöner zu lösen wäre, aber sei es erst einmal drum. [/edit]
Für diesen Beitrag haben gedankt: spoof
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 18.10.13 13:57
Die Daten in ein StringGrid einzulesen, ist keine gute Idee, das ist nur unnötig langsam und kompliziert...
Lese die besser in eine Liste ein, prüfe dabei direkt beim Hinzufügen, ob ein Wert schon drin ist, und zeige die Liste dann nur in dem StringGrid an.
Visuelle Komponenten sind nur zur Anzeige und Eingabe da, nicht zur Datenhaltung...
|
|
spoof 
      
Beiträge: 48
|
Verfasst: Fr 18.10.13 14:08
WasWeißDennIch hat folgendes geschrieben : | Suchst Du das hier?
Delphi-Quelltext 1:
| if SG_List.Cells[0,counter+1] = seite then |
[edit] Wobei das konzeptionell schon schöner zu lösen wäre, aber sei es erst einmal drum. [/edit] |
Nein, ich weiß dass da noch ein then kommt, ich hab nur einen teil der if abfrage gepostet die sieht eig so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| for i2 := 0 to counter+1 do begin
zwischencounter:=0; if (SG_List.Cells[0,counter+1]:=seite) = true and (SG_List.Cells[1,counter+1]:=seite2) = true and (SG_List.Cells[2,counter+1]:=seite3) = true and (SG_List.Cells[3,counter+1]:=seite4) = true and (SG_List.Cells[4,counter+1]:=seite5) = true then begin zwischencounter:=zwischencounter+1; end;
end;
if zwischencounter = 0 then begin
SG_List.Cells[0,counter+1]:=seite; SG_List.Cells[1,counter+1]:=seite2; SG_List.Cells[2,counter+1]:=seite3; SG_List.Cells[3,counter+1]:=seite4; SG_List.Cells[4,counter+1]:=seite5;
counter:=counter+1; end; |
Ich bekomm in den Zeile wo ich abfrage:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (SG_List.Cells[0,counter+1]:=seite) = true and (SG_List.Cells[1,counter+1]:=seite2) = true and (SG_List.Cells[2,counter+1]:=seite3) = true and (SG_List.Cells[3,counter+1]:=seite4) = true and (SG_List.Cells[4,counter+1]:=seite5) = true then |
Die Fehlermeldung Operator ist auf diesem Operadentyp nicht anwendbar.
Ich denke ich kann nicht prüfen ob die zelle := variable (in der variable sowie in der zelle stehen die seiten also strings)
jaenicke hat folgendes geschrieben : | Die Daten in ein StringGrid einzulesen, ist keine gute Idee, das ist nur unnötig langsam und kompliziert...
Lese die besser in eine Liste ein, prüfe dabei direkt beim Hinzufügen, ob ein Wert schon drin ist, und zeige die Liste dann nur in dem StringGrid an.
Visuelle Komponenten sind nur zur Anzeige und Eingabe da, nicht zur Datenhaltung... |
Genauso passiert es ja, es wird in ein tstringgeladen der überprüft ob schon doppelt usw drin ist und dann nur die einzelnen in meine tabelle geladen.
Hab eine liste mit 1 Millionen Zeilen, geht innerhalb 1 sekunde keinerlei laggs.
|
|
spoof 
      
Beiträge: 48
|
Verfasst: Fr 18.10.13 14:31
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 18.10.13 14:33
spoof hat folgendes geschrieben : | Ich bekomm in den Zeile wo ich abfrage:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (SG_List.Cells[0,counter+1]:=seite) = true and (SG_List.Cells[1,counter+1]:=seite2) = true and (SG_List.Cells[2,counter+1]:=seite3) = true and (SG_List.Cells[3,counter+1]:=seite4) = true and (SG_List.Cells[4,counter+1]:=seite5) = true then | |
1. Eine Zuweisung erfolgt mit :=, ein Vergleich dagegen lediglich mit =
2. Ein Vergleich zweiter Variablen mit = ergibt bereits einen Booleanwert. Du mußt diesen Wert nicht nochmal auf true testen, sondern schreibst einfach:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (SG_List.Cells[0,counter+1] = seite) and (SG_List.Cells[1,counter+1] = seite2) and (SG_List.Cells[2,counter+1] = seite3) and (SG_List.Cells[3,counter+1] = seite4) and (SG_List.Cells[4,counter+1] = seite5) then |
Für diesen Beitrag haben gedankt: spoof
|
|
|