Solved

Alike editbox text action

Posted on 2004-04-22
11
293 Views
Last Modified: 2010-08-05
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
Comment
Question by:ginsonic
  • 4
  • 3
  • 2
  • +2
11 Comments
 
LVL 11

Expert Comment

by:shaneholmes
Comment Utility
Do you want it to work like to TEdit?

What is your canvas space?

SHane
0
 
LVL 9

Author Comment

by:ginsonic
Comment Utility
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
 
LVL 17

Assisted Solution

by:mokule
mokule earned 100 total points
Comment Utility
Hi
What about ?

    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
0
 
LVL 11

Accepted Solution

by:
shaneholmes earned 200 total points
Comment Utility
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
 
LVL 9

Author Comment

by:ginsonic
Comment Utility
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
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 11

Expert Comment

by:shaneholmes
Comment Utility
Did you try using the TextExtent method

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

Shane
0
 
LVL 17

Expert Comment

by:mokule
Comment Utility
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
 
LVL 11

Expert Comment

by:shaneholmes
Comment Utility
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
 
LVL 33

Assisted Solution

by:Slick812
Slick812 earned 100 total points
Comment Utility

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
 
LVL 3

Assisted Solution

by:Kunfufaresi
Kunfufaresi earned 100 total points
Comment Utility
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
 
LVL 9

Author Comment

by:ginsonic
Comment Utility
.FIx my problem. Still use TextWidth. The problem start from using FText of VCL instead of FDisplayed text.
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now