Compare commits

...

3 Commits

Author SHA1 Message Date
csh 16452c8362 improvement: 单位转换的调整 2025-08-06 18:16:15 +08:00
csh 9062457251 update README 2025-08-06 18:14:29 +08:00
csh 7a65e50157 feat: 支持clone方法
feat: 支持反序列化的缓存,第二次反序列化不会执行操作
feat: openxmlelement类支持Enable属性来控制节点是否生成
2025-08-06 18:14:09 +08:00
16 changed files with 21635 additions and 6952 deletions

View File

@ -146,6 +146,85 @@ ppr1.Jc.Val; // 得到"left"
ppr1.WordWrap.Val; // ppr1不存在wordWrap但是ppr2存在wordWrap所以回落到ppr2的wordWrap获取到"1"
```
### Copy
`copy`方法支持将其他的类属性和子节点的属性复制过来,注意:复数的类无法进行复制,因为不确定怎么进行复制
```xml
// pPr1
<w:pPr>
<w:jc w:val="left" />
<w:spacing w:after="160" />
</w:pPr>
// pPr2
<w:pPr>
<w:jc w:val="right" />
<w:wordWrap w:val="1" />
</w:pPr>
```
```go
// 假设要将ppr2的属性复制到ppr1
ppr1.Copy(ppr2);
```
```xml
// 复制完毕后ppr1 xml如下
// 因为ppr2没有w:spacing所以保留ppr1的w:spacing
<w:pPr>
<w:jc w:val="right" />
<w:wordWrap w:val="1" />
<w:spacing w:after="160" />
</w:pPr>
```
```xml
// 这样是不能复制的w:r是复数
<w:p>
<w:r w:rsidR="00CC4888">
<w:t>test</w:t>
</w:r>
<w:r w:rsidR="00CD1015">
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
<w:t></w:t>
</w:r>
</w:p>
获取r并不是p.r进行获取而是p.Rs();
```
### Clone
`Clone`方法是克隆出一个一样的对象出来,但是`Parent`是`nil`
```xml
<w:p>
<w:pPr>
<w:jc w:val="right" />
<w:wordWrap w:val="1" />
<w:spacing w:after="160" />
</w:pPr>
<w:r w:rsidR="00CC4888">
<w:t>test</w:t>
</w:r>
<w:r w:rsidR="00CD1015">
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
<w:t></w:t>
</w:r>
</w:p>
```
```go
new_p := p.Clone(); // 与p的xml一致
echo new_p.Parent; // nil
document.InsertAfter(new_p, p); // 插入一样的段落在p之后此时会自动设置new_p.Parent := document
```
## Unit 单元
- `DocxML`包含 `docx`文件独有的 xml 节点对象,一般 xml 的命名空间是 `w`,如 `w:p`

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,23 +8,25 @@ public
function Create(_parent: tslobj; _prefix: string; _local_name: string);overload;
function Init();override;
function Copy(_obj: SldLayoutId);override;
function ConvertToPoint();override;
public
// attributes property
property Id read ReadXmlAttrId write WriteXmlAttrId;
property Id read ReadXmlAttrId write WriteXmlAttrId;
property Id read ReadXmlAttrId write WriteXmlAttrId;
function ReadXmlAttrId();
function WriteXmlAttrId(_value);
function ReadXmlAttrId();
function WriteXmlAttrId(_value);
function ReadXmlAttrId();
function WriteXmlAttrId(_value);
property IdN read ReadXmlAttrIdN write WriteXmlAttrIdN;
property RId read ReadXmlAttrRId write WriteXmlAttrRId;
function ReadXmlAttrId(_ns: string);
function WriteXmlAttrId(_p1: any; _p2: any);
function ReadXmlAttrIdN();
function WriteXmlAttrIdN(_value: any);
function ReadXmlAttrRId();
function WriteXmlAttrRId(_value: any);
public
// Attributes
XmlAttrId: OpenXmlAttribute;
XmlAttrId: OpenXmlAttribute;
XmlAttrId: OpenXmlAttribute;
XmlAttrIdN: OpenXmlAttribute;
XmlAttrRId: OpenXmlAttribute;
end;
@ -37,13 +39,13 @@ end;
function SldLayoutId.Create(_node: XmlNode);overload;
begin
class(OpenXmlCompositeElement).Create(_node: XmlNode);
inherited Create(_node);
end;
function SldLayoutId.Create(_parent: tslobj; _prefix: string; _local_name: string);overload;
begin
setsysparam(pn_calcctrlword(), getsysparam(pn_calcctrlword()) .| 0x200);
class(OpenXmlCompositeElement).Create(_parent, _prefix, _local_name);
inherited Create(_parent, _prefix, _local_name);
end;
function SldLayoutId.Init();override;
@ -52,8 +54,8 @@ begin
attributes_ := array();
attributes_pf_ := array(
pre + "id": makeweakref(thisFunction(WriteXmlAttrId)),
"id": makeweakref(thisFunction(WriteXmlAttrId)),
"r:id": makeweakref(thisFunction(WriteXmlAttrId)),
"id": makeweakref(thisFunction(WriteXmlAttrIdN)),
"r:id": makeweakref(thisFunction(WriteXmlAttrRId)),
);
sorted_child_ := array(
);
@ -67,56 +69,72 @@ begin
class(OpenXmlCompositeElement).Copy(_obj);
if not ifnil(_obj.Id) then
{self.}Id := _obj.Id;
if not ifnil(_obj.Id) then
{self.}Id := _obj.Id;
if not ifnil(_obj.Id) then
{self.}Id := _obj.Id;
if not ifnil(_obj.IdN) then
{self.}IdN := _obj.IdN;
if not ifnil(_obj.RId) then
{self.}RId := _obj.RId;
tslassigning := tslassigning_backup;
end;
function SldLayoutId.ReadXmlAttrId();
function SldLayoutId.ConvertToPoint();override;
begin
return {self.}XmlAttrId.Value;
end;
function SldLayoutId.WriteXmlAttrId(_value);
function SldLayoutId.ReadXmlAttrId(_ns: string);
begin
if _ns = "" then
return {self.}ReadXmlAttrIdN();
if _ns = "r" then
return {self.}ReadXmlAttrRId();
return ifnil({self.}XmlAttrId.Value) ? fallback_.XmlAttrId.Value : {self.}XmlAttrId.Value;
end;
function SldLayoutId.WriteXmlAttrId(_p1: any; _p2: any);
begin
if realparamcount = 2 then
begin
if _p1 = "" then
return {self.}WriteXmlAttrIdN(_p2);
if _p1 = "r" then
return {self.}WriteXmlAttrRId(_p2);
end
if ifnil({self.}XmlAttrId) then
begin
{self.}XmlAttrId := new OpenXmlAttribute({self.}Prefix, "id", nil);
attributes_[length(attributes_)] := {self.}XmlAttrId;
attributes_[{self.}Prefix ? {self.}Prefix + ":" + "id" : "id"] := {self.}XmlAttrId;
end
{self.}XmlAttrId.Value := _value;
{self.}XmlAttrId.Value := realparamcount = 1 ? _p1 : _p2;
end;
function SldLayoutId.ReadXmlAttrId();
function SldLayoutId.ReadXmlAttrIdN();
begin
return {self.}XmlAttrId.Value;
return ifnil({self.}XmlAttrIdN.Value) ? fallback_.XmlAttrIdN.Value : {self.}XmlAttrIdN.Value;
end;
function SldLayoutId.WriteXmlAttrId(_value);
function SldLayoutId.WriteXmlAttrIdN(_value: any);
begin
if ifnil({self.}XmlAttrId) then
if ifnil({self.}XmlAttrIdN) then
begin
{self.}XmlAttrId := new OpenXmlAttribute("", "id", nil);
attributes_[length(attributes_)] := {self.}XmlAttrId;
{self.}XmlAttrIdN := new OpenXmlAttribute("", "id", nil);
attributes_["id"] := {self.}XmlAttrIdN;
end
{self.}XmlAttrId.Value := _value;
{self.}XmlAttrIdN.Value := _value;
end;
function SldLayoutId.ReadXmlAttrId();
function SldLayoutId.ReadXmlAttrRId();
begin
return {self.}XmlAttrId.Value;
return ifnil({self.}XmlAttrRId.Value) ? fallback_.XmlAttrRId.Value : {self.}XmlAttrRId.Value;
end;
function SldLayoutId.WriteXmlAttrId(_value);
function SldLayoutId.WriteXmlAttrRId(_value: any);
begin
if ifnil({self.}XmlAttrId) then
if ifnil({self.}XmlAttrRId) then
begin
{self.}XmlAttrId := new OpenXmlAttribute("r", "id", nil);
attributes_[length(attributes_)] := {self.}XmlAttrId;
{self.}XmlAttrRId := new OpenXmlAttribute("r", "id", nil);
attributes_["r:id"] := {self.}XmlAttrRId;
end
{self.}XmlAttrId.Value := _value;
{self.}XmlAttrRId.Value := _value;
end;
end.

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ uses SharedML, TSSafeUnitConverter;
type MathPrUnitDecorator = class(MathPr)
public
function Create(_obj: MathPr);
function create(_obj: MathPr);
function GetObject();
function Convert();
private
@ -13,7 +13,7 @@ end;
type OMathParaUnitDecorator = class(OMathPara)
public
function Create(_obj: OMathPara);
function create(_obj: OMathPara);
function GetObject();
function Convert();
private
@ -22,7 +22,7 @@ end;
type OMathParaPrUnitDecorator = class(OMathParaPr)
public
function Create(_obj: OMathParaPr);
function create(_obj: OMathParaPr);
function GetObject();
function Convert();
private
@ -31,7 +31,7 @@ end;
type PureMValUnitDecorator = class(PureMVal)
public
function Create(_obj: PureMVal);
function create(_obj: PureMVal);
function GetObject();
function Convert();
private
@ -40,7 +40,7 @@ end;
type OMathUnitDecorator = class(OMath)
public
function Create(_obj: OMath);
function create(_obj: OMath);
function GetObject();
function Convert();
private
@ -49,7 +49,7 @@ end;
type RUnitDecorator = class(R)
public
function Create(_obj: R);
function create(_obj: R);
function GetObject();
function Convert();
private
@ -58,7 +58,7 @@ end;
type RPrUnitDecorator = class(RPr)
public
function Create(_obj: RPr);
function create(_obj: RPr);
function GetObject();
function Convert();
private
@ -67,7 +67,7 @@ end;
type TUnitDecorator = class(T)
public
function Create(_obj: T);
function create(_obj: T);
function GetObject();
function Convert();
private
@ -76,7 +76,7 @@ end;
type DUnitDecorator = class(D)
public
function Create(_obj: D);
function create(_obj: D);
function GetObject();
function Convert();
private
@ -85,7 +85,7 @@ end;
type DPrUnitDecorator = class(DPr)
public
function Create(_obj: DPr);
function create(_obj: DPr);
function GetObject();
function Convert();
private
@ -94,7 +94,7 @@ end;
type CtrlPrUnitDecorator = class(CtrlPr)
public
function Create(_obj: CtrlPr);
function create(_obj: CtrlPr);
function GetObject();
function Convert();
private
@ -103,7 +103,7 @@ end;
type SSupUnitDecorator = class(SSup)
public
function Create(_obj: SSup);
function create(_obj: SSup);
function GetObject();
function Convert();
private
@ -112,7 +112,7 @@ end;
type SSupPrUnitDecorator = class(SSupPr)
public
function Create(_obj: SSupPr);
function create(_obj: SSupPr);
function GetObject();
function Convert();
private
@ -121,7 +121,7 @@ end;
type FUnitDecorator = class(F)
public
function Create(_obj: F);
function create(_obj: F);
function GetObject();
function Convert();
private
@ -130,7 +130,7 @@ end;
type FPrUnitDecorator = class(FPr)
public
function Create(_obj: FPr);
function create(_obj: FPr);
function GetObject();
function Convert();
private
@ -139,7 +139,7 @@ end;
type RadUnitDecorator = class(Rad)
public
function Create(_obj: Rad);
function create(_obj: Rad);
function GetObject();
function Convert();
private
@ -148,7 +148,7 @@ end;
type RadPrUnitDecorator = class(RadPr)
public
function Create(_obj: RadPr);
function create(_obj: RadPr);
function GetObject();
function Convert();
private
@ -157,7 +157,7 @@ end;
type SSubUnitDecorator = class(SSub)
public
function Create(_obj: SSub);
function create(_obj: SSub);
function GetObject();
function Convert();
private
@ -166,7 +166,7 @@ end;
type SSubPrUnitDecorator = class(SSubPr)
public
function Create(_obj: SSubPr);
function create(_obj: SSubPr);
function GetObject();
function Convert();
private
@ -175,7 +175,7 @@ end;
type NaryUnitDecorator = class(Nary)
public
function Create(_obj: Nary);
function create(_obj: Nary);
function GetObject();
function Convert();
private
@ -184,7 +184,7 @@ end;
type NaryPrUnitDecorator = class(NaryPr)
public
function Create(_obj: NaryPr);
function create(_obj: NaryPr);
function GetObject();
function Convert();
private
@ -193,7 +193,7 @@ end;
type FuncUnitDecorator = class(Func)
public
function Create(_obj: Func);
function create(_obj: Func);
function GetObject();
function Convert();
private
@ -202,7 +202,7 @@ end;
type FNameUnitDecorator = class(FName)
public
function Create(_obj: FName);
function create(_obj: FName);
function GetObject();
function Convert();
private
@ -211,7 +211,7 @@ end;
type FuncPrUnitDecorator = class(FuncPr)
public
function Create(_obj: FuncPr);
function create(_obj: FuncPr);
function GetObject();
function Convert();
private
@ -220,7 +220,7 @@ end;
type CorePropertiesUnitDecorator = class(CoreProperties)
public
function Create(_obj: CoreProperties);
function create(_obj: CoreProperties);
function GetObject();
function Convert();
private
@ -229,7 +229,7 @@ end;
type CreatedUnitDecorator = class(Created)
public
function Create(_obj: Created);
function create(_obj: Created);
function GetObject();
function Convert();
private
@ -238,7 +238,7 @@ end;
type ModifiedUnitDecorator = class(Modified)
public
function Create(_obj: Modified);
function create(_obj: Modified);
function GetObject();
function Convert();
private
@ -247,7 +247,7 @@ end;
type RelationshipsUnitDecorator = class(Relationships)
public
function Create(_obj: Relationships);
function create(_obj: Relationships);
function GetObject();
function Convert();
private
@ -256,7 +256,7 @@ end;
type RelationshipUnitDecorator = class(Relationship)
public
function Create(_obj: Relationship);
function create(_obj: Relationship);
function GetObject();
function Convert();
private
@ -265,7 +265,7 @@ end;
type TypesUnitDecorator = class(Types)
public
function Create(_obj: Types);
function create(_obj: Types);
function GetObject();
function Convert();
private
@ -274,7 +274,7 @@ end;
type DefaultUnitDecorator = class(Default)
public
function Create(_obj: Default);
function create(_obj: Default);
function GetObject();
function Convert();
private
@ -283,7 +283,7 @@ end;
type _OverrideUnitDecorator = class(_Override)
public
function Create(_obj: _Override);
function create(_obj: _Override);
function GetObject();
function Convert();
private
@ -292,7 +292,7 @@ end;
type NumUnitDecorator = class(Num)
public
function Create(_obj: Num);
function create(_obj: Num);
function GetObject();
function Convert();
private
@ -301,7 +301,7 @@ end;
type DegUnitDecorator = class(Deg)
public
function Create(_obj: Deg);
function create(_obj: Deg);
function GetObject();
function Convert();
private
@ -310,7 +310,7 @@ end;
type EUnitDecorator = class(E)
public
function Create(_obj: E);
function create(_obj: E);
function GetObject();
function Convert();
private
@ -319,7 +319,7 @@ end;
type SupUnitDecorator = class(Sup)
public
function Create(_obj: Sup);
function create(_obj: Sup);
function GetObject();
function Convert();
private
@ -328,7 +328,7 @@ end;
type DenUnitDecorator = class(Den)
public
function Create(_obj: Den);
function create(_obj: Den);
function GetObject();
function Convert();
private
@ -337,7 +337,7 @@ end;
type SubUnitDecorator = class(Sub)
public
function Create(_obj: Sub);
function create(_obj: Sub);
function GetObject();
function Convert();
private
@ -346,9 +346,9 @@ end;
implementation
function MathPrUnitDecorator.Create(_obj: MathPr);
function MathPrUnitDecorator.create(_obj: MathPr);
begin
class(MathPr).Create();
class(MathPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -387,9 +387,9 @@ begin
tslassigning := tslassigning_backup;
end;
function OMathParaUnitDecorator.Create(_obj: OMathPara);
function OMathParaUnitDecorator.create(_obj: OMathPara);
begin
class(OMathPara).Create();
class(OMathPara).create();
object_ := _obj;
{self.}Convert();
end;
@ -410,9 +410,9 @@ begin
tslassigning := tslassigning_backup;
end;
function OMathParaPrUnitDecorator.Create(_obj: OMathParaPr);
function OMathParaPrUnitDecorator.create(_obj: OMathParaPr);
begin
class(OMathParaPr).Create();
class(OMathParaPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -431,9 +431,9 @@ begin
tslassigning := tslassigning_backup;
end;
function PureMValUnitDecorator.Create(_obj: PureMVal);
function PureMValUnitDecorator.create(_obj: PureMVal);
begin
class(PureMVal).Create();
class(PureMVal).create();
object_ := _obj;
{self.}Convert();
end;
@ -452,9 +452,9 @@ begin
tslassigning := tslassigning_backup;
end;
function OMathUnitDecorator.Create(_obj: OMath);
function OMathUnitDecorator.create(_obj: OMath);
begin
class(OMath).Create();
class(OMath).create();
object_ := _obj;
{self.}Convert();
end;
@ -495,9 +495,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RUnitDecorator.Create(_obj: R);
function RUnitDecorator.create(_obj: R);
begin
class(R).Create();
class(R).create();
object_ := _obj;
{self.}Convert();
end;
@ -522,9 +522,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RPrUnitDecorator.Create(_obj: RPr);
function RPrUnitDecorator.create(_obj: RPr);
begin
class(RPr).Create();
class(RPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -543,9 +543,9 @@ begin
tslassigning := tslassigning_backup;
end;
function TUnitDecorator.Create(_obj: T);
function TUnitDecorator.create(_obj: T);
begin
class(T).Create();
class(T).create();
object_ := _obj;
{self.}Convert();
end;
@ -564,9 +564,9 @@ begin
tslassigning := tslassigning_backup;
end;
function DUnitDecorator.Create(_obj: D);
function DUnitDecorator.create(_obj: D);
begin
class(D).Create();
class(D).create();
object_ := _obj;
{self.}Convert();
end;
@ -587,9 +587,9 @@ begin
tslassigning := tslassigning_backup;
end;
function DPrUnitDecorator.Create(_obj: DPr);
function DPrUnitDecorator.create(_obj: DPr);
begin
class(DPr).Create();
class(DPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -620,9 +620,9 @@ begin
tslassigning := tslassigning_backup;
end;
function CtrlPrUnitDecorator.Create(_obj: CtrlPr);
function CtrlPrUnitDecorator.create(_obj: CtrlPr);
begin
class(CtrlPr).Create();
class(CtrlPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -643,9 +643,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SSupUnitDecorator.Create(_obj: SSup);
function SSupUnitDecorator.create(_obj: SSup);
begin
class(SSup).Create();
class(SSup).create();
object_ := _obj;
{self.}Convert();
end;
@ -668,9 +668,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SSupPrUnitDecorator.Create(_obj: SSupPr);
function SSupPrUnitDecorator.create(_obj: SSupPr);
begin
class(SSupPr).Create();
class(SSupPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -689,9 +689,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FUnitDecorator.Create(_obj: F);
function FUnitDecorator.create(_obj: F);
begin
class(F).Create();
class(F).create();
object_ := _obj;
{self.}Convert();
end;
@ -714,9 +714,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FPrUnitDecorator.Create(_obj: FPr);
function FPrUnitDecorator.create(_obj: FPr);
begin
class(FPr).Create();
class(FPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -737,9 +737,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RadUnitDecorator.Create(_obj: Rad);
function RadUnitDecorator.create(_obj: Rad);
begin
class(Rad).Create();
class(Rad).create();
object_ := _obj;
{self.}Convert();
end;
@ -762,9 +762,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RadPrUnitDecorator.Create(_obj: RadPr);
function RadPrUnitDecorator.create(_obj: RadPr);
begin
class(RadPr).Create();
class(RadPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -785,9 +785,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SSubUnitDecorator.Create(_obj: SSub);
function SSubUnitDecorator.create(_obj: SSub);
begin
class(SSub).Create();
class(SSub).create();
object_ := _obj;
{self.}Convert();
end;
@ -810,9 +810,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SSubPrUnitDecorator.Create(_obj: SSubPr);
function SSubPrUnitDecorator.create(_obj: SSubPr);
begin
class(SSubPr).Create();
class(SSubPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -831,9 +831,9 @@ begin
tslassigning := tslassigning_backup;
end;
function NaryUnitDecorator.Create(_obj: Nary);
function NaryUnitDecorator.create(_obj: Nary);
begin
class(Nary).Create();
class(Nary).create();
object_ := _obj;
{self.}Convert();
end;
@ -858,9 +858,9 @@ begin
tslassigning := tslassigning_backup;
end;
function NaryPrUnitDecorator.Create(_obj: NaryPr);
function NaryPrUnitDecorator.create(_obj: NaryPr);
begin
class(NaryPr).Create();
class(NaryPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -889,9 +889,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FuncUnitDecorator.Create(_obj: Func);
function FuncUnitDecorator.create(_obj: Func);
begin
class(Func).Create();
class(Func).create();
object_ := _obj;
{self.}Convert();
end;
@ -914,9 +914,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FNameUnitDecorator.Create(_obj: FName);
function FNameUnitDecorator.create(_obj: FName);
begin
class(FName).Create();
class(FName).create();
object_ := _obj;
{self.}Convert();
end;
@ -936,9 +936,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FuncPrUnitDecorator.Create(_obj: FuncPr);
function FuncPrUnitDecorator.create(_obj: FuncPr);
begin
class(FuncPr).Create();
class(FuncPr).create();
object_ := _obj;
{self.}Convert();
end;
@ -957,9 +957,9 @@ begin
tslassigning := tslassigning_backup;
end;
function CorePropertiesUnitDecorator.Create(_obj: CoreProperties);
function CorePropertiesUnitDecorator.create(_obj: CoreProperties);
begin
class(CoreProperties).Create();
class(CoreProperties).create();
object_ := _obj;
{self.}Convert();
end;
@ -988,9 +988,9 @@ begin
tslassigning := tslassigning_backup;
end;
function CreatedUnitDecorator.Create(_obj: Created);
function CreatedUnitDecorator.create(_obj: Created);
begin
class(Created).Create();
class(Created).create();
object_ := _obj;
{self.}Convert();
end;
@ -1009,9 +1009,9 @@ begin
tslassigning := tslassigning_backup;
end;
function ModifiedUnitDecorator.Create(_obj: Modified);
function ModifiedUnitDecorator.create(_obj: Modified);
begin
class(Modified).Create();
class(Modified).create();
object_ := _obj;
{self.}Convert();
end;
@ -1030,9 +1030,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RelationshipsUnitDecorator.Create(_obj: Relationships);
function RelationshipsUnitDecorator.create(_obj: Relationships);
begin
class(Relationships).Create();
class(Relationships).create();
object_ := _obj;
{self.}Convert();
end;
@ -1052,9 +1052,9 @@ begin
tslassigning := tslassigning_backup;
end;
function RelationshipUnitDecorator.Create(_obj: Relationship);
function RelationshipUnitDecorator.create(_obj: Relationship);
begin
class(Relationship).Create();
class(Relationship).create();
object_ := _obj;
{self.}Convert();
end;
@ -1077,9 +1077,9 @@ begin
tslassigning := tslassigning_backup;
end;
function TypesUnitDecorator.Create(_obj: Types);
function TypesUnitDecorator.create(_obj: Types);
begin
class(Types).Create();
class(Types).create();
object_ := _obj;
{self.}Convert();
end;
@ -1102,9 +1102,9 @@ begin
tslassigning := tslassigning_backup;
end;
function DefaultUnitDecorator.Create(_obj: Default);
function DefaultUnitDecorator.create(_obj: Default);
begin
class(Default).Create();
class(Default).create();
object_ := _obj;
{self.}Convert();
end;
@ -1125,9 +1125,9 @@ begin
tslassigning := tslassigning_backup;
end;
function _OverrideUnitDecorator.Create(_obj: _Override);
function _OverrideUnitDecorator.create(_obj: _Override);
begin
class(_Override).Create();
class(_Override).create();
object_ := _obj;
{self.}Convert();
end;
@ -1148,9 +1148,9 @@ begin
tslassigning := tslassigning_backup;
end;
function NumUnitDecorator.Create(_obj: Num);
function NumUnitDecorator.create(_obj: Num);
begin
class(Num).Create();
class(Num).create();
object_ := _obj;
{self.}Convert();
end;
@ -1193,9 +1193,9 @@ begin
tslassigning := tslassigning_backup;
end;
function DegUnitDecorator.Create(_obj: Deg);
function DegUnitDecorator.create(_obj: Deg);
begin
class(Deg).Create();
class(Deg).create();
object_ := _obj;
{self.}Convert();
end;
@ -1238,9 +1238,9 @@ begin
tslassigning := tslassigning_backup;
end;
function EUnitDecorator.Create(_obj: E);
function EUnitDecorator.create(_obj: E);
begin
class(E).Create();
class(E).create();
object_ := _obj;
{self.}Convert();
end;
@ -1283,9 +1283,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SupUnitDecorator.Create(_obj: Sup);
function SupUnitDecorator.create(_obj: Sup);
begin
class(Sup).Create();
class(Sup).create();
object_ := _obj;
{self.}Convert();
end;
@ -1328,9 +1328,9 @@ begin
tslassigning := tslassigning_backup;
end;
function DenUnitDecorator.Create(_obj: Den);
function DenUnitDecorator.create(_obj: Den);
begin
class(Den).Create();
class(Den).create();
object_ := _obj;
{self.}Convert();
end;
@ -1373,9 +1373,9 @@ begin
tslassigning := tslassigning_backup;
end;
function SubUnitDecorator.Create(_obj: Sub);
function SubUnitDecorator.create(_obj: Sub);
begin
class(Sub).Create();
class(Sub).create();
object_ := _obj;
{self.}Convert();
end;

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ uses VML, TSSafeUnitConverter;
type ShapetypeUnitDecorator = class(Shapetype)
public
function Create(_obj: Shapetype);
function create(_obj: Shapetype);
function GetObject();
function Convert();
private
@ -13,7 +13,7 @@ end;
type FormulasUnitDecorator = class(Formulas)
public
function Create(_obj: Formulas);
function create(_obj: Formulas);
function GetObject();
function Convert();
private
@ -22,7 +22,7 @@ end;
type LockUnitDecorator = class(Lock)
public
function Create(_obj: Lock);
function create(_obj: Lock);
function GetObject();
function Convert();
private
@ -31,7 +31,7 @@ end;
type FUnitDecorator = class(F)
public
function Create(_obj: F);
function create(_obj: F);
function GetObject();
function Convert();
private
@ -40,7 +40,7 @@ end;
type StrokeUnitDecorator = class(Stroke)
public
function Create(_obj: Stroke);
function create(_obj: Stroke);
function GetObject();
function Convert();
private
@ -49,7 +49,7 @@ end;
type PathUnitDecorator = class(Path)
public
function Create(_obj: Path);
function create(_obj: Path);
function GetObject();
function Convert();
private
@ -58,7 +58,7 @@ end;
type TextpathUnitDecorator = class(Textpath)
public
function Create(_obj: Textpath);
function create(_obj: Textpath);
function GetObject();
function Convert();
private
@ -67,7 +67,7 @@ end;
type HandlesUnitDecorator = class(Handles)
public
function Create(_obj: Handles);
function create(_obj: Handles);
function GetObject();
function Convert();
private
@ -76,7 +76,7 @@ end;
type HUnitDecorator = class(H)
public
function Create(_obj: H);
function create(_obj: H);
function GetObject();
function Convert();
private
@ -85,7 +85,7 @@ end;
type ShapeUnitDecorator = class(Shape)
public
function Create(_obj: Shape);
function create(_obj: Shape);
function GetObject();
function Convert();
private
@ -94,7 +94,7 @@ end;
type WrapUnitDecorator = class(Wrap)
public
function Create(_obj: Wrap);
function create(_obj: Wrap);
function GetObject();
function Convert();
private
@ -103,7 +103,7 @@ end;
type FillUnitDecorator = class(Fill)
public
function Create(_obj: Fill);
function create(_obj: Fill);
function GetObject();
function Convert();
private
@ -112,7 +112,7 @@ end;
type ImagedataUnitDecorator = class(Imagedata)
public
function Create(_obj: Imagedata);
function create(_obj: Imagedata);
function GetObject();
function Convert();
private
@ -121,7 +121,7 @@ end;
type TextboxUnitDecorator = class(Textbox)
public
function Create(_obj: Textbox);
function create(_obj: Textbox);
function GetObject();
function Convert();
private
@ -130,7 +130,7 @@ end;
type OLEObjectUnitDecorator = class(OLEObject)
public
function Create(_obj: OLEObject);
function create(_obj: OLEObject);
function GetObject();
function Convert();
private
@ -139,9 +139,9 @@ end;
implementation
function ShapetypeUnitDecorator.Create(_obj: Shapetype);
function ShapetypeUnitDecorator.create(_obj: Shapetype);
begin
class(Shapetype).Create();
class(Shapetype).create();
object_ := _obj;
{self.}Convert();
end;
@ -167,8 +167,8 @@ begin
{self.}Adj := object_.XmlAttrAdj.Value;
if not ifnil(object_.XmlAttrPreferrelative) then
{self.}Preferrelative := object_.XmlAttrPreferrelative.Value;
if not ifnil(object_.XmlAttrPath) then
{self.}Path := object_.XmlAttrPath.Value;
if not ifnil(object_.XmlAttrAttrPath) then
{self.}AttrPath := object_.XmlAttrAttrPath.Value;
if not ifnil(object_.XmlAttrFilled) then
{self.}Filled := object_.XmlAttrFilled.Value;
if not ifnil(object_.XmlAttrStroked) then
@ -188,9 +188,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FormulasUnitDecorator.Create(_obj: Formulas);
function FormulasUnitDecorator.create(_obj: Formulas);
begin
class(Formulas).Create();
class(Formulas).create();
object_ := _obj;
{self.}Convert();
end;
@ -206,13 +206,13 @@ begin
tslassigning := 1;
elems := object_.Fs();
for _,elem in elems do
{self.}AppendChild(new ShapetypeUnitDecorator(elem));
{self.}AppendChild(new FUnitDecorator(elem));
tslassigning := tslassigning_backup;
end;
function LockUnitDecorator.Create(_obj: Lock);
function LockUnitDecorator.create(_obj: Lock);
begin
class(Lock).Create();
class(Lock).create();
object_ := _obj;
{self.}Convert();
end;
@ -230,12 +230,16 @@ begin
{self.}Ext := object_.XmlAttrExt.Value;
if not ifnil(object_.XmlAttrAspectration) then
{self.}Aspectration := object_.XmlAttrAspectration.Value;
if not ifnil(object_.XmlAttrText) then
{self.}Text := object_.XmlAttrText.Value;
if not ifnil(object_.XmlAttrShapetype) then
{self.}Shapetype := object_.XmlAttrShapetype.Value;
tslassigning := tslassigning_backup;
end;
function FUnitDecorator.Create(_obj: F);
function FUnitDecorator.create(_obj: F);
begin
class(F).Create();
class(F).create();
object_ := _obj;
{self.}Convert();
end;
@ -254,9 +258,9 @@ begin
tslassigning := tslassigning_backup;
end;
function StrokeUnitDecorator.Create(_obj: Stroke);
function StrokeUnitDecorator.create(_obj: Stroke);
begin
class(Stroke).Create();
class(Stroke).create();
object_ := _obj;
{self.}Convert();
end;
@ -275,9 +279,9 @@ begin
tslassigning := tslassigning_backup;
end;
function PathUnitDecorator.Create(_obj: Path);
function PathUnitDecorator.create(_obj: Path);
begin
class(Path).Create();
class(Path).create();
object_ := _obj;
{self.}Convert();
end;
@ -306,9 +310,9 @@ begin
tslassigning := tslassigning_backup;
end;
function TextpathUnitDecorator.Create(_obj: Textpath);
function TextpathUnitDecorator.create(_obj: Textpath);
begin
class(Textpath).Create();
class(Textpath).create();
object_ := _obj;
{self.}Convert();
end;
@ -333,9 +337,9 @@ begin
tslassigning := tslassigning_backup;
end;
function HandlesUnitDecorator.Create(_obj: Handles);
function HandlesUnitDecorator.create(_obj: Handles);
begin
class(Handles).Create();
class(Handles).create();
object_ := _obj;
{self.}Convert();
end;
@ -354,9 +358,9 @@ begin
tslassigning := tslassigning_backup;
end;
function HUnitDecorator.Create(_obj: H);
function HUnitDecorator.create(_obj: H);
begin
class(H).Create();
class(H).create();
object_ := _obj;
{self.}Convert();
end;
@ -370,16 +374,16 @@ function HUnitDecorator.Convert();
begin
tslassigning_backup := tslassigning;
tslassigning := 1;
if not ifnil(object_.XmlAttrXrange) then
{self.}Xrange := object_.XmlAttrXrange.Value;
if not ifnil(object_.XmlAttrPosition) then
{self.}Position := object_.XmlAttrPosition.Value;
if not ifnil(object_.XmlAttrXrange) then
{self.}Xrange := object_.XmlAttrXrange.Value;
tslassigning := tslassigning_backup;
end;
function ShapeUnitDecorator.Create(_obj: Shape);
function ShapeUnitDecorator.create(_obj: Shape);
begin
class(Shape).Create();
class(Shape).create();
object_ := _obj;
{self.}Convert();
end;
@ -426,9 +430,9 @@ begin
tslassigning := tslassigning_backup;
end;
function WrapUnitDecorator.Create(_obj: Wrap);
function WrapUnitDecorator.create(_obj: Wrap);
begin
class(Wrap).Create();
class(Wrap).create();
object_ := _obj;
{self.}Convert();
end;
@ -449,9 +453,9 @@ begin
tslassigning := tslassigning_backup;
end;
function FillUnitDecorator.Create(_obj: Fill);
function FillUnitDecorator.create(_obj: Fill);
begin
class(Fill).Create();
class(Fill).create();
object_ := _obj;
{self.}Convert();
end;
@ -470,9 +474,9 @@ begin
tslassigning := tslassigning_backup;
end;
function ImagedataUnitDecorator.Create(_obj: Imagedata);
function ImagedataUnitDecorator.create(_obj: Imagedata);
begin
class(Imagedata).Create();
class(Imagedata).create();
object_ := _obj;
{self.}Convert();
end;
@ -493,9 +497,9 @@ begin
tslassigning := tslassigning_backup;
end;
function TextboxUnitDecorator.Create(_obj: Textbox);
function TextboxUnitDecorator.create(_obj: Textbox);
begin
class(Textbox).Create();
class(Textbox).create();
object_ := _obj;
{self.}Convert();
end;
@ -514,9 +518,9 @@ begin
tslassigning := tslassigning_backup;
end;
function OLEObjectUnitDecorator.Create(_obj: OLEObject);
function OLEObjectUnitDecorator.create(_obj: OLEObject);
begin
class(OLEObject).Create();
class(OLEObject).create();
object_ := _obj;
{self.}Convert();
end;

View File

@ -9,7 +9,7 @@ public
function AppendChild(_element: OpenXmlElement);
function InsertAfter(_element: OpenXmlElement; _pos_element: OpenXmlElement);
function RemoveChild(_element: OpenXmlElement);
// function InsertBefore(_pos_obj: tslobj; _obj: tslobj);
function InsertBefore(_element: OpenXmlElement; _pos_element: OpenXmlElement);
// function PrependChild(_obj: tslobj);
// function SetAttribute(_obj: OpenXmlAttribute);
@ -37,11 +37,12 @@ begin
node := node.NextElement();
end
tslassigning := tslassigning_backup;
deserialized_ := false;
end;
function OpenXmlCompositeElement.Deserialize();override;
begin
if not ifObj({self.}XmlNode) then return;
if deserialized_ or not ifObj({self.}XmlNode) then return;
attrs := {self.}XmlNode.Attributes();
for k, v in attrs do
begin
@ -58,23 +59,27 @@ begin
child_elements := container_.GetElements();
for k, v in child_elements do
v.Deserialize();
deserialized_ := true;
end;
function OpenXmlCompositeElement.Serialize();override;
begin
if {self.}DeleteSelf() then return;
{self.}GetNode();
if {self.}Enable then {self.}GetNode();
// xmlns
for k, v in xmlns_ do
{self.}XmlNode.SetAttribute(v.ElementName, v.Value);
if not ifnil(v.Value) then
{self.}GetNode().SetAttribute(v.ElementName, v.Value);
else if {self.}XmlNode then
{self.}GetNode().DeleteAttribute(v.ElementName);
// Attributes
for k, v in attributes_ do
if not ifnil(v.Value) then
{self.}XmlNode.SetAttribute(v.ElementName, v.Value);
{self.}GetNode().SetAttribute(v.ElementName, v.Value);
else if {self.}XmlNode then
{self.}XmlNode.DeleteAttribute(v.ElementName);
{self.}GetNode().DeleteAttribute(v.ElementName);
// Children
child_elements := container_.GetElements();
@ -89,7 +94,7 @@ begin
for k, v in child_elements do
begin
arr := array("type": "element", "name": v.ElementName, "attributes": array());
if v is Class(OpenXmlTextElement) or v is Class(OpenXmlCompositeElement) then
if v is class(OpenXmlTextElement) or v is class(OpenXmlCompositeElement) then
begin
marshal := v.Marshal();
if length(marshal["children"]) = 0 and length(marshal["attributes"]) = 0 then continue;
@ -97,7 +102,7 @@ begin
arr["attributes"] union= marshal["attributes"];
child_arr[length(child_arr)] := arr;
end
else if v is Class(OpenXmlSimpleType) then
else if v is class(OpenXmlSimpleType) then
begin
marshal := v.Marshal();
if length(marshal) > 0 then child_arr[length(child_arr)] := arr;
@ -138,11 +143,13 @@ end;
function OpenXmlCompositeElement.AppendChild(_element: OpenXmlElement);
begin
_element.Parent := self;
container_.Append(_element);
end;
function OpenXmlCompositeElement.InsertAfter(_element: OpenXmlElement; _pos_element: OpenXmlElement);
begin
_element.Parent := self;
container_.InsertAfter(_element, _pos_element);
end;
@ -151,3 +158,8 @@ begin
_element.Removed := true;
end;
function OpenXmlCompositeElement.InsertBefore(_element: OpenXmlElement; _pos_element: OpenXmlElement);
begin
_element.Parent := self;
container_.InsertBefore(_element, _pos_element);
end;

View File

@ -5,6 +5,7 @@ public
function Init();virtual;
function InitNode(_node: XmlNode);virtual;
function Copy(_obj: tslobj);virtual;
function Clone(): OpenXmlElement;virtual;
function Deserialize();virtual;
function Serialize();virtual;
function Marshal(): tableArray;virtual;
@ -31,6 +32,8 @@ public
ElementName: string;
Removed: boolean; // 节点删除标记最后Serialize时候统一删除
Enable: boolean; // 是否启用 <b /> 没有属性
protected
attributes_: array of OpenXmlAttribute; // 属性
attributes_pf_: tableArray;
@ -38,6 +41,7 @@ protected
sorted_child_: tableArray;
container_: TSOfficeContainer;
fallback_: OpenXmlElement; // 代理对象
deserialized_: boolean; // 是否已反序列化
end;
function OpenXmlElement.Create(_node: XmlNode);overload;
@ -57,9 +61,11 @@ begin
{self.}XmlNode := nil;
{self.}ElementName := ifString({self.}Prefix) and {self.}Prefix <> "" ? format("%s:%s", {self.}Prefix, {self.}LocalName) : {self.}LocalName;
{self.}Removed := false;
{self.}Enable := false;
{self.}Init();
xmlns_ := array();
fallback_ := nil;
deserialized_ := false;
end;
function OpenXmlElement.SetFallback(_fallback: OpenXmlElement);

View File

@ -3,6 +3,7 @@ public
function Init();override;
function InitNode(_node: XmlNode);override;
function Copy(_obj: tslobj);override;
function Clone(): OpenXmlSimpleType;override;
function Deserialize();override;
function Serialize();override;
function Marshal(): tableArray;override;
@ -18,27 +19,33 @@ public
// IsApplied: boolean; // 是否已经应用和val值有关
property IsApplied read ReadIsApplied;
function ReadIsApplied();
public
Enable: boolean; // 是否启用 <b /> 没有属性需要通过val写属性
end;
function OpenXmlSimpleType.Init();override;
begin
{self.}Enable := false;
// {self.}Enable := false;
end;
function OpenXmlSimpleType.InitNode(_node: XmlNode);override;
begin
{self.}XmlNode := ifObj(_node) ? _node : nil;
deserialized_ := false;
end;
function OpenXmlSimpleType.Copy(_obj: tslobj);override;
begin
if not ifnil(_obj.Enable) then {self.}Enable := _obj.Enable;
{self.}Enable := _obj.Enable;
if not ifnil(_obj.XmlAttrVal.Value) then {self.}Val := _obj.XmlAttrVal.Value;
end;
function OpenXmlSimpleType.Clone(): OpenXmlSimpleType;override;
begin
obj := new OpenXmlSimpleType(nil, {self.}Prefix, {self.}LocalName);
obj.Enable := {self.}Enable;
if not ifnil({self.}XmlAttrVal.Value) then obj.Val := {self.}XmlAttrVal.Value;
return obj;
end;
function OpenXmlSimpleType.Marshal(): tableArray;override;
begin
if not {self.}Enable then return array();
@ -50,6 +57,7 @@ end;
function OpenXmlSimpleType.Deserialize();override;
begin
if deserialized_ then return;
if ifObj({self.}XmlNode) then
begin
attrs := {self.}XmlNode.Attributes();
@ -67,13 +75,14 @@ begin
{self.}Enable := false;
{self.}XmlAttrVal := nil;
end
deserialized_ := true;
end;
function OpenXmlSimpleType.Serialize();override;
begin
if not ifObj({self.}XmlNode) then
begin
{self.}GetNode();
if {self.}Enable then {self.}GetNode();
if not ifnil({self.}XmlAttrVal.Value) then {self.}XmlNode.SetAttribute({self.}XmlAttrVal.ElementName, {self.}XmlAttrVal.Value);
end
else begin
@ -102,6 +111,6 @@ end;
function OpenXmlSimpleType.ReadIsApplied();
begin
if {self.}Enable then
return {self.}XmlAttrVal.Value = "0" or {self.}XmlAttrVal.Value = "false" ? false : true;
return {self.}XmlAttrVal.Value = "0" or {self.}XmlAttrVal.Value = "false" or {self.}XmlAttrVal.Value = "off" ? false : true;
return false;
end;

View File

@ -2,6 +2,7 @@ type OpenXmlTextElement = class(OpenXmlElement)
public
function InitNode(_node: XmlNode);override;
function Copy(_obj: tslobj);virtual;
function Clone(): OpenXmlTextElement;virtual;
function Deserialize();override;
function Serialize();override;
function Marshal(): tableArray;override;
@ -13,6 +14,7 @@ end;
function OpenXmlTextElement.InitNode(_node: XmlNode);override;
begin
{self.}XmlNode := ifObj(_node) ? _node : nil;
deserialized_ := false;
end;
function OpenXmlTextElement.Copy(_obj: tslobj);virtual;
@ -20,6 +22,13 @@ begin
if not ifnil(_obj.Text) then {self.}Text := _obj.Text;
end;
function OpenXmlTextElement.Clone(): OpenXmlTextElement;virtual;
begin
obj := new OpenXmlTextElement(nil, {self.}Prefix, {self.}LocalName);
if not ifnil({self.}Text) then obj.Text := {self.}Text;
return obj;
end
function OpenXmlTextElement.Marshal(): tableArray;override;
begin
arr := array("type": "element", "name": name_, "attributes": array(), "children": array());
@ -31,7 +40,7 @@ end;
function OpenXmlTextElement.Deserialize();override;
begin
if not ifObj({self.}XmlNode) then return;
if deserialized_ or not ifObj({self.}XmlNode) then return;
{self.}Text := {self.}XmlNode.GetText();
attrs := {self.}XmlNode.Attributes();
for k, v in attrs do
@ -46,6 +55,7 @@ begin
if ifnil(pf) then continue;
pf.Do(v);
end
deserialized_ := true;
end;
function OpenXmlTextElement.Serialize();override;

View File

@ -1,70 +1,144 @@
unit TSSafeUnitConverter;
interface
function PointsToTwips(value): real;
function TwipsToPoints(value): real;
function CentimetersToPoints(value): real;
function EmusToPoints(value): real;
function HalfPointToPoints(value): real;
function InchesToPoints(value): real;
function LinesToPoints(value): real;
function MillimetersToPoints(value): real;
function PicasToPoints(value): real;
function PixelsToPoints(value): real; // TODO 不实现与DPI有关
function TwipsToPoints(value): real;
// points -> other
function PointsToCentimeters(value): real;
function PointsToEmus(value): real;
function PointsToInches(value): real;
function PointsToLines(value): real;
function PointsToMillimeters(value);
function PointsToPicas(value);
function PointsToPixels(value); // TODO
function PointsToTwips(value): real;
// other
function HalfPointsToPoints(value): real;
function PointsToHalfPoints(value): real;
function EighthPointsToPoints(value): real;
function PercentToNumber(value): real;
function NumberToPercent(value): real;
function ToInt(value): integer;
function EighthPointToPoints(value): real;
implementation
uses TSUnitConverter;
function PointsToTwips(value): real;
function SafeConvert(value, convert_func): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.PointsToTwips(new_value);
new_value := ifString(value) ? strToFloatDef(value, 0) : value;
return ##convert_func(new_value);
end;
function TwipsToPoints(value): real;
function CentimetersToPoints(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.TwipsToPoints(new_value);
end;
function HalfPointToPoints(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.HalfPointToPoints(new_value);
return SafeConvert(value, thisFunction(TSUnitConverter.CentimetersToPoints));
end;
function EmusToPoints(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.EmusToPoints(new_value);
return SafeConvert(value, thisFunction(TSUnitConverter.EmusToPoints));
end;
function InchesToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.InchesToPoints));
end;
function LinesToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.LinesToPoints));
end;
function MillimetersToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.MillimetersToPoints));
end;
function PicasToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PicasToPoints));
end;
function TwipsToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.TwipsToPoints));
end;
// points -> other
function PointsToCentimeters(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToCentimeters));
end;
function PointsToEmus(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToEmus));
end;
function PointsToInches(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToInches));
end;
function PointsToLines(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToLines));
end;
function PointsToMillimeters(value);
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToMillimeters));
end;
function PointsToPicas(value);
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToPicas));
end;
function PointsToTwips(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToTwips));
end;
// other
function HalfPointsToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.HalfPointsToPoints));
end;
function PointsToHalfPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.PointsToHalfPoints));
end;
function EighthPointsToPoints(value): real;
begin
return SafeConvert(value, thisFunction(TSUnitConverter.EighthPointsToPoints));
end;
function PercentToNumber(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.PercentToNumber(new_value);
return SafeConvert(value, thisFunction(TSUnitConverter.PercentToNumber));
end;
function NumberToPercent(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.NumberToPercent(new_value);
return SafeConvert(value, thisFunction(TSUnitConverter.NumberToPercent));
end;
function ToInt(value): integer;
function ToInt(value): real;
begin
if ifNil(value) then return 0;
return strtoIntDef(value, 0);
end;
function EighthPointToPoints(value): real;
begin
if ifNil(value) then return 0;
new_value := ifString(value) ? strToFloat(value) : value;
return TSUnitConverter.EighthPointToPoints(new_value);
if ifnumber(value) then return integer(value);
if ifstring(value) then return strToIntDef(value, 0);
return 0;
end;
end.

View File

@ -1,48 +1,130 @@
unit TSUnitConverter;
interface
function PointsToTwips(value): real;
function TwipsToPoints(value: real): real;
function EmusToPoints(value: real): real;
function HalfPointToPoints(value: real): real;
function EighthPointToPoints(value: real): real;
function PercentToNumber(value: real): real;
function NumberToPercent(value: real): real;
// other -> points
function CentimetersToPoints(centimeters: real): real;
function EmusToPoints(emus: real): real;
function InchesToPoints(inches: real): real;
function LinesToPoints(lines: real): real;
function MillimetersToPoints(millimeters: real): real;
function PicasToPoints(picas: real): real;
function PixelsToPoints(pixels: real; f_vertical: boolean = false): real; // TODO 不实现与DPI有关
function TwipsToPoints(twips: real): real;
// points -> other
function PointsToCentimeters(points: real): real;
function PointsToEmus(points: real): real;
function PointsToInches(points: real): real;
function PointsToLines(points: real): real;
function PointsToMillimeters(points: real);
function PointsToPicas(points: real);
function PointsToPixels(points: real); // TODO
function PointsToTwips(points): real;
// other
function HalfPointsToPoints(half_points: real): real;
function PointsToHalfPoints(points: real): real;
function EighthPointsToPoints(eighth_points: real): real;
function PercentToNumber(percent: real): real;
function NumberToPercent(number: real): real;
implementation
function PointsToTwips(value): real;
function CentimetersToPoints(centimeters: real): real;
begin
return value * 20;
return centimeters * 28.346456692913385826771653543307;
end;
function TwipsToPoints(value: real): real;
function EmusToPoints(emus: real): real;
begin
return value / 20;
return emus / 12700;
end;
function EmusToPoints(value: real): real;
function InchesToPoints(inches: real): real;
begin
return value / 12700;
return inches * 72;
end;
function HalfPointToPoints(value: real): real;
function LinesToPoints(lines: real): real;
begin
return value / 2;
return lines * 12; // Assuming 1 line = 12 points
end;
function PercentToNumber(value: real): real;
function MillimetersToPoints(millimeters: real): real;
begin
return value / 100;
return millimeters * 2.8346456692913385826771653543307;
end;
function NumberToPercent(value: real): real;
function PicasToPoints(picas: real): real;
begin
return value * 100;
return picas * 12;
end;
function EighthPointToPoints(value: real): real;
function TwipsToPoints(twips: real): real;
begin
return value / 8;
return twips / 20;
end;
// Points -> others
function PointsToCentimeters(points: real): real;
begin
return points / 28.346456692913385826771653543307;
end;
function PointsToEmus(points: real): real;
begin
return points * 12700;
end;
function PointsToInches(points: real): real;
begin
return points / 72;
end;
function PointsToLines(points: real): real;
begin
return points / 12;
end;
function PointsToMillimeters(points: real);
begin
return points / 2.8346456692913385826771653543307;
end;
function PointsToTwips(points): real;
begin
return points * 20;
end;
function PointsToPicas(points: real);
begin
return points / 12;
end;
// other
function HalfPointsToPoints(half_points: real): real;
begin
return half_points / 2;
end;
function PointsToHalfPoints(points: real): real;
begin
return points * 2;
end;
function EighthPointsToPoints(eighth_points: real): real;
begin
return eighth_points / 8;
end;
function PercentToNumber(percent: real): real;
begin
return percent / 100;
end;
function NumberToPercent(number: real): real;
begin
return number * 100;
end;
end.