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

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 10:27 
Hallo an alle!

Habe eine TreeComboBox, die aus einer Combobox und einem Treevwie besteht. Ich hätte gerne das Event OnCompare des Treeviews im Objektinspektor. Habe trotz durchsicht des Forums keine rechte Ahnung wie ich das hinbekomme. Vielleicht kann mir ja einer weiterhelfen. Folgend ein Auszug des Codes der Komponente.

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:
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:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
type
  TTree = class(TTreeView)
  private
    FMouseInControl: Boolean;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    function GetItemHeight: Integer;
  public
    { Public-Deklarationen }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
  published
  end;

  TFlatTreeComboBox = class(TCustomComboBox)
    Tree : TTree;
  private
    ...
    procedure WMPaint (var Message: TWMPaint); message WM_PAINT;
    procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
    procedure CMEnabledChanged (var Msg: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged (var Message: TMessage); message CM_FONTCHANGED;
    procedure WMSize (var Message: TWMSize); message WM_Size;
    function GetAutoExpand: boolean;
    procedure SetAutoExpand (VAutoExpand: boolean);
    function GetHotTrack: boolean;
    procedure SetHotTrack (VHotTrack: boolean);
    function GetPopupMenu: TPopupMenu; reintroduce;
    procedure SetPopupMenu(AValue: TPopupMenu);
    function GetTreeHeight: Integer;
    procedure SetTreeHeight(VTreeHeight: Integer);
    function GetShowRoot: boolean;
    procedure SetShowRoot(RootStatus: boolean);
    function GetChangeDelay: integer;
    procedure SetChangeDelay(VChangeDelay: Integer);
    function GetItems: TTreeNodes;
    procedure SetItems(VItems: TTreeNodes);
    function GetImages: TCustomImageList;
    procedure SetImages(VImages: TCustomImageList); reintroduce;
    function GetStateImages: TCustomImageList;
    procedure SetStateImages(VStateImages: TCustomImageList); reintroduce;
    function GetRightClickSelect: boolean;
    procedure SetRightClickSelect(VRSelect: boolean);
    function GetRowSelect: boolean;
    procedure SetRowSelect(VRowSelect: boolean);
    function GetShowButtons: boolean;
    procedure SetShowButtons(VShowButtons: boolean);
    function GetShowLines: boolean;
    procedure SetShowLines(VLines: boolean);
    function GetSortType: TSortType;
    procedure SetSortType(SortStatus: TSortType);
  protected
    procedure WndProc (var Message: TMessage); override;
    property SolidBorder: Boolean read FSolidBorder;
    procedure WMLButtonDown(var Message: TWMLButtonDown); reintroduce; message WM_LBUTTONDOWN;
    //procedure CalcAdvColors;
  public
    constructor Create (AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Color default $00E1EAEB;
    property ColorArrow: TColor index 0 read FArrowColor write SetColors default clBlack;
    property ColorArrowBackground: TColor index 1 read FArrowBackgroundColor write SetColors default $00C5D6D9;
    property ColorBorder: TColor index 2 read FBorderColor write SetColors default $008396A0;
    property TreeHeight: Integer read GetTreeHeight write SetTreeHeight;
    property ShowRoot: Boolean read GetShowRoot write SetShowRoot;
    property ChangeDelay: Integer read GetChangeDelay write SetChangeDelay;
    property Items: TTreeNodes read GetItems write SetItems;
    property PopupMenu: TPopupMenu read GetPopupMenu write SetPopupMenu;
    property AutoExpand: boolean read GetAutoExpand write SetAutoExpand;
    property HotTrack: boolean read GetHotTrack write SetHotTrack;
    property Images: TCustomImageList read GetImages write SetImages;
    property RightClickSelect: boolean read GetRightClickSelect write SetRightClickSelect;
    property RowSelect: boolean read GetRowSelect write SetRowSelect;
    property ShowButtons: boolean read GetShowButtons write SetShowButtons;
    property ShowLines: boolean read GetShowLines write SetShowLines;
    property SortType: TSortType read GetSortType write SetSortType;
    property StateImages: TCustomImageList read GetStateImages write SetStateImages;
    property DragMode;
    property DragCursor;
    property Enabled;
    ...
  end;


Vielen Dank schon mal im voraus! :D

MisterB

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.05.05 10:43 
//edit: Jetzt sollte es stimmen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
interface
  TFlatTreeComboBox = ...
  private
    procedure DoCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
  public
    constructor Create(aOwner: TComponent);
  end;

constructor TFlatTreeComboBox.Create(aOwner: TComponent);
begin
  Tree.onCompare := Self.DoCompare;
end;

procedure TFlatTreeComboBox.DoCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  if Assigned(Self.onCompare) then
    Self.onCompare(Sender, Item1, Item2, Data, Compare)
  else
    Compare := CompareText(...); //CompareText ist wohl in StrUtils drin oder so
end;


Zuletzt bearbeitet von jaenicke am Di 03.05.05 11:19, insgesamt 2-mal bearbeitet
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 11:03 
Hallo und Danke schon einmal,

leider ist die Liste der Parameter unterschiedlich und ich bekomme eine Fehlermeldung. Oder muss ich Deinen Code noch irgendwie anpassen?

Gruß MisterB
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.05.05 11:11 
Na ja, dann musst du die Parameterliste entsprechend anpassen, falls ich mich falsch erinnert habe. Wie gesagt, ich kann das jetzt nicht ausprobieren. Entscheidend ist, dass alle Parameter auch weitergegeben werden, die in onCompare stehen.

Ach so: Du musst natürlich die Methoden auch unter interface deklarieren, sonst kann's nicht gehen.

//edit: Hab den Quelltext aus Versehen in meinem letzten Post geändert. Der sollte jetzt stimmen, siehe oben...
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 11:25 
Hallo!

Also Self.OnCompare ist undefiniert. Da gibt es die ganze Zeit eine Fehlermeldung. Wie kann ich übrigens dann die property OnCompare im Interface deklarieren?

MisterB
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 11:32 
Den Code hatte ich vorher schon so abgeändert. Nur statt Item1, Item2: TListItem habe ich Node1, Node2: TTreeNode eingefügt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.05.05 11:41 
Na ja, dass Self.onCompare undefiniert ist, ist doch klar, wenn du es nicht definiert hast.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  TOnCompareEvent = procedure (Sender //... Parameter abschreiben

  //In der Kompo:
  property onCompare: TOnCompareEvent //der Rest ist wohl klar...
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 13:04 
Hallo nochmal!

Sorry aber ich habe immer noch Probleme. :oops:
Das Schreiben von Komponenten vorallem von Ereignissen ist noch neu für mich. Bekomme jetzt immer die Fehlermeldung "'oncompare' kann nicht vom Typ procedure sein". Vielleicht kannst du mir ja noch einmal einen Tip geben.

Thx :D MisterB
MisterB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP
Delphi 5 Professional
BeitragVerfasst: Di 03.05.05 14:07 
Ich habs jetzt nach einigem Probieren geschafft. Vielen Dank noch einmal!!! :mrgreen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TTree = class(TTreeView)
  private
  public
  protected
  published
  end;

  TOnCompareEvent = procedure (Sender: TObject; Node1, Node2: TTreeNode; Data: integer; var Compare: Integer) of Object;

  TFlatTreeComboBox = class(TCustomComboBox)
    Tree : TTree;
  private
    OnCompareEvent: TOnCompareEvent;
  protected
    procedure DoCompare(Sender: TObject; Node1, Node2: TTreeNode; Data: integer; var Compare: Integer);
  public
  published
    property OnCompare: TOnCompareEvent read OnCompareEvent write OnCompareEvent;
  end;



Mfg MisterB

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.