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

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

Синтаксис [D7, 2003]


<X> ©   (2006-07-06 00:22:00) 

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

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

********

begin

********

TList.Sort(ListSortFunc);

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


Gero   (2006-07-06 02:06:00) [1]

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

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


&lt;X&gt;   (2006-07-06 01:55:00) [2]

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

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;


Джо   (2006-07-06 01:38:00) [3]

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

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


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


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


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


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

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


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

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


&lt;X&gt;   (2006-07-06 01:13:00) [6]

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


&lt;X&gt;   (2006-07-06 01:12:00) [7]

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

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;

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


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

Можно.


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

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


Наверх

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