String X PAnsiChar
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
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
Curtidas 0
Respostas

Massuda
15/04/2008
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.
Talvez você precise converter para PChar a URL que você está tentando abrir através do shell.
GOSTEI 0

Psyjacko
15/04/2008
Gostaria de saber oque o Pchar faz...poderiam me explicar ?
valeu
valeu
GOSTEI 0

Edsant
15/04/2008
certinho,
realmente eu estava colocando o pchar no lugar errado, acontece nas melhores familias...
obrigado massuda...
realmente eu estava colocando o pchar no lugar errado, acontece nas melhores familias...
obrigado massuda...
GOSTEI 0

Rodc
15/04/2008
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?
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?
GOSTEI 0

Psyjacko
15/04/2008
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:
por exemplo :
nome : String
nome :=´aeiou´
que caracter nulo seria esse ?
valeu pela atenção :wink:
GOSTEI 0

Rodc
15/04/2008
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í:
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.
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.
GOSTEI 0

Rodc
15/04/2008
Outro exemplo:
:
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.
:
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.
GOSTEI 0

Psyjacko
15/04/2008
esse simples código aki tb faz a mesma coisa
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:
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:
GOSTEI 0

Psyjacko
15/04/2008
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 ?
GOSTEI 0

Rodc
15/04/2008
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.
GOSTEI 0