Re: Перевод кода с Си на Дельфи
От: toff Беларусь  
Дата: 05.05.09 09:21
Оценка:
Здравствуйте, LA_, Вы писали:

LA_>Товарищи, есть код на Си, который мне нужно перевести на Delphi.

LA_>Помогите, плз.
LA_>Код на Си:
LA_>
LA_>static void SetListGroupIcons(HWND hwndList,HANDLE hFirstItem,HANDLE hParentItem,int *groupChildCount)
LA_>{
LA_>    ...
LA_>    int childCount[IGNOREEVENT_MAX]={0,0,0,0,0,0,0},i;
LA_>        int iconOn[IGNOREEVENT_MAX]={1,1,1,1,1,1,1};
LA_>    ...
LA_>    hChildItem=(HANDLE)SendMessage(hwndList,CLM_GETNEXTITEM,CLGN_CHILD,(LPARAM)hItem);
LA_>        if(hChildItem) SetListGroupIcons(hwndList,hChildItem,hItem,childCount);
LA_>    ...
LA_>    for( i=0; i < SIZEOF(iconOn); i++ ) {
LA_>        if(groupChildCount) groupChildCount[i]+=childCount[i];
LA_>    }
LA_>    ...
LA_>}
LA_>...
LA_>SetListGroupIcons(somehandle1,somehandle2,somehandle3,NULL);
LA_>

LA_>пишу это на Delphi:
LA_>
LA_>procedure SetListGroupIcons(hwndList: THandle; hFirstItem: THandle; hParentItem: THandle; var groupChildCount: Array of Integer);
LA_>var childCount: array[0..IGNOREEVENT_MAX-1] of Integer; // = (0,0,0,0,0,0,0);
LA_>    iconOn: array[0..IGNOREEVENT_MAX-1] of Integer; // = (1,1,1,1,1,1,1);
LA_>    i: Integer;
    
LA_>...
LA_>    for i:=0 to IGNOREEVENT_MAX-1 do
LA_>    begin
LA_>      iconOn[i] := 1;
LA_>      childCount[i] := 0;
LA_>    end;
LA_>    ...
LA_>    hChildItem := THandle(SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, Windows.lParam(hItem)));
LA_>    if hChildItem <> 0 then SetListGroupIcons(hwndList, hChildItem, hItem, childCount);
LA_>    ...
LA_>    for i:=Low(iconOn) to High(iconOn) do
LA_>      if (Length(groupChildCount)>0) then groupChildCount[i] := groupChildCount[i] + childCount[i];
LA_>    ...
LA_>    var TempNilArray: Array of Integer; // локальная переменная
LA_>    SetListGroupIcons(somehandle1, somehandle2, somehandle2, TempNilArray); // вызывается из другой процедуры
LA_>

LA_>Где моя ошибка?

LA_>(полный код на си есть здесь)


в полный код лезть не стал, интуитивно сделал вот так, попробуйте:
const
IGNOREEVENT_MAX = 8;
CLM_GETNEXTITEM = 255;//убрать
CLGN_CHILD = 255;//убрать


type
TChildCounts = packed array[0..IGNOREEVENT_MAX — 1] of Cardinal;

procedure SetListGroupIcons(hwndList:Hwnd;
hFirstItem : THandle;
hParentItem : THandle;
var groupChildCount: PIntegerArray);
Var
childCount : TChildCounts;
iconOn : TChildCounts;
temp : PIntegerArray;
i : Cardinal;
begin
fillchar(childCount, IGNOREEVENT_MAX, 0);
fillchar(iconOn, IGNOREEVENT_MAX, 1);

hChildItem:=THandle(SendMessage(hwndList,CLM_GETNEXTITEM,
CLGN_CHILD,LPARAM(hItem)));
if hChildItem <> 0 then
begin
temp := @childCount;
SetListGroupIcons(hwndList,hChildItem,hItem, temp);
end;

for i:=0 to SIZEOF(iconOn) — 1 do
begin
if (groupChildCount <> nil) then
inc(groupChildCount^[i], childCount[i]);
end;
end;

SetListGroupIcons(somehandle1,somehandle2,somehandle3,nil);

и вообще, какая именно ошибка? рантайм или компиляция?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.