Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind... (https://www.delphipraxis.net/171106-twebbrowser-mshtml-auslesen-ob-bullets-gesetzt-sind.html)

MuTzE.Y85 20. Okt 2012 14:20

TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Hi Leute,

ich bastle gerade an einem sehr einfachen HTML-Editor.
Bis auf eine Sache funktioniert der recht gut.

Ich suche eine Möglichkeit auszulesen, ob an der Cursorposition Bullets (Aufzählung) gesetzt sind oder nicht.

Hier mal ein Ausschnitt aus dem Source.
Mit der Methode "ToggleBullet" aktiviere/deaktiviere ich sie:
Code:
private
    function HrExecCommand(ucmdID: cardinal; const pVarIn: OleVariant; var pVarOut: OleVariant; bPromptUser, bTriEditCmdGroup: boolean): HResult;

public
    DocCmd: IOleCommandTarget;
    function SpecialCommand(Cmd : Cardinal; PromptUser : boolean; editModeOnly : boolean; bTriEditCommandGroup : boolean; InputArgs : OleVariant): HRESULT;
    procedure ToggleBullet;

const
  MSOCMDEXECOPT_PROMPTUSER = OLECMDEXECOPT_PROMPTUSER;
  MSOCMDEXECOPT_DONTPROMPTUSER = OLECMDEXECOPT_DONTPROMPTUSER;
  GUID_TriEditCommandGroup: TGUID = '{2582F1C0-084E-11d1-9A0E-006097C9B344}';
  CMDSETID_Forms3: TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}';
  IDM_ORDERLIST = 2184;
  IDM_UNORDERLIST = 2185;

function TMainFrm.SpecialCommand(Cmd:Cardinal;PromptUser: boolean; editModeOnly: boolean; bTriEditCommandGroup: boolean; InputArgs:OleVariant): HRESULT;
begin
  Result := HrExecCommand(Cmd, null, InputArgs, promptUser, bTriEditCommandGroup);
end;

function TMainFrm.HrExecCommand(ucmdID: cardinal; const pVarIn: OleVariant; var pVarOut: OleVariant; bPromptUser, bTriEditCmdGroup: boolean): HResult;
var
  dwCmdOpt:DWORD;
begin
   result := S_OK;

   if DocCmd = nil then
     Exit;

   if (bPromptUser) then
     dwCmdOpt := MSOCMDEXECOPT_PROMPTUSER
   else
     dwCmdOpt := MSOCMDEXECOPT_DONTPROMPTUSER;

   if (bTriEditCmdGroup) then
     result := DocCmd.Exec(@GUID_TriEditCommandGroup, ucmdID, dwCmdOpt, pVarIn, pVarOut)
   else
     result := DocCmd.Exec(@CMDSETID_Forms3, ucmdID, dwCmdOpt, pVarIn, pVarOut);
end;

procedure TMainFrm.ToggleBullet;
begin
  if (WebBrowser.Document as IHTMLDocument2) = nil then
    exit;

  SpecialCommand(IDM_UnORDERLIST, false, true, false, Null);
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  repeat
    (WebBrowser.Document as IHTMLDocument2).QueryInterface(IOleCommandTarget, DocCmd);
  until
    DocCmd <> nil;
end;

Gesetzt wird es über diese Funktion:
Code:
    function Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
      const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall;

Also gehe ich davon aus, dass man es mit dieser auslesen kann oder?
Code:
function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
      prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall;

Nur irgendwie bekomme ich es nicht hin.


Normalerweise würde ich es folgendermaßen auslesen:
Code:
if (WebBrowser.Document as IHTMLDocument2).queryCommandValue('FormatBlock') = 'Aufzählung' then
...

Das Problem hierbei ist aber, wenn der gleiche Abschnitt zusätzlich noch eine Überschrift als formatierung hat, erhalte ich nur diese als Formatierung zurück.

Also muss es über die obige Variante klappen.
Ich hoffe, ich habe mich verständlich ausgedrückt :)

MuTzE.Y85 23. Okt 2012 20:45

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Keiner ne Antwort? :(

shmia 24. Okt 2012 17:45

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Das Problem ist, dass wir die HTML-Seite nicht kennen und daher auch keinen Hinweis haben, wie man die gesuchten HTML-Elemente erkennen kann.
Sind die gesuchten Elemente mit irgendeinem Attribut markiert; ID=?

Es gibt aber eine ganze Reihe von Methoden (IHTMLDocument2):
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Ich würde mit .createNodeIterator() ein NodeIterator-Objekt holen und dann alle Knoten durchgehen, bis der passende gefunden ist.

MuTzE.Y85 24. Okt 2012 20:31

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Danke erstmal für die Antwort.

Aber ich glaube, ich habe mich doch etwas unverständlich ausgedrückt.


Es soll ja nicht der Quelltext durchforstet werden.
Das ganze läuft über einen ActionManager, der jeweils an der aktuellen Position das Format ausliest. Halt wie bei jedem anderen HTML Editor auch. Das muss über die oben genannte Funktion gehen, aber ich weiß nicht wie.

Popov 24. Okt 2012 21:19

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Du suchst also in etwa das was RichEdit mit SelAttributes.ConsistentAttributes anbietet?

MuTzE.Y85 26. Okt 2012 22:12

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Ja so in der Art.

Wie schon gesagt, normalerweise geht das mit "queryCommandValue". Aber leider nur solange kein H2 Tag oder Ähnliches gesetzt ist.

Ich habe ja auch die Methode um Bullets zu togglen. Also muss es doch auch möglich sein sie einfach nur zu "ermitteln".

Codehunter 29. Jun 2015 12:29

AW: TWebbrowser - MSHTML - Auslesen, ob "Bullets" gesetzt sind...
 
Auch wenn es ein ganz klein bissl spät kommt, vielleicht ist die Lösung ja mal für jemanden nützlich:
Delphi-Quellcode:
function THTMLEditor.GetProperty(ACommand: OleVariant): OleVariant;
var
  V: OleVariant;
begin
  V:= Document as IHTMLDocument2;
  Result:= V.queryCommandValue(ACommand);
end;

function THTMLEditor.GetUnorderedList: Boolean;
begin
  Result:= GetProperty('InsertUnorderedList');
end;


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