Autor Beitrag
MisterB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Fr 06.05.05 17:35 
Hallo an alle!

Habe eine TreeComboBox aus einem Treeview und einer ComboBox. Wie bekomme ich das Ereigniss VisibleChanded des Treeviews als property in die Ereignissliste der Komponente. Mit dem OnExpanded Ereigniss habe ich das schon hinbekommen (mit Hilfe) aber wie gesagt mit VisibleChanded Ereignis habe ich Probleme. Für den Durchblick noch ein bißchen Code!

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
type
  TTree = class(TTreeView)
  private
    procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
 end;

  TOnExpandedEvent = procedure(Sender: TObject; Node: TTreeNode) of object;

  TFlatTreeComboBox = class(TCustomComboBox)
    Tree : TTree;
  private
    OnExpandedEvent: TOnExpandedEvent;
  protected
    procedure TreeExpanded(Sender: TObject; Node: TTreeNode);  public
  public  
    constructor Create (AOwner: TComponent); override;
  published
    Property OnExpanded: TOnExpandedEvent read OnExpandedEvent write OnExpandedEvent;
  end;  

implementation

procedure TTree.CMVisibleChanged(var Message: TMessage);
begin
  Showmessage('test');
end;

constructor TFlatTreeComboBox.Create (AOwner: TComponent);
begin
  inherited Create(AOwner);
  ...
  Tree.OnExpanded:=Self.TreeExpanded;
end;

procedure TFlatTreeComboBox.TreeExpanded(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(Self.OnExpanded) then Self.OnExpanded(Sender, Node);
end;
end.


Thx for your Help! :lol:

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Sa 07.05.05 08:04 
Hallo!

Du musst einfach in der CMVisibleChanged Procedure ein eigenes Event auslösen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TOnVisibleChangedEvent = Proedure (Sender: TObject) of object;

  TTree = class(TTreeView)
    fOnVisibleChanged: TOnVisibleChangedEvent;
  private
    procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
  published
    property OnVisibleChanged: TOnVisibleChangedEvent read fOnVisibleChanged write fOnVisibleChange;
end;

{...}

procedure TTree.CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
begin
  if assigned (fOnVisibleChanged) Then
    fOnVisibleChanged (Self);
end;

Dieses neue OnVisibleChanged-Event musst du natürlich dann noch in deiner TFlatTreeComboBox Komponente benutzen.

Gruß
Tino
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Sa 07.05.05 19:13 
Ja Danke, so funktioniert es. Jetzt habe ich nur das Problem, dass mit der Ereignissabfrage CM_VISIBLECHANGED mein Treeview nicht mehr angezeigt wird. Normalerweise wird dieser, mit dem Setzen von Visible auf true, bei der Betätigung des Buttons an der TreeCombobox angezeigt. Habe keine Ahnung wie ich das beheben kann.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
TTree = class(TTreeView)
  private
    OnVisibleChanged: TOnVisibleChangedEvent;
    FMouseInControl: Boolean;
    procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
    ...
  protected
    ...
  published
  end;

 TFlatTreeComboBox = class(TCustomComboBox)
    Tree : TTree;
  private
    OnVisibleChangedEvent: TreeOnVisibleChangedEvent;
  protected
    procedure WMLButtonDown(var Message: TWMLButtonDown); reintroduce; message WM_LBUTTONDOWN;
    procedure TreeVisibleChanged(Sender: TObject);
  public
    constructor Create (AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnVisibleChanged: TreeOnVisibleChangedEvent read OnVisibleChangedEvent write OnVisibleChangedEvent;
  end;

implementation

procedure TTree.CMVisibleChanged(var Message: TMessage);
begin
  //if assigned (OnVisibleChanged) Then OnVisibleChanged (Self);
end; 

procedure TFlatTreeComboBox.WMLButtonDown(var Message: TWMLButtonDown);
var
  CP, SP: TPoint;
  i, j: integer;
begin
  CP.X := Left;
  CP.Y := Top + Height;
  SP := Parent.ClientToScreen(CP);
  If HeightIndex = 0 then THeight:=TreeHeight;
  with Tree do
  begin
    Left := SP.X;
    Top := SP.Y;
    Width := Self.Width;
    if Enabled = False then
    begin
      if Tree.Items.Count = 0 then Tree.Height := Tree.GetItemHeight
      else
      begin
        j:=0;
        for i:=0 to Tree.Items.Count-1 do
        begin
          if Tree.Items[i].IsVisible = true then j:=j+1;
        end;
        if 5+j*Tree.GetItemHeight <= THeight then Tree.Height:=5+j*Tree.GetItemHeight
        else Tree.Height:=THeight;
      end;
      Enabled := True;
      Visible := True;
      SetCaptureControl(Tree);
    end
    else begin
      Enabled := False;
      Visible := False;
      ReleaseCapture;
    end;
  end;
  PaintButton;
  HeightIndex:=1;
end;


MisterB