![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем Здравствуйте!!!
помогите пожалуйста с сортировкой по алфавиту. единственно должно быть исключение первых символов. есть записи типа ---------------------------------------------------- ООО "Рога",7700234511 ООО "Копыта",7700435678 ООО "Василек",7700786745 ООО "Золотое Сало",5000234654 ИП Пупкин В.В.,770012345434 ИП Череззаборногозадеришенко П.А.,770094857678 ЗАО "Шарашкин и Ко",7700341761 ООО "Чебурек",7700235527 ОАО "Газпрем",7700945420 ООО "Буржуй",7700000123 -------------------------------------------------------- надо чтобы при сортировке исключались символы типа ООО " или ИП и начинало сортировать с названия вот я нашел вариант сортировки но без всяких исключений и с самых первых символов. Код:
procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
const
TheSeparator = '@';
var
CountItem, I, J, K, ThePosition: integer;
MyList: TStringList;
MyString, TempString: string;
begin
CountItem := GenStrGrid.RowCount;
MyList := TStringList.Create;
MyList.Sorted := False;
try
begin
for I := 1 to (CountItem - 1) do
MyList.Add(GenStrGrid.Rows[i].Strings[ThatCol] + TheSeparator +
GenStrGrid.Rows[i].Text);
Mylist.Sort;
for K := 1 to Mylist.Count do
begin
MyString := MyList.Strings[(K - 1)];
ThePosition := Pos(TheSeparator, MyString);
TempString := '';
TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
MyList.Strings[(K - 1)] := '';
MyList.Strings[(K - 1)] := TempString;
end;
for J := 1 to (CountItem - 1) do
GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
end;
finally
MyList.Free;
end;
end;
procedure TForm1.ToolButton17Click(Sender: TObject);
begin
SortStringGrid(StringGrid1, 0);
end;помогите с исключением. ![]() |
|
#2
|
|||
|
|||
|
А этот код тебе в принципе не подойдет, т.к. там исключать сложно, бо как используется готовый алгоритм сортировки. Либо менять код сборки/разборки строки. Проще свое написать.
Код:
procedure StringGridRowExchange(AStringGrid : TStringGrid; I1, I2 : Integer);
var
I : Integer;
S : String;
begin
For I := 0 To AStringGrid.Cols-1 Do
Begin
S := AStringGrid.Cells[I,I1];
AStringGrid.Cells[I,I1] := AStringGrid.Cells[I,I2];
AStringGrid.Cells[I,I2] := S;
End;
end;
procedure StringGridSort(AStringGrid : TStringGrid);
var
I, J : Interger;
S1, S2 : String;
begin
For I := 0 To AStringGrid.Rows-2 Do
For J := I+1 To AStringGrid.Rows-1 Do
Begin
S1 := AStringGrid.Cells[0,I];
S1 := Copy(S1,Pos(' ',S1)+1,Length(S1));
S2 := AStringGrid.Cells[0,J];
S2 := Copy(S2,Pos(' ',S2)+1,Length(S2));
// сравниваем без учета регистра, отрезав все до первого пробела.
If S1 > S2 Then
StringGridRowExchange(I,J);
End;
end; |
|
#3
|
|||
|
|||
|
немного не так как мне надо, но спасибо!
мне нужно задать ряд исключений. может у кого идеи по этому поводу есть? |
|
#4
|
|||
|
|||
|
Ну так напиши эти исключения!!!
Тебе дали пример. Если тебя что-то не устраивает - доделай сам. Собственно, вот эти строки: Код:
S1 := AStringGrid.Cells[0,I];
S1 := Copy(S1,Pos(' ',S1)+1,Length(S1));
S2 := AStringGrid.Cells[0,J];
S2 := Copy(S2,Pos(' ',S2)+1,Length(S2)); |
|
#5
|
|||
|
|||
|
С ЭТИМ Я РАЗОБРАЛСЯ У МЕНЯ РУГАЕТСЯ НА СТРОКУ
Код:
StringGridRowExchange(I,J); |
|
#6
|
|||
|
|||
|
вот надыбал!
самое то что нужно. спасибо всем кто мне помогал! отдельное спасибо lmikle Код:
function Handling ( aStr : String ) : String ;
begin
aStr := TrimLeft(Astr);
if Pos('ООО "',aStr) = 1 then aStr := copy(aStr,6,Length(aStr)-5); // задаем исключения
if Pos('ЗАО "',aStr) = 1 then aStr := copy(aStr,6,Length(aStr)-5);
if Pos('ИП ',aStr) = 1 then aStr := copy(aStr,4,Length(aStr)-3);
Result := TrimLeft(aStr);
end ;
procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
const
TheSeparator = '@';
var
CountItem, I, J, K, ThePosition: integer;
MyList: TStringList;
MyString, TempString: string;
begin
CountItem := GenStrGrid.RowCount;
MyList := TStringList.Create;
MyList.Sorted := False;
try
begin
for I := 1 to (CountItem - 1) do
MyList.Add( Handling(GenStrGrid.Rows[i].Strings[ThatCol]) + TheSeparator +
GenStrGrid.Rows[i].Text);
Mylist.Sort;
for K := 1 to Mylist.Count do
begin
MyString := MyList.Strings[(K - 1)];
ThePosition := Pos(TheSeparator, MyString);
TempString := '';
TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
MyList.Strings[(K - 1)] := '';
MyList.Strings[(K - 1)] := TempString;
end;
for J := 1 to (CountItem - 1) do
GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
end;
finally
MyList.Free;
end;
end;
procedure TForm1.ToolButton17Click(Sender: TObject);
begin
SortStringGrid(StringGrid1, 0);
end;оказывается не так страшен черт, как рисуют. выложу исходник может кому-нибудь поможет. в нем загрузка,сохранение,вставка и удаление строк, и конечно же сортировка с исключениями. |