listbox variable Höhe der Einträge
-
Sorry das es nicht verständlich ist.
Dann will ich mich mal verschlimmbessernAlso die ListBox soll im Grunde eine Tabelle sein, die die Stunden angibt.
z.B:
13.00
14.00
15.00
...Ein Eintrag in die ListBox belegt immer eine Zeile. Ich möchte aber das ein Eintrag auch zwei oder drei Zeilen belegt. Ich habe überhaupt kein Plan ob das überhaupt mit einer ListBox funktioniert. Wenn es geht soll der Eintrag auch noch Farbig unterlegt sein.
Ziel ist es, so eine Liste per Drag and Drop aufzubauen.
Vielleicht erinnert sich jemand noch an MADTV, einem alten PC spiel.
So in der Richtung soll es aussehen.Hoffe mein Problem ist nun ein bischen deutlicher !!!!!!!
DANKE
Sebastian
-
Du meinst also, wenn der Film 20 Zeichen lang ist, und die Listbox-Breite ca. 10 Zeichen, dass die anderen 10 Zeichen des Films in die nächste Zeile geschrieben werden, anstatt verdeckt zu sein????????
Bj
-
Den Unterschied zwischen Höhe und Länge kennst du aber?
Habe mir erlaubt, die Thread-Überschrift entsprechend anzupassen.In einer ListBox haben alle Einträge dieselbe Höhe, ItemHeight lässt sich nicht individuell setzen. Eine Möglichkeit wäre es, für "längere Filme" mehrere Items zu benutzen, dann musst du natürlich dafür sorgen, dass bei einer Auswahl automatisch immer alle zugehörigen Items selektiert werden.
Zum Einfärben der ListBox findest du einen entsprechenden Beitrag in der FAQ.
Nachtrag für Leute, die MadTV nich kennen (war ein nettes Spiel):
Es geht um eine Art Programmplaner. Ein ListBox-Eintrag steht z.B. für eine Stunde Sendezeit (ein Block), ein zweistündiger Film benötigt zwei Blöcke, also zwei ListBox-Einträge.
-
@Jansen:
Danke für den Link in die FAQ.
Das hab ich glatt übersehen.TColor LBColors[3] = {clBlue, clGreen, clRed};
ListBox1->Canvas->Brush->Color = LBColors[2];
ListBox1->Canvas->FillRect(Rect);Wo füge ich die Zeilen in meinen Quellcode ein ??!?
Ich denke mal in die Funktion "DrawItem".
Wie aber kann ich die Funktion aus meiner Funktion "DragDrop" aufrufen.
Was für Parameter muss ich da mitübergeben.Noch eine kleine Frage zu dem Quellcode:
Was macht die Variable igOldPos ?!?!
Die ist nämlich nicht deklariert ??//--------------------------------------------------------------------------- // Behandlungsroutine für das Ereignis OnDragOver der Ziel-ListBox //--------------------------------------------------------------------------- void __fastcall TfrmMain::lboxTargetDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { Accept = Source->ClassNameIs("TListBox"); int ilIndex = lboxTarget->ItemAtPos(Point(X,Y), true); if(ilIndex > -1) lboxTarget->ItemIndex = ilIndex; } //--------------------------------------------------------------------------- // Behandlungsroutine für das Ereignis OnDragDrop der Ziel-ListBox //--------------------------------------------------------------------------- void __fastcall TfrmMain::lboxTargetDragDrop(TObject *Sender, TObject *Source, int X, int Y) { // Falls von einer anderen Listbox gezogen: if(Sender==lboxTarget && Source == lboxSource) { int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true); if(ilNewPos > -1) { lboxTarget->Items->Insert(ilNewPos, lboxSource->Items-> Strings[lboxSource->ItemIndex]); lboxTarget->ItemIndex = ilNewPos; } else { lboxTarget->Items->Insert(lboxTarget->Items->Count, lboxSource->Items->Strings[lboxSource->ItemIndex]); lboxTarget->ItemIndex = lboxTarget->Items->Count-1; } } // Falls innerhalb der Listbox verschieben: else if(Sender==lboxTarget && Source == lboxTarget) { int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true) >= 0 ? lboxTarget->ItemAtPos(Point(X,Y), true) : lboxTarget->Items->Count-1; if(igOldPos >= 0 && igOldPos != ilNewPos) { lboxTarget->Items->Exchange(igOldPos, ilNewPos); lboxTarget->ItemIndex = ilNewPos; } } } //--------------------------------------------------------------------------- // Behandlungsroutine für das Ereignis OnStartDrag der Ziel-ListBox //--------------------------------------------------------------------------- void __fastcall TfrmMain::lboxTargetStartDrag(TObject *Sender, TDragObject *&DragObject) { // alte Position des Eintrags zwischenspeichern: if(Sender == lboxTarget) igOldPos = lboxTarget -> ItemIndex; }
DANKE
Sebastian
-
listbox dummie schrieb:
Wo füge ich die Zeilen in meinen Quellcode ein ?
Warum probierst du den Code nicht erstmal in einem Beispielprojekt aus und versuchst, zu verstehen, was da eigentlich passiert?
Was igOldPos betrifft, ich denke, das ist dein Code und der funktioniert? Davon abgesehen steht es doch im Kommentar: igOldPos speichert die alte Position des Eintrags.
-
ich versuche ja den Beispiel Code aus der FAQ zu verstehen.
Ich füge den Code als OnDrawItem - Ereigniss ein.
Aber wie rufe ich diese Methode auf, bzw wie starte ich die Sache??
Danke
Sebastian
-
Nimm den Objektinspektor, gehe auf "Ereignisse" klicke einmal in die Combobox für das Ereignis OnDrawItem und drücke dann F1. Anschliessend beginnst du zu lesen...
-junix
-
Seit wann müssen Ereignisse aufgerufen werden? Die passieren von selbst.
Hast du dir mal die Hilfe zu OnDrawItem angesehen? Du "startest die Sache", indem du, wie im FAQ-Beitrag beschrieben, den Style der ListBox auf OwnerDraw... einstellst
Übrigens fällt mir grad auf, dass man über OwnerDrawVariable und das OnMeasureItem-Event wohl doch unterscheidlich grosse Items in der ListBox haben kann.
-
Danke
Das is ja einfachDas mit der Unterschiedlichen Grösse schau ich mir jetzt mal an.
Danke für deine Hilfe und Mühe :-))))Ciao
Sebastian
-
Hi
Nachdem ich jetzt meine Hintergrund- und Schriftfarbe habe, die Schrift und die Zeilengrösse ändern kann habe ich noch ein kleines Problem.Die Zeilenhöhe ändere ich so:
lboxTarget->ItemHeight=32;Ich möchte aber das es Variabel wird. Wie kann ich beim reinziehen eine Variable grösse mitgeben ?!?!?!?!?
DRAG & DROP
void __fastcall TForm1::lboxTargetDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { Accept = Source->ClassNameIs("TListBox"); int ilIndex = lboxTarget->ItemAtPos(Point(X,Y), true); if(ilIndex > -1) lboxTarget->ItemIndex = ilIndex; } //--------------------------------------------------------------------------- void __fastcall TForm1::lboxTargetDragDrop(TObject *Sender, TObject *Source, int X, int Y) { int igOldPos=0; // Falls von einer anderen Listbox gezogen: if(Sender==lboxTarget && Source == lboxSource) { int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true); if(ilNewPos > -1) { lboxTarget->Items->Insert(ilNewPos, lboxSource->Items-> Strings[lboxSource->ItemIndex]); lboxTarget->ItemIndex = ilNewPos; } else { lboxTarget->Items->Insert(lboxTarget->Items->Count, lboxSource->Items->Strings[lboxSource->ItemIndex]); lboxTarget->ItemIndex = lboxTarget->Items->Count-1; } } // Falls innerhalb der Listbox verschieben: else if(Sender==lboxTarget && Source == lboxTarget) { int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true) >= 0 ? lboxTarget->ItemAtPos(Point(X,Y), true) : lboxTarget->Items->Count-1; if(igOldPos >= 0 && igOldPos != ilNewPos) { lboxTarget->Items->Exchange(igOldPos, ilNewPos); lboxTarget->ItemIndex = ilNewPos; } } }
DRAW ITEM
void __fastcall TForm1::lboxTargetDrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { TColor LBColors[2] = {clGray, clBlack}; //Farbe für Hintergrund und Text lboxTarget->Canvas->Brush->Color = LBColors[0]; lboxTarget->Canvas->Font->Color = LBColors[1]; //Text Grösse lboxTarget->Canvas->Font->Size = 14; //Eintrags Höhe lboxTarget->ItemHeight=32; // Hintergrund zeichnen lboxTarget->Canvas->FillRect(Rect); // Text zeichnen lboxTarget->Canvas->TextRect(Rect, Rect.Left, Rect.Top, lboxTarget->Items->Strings[Index]); if(State.Contains(odFocused)) lboxTarget->Canvas->DrawFocusRect(Rect); }