AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TStringlist, THashedStringlist gibts nichts schnelleres??
Thema durchsuchen
Ansicht
Themen-Optionen

TStringlist, THashedStringlist gibts nichts schnelleres??

Ein Thema von Franzelchen · begonnen am 23. Mär 2010 · letzter Beitrag vom 13. Apr 2010
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#31

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 18:17
Zitat von Franzelchen:
Zitat von Sir Rufo:
Ich weiß ja nicht was du damit erreichen willst ... ist irgendwie ohne hand und fuß

Der Zugriffsfehler kommt daher, dass du die Variable SG nicht instanziert hast.
SG := TStringGrid.Create( nil ); Aber wie gesagt, das ist mehr als komisch, was du da machst.
Wieso ist das komisch? Die Prozedur erzeugt eine Stringliste. Die Stringliste wird an die Funktion übergeben und danach gelöscht. Die Funktion, ja die hat im Moment keinen Rückgabewert ,
Delphi-Quellcode:
  SL.SaveToFile( 'sortiert.txt' );

Rückgabewert := Testfunktion(SL) ;

  SL.Free;
weil ich Schwierigkeiten mit der Zuweisung habe. Stringgrid.cells hat String, Stringgrid.Rows dagegen TString.
Ich muß leider sagen, dies ist meine allererste Funktion und soweit wie ich weiß soll eine Funktion wiederverwendbar sein.
Aber mit deiner Vorgehensweise baust du dir gerade eine riesige Datenmüllhalde.
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#32

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 20:58
Zitat von p80286:
Hallo Franzelchen,

wie wär es denn wenn Du uns zunächst mal sagst was Du eigentlich erreichen willst?
Für mich sieht das so aus, als würdest Du irgendeine Textdatei einlesen, sortieren und in einem Stringgrid ausgeben. (Das savetofile ignorier ich jetzt)
Dann markierst Du doppelte Datensätze im Stringgrid mit Zahlen >1 .

Ist das soweit richtig, ist es auch das was Du erreichen willst?

Edith:
(Das mit Funktionen und Prozeduren lassen wir zunächst auch einmal)

Gruß
K-H
Hallo K-H,
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#33

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 21:03
Zitat von Franzelchen:
Wenn das nicht über die reine ButtonClick geht, dann vielleicht über eine Funktion (Trenne Daten von Oberfläche!).
Gruß
ButtonClick ist doch nur ein Event (ein Ereignis) wo dann etwas passieren soll, sonst nix.

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#34

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 21:23
@ Sir Rufo

Dein letzter Beitrag hat mich überzeugt.
Zitat von Sir Rufo:
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.
Die Fragezeichen zeigen vermutlich worin ich jetzt schon meine Probleme sehe.

function VerabeiteDatenAusDatei( const FileName : string; const Ergebnis : TStringList ) : boolean; Ich begreife nicht wieso Du an die Funktion eine Stringliste übergibst

      if VerabeiteDatenAusDatei( Edit1.Text, MeinErgebnis ) then und diese als Ergebnis noch vorhanden ist, wenn doch der einzigste Rückgabewert der Funktion vom Typ boolean ist?
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#35

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 21:27
@ Sir Rufo

Dein letzter Beitrag hat mich überzeugt.
Zitat von Sir Rufo:
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.
Die Fragezeichen zeigen vermutlich worin ich jetzt schon meine Probleme sehe.

function VerabeiteDatenAusDatei( const FileName : string; const Ergebnis : TStringList ) : boolean; Ich begreife nicht wieso Du an die Funktion eine Stringliste übergibst

      if VerabeiteDatenAusDatei( Edit1.Text, MeinErgebnis ) then und diese als Ergebnis noch vorhanden ist, wenn doch der einzigste Rückgabewert der Funktion vom Typ boolean ist

nicht beratungsresistent eher Anfänger, sowas gibt es auch.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#36

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 26. Mär 2010, 21:37
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:
procedure IchRufeDieFunktionAuf;
var
  EineListe : TStringList;
begin
  EineListe := TStringList.Create;
  try
    
    if GibMirWerteInDieListe( EineListe ) then
      ShowMessage( EineListe.Text );
  
  finally
    EineListe.Free;
  end;
end;
Wenn du das ausführst, dann bekommst du eine Meldung mit 'Dies wurde in der Funktion hinzugefügt!'.

Ich hoffe es wird jetzt klarer.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#37

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 10. Apr 2010, 14:46
Ok, nach der Neuinstallation meines Rechners hab ich eine Lösung:
Delphi-Quellcode:
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;
Das Ergebnis dieser Funktion ist zB.

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

Registriert seit: 22. Mär 2007
82 Beiträge
 
#38

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 11. Apr 2010, 14:09
Schade das hier niemand weiterhelfen kann!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#39

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 11. Apr 2010, 17:23
Was soll die Funktion denn machen? Die einzelnen Strings zählen?
Dann mach das doch:
Code:
Für jede Zeile S in der StringListe:
  Inc (Zähler [S]);
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:

Delphi-Quellcode:
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;
Wenn Du fertig mit Zählen bist, geh die Zaehlerliste durch und erzeuge deine Ergebnisliste.

[edit]Schusseligkeitsfehler korrigiert, die Hawkeye219 entdeckt hat. [/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#40

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 11. Apr 2010, 19:23
Hey alzaimar,

"IndexOf" und "0" => "-1", sonst passen die Kommentare nicht zu den Anweisungen

Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 15:23 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