Struct als Object in TStringList
-
Hallo,
oder mach aus der struct eine class und leite diese von TObject ab. Ein reinterpret_cast ginge auch nur bei einem Pointer auf diese struct.
-
Danke schon mal für sie Vorschläge...
Werde das morgen gleich als erstes ausprobieren.Zippo
-
und wie caste ich das genau?
weil genau da hänge ich jetzt auch
-
So etwa
TMyClass *myclass; // jetzt instanziieren, füllen etc. list->AddObject("MyObject", static_cast<TObject*>(myclass));Rückwärts dort etwa genauso. Zur Sicherheit könnte man dort dynamic_cast statt static_cast verwenden (natürlich mit Nullpointerprüfung).
-
und wenn ich dens tring dann irgendwann wieder ausgeben will.
zum beispiel füge ich den ansistring immer hinzu als object und dann will ich den irgendwann ausgeben.......dat nteressiert mich jetzt, weil ich brauche sowas

-
Du fügst einen Pointer auf einen AnsiString als Object ein, also keine von TObject abgeleitete Klasse? Da mußt du natürlich reinterpret-cast machen.
Ich persönlich finde aber den Umweg über eine von TObject abgeleitete Klasse besser. Noch besser finde ich aber, wenn man TStringlist für sowas erst garnicht vergewaltigt, sondern hier einen vector auf eine struct oder Klasse verwendet. Vielleicht auch einen map, wenn der Zugriffsindex ein String seien soll.
-
Wäre nicht TList oder TListObjekt eine Alternative?
-
Wieso willst Du einen AnsiString überhaupt als Objekt in die StringList einfügen?? Dafür brauchst Du doch nur Add() zu verwenden.
-
@Christian211
Die VCL-Listenklassen haben den Nachteil (meine Meinung), dass man hier grundsätzlich nur Pointer einspeichern kann. So muß man immer casten und die Speicherverwaltung genau im Auge behalten. Bei Einsatz von STL-Containern und (kleineren) Klassen oder Objekten entfällt das. Zudem kann man die vielen schönen Sachen aus <algorithm> darauf anwenden.
-
weil ich 2 strings brauche die zum schluss einen ergeben und ich anch einem auch sorteiren muss

sprich - wenn gewünschte logfiles auf zeiten analysiert werde.
ich muss sagen aus welchem logfile das stammt und sorteiert ausgeben
bedeutet die logfiles werden gemischt
es funzt auch
class Client : public TObject { public : AnsiString Pfad; }; . . . for(int a=0 ; a<AusgabeListe->Count ; a++) { ErrorLB->Items->Add((AnsiString) static_cast<Client*> (AusgabeListe->Objects[a])->Pfad + " " + AusgabeListe->Strings[a]); }nur leider funzt in der listbox "\t" net

-
Was ist das denn?
Das hierfor(int a=0 ; a<AusgabeListe->Count ; a++) { ErrorLB->Items->Add(AusgabeListe->Objects[a]->Pfad + " " + AusgabeListe->Strings[a]); }sollte auch gehen (falls Objects vom Typ Client ist).
-
habe das mal eben ersetz - nein, das geht leider nicht
-
Was geht nicht? Wie lautet die Fehlermeldung?
Bitte gewöhne dir vollständigere Fehlerbeschreibungen an. Der Typ von AusgabeListe und Objects wäre auch nicht schlecht.
-
Pfad ist kein Element von TObject
AusgabeListe ist eine TStringList
-
also für dich:
da fehlt nur noch die workstatiosn in pfad statt iclass TClient : public TObject { public : AnsiString Pfad; }; TimeForm->ShowModal(); AnsiString TimeStamp = TimeForm->TimeStamp; int range = TimeForm->minuten_plus; if(TimeStamp != NULL) { MehrfachAuswahl = 1; TList *auswahl = new TList; TStringList *PfadNamen = new TStringList; tree->GetSelections(auswahl); AnsiString Pfad; //der pfad der datei for(int i=0 ; i<auswahl->Count ;i++) { PfadNamen->Add(PfadAusNode((TTreeNode*)(*auswahl)[i])); //den pfadnamen aus dem selektierten rausholen un hinzufügen } ErrorLB->Clear(); //einmal bitte säubern :) //----------------------------------------------------------------------------------- TStringList *AusgabeListe = new TStringList; AusgabeListe->Sorted = 1; for(int i=0 ; i<PfadNamen->Count ; i++) { TStringList *LogFile = new TStringList; try { LogFile->LoadFromFile(PfadNamen->Strings[i]); //den pfadnamen laden } catch(...) { ShowMessage("Fehler beim Laden der Datei"); delete LogFile; delete PfadNamen; return; } //----------------------------------------------------------------------------------- for(int zeile=0 ; zeile<LogFile->Count ; zeile++) { //16 zeichen ist der timestamp big AnsiString Sub = LogFile->Strings[zeile].SubString(0,16); TClient *Workstation = new TClient; //der pfad Workstation->Pfad = i; if(Sub == TimeStamp) { while(Sub == TimeStamp) { Sub = LogFile->Strings[zeile].SubString(0,16); if(Sub == TimeStamp) { AusgabeListe->AddObject(LogFile->Strings[zeile], Workstation); //objekt hinzufügen damit wir später die workstation mit ausgteben können } zeile++; } break; }//if sub == timestamp delete Workstation; }//zeile < LogFile->Count delete LogFile; } AusgabeListe->Sort(); for(int index=0 ; index<AusgabeListe->Count ; index++) { //ErrorLB->Items->Add((AnsiString) static_cast<TClient*> (AusgabeListe->Objects[index])->Pfad + " " + AusgabeListe->Strings[index]); ErrorLB->Items->Add(AusgabeListe->Objects[index]->Pfad + " " + AusgabeListe->Strings[index]); } delete PfadNamen; delete AusgabeListe; } //----------------------------------------------------------------------------------- else { return; } }
-
Tja, programiere zu Hause gerade so ein bisssschen an einem HTML-Parser. Dazu benutzte ich DYNAMIC ARRAY. Wollte ich mal ausprobieren. Tja, und dann wollte ich löschen..... Und dann wollte ich nur noch vector.
Joo, mir war schon klar, dass die STL besser ist, warum wir hier so stark jetzt TStringList bevorzugt??
-
Dann so
for(int a=0 ; a<AusgabeListe->Count ; a++) { ErrorLB->Items->Add(static_cast<TClient*> (AusgabeListe->Objects[a])->Pfad + AnsiString(" ") + AusgabeListe->Strings[a]); }
-
Christian211 schrieb:
warum wir hier so stark jetzt TStringList bevorzugt??
Weil die Dokumentation der STL in Englisch ist?
Ansonsten fällt mir auf, das TClient* Workstation am Ende der Routine gelöscht wird. Somit ist der Zeiger in der StringList natürlich ungültig und nicht mehr verwendbar.
-
@Christian211
Für den eigentliche Zweck, Listen von AnsiStrings zu verwalten, ist TStringList ja auch gut geeignet. Diese Object-Eigenschaft finde ich aber nicht so gut. Es gibt sicher Fälle wo man die sinnvoll einsetzen kann. Insbesondere bei TListBox oder TStringGrid lassen sich sehr gut Objekte mit sichtbaren (und anklickbaren) Items verbinden. Für alles andere nehme ich vector, deque oder map.
-
Joe_M. schrieb:
Christian211 schrieb:
warum wir hier so stark jetzt TStringList bevorzugt??
Weil die Dokumentation der STL in Englisch ist?
Ansonsten fällt mir auf, das TClient* Workstation am Ende der Routine gelöscht wird. Somit ist der Zeiger in der StringList natürlich ungültig und nicht mehr verwendbar.
klar
das funzt perfektly