Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 308
  • Last Modified:

Alike editbox text action

I try to type into my TCustomControl a text. When the text length is bigger than my VCL width I wish to move the text to left as my rest part to fit into my canvas.

I try now to lead with Canvas.TextWidth but don't work very well :( Any unknown by me message to deal with text as TEdit ?

Any solution for this ? I will continue my work, but maybe someone have a better idea.
0
ginsonic
Asked:
ginsonic
  • 4
  • 3
  • 2
  • +2
4 Solutions
 
shaneholmesCommented:
Do you want it to work like to TEdit?

What is your canvas space?

SHane
0
 
ginsonicAuthor Commented:
Is width:=width-6 ( border 3 pixels left+3pixel rigth )
   heigth:=height-6 ( same idea );

But we can talk about a generic Width.Heigth
0
 
mokuleCommented:
Hi
What about ?

    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
shaneholmesCommented:
You will need to test for a CMTextChanged message, then compare the TextWidth against the workarea of your control.
 If its greater, then repaint the text, minus the overlapping width.


Shane
0
 
ginsonicAuthor Commented:
I do already this but look alike my Canvas.TextWidth(Text)-6 ( the border ) don't work well for different fonts size. The Font is assigned to Canvas.Font;
0
 
shaneholmesCommented:
Did you try using the TextExtent method

 - Returns the width and height, in pixels, of a string rendered in the current font.

Shane
0
 
mokuleCommented:
Shane:
TextExtent returns the same width as TextWidth.

ginsonic:
What fonts do You try? Can precise what does that mean don't  work well?
0
 
shaneholmesCommented:
Mokule - I know its the same width - thanks for the education.....

I was letting ginsonic know about the method case he didn't know it existed, seeing he is creating a derived control from TCustomControl, and he might want to adjust the height as well, due to different fonts (which effect not only width)

How about that Mr. Snap!

Shane
0
 
Slick812Commented:

I always use the API DrawText  function for any text that I need to be within a Rectangle or looks like some windows control

var
TextRect: TRect;
Text: String;
Format: Cardinal;
begin
Text := 'This is the text to put in the Rectangle';
TextRect := Rect(3,3, width-6, height-6); // set this Rect to the size of  your display  text area
if Canvas.TextWidth(Text) > TextRect.Right - TextRect.Left then
  Format := DT_SINGLELINE or DT_RIGHT else  // DT_RIGHT will push all text to the left so the last charater is on the right of rectangle
  Format := DT_SINGLELINE;
DrawText(Canvas.Handle,PChar(Text),-1,TextRect, Format);
end;


there are many other Format flags that you can use (like DT_EXPANDTABS) which might help you for your display, you might experiment with some of these to see if it will put the text into your control like an Edit
0
 
KunfufaresiCommented:
Hello,

I remember having a similar problem, the textextent doesnt account for italic or kerning settings... at least that was my impression of it, when painting using drawtext and defining textrect accorting to textextent data.

As far as I got couldnt find any real solution to the dilema, my code was like

var
 Tsizex         : TSize;
...
begin
  Tsizex := newimage.Canvas.TextExtent('this is the string');
  Newimage.Canvas.TextRect(Rect( 10,10,10+Tsizex.cx,10+Tsizex.cy), 0,0,'this is the string');
end;

But you might try starting the painting from -3,0 or something like that.

Ekim
0
 
ginsonicAuthor Commented:
.FIx my problem. Still use TextWidth. The problem start from using FText of VCL instead of FDisplayed text.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 4
  • 3
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now