![]() |
Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Ich habe ein Programm entwickelt was es einem Unternehmen o.ä. erlaubt Clienten zu Speichern und Punkte zu bestimmten Zwecken zu verteilen.
nun dies klappt wunderbar und die Clienten werden auch sorgfältig in einer Ini Datei mit der endung .csd gespeichert(muss ja keiner wissen das es ne ini Datei ist ;)). Nun soll man auch Tabellen erstellen können die von anfang an nach Namen sortiert sind. Das Sortieren der Namen ist ja nicht schwer(
Delphi-Quellcode:
). problem Liegt in dem Format der gespeicherten Daten und Zwar sehen die so aus:
Listbox.sort:=true
[9018] Name=Hans NachName=Mustermann Kostenstelle=510 Punkte=10 wie man sieht wird nach einer Zahl gespeichert die Personalnummer diese ist das einzige was einzigartig da ist um das Speichern so komfortabel wie möglich zu machen. Problem beim Sortieren ist das das ich 2 Listboxen habe in einer werden die Personalnummern eingelesen
Delphi-Quellcode:
und in der anderen dann die nachnamen ausgelesen und eingefügt werden
ini.readsections(Listbox1.items)
Delphi-Quellcode:
for i:=0 to Ftab.ListBox1.Items.Count -1 do
begin d:= Ftab.ListBox1.Items.strings[i]; ftab.listbox2.items.add(ini.ReadString(d,'Nachname','')); end; Nun zum schwerwiegenden Problem: Beim einfügen in das Stringgrid muss ich über die Listbox mit den Nachnamen gehen problem ist er sucht den Nachnamen raus und durchsucht über die Listbox mit den Personalnummern die iniDatei. Dabei trägt er wenn der Nachname mehrfach vorhanden ist diesen auch mehrfach ein und sobalt er fertig ist nimmt er name nummer 2 und wenn der der selbe ist wiederholt sich die ganze procedur also hat man z.B anstatt Max Mustermann und Hans Mustermann, dann dementsprechend 2x max Mustermann und 2x Hans Mustermann. des Problems Lösung so dachte ich mir ist eine Schleife die das Stringgrid vor dem eintragen der Daten durchsucht ob diese Personalnummer schonmal vergeben worden ist.
Delphi-Quellcode:
procedure TFtab.Button2Click(Sender: TObject);
var i,c:integer; ini:Tinifile; i2,i3:integer; filename,a,b:string; z,t,cl:real; check:boolean; begin z:=0; T:=0; cl:=0; check:=false; filename:=ExtractFilePath(Application.ExeName)+'Clients.csd'; ini := TIniFile.Create(filename); c:=1; for i2:=0 to listbox2.Items.Count-1 do begin a:=listbox2.Items.Strings[i2]; for i:=0 to Listbox1.Items.Count -1 do begin b:=listbox1.Items.Strings[i]; edit1.Text:=ini.ReadString(b,'Nachname',''); edit2.Text:=a; if edit1.Text= edit2.Text then begin for i3:=0 to stringgrid1.RowCount-1 do begin if (b=stringgrid1.Cells[5,i3]) then begin check:=false; break; end else check:=true; end; end; fstart.SBtime.Panels[0].Text:= timetostr(now)+' Uhr'; Fstart.update; if check=true then begin stringgrid1.Cells[1,c]:= ini.ReadString(b,'Nachname',''); stringgrid1.Cells[2,c]:= ini.ReadString(b,'Name',''); stringgrid1.Cells[3,c]:= ini.ReadString(b,'Kostenstelle',''); stringgrid1.Cells[4,c]:= ini.ReadString(b,'Punkte',''); stringgrid1.Cells[5,c]:=b; c:=c+1; cl:=cl+1; stringgrid1.RowCount:= stringgrid1.RowCount+1; check:=false; z:=z+p; t:= Round(z); Fstart.label4.Caption:= 'Erstelle Tabelle...'+ #13 + floattostr(t)+'% Abgeschlossen'; end; end end; end; Die schleife zum Durchsuchen des stringgrids ist:
Delphi-Quellcode:
sobalt die Personalnummer vergeben ist Bricht die schleife ab nachdem sie den wert check auf false gesetzt hat
for i3:=0 to stringgrid1.RowCount-1 do
begin if (b=stringgrid1.Cells[5,i3]) then begin check:=false; break; end else check:=true; end; end; Problem an dieser Lösung ist sie benötigt SEHR viel Zeit und bei durchschnittlich 400-1000 Clients in der Datei die ausgelesen werden müssen dauert das schon ziemlich lange... Frage ist halt wie würde das schneller gehen? Meine Überlegung ist das man nur eine Listbox verwendet wo der name und die Personalnummer so drinn steht: Mustermann | 9012 und man dann
Delphi-Quellcode:
die Zahl ausliest und dann hat man ja nur eine genau definierten Listboxstring für den Namen und man muss nicht extra immer das Stringgrid durchsuchen.
rightstr(listbox1.items.strings[i],4)
ich hab es noch nicht getestet werde ich aber sobalt ich zuhause bin tun. PS: ich Arbeite mit Delphi7(schulversion) und Delphi7 Enterprise. PSS: Bei einem Testlauf mit 400 CLients hat das ganze 67 Sekunden gedauert. LG Muhael |
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Du programmierst m.M.n. zu sehr an der Oberfläche. Wie wäre es denn, wenn Du Dir eine Klasse deklarierst und deren Eigenschaften dann aus der Ini ausliest und zuweist? Das Ganze in eine TObjectList gepackt, und Du hast die komplette Datei im Speicher, wobei zusammengehörige Daten dann auch zusammen sind. Diese Liste kannst Du dann auch beliebig sortieren und darstellen (in einem StringGrid, einer ListView oder sonstwo). Zum eigentlichen Problem: wahrscheinlich dürfte das ständige Neuzeichnen der Flaschenhals sein. Die Anzahl der Zeilen ist zumindest bei der Listenlösung bekannt und muss dann nur einmal gesetzt werden. Rows und Cols von TStringGrid sind vom Typ TStrings, welcher wiederum über die Methoden BeginUpdate und EndUpdate verfügt. Der Einsatz dieser beiden könnte das Ganze schon enorm beschleunigen.
|
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Danke für die schnelle Antwort.
Ja aber wenn man halt 2x nen Mustermann drin hat und den in der Tobjectlist Sucht findet er Beide und zeigt somit diesen auch an oder sehe ich das Falsch? da: [9000] Name=Max NachName=Mustermann Kostenstelle=210 Punkte=10 und [9001] Name=Hans NachName=Mustermann Kostenstelle=510 Punkte=50 die beiden haben denselben Nachnamen nun suche ich nach dem Nachnamen und er findet ja Beide da die nachnamen gleich sind... das andere werde ich zu herzen nehmen und auch zuhause ausprobieren ielen dank erstmal LG |
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Dann merk Dir doch einfach die Personalnummer mit (z.B. in der Objects-Eigenschaft von TStrings). Damit ist der Datensatz dann eindeutig identifiziert.
|
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Ich versteh nicht wo eigentlich das Problem mit doppelten Namen ist?
Delphi-Quellcode:
TMyPerson = class(TObject)
Nr: Integer; Name: string; NachName: string; Kostenstelle: string; Punkte: Integer; end; function ComparePersonByNachName(AItem1, AItem2: Pointer); begin Result := AnsiCompareText(TMyPerson(AItem1).Name, TMyPerson(AItem2).Name); end; function ComparePersonByNr(AItem1, AItem2: Pointer); begin Result := TMyPerson(AItem1).Nr - TMyPerson(AItem2).Nr; end; function ComparePerson(AItem1, AItem2: Pointer); begin Result := ComparePersonByNachName(AItem1, AItemn2); if Result <> 0 then Exit; Result := ComparePersonByNr(AItem1, AItemn2); end; FMyPersonList: TObjectList; {...} PersonenEinlesen; FMyPersonList.Sort(ComparePerson); PersonenAusgeben; |
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Das Problem besteht, wenn man lediglich die Namen in einer ListBox o.ä. vorhält, dann weiß man bei Click auf einen mehrfach vorhandenen nicht, welcher gemeint ist. Daher würde ich wie schon angedeutet zumindest die Personalnummer, aber besser noch das ganze Personenobjekt in TStrings.Items.Objects ablegen.
|
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Wenn Du entsprechend dem Vorschlag von DeddyH eine Liste von Personen-Objekten im Speicher aufbaust (so dass darin der Inhalt der gesamten Inidatei enthalten ist), kannst Du unmittelbar in dieser Liste suchen.
Das dauert maximal ein paar Millisekunden, selbst wenn es zehntausend Personen sein sollten. Selbst das einmalige komplette Einlesen der Inidatei sollte in relativ kurzer Zeit zu machen sein. Aus allen Objekten, die die Bedingung (Nachname stimmt überein) erfüllen, füllst Du die Zeilen der Listbox - bzw. tust damit, was Du sonst tun willst. Gruß, Mikkey |
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Liege ich da jetzt so falsch oder warum war mir nach drei Sätzen klar, daß man sowas viel einfacher mit TClientDataSet und TDbGrid implementiert (wenn man denn nicht auf eine richtige Datenbank gehen will)? Selbst wenn ich gleichzeitig mehrere unterschiedlich sortierte Listen darstellen will, lässt sich das damit relativ unproblematisch lösen.
|
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
*Pfh*, das ist doch was für Warmduscher, ein bisschen muss es schon noch weh tun :twisted:
|
AW: Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Zitat:
Da wäre dann eine typisierte Datei oder besser ein Filestream wesentlich schneller. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 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-2025 by Thomas Breitkreuz