I have an mode that uses TComboBox.SelStart to indicate progress along the edit text string. In this mode I would like to make some kind of change to the edit caret, for example to widen it to 2 pixels or 'bold' it in some way to indicate this mode and to have it grab more attention. Is this possible?
            Asked
            
        
        
            Active
            
        
            Viewed 533 times
        
    2
            
            
        
        Sertac Akyuz
        
- 54,131
 - 4
 - 102
 - 169
 
        Brian Frost
        
- 13,334
 - 11
 - 80
 - 154
 
- 
                    1I don't know about delphi but win32's createcaret/showcaret/destroycaret let you easily assign a custom-size caret to an hwnd (the edit part of the combo) – Alex K. Sep 14 '12 at 10:48
 - 
                    I would custom-draw the ComboBox instead, then you can draw a real progress bar directly on the edit box, such as behind the text. – Remy Lebeau Sep 14 '12 at 22:40
 - 
                    @remy: That's an interesting idea.. Thanks – Brian Frost Sep 15 '12 at 16:59
 - 
                    I'm sorry guys, it seems that the answer and subsequent comments came in much later than the original question. And yes, I find SO excellent. I cant understand why I didn't see this traffic at the time. – Brian Frost Aug 16 '14 at 17:33
 
1 Answers
3
            Yes, as Alex mentioned in his comment, this can be done using API calls. Example:
procedure SetComboCaretWidth(ComboBox: TComboBox; Multiplier: Integer);
var
  EditWnd: HWND;
  EditRect: TRect;
begin
  ComboBox.SetFocus;
  ComboBox.SelStart := -1;
  Assert(ComboBox.Style = csDropDown);
  EditWnd := GetWindow(ComboBox.Handle, GW_CHILD);
  SendMessage(EditWnd, EM_GETRECT, 0, LPARAM(@EditRect));
  CreateCaret(EditWnd, 0,
              GetSystemMetrics(SM_CXBORDER) * Multiplier, EditRect.Height);
  ShowCaret(EditWnd);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetComboCaretWidth(ComboBox1, 4); // bold caret
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  SetComboCaretWidth(ComboBox1, 1); // default caret
end;
        Sertac Akyuz
        
- 54,131
 - 4
 - 102
 - 169
 
- 
                    
 - 
                    I wonder why this question and answer had -1 and zero scores (Until I voted them up). This seems interesting to me. – Warren P Aug 11 '14 at 18:47
 - 
                    @Warren - Actually I'm the one who downvoted. With lack of any feedback, I assumed poster had lost any interest with any answer to the actual question asked (this is a late answer), in which case the question should better be deleted. Well, that was what I thought if I recall correctly. – Sertac Akyuz Aug 12 '14 at 02:45
 - 
                    Brian is still actively using the site. IT's too bad he doesn't accept answers, after 2 years. – Warren P Aug 13 '14 at 13:07
 - 
                    I'm sorry Sertac, I cant understand why I didn't see your answer at the time I had the issue. Thanks for your suggestion. – Brian Frost Aug 16 '14 at 17:35
 - 
                    @Brian - You're welcome. Probably I happened to post the answer later than when you had the issue, it might be why you missed it. – Sertac Akyuz Aug 21 '14 at 02:48