2016-04-06 32 views
1

Edit1 adresinde 2 20 10 -3 gibi sayıları yazabilir ve Button1 tıklattığınızda max ve min sayılarını çıkarır max = 20 min = -3. Numaraları çıkardığımda min ve max numaralarını2 -3 10 20 olarak değiştirdiğimde bunu denedim, ancak kendi yöntemlerimde denedim ancak diğer girilen numaralar değişiyor. Ben birçok yol denedim:Edit1 öğesinde değiştirme öğeleri

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

ancak diğer sayılar üzerine yazılır.

Sonra ben

maxnumb := Edit4 

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

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

kullanmaya çalıştı Ama sadece 1 sayı swaped ve tekrar Button1 tıklandığında ikinci sayı swaped. girişimleri olmadan

Kod takas:

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

Lütfen [değiştir] soru, belirsizdir: "2 20 10 -3" de min ve max değerlerinin değiştirilmesi 2 -3 20 10' değil '2 -3 10 20' döndürmez. –

+2

Ve bunu çözmek için StringReplace girişimlerinizi durdurun. Sadece Edit.Text gelen tüm numaralar ayrıştırmak, bir tamsayılar dizisi üzerinde yapmak, hepsini geri Edit.text –

+0

içine bitmiş maxnumb türü nedir? eğer bir dizge ise "maxnumb: = edit4" ilk satırı derlenmez. Eğer bir Editbox ise, stringreplace derlenmeyecektir. Sorunuzda doğru kodu bulduğunuzu kontrol edin. – GuidoG

cevap

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; 

Testi: 2 20 10 -3, Sonuç: 2 -3 10 20

+0

Kodu kullandığım anda SplitString tanımlayıcısı bulunamıyor – Deivids

+0

' SplitString' bu ünitede cevabında gösterildiği gibi bulunmalıdır: 'System.StrUtils.SplitString' – Craig

İlgili konular