Dein Code ist mir zu unübersichtlich ich kann dir aber sagen wie es allgemein geht.
Das wesentliche ist, das man eine Variable hat in der der erste Sichtbare eintrag gespeichert wird.
zeichnen:
Delphi-Quellcode:
YAnzeigePosition := 2;
for i:=indexdeserstensichtbarenEintrags to (Liste.Count-1) do
begin
Canvas.TextOut(2,YAnzeigePosition,Liste.Items[i].AnzeigeName);
YAnzeigePosition := YAnzeigePosition + itemhoehe;
if YAnzeigeposition > height then break;
end;
//Scrollbalken:
positiondesscrollbalkens.y := ((ermittleheightfuerScrollen) *indexdeserstensichtbarenEintrags) div (Liste.count-(height div itemhoehe));
Canvas.Draw(positiondesscrollbalkens.x, positiondesscrollbalkens.y, Bilddesscrollbalkens);
Scrollen mit dreisatz:
indexdeserstensichtbarenEintrags := ((Liste.Count-(height div itemhoehe)) * y) div ermittleheightfuerScrollen;
y = Position des Mauszeigers (mousemove)
ermittleheightfuerScrollen = Scrollbereich in Pixeln (der Scollbalken geht ja nicht über die gesamte höhe der Komponnete)
zum itemindex scrollen:
indexdeserstensichtbarenEintrags := itemIndex;
Es sind noch einige Sicherheitsabrafen notwendig, die ich wegen der Übersichtlichkeit weggelassen habe, aber im wesentlichen war es das.