AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Ini Datei nach schlüsseln sortiert und in Stringgrid eintragen dauert zu lange?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von muhael · begonnen am 30. Aug 2013 · letzter Beitrag vom 30. Aug 2013
Antwort Antwort
Seite 1 von 2  1 2      
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, 12: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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 30. Aug 2013, 12:53
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.
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
muhael

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

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

  Alt 30. Aug 2013, 13:03
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 30. Aug 2013, 13:09
Dann merk Dir doch einfach die Personalnummer mit (z.B. in der Objects-Eigenschaft von TStrings). Damit ist der Datensatz dann eindeutig identifiziert.
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
Blup
Online

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 30. Aug 2013, 13:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 30. Aug 2013, 13:27
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.
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
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#7

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

  Alt 30. Aug 2013, 13:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 30. Aug 2013, 13:40
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 30. Aug 2013, 14:05
*Pfh*, das ist doch was für Warmduscher, ein bisschen muss es schon noch weh tun
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
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 30. Aug 2013, 14:21
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.
Schätze mal daß das Lesen aus der Inidatei bei zehntausend Personen 30 sec. dauert, das Schreiben vermutlich 60 sec.

Da wäre dann eine typisierte Datei oder besser ein Filestream wesentlich schneller.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:52 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