我正在开发一个应用程序,其中我有一个具有长文本值的组合框。由于文本值很大(以字符... 20或更多),要在组合框中显示,要求是显示在从下拉列表中选择后,first
字符。
就像用红色标记的图像一样。如果用户选择第3项3 0.5 to 1.25 Slight
,我应该只在组合框中显示3
。
所以我试过这个
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;
结果为
按钮似乎显示正确的值,但不显示组合框。
我想要的是在组合框中获得3
,我似乎无法设置ComboBox1.Text:=
任何人都可以告诉我该怎么做?
像这样从组合框中选择结果应该是
答案 0 :(得分:13)
我建议所有者绘制ComboBox来处理这个问题。将TComboBox.Style
属性设置为csOwnerDrawFixed
,然后将'1'
,'2'
,'3'
等数字存储在TComboBox.Items
属性本身中并使用当下拉列表可见时,TComboBox.OnDrawItem
事件呈现完整字符串,例如:
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;
答案 1 :(得分:-1)
您必须尝试将数据保存在记录中,例如:
type
TMyRec = record
Num:Integer;
Text:String;
end;
TMyRecArray = array of TMyRec;
MyRecArray:TMyRecArray;
然后您可以手动设置要在ComboBox中设置的项目(OnFromCreate 上的),
SetLength(MyRecArray,9);
MyRecArray[0].Num:=1;
MyRecArray[0].Text:='0 to 0.1 Calm Rippled';
.
.
等等。
然后在组合框中只放置数字和
procedure TForm1.ComboBox1Select(Sender: TObject);
var
i:integer;
begin
for i:=0 to 9 do
begin
if ComboBox1.Text=IntToStr(MyRecArray[i].Num) then
Button1.Caption:=MyRecArray[i].Text;
end;
end;