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.
LVL 9
ginsonicAsked:
Who is Participating?
 
shaneholmesConnect With a Mentor Commented:
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
 
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
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
mokuleConnect With a Mentor Commented:
Hi
What about ?

    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
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
 
Slick812Connect With a Mentor Commented:

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
 
KunfufaresiConnect With a Mentor Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.