Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set ComboBox text on selection

I am working on an application where i have a combobox with long text values.Since the text values are large(in term of characters ..20 or more), to display in the combobox, the requirement was to display on the first character after selecting from the drop down. Like in the image marked in red. if the user selects 3th item 3 0.5 to 1.25 Slight i should only display the 3 in the combobox.

enter image description here

So i tried this

   sTheSelectedValue : string;

  procedure TForm1.ComboBox1Select(Sender: TObject);
  begin
   sTheSelectedValue:=TrimTextAndDisplay(ComboBox1.Text); //send theselected value
   ComboBox1.Text :='';                                   //clear the selection
   ComboBox1.Text:=sTheSelectedValue;                     //now assign as text to combo box   
   Button1.Caption:=ComboBox1.Text;                      //just show the new value on the button.
  end;


   function TForm1.TrimTextAndDisplay(TheText : string): string;
   var
   sTheResult : string;
     begin
        sTheResult :=copy(TheText,0,1); //extract the first value..
        Result     :=sTheResult;
     end;

The result is enter image description here

The button seem to show the proper value but not the combobox.

what i want is to get 3 in the combobox, i cant seem set ComboBox1.Text:= can any one tell me how to do it? like this on selection of from the combobox the result should be enter image description here

like image 893
PresleyDias Avatar asked May 30 '12 06:05

PresleyDias


People also ask

How do I set default value in ComboBox?

By specifying the index of the particular value in the current(index) method, we can set the default value in the Combobox widget.


1 Answers

I would suggest owner-drawing the ComboBox to handle this. Set the TComboBox.Style property to csOwnerDrawFixed, then store just the numbers '1', '2', '3', etc in the TComboBox.Items property itself and use the TComboBox.OnDrawItem event to render the full strings when the drop-down list is visible, eg:

var
  sTheSelectedValue : string; 

const
  ItemStrings: array[0..7] of string = (
    '0 to 0.1 Calm (rippled)',
    '0.1 to 0.5 Smooth (wavelets)',
    '0.5 to 1.25 Slight',
    '1.25 to 2.5 Moderate',
    '2.5 to 4 Rough',
    '4 to 6 Very rough',
    '6 to 9 High',
    '9 to 14 Very high');

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  ComboBox1.Items.BeginUpdate;
  try
    for I := Low(ItemStrings) to High(ItemStrings) do begin
      ComboBox1.Items.Add(IntToStr(I+1));
    end;
  finally
    ComboBox1.Items.EndUpdate;
  end;
end; 

procedure TForm1.ComboBox1Select(Sender: TObject); 
begin 
  sTheSelectedValue := IntToStr(ComboBox1.ItemIndex+1);
  Button1.Caption := sTheSelectedValue;
end; 

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  s: String;
begin
  if odSelected in State then begin
    ComboBox1.Canvas.Brush.Color := clHighlight;
    ComboBox1.Canvas.Font.Color := clHighlightText;
  end else begin
    ComboBox1.Canvas.Brush.Color := ComboBox1.Color;
    ComboBox1.Canvas.Font.Color := ComboBox1.Font.Color;
  end;
  ComboBox1.Canvas.FillRect(Rect);
  s := IntToStr(Index+1);
  if not (odComboBoxEdit in State) then begin
    s := s + ' ' + ItemStrings[Index];
  end;
  ComboBox1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, s);
  if (State * [odFocused, odNoFocusRect]) = [odFocused] then begin
    ComboBox1.Canvas.DrawFocusRect(Rect);
  end;
end;
like image 89
Remy Lebeau Avatar answered Sep 22 '22 00:09

Remy Lebeau