Autor Beitrag
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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:
ausblenden 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; overloadstdcall;
      function _Release: Integer; overloadstdcall;

      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:

ausblenden volle Höhe 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:
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:
ausblenden 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 <> NILThen
     begin
      Result := pIContainer.QueryInterface(IID_IOleContainer, container);
      Exit;
     end;
   container := NIL;
   Result := E_NOINTERFACE;
//  Result := E_NOINTERFACE;<<-- das stand dort vorher drinne und gab besagte Meldung aus
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:
ausblenden 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:

ausblenden volle Höhe 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:
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)
...
    // *** Implementation of IHTMLHost
    function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
    // *** Implementation of IHTMLEditDesigner ***
    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

// und die zugehörige Implementation dazu:

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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
initialization
OleInitialize(nil);

finalization
OleUninitialize;

In der Create() Methode der Form ergänzen wir folgende Einträge:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TMain.FormCreate(Sender: TObject);
begin
  WebEdit.DefaultInterface._AddRef;
...
end;


Um eine Datei zu Laden:

ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  W:WideString;
  F:TextFile;
begin
  S:=WebEdit.DocumentHTML; // gesamter Quelltext, nicht .InnerHTML !!
  AssignFile(F,'Test.html');
  Rewrite(F);
  Writeln(F,S);
  closeFile(F);
end;


Alternativ wäre zum Beispiel auch sinnvoll:
ausblenden Delphi-Quelltext
1:
2:
   StringToWideChar(Filename,Wide,Sizeof(Wide));
  (WebEdit.DOM as IPersistFile).Save(Wide,false);


oder via Dialog zum Beispiel:
ausblenden 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

ausblenden volle Höhe 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:
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;
// liefert einen Rückgabewert, ob in der aktuellen Selektion das Kommando "Name" enthalten ist
// sprich, ist der Text der Selektion "Fett" gibts einen Rückgabewert [fett] 
// d.h. der Buttons "Fett" ist selektiert (Down) wenn der Cursor auf einen Fetten Text geht
 var
  V: OleVariant;
begin
  V := WebEdit.DOM.selection.createRange;
  Result := V.queryCommandValue(Name);
end;


procedure TMain.UpdateButtons;
  function QueryStatus(cmdID: OleVariant): OleVariant;
  // liefert den Status eines Kommandos 
  begin
    Result := WebEdit.QueryStatus(cmdID);
  end;

begin
  // Aktion  = [Kommando erlaubt], simple Bitschieberei
  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.

ausblenden 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);
// dem HTMLEditor eine Nachricht schicken.
var
  V: OleVariant;
  S: OleVariant;
begin
  if GetProperties(Name) <> Value then begin // nur wenn sowieso nicht schon gesetzt
    V := WebEdit.DOM.selection.createRange; // Range erstellen
    S := Value; // a bissle rumschieben
    V.execCommand(Name , False, S); // und ab damit
  end;
end;

procedure TMain.aBoldExecute(Sender: TObject);
begin
  SetProperties('Bold',iBold.Down); // Je nach Status des Buttons "Down" Text Fett machen oder Text Fett aufheben
  UpdateButtons; // mir ist noch nichts besseres eingefallen, Buttons aktualisieren
end;
...

// hier zum beispiel Text unterstreichen
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.

ausblenden 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 :

ausblenden Delphi-Quelltext
1:
2:
3:
    while Webedit.Busy do Application.ProcessMessages;
      if not WebEdit.Busy then
        WebEdit.Dom.charset:='iso-8859-1';//'utf-8';//'unicode';


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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 25.10.05 20:08 
das klingt super. Könntest du vll. noch eine Demo posten (also im Anhang, und mit Quelltext)?
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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 8)
MSCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: Fr 11.11.05 14:52 
Auch wenn ich F5 länger drücke,
den Anhang finde ich nicht.

Moin
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101

WinXP
Delphi 2007 Pro, C# (VS 2005)
BeitragVerfasst: Fr 11.11.05 16:05 
Hallo,
Kann denn keiner mal den Quellcode anhängen, dann wäre das nur halbsoviel arbeit :D

MfG
Bennle
MSCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

ausblenden volle Höhe 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:
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:
{****************************************************************************
  Hauptanwendung, HTML-Editor
  Geschrieben in DELPHI Enterprise 6.0

  Benötigt den IE 5.x für das OCX Control DHMTLEdit
  update 05.03.2005
****************************************************************************}



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;//122;
 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: $0500; EndCode:$052F; PName:'Cyrillic Supplementary'),
// (ShowChar:False;StartCode: $0530; EndCode:$058F; PName:'Armenian'),
 (ShowChar:False;StartCode: $0590; EndCode:$05FF; PName:'Hebrew'),
 (ShowChar:False;StartCode: $0600; EndCode:$06FF; PName:'Arabic'),
// (ShowChar:False;StartCode: $0700; EndCode:$074F; PName:'Syriac'),
// (ShowChar:False;StartCode: $0780; EndCode: $07BF; PName:'Thaana'),
// (ShowChar:False;StartCode: $0900; EndCode: $097F; PName:'Devanagari'),
// (ShowChar:False;StartCode: $0980; EndCode: $09FF; PName:'Bengali'),
// (ShowChar:False;StartCode: $0A00; EndCode: $0A7F; PName:'Gurmukhi'),
// (ShowChar:False;StartCode: $0A80; EndCode: $0AFF; PName:'Gujarati'),
// (ShowChar:False;StartCode: $0B00; EndCode: $0B7F; PName:'Oriya'),
// (ShowChar:False;StartCode: $0B80; EndCode: $0BFF; PName:'Tamil'),
// (ShowChar:False;StartCode: $0C00; EndCode: $0C7F; PName:'Telugu'),
// (ShowChar:False;StartCode: $0C80; EndCode: $0CFF; PName:'Kannada'),
// (ShowChar:False;StartCode: $0D00; EndCode: $0D7F; PName:'Malayalam'),
// (ShowChar:False;StartCode: $0D80; EndCode: $0DFF; PName:'Sinhala'),
// (ShowChar:False;StartCode: $0E00; EndCode: $0E7F; PName:'Thai'),
// (ShowChar:False;StartCode: $0E80; EndCode: $0EFF; PName:'Lao'),
// (ShowChar:False;StartCode: $0F00; EndCode: $0FFF; PName:'Tibetan'),
// (ShowChar:False;StartCode: $1000; EndCode: $109F; PName:'Myanmar'),
// (ShowChar:False;StartCode: $10A0; EndCode: $10FF; PName:'Georgian'),
// (ShowChar:False;StartCode: $1100; EndCode: $11FF; PName:'Hangul Jamo'),
// (ShowChar:False;StartCode: $1200; EndCode: $137F; PName:'Ethiopic'),
// (ShowChar:False;StartCode: $13A0; EndCode: $13FF; PName:'Cherokee'),
// (ShowChar:False;StartCode: $1400; EndCode: $167F; PName:'Unified Canadian Aboriginal Syllabics'),
// (ShowChar:False;StartCode: $1680; EndCode: $169F; PName:'Ogham'),
// (ShowChar:False;StartCode: $16A0; EndCode: $16FF; PName:'Runic'),
// (ShowChar:False;StartCode: $1700; EndCode: $171F; PName:'Tagalog'),
// (ShowChar:False;StartCode: $1720; EndCode: $173F; PName:'Hanunoo'),
// (ShowChar:False;StartCode: $1740; EndCode: $175F; PName:'Buhid'),
// (ShowChar:False;StartCode: $1760; EndCode: $177F; PName:'Tagbanwa'),
// (ShowChar:False;StartCode: $1780; EndCode: $17FF; PName:'Khmer'),
// (ShowChar:False;StartCode: $1800; EndCode: $18AF; PName:'Mongolian'),
// (ShowChar:False;StartCode: $1900; EndCode: $194F; PName:'Limbu'),
// (ShowChar:False;StartCode: $1950; EndCode: $197F; PName:'Tai Le'),
// (ShowChar:False;StartCode: $19E0; EndCode: $19FF; PName:'Khmer Symbols'),
// (ShowChar:False;StartCode: $1D00; EndCode: $1D7F; PName:'Phonetic Extensions'),
 (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'),
// (StartCode: $2070; EndCode: $209F; PName:'Superscripts and Subscripts'),
 (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: $2440; EndCode: $245F; PName:'Optical Character Recognition'),
// (ShowChar:False;StartCode: $2460; EndCode: $24FF; PName:'Enclosed Alphanumerics'),
 (ShowChar:False;StartCode: $2500; EndCode: $257F; PName:'Box Drawing'),
// (ShowChar:False;StartCode: $2580; EndCode: $259F; PName:'Block Elements'),
 (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: $27F0; EndCode: $27FF; PName:'Supplemental Arrows-A'),
// (ShowChar:False;StartCode: $2800; EndCode: $28FF; PName:'Braille Patterns'),
// (ShowChar:False;StartCode: $2900; EndCode: $297F; PName:'Supplemental Arrows-B'),
// (ShowChar:False;StartCode: $2980; EndCode: $29FF; PName:'Miscellaneous Mathematical Symbols-B'),
// (ShowChar:False;StartCode: $2A00; EndCode: $2AFF; PName:'Supplemental Mathematical Operators'),
// (ShowChar:False;StartCode: $2B00; EndCode: $2BFF; PName:'Miscellaneous Symbols and Arrows'),
// (ShowChar:False;StartCode: $2E80; EndCode: $2EFF; PName:'CJK Radicals Supplement'),
// (ShowChar:False;StartCode: $2F00; EndCode: $2FDF; PName:'Kangxi Radicals'),
// (ShowChar:False;StartCode: $2FF0; EndCode: $2FFF; PName:'Ideographic Description Characters'),
// (ShowChar:False;StartCode: $3000; EndCode: $303F; PName:'CJK Symbols and Punctuation'),
// (ShowChar:False;StartCode: $3040; EndCode: $309F; PName:'Hiragana'),
// (ShowChar:False;StartCode: $30A0; EndCode: $30FF; PName:'Katakana'),
// (ShowChar:False;StartCode: $3100; EndCode: $312F; PName:'Bopomofo'),
// (ShowChar:False;StartCode: $3130; EndCode: $318F; PName:'Hangul Compatibility Jamo'),
// (ShowChar:False;StartCode: $3190; EndCode: $319F; PName:'Kanbun'),
// (ShowChar:False;StartCode: $31A0; EndCode: $31BF; PName:'Bopomofo Extended'),
// (ShowChar:False;StartCode: $31F0; EndCode: $31FF; PName:'Katakana Phonetic Extensions'),
// (ShowChar:False;StartCode: $3200; EndCode: $32FF; PName:'Enclosed CJK Letters and Months'),
// (ShowChar:False;StartCode: $3300; EndCode: $33FF; PName:'CJK Compatibility'),
// (ShowChar:False;StartCode: $3400; EndCode: $4DBF; PName:'CJK Unified Ideographs Extension A'),
// (ShowChar:False;StartCode: $4DC0; EndCode: $4DFF; PName:'Yijing Hexagram Symbols'),
// (ShowChar:False;StartCode: $4E00; EndCode: $9FFF; PName:'CJK Unified Ideographs'),
// (ShowChar:False;StartCode: $A000; EndCode: $A48F; PName:'Yi Syllables'),
// (ShowChar:False;StartCode: $A490; EndCode: $A4CF; PName:'Yi Radicals'),
// (ShowChar:False;StartCode: $AC00; EndCode: $D7AF; PName:'Hangul Syllables'),
// (ShowChar:False;StartCode: $D800; EndCode: $DB7F; PName:'High Surrogates'),
// (ShowChar:False;StartCode: $DB80; EndCode: $DBFF; PName:'High Private Use Surrogates'),
// (ShowChar:False;StartCode: $DC00; EndCode: $DFFF; PName:'Low Surrogates'),
// (ShowChar:False;StartCode: $E000; EndCode: $F8FF; PName:'Private Use Area'),
// (ShowChar:False;StartCode: $F900; EndCode: $FAFF; PName:'CJK Compatibility Ideographs'),
 (ShowChar:False;StartCode: $FB00; EndCode: $FB4F; PName:'Alphabetic Presentation Forms'),
 (ShowChar:False;StartCode: $FB50; EndCode: $FDFF; PName:'Arabic Presentation Forms-A'),
// (ShowChar:False;StartCode: $FE00; EndCode: $FE0F; PName:'Variation Selectors'),
 (ShowChar:False;StartCode: $FE20; EndCode: $FE2F; PName:'Combining Half Marks'),
// (ShowChar:False;StartCode: $FE30; EndCode: $FE4F; PName:'CJK Compatibility Forms'),
 (ShowChar:False;StartCode: $FE50; EndCode: $FE6F; PName:'Small Form Variants'),
// (ShowChar:False;StartCode: $FE70; EndCode: $FEFF; PName:'Arabic Presentation Forms-B'),
// (ShowChar:False;StartCode: $FF00; EndCode: $FFEF; PName:'Halfwidth and Fullwidth Forms'),
 (ShowChar:False;StartCode: $FFF0; EndCode: $FFFF; PName:'Specials'),
// (ShowChar:False;StartCode: $10000; EndCode: $1007F; PName:'Linear B Syllabary'),
// (ShowChar:False;StartCode: $10080; EndCode: $100FF; PName:'Linear B Ideograms'),
// (ShowChar:False;StartCode: $10100; EndCode: $1013F; PName:'Aegean Numbers'),
// (ShowChar:False;StartCode: $10300; EndCode: $1032F; PName:'Old Italic'),
// (ShowChar:False;StartCode: $10330; EndCode: $1034F; PName:'Gothic'),
// (ShowChar:False;StartCode: $10380; EndCode: $1039F; PName:'Ugaritic'),
// (ShowChar:False;StartCode: $10400; EndCode: $1044F; PName:'Deseret'),
// (ShowChar:False;StartCode: $10450; EndCode: $1047F; PName:'Shavian'),
// (ShowChar:False;StartCode: $10480; EndCode: $104AF; PName:'Osmanya'),
// (ShowChar:False;StartCode: $10800; EndCode: $1083F; PName:'Cypriot Syllabary'),
// (ShowChar:False;StartCode: $1D000; EndCode: $1D0FF; PName:'Byzantine Musical Symbols'),
// (ShowChar:False;StartCode: $1D100; EndCode: $1D1FF; PName:'Musical Symbols'),
// (ShowChar:False;StartCode: $1D300; EndCode: $1D35F; PName:'Tai Xuan Jing Symbols'),
// (ShowChar:False;StartCode: $1D400; EndCode: $1D7FF; PName:'Mathematical Alphanumeric Symbols'),
// (ShowChar:False;StartCode: $20000; EndCode: $2A6DF; PName:'CJK Unified Ideographs Extension B'),
// (ShowChar:False;StartCode: $2F800; EndCode: $2FA1F; PName:'CJK Compatibility Ideographs Supplement'),
 (ShowChar:False;StartCode: $E0000; EndCode: $E007F; PName:'Tags')
// (ShowChar:False;StartCode: $E0100; EndCode: $E01EF; PName:'Variation Selectors Supplement')
 );


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
   { Private-Deklarationen }
    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);

    // *** Implementation of IHTMLHost
    function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
    // *** Implementation of IHTMLEditDesigner ***
    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
    { Public-Deklarationen }
    procedure UpdateButtons;
  end;

var
  Main: TMain;

implementation

uses Clipbrd,ShellApi,IniFiles;

{$R *.dfm}

// Anwendung erstellen
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,DTD);
        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,DTD);
        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 // null parameter
  // Update UTF-8
    WebEdit.NewDocument;
    while Webedit.Busy do Application.ProcessMessages;
      if not WebEdit.Busy then
        WebEdit.Dom.charset:='iso-8859-1';//'utf-8';//'unicode';
  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;

// Anwendung beenden
procedure TMain.ExitBtnClick(Sender: TObject);
begin
  close;
end;

// Dokument sichern
procedure TMain.SaveBtnClick(Sender: TObject);
begin
  SaveDoc;
end;

// Funktion
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;
// nur wenn Widechars gewünscht, DoubleByte Zeichensatz !!!
//  StringToWideChar(Filename,Wide,Sizeof(Wide));
//  (WebEdit.DOM as IPersistFile).Save(Wide,false);
  O:=Filename;
  while WebEdit.Busy do
    Application.ProcessMessages;
  S:=WebEdit.DocumentHTML;
  SDOM:=SourceText;
{  for I:=1 to length(S) do
    SDOM:= SDOM+CheckEnty(S[i]);}

  AssignFile(F,Filename);
  rewrite(F);
// Update 02.03. alles klein im Header
  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);
//  WebEdit.SaveDocument(o);
  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);// DECMD_CUT,OLECMDEXECOPT_DONTPROMPTUSER);
  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);
//  UpdateButtons;
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,DTD);
      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],0of
      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';
//  charSet := 'utf-8';
  //charSet := 'unicode';
    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
    0begin
         WebEdit.DocumentHTML:= HQuelle.Text;
         HideToolBar(false);
       end;
    1Begin
         WideS:= WebEdit.DocumentHTML;
         HQuelle.Text:= SourceText;// WebEdit.DocumentHTML;
         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
//     BtnPasteClick(self);
  end;
  if ((event.keyCode=Ord('C')) or (Event.keyCode=Ord('c'))) and
     (Event.ctrlKey=true)  then begin
//     BtnCopyClick(Self);
  end;
  if ((event.keyCode=Ord('X')) or (Event.keyCode=Ord('x'))) and
     (Event.ctrlKey=true)  then begin
//     BtnCutClick(Self);
  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..20of 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;
  // alle alten Buttons löschen
  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);//+WSS);
  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])]);
//IntToHex(I,4)
  end;
end;

procedure TMain.CLDblClick(Sender: TObject);
var c: WideString;
    gMem: HGLOBAL;
    lp: PChar;
begin
  c:= CL.Items[CL.itemIndex];
{  if length(S)>0 then
    C:=S[1]
  else
    C:='?';}

  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>255then begin
         s:=IntToStr(w);
         s:='&#'+s+';';
      end
      else
         s:=ch;
      ResultS:=ResultS+s;
  end;
// update parsen der eingestellten Umsetzungen ANSI
  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// for in Replace
      if not Found then ResultS:= ResultS+TS;
    end;
  end else ResultS:=S;
{// Update parsen der eingestellten Umsetzungen Unicode
// zwei Möglichkeiten Suchen von &#dezimalwert; order $#xHexwert;
  S:= ResultS;
  for I:=0 to high(ReplaceUni) do begin
    N:= Pos(replaceUni[i].CodeDez,S);
    while N>0 do begin
      delete(S,N,length(ReplaceUni[i].CodeDez));
      Insert(ReplaceUni[i].ReplaceString,S,N);
      N:= Pos(replaceUni[i].CodeDez,S);
    end;

  end;}

// zeilenumbrüche löschen und Leerzeichen rein
  I:= pos(#13#10,ResultS);
  while I>0 do begin
    delete(resultS,I,2);
    insert(#32,resultS,I);
    I:= pos(#13#10,ResultS);
  end;
// doppelte Leerzeichen suchen
  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); // default;
  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-19020 -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
    // onmousemove
    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



BeitragVerfasst: 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:
ausblenden 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  
    // onmousemove  
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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



BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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



BeitragVerfasst: 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 :wink:

//EDIT: Hat sich erledigt...