2015-04-06 2 views
0

в матрице (StringGrid) NxM сортировать элементы каждой строки в неубывающем порядке?Delphi сортировка Строка сетки

var 
    Form1: TForm1; 
    n,m:integer; 
    I:integer; 

implementation 

{$R *.dfm} 

procedure TForm1.btNapraviClick(Sender: TObject); 
begin 
    with StringGrid1 do 
    begin 
    n:=StrToInt(edN.text)+1; 
    m:=StrToInt(edM.text)+1; 
    ColCount:=n; 
    RowCount:=m; 

    for I:=0 to n-1 do Cells[I,0]:=IntToStr(I); 
    for I:=1 to m-1 do Cells[0,I]:=IntToStr(I); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var J,P,K:integer; 
begin 
    with StringGrid1 do 
    begin 
    for I:=1 to n do 
     for J:=1 to m-1 do 
     for K:=J+1 to m do 
     begin 
      if StrToInt(Cells[I,J]) <= StrToInt(Cells[I,K]) then 
      begin 
      P:=StrToInt(Cells[I,J]); 
      Cells[I,J]:=(Cells[I,K]); 
      Cells[I,K]:=IntToStr(P); 
      end; 
     end; 
    end; 
end; 
+2

Не знаете, в чём ваш вопрос. Почему вы тестируете для '<=' вместо просто '<'? если они равны, вы бесполезно меняете два равных значения. Кроме того, нет никаких оснований для того, чтобы P был целым числом или выполнял преобразование; просто сделайте строку. Вы знаете, что вы не определили var 'I: Integer;'? Я также использовал отладчик, чтобы гарантировать, что m и n не основаны на нулевом значении, и что у вас нет встроенной ошибки в этих внутренних циклах. –

+0

Вы правы для <, моя вина. но ive объявляет I: целое, как глобальная переменная. – Malone

ответ

2

Каждая строка в StringGrid decends от TStrings, так что вы можете присвоить строку к TStringList и сделать пользовательскую сортировку по этому одному.

Вот некоторые исходный код:

Сначала я заполнить сетку со случайными данными:

procedure TForm60.FormCreate(Sender: TObject); 
var 
    i, j: Integer; 
begin 
    Randomize; 

    with StringGrid1 do 
    begin 
    ColCount := 10; 
    RowCount := 10; 

    for i := 0 to ColCount - 1 do 
     for j := 0 to RowCount - 1 do 
     Cells[i, j] := IntToStr(Random(5000)); 
    end; 
end; 

Тогда в Button1.Click сортировать каждую строку в порядке убывания:

function StringListSortCompare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrToIntDef(List[Index2], 0) - StrToIntDef(List[Index1], 0) 
end; 

procedure TForm60.Button1Click(Sender: TObject); 
var 
    i: Integer; 
    Buffer: TStringList; 
begin 
    Buffer := TStringList.Create; 
    for i := 0 to StringGrid1.RowCount - 1 do 
    begin 
    Buffer.Assign(StringGrid1.Rows[i]); 
    Buffer.CustomSort(@StringListSortCompare); 
    StringGrid1.Rows[i].Assign(Buffer); 
    end; 
    FreeAndNil(Buffer); 
end; 

Поскольку I subStract целое значение List [Index2] из List [Index1], список сортируется по убыванию.

И результат:

Перед enter image description here

После enter image description here

После прочтения вашего вопроса еще раз, я не уверен, что если вам "порядок неубывания" означает рост порядка , Если так, просто выполните процедуру сортировки следующим образом:

function StringListSortCompare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrToIntDef(List[Index1], 0) - StrToIntDef(List[Index2], 0) 
end; 
+0

ребята большое спасибо :))) – Malone

+0

@Malone, если вам понравился ответ, пожалуйста, примите его –

Смежные вопросы