Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi zwei Checkboxen verknüpfen (https://www.delphipraxis.net/18136-zwei-checkboxen-verknuepfen.html)

Pascal 15. Mär 2004 13:27


zwei Checkboxen verknüpfen
 
Hallo!

Ich habe ein kleines Problem und momentan nicht die Zeit, mir den Kopf darüber zu zerbrechen, vielleicht weiß zufällig jemand von euch eine Lösung.

Ich brauche für ein Programm zwei Spalten, in denen Checkboxen angezeigt werden. Nachdem ich keine passende Komponente gefunden habe, dachte ich mir, ich platziere zwei Checkboxen nebeneinander und synchronisiere diese. Heißt, ich überlappe eine Checkbox und falls der Anwender mit dem Scrollbalken die Ansicht verändert, ziehe ich die andere Checkbox einfach mit.
Idee ist im Prinzip einfach, wenn es ein Ereignis OnScroll gäbe. Gibt es aber nicht!!
Weiß jemand, wie ich mitbekomme, wenn der Anwender auf den Scrollbalken der Checkbox klickt?

Jens Schumann 15. Mär 2004 13:29

Re: zwei Checkboxen verknüpfen
 
Hallo,
zeig mal wie ein TCheckBox mit Scrollbalken aussieht. Habe ich noch nie gesehen

Pascal 15. Mär 2004 13:32

Re: zwei Checkboxen verknüpfen
 
Natürlich meine ich CheckListBoxen, dann gibt es auch einen Scrollbalken!!

Jens Schumann 15. Mär 2004 13:41

Re: zwei Checkboxen verknüpfen
 
Hallo,
Fensterprocedure durch eigene ersetzen und auf die Messages WM_VSCROLL und WM_HSCROLL reagieren.

Matze 15. Mär 2004 13:47

Re: zwei Checkboxen verknüpfen
 
Das musst du halt nur auf deine CheckListboxen übertragen, drüfte aber kein Problem sein.
Das ist das, was Jens gemeint hat. ;)

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
       OldGridProc1, OldGridProc2: TWndMethod;
   procedure Grid1WindowProc(var Message: TMessage);
   procedure Grid2WindowProc(var Message: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Grid1WindowProc(var Message: TMessage);
begin
  OldGridProc1(Message);
  if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or
      (Message.Msg = WM_Mousewheel)) then
  begin
    OldGridProc2(Message);
  end;
end;

procedure TForm1.Grid2WindowProc(var Message: TMessage);
begin
  OldGridProc2(Message);
  if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or
     (Message.msg = WM_Mousewheel)) then
  begin
    OldGridProc1(Message);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldGridProc1 := ListBox1.WindowProc;
  OldGridProc2 := ListBox2.WindowProc;
  ListBox1.WindowProc := Grid1WindowProc;
  ListBox2.WindowProc := Grid2WindowProc;
end;

Pascal 15. Mär 2004 13:48

Re: zwei Checkboxen verknüpfen
 
Hallo,

wie binde ich die Fensterprocedure ein??
Hab ich noch nie gemacht! :pale:

[Ups, vergiss es! Vielen Dank Matze! Kann man die leichte zeitliche Verzögerung auch noch elegant vertuschen??]

Matze 15. Mär 2004 13:50

Re: zwei Checkboxen verknüpfen
 
Wahrscheinlist hast du meinen Beitrag verpasst, auf jedenfall steht's da drin. ;)

Jens Schumann 15. Mär 2004 14:27

Re: zwei Checkboxen verknüpfen
 
Hallo,
ich musste mal vor langer Zeit TScrollboxen synchronisieren.
Da habe ich mir einen Nachfahren gebastelt.
Mit dem Prinzip kann man X Komponenten synchronisieren.
Die TScrollboxen , die synchronisiert werden sollen erhalten den gleichen GroupIndex.
Außerdem liefert die Komponente auch ein OnVScroll und ein OnHScroll Event.
Muss eben nur noch auf TCheckBox übertragen werden.
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;
    FGroupIndex: Integer;
    fOnHScroll: TScrollEvent;
    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;
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner : TComponent); override;
  published
    { Published-Deklarationen }
    property GroupIndex : Integer read FGroupIndex write SetGroupIndex default 0;
    property OnVScroll : TScrollEvent read fOnVScroll write fOnVScroll;
    property OnHScroll : TScrollEvent read fOnHScroll write fOnHScroll;
  end;

procedure Register;

implementation

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

{ TScrollBoxEx }

constructor TScrollBoxEx.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FGroupIndex:=0;
  fOnVScroll:=Nil;
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;

end.
Ach ja, die TScrollBoxen müssen den gleichen Parent haben.

Matze 15. Mär 2004 17:43

Re: zwei Checkboxen verknüpfen
 
@Pascal: Könntest du denn Titel ändern, es handelt sich ja nun um Checklistboxen und nicht um Checkboxen.

Sonst findest man diesen Thread in der Suche nie. :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz