Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FindComponent für TStringList (https://www.delphipraxis.net/71577-findcomponent-fuer-tstringlist.html)

TonyR 17. Jun 2006 16:35


FindComponent für TStringList
 
Ich habe folgende Frage:
Gibt es eine ähnliche Funktion wie FindComponent, die ich z.B. für TStringList benutzen kann?

Folgendes kann ja nicht funktionieren, weil TStringList keine Komponente ist:

Delphi-Quellcode:
TStringList(FindComponent('XXX').add('Irgendetwas');
Also weiß jemand womit das FindComponent ersetzt werden kann?

Luckie 17. Jun 2006 16:40

Re: FindComponent für TStringList
 
Benutze ein Array vom Typ TStringList. Aber was willst du eigentlich erreichen?

3_of_8 17. Jun 2006 16:41

Re: FindComponent für TStringList
 
Gar nicht.

Du kannst die Dinger alle in nem Array verwalten oder die ne Implementierung einer Map schreiben, aber FindComponent funktioniert auch nur, weil du ja eigentlich innerhalb der Form Self.FindComponent aufrufst und eine Form alle ihre Komponenten "kennt".

Du könntest natürlich auch eine eigene Stringlist schreiben und von TComponent ableiten, aber das wäre eigentlich nicht sehr sinnvoll.

TonyR 17. Jun 2006 16:55

Re: FindComponent für TStringList
 
Ich programmiere einen Reimgenerator. Der zeigt zu jedem gesuchten Wort, Reime an.
Um Wörter schnell in die Datenbank zu schreiben und auszulesen habe ich bisher eine TStringList genommen, die beim Programmstart alle Wörter aufnimmt.
Um neue Wörter in die Datenbank aufzunehmen, kann ein beliebiger Text durchsucht werden. Aus diesem werden alle Wörter extrahiert und abgeglichen, ob sie schon in der Datenbank sind.
Da wollte ich (um die Effektivität zu erhöhen) die Wörter nach letzten Buchstaben in eigene TStringLists einzuordnen.

Delphi-Quellcode:
for i:=0 to TStringList(Findcomponent(NewWord[Length(NewWord)-1])).Count-1 do
   if NewWord=TStringList(Findcomponent(NewWord[Length(NewWord)-1])).Strings[i] then
      schonvorhanden:=true;

if schonvorhanden=false then
   TStringList(Findcomponent(NewWord[Length(NewWord)-1])).Add(NewWord);

schonvorhanden;=false;
Ich werde das mit dem Array mal probieren, Danke für den Hinweis!

3_of_8 17. Jun 2006 17:01

Re: FindComponent für TStringList
 
Na warum dann nicht einfach so: array[0..26] of TStringList?

Wenn du nen Buchstaben von A-Z hast (den letzten Buchstaben einfach mit UpperCase in einen Großbuchstaben umwandeln) dann machst du einfach Ord(Buchstabe)-65 und hast den Code. Das Element 26 verwendest du für alle sonstigen Buchstaben wie zum Beispiel Ä, Ö, Ü oder ß.

TonyR 17. Jun 2006 17:06

Re: FindComponent für TStringList
 
Das ist super, danke 3_of_8!

himitsu 17. Jun 2006 17:10

Re: FindComponent für TStringList
 
Wie breits gesagt, kann es sowas (eigentlich) nicht geben, da nirgends eine Liste der existierenden Stringlisten existiert ... wie es übrigens bei fast allen Variablen/Klassen ist.

Und wenn man die Forensuche mal bemühen würde, dann könnte man dieses in hunderten anderen threads ebenfalls nochmal nachlesen :warn:


Also mußt du dir selber soeine Liste erstellen.

OK, man könnte zwar durch den gesamten Prozessspeicher wandern und prüfen, ob irgendwo ein Speicherbereich existiert, welcher rein zufällig einen Wert enthält, welcher auf die/eine Typendefinition für 'ne TStringList zeigt.
Wie du am "rein zufälli" erkennen solltest, ist/kann diese Methode nicht 100% sicher sein.

3_of_8 17. Jun 2006 17:37

Re: FindComponent für TStringList
 
Achja nebenbei: Das mit dem Array bringt auch keinen Geschwindigkeitsvorteil, soweit ich weiß.

Gut, ich weiß nicht wie eine StringList intern implementiert ist.

Wenn es eine verkettete Liste ist, bringt das einen Vorteil (Zugriffszeit ist linear), wenn es ein Binärbaum ist ebenfalls (Zugriffszeit logarithmisch), aber wenn es ein array of String ist, dann nicht. (Zugriffszeit konstant).

Hawkeye219 17. Jun 2006 21:05

Re: FindComponent für TStringList
 
Zitat:

Zitat von TonyR
Da wollte ich (um die Effektivität zu erhöhen) die Wörter nach letzten Buchstaben in eigene TStringLists einzuordnen.

Einen spürbaren Zeitgewinn solltest du bereits erreichen, wenn du eine sortierte Stringliste verwendest. Da diese Duplikate standardmäßig ignoriert, kannst du die gefundenen Wörter einfach hinzufügen:

Delphi-Quellcode:
var
  L : TStringList;
begin
  L := TStringList.Create;
  L.Sorted := True;
    :
  L.Add ('Wort1');
  L.Add ('Wort2');
  L.Add ('Wort3');
    :
  L.Free;
end;
Der Zeitgewinn resultiert daraus, daß bei einer sortierten Liste eine binäre Suche statt einer sequentiellen Suche durchgeführt werden kann. Vielleicht kannst du dann sogar auf die Arrays verzichten.

Gruß Hawkeye

Elvis 17. Jun 2006 21:41

Re: FindComponent für TStringList
 
Azhaimars StringDictionary wäre da noch besser. Denn binary search ist immer noch Suchen. eine hashtable muss nur im ungünstigten Fall überhaupt suchen. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz