Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2006
coletaun coletaun is offline
Miembro
 
Registrado: oct 2004
Posts: 43
Poder: 0
coletaun Va por buen camino
pasar contenido de pchar a string

hola a todos.

Despues de ejecutar un funcion y obeter un puntero pchar de un determinao array, tengo que pasar estos datos a un string para poder tratarlos. ¿alguien sabe como hacer ésto?

muchas gracias.
Responder Con Cita
  #2  
Antiguo 21-07-2006
nemesio nemesio is offline
Miembro
 
Registrado: nov 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 377
Poder: 19
nemesio Va por buen camino
Prueba esto a ver si es lo que quieres.

Código Delphi [-]
for I:=1 to Max do
begin
   cString[i]:=cChar[i];
end;

Suerte.

Última edición por dec fecha: 21-07-2006 a las 02:19:11.
Responder Con Cita
  #3  
Antiguo 21-07-2006
coletaun coletaun is offline
Miembro
 
Registrado: oct 2004
Posts: 43
Poder: 0
coletaun Va por buen camino
max?

ok, con esto paso los datos de mi variable:

datos: pchar;
final :string;

paso los datos de "datos" a final d eesta foram. ¿y el max seria el numero de caracters contenidos en el puntero datos?

gracias
Responder Con Cita
  #4  
Antiguo 21-07-2006
nemesio nemesio is offline
Miembro
 
Registrado: nov 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 377
Poder: 19
nemesio Va por buen camino
Si, max es la cantidad de caracteres.

Suerte.
Responder Con Cita
  #5  
Antiguo 21-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Hombre, la forma normal es simplemente asignarlos y listo, hacer un bucle aunque valido (el del ejemplo habria que corregirlo ya que no se fija el tamaño del string asi que dara error) es un poco matar moscas a cañonazos ademas de mas lento.

Código:
var
  datos: pchar;
  final :string;

begin
    final:= datos;
end;
Responder Con Cita
  #6  
Antiguo 21-07-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
mejorando el ejemplo anterior, con eso te funcionara correctamente
Código Delphi [-]

var
  datos: pchar;
  final :string;

begin
    final:= pchar(datos);
end;
Responder Con Cita
  #7  
Antiguo 21-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Hacer un cast a PChar(datos) es una redundancia debido a que datos YA es de tipo PChar, luego le estamos diciendo al compilador algo que ya sabe (que interpreta la variable datos como de tipo PChar cuando ya es de ese tipo).
El resultado final del codigo compilado se haga el cast o no es identico, simplemente el codigo fuente ocupara un pelin mas.

Saludos
Responder Con Cita
  #8  
Antiguo 21-07-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
Mick prueba lo que dices desarrollando una DLL que tenga compatibilidad con "C", prueba luego hablamos
Responder Con Cita
  #9  
Antiguo 21-07-2006
coletaun coletaun is offline
Miembro
 
Registrado: oct 2004
Posts: 43
Poder: 0
coletaun Va por buen camino
sudamericano,es ese mi problema

Hola,
Ese es mi problema, trabajo con una dll externa, en c+ y el tipo de datos del pchar es el que me da problemas en delphi al pasarlo o recogerlo en una variable y pasarlo a un string.

¿como podria solucionarlo?
Responder Con Cita
  #10  
Antiguo 21-07-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Creo que lo tengo:

Código Delphi [-]
FUNCTION PcharToStr (aTexto: PCHAR): STRING;
BEGIN
  PcharToStr := StrPas (aTexto);
END;

Creo que esto funcionará.
Responder Con Cita
  #11  
Antiguo 21-07-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
coletaun mandame tu dll a mi correo y te ayudo mandandote un ejemplo en delphi con fuentes para que puedas solucionar tu problema

Última edición por Sudamericano fecha: 08-08-2006 a las 20:36:39.
Responder Con Cita
  #12  
Antiguo 21-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
STrPas es una funcion que existe solo por mantener compatibilidad hacia atras con programas antiguos y que estos no dejen de funcionar, pero borland no recomienda su uso, ya que podria ser eliminada en el futuro. La propia ayuda de delphi sobre la funcion StrPas dice:

"This function is provided for backwards compatiblity only. To convert a null terminated string to an AnsiString or native Delphi languag string, use a typecast or a assignment"

Que viene a decir:

Esta funcion existe solo por compatibilidad con programas antiguos. Para convertir una cadena terminada en nulo a un AnsiString o a un string nativo de delphi, use un typecast o una asignacion.

Saludos

PD: No importa que la funcion que devuelve el puntero a char este en una DDL igualmente no hace falta usar el typecast. Solo haria falta si lo que devuelve la funcion no fuese exactamente de tipo PChar sino de otro tipo compatible.
Responder Con Cita
  #13  
Antiguo 24-07-2006
coletaun coletaun is offline
Miembro
 
Registrado: oct 2004
Posts: 43
Poder: 0
coletaun Va por buen camino
sudamericano

Te mando la dll y la configuración de la dll para ver si es posible que me puedas echar una mano.

Muchas gracias.
Responder Con Cita
  #14  
Antiguo 24-07-2006
coletaun coletaun is offline
Miembro
 
Registrado: oct 2004
Posts: 43
Poder: 0
coletaun Va por buen camino
Mick

De todas formas lo que devuelve la función en c, está definido asi:
BOOL WINAPI captura_pantalla(HCLIENT hclient, char *pantalla, int *longitud, int tout);

¿que tipo de variable seria para capturar en delphi pantalla?

Gracias
Responder Con Cita
  #15  
Antiguo 25-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
En el caso en particular que mencionas no importa el tipo de la variable, la funcion funcionaria igual poniendo cualquier tipo al puntero:

Código:
char *pantalla;
pointer pantalla;
PByteArray pantalla;
El problema se produce posteriormente cuando uno intenta trabajar con esos datos: Un PChar se entiende como una cadena de caracteres acabados en 0. Es decir el fin de la lista de caracteres esta marcado con el byte 0. Pero lo que esa funcion recoge es una zona de bytes que representa una captura de pantalla. Y en el medio de esos datos habra caracteres 0 pero no para indicar el fin de la captura de pantalla sino como un dato mas. Al asignarlo de cualquiera de las formas:

Código:
final:= pchar(datos); 
final:= datos;
Delphi dejará de copiar los caracteres a la variable final, en el momento que encuentre el primer valor CERO. DE modo que la variable "final" tendra solo una parte de la captura de pantalla.

Las variables string de delphi no tienen ese problema debido a que al principio de los datos guardan un contador con el tamaño de la cadena, lo que permite que la cadena de caracteres o bytes pueda contener cualquier valor incluido el cero. En cambio los PChar conceptualmente son iguales que los char * equivalentes de C, y el caracter 0 se utiliza como fin de cadena y no puede formar parte de los propios datos.

En ese caso hay que definir el tamaño del string primero y despues asignarlo con un bucle o mejor con una funcion que copie bloques de bytes ya que es mucho mas rapido. Por ejemplo:

Código:
 
SetLength(final,Longitud^); 
Move( datos^, final[1] , Longitud);
Aunque existe otro modo mas sencillo que ahorraria memoria y operaciones, y es pasar directamente un puntero al principio del string "final" y los datos ya estarian en su sitio despues de llamar a la funcion, es decir:

Código:
 
SetLength(final, TAMANO_MAXIMO_CAPTURA_PANTALLA); 
captura_pantalla(hclient, @final[1], longitud, tout); 
SetLength(final,longitud^);
Tenemos otra opcion que es no usar un String, por lo menos conceptualmente seria mas correcto no usar una variable String para trabajar con esos datos debido a que no representan una cadena de caracteres sino un array de bytes, en ese caso yo utilizaria un array de bytes o un PByteArray, para trabajar con esos datos.

Código:
 
uses Sysutils; 
... 
var 
longitud: integer; 
buffer:PByteArray; 

begin 
GetMem(buffer, TAMANO_MAXIMO_CAPTURA_PANTALLA); 
captura_pantalla(hclient, buffer, @longitud, tout); 
ReallocMem(buffer,longitud); 
.. 
.. 
// Hacemos lo que sea con buffer, 
// podemos acceder a los datos con buffer[indice] 
.. 
.. 
FreeMem(buffer);
end;
Saludos

Última edición por Mick fecha: 25-07-2006 a las 17:51:47.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Compatibilidad entre PChar y String vick Conexión con bases de datos 5 24-10-2005 21:50:35
¿como pasar de String dentro de un PChar? Moises22 Varios 6 27-09-2005 15:43:47
Pasar contenido fichero a un campo memo Jose Manuel Impresión 2 15-03-2005 16:39:59
Pchar y String superhopi Varios 8 19-08-2004 09:54:06
problemas de compatibilidad de tipos pchar y string VRO Varios 2 13-05-2004 10:29:34


La franja horaria es GMT +2. Ahora son las 01:36:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi