| Autor |
Nachricht |
y-vonne
Unregistrierter
|
y-vonne Unregistrierter
09:22:13 04.06.2012 Titel: |
FindItem suchen nach 2ter spalte in CListCtrl (Hashkey) |
Zitieren |
Hallo zusammen.
In meinem CLIstCtrl suche ich mit FindItem einen Eitrag in der ersten Spalte. Da die erste Spalte aber nur mit der zweiten zusammen eindeutig ist, sollte ich nach der zweiten Spalte auch noch suchen. Mit FindItem nicht möglich.
Mit GetItemCount könnte ich ja nun mir alle Einträge zurückgeben lassen die aus der ersten Spalte dem Suchkriterium entsprechen. Und diese dann weiter nach den restlichen Spalten durchsuchen. Ich denke von der Performance nicht die beste Lösung.
Andere Lösung:
Ich füge dem Listcontrol eine weitere unsichtbare Spalte hinzu in der ich einen Haskey speichere den ich aus der ersten und zweiten Spalte generiere.
Hier nun meine Frage: wie kann ich in MFC einen Haskey aus einem String erzeugen. Oder habt ihr eine bessere Lösung um in einem ListControl nach mehreren Spalten zu suchen. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14186
|
Martin Richter Moderator
13:34:16 04.06.2012 Titel: |
|
Zitieren |
Subclass machen und eigenes LVM_FINDITEM implementieren.
So schwierig ist das ja auch nicht.
Warum bist Du überhaupt auf LVM_FINDITEM angewiesen? |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
y-vonne
Unregistrierter
|
y-vonne Unregistrierter
13:51:31 04.06.2012 Titel: |
|
Zitieren |
| Zitat: | Subclass machen und eigenes LVM_FINDITEM implementieren.
So schwierig ist das ja auch nicht. |
Wahrscheinlich nicht, wenn man weiß wie es geht. Keine Ahnung was ich da machen muss oder wonach überhaupt schauen.
| Zitat: |
Warum bist Du überhaupt auf LVM_FINDITEM angewiesen? |
Bin ich doch gar nicht. Habe ja sogar gefragt ob jemand eine bessere Idee hat.
Das einzige worauf ich angewiesen bin ist dass ich einen Eintrag finde. Wie ist mir letztenendes egal. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14186
|
Martin Richter Moderator
13:58:44 04.06.2012 Titel: |
|
Zitieren |
Naja. Dann lauf durch undvergleiche... LVM_FINDITEM macht auchnichts andres.
Wenn Dir das zu lahm ist, musst Du wohl auf eine Doppelverwaltung zurückgreifen (std::map o.ä.) |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
y-vonne
Unregistrierter
|
y-vonne Unregistrierter
14:51:17 04.06.2012 Titel: |
|
Zitieren |
Und was ist mit dem Hashkey und der weiteren Spalte?
| Zitat: |
Wenn Dir das zu lahm ist, musst Du wohl auf eine Doppelverwaltung zurückgreifen (std::map o.ä.) |
Nun ja habe ich schon. Das Problem ist dass ich alle paar Millisekunden einen Wert im ListControl update. Wenn ich hier nun nur einen Eintrag suchen muss und einen Wert ändere geht das sicher schneller und flackerfreier, als wenn ich andauernd das ganze ListControl neu aufbauen muss.
Ich sag mal im Windows Taskmanager ist das ja auch so ähnlich. Dort wird auch ständig ein Wert aktualisiert. Beispielsweise die Speicherauslastung. Dort wird, denke ich, die Liste auch nicht ständig komplett neu aufgebaut. Im Taskmanager ist halt die PID eindeutig. Und nicht zwei Spalten wie bei mir. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14186
|
Martin Richter Moderator
15:29:04 04.06.2012 Titel: |
|
Zitieren |
Ja sicher.
Hängt also ab, wie Du hinzufügst. Wenn Du immer nur anhängst kanst Du eine Map auf den Zeilenindex bauen.
Ansonsten bau Dir eine virtuelles List View. Dann gibst Du nur die Zahlen an, und Du lieferst die Informationen, für die Zeile, die Du möchtest.
http://msdn.microsoft.com/en-us/library/ye4z8x58(v=vs.80).aspx |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
y-vonne
Unregistrierter
|
y-vonne Unregistrierter
15:47:19 04.06.2012 Titel: |
|
Zitieren |
| Zitat: | | Hängt also ab, wie Du hinzufügst. Wenn Du immer nur anhängst kanst Du eine Map auf den Zeilenindex bauen. |
Ja das wäre am einfachsten gewesen. Aber da man die Liste auch sortieren kann, wäre es spätestens dann zu Ende.
| Zitat: | | Ansonsten bau Dir eine virtuelles List View. | Ok. Was ist das? Das existiert dann parallel zu meinem ListControl? Muss ich mir mal genau durchlesen.
Mein Vorschlag mit dem Hashkey hast du bisher total ignoriert. Mit Absicht? Keine gute Lösung? |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14186
|
Martin Richter Moderator
16:41:31 04.06.2012 Titel: |
|
Zitieren |
Ja das habe ich ignoriert weil es nichts bringt. Denk doch mal nach.
Du willst eine bestimmte Zele finden... OK dann kannst musst Du die Liste von Oben nach unten durchlaufen.
Wnen Du das vermeiden willst baruauchst Du eine map von Daten -> Zeile...
Und? Die Zele ändert sich aber evtl. (Zeile wird gelöscht, sortierung ändert sich).
Wenn Du damit leben kannst die Zeile nach einer bestimmten Info zu durchsuchen. Also von 0..n dann kann Dir das egal sein.
Einzig eine virtuelle iste in der Du selber die daten verwaltest und entscheidest was angezeigt wird, ist natürlich von dieser Suche befreit...
Hier stimmt Anzeigeimmer mit Deiner Info im Speicher überein. |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
y-vonne
Unregistrierter
|
y-vonne Unregistrierter
08:16:22 05.06.2012 Titel: |
|
Zitieren |
| Zitat: | | Ja das habe ich ignoriert weil es nichts bringt. Denk doch mal nach. |
Nun ja. Das bringt meiner Meinung schon was. Denn ich muss nun nur noch nach der ersten Spalte durchsuchen. Ich kann FindItem nutzen - klar dass dieser die Liste auch durchläuft - aber nur die erste Spalte.
Sozusagen habe ich dann in meiner Tabelle dann auch wie im Taskmanager eine PID.
Sicher wäre ein virtuelles Listview für die Suche noch besser. Aber baut man für jedes Listcontroll das man durchsuchen will ein virtuelles Listview?
Mein Problem mit der nicht eindeutigen Spalte hätte ich durch die zusätzliche Spalte mit dem Haskey gelöst.
Oder habe ich nicht recht? |
|
|
|
 |
MFK
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.11.2002
Beiträge: 5562
|
MFK Mitglied
08:33:32 05.06.2012 Titel: |
|
Zitieren |
| y-vonne schrieb: | | Das Problem ist dass ich alle paar Millisekunden einen Wert im ListControl update. | So schnell kannst du gucken?
Im Ernst: Wenn du nicht gerade einen automatisch ausgewerteten Hochgeschwindigkeits-Video-Stream erzeugst, reichen auch ein paar Aktualisierungen pro Sekunde. Ein menschlicher Betrachter kann sowieso nicht mehr erfassen.
Dein grafisches Steuerelement muss nicht auf jede Änderung sofort reagieren, das kann es auch gar nicht, und es bringt auch nichts. Aktualisiere einfach in regelmäßigen Abständen, vielleicht so alle 200 ms.
Vereinfacht wird das ganze, wenn du dein grafisches Steuerelement nicht als Datenspeicher benutzt. Die darzustellenden Daten müssen in deinem Programm vorliegen, in einer geeigneten Datenstruktur, die du schnell ändern kannst. Das Listcontrol kümmert sich nur um die Darstellung. |
_________________ "Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|