Bom dia Patrick,
Uma forma simples de resolver isso, seria criar uma função que já tem todos esses passos, recebendo o array, posição e valor.
Eu tenho trabalhado bastante com métodos estáticos, pois com isso é possível trabalhar com mais de dez caracteres, deixando os nomes mais explícitos, veja um exemplo:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} DnlArrayUtils
Classe com métodos estáticos e úteis para manipulação de arrays
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
class DnlArrayUtils from longnameclass
static method insertIntoArrayPosition(aArray, xValue, nPosition)
endclass
//-------------------------------------------------------------------
/*/{Protheus.doc} insertIntoArrayPosition
Insere um item no array na posição indicada
@param aArray Array que será manipulado
@param xValue Valor que será inserido no array
@param nPosition Posição que o valor será inserido
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method insertIntoArrayPosition(aArray, xValue, nPosition) class DnlArrayUtils
aAdd(aArray, nil)
AIns(aArray, nPosition)
aArray[nPosition] := xValue
return nil
Com isso você pode chamar esse método a qualquer momento sem efetuar a instância da classe:
DnlArrayUtils():insertIntoArrayPosition(aArray, 55, 6)
Uma outra forma, seria você criar uma classe semelhante a um arraylist, dessa forma você consegue criar novos comportamentos sempre que necessário, tratar erros etc:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} DnlArray
Classe similar a um arraylist
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
class DnlArray from longnameclass
private data aArray as array
private data nSize as numeric
method new() constructor
method add(xValue)
method insertPos(xValue, nPos)
method delPos(nPos)
method delValue(xValue)
method size()
method contains(xValue)
method indexOf(xValue)
method get(nPos)
method getArray()
method clear()
method destroy()
endclass
//-------------------------------------------------------------------
/*/{Protheus.doc} new
Método construtor da classe
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method new() class DnlArray
self:aArray := Array(0)
self:nSize := 0
return self
//-------------------------------------------------------------------
/*/{Protheus.doc} add
Adiciona um valor no final do array
@param xValue Valor que será inserido no array
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method add(xValue) class DnlArray
aAdd(self:aArray, xValue)
self:nSize++
return nil
//-------------------------------------------------------------------
/*/{Protheus.doc} insertPos
Adiciona um valor no array na posição indicada
@param xValue Valor que será inserido no array
@param nPos Posição que o valor será inserido
@return lRet Indica se a inserção foi efetuada
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method insertPos(xValue, nPos) class DnlArray
local lRet as logical
if nPos >= self:nSize
self:nSize++
DnlArrayUtils():insertIntoArrayPosition(self:aArray, xValue, nPos)
// O método acima contém a lógica abaixo
// self:add(nil)
// AIns(self:aArray, nPos)
// self:aArray[nPos] := xValue
else
lRet := .T.
endif
return lRet
//-------------------------------------------------------------------
/*/{Protheus.doc} delPos
Remove um item do array conforme posição
@param nPos Posição que o valor será removido
@return lRet Indica se a deleção foi efetuada
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method delPos(nPos) class DnlArray
local lRet as logical
if self:nSize >= nPos .And. nPos > 0
self:nSize--
aDel(self:aArray, nPos)
aSize(self:aArray, self:nSize)
lRet := .T.
else
lRet := .F.
endif
return lRet
//-------------------------------------------------------------------
/*/{Protheus.doc} delValue
Remove um item do array conforme o valor enviado
@param xValue Valor que será removido
@return lRet Indica se a deleção foi efetuada
@obs O primeiro valor encontrado será removido
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method delValue(xValue) class DnlArray
local lRet as logical
local nPos as numeric
nPos := getPosition(self:aArray, xValue)
if nPos > 0
lRet := self:delPos(nPos)
else
lRet := .F.
endif
return lRet
//-------------------------------------------------------------------
/*/{Protheus.doc} size
Retorna o tamanho do array
@return Númerico - Tamanho do array
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method size() class DnlArray
return self:nSize
//-------------------------------------------------------------------
/*/{Protheus.doc} contains
Retorna se o valor informado existe no array
@param xValue Valor que será pesquisado
@return lExist Indica se o valor existe no array
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method contains(xValue) class DnlArray
local lExist as logical
if self:nSize > 0
lExist := getPosition(self:aArray, xValue) > 0
else
lExist := .F.
endif
return lExist
//-------------------------------------------------------------------
/*/{Protheus.doc} indexOf
Retorna a posição do valor informado
@param xValue Valor que será pesquisado
@return nPos Posição que o valor foi encontrado
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method indexOf(xValue) class DnlArray
return getPosition(self:aArray, xValue)
//-------------------------------------------------------------------
/*/{Protheus.doc} getPosition
Função auxiliar que retorna a posição de um valor no array
@param aArray Array que será utilizada na pesquisa de valores
@param xValue Valor que será pesquisado
@return nPos Posição que o valor foi encontrado
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
static function getPosition(aArray, xValue)
local cType as char
local nPos as numeric
cType := ValType(xValue)
nPos := aScan(aArray, {|xVlr| ValType(xVlr) == cType .And. xVlr == xValue})
return nPos
//-------------------------------------------------------------------
/*/{Protheus.doc} get
Retorna o valor do array na posição indicada
@param nPos Posição de retorno do array
@return xValue Valor na posição encontrada
@obs Retorna nul em caso de posição inválida
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method get(nPos) class DnlArray
local xValue
if self:nSize >= nPos
xValue := self:aArray[nPos]
endif
return xValue
//-------------------------------------------------------------------
/*/{Protheus.doc} getArray
Retorna uma cópia do array
@return Array - Cópia do array
@obs Retorna uma cópia para evitar problemas de referência
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method getArray() class DnlArray
return aClone(self:aArray)
//-------------------------------------------------------------------
/*/{Protheus.doc} clear
Efetua a limpeza do array
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method clear() class DnlArray
aSize(self:aArray, 0)
self:nSize := 0
return nil
//-------------------------------------------------------------------
/*/{Protheus.doc} destroy
Efetua a limpeza do array e o free da instância da classe
@author Daniel Mendes
@since 28/11/2019
@version 1.0
/*/
//-------------------------------------------------------------------
method destroy() class DnlArray
self:clear()
self:aArray := nil
freeObj(self)
return nil
Abaixo um exemplo de uso da classe:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} DnlArrExp
Função para teste da classe DnlArray, que simula um arraylist
@author Daniel Mendes
@since 25/09/2019
@version 1.0
/*/
//-------------------------------------------------------------------
user function DnlArrExp()
local oArray as object
local nI as numeric
oArray := DnlArray():New()
oArray:add(10)
oArray:add(20)
oArray:add(30)
oArray:add(40)
oArray:add(50)
oArray:add(70)
oArray:insertPos(60, 6)
ConOut("Tamanho: ", oArray:size())
ConOut("Posicao 6: ", oArray:get(6))
for nI := 1 to oArray:size()
ConOut("[" + cValToChar(nI) + "] : " + cValToChar(oArray:get(nI)))
next
ConOut("Existe o valor 70?", oArray:contains(70))
ConOut("Existe o valor 90?", oArray:contains(90))
ConOut("Qual a posicao do valor 50?", oArray:indexOf(50))
ConOut("Array limpo")
oArray:clear()
ConOut("Tamanho: ", oArray:size())
oArray:destroy()
return nil
Fontes: https://github.com/Dadinel/advpl_examples