Einen Eintrag in der ListBox um eine Position nach oben bzw. nach unten verschieben?



  • Hallo

    Ich habe eine ListBox, welche bereits mit verschiedenen Einträgen gefüllt ist. Nun möchte ich einen markierten Eintrag, ausgelöst durch einen Button-Klick, um jeweils eine Position nach oben bzw. unten in der Liste verschieben.

    Hier meine bisherige Realisierung:

    ...
    LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
    {
       ...
       case ID_MOVEUPBUTTON:
       {
          LPCSTR	szItem1[URL_BUF];  // lokale Hilfsvariable
          LPCSTR	szItem2[URL_BUF];  // lokale Hilfsvariable
          int       CurrentItemPos;  // speichert die Position des aktuell markierten Listen-Eintrags
    
          /* aktuell ausgewählten Listen-Eintrag um eine Position nach oben schieben */
          CurrentItemPos = SendMessage(hListBox, LB_GETCURSEL, 0, 0);  // liefert die Position des ausgewählten Listen-Eintrags
          if (CurrentItemPos > 0)	 // wenn der Eintrag nicht der oberste in der Liste ist
          {
             SendMessage(hListBox, LB_GETTEXT, CurrentItemPos, (LPARAM)szItem1);
             SendMessage(hListBox, LB_GETTEXT, CurrentItemPos - 1, (LPARAM)szItem2);
             SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos, 0);
             SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos - 1, 0);
             SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos - 1, (LPARAM)szItem1);
             SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos, (LPARAM)szItem2);
          }
          break;
       }
       case ID_MOVEDOWNBUTTON:
       {
          LPCSTR	szItem1[URL_BUF];  // lokale Hilfsvariable
          LPCSTR	szItem2[URL_BUF];  // lokale Hilfsvariable
          int       CurrentItemPos;  // speichert die Position des aktuell markierten Listen-Eintrags
          int       ItemCount;  // speichert die Anzahl der Listen-Einträge
    
          /* aktuell ausgewählten Listen-Eintrag um eine Position nach unten schieben */
          CurrentItemPos = SendMessage(hListBox, LB_GETCURSEL, 0, 0);  // liefert die Position des ausgewählten Listen-Eintrags
          ItemCount = SendMessage(hListBox, LB_GETCOUNT, 0, 0);  // liefert die Position des letzten Listen-Eintrags
          if (CurrentItemPos < ItemCount - 1)  // wenn es nicht der letzte Eintrag der Liste ist
          {
             SendMessage(hListBox, LB_GETTEXT, CurrentItemPos, (LPARAM)szItem1);
             SendMessage(hListBox, LB_GETTEXT, CurrentItemPos + 1, (LPARAM)szItem2);
             SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos + 1, 0);
             SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos, 0);
             SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos, (LPARAM)szItem2);
             SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos + 1, (LPARAM)szItem1);
          }
          break;
       }
       ...
    }
    

    Das Prinzip:
    1. Auslesen der beiden zuvertauschenden Listen-Einträge in Hilfsvariablen.
    2. Löschen der beiden Listen-Einträge
    3. Zwei neue Listeneinträge von den Hilfsvariablen erstellen

    Das Ganze ist ziemlich umständlich und unübersichtlich wie ich finde. Also da gibt es doch sicherlich etwas vorgefertigtes bzw. eleganteres?

    Gibt es nicht wenigstens eine LB_*-Nachricht um einen Eintrag umzubennen, statt ihn zu löschen und neu zu erstellen?

    Danke im voraus



  • BarneyGumble schrieb:

    Das Ganze ist ziemlich umständlich und unübersichtlich wie ich finde. Also da gibt es doch sicherlich etwas vorgefertigtes bzw. eleganteres?

    Gibt es nicht wenigstens eine LB_*-Nachricht um einen Eintrag umzubennen, statt ihn zu löschen und neu zu erstellen?

    Das Ganze ist in der Tat umständlich und unübersichtlich, aber etwas vorgefertigtes bzw. eleganteres gibt es (leider) nicht.

    Nach einer LB_*-Nachricht, die einen Eintrag umbenennt, wirst du vergeblich suchen.



  • Du solltest Dir diese Funktionalität evtl in einer Funktion kapseln, dann bleibt es im Hauptprogramm übersichtlich 😉 . Denn, wie schon gesagt, sowas gibts nicht (IMHO).



  • Danke für eure Antworten

    In der Tat, ich habe in der MSDN Library vergeblich nach einer solchen Funktionalität gesucht.

    Okay, ich werde das Ganze noch in eine Funktion packen und die Sache ist gegessen. 🙂


Anmelden zum Antworten