Pegar valores de um ponteiro

Delphi

21/03/2005

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:

var
  res : integer

begin
   res := Buffer^;



Mas não dá certo, pois buffer não é oficialmente um ponteiro de integer.

Grato.


Ronaldo

Ronaldo

Curtidas 0

Respostas

Marcelo Saviski

Marcelo Saviski

21/03/2005

vc pode fazer um TypeCast para o ponteiro do tipo desejado antes, como:

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

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

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

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

Ronaldo

21/03/2005

[quote:19fb69806f=´Marcelo Saviski´]vc pode fazer um TypeCast para o ponteiro do tipo desejado antes, como:

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;
[/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.


GOSTEI 0
Nildo

Nildo

21/03/2005

Você quer saber se o Buffer está preenchido com qualquer tipo de informação?


GOSTEI 0
Ronaldo

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

Nildo

21/03/2005

Você pode verificar se o

Ponteiro <> nil

Pode tentar também:

if IsValidPointer( Ponteiro, 4 ) then


GOSTEI 0
Ronaldo

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

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...

if PByte( Ponteiro )^ <> 0 then
   Tem Alguma Coisa Preenchida



GOSTEI 0
Marco Salles

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

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:


GOSTEI 0
Ronaldo

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

Nildo

21/03/2005

Funcionou. Só tive que trocar o ´0´ pelo ´null´.Valeu.


Boa :D


GOSTEI 0
POSTAR