Главная страница
    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-1147554310
Anton_112
2006-05-14 01:05
2006.07.30
Разбор математического выражения


2-1152172117
Gerasym
2006-07-06 11:48
2006.07.30
Неактивность главной формы во время выполнения процедуры


15-1151488549
ANB
2006-06-28 13:55
2006.07.30
США ущемляют атеистов


6-1142861596
RomanH
2006-03-20 16:33
2006.07.30
Параметры SocketConnection во время выполнения программы


2-1152258098
alexal
2006-07-07 11:41
2006.07.30
формула разложения 16 битного числа на 2 байта





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