Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist, THashedStringlist gibts nichts schnelleres?? (https://www.delphipraxis.net/149517-tstringlist-thashedstringlist-gibts-nichts-schnelleres.html)

Sir Rufo 26. Mär 2010 17:17

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Franzelchen
Zitat:

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.
Delphi-Quellcode:
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.

Franzelchen 26. Mär 2010 19:58

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

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ß

Sir Rufo 26. Mär 2010 20:03

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

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 :mrgreen:

Franzelchen 26. Mär 2010 20:23

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
@ Sir Rufo

Dein letzter Beitrag hat mich überzeugt.
Zitat:

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.

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

Delphi-Quellcode:
      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?

Franzelchen 26. Mär 2010 20:27

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
@ Sir Rufo

Dein letzter Beitrag hat mich überzeugt.
Zitat:

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.

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

Delphi-Quellcode:
      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.

Sir Rufo 26. Mär 2010 20:37

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:
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.

Franzelchen 10. Apr 2010 13:46

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
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.

Franzelchen 11. Apr 2010 13:09

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Schade das hier niemand weiterhelfen kann!

alzaimar 11. Apr 2010 16:23

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
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]

Hawkeye219 11. Apr 2010 18:23

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.
Seite 4 von 5   « Erste     234 5      

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