Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Сортировка строк   Найти похожие ветки 

 
SHS   (2004-02-17 09:27) [0]

В Memo загружаю текстовый файл, каждая строка которого начинается с даты и выглядит примерно так: "15.01 Здесь любой текст". Мне нужно отсортировать эти строки в Memo по датам. Примерно знаю, что первые пять символов строки нужно преобразовать в тип TDate и потом сравнивать с другими строками, но практически никак сделать не получается, если кто-нибудь поможет конкретным примером, буду очень благодарен.


 
ЮЮ ©   (2004-02-17 09:39) [1]

Преобразовать в "01.15 Здесь любой текст" и засунуть в StringList c Sorted = true. В конце получаем отсортированный список строк, делаем Assign и ... всё


 
ЮЮ ©   (2004-02-17 09:40) [2]

>в Memo загружаю текстовый файл

загружай в StringList в отключенной сортировкой, преобразуй, сделай сортировку


 
kostik78ua   (2004-02-17 09:46) [3]

Например что-то типа такого:
procedure TForm1.Button1Click(Sender: TObject);
var
st: TStringlist;
begin
st := TStringlist.Create;
try
st.CommaText := Memo1.Lines.CommaText;
st.Sorted := True;
Memo1.Lines.CommaText := st.CommaText;
finally
FreeAndNil(st);
end;
end;
Или использовать st.Sort


 
SHS   (2004-02-17 09:53) [4]

To ЮЮ ©: Со StringList я пробовал, там получалось так:
10.02 ...
10.03 ...
10.04 ...
11.01 ...
11.02 ...
11.03 ...
т.е даты шли правильно, а вот месяца нет.

To kostik78ua:
Сейчас попробую.


 
SHS   (2004-02-17 10:02) [5]

To kostik78ua: сортируется только по дате, без учёта месяца...


 
mrcat ©   (2004-02-17 10:08) [6]

>SHS (17.02.04 09:53) [4]
>т.е даты шли правильно, а вот месяца нет.

ЮЮ © (17.02.04 09:39) [1]
Преобразовать в " 01.15 Здесь любой текст"


 
Babay ©   (2004-02-17 10:14) [7]

1) заводим например запись
Type TmDateText=Record;
date:TDate;
Text:String;
end;
2) Заводим динамический массив типа TmDateText
3) Читаем в стринглист файл
4) Перекладываем из стринглист в массив с разборкой соответственно даты и строки
5) Сортируем массив по Date используя ее как Double
6) Вываливаем из массива в мемо с обратным преобразованиее даты и строки
по идее должно работать


 
FOX ©   (2004-02-17 12:46) [8]

Один из возможных вариантов:

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
var d1, d2: TDate;
begin
d1 := EncodeDate( 1,
StrToInt(copy(List[Index1], 4, 2)),
StrToInt(copy(List[Index1], 1, 2)));
d2 := EncodeDate( 1,
StrToInt(copy(List[Index2], 4, 2)),
StrToInt(copy(List[Index2], 1, 2)));
if d1 < d2 then result := -1
else
if d1 > d2 then result := 1
else result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var r: TStringList;
begin
r := TStringList.Create;
try
r.Assign(Memo1.Lines);
r.CustomSort(@MyCompare);
Memo1.Lines.Assign(r);
finally
r.Free;
end;
end;


 
SHS   (2004-02-17 13:13) [9]

Спасибо всем ОГРОМНОЕ за помощь!

Метод предложенный ЮЮ © конечно работает:
Преобразовать в "mm.dd Здесь любой текст"
(в оригинале "dd.mm Здесь любой текст"), спасибо mrcat ©, что заострил моё внимание на этом.

Ещё раз ВСЕМ Большое спасибо, ещё вариант FOX © сейчас обязательно попробую.



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
14-94127
SiJack
2004-02-06 15:01
2004.02.29
Может кто подскажет какой грид взять чтобы в нем следующее мона


1-93868
Гиричев Руслан
2004-02-15 21:15
2004.02.29
Курсор - кажется что в нём такого, а...


1-93937
akiro
2004-02-15 01:04
2004.02.29
Как в RunTime динамически ограничить размер окна?


8-94030
Agent[007]
2003-10-29 15:46
2004.02.29
OpenGL - перпендикуляр


3-93780
Esed
2004-02-03 16:42
2004.02.29
Где - ошибка.