Ajouter des RichEdit formatés les uns aux autres.

cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 20 mai 2009 à 14:52
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 20 mai 2009 à 21:50
Je souhaite gérer un fil de messagerie avec des RichEdit qui peuvent avoir une grande variété de format; On peut sauvegarder le contenu d'un RichEdit formatté dans un fichier rtf mais comment fait-on pour en ajouter un suivant?

10 réponses

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
20 mai 2009 à 17:09
Ok j'ai bien saisi. Je parviens a coller le contenu d'un rich dans un autre mais pas 2 contenus dans 1 autre :/
Ce qui est sur, c'est qu'il faut passer par un Stream pour copier/coller les contenus.
Le soucis est qu'un LoadFrom... écrase el contenu actuel pour mettre le nouveau -_- il n'y pas de AddLinesFromStream par exemple :(
Regarde aussi la propriété PlainText qui doit être a faux.
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
20 mai 2009 à 15:07
Salut
Je ne comprends pas bien la question, qu'entends tu par "ajouter un suivant" : "un" quoi ?
Essaie de développer merci
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
20 mai 2009 à 15:34
J'ai des discussions qui sont en RichEdit donc que je sauvegarde en fichier .rtf ce qui est très sympa puisque cela enregistre la mise en forme qui peut être très riche (comme son nom l'indique).


mais voilà: quelqu'un ajoute en ligne un message lui aussi formaté et je voudrais le mettre à la suite. Je sais le réceptionner correctement avec des Strea:m (un peu laborieux mais cela marche) Comment fait-on pour récupérer le fichier et y ajouter pour ajouter ce nouveau texte au précédent en respectant la mise en forme de chacun?

j'ai essayé de copier ligne à ligne le nouveau texte dans un RichEdit annexe ouvert pour l'occasion, cela ajoute des textes non formatés, j'ai essayé d'utiliser le clipboard le résultat est désopilant : il m'insère:  "RichEdit.lines"!...

merci de ton aide...


 
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
20 mai 2009 à 15:37
Peut on avoir du code ?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
20 mai 2009 à 16:33
Ca c'est un petit module qui me sert pour la mise au point;


j'ai deux fichiers .rtf l'un que j'ouvre avec ouvrir et l'autre avec ajouter.


Il y a la trace de quelques uns de mes essais...


type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Sauver: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Ouvrir: TButton;
    RichEdit2: TRichEdit;
    Ajouter: TButton;
    procedure SauverClick(Sender: TObject);
    procedure OuvrirClick(Sender: TObject);
    procedure AjouterClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.AjouterClick(Sender: TObject);
Var I: integer;
copier: TStrings;
begin
    OpenDialog1.Execute;
  if OpenDialog1.FileName<>'' then
  RichEdit2.Lines.LoadFromFile(OpenDialog1.FileName);
  //RichEdit1.Lines:= RichEdit1.lines+RichEdit2.Lines;
  RichEdit2.SelStart:=0;
  RichEdit2.SelLength:= RichEdit2.GetTextLen;
  //copier:= RicheDit2.Lines;
  RichEdit1.SelStart:= RichEdit1.GetTextLen;
  RichEdit1.seltext:= richEdit2.seltext;
  //for I := 0 to RichEdit2.Lines.Count - 1 do
    //RichEdit1.lines.Append(RichEdit2.Lines[I]);
    //richEdit1.PasteFromClipboard;
end;


procedure TForm1.OuvrirClick(Sender: TObject);
begin
  OpenDialog1.Execute;
  if OpenDialog1.FileName<>'' then
  RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
  //RichEdit1.Lines.LoadFromStream();
end;


procedure TForm1.SauverClick(Sender: TObject);
VAR AStream: TStream;
      MemStrm  : TMemoryStream;
begin
  SaveDialog1.Execute;
  if SaveDialog1.FileName<>'' then
  RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
  //MemStrm  := TMemoryStream.Create;
  //RichEdit1.Lines.SaveToStream(MemStrm);


  //Astream:= TStream.Create;
  //RichEdit1.Lines.SaveToStream(Astream);
end;


 
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
20 mai 2009 à 17:54
Je crois que je vais essayer cela:
Loader le nouveau texte à ajouter dans un RichEdit annexe dédié à cette manip.
balayer tous les caractères de ce second RichEdit en copiant leur Selattributes et en les ajoutant un par un au premier RichEdit pour enfin sauvegarder sous le format RTF...

Lourd, mais enfin c'est la bécane qui le fera, pas moi.
Je pense qu'ainsi cela devrait marcher.

je voulais savoir s'il y avait une méhode que je n'avais pas trouvée. Apparemment il n'y en a pas. Pourtant les fils de discussion, comme ici sont devenus des objets courants!

merci
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
20 mai 2009 à 19:11
Bon effectivement le code suivant fait (presque!) ce que je cherche à faire:


  J:= RichEdit1.GetTextLen;
  for I := 0 to RichEdit2.GetTextLen - 1 do
  begin
    RichEdit2.SelStart:=I;
    RichEdit2.SelLength:=1;
    RichEdit1.SelStart:=J+I;
    RichEdit1.SelAttributes:=RichEdit2.SelAttributes;
    RichEdit1.SelText:=RichEdit2.SelText;
  end;

Sauf que...


Cela ne traite pas les sauts de ligne!
Cela met donc tout bout à bout...
Courage!
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
20 mai 2009 à 19:49
Finalement pour recopier les saut de ligne on arrive à


  J:= RichEdit1.GetTextLen;
  I:=0;
  For K:= 0 to RichEdit2.Lines.Count-1 do
  BEGIN
    cOPIER:= RichEdit2.Lines[K];
    for L := 0 to length(copier)+1 do //deux octets pour le CR et le LF
    begin
      RichEdit2.SelStart:=I;
      RichEdit2.SelLength:=1;
      RichEdit1.SelStart:=J+I;
      RichEdit1.SelAttributes:=RichEdit2.SelAttributes;
      RichEdit1.SelText:=RichEdit2.SelText;
      Inc(I);
    end;
    RichEdit1.Lines.Append('');
  END;

On pourrait faire plus sophistiqué et peut-être plus rapide en ne reprogrammant le selattributes que lorsqu'il change et copier des seltext par bloc homogène...
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
20 mai 2009 à 21:39
Salut,

... Et en sauvegardant tes RichEdit avec WriteComponentResFile ...

(cela sauvegarderait tes compos et leur contenu, je crois... )

Pour charger : ReadComponentResFile
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
20 mai 2009 à 21:50
J'oubliais...

@ Géraaaaarrrrrrd !
   

Le réglement est valable pour tous :
- que ton age affiché ne te dispense pas des traditionnels "bonjour" et "merci", STP.

Merci
Rejoignez-nous