Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
In deiner Funktion musst du TStringGrid erzeugen (SG). Als Rückgabewert gibst du einen Teil von genau diesem SG zurück. Aber du darfst das Objekt SG in der Funktion nicht löschen, weil sonst auch der Rückgabewert verschwindet. Als Fazit bleibt, SG wird niemals freigegeben, niemals mehr benutzt und bleibt somit im Speicher bis das Programm beendet wird. Ohne die Funktion (was da überhaupt passieren soll) ist das schon mal grundverkehrt. In meinem Beispiel habe ich Dir gezeigt wie das vom Prinzip her geht. Erzeuge eine Instanz (TStringList) und übergebe der Funktion diese Instanz, auf das die Funktion dort die Ergebnisse reinschreiben kann. Somit hast du dort, wo du dann diese Daten weiterverarbeitest (zur Anzeige) auch die Kontrolle darüber, wann diese Instanz wieder aus dem Speicher entfernt werden kann (z.B. nach der Anzeige). Eine visuelle Komponente (TStringGrid) zum Berechnen zu benutzen ist schon vom Ansatz falsch, da diese Komponenten zum Anzeigen gut geeignet sind aber auch nur dafür. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
Deine Analyse ist völlig richtig. Mein Ziel ist es die ziemlich langsam ablaufende Prozedur (siehe Beitrag 21) möglichst zu beschleunigen. Wenn das nicht über die reine ButtonClick geht, dann vielleicht über eine Funktion (Trenne Daten von Oberfläche!). Gruß |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
Durch dieses Ereignis kann alles passieren (z.B. eine Berechnung und die Ausgabe der Berechnung). Allerdings sollte die Berechnung ohne visuelle Komponenten auskommen. Erst bei der Ausgabe (nach der Berechnung) kommen die visuellen Komponenten ins Spiel. Dies versuchen wir dir seit einigen Beiträgen schon zu vermitteln, aber du scheinst da etwas beratungsresistent zu sein :mrgreen: |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
@ Sir Rufo
Dein letzter Beitrag hat mich überzeugt. Zitat:
Delphi-Quellcode:
Ich begreife nicht wieso Du an die Funktion eine Stringliste übergibst
function VerabeiteDatenAusDatei( const FileName : string; const Ergebnis : TStringList ) : boolean;
Delphi-Quellcode:
und diese als Ergebnis noch vorhanden ist, wenn doch der einzigste Rückgabewert der Funktion vom Typ boolean ist?
if VerabeiteDatenAusDatei( Edit1.Text, MeinErgebnis ) then
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
@ Sir Rufo
Dein letzter Beitrag hat mich überzeugt. Zitat:
Delphi-Quellcode:
Ich begreife nicht wieso Du an die Funktion eine Stringliste übergibst
function VerabeiteDatenAusDatei( const FileName : string; const Ergebnis : TStringList ) : boolean;
Delphi-Quellcode:
und diese als Ergebnis noch vorhanden ist, wenn doch der einzigste Rückgabewert der Funktion vom Typ boolean ist
if VerabeiteDatenAusDatei( Edit1.Text, MeinErgebnis ) then
nicht beratungsresistent eher Anfänger, sowas gibt es auch. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Ich übergebe der Funktion eine Instanz einer TStringList - jepp
In diese TStringList legt die Funktion das Ergebnis ab. Der Rückgabewert true oder false ist nur dafür da, ob die Funktion z.B. korrekt durchgelaufen ist.
Delphi-Quellcode:
function GibMirWerteInDieListe( const Liste : TStringList ) : boolean;
begin Liste.Add( 'Dies wurde in der Funktion hinzugefügt!' ); Result := True; end;
Delphi-Quellcode:
Wenn du das ausführst, dann bekommst du eine Meldung mit 'Dies wurde in der Funktion hinzugefügt!'.
procedure IchRufeDieFunktionAuf;
var EineListe : TStringList; begin EineListe := TStringList.Create; try if GibMirWerteInDieListe( EineListe ) then ShowMessage( EineListe.Text ); finally EineListe.Free; end; end; Ich hoffe es wird jetzt klarer. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Ok, nach der Neuinstallation meines Rechners hab ich eine Lösung:
Delphi-Quellcode:
Das Ergebnis dieser Funktion ist zB.
function VerabeiteDatenAusDatei( const FileName : string; const Ergebnis : TStringList ) : boolean;
var sL : TStringList; i,Zahl: integer; begin // Erstmal ist das Ergebnis noch nicht in Ordnung Result := False; if FileExists( FileName ) then begin sL := TStringList.Create; try sL.LoadFromFile( FileName ); // Jetzt machen wir was ganz Tolles mit den Daten und schreiben das in die TStringList Ergebnis // sL.Text:= StringReplace(sL.Text,'ß','SSSSSSS', [rfReplaceAll]); // sL.Sort; // sL.Text:= StringReplace(sL.Text,'SSSSSSS','ß',[rfReplaceAll]); // sL.SaveToFile('sortiert.txt'); Zahl := 1; for i:=0 to sL.count-1 do begin if i>0 then begin if sl.Strings[i]<>sL.Strings[i-1] then begin Zahl := 1; end; if sL.strings[i]=sL.Strings[i-1] then begin Zahl := Zahl+1; end; end; Ergebnis.Add(sl.Strings[i]+#9+IntToStr(Zahl)) ; end; // Ergebnis.Add( sl[ 0 ] ); // Ist alles korrekt durchlaufen und sind die Ergebnisse so korrekt dann Result := True; finally sL.Free; end; end; end; NameA ---> 1 NameA ---> 2 NameA ---> 3 NameB ---> 1 NameB ---> 2 usw. Ziel der Funktion NameA ---> 3 NameB ---> 2 usw. Irgendwie muß ich bei dem Vergleich if sl[i] = sl[i-1] etwas einfügen welches mehrere i einliest und zählt. Anschließend den maximalen Zahlenwert ausgibt der dann mit einem sl[i] in die Ergebnisstringliste geschrieben wird. Ich habe auch andere Funktionen und Prozeduren aus DP versucht, aber keine wirklich schnellen gefunden. Ich hoffe auf Eure weitere Unterstützung. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Schade das hier niemand weiterhelfen kann!
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Was soll die Funktion denn machen? Die einzelnen Strings zählen?
Dann mach das doch:
Code:
Als Zähler verwendest Du eine TStringlist. Jedem String in der Stringlist kann ein 'Object' zugeordnet werden. Man kann nun dieses Object einfach als Zähler verwenden:
Für jede Zeile S in der StringListe:
Inc (Zähler [S]);
Delphi-Quellcode:
Wenn Du fertig mit Zählen bist, geh die Zaehlerliste durch und erzeuge deine Ergebnisliste.
i := ZaehlerListe.IndexOf(ZuZaehlenderString); // Finde Eintrag in der Zaehlerliste
If i=-1 then // Es existiert noch kein Eintrag, ZaehlerListe.AddObject(ZuZaehlenderString, TObject(1)) // erstelle also einen mit dem Wert 1 else begin n := Integer (ZaehlerListe.Objects[i]); // Ansonsten schnapp dir den Zähler und ZaehlerListe.Objects[i] := TObject(n+1); // erhöhe ihn um 1. end; [edit]Schusseligkeitsfehler korrigiert, die Hawkeye219 entdeckt hat. [/edit] |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Hey alzaimar,
"IndexOf" und "0" => "-1", sonst passen die Kommentare nicht zu den Anweisungen ;-) Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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