我自己写了一个控件继承了TCustomEdit.添加了一个功能:在Edit右边内部添加了一块按钮。出现了
这样一些问题:
1、内部按钮本来是填充有颜色,但是当Edit获得焦点(点进去)时,填充色就变为白色了。
2、当我动态赋值的时候。里面值不会变化必须获得焦点才能看到(点进去).
procedure TForm1.Button3Click(Sender: TObject);
begin
   I := I + 1;
  Self.Edit1.Text := IntToStr(I);
  Self.SpreadEdit1.Text := IntToStr(I);
end;
请问怎么解决?

解决方案 »

  1.   

    应该是setText 那个函数里面没有调用
    refresh, repaint, Invalidate 之类的函数,最好将关键代码贴出
      

  2.   

    procedure TSpreadEdit.WMPaint(var Message: TWMPaint);
    var
      DC: HDC;
      PS: TPaintStruct;  
    begin
      if FCanvas = nil then
        begin
          FCanvas := TControlCanvas.Create;
          FCanvas.Control := Self;
        end;  DC := Message.DC;  if DC = 0 then
        DC := BeginPaint(Handle, PS); //window ApI  FCanvas.Handle := DC;
      try
        FCanvas.Font := Font;    if (FButtonStyle = bsDropdown) then
          begin
            DrawSelectType(FCanvas); //下拉按钮
          end;
      finally
        FCanvas.Handle := 0;
      end;
    end;
    procedure TSpreadEdit.DrawSelectType(ACanvas: TControlCanvas);
    var
      ARect: TRect;
      ATop, ALeft, ARight, ABottom, AWidth, AHeight: Integer;
    begin
      with ACanvas do
        begin
          {填充附加按钮 默认宽为20; 如果小于此标准按实际宽与高}
          if (ClientWidth > ButtonWidth) then
            begin
              SetRect(ARect, ClientWidth - ButtonWidth, 0,  ClientWidth,  ClientHeight);
            end
          else
            begin
              SetRect(ARect, ClientWidth, 0,  ClientWidth,  ClientHeight);
            end;      Brush.Color := ButtonColor;
          FillRect(ARect);
          Frame3D(FCanvas, ARect, clBtnHighlight, clBtnShadow, 2);      {画三角.默认宽为8; 高为6; 如果小于此标准按实际宽与高}
          Brush.Color := ButttonFillColor;
          AWidth := 8;
          AHeight := 4;
          
          if (AWidth > (ARect.Right - ARect.Left)) then
            begin
              AWidth := ARect.Right - ARect.Left;
            end;
          if (AHeight > (ARect.Bottom - ARect.Top))then
            begin
              AHeight := ARect.Bottom - ARect.Top;
            end;
          ATop := ARect.Top + (ARect.Bottom - ARect.Top - AHeight) div 2;
          ABottom := ARect.Bottom - (ARect.Bottom - ARect.Top - AHeight) div 2;
          ALeft := ARect.Left + (ARect.Right - ARect.Left - AWidth) div 2;
          ARight := ARect.Right - (ARect.Right - ARect.Left - AWidth) div 2;
     
          Polygon([Point(ALeft , ATop),
                   Point(ARight, ATop),
                   Point(((ARight - ALeft) div 2 + ALeft) , ABottom)]);    end; 
    end;这是关键代码了。
      

  3.   

    TCustomEdit由系统绘制,所以会出现你这样的问题。
    你的代码中缺少的就是使用EM_SETRECTNP来重新设置edit的编辑区域和调用DefaultHandler来调用edit的系统绘制过程。
    大概的修改过程如下:
    首先:
      由于EM_SETRECTNP只对多行edit有效,所以需要重载CreateParams,如下:
      procedure CreateParams(var Params: TCreateParams); override;
      里面的代码应如下:
      inherited CreateParams(Params);
      Params.Style := Params.Style or ES_MULTILINE;
    其次:
      需要在DrawSelectType中使用EM_SETRECTNP来对edit的编辑区域进行设置,代码如下:
      SendMessage(Self.Handle, EM_SETRECTNP, 0, LongInt(@ARect1));
      其中的ARect1是个TRect就是需要设置的编辑区域,也就是edit除去绘制按钮的其他区域
    最后:
      在WMPaint中调用DefaultHandler,在finally之前调用即可,代码如下:
      var
        msg: TMessage;
      msg.Msg := WM_PAINT;
      msg.WParam := FCanvas.Handle;
      msg.LParam := 0;
      msg.Result := 0;
      DefaultHandler(msg);
    另外:
      调用BeginPaint需相应调用EndPaint,在finally中加入如下代码:
      if Message.DC = 0 then EndPaint(Handle, PS);以上所有代码仅供参考
    建议:
      多看看vcl源码,很多情况下你可以看到与你问题相似的东西,然后发现解决问题的方法