TMemoryStream

Résolu
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 23 août 2006 à 20:53
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 24 août 2006 à 08:46
Bonjour,

Voilà, je sauve le texte d'un richedit dans dans un TMemoryStream par le biais de SaveToStream.

Ensuite, pour vérifier que tout fonctionne j'effectue l'opération inverse avec LoadFromStream.

Jusque là très bien, mais je voudrais éviter de récupérer le contenu du TMemoryStream dans le richedit mais par un autre moyen.

J'ai donc pensé à un TStrings, mais c'est là que j'ai des problèmes.

En fait, quand je fais le LoadFromStream sur mon TStrings il me génère l'erreur suivante : "Le projet Project1.exe a provoqué une classe d'exception EAbstractError avec le message 'Erreur abstraite'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer."

Voici le code simplifié :

var
  Form1: TForm1; flux: TMemoryStream;
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
flux := TMemoryStream.Create;
RichEdit1.PlainText := False;
RichEdit1.Lines.SaveToStream(flux);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  strTampon: TStrings;

begin
strTampon := TStrings.Create;
flux.Position := 0;
strTampon.LoadFromStream(flux);
flux.Free;
end;

end.

La ligne en rouge est celle qui déclenche l'erreur, alors que si je fait un "RichEdit1.Lines.LoadFromStream(flux);" celà fonctionne très bien.

Pourtant "Lines" et "strTampon" sont tous deux de type TStrings.

Faut-il absolument un RichEdit pour récupérer les données ou existe t-il une autre solution ?

Merci d'avance pour l'aide que vous m'apporterez.

3 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 août 2006 à 21:15
Salut,

TStrings est la classe de base abstraite.

Il te faut utiliser un de ses descendants, comme TStringList :

var

  strTampon: TStrings;

begin

  strTampon := TStringList .Create;

  flux.Position : = 0;

  strTampon.LoadFromStream(flux);

  flux.Free;

end;


Bonne prog'
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
23 août 2006 à 22:02
Affirmatif, Japee !

La classe TStrings ne doit pas être instanciée directement sinon on s'expose à des problèmes comme celui indiqué. La méthode LoadFromStream est une méthode déclarée abstraite et qui ne sert qu'à forcer les descendants de la classe TStrings à l'implémenter.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
24 août 2006 à 08:46
Bonjour,

J'ai compris d'où venait mon problème.

La première fois j'avais essayé avec "TStringList" mais j'avais oublié d'effectuer un "flux.position := 0;", donc ça ne fonctionnait pas.

Je pensais que ça venait du fait que ce soit un "TStringList" comme "Lines" est un "TStrings" et c'est pour celà que j'étais parti sur l'hypothèse du "TStrings".

Puis j'ai effectué une recherche sur le forum et je suis tombé sur un sujet où j'ai remarqué qu'il fallait un "flux.position := 0;". Mais après j'ai oublié de réessayer aver le TStringList !

Voilà, quoiqu'il en soit je vois que je peux toujours compter sur delphi.fr et ça fait plaisir.

Ca fait plaisir de reparler avec vous deux japee et delphiprog (ça faisait un petit moment !).

En attendant, de se revoir dans un nouveau topic je vous remercie beaucoup pour votre aide sinon j'aurais du tatôner un bon moment !

Merci encore et à plus.
0
Rejoignez-nous