Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   nonVCL Kontextsensitive Hilfe unter Vista (https://www.delphipraxis.net/94200-nonvcl-kontextsensitive-hilfe-unter-vista.html)

Luckie 18. Jun 2007 00:46


nonVCL Kontextsensitive Hilfe unter Vista
 
Mir wurde berichtet, dass meine kontextsensitive Hilfe in meinem Usermanager nicht funktioniert. da ich selber kein Vista habe hier mal der relevante Code, eventuell sieht da ja jemand den Fehler oder kann ihn zu mindest nachstellen:
Delphi-Quellcode:
    WM_HELP:
begin
  ShowHelpHandle(PHelpInfo(lParam)^.hItemHandle, PHelpInfo(lParam)^.dwContextId);
end;

procedure ShowHelpHandle(ChildHandle: THandle; ContextId: Integer);
const
  marginrect             : TRect = (Left: - 1; Top: - 1; Right: - 1; Bottom: - 1);
var
  Popup            : THHPopup;
  URL              : string;
  rect: TRect;
  pt: TPoint;
begin
  URL := '::/popup.txt';

  if (ContextId >= 0) then
  begin
    FillChar(Popup, SizeOf(Popup), 0);
    Popup.cbStruct := SizeOf(Popup);
    Popup.hinst := 0;
    Popup.idString := 0;

    Popup.pszText := PChar(ContextInfo[ContextId]);

    GetWindowRect(ChildHandle, rect);
    pt.X := rect.Left + 100;
    pt.Y := rect.Top + 25;
    Popup.pt := pt;
    Popup.clrForeGround := TColorRef(-1);
    Popup.clrBackground := TColorRef(-1);
    Popup.rcMargins := marginrect;
    Popup.pszFont := '';

    HtmlHelp(0, @URL[1], HH_DISPLAY_TEXT_POPUP, dword(@Popup));
  end;
end;

MathiasSimmack 18. Jun 2007 06:35

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
:gruebel: Könntest du mir mal das Beispiel aus den Tutorials kompilieren und per Mail oder PN senden? Ich habe nämlich kein Delphi mehr, und ich würd's gern mal mit der Demo testen.

Luckie 18. Jun 2007 09:33

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
Liste der Anhänge anzeigen (Anzahl: 1)
Here we go. Ich sehe gerade ich rufe nicht
Delphi-Quellcode:
else Result := DefWindowProc(wnd,uMsg,wp,lp);
auf. Daran könnte es eventuell liegen.

Exe im Anhang.

PS: Installier dir gefälligst mal wieder Delphi. :? :mrgreen:

MathiasSimmack 19. Jun 2007 06:22

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
Zitat:

Zitat von Luckie
PS: Installier dir gefälligst mal wieder Delphi. :? :mrgreen:

Dann sollen die eins bringen, bei dem ich nicht das .NET 1.1 samt SDK brauche. :roll: Dann gern. :)


Mal als Reaktion auf diesen Beitrag: Wie schon erwähnt, ist der Registrywert und Vista ein REG_EXPAND_SZ. Es sind also zwei Schritte erforderlich: zum einen muss der Typ mit kontrolliert werden, und nach dem Auslesen des Pfades müssen evtl. vorhandene Umgebungsvariablen à la "%system%" umgewandelt werden. Die Funktion in der angepassten Unit aus den Tutorials sieht also so aus:
Delphi-Quellcode:
function GetOCXPath(var Path: string): Boolean;
const
  HHPathRegKey = 'CLSID\{adb880a6-d8ff-11cf-9377-00aa003b7a11}\InprocServer32';
var
  rgHandle      : HKEY;
  lpType, cbData : dword;
  pBuffer       : array[0..MAX_PATH]of char;
begin
  Result := false;
  lpType := REG_NONE;

  if(RegOpenKeyEx(HKEY_CLASSES_ROOT,HHPathRegKey,0,KEY_QUERY_VALUE,
    rgHandle) = ERROR_SUCCESS) then
  try
    lpType := REG_NONE;
    cbData := 0;

    if (RegQueryValueEx(rgHandle, nil, nil, @lpType,
          nil, @cbData) = ERROR_SUCCESS) and
       ((lpType = REG_SZ) or (lpType = REG_EXPAND_SZ)) and // <-- Typ
       (cbData > 1) then
    begin
      if RegQueryValueEx(rgHandle, nil, nil, @lpType,
           @pBuffer, @cbData) = ERROR_SUCCESS then
      begin
        Path  := string(pBuffer);
        Path  := ExpandEnvStr(Path); // <-- Umgebungsvariable
                                      // (Funktion in "MSysUtils.pas")
        Result := (Path <> '') and (fileexists(Path));
      end;
    end;
  finally
    RegCloseKey(rgHandle);
  end;
end;
Voilà.

Luckie 19. Jun 2007 09:12

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
Die Funktion ExpandEnvStr fehlt in meiner Version der MSysUtils.pas.

Daniel 19. Jun 2007 09:20

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von Luckie
PS: Installier dir gefälligst mal wieder Delphi. :? :mrgreen:

Dann sollen die eins bringen, bei dem ich nicht das .NET 1.1 samt SDK brauche. :roll: Dann gern. :)

Delphi 2007 ist Dein Freund. ;-)

Luckie 19. Jun 2007 09:35

Re: nonVCL Kontextsensitive Hilfe unter Vista
 
Ich habe das jetzt in den Usermanager eingebaut. Jetzt kann ich über eine Schaltfläche allerdings die Hilfe nicht mehr an einer bestimmten Stelle öffnen:
Delphi-Quellcode:
            ID_BTN_HELP:
              begin
                HelpFilename := ExtractFilepath(ParamStr(0)) + HELPFILE;
                Url := string(HelpFilename + '::hilfe.html#3');
                HtmlHelp(hDlg, PChar(Url), HH_DISPLAY_TOPIC, 0);
              end;
Die Hilfe besteht nur aus einer Seite mit Ankern innerhalb der Seite. Vor dem Fix wurde die Hilfe bei dem entsprechendem Anker geöffnet, jetzt öffnet sie sich ganz am Anfang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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