AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

HtmlHelp-API - HH_Get_Win_Type

Ein Thema von taaktaak · begonnen am 12. Jan 2008 · letzter Beitrag vom 14. Jan 2008
Antwort Antwort
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 16:39
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)
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 17:31
Hmmmm, ich bin jetzt im HTML Help auf folgendes gestossen...


bei HH_Set_Win_Type wird der Aufruf wie folgt erklärt ...

Code:
HtmlHelp(
         GetDesktopWindow(),
         "..\\help.chm>mainwin",
         HH_SET_WIN_TYPE,
          (DWORD) &WinType) ; // points to an HH_WINTYPE structure

bei HH_Get_Win_Type ist die Aufrufkonvention etwas anders (?!- man beachte das kleine p vor WinType) ...

Code:
 HtmlHelp(
          GetDesktopWindow(),
          "Help.chm>mainwin",
          HH_GET_WIN_TYPE,
          (DWORD) &pWinType) ; // specifies a pointer to an HH_WINTYPE structure
Tja, daran wird es wohl liegen. Meine Prozeduren übergeben die Datenstruktur "WinType" ja in beiden Prozeduren auf die gleiche Art und Weise - und das ist offenbar falsch. Aber mir schwirrt der Kopf und ich seh' den Wald vor lauter Bäumen nicht mehr. Was muss ich nur anders machen?

Gruß Ralph
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 30. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 18:14
Hi! Das sieht ganz danach aus, als würde HH_GET_WIN_TYPE einen Zeiger auf eine WinType-Struktur zurückgeben...
Also ein
Delphi-Quellcode:
type
pWinType = ^HH_WinType;
Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 18:21
Hallo Ralph,

bei HH_SET_WIN_TYPE lieferst du einen Zeiger auf deine eigene Struktur, bei HH_GET_WIN_TYPE hingegen erhältst du einen Zeiger auf eine interne Struktur. Probiere es mal so:

Delphi-Quellcode:
var
  pwt: PHHWinType;
  wt: THHWinType;
  // ...
begin
  // ...
  Hnd := HtmlHelp(0, PChar(Application.HelpFile + '>MainWindow'), HH_Get_Win_Type, DWord(@pwt));
end;
Getippt und nicht getestet.

EDIT: Richtig, Chris - der Zeiger ist ja auch vordefiniert.

Freundliche Grüße
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#5

Re: HtmlHelp-API - HH_Set_Win_Type / HH_Get_Win_Type

  Alt 12. Jan 2008, 19:32
Hallo Chris, Hallo Achim!

Vielen Dank für die Denkansätze!
Es funktioniert jetzt!

Diese "Zeigergeschichten" sind mir (leider) immer noch ein Graus Da war eure Unterstützung und das Gefühl nicht allein zu sein, schon sehr wertvoll! Für die Nachwelt hier noch mal beide Prozeduren in einer leicht verallgemeinerten Form ...

Delphi-Quellcode:
procedure ~~.SetHtmlWindowPos(NewCaption:String;
                              Top,Left,Width,Height:Integer); // Aufruf unmittelbar VOR
var WT : HH_WinType; // Hilfeaufruf, sonst wird
begin // Fenster an vordefinierter
  fillchar(WT,SizeOf(WT),0); // Position geöffnet

  with WT do begin
    cbStruct :=SizeOf(WT);
    pszType :=PChar('MainWindow'); // << Name des FensterTyps an DIESER Stelle übergeben!
    fsValidMembers:=HHWin_Param_Rect; // NICHT im Aufruf von HtmlHelp()

    pszCaption :=PChar(NewCaption);
    rcWindowPos.Top :=Top;
    rcWindowPos.Left :=Left;
    rcWindowPos.Right :=Left+Width;
    rcWindowPos.Bottom:=Top+Height;
    end;

  HtmlHelp(0,PChar(Application.HelpFile),HH_Set_Win_Type,DWord(@WT));
end;

function ~~.GetHtmlWindowPos(var iLeft,
                                 iTop,
                                 iWidth,
                                 iHeight:Integer):Boolean; // Ermittelt NUR die aktuell
var WT : HH_WinType; // gültige "Startposition/-größe"
    pWT : ^HH_WinType; // Werte eines von Anwender
    Hnd : HWND; // verschobenen/in der Größe veränderten
begin // Fensters werden NICHT zurückgeliefert!
  Result:=false;

  pWT:=@WT;
  fillchar(pWT^,SizeOf(pWT^),0);
  pWT^.cbStruct:=SizeOf(pWT^);
                                           // v- Name des FensterTyps an DIESER Stelle übergeben!
  Hnd:=HtmlHelp(0,PChar(Application.HelpFile+'>MainWindow'),HH_Get_Win_Type,DWord(@pWT));

  if Hnd>0 then
    with pWT^.rcWindowPos do begin
      iLeft :=Left;
      iTop :=Top;
      iWidth :=succ(Right-Left);
      iHeight:=succ(Bottom-Top);
      Result:=true;
      end;
end;
Gruß Ralph

//edit: Tippfehler beseitigt
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

Re: HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 19:58
Hihihihi,
noch ein (letzter) Nachtrag - der wiederum zeigt, wie sehr das jetzt ein "Basteln" war. Es geht offenbar noch kürzer:

Delphi-Quellcode:
function ~~.GetHtmlWindowPos(var iLeft,
                                 iTop,
                                 iWidth,
                                 iHeight:Integer):Boolean; // Ermittelt NUR die aktuell
                                                           // gültige "Startposition/-größe"
var pWT : ^HH_WinType; // Werte eines von Anwender
    Hnd : HWND; // verschobenen/in der Größe veränderten
begin // Fensters werden NICHT zurückgeliefert!
  Result:=false;
                                             // v- Name des FensterTyps an DIESER Stelle übergeben!
  Hnd:=HtmlHelp(0,PChar(Application.HelpFile+'>MainWindow'),HH_Get_Win_Type,DWord(@pWT));

  if Hnd>0 then
    with pWT^.rcWindowPos do begin
      iLeft :=Left;
      iTop :=Top;
      iWidth :=succ(Right-Left);
      iHeight:=succ(Bottom-Top);
      Result:=true;
      end;
end;
Zu beachten ist aber folgender Hinweis aus der Html Help, wenn man das Ergebnis verändern will ...

Zitat:
"Deep copy the structure to which dwData points before modifying the structure"
Gruß Ralph

//edit: Tippfehler beseitigt
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: HtmlHelp-API - HH_Get_Win_Type

  Alt 14. Jan 2008, 17:25
Moin, Moin,
zur Anwendung der Prozedur SetHtmlWindowPos muss ich eine ergänzende Bemerkung nachliefern. Der Hinweis

Zitat:
// Aufruf unmittelbar VOR
// Hilfeaufruf, sonst wird
// Fenster an vordefinierter
// Position geöffnet
ist nur gültig, wenn das benannte Fenster (d.h. WindowType) im HTML Help Workshop OHNE die Option "Save user defined window position after first use" definiert wurde. Ist diese Option aktiviert, korrigiert das Anzeigeprogramm die von dieser Prozedur gesetzte Position/Größe sofort wieder auf die vom Anwender zuletzt eingestellte Position/Größe - d.h. in diesem Fall muss die Prozedur NACH dem Aufruf der Hilfeseite erfolgen.
Gruß Ralph
Ralph
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz