![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сротировка списка в Memo [D7]
Aleks © (2009-12-12 15:40:00)Доброго времяни суток, мастера подскажите как пересортировать список что б получить такой результат.
сортировка по весу. Список загружен в Memo.Text
исходный текст:
Амурский Осетр:8000:8
Ауха:2500:8
Белоглазка:500:8
Белуга:60000:8
Большеротый окунь:1500:8
Бычок:65:8
Валек:450:8
Нужен такой:
Белуга:60000:8
Амурский Осетр:8000:8
Ауха:2500:8
Большеротый окунь:1500:8
Белоглазка:500:8
Валек:450:8
Бычок:65:8
Aleks (2009-12-12 20:33:00) [1]
> www.tmssoftware.com
с английским то же напряжно, не слушал мамку в детстве :(
спасибо всем, тема закрыта.
KilkennyCat (2009-12-12 20:28:00) [2]
> Код из [5] вполне работает.
Опять же, все загнется из-за SL.AddStrings(Memo.Lines);
> Пишу для себя, в базах, вообще ноль.
Тогда скачиваешь TAdvStringList с обширной справкой и примерами с www.tmssoftware.com и не мучаешься. Получаешь любого размера таблицу, которую можно сортировать, нажимая по колонкам, редактировать а-ля ексель, сохранять в файл и грузить из файла (собственный формат или ексель).
Хотя, при всех ее достоинствах, глючит тож.
Nucer (2009-12-12 19:36:00) [3]
> Aleks (12.12.09 19:31) [16]
Пожалуйста =)
>Да, еще надо добавить StrUtils в uses (там находится функция PosEx).
Aleks (2009-12-12 19:31:00) [4]
> Nucer
Спасибо за код.
Вот тут
p2 := PosEx(':', SL[i], p1 + 1);
Правда компилятор ругался PosEx -- [Error] Unit1.pas(536): Undeclared identifier: 'PosEx'
Переписал поиск : - следующей позиции Всё работает
Ещё раз спасибо
Nucer (2009-12-12 19:31:00) [5]Код из [5] вполне работает. Надо просто скопировать и после вывода текста в Memo вызвать MySort(MyMemo), где MyMemo - имя компонента.
Я не знаю, как у вас там все это происходит, но лучше использовать BeginUpdate и EndUpdate. Пример:
MyMemo.BeginUpdate;
MyMemo.Text := MyText;
MySort(MyMemo);
MyMemo.EndUpdate;
Да, еще надо добавить StrUtils в uses (там находится функция PosEx).
Aleks (2009-12-12 19:00:00) [6]
> Nucer
Объясни пожалуйста подробней, что делает и как, то что ты написал.
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; // ??? Это наверно передача данных в процедуру
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; //Начало процедуры
begin
if not Sorted and (FCount > 1) then // Если ??? То
begin
Changing; //??
QuickSort(0, FCount - 1, Compare);//??
Changed;//??
end;
end;
Не ругайте, пианиста, он играет, как умеет...
Пишу для себя, в базах, вообще ноль.
Спасибо, что откликнулись.
Nucer (2009-12-12 17:12:00) [7]
> sniknik © (12.12.09 17:09) [11]
Я написал "не подойдет" именно про Sort. А выше упомянул CustomSort (про который в момент написания кода не знал).
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
procedure TStringList.CustomSort(Compare: TStringListSortCompare);
begin
if not Sorted and (FCount > 1) then
begin
Changing;
QuickSort(0, FCount - 1, Compare);
Changed;
end;
end;
Smile (2009-12-12 17:10:00) [8]а в чем проблема?
парсишь до ":" и сортируешь
sniknik (2009-12-12 17:09:00) [9]> А sort не подойдет,
вообще то пойдет, если взять что то позволяющее пользовательскую процедуру сортировки, или если привести данные в нормальный вид... (т.е. с полями - название, цена, тип товара, ну и т.д.) тогда сорт делается по нужному полю.
sniknik (2009-12-12 17:05:00) [10]> тогда так:
а теперь обратить внимание на
> Нужен такой:
> Белуга: 60000:8
> Амурский Осетр: 8000:8
> Ауха: 2500:8
> Большеротый окунь: 1500:8
> Белоглазка: 500:8
> Валек: 450:8
> Бычок: 65:8
p.s. вопрос - очередной "велосипед" от нежелания пользоваться(учить) базами(таблицами/рекордсетами)... в общем тем, что предназначено для обработки данных.
(а после это как есть зальют в строку таблицы, обзовут "базой" и ну как помучится пришедший на смену программист с подобной "структурой"...)
Nucer (2009-12-12 17:02:00) [11]
> KilkennyCat © (12.12.09 16:53) [7]
Assign - это Clear и AddStrings плюс кое-что еще (установка дополнительных параметров).
А sort не подойдет, т. к. нужно не по алфавиту, а по первому числу в строке.
Nucer (2009-12-12 16:58:00) [12]Memo.Lines - TStrings.
procedure TStrings.PutObject(Index: Integer; AObject: TObject);
begin
end;
procedure TStringList.PutObject(Index: Integer; AObject: TObject);
begin
if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
Changing;
FList^[Index].FObject := AObject;
Changed;
end;
А про наличие CustomSort да, не знал (насколько понял по коду, используется QuickSort, поэтому наверное будет быстрее пузырьков =)
KilkennyCat (2009-12-12 16:53:00) [13]Соврал.
Мемо.lines это TStrings.
тогда так:
var
s : tstringlist;
begin
s := tstringlist.Create;
s.Assign(memo.lines);
s.Sort;
memo.Lines.BeginUpdate;
memo.Lines.Assign(s);
memo.Lines.BeginUpdate;
s.free;
end;
KilkennyCat (2009-12-12 16:47:00) [14]не говорю.
Memo.Lines - это уже TStringList
есть свойство Sort
Nucer (2009-12-12 16:32:00) [15]Не надо говорить, что код плохой. Я вообще не знаю, зачем его написал =)
procedure MySort(Memo: TMemo);
var
i, j, p1, p2: Integer;
s: string;
SL: TStringList;
begin
SL := TStringList.Create;
SL.BeginUpdate;
SL.AddStrings(Memo.Lines);
for i := 0 to SL.Count - 1 do
begin
p1 := Pos(':', SL[i]);
p2 := PosEx(':', SL[i], p1 + 1);
if (p1 > 0) and (p2 > 0) then SL.Objects[i] := Pointer(StrToIntDef(Copy(SL[i], p1 + 1, p2 - p1 - 1), 0));
end;
for i := 0 to SL.Count - 2 do for j := i + 1 to SL.Count - 1 do
if Integer(SL.Objects[i]) < Integer(SL.Objects[j]) then SL.Exchange(i, j);
SL.EndUpdate;
Memo.Lines.BeginUpdate;
Memo.Lines.Clear;
Memo.Lines.AddStrings(SL);
Memo.Lines.EndUpdate;
SL.Free;
end;
Сергей М. (2009-12-12 16:30:00) [16]
> можно и после
Можно и гвозди микроскопом забивать)
KilkennyCat (2009-12-12 16:10:00) [17]но чревато, при длинных строках :)
KilkennyCat (2009-12-12 16:09:00) [18]можно и после.
memo.lines
Сергей М. (2009-12-12 15:50:00) [19]> Список загружен в Memo.Text
Так отсортируй его ПРЕЖДЕ чем загружать в Мнмо.Текст !
Что этому мешает ?