Autor |
Beitrag |
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Di 25.10.05 20:02
Hallo Community,
ich möcht' euch die Verwendung des HTML-Editors, welcher beim IE verwendet wird, vorstellen und einige Anregungen bieten.
habt Verständnis, dass hier nicht der gesamte Quelltext steht.(Admins, verzeiht mir).
das Ganze funzt nachweislich unter D5, D6 und D2000. Andere Umgebungen stehen mir nicht zur Verfügung.
Sodele, nun gehts los.
Als erstes benötigt Ihr das OCX und die TLB des DHTML-Editors, welches Ihr in der Regel und auf deutschen Systemen unter dem Verzeichnis C:\Programme\Gemeinsame Dateien\Microsoft Shared\Triedit als DHTMLED.OCX findet. Wie ihr diese einbaut, beschreibe ich jetzt nicht, ist in der Hilfe gut beschrieben.
Als nächstes patchen wir die Olectrls.pas, da MS mit der KB891781 eine Sicherheitslücke gestopft hat, die in Delphi leider zu der bekannten Meldung "Schnittstelle nicht unterstützt" führt. Diese Lösung findet ihr auch bei Google, ist nicht auf meinem Mist gewachsen.
Achtung: Macht vorher eine Sicherheitskopie!!
Fügt im Interface der OleCltrs.pas folgendes ein:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| Type TImpIOleContainer = class(TObject, IOleContainer) protected m_cRef: DWORD; public function _AddRef: Integer; overload; stdcall; function _Release: Integer; overload; stdcall;
constructor Create; virtual; destructor Destroy; override;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function ParseDisplayName(const bc: IBindCtx; pszDisplayName: POleStr; out chEaten: Longint; out mkOut: IMoniker): HResult; stdcall;
function EnumObjects(grfFlags: Longint; out Enum: IEnumUnknown): HResult; stdcall; function LockContainer(fLock: BOOL): HResult; stdcall; end;
const IID_IUnknown : TGUID = '{00000000-0000-0000-C000-000000000046}'; IID_IOleContainer : TGUID = '{0000011B-0000-0000-C000-000000000046}'; |
Im Implementationsteil:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| constructor TImpIOleContainer.Create; begin inherited; m_cRef := 0; end;
destructor TImpIOleContainer.Destroy; begin inherited; end;
function TImpIOleContainer.EnumObjects(grfFlags: Integer; out Enum: IEnumUnknown): HResult; begin Result := E_NOINTERFACE; end;
function TImpIOleContainer.LockContainer(fLock: BOOL): HResult; begin Result := E_NOINTERFACE; end;
function TImpIOleContainer.ParseDisplayName(const bc: IBindCtx; pszDisplayName: POleStr; out chEaten: Integer; out mkOut: IMoniker): HResult; begin Result := E_NOINTERFACE; end;
function TImpIOleContainer.QueryInterface(const IID: TGUID; out Obj): HResult;
begin If (IsEqualGUID(IID, IID_IOleContainer)) Then begin GetInterface(IID_IOleContainer, Obj); Result := S_OK; Exit; end else If (IsEqualGUID(IID, IID_IUnknown)) Then begin GetInterface(IID_IUnknown, Obj); Result := S_OK; Exit; end;
Result := E_NOINTERFACE; end;
function TImpIOleContainer._AddRef: Integer; begin Inc(m_cRef); Result := m_cRef; end;
function TImpIOleContainer._Release: Integer; begin If m_cRef > 0 Then Dec(m_cRef) else m_cRef := 0; Result := m_cRef; end; |
Jetzt sucht bitte folgende Funktion und ergänzt sie wie dargestellt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function TOleControl.GetContainer(out container: IOleContainer): HResult; Var pIContainer : TImpIOleContainer;
begin pIContainer := TImpIOleContainer.Create; If (pIContainer <> NIL) Then begin Result := pIContainer.QueryInterface(IID_IOleContainer, container); Exit; end; container := NIL; Result := E_NOINTERFACE; end; |
so, nun basteln wir den HTML-Editor
Ich habe dazu eine Form gebastet mit verschiedenen Buttons wie Fett, Kursiv etc. sowie dem importierten OCX-Control.
Das control hat hier den Namen WebEdit
Folgende Units werden u.a. benötigt:
Delphi-Quelltext 1: 2: 3: 4:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleServer, ExtDlgs, OleCtrls, DHTMLEDLib_TLB, ActiveX, ExtCtrls, SHDocVw, MSHTML_TLB, ActnList, StdCtrls, Menus, ComCtrls; |
Nun erweitert bitte mal die Klassendeklaration
wie folgt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| TMain = class(TForm,IHTMLEditDesigner,IHTMLEditHost) ... function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall; function PreHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function PostHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function TranslateAccelerator(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function PostEditorEventNotify(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; ... end
function TMain.PostHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.PreHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.TranslateAccelerator(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.PostEditorEventNotify(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin if inEvtDispId = -606 then begin sb.Panels[0].Text := IntToStr(pIEventObj.clientX) + ':' + IntToStr(pIEventObj.clientY); end; Result := S_FALSE; end;
function TMain.SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; begin prcNew.left := 20 * (prcNew.left div 20); prcNew.top := 20 * (prcNew.top div 20); prcNew.right := 20 * (prcNew.right div 20); prcNew.bottom := 20 * (prcNew.bottom div 20); Result := S_OK; end; |
am Ende des Programms muss stehen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| initialization OleInitialize(nil);
finalization OleUninitialize; |
In der Create() Methode der Form ergänzen wir folgende Einträge:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TMain.FormCreate(Sender: TObject); begin WebEdit.DefaultInterface._AddRef; ... end; |
Um eine Datei zu Laden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var O:OleVariant; begin O:='test.html'; WebEdit.LoadDocument(O); ... end; |
Um eine Datei zu Sichern, gehe ich hier jetzt einen alternativen Weg via Textfile:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var W:WideString; F:TextFile; begin S:=WebEdit.DocumentHTML; AssignFile(F,'Test.html'); Rewrite(F); Writeln(F,S); closeFile(F); end; |
Alternativ wäre zum Beispiel auch sinnvoll:
Delphi-Quelltext 1: 2:
| StringToWideChar(Filename,Wide,Sizeof(Wide)); (WebEdit.DOM as IPersistFile).Save(Wide,false); |
oder via Dialog zum Beispiel:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TMain.SaveAsClick(Sender: TObject); begin WebEdit.DOM.execCommand('SaveAs',false,0); end; |
Damit diverse Buttons (Fett, Kursiv) nur aktiv sind, wenn der Nutzer auch sinnvoll das anwenden kann, habe ich eine Funktion "UpdateButton", die genau prüft, was kann, was kann nicht.
Zur Lesart:
ak... sind TAktions, die mit den Buttons gleichnamiger Bedeutung verknüpft sind.
die cmdID findet ihr auch im MSDN
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| function TMain.GetProperties(const Name: String): OLEVariant; var V: OleVariant; begin V := WebEdit.DOM.selection.createRange; Result := V.queryCommandValue(Name); end;
procedure TMain.UpdateButtons; function QueryStatus(cmdID: OleVariant): OleVariant; begin Result := WebEdit.QueryStatus(cmdID); end;
begin akAusschneiden.Enabled := (QueryStatus(DECMD_CUT) and DECMDF_ENABLED) = DECMDF_ENABLED; akKopieren.Enabled := (QueryStatus(DECMD_COPY)and DECMDF_ENABLED) = DECMDF_ENABLED; akEinfuegen.Enabled:= (QueryStatus(DECMD_PASTE) and DECMDF_ENABLED) = DECMDF_ENABLED; akEinfuegenAlsText.Enabled:= (QueryStatus(DECMD_PASTE) and DECMDF_ENABLED) = DECMDF_ENABLED; aBold.Enabled := (QueryStatus(DECMD_BOLD) and DECMDF_ENABLED) = DECMDF_ENABLED; aBold.Checked := GetProperties('Bold'); aUnderline.Enabled := (QueryStatus(DECMD_UNDERLINE) and DECMDF_ENABLED) = DECMDF_ENABLED; aUnderline.Checked := GetProperties('Underline'); aItalic.Enabled := (QueryStatus(DECMD_ITALIC) and DECMDF_ENABLED) = DECMDF_ENABLED; aItalic.Checked := GetProperties('Italic'); aLeft.Checked := (GetProperties('JustifyLeft')); aCenter.Checked := (GetProperties('JustifyCenter')); aRight.Checked := (GetProperties('JustifyRight')); aUndo.Enabled:= (QueryStatus(DECMD_UNDO) and DECMDF_ENABLED) = DECMDF_ENABLED; aRedo.Enabled:= (QueryStatus(DECMD_REDO) and DECMDF_ENABLED) = DECMDF_ENABLED; aNumber.Checked:= (QueryStatus(DECMD_ORDERLIST) and DECMDF_LATCHED) = DECMDF_LATCHED; aBullet.Checked:= (QueryStatus(DECMD_UNORDERLIST) and DECMDF_LATCHED) = DECMDF_LATCHED; aIndent.Enabled:= (QueryStatus(DECMD_INDENT) and DECMDF_ENABLED) = DECMDF_ENABLED; aOutdent.Enabled:= (QueryStatus(DECMD_OUTDENT) and DECMDF_ENABLED) = DECMDF_ENABLED; aURL.Enabled:= WebEdit.Dom.queryCommandEnabled('CreateLink'); aUp.Checked:=(GetProperties('Superscript')); aDown.Checked:=(GetProperties('Subscript')); end; |
nun wollen wir aber auch, dass der Anwender Text z.b. Fett machen kann
hier die zugehörige TAction.Das gilt übrigens für alle Aktions. Ihr müsst nur die CMDID
wie Bold, Underline etc. entsprechend verwenden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure TMain.SetProperties(const Name: String; Value: OleVariant); var V: OleVariant; S: OleVariant; begin if GetProperties(Name) <> Value then begin V := WebEdit.DOM.selection.createRange; S := Value; V.execCommand(Name , False, S); end; end;
procedure TMain.aBoldExecute(Sender: TObject); begin SetProperties('Bold',iBold.Down); UpdateButtons; end; ...
procedure TMain.btnUnderlineClick(Sender: TObject); begin SetProperties('Underline',iUnderline.Down); UpdateButtons; end; |
Damit der Anwender auch immer weiss welche Funktionen er nutzen kann, verknüpfen wir die
Ereignisse ONonClick(), ONonKeyDown() und ONonKeyUp() mit der Funktion UpdateButtons:
z.b.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TMain.WebEditonclick(Sender: TObject); begin UpdateButtons; end; |
Noch ein Problem haben wir, welcher Zeichensatz soll verwendet werden?
Ist nicht grad unwichtig beim Speichern etc.
Ich habe dazu einfach in der Create() Methode geschrieben :
Delphi-Quelltext 1: 2: 3:
| while Webedit.Busy do Application.ProcessMessages; if not WebEdit.Busy then WebEdit.Dom.charset:='iso-8859-1'; |
fertig.
Ich bastle hier noch etwas rum, kommen also noch ein paar Ergänzungen.
grez
MSCH
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
LH_Freak
      
Beiträge: 385
Win XP
D7 PE, D2k5 Trial
|
Verfasst: Di 25.10.05 20:08
das klingt super. Könntest du vll. noch eine Demo posten (also im Anhang, und mit Quelltext)?
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 30.10.05 17:19
ich würde es ja gerne verwenden, aber wie weiß ich auch nicht, ne demo wäre schon das non-plus-ultra
um das einfach mal so zu testen, extra sich einarbeiten selbst n demo programm schreiben ist net immer so das wahre finde ich 
|
|
MSCH 
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 30.10.05 19:20
oki doki,
ich setz das morgen mal rein, muss erstmal wieder mein D installieren,  isch abgekackt.
grez
msch
oje, immer diese ausdrücke.
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
MSCH 
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mo 31.10.05 18:12
sodele, hier kömmt das versprochene Progrämmchen.
Es besteht aus 3 teilen, die Exe, eine Konfig und eine Hilfedatei.
Viel Spass beim probieren.
Hier noch ein paar infos:
Das Programm bietet die Möglichkeit, Sonderzeichen jedweder Art (auch Unicode) einzufügen.
Damit ihr das richtig seht, müßt ihr beim IE den Default-Zeichensatz auf Arial Unicode MS einstellen.
(extras-Optionen beim IE).
Leider kann ich die Quelltexte nur in Auszügen wiedergeben; ich verwendete auf mich lizensierte Kompos
von DevEx deren Weitergabe untersagt ist. Allerdings lässt sich das auch mit den Standard-Kompos von D
bewerkstelligen.
Die Unicode-Teile sind aus den TNT-Controls übernommen.
Und das übliche, die Verwendung ist frei jedoch auf eigene Verantwortung, Haftung und Schadensersatz
wird nicht übernommen. Ich hab nen Virenscanner am laufen, sollte also auch keine "Erreger" beinhalten.
Wird mich über Feedback freuen.
Grez
MSch
Einloggen, um Attachments anzusehen!
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Fr 11.11.05 13:57
Hallo,
entweder bin ich blind oder habe Tomaten auf den Augen! Wo ist der angekündigte Download-Link? Ich kann keinen finden 
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Fr 11.11.05 14:38
Er meint den Anhang, du musst wohl kurz "F5" drücken, damit der angezeigt wird. Ist ein bereits bekannter Bug.
_________________ JSXGraph
|
|
stifflersmom
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Fr 11.11.05 14:52
Auch wenn ich F5 länger drücke,
den Anhang finde ich nicht.
Moin
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Fr 11.11.05 14:55
Dann klick auf "Seite neu laden", am Ende des letzten Beitrags von MSCH ist dann ein Anhang zu finden.
_________________ JSXGraph
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 11.11.05 15:05
falls du opera verwendest sind die anhänge manchmal ned ersichtlich
hier ein direktlink www.delphi-forum.de/download.php?id=1753
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Bennle
      
Beiträge: 101
WinXP
Delphi 2007 Pro, C# (VS 2005)
|
Verfasst: Fr 11.11.05 16:05
Hallo,
Kann denn keiner mal den Quellcode anhängen, dann wäre das nur halbsoviel arbeit
MfG
Bennle
|
|
MSCH 
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 11.11.05 18:45
Manno, Quelltext abpinseln kann doch jeder, oder?
A bisle kreative Wertschöpfung sollte doch machbar sein, oder?
aber weil's anscheinend nicht geht (mit der Kreativität), hier der gesamte Quelltext der Hauptanwendung.
Aber bitte, keine Kommentare  ich weiss selbst dass er stellenweise noch etwas krude aussieht, aber frei nach Murphy, "Ändere niemals ein funktionierendes System".
Und; ich verwende wie bereits genannt, diverse Kompos die ich nicht mitliefern darf - weil kostenpflichtig zu lizensieren.
Würd' mich aber freuen, wenn Feedback über Sinnlosigkeiten und Fehler kommt, oder auch Erweiterungen etc., niemand ist ja vollkommen.
grez
MSch
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: 995: 996: 997: 998: 999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142:
|
unit main_unit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, OleServer, ExtDlgs, OleCtrls, DHTMLEDLib_TLB,ActiveX, ExtCtrls, SHDocVw,MSHTML_TLB, ActnList, cxGraphics, cxControls, dxStatusBar, cxPC, cxContainer, cxEdit, cxTextEdit, cxMemo, dxBar, cxSplitter, TntStdCtrls, cxMaskEdit, cxDropDownEdit, StdCtrls, Menus, StBase, StVInfo, cxRichEdit, ComCtrls;
type TUnicodeChar= Record ShowChar: Boolean; StartCode: Integer; EndCode : Integer; PName :String; end; Const Version_Str = '2.0.0.1b'; CountUnicode=32; MyUnicodeChar: Array[0..CountUnicode] of TUnicodeChar=( (ShowChar:False;StartCode: $0000; EndCode:$007F; PName:'Basic Latin'), (ShowChar:False;StartCode: $0080; EndCode:$00FF; PName:'Latin 1 Supplement'), (ShowChar:False;StartCode: $0100; EndCode:$017F; PName:'Latin Extended-A'), (ShowChar:False;StartCode: $0180; EndCode:$024F; PName:'Latin Extended-B'), (ShowChar:False;StartCode: $0250; EndCode:$02AF; PName:'IPA Extensions'), (ShowChar:False;StartCode: $02B0; EndCode:$02FF; PName:'Spacing Modifier Letters'), (ShowChar:true;StartCode: $0300; EndCode:$036F; PName:'Combining Diacritical Marks'), (ShowChar:False;StartCode: $0370; EndCode:$03FF; PName:'Greek and Coptic'), (ShowChar:False;StartCode: $0400; EndCode:$04FF; PName:'Cyrillic'), (ShowChar:False;StartCode: $0590; EndCode:$05FF; PName:'Hebrew'), (ShowChar:False;StartCode: $0600; EndCode:$06FF; PName:'Arabic'), (ShowChar:False;StartCode: $1E00; EndCode: $1EFF; PName:'Latin Extended Additional'), (ShowChar:False;StartCode: $1F00; EndCode: $1FFF; PName:'Greek Extended'), (ShowChar:False;StartCode: $2000; EndCode: $206F; PName:'General Punctuation'), (ShowChar:False;StartCode: $20A0; EndCode: $20CF; PName:'Currency Symbols'), (ShowChar:False;StartCode: $20D0; EndCode: $20FF; PName:'Combining Diacritical Marks for Symbols'), (ShowChar:False;StartCode: $2100; EndCode: $214F; PName:'Letterlike Symbols'), (ShowChar:False;StartCode: $2150; EndCode: $218F; PName:'Number Forms'), (ShowChar:False;StartCode: $2190; EndCode: $21FF; PName:'Arrows'), (ShowChar:False;StartCode: $2200; EndCode: $22FF; PName:'Mathematical Operators'), (ShowChar:False;StartCode: $2300; EndCode: $23FF; PName:'Miscellaneous Technical'), (ShowChar:False;StartCode: $2400; EndCode: $243F; PName:'Control Pictures'), (ShowChar:False;StartCode: $2500; EndCode: $257F; PName:'Box Drawing'), (ShowChar:False;StartCode: $25A0; EndCode: $25FF; PName:'Geometric Shapes'), (ShowChar:False;StartCode: $2600; EndCode: $26FF; PName:'Miscellaneous Symbols'), (ShowChar:False;StartCode: $2700; EndCode: $27BF; PName:'Dingbats'), (ShowChar:False;StartCode: $27C0; EndCode: $27EF; PName:'Miscellaneous Mathematical Symbols-A'), (ShowChar:False;StartCode: $FB00; EndCode: $FB4F; PName:'Alphabetic Presentation Forms'), (ShowChar:False;StartCode: $FB50; EndCode: $FDFF; PName:'Arabic Presentation Forms-A'), (ShowChar:False;StartCode: $FE20; EndCode: $FE2F; PName:'Combining Half Marks'), (ShowChar:False;StartCode: $FE50; EndCode: $FE6F; PName:'Small Form Variants'), (ShowChar:False;StartCode: $FFF0; EndCode: $FFFF; PName:'Specials'), (ShowChar:False;StartCode: $E0000; EndCode: $E007F; PName:'Tags') );
const UpdateStr :String= '17032005'; CharSet = '<meta http-equiv=content-type content="text/html; charset=iso-8859-1">'; DTD= '?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'; WM_StartLogo = wm_user + 1; WM_EndeLogo = wm_user + 2;
type TReplaceAnsiType=Record AnsiChar:Char; ReplaceString:String; end; type TMain = class(TForm,IHTMLEditDesigner,IHTMLEditHost) ImageListWork: TImageList; EditPop: TPopupMenu; DECMDPASTE: TMenuItem; DECMDCOPY: TMenuItem; DECMDCUT: TMenuItem; N2: TMenuItem; Abbruch1: TMenuItem; ImportDialog: TOpenDialog; OpenHTML: TOpenDialog; SaveDialog: TSaveDialog; Pager: TcxPageControl; design: TcxTabSheet; WebEdit: TDHTMLEdit; Quelltext: TcxTabSheet; ActionList1: TActionList; akEinfuegen: TAction; akAusschneiden: TAction; akKopieren: TAction; akEinfuegenAlsText: TAction; beenden: TAction; sb: TdxStatusBar; HQuelle: TcxMemo; dxBarDockControl1: TdxBarDockControl; dxBarManager1: TdxBarManager; iBeenden: TdxBarButton; aOpenFile: TAction; iOpenFile: TdxBarButton; aNewFile: TAction; iNewFile: TdxBarButton; aSaveDisk: TAction; iSaveFile: TdxBarButton; iAusschneiden: TdxBarButton; iKopieren: TdxBarButton; iEinfuegen: TdxBarButton; iEinfuegenText: TdxBarButton; aBold: TAction; iBold: TdxBarButton; aUnderline: TAction; iUnderline: TdxBarButton; aItalic: TAction; iItalic: TdxBarButton; aUndo: TAction; iUndo: TdxBarButton; aRedo: TAction; iRedo: TdxBarButton; aLeft: TAction; iLeftAlign: TdxBarButton; aCenter: TAction; iCenterAlign: TdxBarButton; aRight: TAction; iRightAlign: TdxBarButton; aBullet: TAction; iBullet: TdxBarButton; aNumber: TAction; iNumber: TdxBarButton; aOutdent: TAction; iOutdent: TdxBarButton; aIndent: TAction; iIndent: TdxBarButton; aLine: TAction; iRule: TdxBarButton; aUrl: TAction; iHref: TdxBarButton; aClear: TAction; iClear: TdxBarButton; dxBarSubItem1: TdxBarSubItem; dxBarSubItem2: TdxBarSubItem; dxBarSubItem3: TdxBarSubItem; dxBarSubItem4: TdxBarSubItem; aUp: TAction; aDown: TAction; iUp: TdxBarButton; iDown: TdxBarButton; aTag: TAction; aHideTags: TAction; dxBarSubItem5: TdxBarSubItem; dxBarButton26: TdxBarButton; dxBarButton27: TdxBarButton; Panel1: TPanel; Panel2: TPanel; Label1: TLabel; unicodePageName: TcxComboBox; CL: TTntListBox; Panel3: TPanel; Label2: TLabel; cdHex: TLabel; cdDez: TLabel; cxSplitter1: TcxSplitter; aFont: TAction; dxBarButton1: TdxBarButton; dxBarButton2: TdxBarButton; VI: TStVersionInfo; aHilfe: TAction; dxBarButton3: TdxBarButton; dxBarButton4: TdxBarButton; dxBarSubItem6: TdxBarSubItem; procedure ExitBtnClick(Sender: TObject); procedure SaveBtnClick(Sender: TObject); procedure BtncutClick(Sender: TObject); procedure BtnCopyClick(Sender: TObject); procedure BtnPasteClick(Sender: TObject); procedure btnUnderlineClick(Sender: TObject); procedure btnItalicClick(Sender: TObject); procedure BtnUndoClick(Sender: TObject); procedure BtnRedoClick(Sender: TObject); procedure btnAlignLeftClick(Sender: TObject); procedure btnAlignCenterClick(Sender: TObject); procedure BtnAlignRightClick(Sender: TObject); procedure BtnBulletClick(Sender: TObject); procedure BtnOrderClick(Sender: TObject); procedure BtnOutdentClick(Sender: TObject); procedure BtnIndentClick(Sender: TObject); procedure ToolButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FontDlgButtonClick(Sender: TObject); procedure OpenBtnClick(Sender: TObject); procedure NeuBtnClick(Sender: TObject); procedure RadierBtnClick(Sender: TObject); procedure WebEditonclick(Sender: TObject); procedure WebEditonkeyup(Sender: TObject); procedure WebEditDocumentComplete(Sender: TObject); procedure ViewTagsClick(Sender: TObject); procedure ViewNormalClick(Sender: TObject); procedure export1Click(Sender: TObject); procedure PagerChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Ende1Click(Sender: TObject); procedure WebEditonkeydown(Sender: TObject); procedure BtnHRefClick(Sender: TObject); procedure akEinfuegenAlsTextExecute(Sender: TObject); procedure aUpExecute(Sender: TObject); procedure aDownExecute(Sender: TObject); procedure aBoldExecute(Sender: TObject); procedure unicodePageNamePropertiesChange(Sender: TObject); procedure CLClick(Sender: TObject); procedure CLDblClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure aHilfeExecute(Sender: TObject); private Filename:String; Helpfile:String; ReplaceAnsi: Array of TReplaceAnsiType; ININame:String; function SaveDoc:Boolean; procedure SetProperties(const Name: String; Value: OleVariant); function GetProperties(const Name: String): OLEVariant; function SourceText: String; procedure SizePanel; procedure DisplayHint(Sender: TObject); procedure LoadUmsetztabelle; procedure LoadKonfiguration; function EnableClearSourceFileSize:Boolean; function InsertDefaultParagraph:Boolean; procedure HideToolBar(Hide:Boolean);
function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall; function PreHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function PostHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function TranslateAccelerator(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; function PostEditorEventNotify(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; stdcall; public procedure UpdateButtons; end;
var Main: TMain;
implementation
uses Clipbrd,ShellApi,IniFiles;
{$R *.dfm}
procedure TMain.FormCreate(Sender: TObject); var O:OleVariant; F:TextFile; I,k:Integer; S:String; SR: TSearchRec; begin WebEdit.DefaultInterface._AddRef; ININame:=ExtractFilePath(ParamStr(0)); ININame:= IncludeTrailingBackslash(ININame); ININame:= ININame+'MSEdHTML.INI'; SizePanel; Caption:= 'MS@Edit HTML '+UpdateStr; Pager.ActivePage:= Design; Filename:='unbenannt'; if ParamCount>0 then begin S:=''; for I:=1 to ParamCount do S:=S+ParamStr(i)+#32;
Filename:= trim(S); O:=Filename; AssignFile(F,Filename); Reset(F); if IoResult=0 then begin FindFirst(FIlename,faAnyFile,SR); K:= Sr.Size; FindClose(SR); if K=0 then begin Append(F); writeln(F,'<html>'); writeln(F,'<head>',Charset,'</head>'); Writeln(F,'<body>'); if InsertDefaultParagraph then Writeln(F,'<p></p>'); Writeln(F,'</body>'); writeln(F,'</html>'); end; if (K=1)and(EnableClearSourceFileSize) then begin CloseFile(F); Rewrite(F); Append(F); writeln(F,'<html>'); writeln(F,'<head>',Charset,'</head>'); Writeln(F,'<body>'); if InsertDefaultParagraph then Writeln(F,'<p></p>'); Writeln(F,'</body>'); writeln(F,'</html>'); end; CloseFile(F); WebEdit.LoadDocument(O); Caption:= 'MS@Edit HTML Update '+UpdateStr+' ['+Filename+']'; end else begin Filename:=''; MessageDlg('Der angegebene Dateiname '+S+' konnte nicht geöffnet werden!',mtError,[mbok],0); end; end else begin WebEdit.NewDocument; while Webedit.Busy do Application.ProcessMessages; if not WebEdit.Busy then WebEdit.Dom.charset:='iso-8859-1'; end; UnicodePageName.Properties.Items.Clear; for I:=0 to CountUnicode do unicodePageName.Properties.Items.Add(MyUnicodeChar[I].PName);
Application.OnHint := DisplayHint; vi.Filename:=ParamStr(0); sb.panels[1].Text:=vi.ProductName+#32+vi.FileVersion; HelpFile:= ExtractFilePath(ParamStr(0)); HelpFile:= IncludeTrailingBackslash(HelpFile); Helpfile:= Helpfile + 'htmledinfo.chm'; aHilfe.Enabled:= FileExists(HelpFile); LoadUmsetztabelle; LoadKonfiguration; end;
procedure TMain.ExitBtnClick(Sender: TObject); begin close; end;
procedure TMain.SaveBtnClick(Sender: TObject); begin SaveDoc; end;
function TMain.SaveDoc:boolean; var O:OleVariant; S:WideString; k:Integer; SDOM:WideString; F:Textfile; begin result:=False; if Pager.ActivePage=Quelltext then begin WebEdit.DocumentHTML:=HQuelle.Text; end; if (Length(Trim(Filename))=0)or(Filename='unbenannt') then begin if SaveDialog.Execute then begin Filename:= SaveDialog.FileName; Caption:= 'MS@Edit HTML'+' ['+Filename+']'; end else exit; end; O:=Filename; while WebEdit.Busy do Application.ProcessMessages; S:=WebEdit.DocumentHTML; SDOM:=SourceText;
AssignFile(F,Filename); rewrite(F); K:= Pos('<BODY>',SDOM); if K>0 then begin S:= Copy(SDOM,1,K+Length('<BODY>')); Delete(SDOM,1,K+Length('<BODY>')); SDOM:= lowercase(S)+SDOM; end;
K:= Pos('</BODY>',SDOM); if K>0 then begin S:= Copy(SDOM,K,length(S)); Delete(SDOM,K,Length(S)); SDOM:= SDOM+lowercase(S); end; Writeln(F,SDOM); CloseFile(F); Result:= True; end;
procedure TMain.BtncutClick(Sender: TObject); begin if (WebEdit.QueryStatus(DECMD_CUT) and DECMDF_ENABLED)= DECMDF_ENABLED then WebEdit.dom.ExecCommand('CUT',false,emptyParam); UpdateButtons; end;
procedure TMain.BtnCopyClick(Sender: TObject); begin if (WebEdit.QueryStatus(DECMD_COPY) and DECMDF_ENABLED)= DECMDF_ENABLED then WebEdit.Dom.ExecCommand('COPY',true,emptyparam); UpdateButtons; end;
procedure TMain.BtnPasteClick(Sender: TObject); begin if (WebEdit.QueryStatus(DECMD_PASTE) and DECMDF_ENABLED)= DECMDF_ENABLED then WebEdit.ExecCommand(DECMD_PASTE,OLECMDEXECOPT_DONTPROMPTUSER); UpdateButtons; end;
procedure TMain.btnUnderlineClick(Sender: TObject); begin SetProperties('Underline',iUnderline.Down); end;
procedure TMain.btnItalicClick(Sender: TObject); begin SetProperties('Italic',iItalic.down); UpdateButtons; end;
procedure TMain.BtnUndoClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_UNDO,0); UpdateButtons; end;
procedure TMain.BtnRedoClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_REDO,0); UpdateButtons; end;
procedure TMain.btnAlignLeftClick(Sender: TObject); begin SetProperties('JustifyLeft',iLeftAlign.down); UpdateButtons; end;
procedure TMain.btnAlignCenterClick(Sender: TObject); begin SetProperties('JustifyCenter',iCenterAlign.down); UpdateButtons; end;
procedure TMain.BtnAlignRightClick(Sender: TObject); begin SetProperties('JustifyRight', iRightAlign.Down); UpdateButtons; end;
procedure TMain.BtnBulletClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_UNORDERLIST,0); UpdateButtons; end;
procedure TMain.BtnOrderClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_ORDERLIST,0); UpdateButtons; end;
procedure TMain.BtnOutdentClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_OUTDENT,0); UpdateButtons; end;
procedure TMain.BtnIndentClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_INDENT,0); UpdateButtons; end;
procedure TMain.ToolButton1Click(Sender: TObject); begin WebEdit.Dom.execCommand('InsertHorizontalRule',false,0); end;
procedure TMain.aUpExecute(Sender: TObject); begin SetProperties('Superscript',iUp.Down); UpdateButtons; end;
procedure TMain.aDownExecute(Sender: TObject); begin SetProperties('Subscript',iDown.down); UpdateButtons; end;
procedure TMain.aBoldExecute(Sender: TObject); begin Application.ProcessMessages; SetProperties('Bold',iBold.Down); UpdateButtons; end;
procedure TMain.UpdateButtons; function QueryStatus(cmdID: OleVariant): OleVariant; begin Result := WebEdit.QueryStatus(cmdID); end;
begin akAusschneiden.Enabled := (QueryStatus(DECMD_CUT) and DECMDF_ENABLED) = DECMDF_ENABLED; akKopieren.Enabled := (QueryStatus(DECMD_COPY)and DECMDF_ENABLED) = DECMDF_ENABLED; akEinfuegen.Enabled:= (QueryStatus(DECMD_PASTE) and DECMDF_ENABLED) = DECMDF_ENABLED; akEinfuegenAlsText.Enabled:= (QueryStatus(DECMD_PASTE) and DECMDF_ENABLED) = DECMDF_ENABLED;
aBold.Enabled := (QueryStatus(DECMD_BOLD) and DECMDF_ENABLED) = DECMDF_ENABLED; aBold.Checked := GetProperties('Bold');
aUnderline.Enabled := (QueryStatus(DECMD_UNDERLINE) and DECMDF_ENABLED) = DECMDF_ENABLED; aUnderline.Checked := GetProperties('Underline');
aItalic.Enabled := (QueryStatus(DECMD_ITALIC) and DECMDF_ENABLED) = DECMDF_ENABLED; aItalic.Checked := GetProperties('Italic');
aLeft.Checked := (GetProperties('JustifyLeft')); aCenter.Checked := (GetProperties('JustifyCenter')); aRight.Checked := (GetProperties('JustifyRight'));
aUndo.Enabled:= (QueryStatus(DECMD_UNDO) and DECMDF_ENABLED) = DECMDF_ENABLED; aRedo.Enabled:= (QueryStatus(DECMD_REDO) and DECMDF_ENABLED) = DECMDF_ENABLED;
aNumber.Checked:= (QueryStatus(DECMD_ORDERLIST) and DECMDF_LATCHED) = DECMDF_LATCHED; aBullet.Checked:= (QueryStatus(DECMD_UNORDERLIST) and DECMDF_LATCHED) = DECMDF_LATCHED;
aIndent.Enabled:= (QueryStatus(DECMD_INDENT) and DECMDF_ENABLED) = DECMDF_ENABLED; aOutdent.Enabled:= (QueryStatus(DECMD_OUTDENT) and DECMDF_ENABLED) = DECMDF_ENABLED;
aURL.Enabled:= WebEdit.Dom.queryCommandEnabled('CreateLink');
aUp.enabled:=(QueryStatus(DECMD_ITALIC) and DECMDF_ENABLED) = DECMDF_ENABLED; aDown.Enabled:=(QueryStatus(DECMD_ITALIC) and DECMDF_ENABLED) = DECMDF_ENABLED; aUp.Checked:=(GetProperties('Superscript')); aDown.Checked:=(GetProperties('Subscript')); end;
function TMain.GetProperties(const Name: String): OLEVariant; var V: OleVariant; begin V := WebEdit.DOM.selection.createRange; Result := V.queryCommandValue(Name); end;
procedure TMain.SetProperties(const Name: String; Value: OleVariant); var V: OleVariant; S: OleVariant; begin if GetProperties(Name) <> Value then begin V := WebEdit.DOM.selection.createRange; S := Value; V.execCommand(Name , False, S); UpdateButtons; end; end;
procedure TMain.FontDlgButtonClick(Sender: TObject); begin WebEdit.ExecCommand(DECMD_FONT,0); UpdateButtons; end;
procedure TMain.OpenBtnClick(Sender: TObject); var O:OleVariant; F:TextFile; begin if OpenHTML.Execute then begin Filename:= OpenHTML.FileName; O:=Filename; AssignFile(F,Filename); Reset(F); if FileSize(F)=0 then begin Append(F); writeln(F,'<html>'); writeln(F,'<Head>',Charset,'</Head>'); Writeln(F,'<body>'); if InsertDefaultParagraph then Writeln(F,'<p></p>'); Writeln(F,'</body>'); writeln(F,'</html>'); end; CloseFile(F); WebEdit.LoadDocument(O); Caption:= 'MS@Edit HTML Update '+updateStr+' ['+Filename+']'; end; end;
procedure TMain.NeuBtnClick(Sender: TObject); begin if length(Trim(Filename))>0 then begin case MessageDlg('Datei sichern?',mtWarning,[mbYes,mbNo,mbCancel],0) of idCancel:; idYes:begin if SaveDoc then begin WebEdit.NewDocument; Filename:='unbenannt'; Caption:= 'MS@Edit HTML Update '+UpdateStr; end; end; idno: begin WebEdit.NewDocument; Filename:='unbenannt'; Caption:= 'MS@Edit HTML Update '+UpdateStr; end; end; end else WebEdit.NewDocument; end;
procedure TMain.RadierBtnClick(Sender: TObject); begin WebEdit.Dom.execCommand('RemoveFormat',false,0); WebEdit.Dom.execCommand('RemoveParaFormat',false,0); end;
procedure TMain.WebEditonclick(Sender: TObject); begin UpdateButtons; end;
procedure TMain.WebEditonkeyup(Sender: TObject); begin UpdateButtons; end;
procedure TMain.WebEditDocumentComplete(Sender: TObject); var charset:String; begin if not WebEdit.Busy then begin charSet := 'iso-8859-1'; if LowerCase(charset) <> LowerCase(WebEdit.DOM.charset) then webEdit.DOM.charset := charSet; end; UpdateButtons; end;
procedure TMain.ViewTagsClick(Sender: TObject); begin WebEdit.showDetails:= True; aTag.Checked:= True; aHideTags.Checked:= False; end;
procedure TMain.ViewNormalClick(Sender: TObject); begin WebEdit.showDetails:= false; aTag.Checked:= false; aHideTags.Checked:= True; end;
procedure TMain.export1Click(Sender: TObject); begin WebEdit.DOM.execCommand('SaveAs',false,0); end;
procedure TMain.PagerChange(Sender: TObject); var WideS: WideString; begin case Pager.ActivePageIndex of 0: begin WebEdit.DocumentHTML:= HQuelle.Text; HideToolBar(false); end; 1: Begin WideS:= WebEdit.DocumentHTML; HQuelle.Text:= SourceText; HideToolBar(true); end; end; end;
procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Daten sichern?',mtInformation,[mbYes,mbNo],0)=idYes then SaveDoc; if MessageDlg('Anwendung beenden?',mtWarning,[mbYes,mbNo],0)=idYes then CanClose:=True else CanClose:=False; end;
procedure TMain.Ende1Click(Sender: TObject); begin close; end;
procedure TMain.WebEditonkeydown(Sender: TObject); var Event: IHTMLEventObj; begin event:=WebEdit.DOM.parentWindow.event; if ((event.keyCode=Ord('V')) or (Event.keyCode=Ord('v'))) and (Event.ctrlKey=true) then begin end; if ((event.keyCode=Ord('C')) or (Event.keyCode=Ord('c'))) and (Event.ctrlKey=true) then begin end; if ((event.keyCode=Ord('X')) or (Event.keyCode=Ord('x'))) and (Event.ctrlKey=true) then begin end; end;
procedure TMain.BtnHRefClick(Sender: TObject); begin WebEdit.DOM.execCommand('CreateLink',true,emptyParam); end;
procedure TMain.akEinfuegenAlsTextExecute(Sender: TObject); var S:String; begin S:=Clipboard.AsText; Clipboard.AsText:=S; if (WebEdit.QueryStatus(DECMD_PASTE) and DECMDF_ENABLED)= DECMDF_ENABLED then WebEdit.ExecCommand(DECMD_PASTE,OLECMDEXECOPT_DONTPROMPTUSER); UpdateButtons; end;
procedure TMain.unicodePageNamePropertiesChange(Sender: TObject); var I,F,K:longint; W:WideChar; WS:Array[0..20] of WideChar; WSS:WideString; begin F:=0; for I:=0 to CountUnicode do if (MyUnicodeChar[i].PName=unicodePageName.Properties.Items[unicodePageName.ItemIndex]) then begin F:= I; break; end; CL.Items.BeginUpdate; CL.Items.Clear; for I:= MyUnicodeChar[F].StartCode to MyUniCodeChar[F].EndCode do begin StringToWideChar(' ('+IntToHex(I,4)+')', WS,20); WSS:=''; for K:=0 to length(WS) do WSS:=Wss+WS[k]; W:= WideChar(I); if MyUnicodeChar[F].ShowChar then begin wss:='A'; wss:=wss+W; CL.Items.Add(WSS); end else CL.Items.Add(W); end; CL.Items.EndUpdate; end;
procedure TMain.CLClick(Sender: TObject); var W:WideString; begin if CL.ItemIndex>=0 then begin W:= CL.Items[CL.itemIndex]; cdHex.caption:=Format('%x',[Integer(W[1])]); cdDez.Caption:= Format('%d',[Integer(W[1])]); end; end;
procedure TMain.CLDblClick(Sender: TObject); var c: WideString; gMem: HGLOBAL; lp: PChar; begin c:= CL.Items[CL.itemIndex];
OpenClipboard(Self.Handle); EmptyClipboard; gMem := 0; gMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, Sizeof(c)+1); lp := GlobalLock(gMem); CopyMemory(lp, @c[1], SizeOF(c)+1); GlobalUnlock(gMem);
RegisterClipboardFormat('CF_UNICODETEXT'); SetClipboardData(CF_UNICODETEXT,gMem); CloseClipboard; BtnPasteClick(Self); end;
function TMain.SourceText: String; var WS:wideString; ch:WideChar; n,i:integer; w:word; TS:Char; s:string; resultS:String; found:Boolean; begin Result:=''; ResultS:=''; if WebEdit=nil then exit; WS:=WebEdit.DocumentHTML; for n:=1 to length(WS) do begin ch:=WS[n]; w:=word(ch); if (w>255) then begin s:=IntToStr(w); s:=''+s+';'; end else s:=ch; ResultS:=ResultS+s; end; S:= ResultS;
ResultS:=''; if high(replaceAnsi)>0 then begin for n:=1 to length(S) do begin TS:= S[n]; found:=False; for I:=0 to High(ReplaceAnsi) do begin if TS=ReplaceAnsi[I].AnsiChar then begin ResultS:=ResultS+ReplaceAnsi[i].ReplaceString; found:=True; break; end; end; if not Found then ResultS:= ResultS+TS; end; end else ResultS:=S;
I:= pos(#13#10,ResultS); while I>0 do begin delete(resultS,I,2); insert(#32,resultS,I); I:= pos(#13#10,ResultS); end; I:= pos(#32#32,ResultS); while I>0 do begin delete(ResultS,I,1); I:= pos(#32#32,ResultS); end;
result:= ResultS; end;
procedure TMain.LoadUmsetztabelle; var Ini: TIniFIle; k: Integer; Se: TStringList; S: String; begin try setLength(ReplaceAnsi,0); except end; INI:= TIniFile.Create(ININame); SE:= TStringList.Create; INI.ReadSection('Ansi2Entities',SE); SetLength(ReplaceAnsi,SE.Count); for K:=0 to SE.Count-1 do begin S:=Se[K]; ReplaceAnsi[k].AnsiChar:=S[1]; ReplaceAnsi[k].ReplaceString:=INI.ReadString('Ansi2Entities',Se[k],''); end; SE.Free; INI.Free; end;
procedure TMain.LoadKonfiguration; var Ini: TIniFIle; begin INI:= TIniFile.Create(ININame); aTag.Enabled:= Ini.ReadBool('Config','ViewTag',true); aHideTags.Enabled:=Ini.ReadBool('Config','HideTag',true); akEinfuegen.Enabled:= Ini.ReadBool('Config','akInsert',true); akAusschneiden.Enabled:= Ini.ReadBool('Config','akCut',true); akKopieren.Enabled:= Ini.ReadBool('Config','akCopy',true); akEinfuegenAlsText.Enabled:= Ini.ReadBool('Config','akInsertAs',true); aUndo.Enabled:= Ini.ReadBool('Config','akUndo',true); aRedo.Enabled:= Ini.ReadBool('Config','akRedo',true); aOpenFile.Enabled:= Ini.ReadBool('Config','akOpenfile',true); aNewFile.Enabled:= Ini.ReadBool('Config','akNewfile',true); aSaveDisk.Enabled:= Ini.ReadBool('Config','akSaveFile',true); aLine.Enabled:= Ini.ReadBool('Config','akInsertLine',true); aUrl.Enabled:= Ini.ReadBool('Config','akInsertUrl',true); aBold.Enabled:= Ini.ReadBool('Config','akBold',true); aUnderline.Enabled:= Ini.ReadBool('Config','akUnderline',true); aItalic.Enabled:= Ini.ReadBool('Config','akItalic',true); aLeft.Enabled:= Ini.ReadBool('Config','akLeftAlign',true); aCenter.Enabled:= Ini.ReadBool('Config','akCenterAlign',true); aRight.Enabled:= Ini.ReadBool('Config','akRightAlign',true); aBullet.Enabled:= Ini.ReadBool('Config','akBullet',true); aNumber.Enabled:= Ini.ReadBool('Config','akNumber',true); aOutdent.Enabled:= Ini.ReadBool('Config','akOutDent',true); aIndent.Enabled:= Ini.ReadBool('Config','akIndent',true); aClear.Enabled:= Ini.ReadBool('Config','akClear',true); aUp.Enabled:= Ini.ReadBool('Config','akUp',true); aDown.Enabled:= Ini.ReadBool('Config','akDown',true); aFont.Enabled:= Ini.ReadBool('Config','akFont',true); INI.Free; end;
procedure TMain.SizePanel; begin sb.Panels[0].Width:= Width-190- 20 -200 end;
procedure TMain.FormResize(Sender: TObject); begin SizePanel; end;
procedure TMain.DisplayHint(Sender: TObject); begin SB.Panels[0].Text := GetLongHint(Application.Hint); end;
procedure TMain.aHilfeExecute(Sender: TObject); begin shellExecute(Self.Handle,'Open',@Helpfile[1],nil,nil,sw_Show); end;
function TMain.EnableClearSourceFileSize: Boolean; var Ini: TIniFIle; begin INI:= TIniFile.Create(ININame); Result:= Ini.ReadBool('KUPFehler','EnableClearSourceFileSize',true); Ini.Free; end;
function TMain.InsertDefaultParagraph: Boolean; var Ini: TIniFIle; begin INI:= TIniFile.Create(ININame); Result:= Ini.ReadBool('SimpleLine','InsertDefaultParagraph',true); Ini.Free; end;
procedure TMain.HideToolBar(Hide: Boolean); begin aUndo.Visible:=not hide; aRedo.Visible:=not hide; aBold.Visible:=not hide; aUnderline.Visible:=not hide; aItalic.Visible:=not hide; aFont.Visible:= not hide; aLeft.Visible:=not hide; aCenter.Visible:=not hide; aRight.Visible:=not hide; aUp.Visible:=not hide; aDown.Visible:=not hide; aBullet.Visible:=not hide; aNumber.Visible:=not hide; aOutdent.Visible:=not hide; aIndent.Visible:=not hide; aLine.Visible:=not hide; aUrl.Visible:=not hide; aClear.Visible:=not hide; akEinfuegenAlsText.Visible:=not hide; akEinfuegen.Visible:=not hide; akKopieren.Visible:=not hide; akAusschneiden.Visible:=not hide; end;
function TMain.PostHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.PreHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.TranslateAccelerator(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin Result := S_FALSE; end;
function TMain.PostEditorEventNotify(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin if inEvtDispId = -606 then begin sb.Panels[0].Text := IntToStr(pIEventObj.clientX) + ':' + IntToStr(pIEventObj.clientY); end; Result := S_FALSE;
end;
function TMain.SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; begin prcNew.left := 20 * (prcNew.left div 20); prcNew.top := 20 * (prcNew.top div 20); prcNew.right := 20 * (prcNew.right div 20); prcNew.bottom := 20 * (prcNew.bottom div 20); Result := S_OK; end;
initialization OleInitialize(nil);
finalization OleUninitialize;
end. |
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.02.06 00:21
Hi,
wie ich schon in meiner PN geschrieben hab, würde ich gerne Funktionen wie Folgende ans laufen bekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TMain.PostEditorEventNotify(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult; begin if inEvtDispId = -606 then begin sb.Panels[0].Text := IntToStr(pIEventObj.clientX) + ':' + IntToStr(pIEventObj.clientY); end; Result := S_FALSE; end; |
Allerdings fehlt mir jeglicher Ansatz wie ich das bewerkstelligen soll, da die entsprechenden Ereignisse nicht aufgerufen werden. Ich hab zwar Lösungen für den TWebBrowser gefunden, allerdings es nicht geschafft das auf das TDhtmlEdit zu übertragen.
Wär deshalb echt nett, falls du oder wer anders wissen würden wie ich die Funktionen dafür integriere, das die Ereignisse aufgerufen und genutzt werden können (z.B. eben für X/Y-Anzeige oder dergleichen).
Danke und Gruß
Benedikt
|
|
MSCH 
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Di 14.02.06 18:57
hallo,
eine entsprechende Lösung findest du unter:
www.mswil.ch/websvn/...s&rev=0&sc=0
Du musst deinen Quelltext entsprechend den dortig deklarierten Eventhandler anpassen.
ich hoffe, es hilft dir weiter.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.02.06 00:51
Eine Frage bleibt mir dabei irgendwie noch, was ist die Entsprechung von TDHTMLEdit zufolgender, auf den TWebBrowser bezogenen Funktion:
Delphi-Quelltext 1: 2: 3: 4:
| function Tform1.GetHTMLDocument2Ifc: IHTMLDocument2; begin Result := WebBrowser1.Document as IHTMLDocument2; end; |
Irgendwie steh ich da grad voll aufm Schlauch, aber ich denke ich benötige diese Funktion? Lieg ich da falsch bzw. wenn es doch richtig ist, was muss ich statt WebBrowser1.Document nutzen?
Oder denk ich das Ganze komplett falsch?
MfG Benedikt
|
|
MSCH 
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 15.02.06 18:36
im DHTML-Editor wäre die Entsprechung:
result:= Webedit.DOM;
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.02.06 18:42
Mhhh verdammt, das hatte ich auch schon aber trotzdem irgendeinen Fehler (Schwerwiegender Fehler: TOleException) - naja, ich werd nochmal genauer schauen was sich da machen lässt - trotzdem Danke, evtl. kann ich mein Problem ja auch so irgendwie lösen
//EDIT: Hat sich erledigt...
|
|
|