Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1260547440
JohnKorsh
2009-12-11 19:04
2010.02.07
Работа с INDY.


6-1211467897
vav
2008-05-22 18:51
2010.02.07
ActiveForm и TserverSocket


15-1259593736
ocean
2009-11-30 18:08
2010.02.07
Сколько стоит заказ?


15-1259923850
Rule
2009-12-04 13:50
2010.02.07
Ищется алгоритм разводки печатных плат


2-1260712096
serhiyiv
2009-12-13 16:48
2010.02.07
TStringList