| 
| Autor | Beitrag |  
| MSCH 
          Beiträge: 1448
 Erhaltene Danke: 3
 
 W7 64
 XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
 
 | 
Verfasst: Di 25.10.05 19: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:
 
 | TypeTImpIOleContainer = 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:
 
 | usesWindows, 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:
 
 | initializationOleInitialize(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:
 
 | varO: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:
 
 | varW: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 19: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 16: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 18: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 17: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 12: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 13: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 13: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 13: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 14: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 15: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 17: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: Mo 13.02.06 23: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 17: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: Di 14.02.06 23: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 17: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 17: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... |  |  |  |