Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору type PACCOUNT_INFO_EX = ^ACCOUNT_INFO_EX; ACCOUNT_INFO_EX = record bUpdateState : Boolean; clsid : TGUID; dwEqualIndex : Integer; pszAccount : LPWSTR; cchAccountMax : Integer; pszLogin : LPWSTR; cchLoginMax : Integer; pszPassword : LPWSTR; cchPasswordMax : Integer; fBalance : Double; fOverdraft : Double; pszTarif : LPWSTR; cchTarifMax : Integer; pszUpdated : LPWSTR; cchUpdatedMax : Integer; dwTarifDays : Integer; dwTarifDaysLeft: Integer; dwErrorCode : Integer; pszError : LPWSTR; cchErrorMax : Integer; bYellowAlert : Boolean; fYellowAlert : Double; bRedAlert : Boolean; fRedAlert : Double; end; type TAccountInfoExArr = Array of ACCOUNT_INFO_EX; // procedure AllocDataItem(var ptrInfo: ACCOUNT_INFO_EX); begin GetMem(ptrInfo.pszAccount, ptrInfo.cchAccountMax); GetMem(ptrInfo.pszLogin, ptrInfo.cchLoginMax); GetMem(ptrInfo.pszPassword, ptrInfo.cchPasswordMax); GetMem(ptrInfo.pszTarif, ptrInfo.cchTarifMax); GetMem(ptrInfo.pszUpdated, ptrInfo.cchUpdatedMax); GetMem(ptrInfo.pszError, ptrInfo.cchErrorMax); end; // procedure FreeDataItem(var ptrInfo: ACCOUNT_INFO_EX); begin FreeMem(ptrInfo.pszAccount, ptrInfo.cchAccountMax); FreeMem(ptrInfo.pszLogin, ptrInfo.cchLoginMax); FreeMem(ptrInfo.pszPassword, ptrInfo.cchPasswordMax); FreeMem(ptrInfo.pszTarif, ptrInfo.cchTarifMax); FreeMem(ptrInfo.pszUpdated, ptrInfo.cchUpdatedMax); FreeMem(ptrInfo.pszError, ptrInfo.cchErrorMax); ptrInfo.pszAccount := nil; ptrInfo.pszLogin := nil; ptrInfo.pszPassword := nil; ptrInfo.pszTarif := nil; ptrInfo.pszUpdated := nil; ptrInfo.pszError := nil; end; // procedure CopyDataItem(var DestInfo: ACCOUNT_INFO_EX; const SrcInfo: ACCOUNT_INFO_EX); begin lstrcpynW(DestInfo.pszAccount, SrcInfo.pszAccount, DestInfo.cchAccountMax); lstrcpynW(DestInfo.pszLogin, SrcInfo.pszLogin, DestInfo.cchLoginMax); lstrcpynW(DestInfo.pszPassword, SrcInfo.pszPassword, DestInfo.cchPasswordMax); lstrcpynW(DestInfo.pszTarif, SrcInfo.pszTarif, DestInfo.cchTarifMax); lstrcpynW(DestInfo.pszUpdated, SrcInfo.pszUpdated, DestInfo.cchUpdatedMax); lstrcpynW(DestInfo.pszError, SrcInfo.pszError, DestInfo.cchErrorMax); end; // procedure CopyArrayItem(var DestInfo: ACCOUNT_INFO_EX; const SrcInfo: ACCOUNT_INFO_EX); begin CopyMemory(@DestInfo, @SrcInfo, SizeOf(ACCOUNT_INFO_EX)); AllocDataItem(DestInfo); CopyDataItem(DestInfo, SrcInfo); end; // function InsertArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer; InfoEx: ACCOUNT_INFO_EX): Integer; var IdItem: Integer; iCount: Integer; begin iCount := Length(DynArray); if (IdItemIndex = -1) and (iCount = 0) then Result := 0 else if (IdItemIndex = -1) and (iCount <> 0) then Result := iCount else Result := IdItemIndex; SetLength(DynArray, iCount + 1); for IdItem := iCount downto (Result + 1) do DynArray[IdItem] := DynArray[IdItem - 1]; CopyArrayItem(DynArray[Result], InfoEx); end; // function DeleteArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer): Integer; var bRet : Boolean; IdItem: Integer; iCount: Integer; begin Result := -1; bRet := (IdItemIndex >= Low(DynArray)) and (IdItemIndex <= High(DynArray)); if bRet then begin FreeDataItem(DynArray[IdItemIndex]); iCount := Length(DynArray); for IdItem := (IdItemIndex + 1) to (iCount - 1) do DynArray[IdItem - 1] := DynArray[IdItem]; SetLength(DynArray, iCount - 1); Result := Length(DynArray); end; end; // function UpdateArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer; InfoEx: ACCOUNT_INFO_EX): Boolean; var bRet : Boolean; tmpInfo: ACCOUNT_INFO_EX; IdItem : Integer; begin Result := FALSE; bRet := (IdItemIndex >= Low(DynArray)) and (IdItemIndex <= High(DynArray)); if bRet then begin { FreeDataItem( DynArray[IdItemIndex] ); CopyArrayItem( DynArray[IdItemIndex], InfoEx ); Result := True; } CopyArrayItem(tmpInfo, InfoEx); DeleteArrayItem(DynArray, IdItemIndex); IdItem := InsertArrayItem(DynArray, IdItemIndex, tmpInfo); FreeDataItem(tmpInfo); Result := IdItem <> -1; end; end; |