Ir al contenido


Foto

TRichEdit, TStringStream y cierto error que no logro "cachar"...


  • Por favor identifícate para responder
3 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 mayo 2012 - 03:32

Buena tarde, jóvenes ilustres..., aquí, yo otra vez, con una pregunta compleja y para la que no tengo la menor idea de cómo resolver.

Les platico. Tengo una función dentro de una pantalla que me DEBERÍA devolver un TStringStream con el contenido de varios campos que contienen texto enriquecido (sí, ese que va dentro de los TRichEdit's) ordenados y listos para ser añadidos a un TRichEdit en una pantalla:



delphi
  1. .
  2. .
  3. .
  4.  
  5.           redtResumenEventos.Lines.Clear;
  6.           redtResumenEventos.Lines.LoadFromStream(DevuelveResumenEventos(x1,x2,x3));
  7.           redtResumenEventos.Refresh;
  8. .
  9. .
  10. .



... y la función que estoy llamando es la siguiente:



delphi
  1. function DevuelveResumenEventos(cnnBBDD : TADOConnection;sFecha,sHora,sCtrlPac : string) : TStream;
  2. var
  3.   sTextoArmado : string;
  4.   stCarga : TStringStream;
  5. begin
  6.   with TADOTable.Create(Application.MainForm) do
  7.   try
  8.       sTextoArmado := '';
  9.       Connection := cnnBBDD;
  10.       TableName := 'EAPC_EVENTOS';
  11.       Filter := 'EAPC_FECHA = '+sFecha+' and EAPC_HORA = '+sHora+' and EAPC_CTRL_PAC = '+sCtrlPac;
  12.       Filtered := True;
  13.       Open;
  14.       while not Eof do
  15.       begin
  16.         sTextoArmado := sTextoArmado + FormatDateTime('dd-mm-yyyy', FieldValues['EAPC_FECHA_EVENTO'])+
  17.                         ' '+MinutsToStr(FieldValues['EAPC_HORA_EVENTO'])+
  18.                         '  ('+Trim(FieldValues['EAPC_LOGIN_USER'])+
  19.                         ') - '+FieldByName('EAPC_EVENTO').AsString+CRLF+CRLF;
  20.  
  21.         Next;
  22.       end;
  23.  
  24.       stCarga := TStringStream.Create(EmptyStr);
  25.       with TRichEdit.Create(Application.MainForm) do
  26.       begin
  27.         Text := sTextoArmado;
  28.         Lines.SaveToStream(stCarga);  // <<--- ¡¡Ésta línea!!
  29.       end;
  30.   finally
  31.       Close;
  32.       Free;
  33.   end;
  34.   Result := stCarga;
  35.   stCarga.Free;
  36. end;




En la línea marcada es donde me brinca el error que muestro en la imagen..., si alguien tuviese alguna idea que me ayude a solucionar éste problema, será recompensado con mi eterna gratitud, por que llevo algo así como 4 horas y no alcanzo a resolver, especialmente después de haber consultado como 10 web y dos manuales.

Archivos adjuntos


  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 11 mayo 2012 - 03:47

Mi primer intento sería algo como esto:



delphi
  1.       with TRichEdit.Create(Application.MainForm) do
  2.       begin
  3.         Parent:=Application.MainForm;
  4.         Text := sTextoArmado;
  5.         Lines.SaveToStream(stCarga);  // <<--- ¡¡Ésta línea!!
  6.       end;



Es decir, asignarle una ventana padre pues el mensaje de error dice precisamente eso, que no has asignado un formulario al control. No sé que efectos visuales inesperados pueda traer como consecuencias, pero para evitar que se muestre el control RichEdit podrías poner la propiedad Visible en Falso por ejemplo.

Revisando tu código creo que te pueden saltar otras excepciones, veo que devuelves stCarga y justo después liberas la memoria, esto seguramente te va a producir un access violation. Lo correcto es crearlo y después desde la función que lo llama destruirlos cuando ya no lo utilices.

Veo también que creas el control RichEdit pero no lo liberas.

Saludos

  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 mayo 2012 - 04:19

Mi primer intento sería algo como esto:



delphi
  1.       with TRichEdit.Create(Application.MainForm) do
  2.       begin
  3.         Parent:=Application.MainForm;
  4.         Text := sTextoArmado;
  5.         Lines.SaveToStream(stCarga);  // <<--- ¡¡Ésta línea!!
  6.       end;

...


Listo, añadí la línea y no apareció más la excepción de la imagen...

...Revisando tu código creo que te pueden saltar otras excepciones, veo que devuelves stCarga y justo después liberas la memoria, esto seguramente te va a producir un access violation...


Justamente, éso pasó, una horrorosa excepción. Elimino la línea y ya no aparece la excepción...

...Veo también que creas el control RichEdit pero no lo liberas...

Liberado.


Ahora, al final de todo, el resultado es que stCarga ¡¡SALE VACÍO!! de la función...


delphi
  1. function DevuelveResumenEventos(cnnBBDD : TADOConnection;sFecha,sHora,sCtrlPac : string) : TStream;
  2. var
  3.   sTextoArmado : string;
  4.   stCarga : TStringStream;
  5. begin
  6.   with TADOTable.Create(Application.MainForm) do
  7.   try
  8.       sTextoArmado := '';
  9.       Connection := cnnBBDD;
  10.       TableName := 'EAPC_EVENTOS';
  11.       Filter := 'EAPC_FECHA = '+sFecha+' and EAPC_HORA = '+sHora+' and EAPC_CTRL_PAC = '+sCtrlPac;
  12.       Filtered := True;
  13.       Open;
  14.       while not Eof do
  15.       begin
  16.         sTextoArmado := sTextoArmado + FormatDateTime('dd-mm-yyyy', FieldValues['EAPC_FECHA_EVENTO'])+
  17.                         ' '+MinutsToStr(FieldValues['EAPC_HORA_EVENTO'])+
  18.                         '  ('+Trim(FieldValues['EAPC_LOGIN_USER'])+
  19.                         ') - '+FieldByName('EAPC_EVENTO').AsString+CRLF+CRLF;
  20.  
  21.         Next;
  22.       end;
  23.  
  24.       stCarga := TStringStream.Create(EmptyStr);
  25.       with TRichEdit.Create(Application.MainForm) do
  26.       begin
  27.         Parent := Application.MainForm;
  28.         Text := sTextoArmado;
  29.         Lines.SaveToStream(stCarga);
  30.         Free;
  31.       end;
  32.   finally
  33.       Close;
  34.       Free;
  35.   end;
  36.   Result := stCarga;
  37. end;


  • 0

#4 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 11 mayo 2012 - 05:01

La verdad es que veo muchos atajos, por ejemplo:

Aquí creas un TStringStream vacío



delphi
  1.   stCarga := TStringStream.Create(EmptyStr);



Pero en su lugar podrías hacer esto:



delphi
  1. stCarga := TStringStream.Create(sTextoArmado);



Y devolver stCarga sin pasar por el RichEdit.

Y antes que eso, si la función DevuelveResumenEventos la modificas para devolver un String directamente sin pasa por TStream, entonces puedes devolver el contenido de sTextoArmado y hacer algo como esto:



delphi
  1.           redtResumenEventos.Lines.Clear;
  2.           redtResumenEventos.Lines:=DevuelveResumenEventos(x1,x2,x3);
  3.           redtResumenEventos.Refresh;



¿Porqué la necesidad de utilizar un TStringStream? Tal vez algo relacionado con el formato del RichtEdit.

  • 0




IP.Board spam blocked by CleanTalk.