Pegar valores de um ponteiro
Estou tentando fazer um componente antigo funcionar no delphi 7, e para isso preciso de uma ajuda:
O componenente tem uma funcão assim:
function XPTO( Buffer: Pointer): Boolean;
Eu preciso testar o conteúdo de buffer e retornar true ou false.
Como faço para extrair o conteudo desse buffer? Eu tentei:
Mas não dá certo, pois buffer não é oficialmente um ponteiro de integer.
Grato.
O componenente tem uma funcão assim:
function XPTO( Buffer: Pointer): Boolean;
Eu preciso testar o conteúdo de buffer e retornar true ou false.
Como faço para extrair o conteudo desse buffer? Eu tentei:
var res : integer begin res := Buffer^;
Mas não dá certo, pois buffer não é oficialmente um ponteiro de integer.
Grato.
Ronaldo
Curtidas 0
Respostas
Marcelo Saviski
21/03/2005
vc pode fazer um TypeCast para o ponteiro do tipo desejado antes, como:
se fosse outro tipo, talvez um tipo personalizado, 1º vc teria que definir o tipo do ponteiro
if Buffer <> nil then res := PInteger(Buffer)^;
se fosse outro tipo, talvez um tipo personalizado, 1º vc teria que definir o tipo do ponteiro
type PMeuTipo = ^TMeuTipo;
GOSTEI 0
Nildo
21/03/2005
É que você está usando o resultado como Integer, e tem que ser Boolean, de acordo com a declaração
GOSTEI 0
Ronaldo
21/03/2005
É que você está usando o resultado como Integer, e tem que ser Boolean, de acordo com a declaração
res é uma variável que ainda vou trabalhar. Não é meu result.
GOSTEI 0
Nildo
21/03/2005
[quote:4e0b221378=´nildo´]É que você está usando o resultado como Integer, e tem que ser Boolean, de acordo com a declaração
res é uma variável que ainda vou trabalhar. Não é meu result.[/quote:4e0b221378]
A ta.. Nesse caso a dica do Marcelo resolve seu problema
GOSTEI 0
Ronaldo
21/03/2005
[quote:19fb69806f=´Marcelo Saviski´]vc pode fazer um TypeCast para o ponteiro do tipo desejado antes, como:
se fosse outro tipo, talvez um tipo personalizado, 1º vc teria que definir o tipo do ponteiro
[/quote:19fb69806f]
Pois é, é que tenho uma outra agravante: Buffer não é somente integer. Hora pode ser string, hora date, etc.
E ele vem internamente e não dá para eu alterar. Eu só posso testar o seu valor e dizer se aceito ou não.
if Buffer <> nil then res := PInteger(Buffer)^;
se fosse outro tipo, talvez um tipo personalizado, 1º vc teria que definir o tipo do ponteiro
type PMeuTipo = ^TMeuTipo;
Pois é, é que tenho uma outra agravante: Buffer não é somente integer. Hora pode ser string, hora date, etc.
E ele vem internamente e não dá para eu alterar. Eu só posso testar o seu valor e dizer se aceito ou não.
GOSTEI 0
Nildo
21/03/2005
Você quer saber se o Buffer está preenchido com qualquer tipo de informação?
GOSTEI 0
Ronaldo
21/03/2005
Você quer saber se o Buffer está preenchido com qualquer tipo de informação?
Exatamente... HEHE!!
Para ser mais claro, é o seguinte: Buffer é o valor de um TField, e eu preciso saber se ele possui um valor ou se está vazio (null).
GOSTEI 0
Nildo
21/03/2005
Você pode verificar se o
Ponteiro <> nil
Pode tentar também:
if IsValidPointer( Ponteiro, 4 ) then
Ponteiro <> nil
Pode tentar também:
if IsValidPointer( Ponteiro, 4 ) then
GOSTEI 0
Ronaldo
21/03/2005
Você pode verificar se o
Ponteiro <> nil
retorna apenas se o ponteiro está instanciado. No meu caso sempre será true e não me serve.
Pode tentar também:
if IsValidPointer( Ponteiro, 4 ) then
Eu não encontrei essa funcção no delphi 7 e nem no help. Em qual unit ela fica?
valeu.
GOSTEI 0
Nildo
21/03/2005
Bom dexa queto, ele nao ia funcionar mesmo já que ela ja esta inicializada.
Você pode verificar se o conteúdo dele não é ZERO...
Você pode verificar se o conteúdo dele não é ZERO...
if PByte( Ponteiro )^ <> 0 then Tem Alguma Coisa Preenchida
GOSTEI 0
Marco Salles
21/03/2005
o bom de quando o nildo responde e que ele sempre esta ai... A dúvida e quase sempre respondida On_line.. Não tem que esperar Não :P :P :P :P :P :P
GOSTEI 0
Nildo
21/03/2005
Ronaldo, mais uma coisa.. Se o Buffer puder ser preenchido com #0 ( $00 ), você nunca vai poder verificar se está vazio, porque o Buffer quando é alocado, ele inicializa com 0 em todos os bytes do buffer. Logo, se é um ponteiro válido, seu conteúdo vai ser 0 até você preencher ele com alguma coisa.
Um abraço :wink:
Um abraço :wink:
GOSTEI 0
Ronaldo
21/03/2005
Bom dexa queto, ele nao ia funcionar mesmo já que ela ja esta inicializada.
Você pode verificar se o conteúdo dele não é ZERO...
if PByte( Ponteiro )^ <> 0 then Tem Alguma Coisa Preenchida
Blz,
Funcionou. Só tive que trocar o ´0´ pelo ´null´.
Valeu.
GOSTEI 0
Nildo
21/03/2005
Funcionou. Só tive que trocar o ´0´ pelo ´null´.Valeu.
Boa :D
GOSTEI 0