Einzelnen Beitrag anzeigen

Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#1

Eigene "Listbox" - Scrollproblem

  Alt 7. Nov 2005, 09:21
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
Daniel
  Mit Zitat antworten Zitat