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 dann
rightstr(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