2016-04-06 4 views
1

2 20 10 -3のような数字を入力できるがあり、Button1をクリックするとmax = 20min = -3が得られます。 minmaxの番号がEdit1のようにスワップする数字を出そうとすると、2 -3 10 20のようになりました。私の方法で試しましたが、他の数字が変わりました。 私は多くの方法を試みました:Edit1の要素を入れ替えます

Edit4.Text:= (inttostr(min)+' '+ inttostr(max)); 

しかし、それは他の数字を上書きします。

は、私は

maxnumb := Edit4 

Edit4.Text := StringReplace(maxnumb, inttostr(max), inttostr(min), 
          [rfReplaceAll, rfIgnoreCase]); 

Edit1.Text := StringReplace(maxnumb, inttostr(min), inttostr(max), 
          [rfReplaceAll, rfIgnoreCase]); 

を使用しようとしました。しかし、それは唯一の第一の数をswapedと私は再びButton1をクリックしたときに、第2の数をswaped。交換しようとする試みなし

コード:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    oSL: TStringlist; 
    s, ss: string; 
    a: array [1 .. 15] of integer; 
    i, j, k, p, code: integer; 
    max, min: integer; 
    before, after: string; 
begin 
    s := Edit1.Text; 
    s := concat(s, #32); 
    i := 0; 
    while Length(s) > 0 do 
    begin 
    i := i + 1; 
    p := pos(#32, s); 
    ss := copy(s, 1, p - 1); 
    Val(ss, k, code); 
    a[i] := k; 
    delete(s, 1, p); 
    end; 
    // Max 
    max := a[1]; 
    For j := 1 to i do 
    if max < a[j] then 
     max := a[j]; 
    // Min 
    min := a[1]; 
    For j := 1 to i do 
    if min > a[j] then 
     min := a[j]; 
    // Put out Max/Min 
    Edit3.Text := IntToStr(max); 
    Edit2.Text := IntToStr(min); 
end; 
+0

をしてください[編集]あなたの質問、 '2 20 10 -3'のminとmaxの値を入れ替えても' 2 -3 20 10'ではなく '2 -3 10 20'が返されます。 –

+2

これを解決するには、StringReplaceの試行をやめてください。 Edit.Textのすべての数字を解析し、整数の配列にあなたのものを加え、それらをすべてEdit.textに連結します。 –

+0

maxnumbはどのタイプですか?それが文字列の場合、最初の行 "maxnumb:= edit4"はコンパイルされません。編集ボックスの場合、stringreplaceはコンパイルされません。あなたの質問に正しいコードがあることを確認してください。 – GuidoG

答えて

1
uses 
    Types, StrUtils; 

function Arrange(const AEditFrom, AEditTo: TEdit): Boolean; 
var 
    _StrArr: TStringDynArray; 
    i: integer; 
    _IntArr: array of integer; 
    _IntValue: integer; 
    _Min: integer; 
    _Max: integer; 
begin 
    Result := False; 

    if not Assigned(AEditFrom) then 
    Exit; 
    if not Assigned(AEditTo) then 
    Exit; 

    _StrArr := SplitString(AEditFrom.Text, ' '); 
    SetLength(_IntArr, Length(_StrArr)); 

    for i := 0 to Length(_StrArr) - 1 do 
    begin 
    if not TryStrToInt(_StrArr[i], _IntValue) then 
     Exit; 

    _IntArr[i] := _IntValue; 
    end; 

    AEditTo.Clear; 
    _Min := _IntArr[0]; 
    _Max := _IntArr[0]; 
    for i := 0 to Length(_IntArr) - 1 do 
    begin 
    if _IntArr[i] > _Max then 
     _Max := _IntArr[i]; 

    if _IntArr[i] < _Min then 
     _Min := _IntArr[i]; 
    end; 

    AEditTo.Text := StringReplace(AEditFrom.Text, ' ' + IntToStr(_Min), 
    '...' + IntToStr(_Max), [rfReplaceAll, rfIgnoreCase]); 

    AEditTo.Text := StringReplace(AEditTo.Text, ' ' + IntToStr(_Max), 
    ' ' + IntToStr(_Min), [rfReplaceAll, rfIgnoreCase]); 

    AEditTo.Text := StringReplace(AEditTo.Text, '...', ' ', 
    [rfReplaceAll, rfIgnoreCase]); 

    Result := True; 
end; 

procedure TForm1.BitBtn1Click(Sender: TObject); 
begin 
    if not Arrange(Edit1, Edit2) then 
    ShowMessage('Something went wrong. List contains not a integer?'); 
end; 

テスト:2 20 10 -3、結果:2 -3 10 20

+0

コードを使用するとすぐに、識別子SplitStringが見つかりません – Deivids

+0

' SplitString'は、このユニットでは、答え: 'System.StrUtils.SplitString' – Craig

関連する問題