![]() |
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:
Also weiß jemand womit das FindComponent ersetzt werden kann?
TStringList(FindComponent('XXX').add('Irgendetwas');
|
Re: FindComponent für TStringList
Benutze ein Array vom Typ TStringList. Aber was willst du eigentlich erreichen?
|
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. |
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:
Ich werde das mit dem Array mal probieren, Danke für den Hinweis!
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; |
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 ß. |
Re: FindComponent für TStringList
Das ist super, danke 3_of_8!
|
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. |
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). |
Re: FindComponent für TStringList
Zitat:
Delphi-Quellcode:
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.
var
L : TStringList; begin L := TStringList.Create; L.Sorted := True; : L.Add ('Wort1'); L.Add ('Wort2'); L.Add ('Wort3'); : L.Free; end; Gruß Hawkeye |
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. |
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