[wxWidgets] wxListBox::InsertItems



  • Hallo Zusammen,

    ich bin am versuchen textdateien in eine wxListBox einzulesen, da ich diese einträge mit einer anderen textdatei vergleichen möchte, problem ist, dass performanceprobleme auftreten, sprich ich brauch bis zu 10 min um eine datei einzulsesen 😞 ( ⚠ knapp 24MB und knapp 0.5mio zeilen ⚠ )..

    nun bin ich am überlegen wie ich es umsetzen kann, das es mir die textdatei wie z.B. bei ultraedit, etc. nur im aktuellen sichtbaren bereich einfügt, und somit die performanceprobleme warscheinlich/hoffentlich nicht mehr auftreten.

    atm, lade ich die gesamte datei erst in einen vector, den ich dann mit InsertItems einlese.(was schonmal einen erheblichen vorteil zu dem einlesen mithilfe der InsertItem methode von einer wxListCtrl bringt.)

    freue mich über rückmeldung und dankeschön im voraus,
    mit freundlichen grüßen 🙂

    scythe


  • Mod

    Dafür gibts wxVirtualListBox/ListCtrl (oder so ähnlich).

    Andererseits frag ich mich, was du da genau anzeigen willst?
    Vergleichen würde mit der STL schneller gehen.

    phlox



  • Hi,

    danke für die recht zügige antwort.
    das problem atm. nicht das vergleichen, sondern mehr das einlesen selbst das zu performanceproblemem führt, das vergleichen wird dann noch einmal eine sache für sich 🙄

    die von dir beschriebene klasse klingt zunächst ganz interessant, war für mich jedoch unauffindbar, egal ob in der class-reference oder mit hilfe von google...

    einlesen/vergleichen möchte ich logfiles.

    mfg und nochmals danke,

    scythe


  • Mod

    Ja, aber wozu brauchst du dafür eine Listbox?



  • zum besseren vergleichen
    ich hab es im mom halt so,
    da die einträge nach datum/uhrzeit sotiert sind,
    soll es beim selektieren einen substring der zeile benutzen
    und nach diesem substring in der anderen liste suchen ob dort irgendwo die einträge übereinstimmen

    oder ja, dafür das der user den gewünschten logeintrag auswählen kann...

    mfg,

    scythe


  • Mod

    Schau dir mal wxListCtrl mit Virtual Mode an:
    http://docs.wxwidgets.org/stable/wx_wxlistctrl.html#wxlistctrl



  • argh!!!
    danke!
    ich bin so blind 😃

    danke für deine hilfe, wenn ich noch probleme hab komm ich nochmal drauf zurück wenns ok ist 🙂

    🙂 👍



  • Leite eine Klasse von wxListCtrl ab und überschreibe die virtuelle Funktion wxString OnGetItemText(long item, long column) const;

    Diese wird autom. aufgerufen, wenn eine Zeile mit Text zu füllen ist, dort gibst du den Text als wxString zurück.



  • 🙂 😃
    danke^^ wurd mir dann gestern auch klar als der mir nen assert ausgespuckt hat:)
    wollts dann noch für andere noch hinzufügen falls jemand das gleiche problem hat, aber das hast du ja dann schon übernommen^^

    ich hab aber auch erstmal dumm gekuckt und mich gefragt was er jetzt noch von mir will, aber nach n bisschen doku lesen hab ich dann den satz gefunden:

    This function must be overloaded in the derived class for a control with wxLC_VIRTUAL style. It should return the string containing the text of the given column for the specified item.

    und dann wars mir auch klar x) danke 🙂



  • problem 👎

    ich hab die neue klasse erstellt, funktion überladen etc. is virtual makro ist auch gesetzt hab ich nach gekuggt, nur er füllt mir die liste nicht, da ongetitemtext nicht aufgerufen wird...

    jemand ne idee? ich bin am verzweifeln... 😞


  • Mod

    Also meine Glaskugel ist heute leider defekt 😉
    Zeig doch mal was Code 🙂



  • hmja, erzeugen tu ichs so:

    //Left ListControl
       m_pListCtrlLeft = new MyWxListCtrl(m_pLeftUpperPanel, ID_WXLISTCTRLLEFT, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER | wxLC_VIRTUAL);
    
       wxBoxSizer* sizer1 = new wxBoxSizer( wxVERTICAL );
       sizer1->Add(m_pListCtrlLeft, 1, wxEXPAND | wxALL);
    
       m_pLeftUpperPanel->SetSizer( sizer1 );
    

    versuchen zu füllen damit:

    void Frame::OnMenuFileOpenLeft(wxCommandEvent &event)
    {
       wxFileDialog *OpenDialog= new wxFileDialog(this, _T("Choose a file"), _(""), _(""), _("*.*"), wxOPEN);
       if ( OpenDialog->ShowModal() == wxID_OK )
       {
          const NgTchar* fileName = OpenDialog->GetPath();
          m_pFileLineReader = new Util::TextLiner::FileLineReader();
          if (m_pFileLineReader != NULL)
          {
             String::NgString line;
             wxArrayString* pLines = m_pListCtrlLeft->GetLines();
    
             for(int i= 0;m_pFileLineReader->ReadLine(line) == true; i++)
             {
                pLines->Add(line.CStr());
             }
    
             m_pListCtrlLeft->SetItemCount(pLines->GetCount());
             this->Refresh();
    
             delete m_pFileLineReader;
          }
       }
       OpenDialog->Close(); // Or OpenDialog->Destroy() ?
    }
    

    und meine klasse schaut so aus:

    #ifndef MYWXLISTCTRL_H
    #define MYWXLISTCTRL_H
    
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
    
    #include "wx/listctrl.h"
    #include "wx/gdicmn.h"
    
    class MyWxListCtrl: public wxListCtrl
    {
    public:
    
       MyWxListCtrl
          (
          wxWindow* parent,
          wxWindowID id,
          const wxPoint& pos = wxDefaultPosition,
          const wxSize& size = wxDefaultSize,
          long style = wxLC_ICON,
          const wxValidator& validator = wxDefaultValidator,
          const wxString& name = wxListCtrlNameStr
          )
       {
          wxListCtrl::Create(parent,id,pos,size,style,validator,name);
          m_plines = new wxArrayString;
       }
    
       wxString OnGetItemText(long item,long column)const
       {
          myString = m_plines->Item(item);
          return myString;
       }
    
       wxArrayString* GetLines()
       {
          return m_plines;
       }
    
    private:
    
       //wxArrayString
       wxArrayString *m_plines;
    };
    
    #endif
    

    danke für deine bemühungen 🙂


  • Mod

    Den Dialog musst du nicht mit new erstellen, und wenn ist Destroy richtig.
    Ähnliches gilt für den wxArrayString.

    Aus dem ListCtrl werd ich aber auch nicht schlau. evtl. an den Construktor weiterleiten, statt Create aufzurufen.



  • argh. ich bin so blöde... ich hab line vergessen nochmal nen dateipfad zu geben weil ichs vorher anders implementiert hatte und line den bekommen hat......-.-"
    kein wunder dass er mit einem nicht gefüllten vector nicht ongetitemtext aufgerufen hat... ich bin so hohl... vor allem ich war mir einfach sicher dass des einlesen funktioniert weil ichs vorher ja genauso implementiert hatte... naja egal, auf jeden fall gehts jetzt, danke

    und btw. das create stimmt schon. konstruktor aufrufen funkt da nicht... dafür scheint die create_methode anscheinend auch geschrieben worden zu sein


Anmelden zum Antworten