2012-05-30 18 views
6

Pracuję nad aplikacją, w której mam combobox z długimi wartościami tekstowymi. Ponieważ wartości tekstowe są duże (w postaci znaków ..20 lub więcej), aby wyświetlić w combobox, wymóg był wyświetlany na znaku first po wybraniu z listy rozwijanej. Podobnie jak na zdjęciu zaznaczonym na czerwono. jeśli użytkownik wybierze 3. pozycję 3 0.5 to 1.25 Slight, powinien wyświetlić tylko 3 w combobox.Ustaw tekst ComboBox na zaznaczenie

enter image description here

więc próbowałem to

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; 

Rezultatem jest enter image description here

Przycisk wydają się wskazywać odpowiednią wartość, ale nie ComboBox.

co chcę uzyskać 3 w combobox, nie mogę wydawać ustawić ComboBox1.Text:= może ktoś mi powiedzieć, jak to zrobić? jak to na wybór z combobox wynik powinien być enter image description here

Odpowiedz

12

Proponuję właściciela rysowanie ComboBox z tym poradzić. Ustaw właściwość TComboBox.Style do csOwnerDrawFixed, a następnie zapisać tylko numery '1', '2', '3', etc w samej nieruchomości TComboBox.Items i użyć zdarzenia TComboBox.OnDrawItem do renderowania pełne ciągi gdy lista rozwijana jest widoczny, np:

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. zadziałało – PresleyDias

-1

Musisz spróbować, aby zapisać dane w rekordzie, dla ex:

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

TMyRecArray = array of TMyRec; 

MyRecArray:TMyRecArray; 

wtedy można ustawić ręcznie pozycje, które należy ustawić w ComboBox (na OnFromCreate),

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

i tak dalej.

następnie w combobox strigns miejsce wyłącznie z cyfr, a

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

ok, ale to ustawi tekst "pola kombi" jako 'Wynik TrimTextAndDisplay' na wybranym elemencie? – PresleyDias

+0

nie, nie będzie, bo nie będziemy używać TrimTextAndDisplay, ustawimy tylko podpis przycisku, czy to jest twój cel? czy coś tu mi brakuje? Dlaczego nie spróbować? – Zeina

+0

Na, nie ustawiając napisu przycisku, ten przycisk służy tylko do testu. w 'ComboBox1Select' robię to' ComboBox1.Text: = sTheSelectedValue; Button1.Caption: = ComboBox1.Text; '.i przypisuję najnowszą wartość do skrzynki combox n, a następnie wartość combobox do przycisku .. przycisk pokazuje wartość, którą chcę, ale combox wciąż pokazuje dużą wartość tekstową jako "3 0,5 do 1,25 Slight", gdzie powinna pokazywać "3" tak jak przycisk wyświetla – PresleyDias