diff --git a/components/iphonelazext/def_buildscript.sh b/components/iphonelazext/def_buildscript.sh index bb9d59689..7bb975e25 100644 --- a/components/iphonelazext/def_buildscript.sh +++ b/components/iphonelazext/def_buildscript.sh @@ -1,31 +1,93 @@ -## start +## The script builds the project for both 32 and 64-bit architectures +## It's requirement for Apple to support both arm32 and arm64 for a device +## Some Simulators might still be 32-bit (iPhone4, iPads), thus both x86 and x86_64 +## are compiled echo "compiling FPC project" export RESULT_EXE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH} -export IOSHEADERS= cd $FPC_MAIN_DIR -#rm $RESULT_EXE -export TargetCPU=${PLATFORM_PREFERRED_ARCH} +export TargetCPU=${PLATFORM_PREFERRED_ARCH} +## default compile options, assuming ARM +export OPT32=${FPC_OPT_A32} +export OPT64=${FPC_OPT_A64} +export CPU32="arm" +export CPU64="aarch64" +export TargetOS="darwin" + +## Simulator has been selected in Xcode project +## switching options to Intel if [ "${PLATFORM_NAME}" == "iphonesimulator" ]; then - export TargetOS="iphonesim" +export OPT32=${FPC_OPT_I32} +export OPT64=${FPC_OPT_I64} +export CPU32="i386" +export CPU64="x86_64" +export TargetOS="iphonesim" fi + +## 64-bit compilation + +export Result64=${RESULT_EXE}_64 +export TargetCPU=${CPU64} export Target=${TargetCPU}-${TargetOS} -pwd -echo ${RESULT_EXE} +## making output directory +export outdir=lib/${Target} +mkdir -p ${outdir} + +## debugging echo +echo ${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} \ + ${FPC_CUSTOM_OPTIONS} ${OPT64} \ + -Filib/${Target} -FUlib/${Target} \ + -XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ + -o${Result64} + +${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} \ + ${FPC_CUSTOM_OPTIONS} ${OPT64} \ + -Filib/${Target} -FUlib/${Target} \ + -XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ + -o${Result64} -${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -O1 -l -dIPHONEALL \ - ${FPC_CUSTOM_OPTIONS} \ --Filib/${Target} -FUlib/${Target} \ --XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ - -o${RESULT_EXE} export RES=$? +## if compiler returned an error, stop the script and exit with error if [ $RES != 0 ]; then exit $RES fi -echo ${RESULT_EXE} -exit $FPCRES \ No newline at end of file +## 32-bit complication + +export Result32=${RESULT_EXE}_32 +export TargetCPU=${CPU32} +export Target=${TargetCPU}-${TargetOS} +## making output directory +export outdir=lib/${Target} +mkdir -p ${outdir} + +echo ${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} \ + ${FPC_CUSTOM_OPTIONS} ${OPT32} \ + -Filib/${Target} -FUlib/${Target} \ + -XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ + -o${Result32} + +${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} \ + ${FPC_CUSTOM_OPTIONS} ${OPT32} \ + -Filib/${Target} -FUlib/${Target} \ + -XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ + -o${Result32} +export RES=$? + +## if compiler returned an error, stop the script and exit with error +if [ $RES != 0 ]; then +exit $RES +fi + +## both 32 and 64 are done, making the fat binary +lipo -create ${Result32} ${Result64} -output ${RESULT_EXE} + +## removing 32 and 64 bit +rm ${Result32} +rm ${Result64} + +exit $FPCRES diff --git a/components/iphonelazext/ideext.pas b/components/iphonelazext/ideext.pas index 85af94aec..d87b1a2ec 100644 --- a/components/iphonelazext/ideext.pas +++ b/components/iphonelazext/ideext.pas @@ -25,6 +25,7 @@ uses Graphics, Controls, Forms, Dialogs, LazFileUtils, {Lazarus Interface} LazIDEIntf, MenuIntf, ProjectIntf, IDEOptionsIntf, IDEMsgIntf + ,CompOptsIntf ,IDEExternToolIntf ,project_iphone_options, xcodetemplate, iphonelog_form, @@ -395,6 +396,7 @@ var Info : TiPhoneBundleInfo; opt : string; + prjopt : TLazCompilerOptions; begin // the create .plist would be used by XCode project // the simulator .plist in created with InstallAppToSim. @@ -413,12 +415,12 @@ begin build.Add('FPC_MAIN_FILE','"'+LazarusIDE.ActiveProject.MainFile.Filename+'"'); opt:=''; - with LazarusIDE.ActiveProject.LazCompilerOptions do begin - opt:=opt + ' ' +BreakPathsStringToOption(OtherUnitFiles, '-Fu', '\"'); - opt:=opt + ' ' +BreakPathsStringToOption(IncludePath, '-Fi', '\"'); - opt:=opt + ' ' +BreakPathsStringToOption(ObjectPath, '-Fo', '\"'); - opt:=opt + ' ' +BreakPathsStringToOption(Libraries, '-Fl', '\"'); - end; + prjopt:=LazarusIDE.ActiveProject.LazCompilerOptions; + opt:=opt + ' ' +BreakPathsStringToOption(prjopt.GetUnitPath(true, coptParsedPlatformIndependent), '-Fu', '\"'); + opt:=opt + ' ' +BreakPathsStringToOption(prjopt.GetIncludePath(true, coptParsedPlatformIndependent), '-Fi', '\"'); + opt:=opt + ' ' +BreakPathsStringToOption(prjopt.GetObjectPath(true, coptParsedPlatformIndependent), '-Fo', '\"'); + opt:=opt + ' ' +BreakPathsStringToOption(prjopt.GetLibraryPath(true, coptParsedPlatformIndependent), '-Fl', '\"'); + opt:=opt + ' ' +prjopt.CustomOptions; dir:=ResolveProjectPath('xcode'); dir:=dir+'/'; @@ -469,6 +471,14 @@ begin templates.Values['mainfile']:=LazarusIDE.ActiveProject.MainFile.Filename; templates.Values['projoptions']:=opt; + if FileExists(EnvOptions.ScriptTemplate) then begin + try + DefaultBuildScript:=ReadBuildScriptFile( EnvOptions.ScriptTemplate ); + except + end; + end; + + if not UpdateProject(projName, templates, ProjOptions.ResFiles) then IDEMsg(Format(strXcodeUpdFailed,[projdir])) else diff --git a/components/iphonelazext/iphonebundle.pas b/components/iphonelazext/iphonebundle.pas index db05509bf..3f1cd7c21 100644 --- a/components/iphonelazext/iphonebundle.pas +++ b/components/iphonelazext/iphonebundle.pas @@ -61,6 +61,92 @@ function RandomSpaceName: WideString; implementation +(* Build script: +## start +echo "compiling FPC project" + +export RESULT_EXE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH} +export IOSHEADERS= +cd $FPC_MAIN_DIR + +export TargetCPU=${PLATFORM_PREFERRED_ARCH} + +export OPT32=${FPC_OPT_A32} +export OPT64=${FPC_OPT_A64} +export CPU32="arm" +export CPU64="aarch64" +export TargetOS="darwin" + +if [ "${PLATFORM_NAME}" == "iphonesimulator" ]; then +export OPT32=${FPC_OPT_I32} +export OPT64=${FPC_OPT_I64} +export CPU32="i386" +export CPU64="x86_64" +export TargetOS="iphonesim" +fi + +# 64-bit compilation +export Result64=${RESULT_EXE}_64 +export TargetCPU=${CPU64} +export Target=${TargetCPU}-${TargetOS} +## making output directory +export outdir=lib/${Target} +mkdir -p ${outdir} + +echo ${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -O3 -l -dIPHONEALL \ +${FPC_CUSTOM_OPTIONS} ${OPT64} \ +-Filib/${Target} -FUlib/${Target} \ +-XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ +-o${Result64} + +${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -O3 -l -dIPHONEALL \ + ${FPC_CUSTOM_OPTIONS} ${OPT64} \ +-Filib/${Target} -FUlib/${Target} \ +-XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ + -k-F/Users/dmitry/FPC_laz/paseng/tests/testBomber3UI -k-t \ + -o${Result64} +export RES=$? + +if [ $RES != 0 ]; then + exit $RES +fi + + +# 32-bit complication +export Result32=${RESULT_EXE}_32 +export TargetCPU=${CPU32} +export Target=${TargetCPU}-${TargetOS} +## making output directory +export outdir=lib/${Target} +mkdir -p ${outdir} + +echo ${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -Cg -O3 -l -dIPHONEALL \ +${FPC_CUSTOM_OPTIONS} ${OPT32} \ +-Filib/${Target} -FUlib/${Target} \ +-XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ +-k-F/Users/dmitry/FPC_laz/paseng/tests/testBomber3UI \ +-o${Result32} + +${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -Cg -O3 -l -dIPHONEALL \ +${FPC_CUSTOM_OPTIONS} ${OPT32} \ +-Filib/${Target} -FUlib/${Target} \ +-XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \ +-k-F/Users/dmitry/FPC_laz/paseng/tests/testBomber3UI \ +-o${Result32} +export RES=$? + +if [ $RES != 0 ]; then +exit $RES +fi + +lipo -create ${Result32} ${Result64} -output ${RESULT_EXE} +rm ${Result32} +rm ${Result64} + +exit $FPCRES + +*) + uses iPhoneExtOptions; @@ -72,7 +158,7 @@ begin CreateGUID(g); id:=GUIDToString(g); id:=Copy(id, 2, length(id)-2); - Result:=id; + Result:=UTF8Decode(id); end; @@ -119,7 +205,7 @@ begin if DirectoryExistsUTF8(p) then Result:=UTF8Decode(p) else if DirectoryExistsUTF8(path8) then - result:=path8 + result:=UTF8Decode(path8) else result :=''; end; @@ -145,7 +231,7 @@ var begin s := EnvOptions.SimAppsPath; EnvOptions.SubstituteMacros(s); - result := s; + result := UTF8Decode(s); end; { @@ -226,12 +312,13 @@ var pl : TPListFile; arr : TPListValue; begin + Result:=false; pl := TPListFile.Create; try if not FileExists(InfoFileName) then begin InitDefaultPlist(pl); end else - LoadFromFile(InfoFileName, pl); + LoadFromFile( UTF8Encode(InfoFileName), pl); SetStr(pl, 'CFBundleDisplayName', info.DisplayName); SetStr(pl, 'CFBundleExecutable', ExeName); SetStr(pl, 'CFBundleIdentifier', info.AppID); @@ -241,7 +328,7 @@ begin SetStr(pl, 'DTPlatformName', info.iPlatform); SetStr(pl, 'DTSDKName', info.SDKVersion); - SaveToXMLFile(pl, InfoFileName); + Result:=SaveToXMLFile(pl, UTF8Encode(InfoFileName)); finally pl.Free; end; @@ -260,7 +347,7 @@ const ' CFBundleIdentifier'#10+ ' %s'#10+ {company + bundle name} ' CFBundleInfoDictionaryVersion'#10+ ' 6.0'#10+ ' CFBundleName'#10+ ' %s'#10+ {bundle name} - ' CFBundlePackageType'#10+ ' APPL'#10+ + ' CFBundlePackageType'#10+ ' APPL'#10+ // must be present for AppStore deployment! ' CFBundleSignature'#10+ ' ????'#10+ ' CFBundleSupportedPlatforms'#10+ ' '#10+' %s'#10+' '#10+ {platform} '%s'+ // optional MainNib name diff --git a/components/iphonelazext/iphoneextoptions.pas b/components/iphonelazext/iphoneextoptions.pas index 66026b33f..f3961c8a2 100644 --- a/components/iphonelazext/iphoneextoptions.pas +++ b/components/iphonelazext/iphoneextoptions.pas @@ -21,7 +21,7 @@ interface uses Classes, SysUtils, IDEOptionsIntf, LazIDEIntf, ProjectIntf, MacroIntf, - iPhoneBundle, XMLConf, XcodeUtils, PlistFile + iPhoneBundle, XMLConf, XcodeUtils , LazFileUtils, LazFilesUtils , iphonesimctrl, xcodeproj; @@ -306,15 +306,15 @@ begin try xmlcfg.RootName:='config'; xmlcfg.Filename:=XMLFileName; - fPlatformsBaseDir := UTF8Encode(xmlcfg.GetValue('Platforms', fPlatformsBaseDir )); - fCompilerPath := UTF8Encode(xmlcfg.GetValue('Compiler', fCompilerPath)); - fBaseRTLPath := UTF8Encode(xmlcfg.GetValue('RTLPath', fBaseRTLPath)); - fCommonOpt := UTF8Encode(xmlcfg.GetValue('CompilerOptions', fCommonOpt)); - fSimBundle := UTF8Encode(xmlcfg.GetValue('SimBundle', fSimBundle)); - fSimAppsPath := UTF8Encode(xmlcfg.GetValue('SimAppPath', fSimAppsPath)); - fDefaultSDK := UTF8Encode(xmlcfg.GetValue('DefaultSDK', fDefaultSDK)); - fDefaultDeviceID := UTF8Encode(xmlcfg.GetValue('DefaultDevice', fDefaultDeviceID)); - fScriptTemplate := UTF8Encode(xmlcfg.GetValue('ScriptTemplate', fScriptTemplate)); + fPlatformsBaseDir := UTF8Encode(xmlcfg.GetValue('Platforms', UTF8Decode(fPlatformsBaseDir) )); + fCompilerPath := UTF8Encode(xmlcfg.GetValue('Compiler', UTF8Decode(fCompilerPath))); + fBaseRTLPath := UTF8Encode(xmlcfg.GetValue('RTLPath', UTF8Decode(fBaseRTLPath))); + fCommonOpt := UTF8Encode(xmlcfg.GetValue('CompilerOptions', UTF8Decode(fCommonOpt))); + fSimBundle := UTF8Encode(xmlcfg.GetValue('SimBundle', UTF8Decode(fSimBundle))); + fSimAppsPath := UTF8Encode(xmlcfg.GetValue('SimAppPath', UTF8Decode(fSimAppsPath))); + fDefaultSDK := UTF8Encode(xmlcfg.GetValue('DefaultSDK', UTF8Decode(fDefaultSDK))); + fDefaultDeviceID := UTF8Encode(xmlcfg.GetValue('DefaultDevice', UTF8Decode(fDefaultDeviceID))); + fScriptTemplate := UTF8Encode(xmlcfg.GetValue('ScriptTemplate', UTF8Decode(fScriptTemplate))); RefreshVersions; if (fDefaultSDK = '') and (fVersions.Count>0) then diff --git a/components/iphonelazext/iphonelazext.lpk b/components/iphonelazext/iphonelazext.lpk index fc169165a..07d8a2549 100644 --- a/components/iphonelazext/iphonelazext.lpk +++ b/components/iphonelazext/iphonelazext.lpk @@ -24,7 +24,7 @@ - + diff --git a/components/iphonelazext/iphonesimctrl.pas b/components/iphonelazext/iphonesimctrl.pas index 6a63fc99b..664bbe394 100644 --- a/components/iphonelazext/iphonesimctrl.pas +++ b/components/iphonelazext/iphonesimctrl.pas @@ -267,7 +267,6 @@ var l : string; st : TStringList; i : integer; - j : integer; ip : string; // install path fp : string; // content path begin diff --git a/components/iphonelazext/pbx/pbxcontainer.pas b/components/iphonelazext/pbx/pbxcontainer.pas index 81dcb9f01..5f88da364 100644 --- a/components/iphonelazext/pbx/pbxcontainer.pas +++ b/components/iphonelazext/pbx/pbxcontainer.pas @@ -711,7 +711,7 @@ const FlagGet = 3; // 1 + 2 //ptField = 0; FlagSet = 12; // 4 + 8 , 16 + 32 //ptStatic = 1; FlagSP = 16 + 32; //ptVirtual = 2; - FlagIdx = 64; //ptConst = 3; } + FlagIdx = 64; //ptConst = 3; begin if (not Assigned(obj)) or (not Assigned(srz)) then Exit; diff --git a/components/iphonelazext/pbx/xcodeproj.pas b/components/iphonelazext/pbx/xcodeproj.pas index a5fbd8ab0..ee2e1a2d2 100644 --- a/components/iphonelazext/pbx/xcodeproj.pas +++ b/components/iphonelazext/pbx/xcodeproj.pas @@ -698,7 +698,7 @@ end; function ProjectCreateMin: PBXProject; var p : PBXProject; - cfg : XCBuildConfiguration; + //cfg : XCBuildConfiguration; begin // requirements: // * at least one build configuration @@ -709,8 +709,8 @@ begin p.buildConfigurationList._headerComment:='Build configuration list for PBXProject'; p.buildConfigurationList.defaultConfigurationIsVisible:='0'; - cfg:=p.buildConfigurationList.addConfig('Debug'); - cfg:=p.buildConfigurationList.addConfig('Release'); + p.buildConfigurationList.addConfig('Debug'); + p.buildConfigurationList.addConfig('Release'); // default name must be present p.buildConfigurationList.defaultConfigurationName:='Release'; Result:=p; diff --git a/components/iphonelazext/plistfile.pas b/components/iphonelazext/plistfile.pas index b3a96c802..1fad55d53 100644 --- a/components/iphonelazext/plistfile.pas +++ b/components/iphonelazext/plistfile.pas @@ -145,7 +145,6 @@ var res : integer; {$ifdef darwin} xs : string; - err : LongWord; m : TStringStream; doc : TXMLDocument; {$endif} @@ -255,7 +254,7 @@ begin ltDict: begin dst.Add(pfx+''); for i:=0 to v.count-1 do begin - dst.Add(XMLPFX+''+XMLEncodeText(v.names[i])+''); + dst.Add(XMLPFX+''+XMLEncodeText(UTF8Decode(v.names[i]))+''); WriteXMLValue(v.items[i], dst, pfx+XMLPFX); end; dst.Add(pfx+''); @@ -374,7 +373,7 @@ var begin Result:=nil; if not Assigned(valnode) then Exit; - if not NodeNameToPListType(valnode.NodeName, tp) then Exit; + if not NodeNameToPListType( UTF8Encode(valnode.NodeName), tp) then Exit; Result:=TPListValue.Create(tp); case tp of ltBoolean: Result.bool:=(valnode.NodeName='true'); // false is false diff --git a/components/iphonelazext/xcodetemplate.pas b/components/iphonelazext/xcodetemplate.pas index d0c7ee3ee..48189bdf7 100644 --- a/components/iphonelazext/xcodetemplate.pas +++ b/components/iphonelazext/xcodetemplate.pas @@ -28,7 +28,7 @@ function UpdateProject(const ProjFileName: string; TemplateValues, ResFiles: TSt procedure UpdateBldConfig(const proj: PBXProject; optName, optVal: string); procedure UpdateMainFile(const proj: PBXProject; mainfile: string); -procedure UpdateCompileOpts(const proj: PBXProject; const options: string); +procedure UpdateCompileOpts(const proj: PBXProject; const aoptions: string); const XCodeProjectTemplateIconID : AnsiString ='0AE3FFA610F3C9AF00A9B007,'; @@ -206,43 +206,19 @@ const ' rootObject = 0A52AE8310F0D05300478C4F /* Project object */;'#10+ '}'#10; - BuildScript = - '## start'#13 - +'echo "compiling FPC project"'#13 - +''#13 - +'export RESULT_EXE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}'#13 - +'export IOSHEADERS='#13 - +'cd $FPC_MAIN_DIR'#13 - +'#rm $RESULT_EXE'#13 - +'export TargetCPU=${PLATFORM_PREFERRED_ARCH}'#13 - +''#13 - +'if [ "${PLATFORM_NAME}" == "iphonesimulator" ]; then'#13 - +' export TargetOS="iphonesim"'#13 - +'fi'#13 - +'export Target=${TargetCPU}-${TargetOS}'#13 - +''#13 - +'pwd'#13 - +'echo ${RESULT_EXE}'#13 - +''#13 - +'${FPC_DIR}fpc -T${TargetOS} -P${TargetCPU} -MDelphi -Scghi -O1 -l -dIPHONEALL \'#13 - +' ${FPC_CUSTOM_OPTIONS} \'#13 - //-Fu~/iOS_6_0 -Fu. - +'-Filib/${Target} -FUlib/${Target} \'#13 - +'-XR${SDKROOT} -FD${PLATFORM_DEVELOPER_BIN_DIR} $FPC_MAIN_FILE \'#13 - +' -o${RESULT_EXE}'#13 - +'export RES=$?'#13 - +''#13 - +'if [ $RES != 0 ]; then'#13 - +' exit $RES'#13 - +'fi'#13 - +''#13 - +'echo ${RESULT_EXE}'#13 - +''#13 - +'exit $FPCRES'#13; +var + // global variable... a bad pattern must be replaced + DefaultBuildScript : string = ''; +function ReadBuildScriptFile(const fn: string): string; implementation +function EmptyBuildScript: string; +begin + Result:=''; +end; + function GetValueName(const Source: String; idx: Integer): String; var i : integer; @@ -355,8 +331,9 @@ begin Result:=StringReplace(Result, '$(TargetOS)', os, [rfReplaceAll, rfIgnoreCase]); end; -procedure UpdateCompileOpts(const proj: PBXProject; const options: string); +procedure UpdateCompileOpts(const proj: PBXProject; const aoptions: string); var + options : string; opt : string; i32opt : string; i64opt : string; @@ -367,6 +344,7 @@ var begin //UpdateBldConfig(proj, 'FPC_CUSTOM_OPTIONS', options); UpdateBldConfig(proj, 'FPC_CUSTOM_OPTIONS', ''); + options:=aoptions+' '; // trailing space, always to consume the last options i:=1; j:=1; l:=length(options); @@ -521,7 +499,7 @@ begin if not Assigned(TargetFindRunScript(trg)) then begin scr:=TargetAddRunScript(trg); - scr.shellScript:=BuildScript; + scr.shellScript:=DefaultBuildScript; scr.showEnvVarsInLog:=true; end; @@ -563,8 +541,9 @@ begin prj.Free; Exit; end; - end else + end else begin prj:=ProjectCreate3_2; + end; try PrepareTemplateFile(prj, TemplateValues, Resfiles); diff --git a/components/iphonelazext/xibfile.pas b/components/iphonelazext/xibfile.pas index 7faae6613..7f5377439 100644 --- a/components/iphonelazext/xibfile.pas +++ b/components/iphonelazext/xibfile.pas @@ -185,7 +185,7 @@ end; procedure DoReadXibDoc(ADoc: TXMLDocument; var Obj: TXibObject); const - DataNode = 'data'; + //DataNode = 'data'; XibObject = 'object'; var node : TDOMNode; @@ -288,7 +288,7 @@ begin n:=fXibNode.FirstChild; while Assigned(n) do begin if (n.NodeName='string') and (TDOMElement(n).AttribStrings['key']='') then - list.Add(n.TextContent); + list.Add(UTF8Encode(n.TextContent)); n:=n.NextSibling; end; end; @@ -319,13 +319,13 @@ var n : TDOMNode; begin n:=FindProperty(PropName); - if Assigned(n) and (n.NodeName='string') then Result:=n.TextContent + if Assigned(n) and (n.NodeName='string') then Result:=UTF8Encode(n.TextContent) else Result:=''; end; function isKeyAttr(n: TDomNode; const KeyAttrVal: String): Boolean; begin - Result:=Assigned(n) and (n is TDOMElement) and (TDOMElement(n).AttribStrings['key']=KeyAttrVal) + Result:=Assigned(n) and (n is TDOMElement) and (TDOMElement(n).AttribStrings['key']=UTF8Decode(KeyAttrVal)) end; function TXibObject.FindProperty(const PropName:String):TDOMNode; @@ -344,7 +344,7 @@ begin Result:=''; Exit; end; - Result:=TDOMElement(fXibNode).AttribStrings['key']; + Result:=UTF8Encode(TDOMElement(fXibNode).AttribStrings['key']); end; function TXibObject.GetXibClass:String; @@ -353,7 +353,7 @@ begin Result:=''; Exit; end; - Result:=TDOMElement(fXibNode).AttribStrings['class']; + Result:=UTF8Encode(TDOMElement(fXibNode).AttribStrings['class']); end; procedure ListClassesDescr(const FileName: AnsiString; DstList : TList); overload;