![]() |
TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Zusammen...
Ein Problem habe ich noch vielleicht kann ja einer von Euch besser C. Ich würde gerne im TWebbrowser ein Grid anzeigen...
Delphi-Quellcode:
Hierbei müsste "nur" noch VFactory richtig gesetzt werden. Als Interface Procedure auf eine IHTMLPainter Routinen...
error := ((HTMLDocument2Ifc as IHTMLDocument2).body as IHTMLElement2).addBehavior('',vFactory);
In C sieht die so aus:
Delphi-Quellcode:
Auf ähnliche Weise muss die SnaptoGrid eingebunden werden...
STDMETHODIMP CHTMLEditControlSite::XHTMLPainter::Draw(RECT rcBounds, RECT /*rcUpdate*/, LONG /*lDrawFlags*/, HDC hdc, LPVOID /*pvDrawObject*/)
{ if (m_bGrid != FALSE) { HPEN redPen = (HPEN) CreatePen(PS_DOT, 0, RGB(0xff, 0x99, 0x99)); HPEN oldPen = (HPEN) SelectObject(hdc, redPen); long lFirstLine = rcBounds.left + m_iGrid; for (int i = lFirstLine; i <= rcBounds.right; i += m_iGrid) { MoveToEx(hdc, i, rcBounds.top, NULL); LineTo(hdc, i, rcBounds.bottom); } lFirstLine = rcBounds.top + m_iGrid; for (i = lFirstLine ; i <= rcBounds.bottom; i += m_iGrid) { MoveToEx(hdc, rcBounds.left, i, NULL); LineTo(hdc, rcBounds.right, i); } SelectObject(hdc, oldPen); DeleteObject(redPen); } return S_OK; } Hat einer von Euch das als Delphi Source? Ich habe auch noch 2* Source und Demo in C gefunden: Einmal ![]() und ![]() Danke im Voraus Frank :coder: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Zusammen...
Vielleicht hat ja einer von Euch eine Idee, wie ich eine QueryService procedure in mein Form-Object implementiere. Das würde mir schon helfen. Frank :coder: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Frank,
meinst du das hier?
Delphi-Quellcode:
Grüße vom marabu
uses
{...} ActiveX; type TForm1 = class(TForm, IServiceProvider) public function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; end; |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Meine Test Unit:
Delphi-Quellcode:
Frank :wiejetzt:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw,ActiveX,MSHTML; type TForm1 = class(TForm,IServiceProvider) WebBrowser1: TWebBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); private { Private-Deklarationen } public { Public-Deklarationen } function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Webbrowser1.Navigate('http://www.delphipraxis.net'); end; function TForm1.QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; begin Caption := 'Query'; // Wird nie Aufgerufen end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin (Webbrowser1.Document as IHTMLDocument2).designMode := 'on'; end; end. |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Vielleicht weil deine Form nicht der Host für die TWebBrowser-Komponente ist.
Nachtrag: wenn ich richtig gelesen habe, dann muss deine Form auch die Schnittstelle IOleClientSite implementieren, deren Methode QueryInterface verwendet wird um den ServiceProvider zu ermitteln. marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Frank |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Wenn ich jedoch IOleClientSite und IHTMLPainter und IHTMLBehavior und IHTMLBehaviorFactory in mein TForm include... :wall: :wiejetzt: Wie kann ich unterschiedliche QueryInterface declarieren? Frank :coder: :roteyes: :spin2: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Wieso denn "unterschiedliche" QueryInterface? Die Interfaces teilen sich doch eine Implementierung dieser Methode - oder verstehe ich dich falsch?
marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Delphi-Quellcode:
und
STDMETHODIMP CHTMLEditControlSite::XHTMLEditHost::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLEditHost); return pThis->ExternalQueryInterface(&iid, ppvObj); }
Delphi-Quellcode:
und
STDMETHODIMP CHTMLEditControlSite::XHTMLElementBehaviorFactory::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLElementBehaviorFactory); *ppvObj = NULL; if (IsEqualIID(iid, IID_IElementBehaviorFactory)) { *ppvObj = (IUnknown *) this; return S_OK; } else if (IsEqualIID(iid, IID_IElementBehavior)) { *ppvObj = (IUnknown *) &pThis->m_xHTMLElementBehavior; return S_OK; } return E_NOTIMPL; }
Delphi-Quellcode:
Also drei Mal QueryInterface mit unterschiedlichen Auswirkungen...
STDMETHODIMP CHTMLEditControlSite::XHTMLPainter::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLPainter); return pThis->ExternalQueryInterface(&iid, ppvObj); } Ich habe es jetzt so gelöst, da das ursprüngliche Obj kein Interface ist und ich keinen TypCast hingekiregt habe...
Delphi-Quellcode:
function TForm1.MyQuery(out Obj: IInterface): HRESULT;
begin Obj := Self as IHTMLPainter; Result := S_OK; end; function TForm1.MyQuery2(out Obj: IInterface): HRESULT; begin Obj := Self; Result := S_OK; end; function TForm1.MyQuery3(out Obj: IInterface): HRESULT; begin Obj := Self as IElementBehaviorFactory; Result := S_OK; end; function TForm1.MyQuery4(out Obj: IInterface): HRESULT; begin Obj := Self as IElementBehavior; Result := S_OK; end; function TForm1.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; begin Inherited QueryInterface(IID,Obj); if IsEqualGUID(IID,IID_IElementBehaviorFactory) then begin result := MyQuery3(IUnknown(Obj)); exit; end; if IsEqualGUID(IID,IID_IElementBehavior) then begin result := MyQuery4(IUnknown(Obj)); exit; end; if IsEqualGUID(IID, IID_IHTMLPainter) then begin result := MyQuery(IUnknown(Obj)); exit; end; if IsEqualGUID(IID, IID_IUnKnown) then begin result := MyQuery2(IUnknown(Obj)); exit; end; result := E_NOTIMPL; end; Ich habe ein Testprogramm mit EmbeddedWB! Diese Unit "schafft" es den QueryInterface zu erhalten. Bei mit kommt im Queryinterface immer nur ein TGUID = '{00000000-0000-0000-C000-000000000046}' einmal und sonst NIX! Frank :wall: :wall: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Wolltest du es vielleicht so?
Delphi-Quellcode:
marabu
// ungetestet
function TForm1.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; begin Result := S_OK; if IsEqualGUID(IID, IID_IElementBehaviorFactory) then IInterface(Obj) := self as IElementBehaviorFactory else if IsEqualGUID(IID, IID_IElementBehavior) then IInterface(Obj) := self as IElementBehavior else if IsEqualGUID(IID, IID_IHTMLPainter) then IInterface(Obj) := self as IHTMLPainter else Result := inherited QueryInterface(IID, Obj); end; |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Folgende events kommen in dieser Procedure in dieser Reihenfolge an:
Delphi-Quellcode:
Leider wird die IHTMLPainter.Draw nie aufgerufen...
IID_IElementBehaviorFactory:{3050F429-98B5-11CF-BB82-00AA00BDCE0B}
IID_IElementBehavior:{3050F425-98B5-11CF-BB82-00AA00BDCE0B} IID_IProxyManager:TGUID ='{00000008-0000-0000-C000-000000000046}' ??? {3050F4FA-98B5-11CF-BB82-00AA00BDCE0B} IID_IPersistPropertyBag2:TGUID ='{22F55881-280B-11D0-A8A9-00A0C90C2004}' IID_IPersistPropertyBag:TGUID ='{37D84F60-42CB-11CE-8135-00AA004BB851}' IID_CPC:TGUID = '{B196B284-BAB4-101A-B69C-00AA00341D07}' IID_IHTMLPainter:{3050F6A6-98B5-11CF-BB82-00AA00BDCE0B} ??? {3050F6DE-98B5-11CF-BB82-00AA00BDCE0B} IID_IHTMLPainterOverlay: TGUID = '{3050F7E3-98B5-11CF-BB82-00AA00BDCE0B}'; IID_IHTMLPainterEventInfo: TGUID = '{3050F6DF-98B5-11CF-BB82-00AA00BDCE0B}'; IID_IElementBehaviorCategory: TGUID = '{3050F4ED-98B5-11CF-BB82-00AA00BDCE0B}'; IID_IOleCommandTarget = "{B722BCCB-4E68-101B-A2BC-00AA00404770}" IID_IElementBehaviorLayout: TGUID = '{3050F6BA-98B5-11CF-BB82-00AA00BDCE0B}'; Hast Du noch eine Idee? Ach ja die Behavior setze ich so: (Ich hasse Interfaces)
Delphi-Quellcode:
mfg Frank :coder:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant); var vFactory : OleVariant; Body : IHTMLElement; Body2 : IHTMLElement2; Doc : IHTMLDocument2; begin (Webbrowser1.Document as IHTMLDocument2).designMode := 'on'; (Webbrowser1.Document as IHTMLDocument2).execCommand('2D-Position', false,true); (Webbrowser1.Document as IHTMLDocument2).execCommand('MULTIPLESELECTION',false,true); (Webbrowser1.Document as IHTMLDocument2).execCommand('Liveresize',false,true); Doc := (Webbrowser1.Document as IHTMLDocument2); Body := Doc.createElement('body'); if Body = NIL then exit; Body.QueryInterface(IID_IHTMLElement2,Body2); if Body2 = NIL then begin Body._Release; exit; end; VFactory := IElementBehaviorFactory(Self); Body2.addBehavior('',vFactory); Body._Release; Body2._Release; end; |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
PS.: Die Aufrufreihenfolge ist
FindBehavior Init GetPainterInfo Notify Detach Jedoch liefert ein PaintSite.InvalidateRect(NIL); einen Fehler $8000FFFF { Catastrophic failure } E_UNEXPECTED = HRESULT($8000FFFF); Frank :gruebel: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
hähem.... Push :oops:
Hat das von Euch noch niemand verwenden? Frank :angel: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Ich habe diese Schnittstellen in noch keinem Projekt gebraucht, aber wenn du Code-Fragmente zum debuggen hast, dann stelle sie ruhig ein.
marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Werde ich machen...Danke für das Angebot. Frrank |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Mfg Frank |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Frank,
ich habe ein Rahmenprojekt implementiert, welches ohne die von dir verwendete EditHost-Komponente auskommt. Ist nicht viel Code, tut nicht viel, aber soll möglichst deutlich die Vorgehensweise beim Implementieren der Schnittstelle IHTMLEditHost zeigen. Ich habe den von dir verwendeten EmbeddedWebBrowser zugrunde gelegt. Die Unit MSHTML_TLB verwende ich nicht direkt, sondern schlachte sie nach Bedarf aus. Wenn Interesse besteht, dann baue ich das Projekt noch weiter aus. Kann aber dauern, da ich momentan bei einem Kunden eingespannt bin und zusammenhängende Zeit zu finden nicht einfach ist. Grüße vom marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo!
Sorry, aber das war es leider nicht... Es ging darum, das der QueryService NUR aufgerufen wird, wenn diese EmbeddedWebBrowser komponente verwendet wird. Diese Komponente nutzt übrigens auch die MSHTML_TLB und Du hast die Indirekt auch verwendet, den MSHTML ist das gleiche - nur von Borland und veraltet. Es ging mir darum die Paintsite implementierung zu erhalten um das Grid zu zeichnen... Ich hatte Dir doch ein Demo-Programm geschickt... Trotzdem Danke für Deine Mühe... LG Frank PS.: Vielleicht kannst Du ja nochmal schauen, warum QueryService in einem "normalen" Form nicht funktioniert, bzw. ein PaintSite.Invalidate eine Catrastrophic failure liefert... |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Frank.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Freundliche Grüße marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Zitat:
Zitat:
Zitat:
LG Frank :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz