AS3里var aa:String是null还是""?

本文探讨了AS3中字符串变量默认初始化的问题,明确指出未赋值的String类型变量默认为null。
Public Function Main(ISN, Error, DEV, TSP, DATA, ROUTE, CPKFlag, STATION, Retry, LibDef) &#39;11011580 Dim var_B4 As Me Dim var_104 As App Dim var_20 As Me Dim var_2C As Me loc_110115E5: repz stosd loc_110115F2: repz stosd loc_11011700: On Error Resume Next loc_11011726: var_2D0 = var_B4 loc_1101172C: var_1DC = vbNullString loc_1101174D: var_114 = vbNullString loc_11011764: GETSETTING.1 = PropBag.ReadProperty(var_114, var_2C8) loc_1101178F: If var_1101D04E = 0 Then GoTo loc_110160A2 loc_1101179C: If var_1101D04C = 0 Then GoTo loc_11016080 loc_110117BD: var_2D0 = var_50 loc_110117DA: var_eax = Unknown_VTable_Call[edx+0000001Ch] loc_11011801: call __vbaVarVargNofree(var_50, "http://10.176.33.13/SFISWebService/SFISTSPWebService.asmx?WSDL", vbNullString, vbNullString, vbNullString, var_B4, __vbaVarVargNofree, 00000008h) loc_11011804: var_ret_1 = CStr(__vbaVarVargNofree(var_50, "http://10.176.33.13/SFISWebService/SFISTSPWebService.asmx?WSDL", vbNullString, vbNullString, vbNullString, var_B4, __vbaVarVargNofree, 00000008h)) loc_11011818: var_E0 = var_ret_1 loc_11011834: call __vbaVarVargNofree loc_11011837: var_ret_2 = CStr(__vbaVarVargNofree) loc_11011845: var_E8 = var_ret_2 loc_11011853: setz cl loc_11011863: call __vbaVarVargNofree loc_11011866: var_ret_3 = CStr(__vbaVarVargNofree) loc_11011874: var_E4 = var_ret_3 loc_11011887: var_2D0 = Len(var_E4) loc_110118B0: If Len(var_E4) = 0 Then GoTo loc_11014702 loc_110118B6: var_1DC = "TEST","STATUS","VALUE","UCL","LCL" loc_11011905: call __vbaVarVargNofree(00000001h) loc_11011934: var_144 = "TEST","STATUS","VALUE","UCL","LCL" & Chr(13) & Chr(10) loc_11011940: call InStr(var_154, 00000000h, var_144, __vbaVarVargNofree(00000001h)) loc_11011954: var_2D0 = (InStr(var_154, 00000000h, var_144, __vbaVarVargNofree(00000001h)) = 0) loc_11011990: If var_2D0 = 0 Then GoTo loc_11011A38 loc_11011996: var_1DC = "TEST","STATUS","VALUE","UCL","LCL" loc_110119C2: var_124 = Chr(10) loc_110119EE: var_144 = "TEST","STATUS","VALUE","UCL","LCL" & Chr(13) & var_124 loc_110119FA: call __vbaVarVargNofree(var_144) loc_11011A04: var_154 = & __vbaVarVargNofree(var_144) loc_11011A0B: call __vbaVargVarMove loc_11011A38: &#39;Referenced from: 11011990 loc_11011A67: var_104 = Global.App loc_11011A91: var_E0 = Global.Path loc_11011AD3: var_ret_4 = var_E0 & "\Versatile.ini" loc_11011AE1: call __vbaStrFixstr(0000000Ah, var_DC, 0000000Ah, var_ret_4) loc_11011AF9: var_ret_5 = __vbaStrFixstr(0000000Ah, var_DC, 0000000Ah, var_ret_4) loc_11011B29: var_eax = GetPrivateProfileString("SFIS_Setting", "SFIS_MANUAL", "ON", var_ret_5, , ) loc_11011B54: call __vbaLsetFixstr(0000000Ah, var_DC, var_F4) loc_11011B5E: setg cl loc_11011BBE: If var_104 = 0 Then GoTo loc_11014482 loc_11011BCD: call __vbaStrFixstr(0000000Ah, var_DC) loc_11011BDB: var_E0 = __vbaStrFixstr(0000000Ah, var_DC) loc_11011BE3: var_1DC = var_E0 loc_11011C01: var_114 = Ucase(var_E0) loc_11011C17: call __vbaLsetFixstr(0000000Ah, var_DC, var_E0) loc_11011C1D: var_1EC = "ON" loc_11011C5E: call InStr(var_124, 00000000h, var_1F4, var_114, 00000001h) loc_11011C74: var_2D0 = (InStr(var_124, 00000000h, var_1F4, var_114, 00000001h) > 0) loc_11011CA2: If (InStr(var_124, 00000000h, var_1F4, var_114, 00000001h) > 0) = 0 Then GoTo loc_1101329B loc_11011CCA: var_1EC = "SFIS warning" loc_11011CF0: var_124 = "SFIS warning" loc_11011CF2: var_1DC = "Upload error to SFIS?" loc_11011D12: var_114 = "Upload error to SFIS?" loc_11011D40: setz bl loc_11011D75: If ebx = 0 Then GoTo loc_1101317C loc_11011D7B: var_1EC = "tsp_iad1" loc_11011D90: var_20C = "ap_i1sus" loc_11011DA0: var_22C = vbNullString loc_11011DC8: call __vbaVarVargNofree loc_11011DD1: var_25C = CLng(__vbaVarVargNofree) loc_11011ECC: call __vbaVargVar(var_318, var_258) loc_11011F58: var_114 = Chr(127) loc_11011F74: var_124 = Split(var_50."WTSP_LOGINOUT", var_114, -1, 0) loc_11011F83: var_3C = var_124 loc_11011FCD: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_11011FD7: var_ret_B = CInt(__vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8)) loc_11011FE0: ebx = var_ret_B - 1 loc_11011FE7: ebx = var_ret_B - 1 + 1 loc_11011FEA: var_2D0 = var_ret_B - 1 + 1 loc_11011FFF: If var_ret_B - 1 + 1 = 0 Then GoTo loc_110121D7 loc_11012005: var_1EC = "tsp_iad1" loc_1101201A: var_20C = "ap_i1sus" loc_1101202A: var_22C = vbNullString loc_11012052: call __vbaVarVargNofree loc_1101205B: var_25C = CLng(__vbaVarVargNofree) loc_11012156: call __vbaVargVar(var_328, var_258) loc_110121C9: var_54 = var_50."WTSP_LOGINOUT" loc_110121D7: &#39;Referenced from: 11011FFF loc_110121E0: var_114 = Chr(0) loc_11012207: call __vbaVarVargNofree(00000001h) loc_1101221A: call InStr(var_124, 00000000h, var_114, __vbaVarVargNofree(00000001h)) loc_1101222E: var_2D0 = (InStr(var_124, 00000000h, var_114, __vbaVarVargNofree(00000001h)) <> 0) loc_11012255: If var_2D0 = 0 Then GoTo loc_11012345 loc_11012273: call __vbaVarVargNofree(var_110061B8, ",,", 00000001h, FFFFFFFFh, 00000000h) loc_1101228A: var_10C = Replace(CStr(__vbaVarVargNofree(var_110061B8, ",,", 00000001h, FFFFFFFFh, 00000000h)), , , , , ) loc_110122A2: call __vbaVargVarMove loc_110122DC: var_E4 = CStr(Chr(0)) loc_110122EB: call __vbaVarVargNofree(var_E4, var_110061B8, 00000001h, FFFFFFFFh, 00000000h) loc_11012302: var_11C = Replace(CStr(__vbaVarVargNofree(var_E4, var_110061B8, 00000001h, FFFFFFFFh, 00000000h)), , , , , ) loc_1101231A: call __vbaVargVarMove loc_11012345: &#39;Referenced from: 11012255 loc_11012345: var_20C = "tsp_iad1" loc_1101235A: var_22C = "ap_i1sus" loc_11012373: call __vbaVarVargNofree loc_11012376: var_ret_D = CStr(__vbaVarVargNofree) loc_1101237C: var_10C = var_ret_D loc_1101239A: var_124 = Ucase(var_ret_D) loc_110123A9: call __vbaVarVargNofree loc_110123B2: var_25C = CLng(__vbaVarVargNofree) loc_110123C1: call __vbaVarVargNofree loc_110123CA: var_27C = CInt(__vbaVarVargNofree) loc_1101244B: call __vbaVargVar(var_338, var_228) loc_110124C5: call __vbaVargVar(var_348, var_258) loc_110124F5: call __vbaVargVar(var_358, eax+0000000Ch) loc_11012544: call __vbaVargVar(var_368, var_278) loc_1101258B: var_54 = var_50."WTSP_RESULT" loc_110125C2: If InStr(1, var_54, "Login First", 0) > 0 Then GoTo loc_11011D7B loc_110125D1: var_114 = Chr(127) loc_110125FC: var_3C = Split(var_54, var_114, -1, 0) loc_1101264C: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_1101267C: var_ret_10 = CInt(var_114) loc_11012682: eax = var_ret_10 - 1 loc_11012689: eax = var_ret_10 - 1 + 1 loc_1101268C: var_1FC = var_ret_10 - 1 + 1 loc_110126B9: var_144 = IIf(var_ret_10 - 1 + 1, 0, 1) loc_110126C6: var_144 = CInt() loc_110126CE: var_5C = var_144 loc_1101273B: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8, 2, 2, var_144) loc_11012749: call __vbaVargVarMove loc_11012752: If var_144 <> 0 Then GoTo loc_1101315F loc_11012773: var_2D0 = var_20 loc_1101278B: GETERDESC.var_2C8 = PropBag.ReadProperty(Error, var_4C) loc_110127E2: var_114 = vbNullString loc_110127EB: var_1DC = var_28 loc_11012827: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_1101287A: var_104 = Global.App loc_110128A4: var_E0 = Global.Path loc_110128E6: var_ret_11 = var_E0 & "\Versatile.ini" loc_110128F4: call __vbaStrFixstr(00000014h, var_B0, 00000014h, var_ret_11, var_4C, STATION, var_1E4, var_114, var_2C8) loc_1101290C: var_ret_12 = __vbaStrFixstr(00000014h, var_B0, 00000014h, var_ret_11, var_4C, STATION, var_1E4, var_114, var_2C8) loc_1101291B: var_ret_13 = vbNullString loc_1101292A: var_ret_14 = "project" loc_11012939: var_ret_15 = "iPLAS" loc_1101293C: var_eax = GetPrivateProfileString(var_ret_15, var_ret_14, var_ret_13, var_ret_12, , ) loc_11012941: var_2CC = GetPrivateProfileString(var_ret_15, var_ret_14, var_ret_13, var_ret_12, , ) loc_1101296B: call __vbaLsetFixstr(00000014h, var_B0, var_F4) loc_1101297B: setg cl loc_110129E4: If var_2E0 = 0 Then GoTo loc_1101315F loc_11012A18: var_104 = Global.App loc_11012A4C: var_E0 = Global.Path loc_11012A8E: var_ret_17 = var_E0 & "\Versatile.ini" loc_11012A9C: call __vbaStrFixstr(00000014h, var_88, 00000014h, var_ret_17) loc_11012AE4: var_eax = GetPrivateProfileString("iPLAS", "station", vbNullString, __vbaStrFixstr(00000014h, var_88, 00000014h, var_ret_17), , ) loc_11012B0F: call __vbaLsetFixstr(00000014h, var_88, var_F4) loc_11012B19: setg al loc_11012B79: If var_E0 = 0 Then GoTo loc_1101315F loc_11012B7F: var_1DC = "#SAVE:SNE,FAIL," loc_11012BB3: call __vbaVarVargNofree(00000001h) loc_11012BC6: call InStr(var_114, 00000001h, var_1E4, __vbaVarVargNofree(00000001h)) loc_11012BE2: InStr(var_114, 00000001h, var_1E4, __vbaVarVargNofree(00000001h)) + 15 = CInt() loc_11012BE8: var_58 = InStr(var_114, 00000001h, var_1E4, __vbaVarVargNofree(00000001h)) + 15 loc_11012C25: var_1EC = var_58 loc_11012C49: call __vbaVarVargNofree(var_58) loc_11012C61: var_134 = Chr(13) & Chr(10) loc_11012C71: call InStr(var_144, 00000000h, var_134, __vbaVarVargNofree(var_58)) loc_11012C86: var_ret_1D = InStr(var_144, 00000000h, var_134, __vbaVarVargNofree(var_58)) - var_58 loc_11012C93: var_60 = CInt() loc_11012CC2: If var_58 <= 15 Then GoTo loc_11012D0A loc_11012CC7: var_1DC = var_60 loc_11012D02: var_C4 = Mid(DATA, var_58, var_60) loc_11012D08: GoTo loc_11012D2C loc_11012D0A: &#39;Referenced from: 11012CC2 loc_11012D26: var_C4 = "No Error Name Define" loc_11012D2C: &#39;Referenced from: 11012D08 loc_11012D35: call __vbaVarVargNofree loc_11012D38: call __vbaStrVarCopy(__vbaVarVargNofree) loc_11012D3E: var_16C = __vbaStrVarCopy(__vbaVarVargNofree) loc_11012D53: call __vbaVarVargNofree loc_11012D56: call __vbaStrVarCopy(__vbaVarVargNofree) loc_11012D5C: var_17C = __vbaStrVarCopy(__vbaVarVargNofree) loc_11012D68: var_22C = "FAIL" loc_11012D81: call __vbaVarVargNofree loc_11012D84: var_ret_1E = CStr(__vbaVarVargNofree) loc_11012D8A: var_18C = var_ret_1E loc_11012DB4: var_E0 = CStr(var_C4) loc_11012DC1: var_10C = Replace(var_E0, vbNullString, vbNullString, 1, -1, 0) loc_11012DEE: var_19C = RTrim(Replace(var_E0, vbNullString, vbNullString, 1, -1, 0)) loc_11012E03: call __vbaVarVargNofree loc_11012E06: call __vbaStrVarCopy(__vbaVarVargNofree) loc_11012E0C: var_1AC = __vbaStrVarCopy(__vbaVarVargNofree) loc_11012E37: call __vbaStrFixstr(00000014h, var_B0, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11012E41: var_E4 = __vbaStrFixstr(00000014h, var_B0, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11012E52: var_E8 = Replace(var_E4, , , , , ) loc_11012E64: call __vbaLsetFixstr(00000014h, var_B0, var_E4) loc_11012E7A: var_12C = var_E8 loc_11012EA7: var_1BC = RTrim(var_E8) loc_11012ECC: call __vbaStrFixstr(00000014h, var_88, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11012ED6: var_EC = __vbaStrFixstr(00000014h, var_88, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11012EE7: var_F0 = Replace(var_EC, , , , , ) loc_11012EF9: call __vbaLsetFixstr(00000014h, var_88, var_EC) loc_11012F0F: var_14C = var_F0 loc_11012F3C: var_1CC = RTrim(var_F0) loc_11012F59: loc_11012F69: loc_110130D0: .DispID_9 loc_1101315F: &#39;Referenced from: 11012752 loc_11013166: call __vbaCastObj(00000000h, var_11005194) loc_11013177: GoTo loc_110146E5 loc_1101317C: &#39;Referenced from: 11011D75 loc_1101319E: var_2D0 = var_20 loc_110131B6: GETERDESC.var_2C8 = PropBag.ReadProperty(Error, var_4C) loc_110131E7: var_2D0 = var_2C loc_110131ED: var_1EC = vbNullString loc_1101320E: var_114 = vbNullString loc_11013217: var_1DC = var_28 loc_11013253: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_11013277: var_1DC = "User cancel the fail upload" loc_11013290: call __vbaVargVarCopy(var_4C, STATION, 8, var_114, var_2C8, var_50, __vbaCastObj(00000000h, var_11005194)) loc_11013296: GoTo loc_110146E5 loc_1101329B: &#39;Referenced from: 11011CA2 loc_1101329B: var_1EC = "tsp_iad1" loc_110132B0: var_20C = "ap_i1sus" loc_110132C0: var_22C = vbNullString loc_110132E8: call __vbaStrFixstr loc_110132F1: var_25C = CLng(__vbaStrFixstr) loc_110133EC: call __vbaVargVar(var_378, var_258) loc_11013447: var_114 = var_50."WTSP_LOGINOUT" loc_1101345F: call edi loc_11013478: var_114 = Chr(127) loc_11013494: var_124 = Split(var_54, var_114, -1, 0) loc_110134A3: var_3C = var_124 loc_110134ED: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_110134F7: var_ret_20 = CInt(__vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8)) loc_11013500: ebx = var_ret_20 - 1 loc_11013507: ebx = var_ret_20 - 1 + 1 loc_1101350A: var_2D0 = var_ret_20 - 1 + 1 loc_1101351F: If var_ret_20 - 1 + 1 = 0 Then GoTo loc_110136F7 loc_11013525: var_1EC = "tsp_iad1" loc_1101353A: var_20C = "ap_i1sus" loc_1101354A: var_22C = vbNullString loc_11013572: call __vbaStrFixstr loc_1101357B: var_25C = CLng(__vbaStrFixstr) loc_11013676: call __vbaVargVar(var_388, var_258) loc_110136D1: var_114 = var_50."WTSP_LOGINOUT" loc_110136E9: call edi loc_110136F7: &#39;Referenced from: 1101351F loc_11013700: var_114 = Chr(0) loc_11013727: call __vbaStrFixstr(00000001h) loc_1101373A: call InStr(var_124, 00000000h, var_114, __vbaStrFixstr(00000001h)) loc_1101374E: var_2D0 = (InStr(var_124, 00000000h, var_114, __vbaStrFixstr(00000001h)) <> 0) loc_11013775: If var_2D0 = 0 Then GoTo loc_11013865 loc_11013793: call __vbaStrFixstr(var_110061B8, ",,", 00000001h, FFFFFFFFh, 00000000h) loc_110137AA: var_10C = Replace(CStr(__vbaStrFixstr(var_110061B8, ",,", 00000001h, FFFFFFFFh, 00000000h)), , , , , ) loc_110137C2: call __vbaVargVarMove loc_110137FC: var_E4 = CStr(Chr(0)) loc_1101380B: call __vbaStrFixstr(var_E4, var_110061B8, 00000001h, FFFFFFFFh, 00000000h) loc_11013822: var_11C = Replace(CStr(__vbaStrFixstr(var_E4, var_110061B8, 00000001h, FFFFFFFFh, 00000000h)), , , , , ) loc_1101383A: call __vbaVargVarMove loc_11013865: &#39;Referenced from: 11013775 loc_11013865: var_20C = "tsp_iad1" loc_1101387A: var_22C = "ap_i1sus" loc_11013893: call __vbaStrFixstr loc_11013896: var_ret_22 = CStr(__vbaStrFixstr) loc_1101389C: var_10C = var_ret_22 loc_110138BA: var_124 = Ucase(var_ret_22) loc_110138C9: call __vbaStrFixstr loc_110138D2: var_25C = CLng(__vbaStrFixstr) loc_110138E1: call __vbaStrFixstr loc_110138EA: var_27C = CInt(__vbaStrFixstr) loc_1101396B: call __vbaVargVar(var_398, var_228) loc_110139E5: call __vbaVargVar(var_3A8, var_258) loc_11013A15: call __vbaVargVar(var_3B8, eax+0000000Ch) loc_11013A64: call __vbaVargVar(var_3C8, var_278) loc_11013A93: var_134 = var_50."WTSP_RESULT" loc_11013AAB: call edi loc_11013AE2: If InStr(1, var_54, "Login First", 0) > 0 Then GoTo loc_1101329B loc_11013AF1: var_114 = Chr(127) loc_11013B1C: var_3C = Split(var_54, var_114, -1, 0) loc_11013B6C: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_11013B9C: var_ret_25 = CInt(var_114) loc_11013BA2: eax = var_ret_25 - 1 loc_11013BA9: eax = var_ret_25 - 1 + 1 loc_11013BAC: var_1FC = var_ret_25 - 1 + 1 loc_11013BD9: var_144 = IIf(var_ret_25 - 1 + 1, 0, 1) loc_11013BE6: var_144 = CInt() loc_11013BEE: var_5C = var_144 loc_11013C5B: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8, 2, 2, var_144) loc_11013C69: call __vbaVargVarMove loc_11013C72: If var_144 <> 0 Then GoTo loc_1101315F loc_11013C93: var_2D0 = var_20 loc_11013CAB: GETERDESC.var_2C8 = PropBag.ReadProperty(Error, var_4C) loc_11013D02: var_114 = vbNullString loc_11013D0B: var_1DC = var_28 loc_11013D47: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_11013D9A: var_104 = Global.App loc_11013DC4: var_E0 = Global.Path loc_11013DF6: call edi(var_4C, STATION, var_1E4, var_114, var_2C8) loc_11013E14: call __vbaStrFixstr(00000014h, var_B0, 00000014h, edi(var_4C, STATION, var_1E4, var_114, var_2C8)) loc_11013E22: call edi loc_11013E2C: var_ret_27 = CInt(8) loc_11013E3B: var_ret_28 = vbNullString loc_11013E4A: var_ret_29 = "project" loc_11013E59: var_ret_2A = "iPLAS" loc_11013E5C: var_eax = GetPrivateProfileString(var_ret_2A, var_ret_29, var_ret_28, var_ret_27, , ) loc_11013E61: var_2CC = GetPrivateProfileString(var_ret_2A, var_ret_29, var_ret_28, var_ret_27, , ) loc_11013E8B: call __vbaLsetFixstr(00000014h, var_B0, var_F4) loc_11013E9B: setg cl loc_11013F04: If var_2E0 = 0 Then GoTo loc_1101315F loc_11013F38: var_104 = Global.App loc_11013F6C: var_E0 = Global.Path loc_11013FA4: call edi loc_11013FBC: call __vbaStrFixstr(00000014h, var_88, 00000014h, CInt(8)) loc_11013FCA: call edi loc_11014004: var_eax = GetPrivateProfileString("iPLAS", "station", vbNullString, CInt(8), , ) loc_1101402F: call __vbaLsetFixstr(00000014h, var_88, var_F4) loc_11014039: setg al loc_11014099: If var_E0 = 0 Then GoTo loc_1101315F loc_1101409F: var_1DC = "#SAVE:SNE,FAIL," loc_110140D3: call __vbaStrFixstr(00000001h) loc_110140E6: call InStr(var_114, 00000001h, var_1E4, __vbaStrFixstr(00000001h)) loc_11014102: InStr(var_114, 00000001h, var_1E4, __vbaStrFixstr(00000001h)) + 15 = CInt() loc_11014108: var_58 = InStr(var_114, 00000001h, var_1E4, __vbaStrFixstr(00000001h)) + 15 loc_11014145: var_1EC = var_58 loc_11014169: call __vbaStrFixstr(var_58) loc_11014181: var_134 = Chr(13) & Chr(10) loc_11014191: call InStr(var_144, 00000000h, var_134, __vbaStrFixstr(var_58)) loc_110141A6: var_ret_32 = InStr(var_144, 00000000h, var_134, __vbaStrFixstr(var_58)) - var_58 loc_110141B3: var_60 = CInt() loc_110141E2: If var_58 <= 15 Then GoTo loc_1101422A loc_110141E7: var_1DC = var_60 loc_11014222: var_C4 = Mid(DATA, var_58, var_60) loc_11014228: GoTo loc_1101424C loc_1101422A: &#39;Referenced from: 110141E2 loc_11014246: var_C4 = "No Error Name Define" loc_1101424C: &#39;Referenced from: 11014228 loc_11014255: call __vbaStrFixstr loc_11014258: call __vbaStrVarCopy(__vbaStrFixstr) loc_1101425E: var_16C = __vbaStrVarCopy(__vbaStrFixstr) loc_11014273: call __vbaStrFixstr loc_11014276: call __vbaStrVarCopy(__vbaStrFixstr) loc_1101427C: var_17C = __vbaStrVarCopy(__vbaStrFixstr) loc_11014288: var_22C = "FAIL" loc_110142A1: call __vbaStrFixstr loc_110142AA: var_18C = CStr(__vbaStrFixstr) loc_110142D4: var_E0 = CStr(var_C4) loc_110142E1: var_10C = Replace(var_E0, vbNullString, vbNullString, 1, -1, 0) loc_110142FB: var_124 = RTrim(Replace(var_E0, vbNullString, vbNullString, 1, -1, 0)) loc_1101430E: var_19C = var_124 loc_11014323: call __vbaStrFixstr loc_11014326: call __vbaStrVarCopy(__vbaStrFixstr) loc_1101432C: var_1AC = __vbaStrVarCopy(__vbaStrFixstr) loc_11014357: call __vbaStrFixstr(00000014h, var_B0, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11014361: call edi loc_11014372: call edi loc_11014384: call __vbaLsetFixstr(00000014h, var_B0, var_E4) loc_1101439A: var_12C = var_E8 loc_110143C7: var_1BC = RTrim(var_E8) loc_110143EC: call __vbaStrFixstr(00000014h, var_88, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_110143F6: call edi loc_11014407: call edi loc_11014419: call __vbaLsetFixstr(00000014h, var_88, var_EC) loc_1101442F: var_14C = var_F0 loc_1101445C: var_1CC = RTrim(var_F0) loc_11014477: If var_1101D064 <> 0 Then GoTo loc_11012F69 loc_1101447D: GoTo loc_11012F59 loc_11014482: &#39;Referenced from: 11011BBE loc_110144B8: var_104 = Global.App loc_110144E2: var_E0 = Global.Path loc_11014516: call edi loc_11014520: var_10C = 16392 & "\Versatile.ini" loc_1101453A: call __vbaVargVarMove loc_110145A3: var_114 = "SFIS warning" loc_110145D0: call edi(var_114, var_124, var_134) loc_110145DF: call edi(edi(var_114, var_124, var_134)) loc_110145EC: call edi loc_110145EF: var_ret_34 = CLng(16392) loc_1101467C: var_114 = vbNullString loc_11014685: var_1DC = var_28 loc_110146C1: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_110146E5: &#39;Referenced from: 11013177 loc_110146EC: call __vbaCastObj(00000000h, var_110067F8, var_4C, STATION, var_1E4, var_114, var_2C8) loc_110146FD: GoTo loc_1101605F loc_11014702: &#39;Referenced from: 110118B0 loc_11014731: var_104 = Global.App loc_1101475B: var_E0 = Global.Path loc_1101478D: call edi(var_20, __vbaCastObj(00000000h, var_110067F8, var_4C, STATION, var_1E4, var_114, var_2C8)) loc_110147AB: call __vbaStrFixstr(0000000Ah, var_DC, 0000000Ah, edi(var_20, __vbaCastObj(00000000h, var_110067F8, var_4C, STATION, var_1E4, var_114, var_2C8))) loc_110147B9: call edi loc_110147C3: var_ret_36 = CInt(16392) loc_110147D2: var_ret_37 = vbNullString loc_110147E1: var_ret_38 = "item" loc_110147F0: var_ret_39 = "PASS_ITEM" loc_110147F3: var_eax = GetPrivateProfileString(var_ret_39, var_ret_38, var_ret_37, var_ret_36, , ) loc_1101481E: call __vbaLsetFixstr(0000000Ah, var_DC, var_F4) loc_11014826: var_ret_3B = GetPrivateProfileString(var_ret_39, var_ret_38, var_ret_37, var_ret_36, , ) loc_11014887: If var_ret_3B <= 0 Then GoTo loc_110149DE loc_11014896: call __vbaStrFixstr(0000000Ah, var_DC) loc_110148A4: call edi loc_110148AC: var_1DC = var_E0 loc_110148CE: var_114 = Left(var_E0, var_ret_3B) loc_110148E4: call __vbaLsetFixstr(0000000Ah, var_DC, var_E0) loc_1101493A: call InStr(var_124, ebx, var_114, & 1) loc_1101497F: var_174 = IIf((InStr(var_124, ebx, var_114, & 1) > ""), True, False) loc_11014992: var_C8 = var_174 loc_110149D9: GoTo loc_11014B84 loc_110149DE: &#39;Referenced from: 11014887 loc_11014A00: var_1EC = "Versatile.ini Error!!!" loc_11014A26: var_124 = "Versatile.ini Error!!!" loc_11014A28: var_1DC = "PASS_ITEM setting incorrect, using default setting &#39;S_SFIS&#39;" loc_11014A48: var_114 = "PASS_ITEM setting incorrect, using default setting &#39;S_SFIS&#39;" loc_11014ABA: var_1DC = "S_SFIS" loc_11014AFC: call InStr(var_114, 00000000h, var_1E4, var_174 & 1) loc_11014B1F: var_134 = (InStr(var_114, 00000000h, var_1E4, var_174 & 1) > "") loc_11014B41: var_164 = IIf(var_134, True, False) loc_11014B54: var_C8 = var_134 loc_11014B84: &#39;Referenced from: 110149D9 loc_11014B90: var_ret_40 = CStr( & var_164) loc_11014B9E: call edi loc_11014BBD: var_ret_41 = CStr( &) loc_11014BCB: call edi loc_11014BDE: var_21C = Len(16392) loc_11014C0B: var_22C = var_C8 loc_11014C6C: var_ret_44 = And (Len( & 11) <> 0) And var_C8 loc_11014C77: var_2D0 = CBool(var_ret_44) loc_11014CAF: If CBool(var_ret_44) = 0 Then GoTo loc_11015F9A loc_11014CB5: var_1DC = "TEST","STATUS","VALUE","UCL","LCL" loc_11014D33: var_144 = "TEST","STATUS","VALUE","UCL","LCL" & Chr(13) & Chr(10) loc_11014D3F: call InStr(var_154, 00000000h, var_144, & 1) loc_11014D53: var_2D0 = (InStr(var_154, 00000000h, var_144, & 1) = 0) loc_11014D8F: If var_2D0 = 0 Then GoTo loc_11014E37 loc_11014D95: var_1DC = "TEST","STATUS","VALUE","UCL","LCL" loc_11014E03: var_154 = & & "TEST","STATUS","VALUE","UCL","LCL" & Chr(13) & Chr(10) loc_11014E0A: call __vbaVargVarMove loc_11014E37: &#39;Referenced from: 11014D8F loc_11014E37: var_1EC = "tsp_iad1" loc_11014E4C: var_20C = "ap_i1sus" loc_11014E5C: var_22C = vbNullString loc_11014E8D: var_25C = CLng( &) loc_11014F88: call __vbaVargVar(var_3D8, var_258) loc_11014FE3: var_114 = var_50."WTSP_LOGINOUT" loc_11014FFB: call edi loc_11015014: var_114 = Chr(127) loc_11015030: var_124 = Split(var_54, var_114, -1, 0) loc_1101503F: var_3C = var_124 loc_11015089: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_11015093: var_ret_46 = CInt(__vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8)) loc_1101509C: ebx = var_ret_46 - 1 loc_110150A3: ebx = var_ret_46 - 1 + 1 loc_110150A6: var_2D0 = var_ret_46 - 1 + 1 loc_110150BB: If var_ret_46 - 1 + 1 = 0 Then GoTo loc_11015293 loc_110150C1: var_1EC = "tsp_iad1" loc_110150D6: var_20C = "ap_i1sus" loc_110150E6: var_22C = vbNullString loc_11015117: var_25C = CLng( &) loc_11015212: call __vbaVargVar(var_3E8, var_258) loc_1101526D: var_114 = var_50."WTSP_LOGINOUT" loc_11015285: call edi loc_11015293: &#39;Referenced from: 110150BB loc_1101529C: var_114 = Chr(0) loc_110152D6: call InStr(var_124, 00000000h, var_114, & 1) loc_110152EA: var_2D0 = (InStr(var_124, 00000000h, var_114, & 1) <> 0) loc_11015311: If var_2D0 = 0 Then GoTo loc_11015401 loc_11015346: var_10C = Replace(CStr(",," & var_110061B8), 1, -1, 0, , ) loc_1101535E: call __vbaVargVarMove loc_110153BE: var_11C = Replace(CStr(var_110061B8 & CStr(Chr(0))), 1, -1, 0, , ) loc_110153D6: call __vbaVargVarMove loc_11015401: &#39;Referenced from: 11015311 loc_11015401: var_1FC = "tsp_iad1" loc_11015416: var_21C = "ap_i1sus" loc_11015426: var_23C = vbNullString loc_11015448: var_25C = CLng( &) loc_1101546A: var_27C = CInt( &) loc_110154EB: call __vbaVargVar(var_3F8, var_218) loc_11015566: call __vbaVargVar(var_408, var_258) loc_11015596: call __vbaVargVar(var_418, eax+0000000Ch) loc_110155E5: call __vbaVargVar(var_428, var_278) loc_11015614: var_114 = var_50."WTSP_RESULT" loc_1101562C: call edi loc_1101564F: If InStr(1, var_54, "Login First", 0) > 0 Then GoTo loc_11014E37 loc_1101565E: var_114 = Chr(127) loc_11015689: var_3C = Split(var_54, var_114, -1, 0) loc_110156D9: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8) loc_11015709: var_ret_4A = CInt(var_114) loc_1101570F: eax = var_ret_4A - 1 loc_11015716: eax = var_ret_4A - 1 + 1 loc_11015719: var_1FC = var_ret_4A - 1 + 1 loc_11015746: var_144 = IIf(var_ret_4A - 1 + 1, 0, 1) loc_11015753: var_144 = CInt() loc_1101575B: var_5C = var_144 loc_110157C8: call __vbaVarIndexLoad(var_114, var_3C, 00000001h, var_1D8, 2, 2, var_144) loc_110157D6: call __vbaVargVarMove loc_110157F9: var_4C = "PASS" loc_11015802: If var_144 <> 0 Then GoTo loc_11015F7D loc_11015847: var_114 = vbNullString loc_11015850: var_1DC = var_28 loc_1101588C: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_110158DF: var_104 = Global.App loc_11015909: var_E0 = Global.Path loc_1101593B: call edi(var_4C, STATION, var_1E4, var_114, var_2C8) loc_11015959: call __vbaStrFixstr(00000014h, var_B0, 00000014h, edi(var_4C, STATION, var_1E4, var_114, var_2C8)) loc_11015967: call edi loc_11015971: var_ret_4C = CInt(16392) loc_11015980: var_ret_4D = vbNullString loc_1101598F: var_ret_4E = "project" loc_1101599E: var_ret_4F = "iPLAS" loc_110159A1: var_eax = GetPrivateProfileString(var_ret_4F, var_ret_4E, var_ret_4D, var_ret_4C, , ) loc_110159A6: var_2CC = GetPrivateProfileString(var_ret_4F, var_ret_4E, var_ret_4D, var_ret_4C, , ) loc_110159D0: call __vbaLsetFixstr(00000014h, var_B0, var_F4) loc_110159E0: setg cl loc_11015A49: If var_2E0 = 0 Then GoTo loc_11015F7D loc_11015A7D: var_104 = Global.App loc_11015AB1: var_E0 = Global.Path loc_11015AE9: call edi loc_11015B01: call __vbaStrFixstr(00000014h, var_88, 00000014h, CInt(16392)) loc_11015B0F: call edi loc_11015B49: var_eax = GetPrivateProfileString("iPLAS", "station", vbNullString, CInt(16392), , ) loc_11015B74: call __vbaLsetFixstr(00000014h, var_88, var_F4) loc_11015B7E: setg al loc_11015BDE: If var_E0 = 0 Then GoTo loc_11015F7D loc_11015BF6: call __vbaStrVarCopy( &) loc_11015BF8: var_14C = __vbaStrVarCopy( &) loc_11015C14: call __vbaStrVarCopy( &) loc_11015C16: var_15C = __vbaStrVarCopy( &) loc_11015C27: var_21C = "PASS" loc_11015C43: call __vbaStrVarCopy( &) loc_11015C45: var_16C = __vbaStrVarCopy( &) loc_11015C6F: call __vbaStrFixstr(00000014h, var_B0, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11015C7D: call edi loc_11015C8E: call edi loc_11015CA0: call __vbaLsetFixstr(00000014h, var_B0, var_E0) loc_11015CB6: var_10C = var_E4 loc_11015CE7: var_17C = RTrim(var_E4) loc_11015D10: call __vbaStrFixstr(00000014h, var_88, vbNullString, vbNullString, 00000001h, FFFFFFFFh, 00000000h) loc_11015D1E: call edi loc_11015D2F: call edi loc_11015D41: call __vbaLsetFixstr(00000014h, var_88, var_E8) loc_11015D57: var_12C = var_EC loc_11015D76: var_144 = RTrim(var_EC) loc_11015D81: var_18C = var_144 loc_11015F11: .DispID_9 loc_11015F7D: &#39;Referenced from: 11015802 loc_11015F84: call __vbaCastObj(00000000h, var_11005194) loc_11015F95: GoTo loc_1101605F loc_11015F9A: &#39;Referenced from: 11014CAF loc_11015F9F: var_1DC = vbNullString loc_11015FB9: var_4C = vbNullString loc_11015FF6: var_114 = vbNullString loc_11015FFF: var_1DC = var_28 loc_1101603B: Save_Data.DATA = PropBag.ReadProperty(ISN, DEV) loc_1101605F: &#39;Referenced from: 110146FD loc_11016066: call __vbaCastObj(00000000h, var_11006ADC, var_4C, STATION, var_1E4, var_114, var_2C8, var_50, __vbaCastObj(00000000h, var_11005194)) loc_1101607E: GoTo loc_110160A2 loc_11016080: &#39;Referenced from: 1101179C loc_11016083: var_1DC = vbNullString loc_1101609C: call __vbaVargVarCopy(var_2C, __vbaCastObj(00000000h, var_11006ADC, var_4C, STATION, 8, var_114, var_2C8, var_50, __vbaCastObj(00000000h, var_11005194))) loc_110160A2: &#39;Referenced from: 1101178F loc_110160A6: If var_5C = 0 Then GoTo loc_11016157 loc_110160EA: var_114 = "SFIS warning" loc_11016116: setz cl loc_11016146: If ecx = 0 Then GoTo loc_11016157 loc_11016152: GoTo loc_110162A8 loc_11016157: &#39;Referenced from: 110160A6 loc_1101615D: GoTo loc_110162A8 loc_11016169: call __vbaCastObj(00000000h, var_11005194) loc_11016182: var_1DC = "SFIS Test RESULT process error!!" loc_110161A2: call __vbaVargVarCopy(var_50, __vbaCastObj(00000000h, var_11005194)) loc_110161E6: var_134 = "SFIS warning" loc_110161EF: var_1DC = var_54 loc_110161FB: var_1FC = ",retry again?" loc_1101622A: call __vbaVarVargNofree(00000010h, var_134, var_144, var_154) loc_11016256: var_124 = __vbaVarVargNofree(00000010h, var_134, var_144, var_154) & var_54 & ",retry again?" loc_11016261: esi = MsgBox(var_124, , , , ) - 1 loc_11016266: esi = MsgBox(var_124, , , , ) - 1 + 1 loc_11016269: var_2D0 = MsgBox(var_124, , , , ) - 1 + 1 loc_110162A0: If MsgBox(var_124, , , , ) - 1 + 1 = 0 Then GoTo loc_110162C1 loc_110162A8: &#39;Referenced from: 11016152 loc_110162BB: call __vbaVargVarMove loc_110162C1: Exit Sub loc_110162CC: GoTo loc_1101638E loc_1101638D: Exit Sub loc_1101638E: &#39;Referenced from: 110162CC End Function 請幫我轉成VB6
09-24
public static void mapFields(Object target, Map<String, Object> record) { try { var beanInfo = Introspector.getBeanInfo(target.getClass()); for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { if ("class".equals(pd.getName())) continue; var setter = pd.getWriteMethod(); if (setter == null) continue; // 获取字段对象 Field field = null; try { field = target.getClass().getDeclaredField(pd.getName()); } catch (NoSuchFieldException e) { continue; // 跳过不存在的字段 } // 检查@Column注解 Column columnAnnotation = field.getAnnotation(Column.class); String columnName; if (columnAnnotation != null) { columnName = columnAnnotation.name(); // 使用注解指定的列名 } else { columnName = toColumnName(pd.getName()); // 默认转换 } // 获取值并转换 var value = record.get(columnName); var convertedValue = convertValue(value, pd.getPropertyType()); if (convertedValue != null) { setter.invoke(target, convertedValue); } } } catch (Exception e) { e.printStackTrace(); } } 现在需要优化一下 record = {LinkedCaseInsensitiveMap@6234} size = 14 "ROW_NUM" -> {BigDecimal@6261} "1" "WONO" -> "NTFL0MMJE" "CUSTOMERID" -> "S082-CJ1" "LOTID" -> "A06998" "ORDERQTY" -> {BigDecimal@6269} "76" "PRODUCTID" -> "KD27A-7AA" "WAFERLOTIDLIST" -> "Q5C152;" "WAFERIDLIST" -> "07,09,10;" "STATUS" -> "pending" "ENTRYTIME" -> {Timestamp@6279} "2025-11-28 17:32:39.0" "COMPLETETIME" -> null "ISSUETIME" -> null "RETURNTIME" -> null "COMPLETIONTIME" -> null 调用方法后,目前数据是这样: resultList = {ArrayList@6235} size = 1 0 = {AB2WoInfoVo@6233} "AB2WoInfoVo(woNo=NTFL0MMJE, customerId=S082-CJ1, lotId=A06998, orderQty=76, productId=KD27A-7AA, waferLotIdList=Q5C152;, waferIdList=07,09,10;, status=待料中, entryTime=2025-11-28 17:32:39.0, completeTime=null, issueTime=null, returnTime=null, completionTime=null)" woNo = "NTFL0MMJE" customerId = "S082-CJ1" lotId = "A06998" orderQty = "76" productId = "KD27A-7AA" waferLotIdList = "Q5C152;" waferIdList = "07,09,10;" status = "待料中" entryTime = {Timestamp@6279} "2025-11-28 17:32:39.0" completeTime = null issueTime = null returnTime = null completionTime = null 如果时间为空的话,应该是空值 表结构为: @Data public class AB2WoInfoVo { private String woNo; private String customerId; private String lotId; private String orderQty; private String productId; private String waferLotIdList; private String waferIdList; private String status; private Date entryTime; private Date completeTime; private Date issueTime; private Date returnTime; private Date completionTime; }
11-29
修改verticalLine移动时的onPositionChanged函数,获取垂直线与曲线相交点的所有信息,曲线显示的是时间戳与归一化的值,pointMarker要显示的是垂直线与曲线相交最近数据点的圆点,而legendContainer显示的是pointMarker对应数据的实际值,而不是归一化值,修改下面的qml,给出完整的代码 onPositionChanged修改思路是: 先通过mouse获取X轴的值,然后通过随便一条曲线的X轴,获取最邻近数据点的X轴时间戳,通过chartPopup.channelDataList的时间戳获取所有曲线的真实值以及在曲线中Y轴坐标,保存在closestPoints面 //DataLogShow.qml import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import CsvLogger 1.0 import QtCharts 2.15 Item { // 基准分辨率(设计稿尺寸) property real baseWidth: 1024 property real baseHeight: 600 // 动态计算缩放比例 property real scaleX: width / baseWidth property real scaleY: height / baseHeight property real unifiedScale: Math.max(Math.min(scaleX, scaleY),1) property string mountPath: "" property string curFileName: "" // 文件列表模型 property ListModel fileListModel: ListModel {} CsvLogger { id: csvLogger } CustomVirKeyboard { id: keyboard x: (parent.width - width) / 2 y: Math.max(0, parent.height - height - 20) onAccepted: (text) => { if (target) target.text = text keyVisible = false } } MouseArea { anchors.fill: parent propagateComposedEvents: true onClicked: function(mouse) { var keyboardPos = mapToItem(keyboard, mouse.x, mouse.y) var isOnKeyboard = keyboardPos.x >= 0 && keyboardPos.y >= 0 && keyboardPos.x <= keyboard.width && keyboardPos.y <= keyboard.height var isOnTarget = false if (keyboard.target) { var targetPos = mapToItem(keyboard.target, mouse.x, mouse.y) isOnTarget = targetPos.x >= 0 && targetPos.y >= 0 && targetPos.x <= keyboard.target.width && targetPos.y <= keyboard.target.height } if (!isOnKeyboard && !isOnTarget) keyboard.keyVisible = false else keyboard.keyVisible = true mouse.accepted = false } } Connections { target: csvLogger function onDownloadFile(status, err) { if (status) { usbCompletePopup.labText = "文件已拷贝到" + err; usbCompletePopup.open() } else { usbErrorPopup.labelText = err usbErrorPopup.open() } } function onFilesInfoCompleted(filefullData, fileMaxminData) { var chartData = { channelData: filefullData, channelMaxmin: fileMaxminData } chartPopup.chartData = chartData chartPopup.open() } } function loadCsvFiles() { var csvFiles = csvLogger.getCsvFiles(); fileListModel.clear(); for (var i = 0; i < csvFiles.length; i++) { var fileInfo = csvLogger.getCvsFileInfo(csvFiles[i]); if (!fileInfo.isEmpty && fileInfo.startTime !== "") { fileListModel.append({ filePath: fileInfo.fullName, fileName: fileInfo.fileName, startTime: fileInfo.startTime, endTime: fileInfo.endTime, fileSize: fileInfo.fileSize, lineNumber: fileListModel.count + 1 }); } } } function handleDownloadRequest(fileName) { csvLogger.copyFile(fileName) } function handleRenameFile(filePath, newName) { csvLogger.renameFile(filePath, newName) } function analyzeCsvFile(filePath) { console.log("[analyzeCsvFile] 开始分析文件:", filePath) csvLogger.readChannelDataFromFile(filePath) } Popup { id: chartPopup width: 800 height: 500 anchors.centerIn: parent closePolicy: Popup.CloseOnEscape modal: true property bool isLarge: false property bool isTable: false property var chartData: ({}) property var channelDataList: [] property var channelDataMinMax: [] property bool hasValidData: false property int horizontalGridLines: 6 background: Rectangle { anchors.fill: parent color: "#212529" radius: 5 border.color: "#555555" border.width: 1 } onChartDataChanged: { if (chartData.channelData && chartData.channelMaxmin) { channelDataList = chartData.channelData channelDataMinMax = chartData.channelMaxmin validateData() Qt.callLater(chartView.updateChart) } } function validateData() { var valid = (channelDataList.length > 0 && channelDataMinMax.length > 0 && channelDataList.length === channelDataMinMax.length) hasValidData = valid } function getSeriesColor(index) { const colors = [ "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF", "#FFA500", "#800080", "#008000", "#000080", "#808000", "#800000", "#008080", "#9370DB", "#20B2AA", "#1E90FF" ] return colors[index % colors.length] } Row { id: changeAera anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter spacing: 10 Button { id: curveButton text: "曲线视图" width: 120 height: 40 background: Rectangle { color: parent.pressed ? "#404040" : (parent.hovered ? "#353535" : "#4169E1") radius: 4 } onClicked: { chartPopup.isTable = false } contentItem: Text { text: parent.text color: "white" font.pixelSize: 16 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } Button { id: tableButton text: "数据表格" width: 120 height: 40 background: Rectangle { color: parent.pressed ? "#404040" : (parent.hovered ? "#353535" : "#4169E1") radius: 4 } onClicked: { chartPopup.isTable = true } contentItem: Text { text: parent.text color: "white" font.pixelSize: 16 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } Button { text: "关闭" width: 100 height: 40 background: Rectangle { color: parent.pressed ? "#404040" : (parent.hovered ? "#353535" : "#4169E1") radius: 4 } onClicked: { chartPopup.close() } contentItem: Text { text: parent.text color: "white" font.pixelSize: 16 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } } //显示区域 Rectangle { id: dataAera width: parent.width - 20 height: parent.height - changeAera.height - 20 color: "#191919" anchors { top: changeAera.bottom left: parent.left margins: 10 } ChartView { id: chartView width: parent.width - 120 height: parent.height anchors.left: parent.left anchors.top: parent.top visible: !chartPopup.isTable antialiasing: true backgroundColor: "#000000" legend.visible: false animationOptions: ChartView.NoAnimation property real yAxisMin: -5 property real yAxisMax: 105 // 变换控制属性 property real zoomFactor: 1.0 property point panOffset: Qt.point(0, 0) property real zoomStep: 0.01 property real panStep: 30 property int animationDuration: 300 property real xZoomFactor: 1.0 property real zoomInFactor: 1.05 property real zoomOutFactor: 0.95 // 交互式图例和垂直线 Rectangle { id: verticalLine width: 1 height: parent.height color: "white" visible: false z: 10 x: 0 y: 0 property real currentX: 0 property var closestPoints: ({}) } Rectangle { id: legendContainer width: 200 height: Math.min((chartPopup.channelDataList.length + 1) * 18 , chartView.height - 20) color: "#333333" border.color: "#555555" border.width: 1 radius: 5 visible: false z: 10 anchors.top: parent.top anchors.topMargin: 30 Column { anchors.fill: parent anchors.margins: 2 spacing: 2 Text { id: timeLabel width: parent.width color: "white" font { pixelSize: 14; bold: true } horizontalAlignment: Text.AlignHCenter elide: Text.ElideRight } Rectangle { width: parent.width height: 1 color: "#555555" } Repeater { model: Object.keys(verticalLine.closestPoints) Row { spacing: 3 Rectangle { width: 14 height: 14 radius: 7 color: chartPopup.getSeriesColor(parseInt(modelData)) //border.color: "white" //border.width: 2 } Row { spacing: 2 Text { text: chartPopup.channelDataList[modelData].channelName color: "white" font.pixelSize: 12 } Text { text: verticalLine.closestPoints[modelData].value.toFixed(2) color: "#AAAAAA" font.pixelSize: 12 } } } } } } Repeater { model: Object.keys(verticalLine.closestPoints) Rectangle { id: pointMarker width: 10 height: 10 radius: 5 color: chartPopup.getSeriesColor(parseInt(modelData)) visible: verticalLine.visible x: { var closestPoint = verticalLine.closestPoints[modelData]; if (!closestPoint) return 0; var seriesIndex = parseInt(modelData); var series = chartView.seriesAt(seriesIndex); if (!series || series.count === 0) return 0; var point = Qt.point( closestPoint.x, closestPoint.y ); var pos = chartView.mapToPosition(point, series); return pos.x - width / 2; } y: { var closestPoint = verticalLine.closestPoints[modelData]; if (!closestPoint) return 0; var seriesIndex = parseInt(modelData); var series = chartView.seriesAt(seriesIndex); if (!series || series.count === 0) return 0; var point = Qt.point( closestPoint.x, closest.y ); var pos = chartView.mapToPosition(point, series); return pos.y - height / 2; // 中心对齐 } } } MouseArea { anchors.fill: parent hoverEnabled: true //propagateComposedEvents: true onPositionChanged: function(mouse) { if (!chartPopup.hasValidData) return; var series = chartView.mapToSeries(Qt.point(mouse.x, mouse.y)) if (typeof series !== "undefined") { console.log("Clicked on series:", series.name) var chartPoint = chartView.mapToValue(Qt.point(mouse.x, mouse.y)) var xValue = chartPoint.x var closestPoint = null var minDistance = Infinity for (var i = 0; i < series.count; i++) { var point = series.at(i) var distance = Math.abs(point.x - xValue) if (distance < minDistance) { minDistance = distance closestPoint = point } } if (closestPoint) { var currentTime = chartView.mapToPosition(Qt.point(closestPoint.x, closestPoint.y), series).x var currentValue = chartView.mapToPosition(Qt.point(closestPoint.x, closestPoint.y), series).y timeLabel.text = Qt.formatDateTime(new Date(currentTime), "yyyy-MM-dd hh:mm:ss.zzz"); } var closestPoints = {}; for (var i = 0; i < chartPopup.channelDataList.length; i++) { var channel = chartPopup.channelDataList[i]; var range = chartPopup.channelDataMinMax[i]; if (!channel.points || !range) continue; var closestPoint = findClosestPoint(channel.points, currentTime); if (closestPoint) { closestPoints[i] = { x: closestPoint.timestamp, y: ((closestPoint.value - range.minValue) / (range.maxValue - range.minValue)) * 100, value: closestPoint.value }; } } verticalLine.closestPoints = closestPoints; updateLegendPosition(mouse.x); } else { console.log("Clicked on no series.") } var timeRange = axisX.max.getTime() - axisX.min.getTime(); var chartPoint = chartView.mapToValue(Qt.point(mouse.x, mouse.y)) var xValue = chartPoint.x var relX = mouse.x; var currentTime = axisX.min.getTime() + relX * timeRange; } /* onPositionChanged: function(mouse) { if (!chartPopup.hasValidData) return; // 更新垂直线位置 verticalLine.currentX = mouse.x; verticalLine.x = mouse.x; verticalLine.visible = true; // 将鼠标坐标转换为图表值 var mouseValue = chartView.mapToValue(Qt.point(mouse.x, 0)); var currentTime = mouseValue.x; // 更新图例时间显示 timeLabel.text = Qt.formatDateTime(new Date(currentTime), "yyyy-MM-dd hh:mm:ss.zzz"); // 查找每条曲线上最近的点 var closestPoints = {}; var seriesList = chartView.series(); for (var i = 0; i < seriesList.length; i++) { var series = seriesList[i]; var closestPoint = findClosestPoint(series, currentTime); if (closestPoint) { closestPoints[i] = closestPoint; } } verticalLine.closestPoints = closestPoints; updateLegendPosition(mouse.x); } */ onExited: { verticalLine.visible = false; legendContainer.visible = false; } onPressed: function(mouse) { mouse.accepted = false; } onReleased: function(mouse) { mouse.accepted = false; } function findClosestPoint(points, targetTime) { if (!points || points.length === 0) return null; var low = 0; var high = points.length - 1; var closest = null; var minDiff = Infinity; while (low <= high) { var mid = Math.floor((low + high) / 2); var point = points[mid]; var diff = Math.abs(point.timestamp - targetTime); if (diff < minDiff) { minDiff = diff; closest = point; } if (point.timestamp < targetTime) { low = mid + 1; } else { high = mid - 1; } } return closest; } // 更新图例位置 function updateLegendPosition(mouseX) { legendContainer.visible = true; if (mouseX < width / 2) { legendContainer.anchors.left = undefined; legendContainer.anchors.right = parent.right; legendContainer.anchors.rightMargin = 10; } else { legendContainer.anchors.right = undefined; legendContainer.anchors.left = parent.left; legendContainer.anchors.leftMargin = 10; } } } transform: [ Scale { id: scaleTransform origin.x: width/2 origin.y: height/2 xScale: chartView.zoomFactor yScale: chartView.zoomFactor }, Translate { id: translateTransform x: chartView.panOffset.x y: chartView.panOffset.y } ] Behavior on xZoomFactor { NumberAnimation { duration: chartView.animationDuration easing.type: Easing.InOutQuad } } Behavior on panOffset { PropertyAnimation { duration: chartView.animationDuration easing.type: Easing.InOutQuad } } function resetView() { zoomFactor = 1.0 panOffset = Qt.point(0, 0) if (chartPopup.channelDataMinMax.length > 0) { var range = chartPopup.channelDataMinMax[0] axisX.min = new Date(range.minTimestamp) axisX.max = new Date(range.maxTimestamp) axisY.min = chartView.yAxisMin axisY.max = chartView.yAxisMax } } function msToDateTime(ms) { return new Date(ms) } function formatFullDateTimeWithMs(timestamp) { if (!timestamp) return "N/A" var date = new Date(timestamp) return Qt.formatDateTime(date, "yyyy-MM-dd hh:mm:ss.zzz") } function xZoomIn() { xZoomFactor = Math.max(0.05, xZoomFactor - zoomStep) updateXAxisRange() } function xZoomOut() { xZoomFactor = Math.min(10.0, xZoomFactor + zoomStep) updateXAxisRange() } function updateXAxisRange() { if (!axisX || chartPopup.channelDataMinMax.length === 0) return var centerTimeMs = (axisX.max.getTime() + axisX.min.getTime()) / 2 var totalRangeMs = chartPopup.channelDataMinMax[0].maxTimestamp - chartPopup.channelDataMinMax[0].minTimestamp var visibleRangeMs = totalRangeMs * xZoomFactor axisX.min = msToDateTime(centerTimeMs - visibleRangeMs/2) axisX.max = msToDateTime(centerTimeMs + visibleRangeMs/2) } function adjustXAxisRange(pixelDelta) { if (!axisX) return var timeRangeMs = axisX.max.getTime() - axisX.min.getTime() var msPerPixel = timeRangeMs / width var msDelta = pixelDelta * msPerPixel var newMinMs = axisX.min.getTime() + msDelta var newMaxMs = axisX.max.getTime() + msDelta if (chartPopup.channelDataMinMax.length > 0) { var dataMinMs = chartPopup.channelDataMinMax[0].minTimestamp var dataMaxMs = chartPopup.channelDataMinMax[0].maxTimestamp if (newMinMs < dataMinMs) { newMinMs = dataMinMs newMaxMs = newMinMs + timeRangeMs } if (newMaxMs > dataMaxMs) { newMaxMs = dataMaxMs newMinMs = newMaxMs - timeRangeMs } } axisX.min = msToDateTime(newMinMs) axisX.max = msToDateTime(newMaxMs) } function updateChart() { removeAllSeries() if (!chartPopup.hasValidData) return for (var i = 0; i < chartPopup.channelDataList.length; i++) { var channel = chartPopup.channelDataList[i] var range = chartPopup.channelDataMinMax[i] if (!channel.points || !range) continue var series = createSeries(ChartView.SeriesTypeLine, channel.channelName || `通道 ${i+1}`, axisX, axisY) series.color = chartPopup.getSeriesColor(i) series.width = 2 axisX.min = new Date(range.minTimestamp) axisX.max = new Date(range.maxTimestamp) //var maxPoints = 2000 //var step = Math.max(1, Math.floor(channel.points.length / maxPoints)) //var step = for (var j = 0; j < channel.points.length; j++) { var point = channel.points[j] if (typeof point.value === "number") { var xValue = point.timestamp var yValue = ((point.value - range.minValue) / (range.maxValue - range.minValue)) * 100 series.append(xValue, yValue) } } } } // 设置X轴 DateTimeAxis { id: axisX format: "hh:mm:ss.zzz" gridVisible: true labelsBrush: Qt.rgba(1, 1, 1, 1) gridLineColor: Qt.rgba(1, 1, 1, 0.1) tickCount: 5 //onMinChanged: console.log("X轴最小值更新:", chartView.formatFullDateTimeWithMs(axisX.min)) //onMaxChanged: console.log("X轴最大值更新:", chartView.formatFullDateTimeWithMs(axisX.max)) } // 设置Y轴(百分比) ValueAxis { id: axisY min: chartView.yAxisMin max: chartView.yAxisMax titleText: "百分比(%)" titleBrush: Qt.rgba(1, 1, 1, 1) labelsBrush: Qt.rgba(1, 1, 1, 1) gridLineColor: Qt.rgba(1, 1, 1, 0.1) tickCount: chartPopup.horizontalGridLines minorTickCount: 0 } MultiPointTouchArea { anchors.fill: parent minimumTouchPoints: 1 maximumTouchPoints: 2 //property real lastX1: 0 //property real lastX2: 0 //property real baseRange: 0 property point touchPoint1 property point touchPoint2 property real initialDistance: 0 property real initialZoom: 1.0 property real initialXZoom: 1.0 property bool isZoomingX: false onPressed: (touchPoints) => { if (touchPoints.length === 1) { touchPoint1 = Qt.point(touchPoints[0].x, touchPoints[0].y) } else if (touchPoints.length === 2) { touchPoint1 = Qt.point(touchPoints[0].x, touchPoints[0].y) touchPoint2 = Qt.point(touchPoints[1].x, touchPoints[1].y) initialDistance = Math.sqrt( Math.pow(touchPoint1.x - touchPoint2.x, 2) + Math.pow(touchPoint1.y - touchPoint2.y, 2) ) var angle = Math.atan2( Math.abs(touchPoint1.y - touchPoint2.y), Math.abs(touchPoint1.x - touchPoint2.x) ) * (180/Math.PI) isZoomingX = (angle < 30) if (isZoomingX) { initialXZoom = xZoomFactor } else { initialZoom = zoomFactor } } } onUpdated: (touchPoints) => { // 单指拖动 - 平移 if (touchPoints.length === 1) { var dx = touchPoints[0].x - touchPoint1.x chartView.adjustXAxisRange(-dx * 0.5) touchPoint1 = Qt.point(touchPoints[0].x, touchPoints[0].y) } // 双指缩放 else if (touchPoints.length === 2) { var currentDistance = Math.sqrt( Math.pow(touchPoints[0].x - touchPoints[1].x, 2) + Math.pow(touchPoints[0].y - touchPoints[1].y, 2) ) if (isZoomingX) { xZoomFactor = initialXZoom * (currentDistance / initialDistance) } else { zoomFactor = initialZoom * (currentDistance / initialDistance) } } } onReleased: (touchPoints) => { // 单击处理(可选) if (touchPoints.length === 1 && !touchPoint1.pressed) { // 可以添加单击事件处理 } } } } Column { id: imagesAera width: 100 height: 175 anchors.right: parent.right anchors.rightMargin: 10 anchors.top: parent.top anchors.topMargin: 10 spacing: 5 Row { width: parent.width spacing: 5 Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: zoomInImg source: "qrc:/images/zoomIn.svg" width: 36 height: 36 anchors.centerIn: parent cache: true MouseArea { anchors.fill: parent onClicked: { chartView.zoom(chartView.zoomInFactor) } } } } Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: zoomOutImg source: "qrc:/images/zoomOut.svg" width: 36 * scaleX height: 36 * scaleY cache: true anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: { chartView.zoom(chartView.zoomOutFactor) } } } } } Row { spacing: 5 Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: moveLeftImg source: "qrc:/images/moveRight.svg" width: 36 * scaleX height: 36 * scaleY rotation: 180 cache: true anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: chartView.scrollLeft(10) } } } Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: moveRightImg source: "qrc:/images/moveRight.svg" width: 36 * scaleX height: 36 * scaleY cache: true anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: chartView.scrollRight(10) } } } } Row { width: parent.width spacing: 5 Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: xZoomInImg source: "qrc:/images/xZoomIn.svg" width: 36 * scaleX height: 36 * scaleY cache: true anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: chartView.xZoomIn() } } } Rectangle { width: 40 height: 40 color: "#333333" radius: 4 border.color: "#555555" border.width: 1 Image { id: xZoomOutImg source: "qrc:/images/xZoomOut.svg" width: 36 * scaleX height: 36 * scaleY cache: true anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: chartView.xZoomOut() } } } } Button { id: resetButton text: "X-Y复位" width: 85 height: 40 background: Rectangle { color: "#1296db" radius: 4 } onClicked: { chartView.resetView() //chartView.zoomReset() } contentItem: Text { text: parent.text color: "white" font.pixelSize: 16 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter anchors.fill: parent } } } } Component { id: chartPage Rectangle { color: "#2E2E2E" anchors.fill: parent Text { text: "📊 图表/表格页面" color: "white" font.pixelSize: 18 anchors.centerIn: parent } } } } Component.onCompleted: { loadCsvFiles(); } // 背景层 Rectangle { id: background anchors.fill: parent color: "#000000" } // 顶部菜单栏 Rectangle { id: menuBar height: 50 * scaleY anchors { top: parent.top left: parent.left right: parent.right } color: "#212529" Image { id: homeButton source: "qrc:/images/backHomePage.svg" width: 36 * scaleX height: 36 * scaleY anchors { top: parent.top topMargin: 7 * scaleY left: parent.left leftMargin: 20 * scaleX } cache: true MouseArea { anchors.fill: parent onClicked: { mainLoader.source = "qml/StoragePage.qml" } } } Text { width: 60 * scaleX height: 40 * scaleY color: "#ffffffff" text: "监测记录" font { family: "TOPRIE-WR-YaHei" pixelSize: 28 * unifiedScale } anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } Image { id: imageLayout source: "qrc:/images/layout.svg" width: 30 * scaleX height: 30 * scaleY anchors { top: parent.top topMargin: 10 * scaleY right: parent.right rightMargin: 20 * scaleX } cache: true MouseArea { anchors.fill: parent onClicked: { mainLoader.source = "qml/DataLogShowList.qml" } } } } // 主内容区 Rectangle { id: contentArea width: 984 * scaleX height: 521 * scaleY color: "transparent" anchors { top: menuBar.bottom bottom: parent.bottom left: parent.left right: parent.right rightMargin: 20 * scaleX topMargin: 14 * scaleY leftMargin: 20 * scaleX bottomMargin: 15 * scaleY } // 数据表格 Flickable { id: flickable anchors.fill: parent contentWidth: parent.width contentHeight: dataTable.height clip: true boundsBehavior: Flickable.StopAtBounds flickableDirection: Flickable.VerticalFlick Column { id: dataTable width: parent.width anchors { top: parent.top topMargin: 10 * scaleY } spacing: 20 * scaleY Repeater { model: fileListModel delegate: MonitorRecordItem { id: recordDelegate width: parent.width startTime: model.startTime endTime: model.endTime lineNumber: model.lineNumber customName: model.fileName fileSize: model.fileSize filePath: model.filePath vkeyboard: keyboard onDownloadRequested: handleDownloadRequest onAnalyzeRequested: analyzeCsvFile onRenameRequested: handleRenameFile } } } } } Popup { //导出完成提示 id: usbCompletePopup width: parent.width * 0.6 height: 120 anchors.centerIn: parent closePolicy: Popup.NoAutoClose background: Rectangle { color: "#212529" radius: 5 border.color: "#555555" border.width: 1 } property string labText: "" Column { width: parent.width * 0.8 anchors.horizontalCenter: parent.horizontalCenter spacing: 20 Label { width: parent.width text: usbCompletePopup.labText font.pixelSize: 20 color: "white" wrapMode: Text.WordWrap horizontalAlignment: Text.AlignHCenter } Label { width: parent.width text: "下载成功!" font.pixelSize: 22 color: "green" horizontalAlignment: Text.AlignHCenter } } Timer { id: closeTimer interval: 1500 running: usbCompletePopup.visible onTriggered: { usbCompletePopup.close() } } onOpened: closeTimer.restart() } Popup { //导出失败提示 id: usbErrorPopup width: parent.width * 0.6 height: 100 anchors.centerIn: parent closePolicy: Popup.NoAutoClose background: Rectangle { color: "#212529" radius: 5 border.color: "#555555" border.width: 1 } property string labelText: "" Label { anchors.centerIn: parent text: usbErrorPopup.labelText font.pixelSize: 22 color: "red" } Timer { id: errorTimer interval: 2000 running: usbErrorPopup.visible onTriggered: { usbErrorPopup.close() } } onOpened: errorTimer.restart() } }
08-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银狐游戏开发资源2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值