TList.Sort
От: GvinPin Россия  
Дата: 02.06.06 10:43
Оценка:
Добрый день!
Долгое время писал на С++, а тут возникла необходимость писать на Делфи и сразу столкнулся с такой проблемой:
в общем у меня есть список с указателями на записи

type
sr = record
dateF : TDateTime;
count : integer;
... : ...
end;
var
psr : ^sr;


psr^.dateF := date;
List.Add(psr)

мне необходимо сделать сортировку списка по полю dateF, попытался сделать как в справке, но компилятор на меня ругается

function CompareSR(Item1, Item2: Pointer): Integer;
begin
Result := CompareDateTime(psr(Item1).dateF, psr(Item2).dateF);
end;


List.Sort(@CompareSR)

как я понимаю надо привести Item1 и Item2 к типу psr, но паскаль изучал 10 лет назад и как это сделать незнаю.

Подскажите пожалуйста, что я делаю не так?
Re: TList.Sort
От: ekamaloff Великобритания  
Дата: 02.06.06 10:47
Оценка:
Здравствуйте, GvinPin, Вы писали:

GP>type
GP>  psr = ^sr;
GP>  sr = record
GP>    dateF : TDateTime;
GP>    count : integer;
GP>    ... : ...
GP>  end;

GP>// ...

GP>function CompareSR(Item1, Item2: Pointer): Integer;
GP>begin
GP>  Result := CompareDateTime(psr(Item1)^.dateF, psr(Item2)^.dateF);
GP>end;

GP>// ...

GP>List.Sort(@CompareSR)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: TList.Sort
От: Softwarer http://softwarer.ru
Дата: 02.06.06 10:51
Оценка:
Здравствуйте, GvinPin, Вы писали:

GP>в общем у меня есть список с указателями на записи


Лучше сразу сделайте объекты и подумайте, не использовать ли TObjectList. Сэкономите себе геморрой.
Re[2]: TList.Sort
От: GvinPin Россия  
Дата: 02.06.06 10:59
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, GvinPin, Вы писали:


E>
GP>>type
GP>>  psr = ^sr;
GP>>  sr = record
GP>>    dateF : TDateTime;
GP>>    count : integer;
GP>>    ... : ...
GP>>  end;

GP>>// ...

GP>>function CompareSR(Item1, Item2: Pointer): Integer;
GP>>begin
GP>>  Result := CompareDateTime(psr(Item1)^.dateF, psr(Item2)^.dateF);
GP>>end;

GP>>// ...

GP>>List.Sort(@CompareSR)
E>


пробовал, говорит invalid typecast!
Re[2]: TList.Sort
От: GvinPin Россия  
Дата: 02.06.06 11:02
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, GvinPin, Вы писали:


GP>>в общем у меня есть список с указателями на записи


S>Лучше сразу сделайте объекты и подумайте, не использовать ли TObjectList. Сэкономите себе геморрой.


спасибо, наверное так и сделаю.
Re[2]: TList.Sort
От: Dimonka Верблюд  
Дата: 02.06.06 11:54
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, GvinPin, Вы писали:


E>
GP>>type
GP>>  psr = ^sr;
GP>>  sr = record
GP>>    dateF : TDateTime;
GP>>    count : integer;
GP>>    ... : ...
GP>>  end;

// Может так?
function CompareSR(Item1, Item2: Pointer): Integer;
var
  I1: psr absolute Item1;
  I2: psr absolute Item2;
begin
  Result := CompareDateTime(I1.dateF, I2.dateF);
end;

GP>>// ...

GP>>List.Sort(@CompareSR)
E>
Re[3]: TList.Sort
От: ekamaloff Великобритания  
Дата: 02.06.06 13:26
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>// Может так?


Не знаю, то что я привел изначально у меня в Delphi5 компилится. Вот полностью компилирующийся (но семантически неправильный) пример:

program Project1;

{$APPTYPE CONSOLE}

uses Classes;

type
  psr = ^sr;
  sr = record
    dateF : TDateTime;
    count : integer;
    //... : ...
  end;

// ...

function CompareSR(Item1, Item2: Pointer): Integer;
begin
  Result := Trunc(psr(Item1)^.dateF - psr(Item2)^.dateF);
end;

// ...

var
    List: TList;
begin
    List.Sort(@CompareSR);
end.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: TList.Sort
От: GvinPin Россия  
Дата: 02.06.06 13:31
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, ekamaloff, Вы писали:


E>>Здравствуйте, GvinPin, Вы писали:


E>>
GP>>>type
GP>>>  psr = ^sr;
GP>>>  sr = record
GP>>>    dateF : TDateTime;
GP>>>    count : integer;
GP>>>    ... : ...
GP>>>  end;

D>// Может так?
D>function CompareSR(Item1, Item2: Pointer): Integer;
D>var
D>  I1: psr absolute Item1;
D>  I2: psr absolute Item2;
D>begin
D>  Result := CompareDateTime(I1.dateF, I2.dateF);
D>end;

GP>>>// ...

GP>>>List.Sort(@CompareSR)
E>>


Спасибо за идею но заработало тока вот так:

I1: ^psr absolute Item1;
I2: ^psr absolute Item2;
Re[4]: TList.Sort
От: Dimonka Верблюд  
Дата: 02.06.06 14:00
Оценка:
Здравствуйте, GvinPin, Вы писали:

GP>Спасибо за идею но заработало тока вот так:


GP> I1: ^psr absolute Item1;

GP> I2: ^psr absolute Item2;

ну оч. странно
Re[3]: TList.Sort
От: Аноним  
Дата: 02.06.06 14:23
Оценка:
GP>пробовал, говорит invalid typecast!

Delphi какая ? Win32 или .Net ?

Настройки компилятора какие (Ctrl+o, o в редакторе) ?

странно это... Не должно такого быть.

Боюсь, что если typecast инвалид, то и абсолют может просто бессымсленно наплодить багов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.