Hallo!
ich hab die letzten Tage damit verbracht mir eine art "Gästeliste" zusammenzubasteln.
einen eigenen Scrollbalken (für die Vertikale) hab ich schon länger. Hab allerdings noch nie versucht eine eigene scrollbare Komponente zu bauen.
das Scroll ereigniss habe ich folgendermaßen gedacht (und probiert):
Delphi-Quellcode:
if Position = ActiveElement then
Exit;
i := 50 * FClients.Count;
if i > Self.Height then
begin
FTop := 0 - (Position * 47);
end;
if Position = Clients.Count then
Exit;
ActiveElement := Position;
mit ActiveElement leg ich fest welches element "gehighlighted" wird. (in der Paint procedure)
mit FTop verringer ich den Top-Wert jedes Elements. 47 ist die höhe eines Elements.
Leider scrollt der Balken viel zu weit nach unten und ich weiß nicht wie und wo ich das beschränken kann (soll).
Meine nächstes Problem ist die OnMouseDown procedure:
Delphi-Quellcode:
procedure TZClientList.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
i, j: integer;
begin
inherited;
FMouseDown := TRUE;
case ViewMode of
zvReport:
begin
j := (FClients.Count * 47) + 25;
if (x > 5) and (x < Width - 5) then
if (y > 22) and (y < Height) then
begin
i := (FTop + y - 22) div 47;
if i < FClients.Count then
ActiveElement := i
else
Exit;
end;
end;
end;
end;
ich hab (wie ihr seht) schon selber n bissl rumgespielt. Leider erreich ich nicht ganz was ich möchte: Beim klick sollte das darunterliegende element als ActiveElement gesetzt werden und es sollte zu diesem Element gescrollt werden (via SetActive):
Delphi-Quellcode:
procedure TZClientList.SetActive(const Value: Integer);
begin
FActive := Value;
if Assigned(FSlider) then
if FClients.Count > 0 then
if Value > -1 then
Slider.Position := Value;
Draw;
end;
(Draw ist ähnlich der Paint procedure (ich verwende allerdings ein Nachfahreobjekt von TWinControl)
ich habe beim OnMouseDown einen Boolschen wert gesetzt: FMouseDown. Damit erreiche ich schon dass man mit gedrückter Maustaste elemente markieren kann (und scrollen).
also nochmal kurz:
1. NEbeneffekt ist: Es wird viel zu weit nach unten gescrollt. Wie kann ich das beschränken?
2. Mit MouseDown möchte ich element markieren. Leider klappt das nicht mehr seit ich diese SCrollerei eingebaut habe.
Danke, Daniel