Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
<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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
1-1150206964
Kain-Lord
2006-06-13 17:56
2006.07.30
Помогите плзз...


15-1151838597
vidiv
2006-07-02 15:09
2006.07.30
Сертификаты


2-1152380868
parovoZZ
2006-07-08 21:47
2006.07.30
Классы : конструктор и деструктор


3-1148547033
apl
2006-05-25 12:50
2006.07.30
Как ускорить работу?


3-1148485734
Borisss
2006-05-24 19:48
2006.07.30
Delphi + MySQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский