Einzelnen Beitrag anzeigen

Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#1

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

  Alt 20. Okt 2012, 15:20
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
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat