Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сротировка списка в 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

Так отсортируй его ПРЕЖДЕ чем загружать в Мнмо.Текст !
Что этому мешает ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо