Форум: "Начинающим";
Текущий архив: 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