Tach Leute,
ich habe da noch ein paar Sachen zum Thema zusammen getragen. Ich habe es über eine weitere Stringliste erledigt. Ich setze als String nicht den Inhalt des sichtbaren. Der Platz reicht eh nicht. Ich bilde einen String, der zum Sortieren verwendet wird. So bekommen die ganz oben einsortierten Einträge eine 0 davor und die unteren eine 9 am Anfang. Nach dem Sortieren wird dann nur noch
ListBox.Items.Text:=StringList.Text
ausgeführt.
Bei der Berechnung der Positionen muß man gleich den Slider mit einplanen. Da habe ich eine ganze Zeit gebraucht das zu peilen.
Die einzelnen Elemente des Eintrags berechne und speicher ich in dem Objekt, das jeder Eintrag hat. Ich packe die Werte gleich in ein TRect, den braucht man so wie so für die Funktion DrawText aus der
API.
Delphi-Quellcode:
DrawText(lCanvas.Handle
,PChar(Info)
,-1
,FRectInfo
,DT_LEFT + DT_TOP + DT_CALCRECT + DT_WORDBREAK);
Beim Zeichnen muß man dann noch bedenken, daß die Positionen aus dem Rect mit eingerechnet werden müssen:
Delphi-Quellcode:
function lAddRect( aRect : TRect):TRect;
var
lRect : TRect;
begin
lRect.Left:=aRect.Left + Rect.Left;
lRect.Top:=aRect.Top + Rect.Top;
lRect.Right:=aRect.Right + Rect.Left;
lRect.Bottom:=aRect.Bottom + Rect.Top;
Result:=lRect;
end;
Beim Ziehen der Box muß man etwas mit dem Inhalt spielen. Falls jemand eine schönere Lösung hat, soll er das hier Kund tun.
Delphi-Quellcode:
procedure MainForm.ListBox1Resize(Sender: TObject);
var
lText : String;
lLocked : Boolean;
begin
lLocked:=LockWindowUpdate(ListBox1.Handle);
ListBox1.Items.BeginUpdate;
lText:=ListBox1.Items.Text;
ListBox1.Items.Clear;
ListBox1.Items.Text:=lText;
ListBox1.Items.EndUpdate;
if lLocked then
LockWindowUpdate(0);
end;
Die ganze Geschichte flimmert zwar beim Ziehen, ist aber egal. Wann zieht man schon.
Stefan