Items in ListView werden nicht angezeigt



  • Hallo,

    ich programmiere gerade eine To-Do-List, wobei ich folgendes Problem habe:

    Beim Programmstart wird der Konstruktor aufgerufen, in welchem die einzelnen Aufgaben (ToDos) aus einer XML-Datei ausgelesen und der ListView hinzugefügt werden.

    Hier erstmal der Code:

    // Konstruktor
    __fastcall TFormMain::TFormMain(TComponent* Owner)
    			: TForm(Owner)
    {
    	  // local
    	  _di_IXMLDocument XMLTasks;
    	  _di_IXMLNodeList nodeList;
    	  _di_IXMLNode 	nodeTaskID;   // Node des Tasks
    	  AnsiString   	xmlPath 	  = "C:\\";
    	  AnsiString   	xmlFileName   = "tasks.xml";
    	  AnsiString	   task;
    	  AnsiString	   taskPriority;
    	  AnsiString	   taskCategory;
    	  AnsiString	   taskPrjStart;
    	  AnsiString	   taskPrjEnd;
    	  AnsiString	   taskText;
    	  TmpTasks	     container;
    
    	  // tasks XML laden
    	  XMLTasks = LoadXMLDocument(xmlPath + xmlFileName);
    	  // nodeList mit Unterknoten füllen
    	  nodeList = XMLTasks->DocumentElement->ChildNodes;
    	  // ersten TaskNode finden
    	  nodeTaskID   = nodeList->FindNode(L"TaskID-0");
    	  // Anzahl der Tasks bestimmen
    	  numberOfTasks = XMLTasks->DocumentElement->ChildNodes->Count;
    
    	  for( int i = 0; i <= numberOfTasks-1; ++i)
    	  {
    		  // Werte von SubNodes der Tasks auslesen
    		  task 			= nodeTaskID->ChildNodes->FindNode(L"Task")->NodeValue;
    		  taskPriority = nodeTaskID->ChildNodes->FindNode(L"Priority")->NodeValue;
    		  taskCategory = nodeTaskID->ChildNodes->FindNode(L"Category")->NodeValue;
    		  taskPrjStart = nodeTaskID->ChildNodes->FindNode(L"PrjStart")->NodeValue;
    		  taskPrjEnd   = nodeTaskID->ChildNodes->FindNode(L"PrjEnd")->NodeValue;
    		  taskText     = nodeTaskID->ChildNodes->FindNode(L"Text")->NodeValue;
    
    //		  if (i < 50)
    //		  {
    //			  // Tasks in Array buffern
    //			  tmpTaskList[i][0] = task;
    //			  tmpTaskList[i][1] = taskPriority;
    //			  tmpTaskList[i][2] = taskCategory;
    //			  tmpTaskList[i][3] = taskPrjStart;
    //			  tmpTaskList[i][4] = taskPrjEnd;
    //			  tmpTaskList[i][5] = taskText;
    //		  }
    //		  else
    //		  {
    //			  ShowMessage("Array-Elementanzahl überschritten!");
    //			  break;
    //		  }
    
    		  // Tasks in Struktur aufnehmen
    		  container.task     = task;
    		  container.priority = taskPriority;
    		  container.category = taskCategory;
    		  container.prjStart = taskPrjStart;
    		  container.prjEnd   = taskPrjEnd;
    		  container.text     = taskText;
    		  // container in Vector buffern
    		  tmpTaskListContainer.push_back(container);
    
    		  // ListViewTasks neues Item (Task) hinzufügen
    		  ListViewTasks->Items->Add();
    		  ListViewTasks->Items->Item[i]->Caption = task;
    
    		  // SubItems hinzufügen
    		  ListViewTasks->Items->Item[i]->SubItems->Add(taskPriority); // Priority
    		  ListViewTasks->Items->Item[i]->SubItems->Add(taskCategory); // Category
    		  ListViewTasks->Items->Item[i]->SubItems->Add(taskPrjStart); // Project start
    		  ListViewTasks->Items->Item[i]->SubItems->Add(taskPrjEnd);   // Project end
    
    		  nodeTaskID = nodeList->FindNode("TaskID-" + IntToStr(i+1));
    
    		  OutputDebugString(ListViewTasks->Items->Item[i]->Caption.c_str());
    	  }
    
    	  // RootNode von TreeViewCategories aufklappen
    	  TreeViewCategories->Items->Item[1]->Expanded = true;
    }
    

    Mein Problem liegt darin, dass die einzelnen Items der ListView nicht im Programm angezeigt werden. Ich habe testhalber eine XML mit 3 ToDos verwendet.

    Diese 3 Items kann ich in der ListView auch selektieren, nur ist es so, als wäre die Caption der Items == "". Der eigentliche Text wird nicht angezeigt.

    Im Debug-Mode allerdings werden mir die Werte richtig angezeigt und der ListView hinzugefügt. Nur während der Laufzeit sind sie == "".

    Dies kommt mir ziemlich ungewöhnlich vor, somal es schonmal funktionierte, bis ich eine kleine Änderung in meinem Programm vornahm:

    Für weitere Operationen mit den Werten, die aus der XML ausglesen wurden, speichere ich diese in einen Vektor zwischen, um erneute Datenströme mit der XML zu vermeiden. Vorher benutzte ich für das Zwischenspeichern ein 2-dimensionales Array, wie man noch an der auskommentierten Stelle im Code erahnen kann. Nun habe ich den Array durch einen Vektor vom Typ einer Struktur ersetzt.

    Dieser Vektor wird ja noch nicht mal für die Befüllung der ListView verwendet (zumindestens nicht beim Programmstart). Dafür sind ja die Variablen (tasks, category, etc.) zuständig.

    Deswegen kann ich mir nicht erklären, warum die Items nicht mehr angezeigt werden, seitdem ich statt des Arrays einen Vektor benutze.

    Ich hoffe ihr könnt mir weiter helfen.

    Danke.

    nki



  • Habe mein Problem gerade gelöst.

    Habe eine Funktion der Ereignisroutine OnShow erstellt und ein Sleep reingepackt und beim Debuggen gesehen, dass er danach in eine weitere Funktion springt, wo noch das alte Array, statt dem Vektor genutzt wird. Dies war logischerweise leer, wodurch diese Items mit der Caption "" entstanden sind.

    Der Thread kann geschlossen werden. 🙂

    *close*


Anmelden zum Antworten