-
Есть наследник TCustomControl - TStGraphNode. Это такскаемый за любое место элемент схемы. Вот всё объявление класса: type TStGraphNode = class(TCustomControl) private { Private declarations } FCycle: Boolean; FRgnHandle: THandle; FColor: TColor; FSize: Byte; Procedure WMNCHitTest(Var Msg: TWMNCHitTest); Message WM_NCHitTest; procedure SetColor(const Value: TColor); function GetCenter: TPoint; procedure SetCenter(const Value: TPoint); protected { Protected declarations } Procedure Paint; override; Procedure SetParent(AParent: TWinControl); override; public { Public declarations } constructor Create(AOwner: TComponent; ASize: Byte; ACycle: Boolean = false); reintroduce; published { Published declarations } Property Color: TColor read FColor write SetColor; Property Cycle: Boolean read FCycle; Property Center: TPoint read GetCenter write SetCenter; end;
Прямо у конструкторе присваиваю менюшку: constructor TStGraphNode.Create(AOwner: TComponent; ASize: Byte; ACycle: Boolean = false); begin inherited Create(AOwner); Width := ASize; Height := ASize; FCycle := ACycle; FSize := ASize; PopupMenu := MainForm.PopupMenu2;
If FCycle then FRgnHandle := CreateEllipticRgn(0, 0, Width, Height) else FRgnHandle := 0; end
В главной форме эти компоненты создаются динамически: procedure TMainForm.CreateNode(Size: Byte; IsQuadrat: Boolean); var NewGraphNode: TStGraphNode; begin NewGraphNode := TStGraphNode.Create(Self, Size, IsQuadrat); NewGraphNode.Parent := Self; end;
Так вот у них не появляется PopupMenu, а она очень нужна. Без этой менюшки они вообще не нужны :( Как с этом бороться?
-
Попытка перенести назначение PopupMenu в процедуру создания после присвоения Parent, ничего не дала
-
Вопрос снят. Дело в том, что для того, чтобы можно было мышкой таскать, я написал: procedure TStGraphNode.WMNCHitTest(var Msg: TWMNCHitTest); begin Inherited;
If Msg.Result = htClient then Msg.Result := htCaption; end; Всё в это упираетмя. То есть, система считает, что мышь всегда на капшене. Поэтому менюшка и не появляется и не появится никогда.
-
Для перетаскивания наверное лучше перегрузить MouseDown и написать: ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0);
-
Просто я уже написал это и трогать не хочется.
|