Einzelnen Beitrag anzeigen

muhael

Registriert seit: 5. Mär 2013
42 Beiträge
 
#1

Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?

  Alt 30. Aug 2013, 11:33
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(Listbox.sort:=true ). problem Liegt in dem Format der gespeicherten Daten und Zwar sehen die so aus:

[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 ini.readsections(Listbox1.items) und in der anderen dann die nachnamen ausgelesen und eingefügt werden
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:
 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;
sobalt die Personalnummer vergeben ist Bricht die schleife ab nachdem sie den wert check auf false gesetzt hat


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 dannrightstr(listbox1.items.strings[i],4) 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.

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
  Mit Zitat antworten Zitat