ich bin gerade dabei in meinem PLEDITOR ein einfaches Datei Format in XML zu entwickeln. Allerdings habe ich jetzt ein kleines Problem. Da weiß ich einfach nicht mehr weiter. Evlt. kann ja einer von euch weiter helfen.
Ich nutze XMLReader und DOM. Was Standard gemäß bei Lazarus bzw. FPC Dabei ist.
Also hier ersteinmal die XML Datei:
Code: Alles auswählen
<?xml version="1.0"?>
<Text>
<NewLine>
Der Himmel ist heute <Font BGCOLOR="clBlack" FGColor="clLime">Blau</Font> und die Sonne
<Font BGColor="clRed">scheint </Font>
</NewLine>
<NewLine>
</NewLine>
<NewLine>
Text1 Text2 Text3
</NewLine>
<NewLine>
Text1 <Font FGColor="clBlue" BGColor="clLime">T<Font bgColor="clRed">ex</Font>t2</Font> Text3
</NewLine>
<NewLine><Font BGCOLOR="clLime" FGCOLOR="clYellow">schön warm</Font> vom Himmel.</NewLine>
</Text>
Da stellen tut er es, aber anscheint gibt es beim Verschachteln von Tag's Probleme.Text1 <Font FGColor="clBlue" BGColor="clLime">T<Font bgColor="clRed">ex</Font>t2</Font> Text3
Ich hätte folgendes jetzt erwartet:
Das Große T wird richtig da gestellt, das ex auch aber t2 nicht mehr. t2 wird in der Default Farbe angezeigt und nicht Grün/Blau.
Im Anhang habe ich noch ein Bild für euch.
Hier der Code:
wegen dem Verschachteln von Tag's habe ich extra eine StyleListe eingeführt. Der Kern Code stammt aus dem XML Beispiel von der Lazarus-Wiki Seite. Ich habe den code einfach nur angepasst. Das meiste geht ja auch, aber ich finde einfach den Fehler nicht. Hier der Code:
Code: Alles auswählen
function TPLEditorTextList.LoadFromXMLFile(const aXMLFile: String): Integer;
var
Documento: TXMLDocument;
iNode: TDOMNode;
Line:TPLEditorTextLine;
currItem:TPlEditorTextItem;
SaveStyle:TPlEditorTextStyle;
StyleListe:TObjectList;
SaveChange:Boolean;
procedure ProcessNode(Node: TDOMNode);
var
cNode: TDOMNode;
i:Integer;
str,strv:string;
begin
if Node = nil then Exit;
if Node.HasAttributes then begin
// Der Aktuelle Style wird gespeichert in einer Liste
SaveStyle:=TPlEditorTextStyle.Create;
SaveStyle.Assign(DefaultStyle);
// writeln(ColorToString(DefaultStyle.BrushColor));
StyleListe.Add(SaveStyle);
SaveChange:=True;
for I:=0 to Node.Attributes.Length-1 do begin
str:=UpperCase(Node.Attributes[i].NodeName);
strv:=Node.Attributes[i].NodeValue;
if str = 'BGCOLOR' then begin
DefaultStyle.BrushColor:=StringToColor(strv);
end;
if str = 'FGCOLOR' then
DefaultStyle.FontColor:=StringToColor(strv);
end; // for i
end
else begin
str:=node.NodeValue;
if pos(#10,str) >0 then begin
Delete(str,pos(#10,Node.NodeValue),1);
Node.NodeValue:=str;
end;
if Node.NodeName = 'NewLine' then
Line:=AddLine(Node.NodeValue)
else
line.AddTextItem(Node.NodeValue, DefaultStyle);
// Der Vorherige Style wird wieder hergestellt
if SaveChange then begin
SaveStyle:=TPlEditorTextStyle(StyleListe[StyleListe.Count-1]);
DefaultStyle.Assign(SaveStyle);
StyleListe.Delete(StyleListe.Count-1);
SaveStyle:=nil;
SaveChange:=False;
end;
end; // else begin
cNode := Node.FirstChild;
while cNode <> nil do begin
ProcessNoDe(cNode);
cNode := cNode.NextSibling;
end; // while
end;
begin
StyleListe:=TObjectList.Create;
ReadXMLFile(Documento, aXMLFile);
iNode := Documento.DocumentElement.ChildNodes.Item[0];
SaveChange:=False;
while iNode <> nil do begin
ProcessNode(iNode); // Rekursiv
iNode := iNode.NextSibling;
end;
Documento.Free;
end; // TPLEditorTextList.LoadFromXMLFile
PS: Sehe ich das richtig das es für XML Dateien kein Highlighter gibt ? hier im Forum ?