VCL活动Handles Designer.Modified;

时间:2015-07-31 07:23:39

标签: delphi delphi-7 vcl

我有一个TCustomControl后代,我一直以TGrid为例。在其鼠标,ScrollBar和键盘事件中,在决定是否调用Invalidate()时,他们会使用以下内容:

  1. HandleAllocated

  2. ParentForm.ActiveControl = Self

  3. (csDesigning in ComponentState)

  4. ParentForm.Designer.Modified

  5. 现在,当你能够而且不应该使用这些测试来允许Invalidate被调用时,有什么规则?这是正确的说法吗?

    为什么Handle消失而不是以其他方式处理?

    请告诉我IDesigner,因为我之前从未使用过它。

    最后,他们是否是用户使用该组件且Handle无法使用的时间?

    我看到在TCustomControl之后制作一个对象,用于测试消息中的所有事件:

    If HandleAllocated and (ParentForm.ActiveControl = Self) and (csDesigning in ComponentState)
    

    我猜这里,但为什么不覆盖Invalidate()并在inherited Invalidate;Handle时调用Canvas,因为Handle需要self.circle = [CAShapeLayer layer]; self.circle.fillColor = nil; self.circle.lineWidth = 12; self.circle.strokeColor = [UIColor orrange].CGColor; self.circle.bounds = CGRectMake(0, 0, 200, 200); self.circle.path = [UIBezierPath bezierPathWithOvalInRect:self.circle.bounds].CGPath; [self.view.layer addSublayer:self.circle]; CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; drawAnimation.duration = 20.0; drawAnimation.repeatCount = 1.0; drawAnimation.removedOnCompletion = NO; drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; drawAnimation.toValue = [NSNumber numberWithFloat:1.0f]; drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; [self.circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"]; }。这可能会很晚才看到,但会使代码稳定下来。

2 个答案:

答案 0 :(得分:0)

  

现在规则是什么时候你可以而且不应该使用这些测试来允许Invalidate继续进行。

测试与Invalidate()本身无关。特别是csDesigning检查是一个死的赠品,该组件在设计时的行为与在运行时的行为不同。

  

为什么手柄会消失而不会以其他方式处理。

VCL窗口不是持久的。在应用程序的生命周期中,它们可以并且确实被破坏并动态地重新创建。设置某些属性,或者隐藏和显示表单等时可能会发生这种情况。如果组件想要使用其Handle但不强制立即重新创建,则可以在使用{HandleAllocated之前检查Handle {1}}。

  

告诉我关于IDesigner的事情,因为我之前从未使用过它?

它是一个允许组件在设计时与表单设计器进行交互的界面。最常见的用途是调用Designer.Modified让表单设计器和对象检查器知道某些内容已发生变化,需要他们自行更新。

  

最后是用户使用该组件并且句柄也无法使用的时间?

是的,它可能会发生。

  

如果HandleAllocated和(ParentForm.ActiveControl = Self)和(csDesigning在ComponentState中)。我猜是听到了,但为什么不重写Invalidate并调用Inherited Invalidate;如果句柄是他们的

这需要有人打电话给Invalidate()。而且,更重要的是,它会在所有情况下强加对{strong>每次调用Invalidate()的限制,而不是仅限于在设计时采取不同行为的特定代码段中的限制与运行时间。

  

因为画布需要一个手柄。

在绘制操作期间,操作系统将OS提供给控件。但是,当控件没有窗口时,它不会被绘制。

答案 1 :(得分:0)

鼠标按下获得焦点。并在调用invalidate时检查焦点或手柄以保护画布错误。但这个想法是在改变数据之前确定焦点。