Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Alguna forma más eficiente de enviar HTML al navegador-cliente ??? (https://www.clubdelphi.com/foros/showthread.php?t=60858)

chalao 16-10-2008 08:16:14

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

dec 16-10-2008 08:47:25

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;

chalao 16-10-2008 10:09:21

Cita:

Empezado por dec (Mensaje 320443)
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.

dec 16-10-2008 10:11:49

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.

chalao 16-10-2008 10:34:15

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

dec 16-10-2008 10:42:11

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

chalao 16-10-2008 17:17:21

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

roman 16-10-2008 17:25:53

Cita:

Empezado por chalao (Mensaje 320542)
[/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

chalao 16-10-2008 18:23:03

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


La franja horaria es GMT +2. Ahora son las 14:12:48.

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