2012-05-30 11 views
6

텍스트 상자에 텍스트 값이 큰 콤보 상자가있는 응용 프로그램에서 작업하고 있습니다. 텍스트 값이 커 (.20 이상의 문자로 표시되기 때문에) 콤보 박스에 표시하려면 요구 사항 드롭 다운에서 선택한 후 문자 first에 표시하는 것이 었습니다. 빨간색으로 표시된 이미지와 같습니다. 사용자가 3 번째 항목 3 0.5 to 1.25 Slight을 선택하면 콤보 상자에 3 만 표시됩니다. 선택시 ComboBox 텍스트 설정

enter image description here

그래서 버튼이 적절한 값이 아닌 콤보 보여 보이는 결과 enter image description here

않습니다

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:= 어떤 방법으로 말해 줄 수 있습니까?

type 
TMyRec = record 
    Num:Integer; 
    Text:String; 
end; 

TMyRecArray = array of TMyRec; 

MyRecArray:TMyRecArray; 

은 다음으로 수동으로 항목을 설정할 수 있습니다 : 콤보 상자에서의 선택에 대한이 같은 결과 당신은 예를 들어, 레코드에 데이터를 저장하려고 할 enter image description here

답변

12

내가 소유자 그리기이 문제를 처리하기 위해 콤보를 건의 할 것입니다. 예를 들어, TComboBox.Items 특성 자체가 그냥 숫자 '1', '2''3' 등을 저장 한 후, csOwnerDrawFixedTComboBox.Style 속성을 설정하고 드롭 다운 목록이 표시 될 때 전체 문자열을 렌더링 할 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; 
+0

G.E.N.I.U.S. 효과가있다. – PresleyDias

-1

해야한다 (OnFromCreate에 )에서 콤보 등

SetLength(MyRecArray,9); 
MyRecArray[0].Num:=1; 
MyRecArray[0].Text:='0 to 0.1 Calm Rippled'; 
. 
. 

및 설정.

다음 콤보 strigns 자리 숫자 만에

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; 
+0

괜찮지 만 항목 선택시 '콤보 상자'텍스트가 'TrimTextAndDisplay result'로 설정됩니까? – PresleyDias

+0

아니, 우리는 TrimTextAndDisplay를 사용하지 않을 것입니다, 우리는 버튼의 캡션 만 설정합니다, 이것이 당신의 목표입니까? 또는 나는 무엇인가 여기에서 놓치고 있냐? 왜 시도하지 않는거야? – Zeina

+0

na, 버튼의 캡션을 설정하지 않고 해당 버튼은 테스트 용입니다. ComboBox1Telect : ComboBox1Select'에서 ComboBox1.Text : = sTheSelectedValue; Button1.Caption : = ComboBox1.Text;'.i 콤보 박스에 최신 값을 지정하고 버튼에 콤보 상자 값을 지정하고 있습니다. 가치는 내가 원하지만 콤보 스는 여전히 '3 0.5 to 1.25 Slight'로 큰 텍스트 값을 보여주고 있는데, 버튼처럼 '3'이 표시되어야한다. – PresleyDias

관련 문제