Текущий архив: 2010.02.07;
Скачать: CL | DM;
Вниз
Сротировка списка в Memo Найти похожие ветки
← →
Aleks (2009-12-12 15:40) [0]Доброго времяни суток, мастера подскажите как пересортировать список что б получить такой результат.
сортировка по весу. Список загружен в 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
← →
Сергей М. © (2009-12-12 15:50) [1]> Список загружен в Memo.Text
Так отсортируй его ПРЕЖДЕ чем загружать в Мнмо.Текст !
Что этому мешает ?
← →
KilkennyCat © (2009-12-12 16:09) [2]можно и после.
memo.lines
← →
KilkennyCat © (2009-12-12 16:10) [3]но чревато, при длинных строках :)
← →
Сергей М. © (2009-12-12 16:30) [4]
> можно и после
Можно и гвозди микроскопом забивать)
← →
Nucer (2009-12-12 16:32) [5]Не надо говорить, что код плохой. Я вообще не знаю, зачем его написал =)
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;
← →
KilkennyCat © (2009-12-12 16:47) [6]не говорю.
Memo.Lines - это уже TStringList
есть свойство Sort
← →
KilkennyCat © (2009-12-12 16:53) [7]Соврал.
Мемо.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;
← →
Nucer (2009-12-12 16:58) [8]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, поэтому наверное будет быстрее пузырьков =)
← →
Nucer (2009-12-12 17:02) [9]
> KilkennyCat © (12.12.09 16:53) [7]
Assign - это Clear и AddStrings плюс кое-что еще (установка дополнительных параметров).
А sort не подойдет, т. к. нужно не по алфавиту, а по первому числу в строке.
← →
sniknik © (2009-12-12 17:05) [10]> тогда так:
а теперь обратить внимание на
> Нужен такой:
> Белуга:60000:8
> Амурский Осетр:8000:8
> Ауха:2500:8
> Большеротый окунь:1500:8
> Белоглазка:500:8
> Валек:450:8
> Бычок:65:8
p.s. вопрос - очередной "велосипед" от нежелания пользоваться(учить) базами(таблицами/рекордсетами)... в общем тем, что предназначено для обработки данных.
(а после это как есть зальют в строку таблицы, обзовут "базой" и ну как помучится пришедший на смену программист с подобной "структурой"...)
← →
sniknik © (2009-12-12 17:09) [11]> А sort не подойдет,
вообще то пойдет, если взять что то позволяющее пользовательскую процедуру сортировки, или если привести данные в нормальный вид... (т.е. с полями - название, цена, тип товара, ну и т.д.) тогда сорт делается по нужному полю.
← →
Smile (2009-12-12 17:10) [12]а в чем проблема?
парсишь до ":
" и сортируешь
← →
Nucer (2009-12-12 17:12) [13]
> 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;
← →
Aleks (2009-12-12 19:00) [14]
> 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 19:31) [15]Код из [5] вполне работает. Надо просто скопировать и после вывода текста в Memo вызвать MySort(MyMemo), где MyMemo - имя компонента.
Я не знаю, как у вас там все это происходит, но лучше использовать BeginUpdate и EndUpdate. Пример:MyMemo.BeginUpdate;
MyMemo.Text := MyText;
MySort(MyMemo);
MyMemo.EndUpdate;
Да, еще надо добавить StrUtils в uses (там находится функция PosEx).
← →
Aleks (2009-12-12 19:31) [16]
> Nucer
Спасибо за код.
Вот тут
p2 := PosEx(":", SL[i], p1 + 1);
Правда компилятор ругался PosEx -- [Error] Unit1.pas(536): Undeclared identifier: "PosEx"
Переписал поиск : - следующей позиции Всё работает
Ещё раз спасибо
← →
Nucer (2009-12-12 19:36) [17]
> Aleks (12.12.09 19:31) [16]
Пожалуйста =)
>Да, еще надо добавить StrUtils в uses (там находится функция PosEx).
← →
KilkennyCat © (2009-12-12 20:28) [18]
> Код из [5] вполне работает.
Опять же, все загнется из-за SL.AddStrings(Memo.Lines);
> Пишу для себя, в базах, вообще ноль.
Тогда скачиваешь TAdvStringList с обширной справкой и примерами с www.tmssoftware.com и не мучаешься. Получаешь любого размера таблицу, которую можно сортировать, нажимая по колонкам, редактировать а-ля ексель, сохранять в файл и грузить из файла (собственный формат или ексель).
Хотя, при всех ее достоинствах, глючит тож.
← →
Aleks (2009-12-12 20:33) [19]
> www.tmssoftware.com
с английским то же напряжно, не слушал мамку в детстве :(
спасибо всем, тема закрыта.
Страницы: 1 вся ветка
Текущий архив: 2010.02.07;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.01 c