Fórum String X PAnsiChar #357203

15/04/2008

0

Pessoal, estou usando essa código, mas da :incompatible types : ´String´ and ´PAnsiChar´

var
Str: String;
begin
Str:= dm.EDPOSTAGEMETIQUETA.Value;
shellexecute(handle, ´open´, ´http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=´+[b:837df5860d]PChar(Str), [/b:837df5860d]NiL, NiL, SW_SHOWNORMAL);

end;

como resolver?

obrigado, aguardo


Edsant

Edsant

Responder

Posts

15/04/2008

Massuda

tire o Pchar dali... você não precisa converter str para PChar.

Talvez você precise converter para PChar a URL que você está tentando abrir através do shell.


Responder

Gostei + 0

15/04/2008

Psyjacko

Gostaria de saber oque o Pchar faz...poderiam me explicar ?

valeu


Responder

Gostei + 0

16/04/2008

Edsant

certinho,

realmente eu estava colocando o pchar no lugar errado, acontece nas melhores familias...

obrigado massuda...


Responder

Gostei + 0

16/04/2008

Rodc

String é uma classe que manipula texto em memória.
PChar é um ponteiro para o tipo Char.
Char é um caracter apenas, um byte.

Uma string é composta de uma sequência (vetor) de Char onde no fim da sequência têm um #0 (caracter zero) indicando o final do texto.
O Windows trabalha sempre com ponteiros para Char, pois a classe String é do Delphi e o Windows não a conhece. Quando você passa para a função ShellExecute o ponteiro para a sequência de caracteres (endereço de memória do primeiro caracter) o Windows percorre os próximos endereços de memória até encontrar uma posição que tenha o 0, aí ele entende que o texto da mensagem acabou alí.

Consegui explicar direito?


Responder

Gostei + 0

17/04/2008

Psyjacko

string e char eu entendo , Pchar to tentando entender , mas está brabo essa parte de caracter nulo não assimilei direito...no caso onde fica esse caracter nulo ?

por exemplo :
nome : String
nome :=´aeiou´

que caracter nulo seria esse ?
valeu pela atenção :wink:


Responder

Gostei + 0

17/04/2008

Rodc

Tem um teste que eu faço em C++ que dá pra entender o que está na memória, não sei se no Delphi vai funcionar, testa aí:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var nome: String;
    caracter: Char;
begin
  nome := ´rodrigo´;
  caracter := PChar(nome)[0];     // pega o ´r´
  caracter := PChar(nome)[1];     // pega o ´o´
  caracter := PChar(nome)[2];     // pega o ´d´
  caracter := PChar(nome)[3];     // pega o ´r´
  caracter := PChar(nome)[4];     // pega o ´i´
  caracter := PChar(nome)[5];     // pega o ´g´
  caracter := PChar(nome)[6];     // pega o ´o´
  caracter := PChar(nome)[7];     // pega o 0, que apesar de não aparecer no texto está na memória
  caracter := PChar(nome)[8];     // acessa um byte que não pertence mais à string. Esta parte da memória pode ser de outro componente ou função.
end;

Vá em Step-by-Step para ver o valor de ´caracter´.
Quando se faz o PChar, ele retorna o ponteiro para o primeiro byte da string. Quando faço ´PChar(nome)[1];´ o PChar me retorna o primeiro byte e depois anda um byte à frente para pegar a posição 1 do vetor.


Responder

Gostei + 0

17/04/2008

Rodc

Outro exemplo:
:
1
2
3
4
5
6
var nome: String;
begin
  nome := ´rodrigo´;
  PChar(nome)[3] := Char(0);     // pega o ´r´
  ShowMessage(nome);
end;

Se o código acima funcionar no Delphi, você vai ver que o ShowMessage só vai mostrar ´rod´, pois na quarta posição (vetor começa no zero) tem um zero que termina a string, apesar de na memória ainda existir o resto.


Responder

Gostei + 0

17/04/2008

Psyjacko

esse simples código aki tb faz a mesma coisa

var nome:String; begin nome := ´testee´; nome[4]:=#0; ShowMessage(nome); end;


minha dúvida mesmo é qt ao uso do PChar em certas ocasiões :?
se vc tiver msn poderia me passar , acho que conseguiria sanar a dúvida mais rápido :wink:


Responder

Gostei + 0

17/04/2008

Psyjacko

no caso então sempre que eu usar alguma função da API do Windows , no Delphi o dado seria String , mas usando a API passaria esse dado pra Pchar seria isso ?


Responder

Gostei + 0

18/04/2008

Rodc

no caso então sempre que eu usar alguma função da API do Windows , no Delphi o dado seria String , mas usando a API passaria esse dado pra Pchar seria isso ?

Exato, a questão é que String é uma classe do Delphi. O Windows, nem outros compiladores saberiam manipular esta classe se você passasse o ponteiro da classe para eles. Por isto é que você tem de passar direto o endereço de memória onde o texto começa, pois qualquer sistema consegue ler uma sequência de caracteres na memória até encotrar um caracter zerado.

Infelismente não tenho MSN.


Responder

Gostei + 0

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

Aceitar