SaveDialog alle Listen eines PageControl speichern?



  • Hallo,

    Ich stimme junix zu. Allerdings ist mir bei groben anschauen gleich am Anfang etwas aufgefallen
    Hier:

    TListView* Tfrm_main::GetListView (TTabSheet* pTabSheet) 
    { 
      return (TListView*)pTabSheet->FindChildControl(""); 
    }
    

    FindChildControl sucht nach einem Control mit dem angegebenen Namen und gibt dann einen Pointer zurück oder NULL wenn es nichts gefunden hat.
    Hier gibt es mehrer Probleme
    1. du übergibst keinen Namen
    2. du testet nicht auf NULL
    3. durch den (nicht zu verwendenden C-cast) kannst du nicht prüfen ob das Control vom Typ TListView ist

    Es gibt hier sicher noch mehr.
    Schau mal selber gründlich nach.

    Ciao



  • Also zwei Fehler...

    EConvertError und EListError 😕

    @Braunstein
    also ich verwende diese Funktion ja in mehreren Fällen und da Funzt sie 🙄



  • 0Bytes schrieb:

    Also zwei Fehler...

    EConvertError und EListError 😕

    Zum Glück gibts da keinen näheren Informationen zur Klasse des fehlers... Sonst würden wir ja den fehler viel zu schnell finden... und wo bitte treten die Fehler auf? (Zeile?!?)

    -junix



  • 0Bytes schrieb:

    Also zwei Fehler...

    EConvertError und EListError 😕

    sieh doch noch mal an, was Braunstein geschrieben hat.



  • also die Fehler
    kommt in der inneren for Schleife

    ich hab es mir angesehn, aber warum funktionierts mit "" bei den anderen Funktionen und Schleifen und hier ausgerechnet nicht 😞



  • @0Bytes
    Je länger ich mir deinen Quelltext anschaue destso verworrener erscheint er mir. Was steht denn in deinen ListViews drin? Wiso holst du dir den Pointer ListView zweimal (mal abgesehen davon das das kein Pointer auf ListView sein muss?

    for (int y = 0; y < PageControl1->PageCount; y++) 
     { 
    // hier holst deinen Pointer   
       TListView* pListView = GetListView(PageControl1->Pages[y]); 
    // jetzt kommt die Schleife über die Elemente des ListView 
       for (int i = 0; i < pListView->Items->Count; i++) 
       { 
    //hier holst du einen neuen Pointer aus einer Page mit dem Index der über ListView->Count läuft ???
         pListView = GetListView(PageControl1->Pages[i]); 
         pListViewList->Add(pListView->Items->Item[i]->Caption + "| " + \ 
         pListView->Items->Item[i]->SubItems->Text  + "|| "); 
       } 
    
     }
    

    schon sehr merkwürdig



  • Hey Supa

    der Zweite Pages[] muss natürlich auch ein 'y' rein 🙂

    Danke das war es 👍



  • Wozu überhaupt zweimal den Selben pointer holen?

    Ahja und btw. Hättest du den von mir verlinkten Artikel gelesen und den Link in jenem Artikel ebenfalls angeschaut und die dort beschriebenen Ratschläge befolgt hättest du schon längst selbst drauf kommen können...

    Ich durchsetze meine Beiträge nicht aus Spass an der Freude mit links...

    -junix



  • Ja gut ich hab Deinen Link übersehn ...Sorry.

    Nun aber doch noch eine Frage...
    kann es sein das zB. 200-300 Listeneinträge zu viel sind...

    nun bricht er beim 3 oder 4 mal durchlaufen der inneren for Schleife ab
    mit EListError - Speichermangel! ab.

    gibt es eine Begrenzung für TStringList?



  • So die Lösung, man bin ich blöde 😃

    void __fastcall Tfrm_main::CmdSaveAllListViewToFile()
    {
    
     bPlay = false;
     TStringList* pListViewList = new TStringList();
    
     for (int y = 0; y < PageControl1->PageCount; y++)
     {
       TListView* pListView = GetListView(PageControl1->Pages[y]);
    
      for (int i = 0; i < pListView->Items->Count; i++)
       {
         pListView = GetListView(PageControl1->Pages[y]);
         pListViewList->Add(pListView->Items->Item[i]->Caption + "| " + \
         pListView->Items->Item[i]->SubItems->Text  + "|| ");
        }
    
       if  (SaveDialog1->Execute())
          {
           SaveDialog1->Title = "  Alle Fenster speichern...";
           pListViewList->SaveToFile(SaveDialog1->FileName);
           pListViewList->Clear();
          }
    
     }
     delete pListViewList;
     bPlay = true;
    }
    

    man sollte halt die liste auch leeren damit sie einem den Speicher nicht zu ballert 😃

    naja aus fehlern lernt man...

    Cya bis zum nächsten Problem 🤡


Anmelden zum Antworten