Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

#5 NewMenu

closed-fixed
nobody
None
5
2007-09-08
2007-09-07
mdw
No

Юрий, здравствуй. Столкнулся с тем что не работает OwnerDraw для меню. Причину нашел.
строчка в конце AParent.fMenuObj := Result; попала внутрь условия.

Вот вся функция с моими исправлениями:

function NewMenu( AParent : PControl; MaxCmdReserve : DWORD;
const Template : array of PKOLChar; aOnMenuItem: TOnMenuItem ): PMenu;
var M: PMenu;
{$IFDEF INITIALFORMSIZE_FIXMENU}
R: TRect;
{$ENDIF}
begin
{-}
New( Result, Create );
{+}{++}(*Result := PMenu.Create;*){--}
Result.FVisible := TRUE;
Result.FPopupFlags := TPM_LEFTALIGN or TPM_LEFTBUTTON;
Result.FItems := NewList;
Result.FOnMenuItem := aOnMenuItem;
if (High(Template)>=0) and (Template[0] <> nil) then
begin
{$ifdef win32}
if (AParent <> nil) and (AParent.fMenuObj = nil) and not AParent.fIsControl then
Result.FHandle := CreateMenu
else
{$endif win32}

Result.FHandle := CreatePopupMenu;
Result.FillMenuItems( Result.FHandle, 0, Template );
end;
if assigned( AParent ) then
begin
Result.FControl := AParent;
if AParent.fMenuObj <> nil then
begin
// add popup menu to the end of menu chain
M := PMenu( AParent.fMenuObj );
while M.fNextMenu <> nil do
M := M.fNextMenu;
M.fNextMenu := Result;
end
else
begin
if not AParent.fIsControl then
begin
{$IFDEF INITIALFORMSIZE_FIXMENU}
R := AParent.ClientRect;
{$ENDIF}
{$ifdef wince}
CeSetMenuProc:=@CeSetMenuHandler;
AParent.fMenu:=Result.FHandle;
if AParent.fHandle <> 0 then begin
DestroyWindow(SHFindMenuBar(AParent.fHandle));
CeSetMenu(AParent.fHandle, Result);
end;
{$else}
AParent.Menu := Result.FHandle;
{$endif wince}
{$IFDEF INITIALFORMSIZE_FIXMENU}
AParent.SetClientSize( R.Right, R.Bottom );
{$ENDIF}

//<B> AParent.fMenuObj := Result; было здесь

end;

//Должено быть здесь
AParent.fMenuObj := Result;

AParent.AttachProc( WndProcMenu );
{$IFDEF USE_AUTOFREE4CONTROLS}
AParent.Add2AutoFree( Result );
{$ENDIF}
end;
end;
end;

Discussion

  • jura
    jura
    2007-09-08

    • status: open --> closed-fixed
     
  • jura
    jura
    2007-09-08

    Logged In: YES
    user_id=1226674
    Originator: NO

    Исправил. Спасибо.