Moin, Moin,
bin gerade dabei meine Hilfen von .HLP auf .CHM umzustellen. Units, die auch Delphi7 einen Zugriff auf die HtmlHelp-
API ermöglichen, gibt es ja im Internet in vielen Varianten. Für mich ist es besonders wichtig, in MultiMonitorsystemen das Hilfefenster durch das Programm positionieren zu können. Da habe ich für Delphi nix finden können und bin dann bei
MSDN gelandet (und bereue es erneut, praktisch keine Kenntnisse in C oder VB zu besitzen).
Anyway, habe jetzt folgende Prozedur zusammengebastelt, die es tatsächlich schafft das unmittelbar danach aufzurufende Hilfefenster an eine beliebige Position und eine beliebige Caption zu setzen:
Delphi-Quellcode:
procedure TForm1.buSetWinPosClick(Sender:TObject); // call SetWinPos separately
var WT : HH_WinType; // before HelpCall,
begin // otherwise HelpWindow will have
fillchar(WT,SizeOf(WT),0); // default position and -size
with WT do begin
cbStruct :=SizeOf(WT);
pszType :=PChar('MainWindow'); // name of window type MUST be given!!!
fsValidMembers:=HHWin_Param_Rect; // we will change rectangle of helpwindow
pszCaption :=PChar('blabla'); // new caption
rcWindowPos.Top :=0; // new
rcWindowPos.Left :=1051; // position
rcWindowPos.Right :=1551; // and
rcWindowPos.Bottom:=600; // size
end;
HtmlHelp(0,PChar(Application.HelpFile),HH_Set_Win_Type,DWord(@WT));
end;
Nun gibt es auch die Konstante HH_Get_Win_Type, mit der man - davon gehe ich mal aus - z.B. die Position und Größe des gerade offenen Hilfefensters ermitteln kann. Wenn ich die Werte setzen kann, dann sollte es doch einfach sein diese auch zu lesen. Habe ich zumindest gedacht. Folgende Prozedur sollte das tun:
Delphi-Quellcode:
procedure TForm1.buGetWinPosClick(Sender:TObject); // doesn't work ???
var WT : HH_WinType;
Hnd : HWND;
begin
fillchar(WT,SizeOf(WT),0);
with WT do begin
cbStruct :=SizeOf(WT);
pszType :=PChar('MainWindow'); // needed ?
fsValidMembers:=HHWin_Param_Rect; // needed ?
end;
Hnd:=HtmlHelp(0,PChar(Application.HelpFile{+'>MainWindow'}),HH_Get_Win_Type,DWord(@WT));
if Hnd>=0 then
with WT.rcWindowPos do begin
laLeft. Caption:='Left=' +IntToStr(Left); // always 0
laTop. Caption:='Top=' +IntToStr(Top); // always 0
laRight. Caption:='Right=' +IntToStr(Right); // always 0
laBottom.Caption:='Bottom='+IntToStr(Bottom); // always 0
end;
end;
Tja, das tut das Mist-Stück aber nicht. Egal was ich bisher versucht habe, ich bekomme immer die Initialisierungswerte (0) zurück. Kann mir da einer auf die Sprünge helfen?
Gruß Ralph
PS : Ich gehe mal davon aus, dass diejenigen, die hier helfen können/wollen die InterfaceUnit nicht benötigen (falls doch, werde ich sie als Attachment natürlich nachliefern)