![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Синтаксис [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] — разжевано. Что еще непонятно? Разницу между обычной функцией и методом объекта улавливаешь?
<X> (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
В тексте ошибки все написано.
<X> (2006-07-06 01:13:00) [6]TList.Sort(ListSortFunc); Нельзя вот так.
<X> (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]Что именно показалось "нельзя"?