AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

IHTMLDocument2 Events

Ein Thema von Medium · begonnen am 1. Aug 2010 · letzter Beitrag vom 19. Dez 2014
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#1

IHTMLDocument2 Events

  Alt 1. Aug 2010, 16:42
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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: IHTMLDocument2 Events

  Alt 2. Aug 2010, 16:58
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! 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ö!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 2. Aug 2010 um 17:09 Uhr)
  Mit Zitat antworten Zitat
machstuhl

Registriert seit: 17. Jul 2012
40 Beiträge
 
#3

AW: IHTMLDocument2 Events

  Alt 19. Dez 2014, 09:24
<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
  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 06:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf