Я создаю пользовательский элемент управления (унаследованный от TCustomControl
) в Delphi XE2 (и у меня была эта проблема в других моих элементах управления), и во время разработки я не могу щелкнуть их. Я знаю, что это связано с захватом мыши, перехватом событий мыши и обработкой их во время разработки иначе, чем во время выполнения, но я не знаю, как правильно приспособиться к этому. Другими словами, из многих обходных путей, которые я могу придумать, я не могу решить, какой из них является правильным (или наиболее эффективным).
Я уверен, что для этого должен быть какой-то очень простой стандарт, скорее всего, использующий ControlStyle
или CreateParams
, но не знаю что.
В этом конкретном элементе управления (и я не видел шаблона в этой проблеме) я перехватываю сообщения, включая WM_NCHITTEST
и WM_LBUTTONDOWN
. Во время разработки элемент управления на 100% активен, как если бы он был во время выполнения, и при щелчке он вместо этого выполняет код времени выполнения.
У меня есть ощущение, что это в моем обработчике тестовых сообщений, так что вот этот код (некоторые вещи переименованы):
procedure TMyCustomControl.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint;
Poly: TPoints;
X: Integer;
I: TMyCollectionItem;
Ch: Bool; //Need to improve invalidation
begin
Ch:= False;
P:= ScreenToClient(Point(Message.Pos.X, Message.Pos.Y));
for X := 0 to Items.Count - 1 do begin
I:= Items[X];
Poly:= I.Points;
FMouseIndex:= -1;
FMouseState:= bmNone;
if PointInPolygon(P, Poly) then begin //checks if point is within polygon
FMouseIndex:= X;
FMouseState:= bmHover;
Ch:= True;
Break;
end;
end;
if Ch then Invalidate;
end;
А также конструктор моего управления (раздетый):
constructor TMyCustomControl.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:= ControlStyle - [csDesignInteractive];
end;