TListBox eindeutige Einträge erstellen.



  • Hallo

    Naja, immerhin kann über TListBox::Items::Objects zu jedem Listeintrag ein zusätzlicher versteckter Wert zugeordnet werden, sei es nun ein einfacher Integer-Index oder eine Speicheradresse eines Objektes außerhalb der Listbox.

    bis bald
    akari



  • Joe_M. schrieb:

    Nein, das geht leider nicht, da AnsiString nicht über das, für so etwas sonst so nützliche Feld Tag verfügt.

    Es gibt allerdings TStrings::Objects.



  • Danke, ich finde Die Idee mit dem Array ganz gut.
    Ich hab aber noch nicht so mit arrays gearbeitet.
    Daher meinte Frage: Wie definiere ich ein Array von variabler größe?
    Die Anzahl der Einträge bekomme ich durch:
    Query->RecordCount

    Wie mache ich ein Array, welches genau diese größe hat?



  • Hallo

    Wenn du wirklich ein eigenes Arrays aufbauen willst (Wie schon gesagt, ::Items::Objects bietet dir bereits ein passendes dynamisches Array mit automatisch richtiger Dimension), dann schau dir DynamicArray oder besser noch std::vector an. Dazu findest du über die Suchfunktion hier im Forum genug Beispiele.

    bis bald
    akari



  • Ich würde auch die andere Möglichkeit nehmen, mit dem bereits eingebauten Objekt.
    Ich hab nur leider eine Ahnung, wie ich das machen kann



  • Hallo

    Schau dir zum Beispiel den letzten Post in diesem Thread an

    bis bald
    akari



  • ahh, vielen Dank, das hat funktioniert



  • Hallo Listmann,

    eine andere Möglichkeit als das parallele Ablegen:

    Schreibe einfach Deine Daten komplett in die Listbox; setze zwischem den
    angezeigten Text (also sichtbaren) und den zugehörigen Daten (also unsichtbar
    für den User) ein beliebiges Trennzeichen z.B.
    sichtbarer Text|unsichtbarer Text

    Nun musst Du nur noch die Listbox auf Ownerdraw setzen und dort zeichnest
    Du nur den Text bis zum Trenner. Fertig. Ein Vorteil dieser Methode: Du
    kannst jederzeit mit einem Merker (bei mir immer eine Boolean oPrgComp)
    z.B. zum Testen im IDE den unsichtbaren Text mit sichtbar machen. Ausser-
    dem kannst Du ganz normal auf die Items und Methoden der Listbox zugreifen
    und hast keinerlei Probleme bei Neusortierung, neuen Einträgen, gelöschten
    Einträgen usw.:

    void __fastcall TForm3::frm3_lbK_Benutzer_ListeDrawItem(TWinControl *Control, int Index, TRect &ARect, TOwnerDrawState State)
    try {                                                                          // Fehlerroutine Start
     Integer iPos; AnsiString zTxt,zName; TColor f1,f2;   	 				    // Vars definieren
     TRect CRect;    			                                                  // vorbereiten
     TListBox *LBox;                                                                  // vorbereiten
    
     LBox  =frm3_lbK_Benutzer_Liste;                                                // zuordnen
     zTxt  =LBox->Items->Strings[Index];                                            // Text auslesen z.B. Admin (ID: 1)|unsichtbare Daten...
     iPos  =zTxt.AnsiPos("|");
     zName =zTxt.SubString(1,iPos-1);				                               // Benutzername abschneiden
    
     LBox->Canvas->Brush->Color=clWhite;                                            // Farbe HG festlegen
     LBox->Canvas->FillRect(ARect);                                                 // und Rahmen zeichnen
    
     if(Form1->oPrgComp) { zName=zTxt+" >>> "+zName; }	 	 		           // nur im IDE alles anzeigen
    
     ARect.Top+=1; ARect.Bottom-=0; ARect.Left=3; ARect.Right-=1;                   // Koords anpassen
    
     f1=clWhite; f2=clBlack; if(Odd(Index)) { f1=TColor(0x00EEEEEE); }                   // HG und VG Farben
     //if(State.Contains(odSelected)==true)   { f1=clHighlight; f2=clHighlightText; }	// Eintrag ist selektiert
     if(LBox->Enabled==false)               { f1=TColor(0x00EEEEEE); f2=clGray; }   // Control ist gesperrt
    
     LBox->Canvas->Brush->Color=f1;                                                 // Farbe HG festlegen
     LBox->Canvas->Font->Color =f2;                                                 // Farbe VG festlegen
     LBox->Canvas->FillRect(ARect);                                                 // und Rahmen zeichnen
     LBox->Canvas->TextRect(ARect,ARect.Left+4,(ARect.Top+ARect.Bottom-LBox->Canvas->TextHeight(zTxt))/2,zTxt);  // Text schreiben
    
     if(State.Contains(odSelected)==true)   {                                         // Eintrag ist selektiert
      f1=clRed;                                                                      // Rahmenfarbe
      CRect=Rect(ARect.Left,ARect.Top,ARect.Right-1,ARect.Bottom);                  // Koords übergeben
      LBox->Canvas->Brush->Color=f1;		                                          // Rahmenarbe
      LBox->Canvas->FrameRect(CRect);                                               // Kasten aussenrum zeichnen
     }										                                          // ende if(State.
    
     } catch(Exception& e) { MessageBox(NULL, e.Message.c_str(), "TForm3::frm3_lbK_Benutzer_ListeDrawItem()", MB_OK); }  // Fehler anzeigen
    }
    

    Gruss Stefan



  • akari schrieb:

    [...] immerhin kann über TListBox::Items::Objects zu jedem Listeintrag [...]

    Oh je, da habt ihr natürlich recht, ::Objects hatte ich ganz vergessen.

    Sorry



  • Hallo

    Stefan7124 schrieb:

    Ausser-
    dem kannst Du ganz normal auf die Items und Methoden der Listbox zugreifen
    und hast keinerlei Probleme bei Neusortierung, neuen Einträgen, gelöschten
    Einträgen usw.:

    Hast du mit Items->Objects auch nicht.

    bis bald
    akari


Anmelden zum Antworten