TMemoryStream [Résolu]

Signaler
Messages postés
129
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
25 juillet 2012
-
informatixo
Messages postés
129
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
25 juillet 2012
-
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.
A voir également:

3 réponses

Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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'
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
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.
Messages postés
129
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
25 juillet 2012
1
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.