2009-07-03 4 views
0

was ist da falsch?Verwenden von FindVCLWindow zum Aufrufen von WinHelp32 (WinXP Pro SP3 32bit) in Delphi

procedure TForm1.VCLHelpClick(Sender: TObject); 
var Ctrl : TWinControl; 
begin 
Ctrl := FindVCLWindow(Mouse.CursorPos); 
if Ctrl <> nil then 
    if Form2.Cursor = crHelp then begin 
    if Ctrl = CreatorEdit then Application.HelpCommand(HELP_CONTEXT,001); 
    if Ctrl = EditorEdit then Application.HelpCommand(HELP_CONTEXT,002); 
    if Ctrl = UpdaterEdit then Application.HelpCommand(HELP_CONTEXT,003); 
    if Ctrl = IdeaEdit then Application.HelpCommand(HELP_CONTEXT,004); 
    if Ctrl = PorterEdit then Application.HelpCommand(HELP_CONTEXT,005); 
    end; 
end; 

Die Idee ist einfach - i Form Grenze Symbole für die Hilfe-Taste haben, und wenn ich es klicken, Cursor Änderungen in crHelp. Wenn ich für eine der IFs unter Kontrolle klicke, ruft sie das Hilfesystem auf und öffnet die zugehörige Hilfedatei mit Kontext vom Befehl. Aber es funktioniert nicht ... Liegt das daran, dass ich keine Unterstützung für KLink/ELinks in der Hilfedatei selbst hinzugefügt habe?

Für Hilfe beim Erstellen und Entwickeln verwende ich ShalomHelpMaker Software.

Antwort

2

Haben Sie versucht, den Code zu debuggen? Und kannst du uns sagen, was falsch gelaufen ist?

Außerdem, warum Sie nicht verwenden, um die Context wie:

procedure TForm1.VCLHelpClick(Sender: TObject); 
var Ctrl : TWinControl; 
begin 
    if Form2.Cursor <> crHelp then // Are you sure this is Form2??? 
    Exit; 
    Ctrl := FindVCLWindow(Mouse.CursorPos); 
    if Ctrl = nil then Exit; 

    Application.HelpCommand(HELP_CONTEXT, Ctrl.HelpoContext); 
end; 

Sieht aus wie FindVCLControl einige andere Dinge tut. Aber der folgende Code funktioniert:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ctrl : TControl; 
    point : TPoint; 
begin 
    point := Mouse.CursorPos; // Mouse pos at screen 
    Dec(point.X, Left); // Adjust for window. 
    Dec(point.Y, Top); 
    Dec(point.Y, GetSystemMetrics(SM_CYCAPTION)); // Adjust to client area. 

    ctrl := ControlAtPos(point, True, True, True); 

    // Do something with the control 
end; 

Sie müssen wahrscheinlich einige weitere Optimierungen, aber dies funktioniert die Steuerung eines Fensters von der Position zu bekommen.

+0

Hmmm, ich habe es vor kurzem gemacht und es hat Control nicht erkannt. Und ich habe dieses (kurze) Formular nicht benutzt, weil das Formular2 dynamisch ist und ich die erforderliche Kontext-ID zur Runtime hinzugefügt habe. Wenn ich es finden muss, muss ich meinen gesamten Code durchsuchen (scrool). In diesem Fall kann ich genau lesen welche ID ich öffne ohne nach HelpContext ID Wert zu suchen. –

+0

Probieren Sie einfach Ihren Code aus. Funktioniert nicht. –

+0

@HX_Unbanned, sieht aus wie FindVCLWindow ist das Problem. Ich gebe eine Alternative in meine Antwort. –

0

Arbeitscode:

procedure TForm1.VCLHelpClick(Sender: TObject); 
var WCtrl : TWinControl; 
begin 
    WCtrl := FindVCLWindow(Mouse.CursorPos); 
    if WCtrl <> nil then 
    Application.HelpCommand(HELP_CONTEXT, wCtrl.HelpContext); 
end; 

P. S. alle vorherigen code Probobly war auch in Ordnung, aber ich überprüfte meine Event-Handler und fand, dass in einem Tabel es fehlte (obwohl wenn ich auf diejenigen klickte, die onclick hatten, hat es nicht funktioniert). Plus ... Problem probobly war die fehlerhafte Cursorprüfung.

Ok, vielen Dank für die Unterstützung, Leute!

Verwandte Themen