Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   IHTMLDocument2 Events (https://www.delphipraxis.net/153404-ihtmldocument2-events.html)

Medium 1. Aug 2010 16:42

IHTMLDocument2 Events
 
Moinmoin!

Ich benutze einen TWebbrowser als HTML-Editor, und hab ein wenig Last mit der Enter-Taste. Wenn in den Webbrowser geklickt wird, kann ich darin zwar schreiben und alles, allerdings behält das zuvor geklickte Control den Focus, und wird beim Drücken von Return ausgelöst. Ich möchte statt dessen aber lieber in meinem Webbrowser einen neuen Paragraph haben! (Shift-Enter für ein <br> klappt.)

Ich hab nun gesehen, dass das IHTMLDocument2 Interface auch Events wie OnKeyPressed usw. anbietet, diese sind aber vom Typ OleVariant. Laut MSDN sollte an diese Handler ein IDispatch Interface gehängt werden, dessen Objekt eine Default-Methode mit der gewünschten Funktion implementiert. Erm, geht das auch einfacher? :) Ich will ja nur erreichen, dass meine Controls das Enter nicht mit bekommen, und der Webbrowser brav sein <p> pflanzt.
Ich vermute eine ganz simple Lösung, die ich einfach nur durch Zutiefdrinstecken nicht mehr sehe.

Heissen Dank schon mal!

Medium 2. Aug 2010 16:58

AW: IHTMLDocument2 Events
 
Mein neuster Ansatz war jetzt das OnKeyDown des Formulars zu verwenden, und wenn der TWebbrowser den Fokus hat, dort ein "InsertParagraph" hin abzusetzen, wenn #13 vorbei fliegt.

Problem: Der TWebbrowser liegt auf einem Panel, auf einem Panel, auf einer TAdvOfficePage, in einem TAdvOfficePager (TMS Kompos), auf einem Frame in einem Panel auf einem Formular.
Die einzigen in dieser Liste mit einem OnKeyDown-Event sind das Formular, und der TAdvOfficePager, und bei beiden kommt kein Ereignis an, wenn ich mit dem Caret im Webbrowser auf Enter drücke. Der zuvor geklickte Button (Kompo in meinem Programm, kein Button auf der Webseite) wird aber dennoch (unerwünschterweise) brav ausgelöst! :evil: Von wem?
(Das Formular ist auch der einzige Kandidat mit der KeyPreview-Property, deren Einstellung keine Auswirkung zeigt.)

Ich werd noch blöd hier :(



Edit: Oder frag ich mal anders. Ziel ist es, formatierten Text offline erstellen zu können, und diesen als HTML nachher in eine DB zu schubsen. Mehr als Fett/Kursiv/Unterstrichen, Ausrichtung links/mitte/rechts, Font, -größe, -farbe und un/-geordnete Listen braucht es dabei nicht.
Die RTF-to-HTML-Welt habe ich schon ziemlich abgeklappert, und auch nichts zufriedenstellendes gefunden, vor allem weil zum nachträglichen Bearbeiten der Rückweg genauso funktionieren muss, und zwar so, dass alles noch so ausschaut wie vorher.


@Mods: Ich würde mich freuen, wenn einer von euch den Titel zu "Enter im TWebbrowesr" ändern könnte, da ich ja jetzt etwas vom spezifischen Thema weg bin. Dangö!

machstuhl 19. Dez 2014 09:24

AW: IHTMLDocument2 Events
 
<BR> anstatt <P> bei Enter im TWebbrowser

Delphi-Quellcode:
type
  //Create the procedure type to assign the event
  TObjectProcedure = procedure(Sender: TObject; Event: IHTMLEventObj) of object;

  //Create a new class for manage the event from the twebbrowser
  TEventObject = class(TInterfacedObject, IDispatch)
  private
    FOnEvent2: TObjectProcedure;
  private
    constructor Create(const OnEvent: TObjectProcedure);
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  public
    property OnEvent: TObjectProcedure read FOnEvent2 write FOnEvent2;
  end;


procedure TFrameHTMLEditor.WebBrowser1OnKeyDown(Sender: TObject;
  EventObjIfc: IHTMLEventObj);
var
  selectionRange: IHtmlTxtRange;
begin
// DocInterFace ist Webbrowser.Document as IHTMLDocument2 

  if Not Assigned(WebBrowser1.Document) then
    Exit;

  // Wenn Enter gedrückt wird, soll kein Absatz eingefügt werden (sondern ein ganz normaler Zeilenumbruch)
  if DocInterface.parentWindow.event.keyCode = VK_RETURN then begin

    selectionRange := DocInterface.selection.createRange as IHtmlTxtRange;

    selectionRange.pasteHTML('<br>');
    // returnValue bewirkt, dass der ursprüngliche Wert (<p>) nicht zurückgegeben wird
    DocInterface.parentWindow.event.returnValue := False;
    DocInterface.parentWindow.event.keyCode :=0;
  end;
end;

constructor TEventObject.Create(const OnEvent: TObjectProcedure );
begin
  inherited Create;
  FOnEvent2 := OnEvent;
end;

function TEventObject.GetIDsOfNames( const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
  DispIDs: Pointer ): HResult;
begin
  Result := E_NOTIMPL;
end;

function TEventObject.GetTypeInfo( Index, LocaleID: Integer; out TypeInfo ): HResult;
begin
  Result := E_NOTIMPL;
end;

function TEventObject.GetTypeInfoCount( out Count: Integer ): HResult;
begin
  Result := E_NOTIMPL;
end;

function TEventObject.Invoke( DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params;
  VarResult, ExcepInfo, ArgErr: Pointer ): HResult;
var
  HTMLEventObjIfc: IHTMLEventObj;
begin
  if (DispID = 0) then begin
    if Assigned(FOnEvent2) then
      FOnEvent2(Self, HTMLEventObjIfc);
    Result := S_OK;
  end else
    Result := E_NOTIMPL;
end;

procedure TFrameHTMLEditor.WebBrowser1NavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if FCurDispatch = nil then
    FCurDispatch := pDisp;
  DocInterface.onkeydown := (TEventObject.Create(WebBrowser1OnKeyDown) as IDispatch);
end;
Damit die Nachwelt auch noch was von meiner Arbeit hat :P


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