[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

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

How to know when a TMemo's control has had text selected?


I am trying to enable/disable a button & menu item based on whether or not a TMemo's text has been selected

I dont see an event that triggers when text is selected...so how can i trap for it?
0
Looking_4_Answers
Asked:
Looking_4_Answers
  • 3
  • 3
  • 2
  • +3
1 Solution
 
TheRealLokiSenior DeveloperCommented:
To know, you just need to check the SelLength property, but I don't know of an event/message off hand
0
 
Looking_4_AnswersAuthor Commented:
ya, i know that part, but i need something that kicks it off
0
 
Ephraim WangoyaCommented:
Try the  mouse up event

procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  button1.Enabled := (Sender as TMemo).SelLength;
end;
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
Ephraim WangoyaCommented:
procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  button1.Enabled := (Sender as TMemo).SelLength > 0;
end;
0
 
Geert GruwezOracle dbaCommented:
whenever something happens in a delphi form a procedure UpdateActions gets called
you can make your own event with that:
type
  TForm1 = class(TForm)
  private
    fSelLength: integer;
    procedure MemoSelLengthChanged(aMemo: TMemo; OldSelLength, NewSelLength: integer);
  protected
    procedure UpdateActions; override;
  public
    constructor Create(AOwner: TComponent); override;  
  end;

constructor TForm1.Create(AOwner: TComponent); 
begin
  inherited Create(AOwner);
  fSelLength := 0;
end;

procedure TForm1.UpdateActions; 
var CurSelLength: Integer;
begin
  inherited UpdateActions;
  CurSelLength := Memo1.SelLength;
  if fSelLength <> CurSelLength then 
  begin
    MemoSelLengthChanged(Memo1, fSelLength, CurSelLength);
    fSelLength := CurSelLength;
  end;
end;

procedure TForm1.MemoSelLengthChanged(aMemo: TMemo; OldSelLength, NewSelLength: integer);
begin
  // Do Your code here  
end;

Open in new window

0
 
epasquierCommented:
Geert : That is excellent. I never thought of the use of UpdateActions in this way.
for information, that is a method introduced in TComponent

I would have used a procedure that is called by keyPressed, Key Up & mouse Up events, so like ewangoya but including all events that can change the selection.

I would need to test how often UpdateActions is called, and if there are cases where the 'mouse&key events' method fails (like if the selection is changed programmatically) before choosing which method I'll keep, but considering that there is not much load in a simple test and a button state change, why not being extensive ?

0
 
Geert GruwezOracle dbaCommented:
>>epasquier ugh ?
you'r last sentence is not very clear (at least to me, and i haven't had a beer yet ...)

The simplicity of using UpdateActions is somewhat frightening.
It doesn't go very well for debugging, because it get's called very often.
If anybody intends to use this procedure then anything in it must be blazing fast
Don't use any queries in this procedure directly ... it will slow down your delphi app
Maybe i should write a article about UpdateActions ... the ins and outs

I have found that setting enable/visible in this procedure is the easiest to do.
You don't have to provide anything to call this procedure, Delphi does it for you

However if you need to check things like enable/visible which are set in UpdateActions
In the same procedure/function in 2 different places then you may have to call it explicitely.
0
 
systanCommented:
The simpliest;
procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if memo1.SelText <> '' then showmessage(memo1.SelText + '  was selected');
end;

Open in new window

0
 
epasquierCommented:
@Geert : Well my last sentence was just expressing concerns about precisely what you said after : it is called too often for big code, but in this case that looks one helluva easy way
0
 
Geert GruwezOracle dbaCommented:
there goes the effort again ... way too much
0
 
epasquierCommented:
> there goes the effort again ... way too much
???
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

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