Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2008
chalao chalao is offline
Miembro
 
Registrado: sep 2008
Posts: 26
Poder: 0
chalao Va por buen camino
Question Alguna forma más eficiente de enviar HTML al navegador-cliente ???

Hola foreros.

Estoy usando el componente TIdHTTPServer para enviar un formulario a un navegador y tengo el siguiente problema:
El texto HTML lo almaceno en una variable tipo string y de ahí lo inserto en un stream con WriteBuffer() para enviarlo despues con AResponseInfo.ContentStream. El problema es que si mi cadena HTML es de 1000 caracteres por ej tengo que hacer este proceso 4 veces ya que el tipo string no me permite más de 255 caracteres.
Hay alguna forma de hacerlo en un solo paso independientemente de lo largo que sea mi HTML.
Nota: Mi HTML variará en tiempo de ejecución así que almacenar el texto en un archivo y cargarlo supongo que no es una posible solución
Código:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

begin
  stream1 := TStringStream.Create(str);
  if ARequestInfo.Params.Count = 0 then
  begin
  str :='<html><head><title>Formulario Nombre y Apellidos</title></head>';
  stream1.WriteBuffer(str[1], length(str));
  str := '<body><form enctype="text/plain">Introduce tu nombre:<input type="text" maxlength="10" size="10" name="nombre"> Introduce tu apellido:<input type="text" maxlength="10" size="10" name="apellido"><INPUT TYPE="SUBMIT" VALUE="Enviar"></form></body></html>';
  stream1.WriteBuffer(str[1], length(str));
  AResponseInfo.ContentStream := stream1;
  end
end
Muchas gracias de antemano.
Un saludo
Responder Con Cita
  #2  
Antiguo 16-10-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Puedes hacerlo también tal que así, pudiendo asignar una cadena de más de 255 caracteres sin problemas:

Código Delphi [-]
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 
  AResponseInfo.ContentText := 'Cadena de más de 255 caracteres';

end;
Responder Con Cita
  #3  
Antiguo 16-10-2008
chalao chalao is offline
Miembro
 
Registrado: sep 2008
Posts: 26
Poder: 0
chalao Va por buen camino
Cita:
Empezado por dec Ver Mensaje
Hola,

Puedes hacerlo también tal que así, pudiendo asignar una cadena de más de 255 caracteres sin problemas:

Código Delphi [-]procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin AResponseInfo.ContentText := 'Cadena de más de 255 caracteres'; end;
Así lo hice y:

[DCC Error] servidor.pas(45): E2056 String literals may have at most 255 elements

De todas formas creo que mi problema va un poco más lejos porque aunque así se pudiera como la cadena HTML va a depender de los parámetros que yo recoja de otro formulario (un ejemplo podría ser recojer una fecha en un formulario y segúne esta mostrar una tabla con el més correspondiente) esta cadena la necesitaría modificar en mi código para ir añadiendo filas de la tabla html en cuestión.

Y creo que esto no se podria hacer:
Un ejemplo sin sentido:
Código:
AResponseInfo.ContentText := '<HTML>';
AResponseInfo.ContentText := AResponseInfo.ContentText + '<HEAD>';
AResponseInfo.ContentText := AResponseInfo.ContentText + '</HEAD><BODY></BODY></HTML>';
No sé si me expliqué bien. Mi cadena debería estar en algún tipo de variable que yo pueda ir modificando.
Gracias.
Responder Con Cita
  #4  
Antiguo 16-10-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues lo de la limitación del número de caracteres me deja un poco parado. Creo que en Delphi, el tipo "string" no tiene esa limitación, sino que únicamente está limitado por la memoria disponible. En cuanto a usar una variable en donde ir guardando la cadena que al cabo asignes a la propiedad "ContentText", pues así es, nada te impide hacerlo de ese modo. A ver si algún otro compañero puede aportar algo más de información, sobre todo respecto del error que obtienes.
Responder Con Cita
  #5  
Antiguo 16-10-2008
chalao chalao is offline
Miembro
 
Registrado: sep 2008
Posts: 26
Poder: 0
chalao Va por buen camino
Mi versión de Delphi:

CodeGear™ Delphi® for Microsoft® Windows™ Version 11.0.2627.5503 Copyright © 2007 CodeGear™. All Rights Reserved.

Código:
var
a : string;

begin
 a:='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
end;
y el error es:
[DCC Error] E2056 String literals may have at most 255 elements

A mi no me permite mas de 255 en un string, no se si ¿habrá algún otro tipo que si se pueda??.
Responder Con Cita
  #6  
Antiguo 16-10-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Parece que el problema está en que no puede asignarse a una cadena, literalmente, más de 255 caracteres. Esto es, lo siguiente no es posible:

Código Delphi [-]
s := 'Cadena de más de 255 caracteres';

Pero, esto sí que lo sería:

Código Delphi [-]
s := 'Cadena de más de';
s := s + ' 255 caracteres';

De todas formas, parece que además de partir la cadena (como solución) podría también declararse la variable del tipo "AnsiString", de modo que ya no hubiera la limitación susomentada. Echa un vistazo aquí.
Responder Con Cita
  #7  
Antiguo 16-10-2008
chalao chalao is offline
Miembro
 
Registrado: sep 2008
Posts: 26
Poder: 0
chalao Va por buen camino
Thumbs up

Muchas gracias David.
Me estoy ahorrando bastantes líneas de código.

La concatenación de cadenas me vale de momento.
He leido varios documentos en el link que me dejabas de docs.codegear.com y me ha quedado claro que el tipo AnsiString sería un puntero que reserva la memoria que haga falta para la cadena por lo tanto "no habría" limitación en la longitud.

De todos modos aun declarando la variable como AnsiString el error sería el mismo, no se puede asignar directamente una cadena de más de 255 car. O al menos, no de esta forma:

Código:
var
s : AnsiString;

begin
s := 'Cadena de más de 255 car';
end
El error sigue siendo el mismo: String too long at line xx
Responder Con Cita
  #8  
Antiguo 16-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por chalao Ver Mensaje
[/code]El error sigue siendo el mismo: String too long at line xx
Así es, no depende del tipo de datos de la variable sino de la cadena en sí. Está documentado en la ayuda de delphi, si buscan "String Literals". No es posible poner una cadena literal con más de 255 caracteres. Esto, como ya mencionó dec, es independiente de la capacidad de almacenaje de un tipo string, que es mucho mayor.

// Saludos
Responder Con Cita
  #9  
Antiguo 16-10-2008
chalao chalao is offline
Miembro
 
Registrado: sep 2008
Posts: 26
Poder: 0
chalao Va por buen camino
Wink

Gracias, creí que con otro tipo si se podía pero me queda claro que no.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Alguna otra forma de pago? Waldo La Taberna 21 23-08-2007 09:53:36
Forma eficiente de manejar arrays de 10'000.000 cuadrados mamcx OOP 6 15-09-2006 22:01:12
Alguna recomendacion para incluir un navegador HTML?? Moises22 Internet 15 07-10-2005 10:52:50
Como abrir un documento html en el navegador? VivaLeon Varios 1 19-05-2005 19:12:32
Hay alguna forma? jam888 Firebird e Interbase 2 06-10-2004 22:34:45


La franja horaria es GMT +2. Ahora son las 15:35:22.


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