AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListBox scrolled?

Ein Thema von NeoXan · begonnen am 29. Jan 2005 · letzter Beitrag vom 1. Feb 2005
Antwort Antwort
NeoXan
(Gast)

n/a Beiträge
 
#1

TListBox scrolled?

  Alt 29. Jan 2005, 10:13
Moin,

wie bekomme ich heraus ob eine TListbox gerade gescrollt wird (oben & unten) und wie kannn ich dann eine andere TListBox auch scrollen, so dass sie immer die gleiche Position haben?

mfg
NeoXan
  Mit Zitat antworten Zitat
Benutzerbild von Chegga
Chegga

Registriert seit: 5. Nov 2004
Ort: Kirchheim
453 Beiträge
 
Delphi 7 Architect
 
#2

Re: TListBox scrolled?

  Alt 29. Jan 2005, 11:08
Hi,

wenn ich es richtig verstanden habe,
meinst du vielleicht sowas:

Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
  case ListBox1.ItemIndex of
   0: ListBox2.ItemIndex := 0;
   1: ListBox2.ItemIndex := 1;
   2: ListBox2.ItemIndex := 2;
// . . . .
// . . . .
// . . . .
  end;
end;
Oder?

MfG Marc
Marc P.
Grüße aus Kirchheim Teck
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: TListBox scrolled?

  Alt 29. Jan 2005, 12:15
Zitat von Chegga:
Delphi-Quellcode:
case ListBox1.ItemIndex of
   0: ListBox2.ItemIndex := 0;
   1: ListBox2.ItemIndex := 1;
   2: ListBox2.ItemIndex := 2;
// . . . .
Wie wäre es mit
Listbox2.ItemIndex:=Listbox1.ItemIndex ?
ItemIndex ist aber der markierte Eintrag, hier müsste man TopIndex verwenden.
Listbox2.TopIndex:=Listbox1.TopIndex Ich habe aber leider kein geeignetes Event gefunden, versuch es mal mit einem Timer oder vielleicht Messages.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Chegga
Chegga

Registriert seit: 5. Nov 2004
Ort: Kirchheim
453 Beiträge
 
Delphi 7 Architect
 
#4

Re: TListBox scrolled?

  Alt 29. Jan 2005, 12:49
Zitat von Khabarakh:
ItemIndex ist aber der markierte Eintrag, hier müsste man TopIndex verwenden.
Listbox2.TopIndex:=Listbox1.TopIndex
Hm...

Kompromiss:

Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Listbox2.TopIndex := Listbox1.ItemIndex;
end;
MfG Marc
Marc P.
Grüße aus Kirchheim Teck
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#5

Re: TListBox scrolled?

  Alt 29. Jan 2005, 13:18
Hai ihr zwei,

es wurde doch nach dem Scrollen gefragt und nicht nach dem selektieren eines Items.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#6

Re: TListBox scrolled?

  Alt 29. Jan 2005, 13:35
Zitat von Sharky:
Hai ihr zwei,
es wurde doch nach dem Scrollen gefragt und nicht nach dem selektieren eines Items.
richtig

Möglich wäre es doch irgendwie mit WM_blablub zu überprüfen, ob gerade z.B. nach unten gescrollt wird und dann die andere Listbox um die gleiche Anzahl an px Scrollen?!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: TListBox scrolled?

  Alt 29. Jan 2005, 13:55
Zitat von Sharky:
Hai ihr zwei,

es wurde doch nach dem Scrollen gefragt und nicht nach dem selektieren eines Items.
TopIndex liefert den obersten sichtbaren Eintrag, dafür muss er nicht selektiert sein, also ist meine Code-Zeile schon richtig. Man muss sie nur noch an einer geeigneten Stelle einfügen.

Wenns jemand immer noch nicht glauben will :
Angehängte Dateien
Dateityp: rar listboxes_387.rar (158,3 KB, 24x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#8

Re: TListBox scrolled?

  Alt 29. Jan 2005, 14:07
Hallo,
das ist dank der OOP eigentlich kein Problem. Ich habe sowas mal für TSrcollbox benötigt.
D.h. wenn eine TScrollbox gescrollt wird soll die andere (oder mehrere) synchron mitscrollen.
Hier kommt der Source für die TScrollBox. Sollte sich leicht auf eine TListbox übertragen lassen.
Delphi-Quellcode:
unit ScrollBoxEx;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

Const
  CM_SCROLLBOXEXVERTSCROLL = WM_USER+512;
  CM_SCROLLBOXEXHORIZSCROLL = WM_USER+513;

type

  TScrollEvent = procedure (Sender : TObject; Position : Integer) of Object;

  TScrollBoxEx = class(TScrollBox)
  private
    FOnVScroll : TScrollEvent;
    fOnHScroll : TScrollEvent;
    FGroupIndex : Integer;
    FWallpaper : TBitmap;
    FCanvas : TControlCanvas;
    procedure SetGroupIndex(const Value: Integer);
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
    procedure CMSCROLLBOXEXVERTSCROLL(var Message: TMessage); message CM_SCROLLBOXEXVERTSCROLL;
    procedure CMSCROLLBOXEXHORIZSCROLL(var Message: TMessage); message CM_SCROLLBOXEXHORIZSCROLL;
    procedure SetWallpaper(const Value: TBitmap);
    procedure PaintTileWallpaper(CanvasHandle: THandle; WndRect : TRect);
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    procedure PaintWindow(DC: HDC); override;
  public
    { Public-Deklarationen }
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property GroupIndex : Integer read FGroupIndex write SetGroupIndex default 0;
    property Wallpaper : TBitmap read FWallpaper write SetWallpaper;
    property OnHScroll : TScrollEvent read fOnHScroll write fOnHScroll;
    property OnVScroll : TScrollEvent read fOnVScroll write fOnVScroll;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Mycomps', [TScrollBoxEx]);
end;

{ TScrollBoxEx }

constructor TScrollBoxEx.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FWallpaper:=TBitmap.Create;
  FCanvas:=TControlCanvas.Create;
  FCanvas.Control:=Self;
  FGroupIndex:=0;
  fOnVScroll:=Nil;
end;

destructor TScrollBoxEx.Destroy;
begin
  FWallpaper.Free;
  FCanvas.Free;
  inherited Destroy;
end;

procedure TScrollBoxEx.SetGroupIndex(const Value: Integer);
begin
  FGroupIndex := Value;
end;

procedure TScrollBoxEx.WMHScroll(var Message: TWMHScroll);
var
  Msg: TMessage;
begin
  inherited;
  If Assigned(fOnHScroll) then
    fOnHScroll(Self,Message.Pos);
  if (FGroupIndex <> 0) and (Parent <> nil) then
  begin
    Msg.Msg := CM_SCROLLBOXEXHORIZSCROLL;
    Msg.WParam := FGroupIndex;
    Msg.LParam := Longint(Self);
    Msg.Result := 0;
    Parent.Broadcast(Msg);
  end;
end;

procedure TScrollBoxEx.WMVScroll(var Message: TWMVScroll);
var
  Msg: TMessage;
begin
  inherited;
  If Assigned(fOnVScroll) then
    fOnVScroll(Self,Message.Pos);
  if (FGroupIndex <> 0) and (Parent <> nil) then
  begin
    Msg.Msg := CM_SCROLLBOXEXVERTSCROLL;
    Msg.WParam := FGroupIndex;
    Msg.LParam := Longint(Self);
    Msg.Result := 0;
    Parent.Broadcast(Msg);
  end;
end;

procedure TScrollBoxEx.CMSCROLLBOXEXVERTSCROLL(var Message: TMessage);
var
  Sender: TScrollBoxEx;
begin
  inherited;
  If FGroupIndex<=0 then Exit;
  if Message.WParam = FGroupIndex then
  begin
    Sender := TScrollBoxEx(Message.LParam);
    if Sender <> Self then
    begin
    VertScrollBar.Position:=Sender.VertScrollBar.Position;
    end;
  end;
end;

procedure TScrollBoxEx.CMSCROLLBOXEXHORIZSCROLL(var Message: TMessage);
var
  Sender: TScrollBoxEx;
begin
  inherited;
  If FGroupIndex<=0 then Exit;
  if Message.WParam = FGroupIndex then
  begin
    Sender := TScrollBoxEx(Message.LParam);
    if Sender <> Self then
    begin
    HorzScrollBar.Position:=Sender.HorzScrollBar.Position;
    end;
  end;
end;

procedure TScrollBoxEx.SetWallpaper(const Value: TBitmap);
begin
  FWallpaper.Assign(Value);
  Invalidate;
end;

procedure TScrollBoxEx.PaintTileWallpaper(CanvasHandle: THandle; WndRect : TRect);
var
  Row : Integer;
  Col : Integer;
begin
  For Row := 0 to (WndRect.Bottom div FWallpaper.Height)+1 do
    For Col := 0 to (WndRect.Right div FWallpaper.Width)+1 do
      BitBlt(CanvasHandle,
             Col * FWallpaper.Width,
             Row * FWallpaper.Height,
             FWallpaper.Width,
             FWallpaper.Height,
             FWallpaper.Canvas.Handle,
             0,
             0,
             SRCCOPY);
end;

procedure TScrollBoxEx.PaintWindow(DC: HDC);
begin
  FCanvas.Lock;
  Try
    FCanvas.Handle := DC;
    If (FWallpaper.Width>0) and (FWallPaper.Height>0) then
      PaintTileWallpaper(FCanvas.Handle,ClientRect);
  Finally
    FCanvas.Handle := 0;
    FCanvas.UnLock;
  end;
end;

end.
Wichtig ist das abfangen der Botschaften WM_HSCROLL und WM_VSCROLL
Delphi-Quellcode:
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
In innerhalb der Implementation passiert folgendes:
Delphi-Quellcode:
procedure TScrollBoxEx.WMHScroll(var Message: TWMHScroll);
var
  Msg: TMessage;
begin
  inherited; // Vorfahren aufrufen
  If Assigned(fOnHScroll) then
    fOnHScroll(Self,Message.Pos); // Event abfeuern
  if (FGroupIndex <> 0) and (Parent <> nil) then
  begin
    Msg.Msg := CM_SCROLLBOXEXHORIZSCROLL; // Messagewert setzen
    Msg.WParam := FGroupIndex; // den GroupIndex in wParam
    Msg.LParam := Longint(Self); // Wichtig Referenz auf sich selbst in lParam schreiben
    Msg.Result := 0;
    Parent.Broadcast(Msg); // Mit der Methode BroadCast des Parents die Botschafte an alle
                           // TWinControls senden, die den gleichen Parent haben.
                           // Habe ich bei TSpeedbutton angekupfert.
  end;
end;
Ist die Botschaft abgeschickt, wird sie durch folgende Methode verarbeitet.
Delphi-Quellcode:
...
procedure CMSCROLLBOXEXHORIZSCROLL(var Message: TMessage); message CM_SCROLLBOXEXHORIZSCROLL;
...
procedure TScrollBoxEx.CMSCROLLBOXEXHORIZSCROLL(var Message: TMessage);
var
  Sender: TScrollBoxEx;
begin
  inherited;
  If FGroupIndex<=0 then Exit; // Wenn kein GroupIndex definiert Methode sofort verlassen
  if Message.WParam = FGroupIndex then // Wenn in wParam der gleiche GroupIndex steht dann
  begin
    Sender := TScrollBoxEx(Message.LParam);
    if Sender <> Self then // Hat der Sender die Botschaft empfangen ? Wenn ja ignorieren
    begin
    HorzScrollBar.Position:=Sender.HorzScrollBar.Position; // Scrollbarposition setzen
    // Bei TListbox könnte hier ItemIndex gesetzt werden.
    end;
  end;
end;
I come from outer space to save the human race
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#9

Re: TListBox scrolled?

  Alt 1. Feb 2005, 07:24
...puuuh....ok, und jetzt das ganze nochmal für einen Neuling
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

Re: TListBox scrolled?

  Alt 1. Feb 2005, 08:06
In diesem Thread gibt's auch was zu dem Thema...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz