Schauen wir uns im PSDK einmal an, was beim Versuch, die Toolbar zu ändern, geschieht:
TBN_BEGINADJUST-Benachrichtigung, die uns aber nicht weiter interessiert.TBN_INITCUSTOMIZE-Benachrichtigung an, die wir verwenden können, um den Hilfe-Button aus dem Dialogfeld (auf das wir noch warten) auszublenden. Dies setzt allerdings eine etwas aktuellere Delphi-Version voraus, denn o.g. Benachrichtigung und die zu benutzende Reaktion darauf sind z.B. in Delphi 5 noch nicht bekannt. Das macht aber nichts, da wir uns die entsprechenden Daten aus dem aktuellen PSDK holen können:const TBN_INITCUSTOMIZE = TBN_FIRST - 23; TBNRF_HIDEHELP = $00000001;Nach der Definition im PSDK zu urteilen, sollte dafür aber mindestens der IE5 installiert sein. Um also den Hilfe-Button auszublenden, beantworten Sie die Benachrichtigung mit
TBNRF_HIDEHELP:WM_NOTIFY:
case PNMToolBar(lp)^.hdr.code of
TBN_INITCUSTOMIZE:
Result := TBNRF_HIDEHELP;
end;TBN_QUERYINSERT-Benachrichtigung für jeden Button der Toolbar. Wenn Sie diese mit false (Null) beantworten, verhindern Sie, dass ein Button wieder in die Toolbar eingefügt werden kann, nachdem er entfernt wurde. Das gleiche gilt mit umgekehrten Vorzeichen für die Benachrichtigung TBN_QUERYDELETE: hier verhindern Sie mit false, dass der Button aus der Toolbar entfernt werden kann.if(PNMToolbar(lp)^.iItem = 0) then Result := LRESULT(false)
else Result := LRESULT(true);
beantworten. Problematisch wäre, wenn Sie nur TBN_QUERYINSERT auf diese Weise beantworten. Dann könnte der Button zwar aus der Toolbar entfernt, aber nicht mehr eingefügt werden.TBN_QUERYINSERT-Benachrichtigungen mit false beantworten. Daher auch das anfängliche "Flackern".TBN_GETBUTTONINFO-Benachrichtigung an; wieder für jeden Button. Sie müssen hier nichts weiter tun, als den jeweiligen Button aus Ihrer globalen Variable an das NMTOOLBAR-Record zu übertragen, das im lParam steckt:WM_NOTIFY:
case PNMToolBar(lp)^.hdr.code of
TBN_GETBUTTONINFO:
begin
nItem := PNMToolBar(lp)^.iItem;
if(nItem < length(tbButtons)) then
begin
PNMToolBar(lp)^.tbButton := tbButtons[nItem];
Wenn Ihre Buttons keinen eigenen Text benutzen (also nur Symbole darstellen), dann sollten Sie erklärenden Text zuweisen, weil Sie sonst auch nur die Symbole im Dialog sehen: lstrcpy(PNMToolBar(lp)^.pszText,
pchar('Toolbutton ' + inttostr(nItem+1)));
end;
Solange Buttons vorhanden sind, solange sollten Sie auf die Benachrichtigung mit true antworten. Sind keine Buttons mehr da, senden Sie false: Result := LRESULT(not(nItem=length(tbButtons)));
end;
end;Damit sollten Sie die Dialogbox jetzt sehen.