habe leider ein Problem mit dem Ereignis DblClick für Splitter. Ich möchte, dass beim Doppelklick auf den Splitter das entsprechende Panel aus- und bei erneutem Doppelklick wieder eingeblendet wird oder alternativ die Breite auf 0 verkürzt bzw. verbreitert wird. Was mit einem Button wunderbar funktioniert, ist mit dem Splitter nur möglich, wenn im entsprechenden Code ShowMessage aufgerufen wird.
Ich bin blutiger Anfänger und vermute, dass das Problem mit Moved zusammenhängt und die Anweisung ShowMessage dieses vielleicht kurzfristig außer Kraft setzt.
Damit mein Problem leichter nachvollziehbar ist, habe ich ein einfaches Formular mit 5 TPanels, 2 TSplittern und 2 TButtons erstellt:
Die Komponenten erhielten folgende Namen und Eigenschaften:
PanelTop: align alTop
PanelLeft: align alLeft
PanelRight: align alRight
PanelBottom: align alBottom
SplitterLeft: align alLeft
SplitterRight: align alRight
PanelCenter: align alClient
ButtonLeft und ButtonRight: (beide in PanelTop)
Hier der Code der unit:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
ButtonLeft: TButton;
ButtonRight: TButton;
PanelTop: TPanel;
PanelLeft: TPanel;
PanelRight: TPanel;
PanelBottom: TPanel;
PanelCenter: TPanel;
SplitterLeft: TSplitter;
SplitterRight: TSplitter;
procedure FormCreate(Sender: TObject);
procedure ButtonLeftClick(Sender: TObject);
procedure ButtonRightClick(Sender: TObject);
procedure SplitterLeftDblClick(Sender: TObject);
procedure SplitterRightDblClick(Sender: TObject);
private
public
end;
TDoubleClickSplitter = class(TSplitter)
Property OnDblClick;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
TDoubleClickSplitter(SplitterLeft).OnDblClick := @SplitterLeftDblClick;
TDoubleClickSplitter(SplitterRight).OnDblClick := @SplitterRightDblClick;
end;
procedure TForm1.SplitterLeftDblClick(Sender: TObject);
begin
if PanelLeft.width > 1 then
begin
PanelLeft.width :=0;
ShowMessage(''); // ohne Message verschwindet Panel kurz, dann wieder sichtbar
end
else
begin
PanelLeft.width := 150;
ShowMessage(''); // ohne Message blitzt Panel kurz auf, verschwindet dann wieder
end;
end;
procedure TForm1.ButtonLeftClick(Sender: TObject);
begin
if PanelLeft.width > 1 then
begin
PanelLeft.width :=0;
end
else
begin
PanelLeft.width := 150;
end;
end;
procedure TForm1.SplitterRightDblClick(Sender: TObject);
begin
if PanelRight.visible = true then
begin
PanelRight.visible := false;
end
else
begin
PanelRight.visible := true;
ShowMessage(''); // ohne Message blitzt Panel kurz auf, verschwindet dann wieder
end;
end;
procedure TForm1.ButtonRightClick(Sender: TObject);
begin
if PanelRight.visible = true then
begin
PanelRight.visible := false;
end
else
begin
PanelRight.visible := true;
end;
end;
end.
mfg Werner