GARANTIR DESCONTO

Fórum Pegar valores de um ponteiro #273338

21/03/2005

0

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

Responder

Posts

21/03/2005

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;



Responder

Gostei + 0

21/03/2005

Nildo

É que você está usando o resultado como Integer, e tem que ser Boolean, de acordo com a declaração


Responder

Gostei + 0

21/03/2005

Ronaldo

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


Responder

Gostei + 0

21/03/2005

Nildo

[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


Responder

Gostei + 0

21/03/2005

Ronaldo

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


Responder

Gostei + 0

21/03/2005

Nildo

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


Responder

Gostei + 0

21/03/2005

Ronaldo

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


Responder

Gostei + 0

21/03/2005

Nildo

Você pode verificar se o

Ponteiro <> nil

Pode tentar também:

if IsValidPointer( Ponteiro, 4 ) then


Responder

Gostei + 0

21/03/2005

Ronaldo

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.


Responder

Gostei + 0

21/03/2005

Nildo

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



Responder

Gostei + 0

21/03/2005

Marco Salles

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


Responder

Gostei + 0

21/03/2005

Nildo

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:


Responder

Gostei + 0

21/03/2005

Ronaldo

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.


Responder

Gostei + 0

21/03/2005

Nildo

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


Boa :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar