TStringList Array an Methode übergeben?
-
Hello Again,
Hab mal einen Allgemeine Frage:
Ich hab eine TStringList-Array (hier: SuchListe) , das wollte ich an einen Funktion "Suchen" übergeben,
damit diese darauf zugreifen kann, und die gefunden Treffer, in die SuchListe eintragen kann.Sobald er aus der Funktion zurückkommt, möchte ich gerne mit der SuchListe und den gefunden Einträgen arbeiten.
Mom. sieht das ungefähr so aus:
TStringList* SuchListe[4]; for(int i3=0; i3<4; i3++) SuchListe[i3] = new TTntStringList(); Suchen(SuchListe,"Bla"); // Werte aus SuchListe anzeigen oder so.. :DNach langen probieren habe ich herausgefunden, wie ich das TStringList-Array an die Funktion übergeben muss:
void Suchen(TStringList **templist){ //Suchen }Meine Frage: Ist das korrekt so, und wenn ja warum zwei Sterne in der Parameterliste?
Ahoy Netzcowboy
-
Hallo
ganz einfach, weil du ein Array von TStringList hast. C-Arrays sind auch nur Listen von aufeinanderfolgenden Speicheradressen, die mit einem Pointer dargestellt werden können. du kannst also auch schreiben
void Suchen(TStringList *templist[], int Count){ // Count = Anzahl Elemente im Array }Allerdings würde ich dir lieber zu einem höherwertigem Container raten, wie std::vector oder DynamicArray. Die sind wesentlich besser zu handhaben. Und du kannst die ganz einfach per referenz übergeben.
bis bald
akari
-
Danke akari!
Ich less mir mal ein bisschen dazu durch.
Was würdest du persönlich empfehlen?
Mom. speichere ich WideStrings in der StringList, geht das mit std::vector bzw. DynamicArray auch?Ahoy
-
Hallo
sicher geht das mit vector und DynamicArray auf. Da beides Templates sind, kannst du (fast) jeden Typ damit verwenden.
Ich dachte aber eigentlich den Container als Ersatz für das C-Array, mit TStringList als Typ.Das kommt aber darauf an, ob du wirklich eine zweifach verschachtelte Verwaltung brauchst.
bis bald
akari
-
So mit dem Dynamischen Array funktioniert eigentlich ganz gut.
Falls jemand noch einen guten Tipp hat, wo man mehr darüber lesen kann, als in der BCB Hilfe... her damit

Weil ich mich gerade frage, wie lösch ich mein DynamicArray wieder aus dem Speicher?
Folgender Quellcode:
DynamicArray<TTntStringList*> SuchListe; SuchListe.set_length(4); for(int i3=0; i3<SuchListe.Length; i3++) SuchListe[i3] = new TTntStringList(); // usw... delete SuchListe;geht leider nicht ...
Ahoy Netzcowboy
-
Hallo
das DynamicArray selber must du nicht löschen.
du must aber die in dem Array angelegten Instanzen selber löschen.bis bald
akari
-
[cpp] typedef DynamicArray<TStringList*> SL; DynamicArray<SL> aSL; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SL Test; Test.Length = 2; for (int i = 0;i<2;i++) { Test[i] = new TStringList; for (int j=0;j<10;j++) Test[i]->Add(IntToStr(i)+"->"+IntToStr(j)); } aSL.Length=2; aSL[0] = Test; aSL[1] = Test; Memo1->Text = aSL[0][0]->Text; Memo1->Text = Memo1->Text+aSL[1][1]->Text; } [/cpp]
-
Hi,
mir persönlich gefällt folgende Zeile nicht:
//SuchListe.set_length(4); SuchListe.Length=4; //würde ich so machen.Mal abgesehen davon würde ich es so machen:::
unit1.hprivate: typdef struct{ TStringList *hallo; } LIST; DaynamicArray<LIST> SuchListe; void machwas(DynamicArray<LIST> &liste); void loscheList(DynamicArray<LIST &liste);//muss auf jedenfall auch in TForm1::Dystroy(...) aufgerufen werdenunit1.cpp
void _fastcall TForm1::Button1Click(TObjekt *Sender) { //Instanzieren SuchListe.Length=4; for(int i=0; i<SuchListe.Length; i++) {SuchListe[i].hallo=new TStringList(); } machwas(SuchListe); loscheList(SuchListe); } //------------------------------------- void TForm1::machwas(DynamicArray<LIST> &liste) {for(int i=0; i<liste.Length; i++) liste[i].hallo->Add("dlonra = arnold"); } //------------------------------------- void TForm1::loscheList(DynamicArray<LIST> &liste) { //löschen, kommplett aus dem Speicher for(int i=0; i<liste.Length; i++) {liste[i].hallo->Clear(); //sicher ist sicher :-) delete liste[i].hallo; } liste.Length=0; //der SuchListezeiger existiert noch zeigt aber auf Null, also Anfangszustand } //-------------------------------------das Beispiel arbeitet mit einem eindimensionallen Array !!!!!!!!
Möchtest du ein 2 dimensionales Array...
DynamicArray< DynamicArray <LIST>> SuchListe; //die for-Schleifen sehen dann so aus: for(int y=0; y<SuchListe.Length; y++) {for(int x=0; y<SuchList[y].Length; x++) {SuchList[y][x].hallo->Add("dlonra = arnold"); } } //Der Funktionsrumpf sieht dann so aus //void machwas(DynamicArray < DynamicArray <LIST>> &liste)Grüsse