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

Вниз

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

 
<X>   (2006-07-06 00:22) [0]

Вот такое я обнаружил в одном исходнике

procedure TList.Sort(Compare: TListSortCompare);
function ListSortFunc(Item1, Item2: Pointer): Integer;

********

begin

********

TList.Sort(ListSortFunc);

в хелпе по делфи в роде так делать нельзя ?
Но исходник рабочий розьясните пожалуста что к чему.
Заранее всем спасиба !


 
Джо ©   (2006-07-06 00:32) [1]

Что именно показалось "нельзя"?


 
Gero ©   (2006-07-06 00:39) [2]

Можно.


 
<X>   (2006-07-06 01:12) [3]

Вот при моей попытке так сделать ошибка вылетает.

regular procedure and method pointer

а нелп гласит

   ProcedureParm1 = procedure(VAR x : Integer);

 procedure WrongParms(x, y, z : Integer);
 begin
 end;

 procedure TakesParm1(p : ProcedureParm1);
 begin
 end;

begin
 TakesParm1(WrongParms); <- ошибка
end.

если же

procedure WrongParms(Var x : Integer);
 begin
 end;

то это правильно.


 
<X>   (2006-07-06 01:13) [4]

TList.Sort(ListSortFunc); Нельзя вот так.


 
Gero ©   (2006-07-06 01:28) [5]

> [3] <X>   (06.07.06 01:12)


> Вот при моей попытке так сделать ошибка вылетает.
>
> regular procedure and method pointer

В тексте ошибки все написано.


 
Германн ©   (2006-07-06 01:35) [6]


> Вот такое я обнаружил в одном исходникеprocedure TList.Sort(Compare:
>  TListSortCompare);function ListSortFunc(Item1, Item2: Pointer):
>  Integer;********begin********TList.Sort(ListSortFunc);в
> хелпе по делфи в роде так делать нельзя ?Но исходник рабочий
> розьясните пожалуста что к чему.Заранее всем спасиба !


"о сколько нам ошибок чудных" готовит кто- то там!
Приведи исходник.


 
Джо ©   (2006-07-06 01:38) [7]

Тип TListSortCompare декларирует прототип обычной функции, а не метода объекта. Поэтому переделай метод объекта в обычную (regular) функцию.

П.С.
Если бы он декларировал тип метода объекта, объявление типа было бы такое:
function (Item1, Item2: Pointer): Integer of object;


 
<X>   (2006-07-06 01:55) [8]

Вот так устроено в рабочем исходнике

function ListSortFunc(Item1, Item2: Pointer): Integer;
begin
 Result := SmallInt(Form1.FIShellFolder.CompareIDs(
                 0,
                 PShellItem(Item1).ID,
                 PShellItem(Item2).ID
           ));
end;

procedure TForm1.PopulateIDList(ShellFolder: IShellFolder);
const
 Flags = SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN;
var
 ID: PItemIDList;
 EnumList: IEnumIDList;
 NumIDs: LongWord;
 SaveCursor: TCursor;
 ShellItem: PShellItem;
begin
 SaveCursor := Screen.Cursor;
 try
   Screen.Cursor := crHourglass;
   OleCheck(
     ShellFolder.EnumObjects(
       Application.Handle,
       Flags,
       EnumList)
   );

   FIShellFolder := ShellFolder;
   ClearIDList;
   while EnumList.Next(1, ID, NumIDs) = S_OK do
   begin
     ShellItem := New(PShellItem);
     ShellItem.ID := ID;
     ShellItem.DisplayName := GetDisplayName(FIShellFolder, ID, False);
     ShellItem.Empty := True;
     FIDList.Add(ShellItem);
   end;

  FIDList.Sort(ListSortFunc); <- здесь нет ошибки

   ListView.Items.Count := FIDList.Count;

   ListView.Repaint;
 finally
   Screen.Cursor := SaveCursor;
 end;
end;

Но при выделении всех доработок в один компонент появляется ошибка.

procedure PopulateIDList(ShellFolder: IShellFolder; ApHandle : Handle);
const
 Flags = SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN;
var
 ID: PItemIDList;
 EnumList: IEnumIDList;
 NumIDs: LongWord;
 ShellItem: PShellItem;
begin
 try
   OleCheck(
     ShellFolder.EnumObjects(
       ApHandle,
       Flags,
       EnumList)
   );

   FIShellFolder := ShellFolder;
   ClearIDList;
   while EnumList.Next(1, ID, NumIDs) = S_OK do
   begin
     ShellItem := New(PShellItem);
     ShellItem.ID := ID;
     ShellItem.DisplayName := GetDisplayName(FIShellFolder, ID, False);
     ShellItem.Empty := True;
     FIDList.Add(ShellItem);
   end;

  FIDList.Sort(ListSortFunc); <- здесь ошибка

   Items.Count := FIDList.Count;

   Repaint;
 finally
 end;
end;


 
Gero ©   (2006-07-06 02:06) [9]

> [8] <X>   (06.07.06 01:55)

В тексте ошибка все сказано. В [7] — разжевано. Что еще непонятно? Разницу между обычной функцией и методом объекта улавливаешь?



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

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

Наверх




Память: 0.49 MB
Время: 0.026 c
2-1152452361
AlexanderMS
2006-07-09 17:39
2006.07.30
Диалог выбора папки.


3-1148881795
DelphiN!
2006-05-29 09:49
2006.07.30
Очень медненный Append в таблицу Firebird-a


15-1151649368
syte_ser78
2006-06-30 10:36
2006.07.30
просто вопрос о деньгах.


2-1152699659
NBU
2006-07-12 14:20
2006.07.30
Как правильно написать файл *.rtf для создания Help?


1-1150870217
DeStranger
2006-06-21 10:10
2006.07.30
получить TList из потока