Browse Source

* [utlEvent] use queue for async listener (instead of list)

* [utlGenerics] extract itm from HashSet and Map without finalizing it
* [utlMcf]      implemented ValueAt property
* some other stuff: bugfixing, improvements
master
Bergmann89 7 years ago
parent
commit
7b0d3ab0ad
5 changed files with 317 additions and 87 deletions
  1. +6
    -6
      uutlEvent.pas
  2. +7
    -6
      uutlGenerics.pas
  3. +7
    -0
      uutlMCF.pas
  4. +1
    -2
      uutlVariantEnum.pas
  5. +296
    -73
      uutlXmlHelper.pas

+ 6
- 6
uutlEvent.pas View File

@@ -106,14 +106,14 @@ type

private type
TEventPair = specialize TutlPair<TObject, IutlEventArgs>;
TEventList = class(specialize TutlSimpleList<TEventPair>)
TEventQueue = class(specialize TutlQueue<TEventPair>)
protected
procedure Release(var aItem: TEventPair; const aFreeItem: Boolean); override;
end;

private
fEventLock: TCriticalSection;
fEvents: TEventList;
fEvents: TEventQueue;
fListener: IutlEventListener;

function PopEventPair(out aPair: TEventPair): Boolean;
@@ -259,7 +259,7 @@ end;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlEventListenerAsync.TEventList//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlEventListenerAsync.TEventList.Release(var aItem: TEventPair; const aFreeItem: Boolean);
procedure TutlEventListenerAsync.TEventQueue.Release(var aItem: TEventPair; const aFreeItem: Boolean);
begin
aItem.first := nil;
aItem.second := nil;
@@ -275,7 +275,7 @@ begin
try
result := not fEvents.IsEmpty;
if result
then aPair := fEvents.PopFirst(false)
then aPair := fEvents.Dequeue
else FillByte(aPair, SizeOf(aPair), 0);
finally
fEventLock.Leave;
@@ -291,7 +291,7 @@ begin
p.second := aEventArgs;
fEventLock.Enter;
try
fEvents.Add(p);
fEvents.Enqueue(p);
finally
fEventLock.Leave;
end;
@@ -313,7 +313,7 @@ begin
raise EArgumentNilException.Create('aListener');
inherited Create;
fEventLock := TCriticalSection.Create;
fEvents := TEventList.Create(true);
fEvents := TEventQueue.Create(true);
fListener := aListener;
end;



+ 7
- 6
uutlGenerics.pas View File

@@ -239,7 +239,7 @@ type
function Add (constref aItem: T): Boolean;
function Contains (constref aItem: T): Boolean;
function IndexOf (constref aItem: T): Integer;
function Remove (constref aItem: T): Boolean;
function Remove (constref aItem: T; const aFreeItem: Boolean = true): Boolean;
procedure Delete (const aIndex: Integer);

constructor Create (aComparer: IComparer; const aOwnsItems: Boolean);
@@ -454,7 +454,7 @@ type
function TryGetValue (constref aKey: TKey; out aValue: TValue): Boolean;
function IndexOf (constref aKey: TKey): Integer;
function Contains (constref aKey: TKey): Boolean;
function Remove (constref aKey: TKey): Boolean;
function Remove (constref aKey: TKey; const aFreeItem: Boolean = true): Boolean;
procedure Delete (constref aKey: TKey);
procedure DeleteAt (const aIndex: Integer);
procedure Clear;
@@ -1326,13 +1326,13 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlCustomHashSet.Remove(constref aItem: T): Boolean;
function TutlCustomHashSet.Remove(constref aItem: T; const aFreeItem: Boolean): Boolean;
var
i: Integer;
begin
result := TBinarySearch.Search(self, fComparer, aItem, i);
if result then
DeleteIntern(i, true);
DeleteIntern(i, aFreeItem);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1689,12 +1689,12 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlCustomMap.Remove(constref aKey: TKey): Boolean;
function TutlCustomMap.Remove(constref aKey: TKey; const aFreeItem: Boolean): Boolean;
var
kvp: TKeyValuePair;
begin
kvp.Key := aKey;
result := fHashSetRef.Remove(kvp);
result := fHashSetRef.Remove(kvp, aFreeItem);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2106,6 +2106,7 @@ begin
p^.PushBackUsedIndex(Index);
h^.Counter := Counter;
h^.Data := aData;
h^.TypeID := TypeID;
end;
end else
Update(aHandle, aData);


+ 7
- 0
uutlMCF.pas View File

@@ -61,6 +61,7 @@ type
function GetSectionByIndex(aIndex: Integer): TutlMCFSection;
function GetValueCount: integer;
function GetValueName(Index: integer): string;
function GetValueAt(aIndex: integer): Variant;
protected
procedure ClearSections;
procedure ClearValues;
@@ -78,6 +79,7 @@ type

property ValueCount: integer read GetValueCount;
property ValueNameAt[Index: integer]: string read GetValueName;
property ValueAt[Index: integer]: Variant read GetValueAt;

property SectionCount: integer read GetSectionCount;
property SectionNameAt[Index: integer]: string read GetSectionName;
@@ -356,6 +358,11 @@ begin
Result:= FValues[Index];
end;

function TutlMCFSection.GetValueAt(aIndex: integer): Variant;
begin
result := TutlMcfValue(FValues.Objects[aIndex]).Value;
end;

procedure TutlMCFSection.ClearSections;
var
i: integer;


+ 1
- 2
uutlVariantEnum.pas View File

@@ -183,8 +183,7 @@ begin
RaiseInvalidOp;
src := PEnumVarData(@Source);
dst := PEnumVarData(@Dest);
dst^.vType := src^.vType;
dst^.vHelper := src^.vHelper;
dst^ := src^;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


+ 296
- 73
uutlXmlHelper.pas View File

@@ -41,7 +41,7 @@ type
// simple properties
function GetElement: TDOMElement;

property Node: TDOMElement read GetElement;
property Element: TDOMElement read GetElement;

// set value of current node
procedure SetString (const aValue: String); overload;
@@ -52,28 +52,36 @@ type
procedure SetBool (const aValue: Boolean);

// get value of current node
function GetString (const aDefault: String): String;
function GetStringW (const aDefault: WideString): WideString;
function GetStringU (const aDefault: UnicodeString): UnicodeString;
function GetInt (const aDefault: Int64): Int64;
function GetFloat (const aDefault: Double): Double;
function GetBool (const aDefault: Boolean): Boolean;
function GetString (const aDefault: String = ''): String;
function GetStringW (const aDefault: WideString = ''): WideString;
function GetStringU (const aDefault: UnicodeString = ''): UnicodeString;
function GetInt (const aDefault: Int64 = 0): Int64;
function GetFloat (const aDefault: Double = 0): Double;
function GetBool (const aDefault: Boolean = false): Boolean;

// try get value of current node
function TryGetString (out aValue: String): Boolean;
function TryGetStringW (out aValue: WideString): Boolean;
function TryGetStringU (out aValue: UnicodeString): Boolean;
function TryGetInt (out aValue: Int64): Boolean;
function TryGetFloat (out aValue: Double): Boolean;
function TryGetBool (out aValue: Boolean): Boolean;

// set value of attribute
procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
procedure SetAttribInt (const aName: DOMString; const aValue: Integer);
procedure SetAttribInt (const aName: DOMString; const aValue: Integer); overload;
procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);

// get value of attribute
function GetAttribString (const aName: DOMString; const aDefault: String): String;
function GetAttribStringW (const aName: DOMString; const aDefault: WideString): WideString;
function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
function GetAttribInt (const aName: DOMString; const aDefault: Int64): Int64;
function GetAttribFloat (const aName: DOMString; const aDefault: Double): Double;
function GetAttribBool (const aName: DOMString; const aDefault: Boolean): Boolean;
function GetAttribString (const aName: DOMString; const aDefault: String = ''): String;
function GetAttribStringW (const aName: DOMString; const aDefault: WideString = ''): WideString;
function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString = ''): UnicodeString;
function GetAttribInt (const aName: DOMString; const aDefault: Int64 = 0): Int64;
function GetAttribFloat (const aName: DOMString; const aDefault: Double = 0): Double;
function GetAttribBool (const aName: DOMString; const aDefault: Boolean = false): Boolean;

// get value of attribute
function TryGetAttribString (const aName: DOMString; out aValue: String): Boolean;
@@ -84,7 +92,8 @@ type
function TryGetAttribBool (const aName: DOMString; out aValue: Boolean): Boolean;

// node operations
function Nodes (const aName: DOMString): IutlNodeEnumerator;
function Nodes (const aName: DOMString = ''): IutlNodeEnumerator;
function Node (const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
function PrependNode (const aName: DOMString): TDOMElement;
function AppendNode (const aName: DOMString): TDOMElement;
procedure PrependText (const aText: DOMString);
@@ -116,7 +125,7 @@ type
public { IutlXmlHelper }
function GetElement: TDOMElement;

// set value of current node
// set value of current node
procedure SetString (const aValue: String); overload;
procedure SetString (const aValue: WideString); overload;
procedure SetString (const aValue: UnicodeString); overload;
@@ -132,11 +141,19 @@ type
function GetFloat (const aDefault: Double): Double;
function GetBool (const aDefault: Boolean): Boolean;

// try get value of current node
function TryGetString (out aValue: String): Boolean;
function TryGetStringW (out aValue: WideString): Boolean;
function TryGetStringU (out aValue: UnicodeString): Boolean;
function TryGetInt (out aValue: Int64): Boolean;
function TryGetFloat (out aValue: Double): Boolean;
function TryGetBool (out aValue: Boolean): Boolean;

// set value of attribute
procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
procedure SetAttribInt (const aName: DOMString; const aValue: Integer);
procedure SetAttribInt (const aName: DOMString; const aValue: Integer); overload;
procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);

@@ -158,6 +175,7 @@ type

// node operations
function Nodes (const aName: DOMString): IutlNodeEnumerator;
function Node (const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
function PrependNode (const aName: DOMString): TDOMElement;
function AppendNode (const aName: DOMString): TDOMElement;
procedure PrependText (const aText: DOMString);
@@ -171,32 +189,61 @@ type
class function Create(const aElement: TDOMElement): IutlXmlHelper;

public
class function SetString (const aNode: TDOMNode; const aValue: String): TDOMNode; overload;
class function SetString (const aNode: TDOMNode; const aValue: WideString): TDOMNode; overload;
class function SetString (const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode; overload;
class function SetInt (const aNode: TDOMNode; const aValue: Integer): TDOMNode;
class function SetFloat (const aNode: TDOMNode; const aValue: Double): TDOMNode;
class function SetBool (const aNode: TDOMNode; const aValue: Boolean): TDOMNode;

class function GetString (const aNode: TDOMNode; const aDefault: String): String;
class function GetStringW (const aNode: TDOMNode; const aDefault: WideString): WideString;
class function GetStringU (const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
class function GetInt (const aNode: TDOMNode; const aDefault: Int64): Int64;
class function GetFloat (const aNode: TDOMNode; const aDefault: Double): Double;
class function GetBool (const aNode: TDOMNode; const aDefault: Boolean): Boolean;

class function TryGetString (const aNode: TDOMNode; out aValue: String): Boolean;
class function TryGetStringW(const aNode: TDOMNode; out aValue: WideString): Boolean;
class function TryGetStringU(const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
class function TryGetInt (const aNode: TDOMNode; out aValue: Int64): Boolean;
class function TryGetFloat (const aNode: TDOMNode; out aValue: Double): Boolean;
class function TryGetBool (const aNode: TDOMNode; out aValue: Boolean): Boolean;

class function Nodes (const aElement: TDOMElement; const aName: DOMString = ''): IutlNodeEnumerator;
class function PrependNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
class function AppendNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
class procedure PrependText (const aElement: TDOMElement; const aText: DOMString);
class procedure AppendText (const aElement: TDOMElement; const aText: DOMString);
// set value of current node
class function SetString (const aNode: TDOMNode; const aValue: String): TDOMNode; overload;
class function SetString (const aNode: TDOMNode; const aValue: WideString): TDOMNode; overload;
class function SetString (const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode; overload;
class function SetInt (const aNode: TDOMNode; const aValue: Integer): TDOMNode; overload;
class function SetFloat (const aNode: TDOMNode; const aValue: Double): TDOMNode;
class function SetBool (const aNode: TDOMNode; const aValue: Boolean): TDOMNode;

// get value of current node
class function GetString (const aNode: TDOMNode; const aDefault: String): String;
class function GetStringW (const aNode: TDOMNode; const aDefault: WideString): WideString;
class function GetStringU (const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
class function GetInt (const aNode: TDOMNode; const aDefault: Int64): Int64;
class function GetFloat (const aNode: TDOMNode; const aDefault: Double): Double;
class function GetBool (const aNode: TDOMNode; const aDefault: Boolean): Boolean;

// try get value of current node
class function TryGetString (const aNode: TDOMNode; out aValue: String): Boolean;
class function TryGetStringW (const aNode: TDOMNode; out aValue: WideString): Boolean;
class function TryGetStringU (const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
class function TryGetInt (const aNode: TDOMNode; out aValue: Int64): Boolean;
class function TryGetFloat (const aNode: TDOMNode; out aValue: Double): Boolean;
class function TryGetBool (const aNode: TDOMNode; out aValue: Boolean): Boolean;

// set value of attribute
class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: String); overload;
class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: WideString); overload;
class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: UnicodeString); overload;
class procedure SetAttribInt (const aNode: TDOMElement; const aName: DOMString; const aValue: Integer); overload;
class procedure SetAttribFloat (const aNode: TDOMElement; const aName: DOMString; const aValue: Double);
class procedure SetAttribBool (const aNode: TDOMElement; const aName: DOMString; const aValue: Boolean);

// get value of attribute
class function GetAttribString (const aNode: TDOMElement; const aName: DOMString; const aDefault: String = ''): String;
class function GetAttribStringW (const aNode: TDOMElement; const aName: DOMString; const aDefault: WideString = ''): WideString;
class function GetAttribStringU (const aNode: TDOMElement; const aName: DOMString; const aDefault: UnicodeString = ''): UnicodeString;
class function GetAttribInt (const aNode: TDOMElement; const aName: DOMString; const aDefault: Int64 = 0): Int64;
class function GetAttribFloat (const aNode: TDOMElement; const aName: DOMString; const aDefault: Double = 0): Double;
class function GetAttribBool (const aNode: TDOMElement; const aName: DOMString; const aDefault: Boolean = false): Boolean;

// get value of attribute
class function TryGetAttribString (const aNode: TDOMElement; const aName: DOMString; out aValue: String): Boolean;
class function TryGetAttribStringW (const aNode: TDOMElement; const aName: DOMString; out aValue: WideString): Boolean;
class function TryGetAttribStringU (const aNode: TDOMElement; const aName: DOMString; out aValue: UnicodeString): Boolean;
class function TryGetAttribInt (const aNode: TDOMElement; const aName: DOMString; out aValue: Int64): Boolean;
class function TryGetAttribFloat (const aNode: TDOMElement; const aName: DOMString; out aValue: Double): Boolean;
class function TryGetAttribBool (const aNode: TDOMElement; const aName: DOMString; out aValue: Boolean): Boolean;

// node operations
class function Nodes (const aElement: TDOMElement; const aName: DOMString = ''): IutlNodeEnumerator;
class function Node (const aElement: TDOMElement; const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
class function PrependNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
class function AppendNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
class procedure PrependText (const aElement: TDOMElement; const aText: DOMString);
class procedure AppendText (const aElement: TDOMElement; const aText: DOMString);
end;

implementation
@@ -325,124 +372,148 @@ begin
result := TutlXmlHelper.GetBool(fElement, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetString(out aValue: String): Boolean;
begin
result := TutlXmlHelper.TryGetString(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetStringW(out aValue: WideString): Boolean;
begin
result := TutlXmlHelper.TryGetStringW(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetStringU(out aValue: UnicodeString): Boolean;
begin
result := TutlXmlHelper.TryGetStringU(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetInt(out aValue: Int64): Boolean;
begin
result := TutlXmlHelper.TryGetInt(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetFloat(out aValue: Double): Boolean;
begin
result := TutlXmlHelper.TryGetFloat(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetBool(out aValue: Boolean): Boolean;
begin
result := TutlXmlHelper.TryGetBool(fElement, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: String);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetString(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribString(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: WideString);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetString(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribString(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: UnicodeString);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetString(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribString(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribInt(const aName: DOMString; const aValue: Integer);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetInt(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribInt(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribFloat(const aName: DOMString; const aValue: Double);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetFloat(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribFloat(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlXmlHelper.SetAttribBool(const aName: DOMString; const aValue: Boolean);
begin
fElement.SetAttributeNode(TutlXmlHelper.SetBool(
fElement.OwnerDocument.CreateAttribute(aName),
aValue) as TDOMAttr);
TutlXmlHelper.SetAttribBool(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribString(const aName: DOMString; const aDefault: String): String;
begin
result := TutlXmlHelper.GetString(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribString(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribStringW(const aName: DOMString; const aDefault: WideString): WideString;
begin
result := TutlXmlHelper.GetStringW(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribStringW(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribStringU(const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
begin
result := TutlXmlHelper.GetStringU(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribStringU(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribInt(const aName: DOMString; const aDefault: Int64): Int64;
begin
result := TutlXmlHelper.GetInt(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribInt(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribFloat(const aName: DOMString; const aDefault: Double): Double;
begin
result := TutlXmlHelper.GetFloat(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribFloat(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.GetAttribBool(const aName: DOMString; const aDefault: Boolean): Boolean;
begin
result := TutlXmlHelper.GetBool(fElement.Attributes.GetNamedItem(aName), aDefault);
result := TutlXmlHelper.GetAttribBool(fElement, aName, aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribString(const aName: DOMString; out aValue: String): Boolean;
begin
result := TutlXmlHelper.TryGetString(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribString(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribStringW(const aName: DOMString; out aValue: WideString): Boolean;
begin
result := TutlXmlHelper.TryGetStringW(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribStringW(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribStringU(const aName: DOMString; out aValue: UnicodeString): Boolean;
begin
result := TutlXmlHelper.TryGetStringU(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribStringU(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribInt(const aName: DOMString; out aValue: Int64): Boolean;
begin
result := TutlXmlHelper.TryGetInt(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribInt(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribFloat(const aName: DOMString; out aValue: Double): Boolean;
begin
result := TutlXmlHelper.TryGetFloat(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribFloat(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.TryGetAttribBool(const aName: DOMString; out aValue: Boolean): Boolean;
begin
result := TutlXmlHelper.TryGetBool(fElement.Attributes.GetNamedItem(aName), aValue);
result := TutlXmlHelper.TryGetAttribBool(fElement, aName, aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -451,6 +522,12 @@ begin
result := TutlXmlHelper.Nodes(fElement, aName);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.Node(const aName: DOMString; const aCanCreate: Boolean): TDOMElement;
begin
result := TutlXmlHelper.Node(fElement, aName, aCanCreate);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlXmlHelper.PrependNode(const aName: DOMString): TDOMElement;
begin
@@ -649,12 +726,158 @@ begin
end;
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: String);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: WideString);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: UnicodeString);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribInt(const aNode: TDOMElement; const aName: DOMString; const aValue: Integer);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetInt(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribFloat(const aNode: TDOMElement; const aName: DOMString; const aValue: Double);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetFloat(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class procedure TutlXmlHelper.SetAttribBool(const aNode: TDOMElement; const aName: DOMString; const aValue: Boolean);
begin
aNode.SetAttributeNode(TutlXmlHelper.SetBool(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribString(const aNode: TDOMElement; const aName: DOMString; const aDefault: String): String;
begin
result := TutlXmlHelper.GetString(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribStringW(const aNode: TDOMElement; const aName: DOMString; const aDefault: WideString): WideString;
begin
result := TutlXmlHelper.GetStringW(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribStringU(const aNode: TDOMElement; const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
begin
result := TutlXmlHelper.GetStringU(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribInt(const aNode: TDOMElement; const aName: DOMString; const aDefault: Int64): Int64;
begin
result := TutlXmlHelper.GetInt(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribFloat(const aNode: TDOMElement; const aName: DOMString; const aDefault: Double): Double;
begin
result := TutlXmlHelper.GetFloat(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.GetAttribBool(const aNode: TDOMElement; const aName: DOMString; const aDefault: Boolean): Boolean;
begin
result := TutlXmlHelper.GetBool(aNode.Attributes.GetNamedItem(aName), aDefault);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribString(const aNode: TDOMElement; const aName: DOMString; out aValue: String): Boolean;
begin
result := TutlXmlHelper.TryGetString(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribStringW(const aNode: TDOMElement; const aName: DOMString; out aValue: WideString): Boolean;
begin
result := TutlXmlHelper.TryGetStringW(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribStringU(const aNode: TDOMElement; const aName: DOMString; out aValue: UnicodeString): Boolean;
begin
result := TutlXmlHelper.TryGetStringU(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribInt(const aNode: TDOMElement; const aName: DOMString; out aValue: Int64): Boolean;
begin
result := TutlXmlHelper.TryGetInt(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribFloat(const aNode: TDOMElement; const aName: DOMString; out aValue: Double): Boolean;
begin
result := TutlXmlHelper.TryGetFloat(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.TryGetAttribBool(const aNode: TDOMElement; const aName: DOMString; out aValue: Boolean): Boolean;
begin
result := TutlXmlHelper.TryGetBool(aNode.Attributes.GetNamedItem(aName), aValue);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.Nodes(const aElement: TDOMElement; const aName: DOMString): IutlNodeEnumerator;
begin
result := TutlNodeEnumerator.Create(aElement, aName);
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.Node(const aElement: TDOMElement; const aName: DOMString; const aCanCreate: Boolean): TDOMElement;
var
sl: TStringList;
s: String;
b: Boolean;
i, c: Integer;
begin
sl := TStringList.Create;
try
sl.Delimiter := '.';
sl.DelimitedText := String(aName);
result := aElement;
for s in sl do begin
if (s = '') then
continue;
if not Assigned(result) then
exit;
b := false;
c := result.ChildNodes.Count;
for i := 0 to c-1 do begin
if (result.ChildNodes[i].NodeName = DOMString(s)) then begin
result := TDOMElement(result.ChildNodes[i]);
b := true;
break;
end;
end;
if not b then begin
if aCanCreate
then result := AppendNode(result, DOMString(s))
else result := nil;
end;
end;
finally
FreeAndNil(sl);
end;
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TutlXmlHelper.PrependNode(const aElement: TDOMElement; const aName: DOMString): TDOMElement;
begin


Loading…
Cancel
Save