Главная страница
    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.011 c
15-1151556036
Ega23
2006-06-29 08:40
2006.07.30
С Днём рождения! 29 июня


15-1151397177
CyberWoman
2006-06-27 12:32
2006.07.30
Перевод текста в MainMenu и PopupMenu


15-1151745887
homm
2006-07-01 13:24
2006.07.30
HTML: Опять эксплорер тупит


6-1138309400
serko
2006-01-27 00:03
2006.07.30
ClienSocket и ServerSocket


15-1151599434
PSPF2003
2006-06-29 20:43
2006.07.30
Выход в инет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский