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.
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