Problème : Memo (Affichage)

silvergoldsilver Messages postés 21 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 17 septembre 2012 - 2 juin 2012 à 17:52
silvergoldsilver Messages postés 21 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 17 septembre 2012 - 4 juin 2012 à 12:04
Bonjour,
Cette procedure fonctionne très bien.

procedure TForm1.Ouvrir1Click(Sender: TObject); //Lecture du Fichier Octet par Octet
begin
If OpenDialog1.Execute Then
AssignFile(F, OpenDialog1.FileName)
else
exit;
Reset(F);
While not Eof(F) do
begin
Read(F, carac);
Memo1.Lines.Text:= Memo1.Lines.Text + carac;
end;
CloseFile(F);
end;

Le seul problème c'est que le Memo affiche la totalité du fichier à la fin de la lecture.
Comment transformer le code (ou les propriétés du Memo) pour obtenir un affichage progressif dans le Memo au cours de la lecture ?
Merci.
sgs

9 réponses

cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
2 juin 2012 à 20:23
salut
voici un petit code :
procedure TForm1.Ouvrir1Click(Sender: TObject);
if opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.FileName);
end;

@+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 juin 2012 à 22:38
Bonsoir,
Déjà, un premier truc...
Ta boucle ne fonctionne pas, il manque :
un Next;

ensuite, il faut préciser ce que tu souhaites faire :

lire chaque octet de chaque ligne et ensuite passer à la ligne suivante ou autre chose

etc..etc..

cantador
0
silvergoldsilver Messages postés 21 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 17 septembre 2012
3 juin 2012 à 11:27
Bonjour,

Merci walidlam, mais avec LoadFromFile, le Memo n'affiche que quelques caractères (j'ai essayé avec un fichier .exe et un fichier .doc)

Je ne sais pas si c'est possible, mais voilà ce que je veux obtenir : Lire un octet du fichier, l'afficher dans le Memo sous forme de caractère et recommencer.
La procedure ci-dessus fonctionne mais, comme je l'ai déjà dit, le Memo affiche tout en fin de lecture. On a l'impression que le Memo attend que tout soit lu avant d'afficher.

Merci cantador mais je ne vois pas où placer un Next dans la boucle While.

Je cherche...

sgs
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
3 juin 2012 à 13:42
Salut
peut être inclure un Memo1.refresh dans la boucle (je n'ai pas testé)

Dubois77
0

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

Posez votre question
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
3 juin 2012 à 13:59
salut !!
comme a dis cantador votre code n'est pas valable!!
si je comprend alors le code sera:
if opendialog1.Execute then begin
  AssignFile(F,opendialog1.FileName);
  try
    Reset(F); 
    repeat
      Readln(F,carac);
   Memo1.Lines.Text:= Memo1.Lines.Text +carac+#13#10;
//readln pour passer a la ligne suivante
//#13+#10 pour le memo 
    until Eof(F);
  finally
    CloseFile(F);
  end;   end;

@+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
3 juin 2012 à 16:11
Bonjour,

Voilà un petit truc qui pourrait
répondre à ta demande..

procedure TForm1.Button3Click(Sender: TObject);
var
  i, j: integer;
  SL: TStringList;
begin
  SL := TStringList.create;
  try
    if opendialog1.Execute then
    begin
      SL.LoadFromFile(opendialog1.FileName);
      for i := 0 to SL.Count - 1 do
      begin
        for j := 1 to Length(SL.Strings[i]) do
        begin
          Memo1.Lines.Text := Memo1.Lines.Text + copy(SL.Strings[i], j, 1);
          sleep(200); // tu peux faire varier la vitesse
          Application.ProcessMessages;
        end;
      end;
    end;
  finally
    SL.Free;
  end;
end;



cantador
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
3 juin 2012 à 18:30
Salut,

quelle est l'intérêt de la chose ?

charger un fichier octet par octet n'a aucun intérêt si ce n'est de charger un fichier le plus lentement possible !!!

Ensuite le TMemo n'est pas fait pour charger des EXE ou autre fichier binaire. Il ne peut afficher que du texte.


Sinon pour info, le code initial de SGS fonctionne parfaitement tel quel. Il suffit d'y ajouter un "Application.ProcessMEssages" pour afficher le résultat en temps réel. Mais c'est la dernière des choses à faire car ceci augmente le temps d'exécution de façon considérable. Je réitère donc ma question :

Quel est l'intérêt de la chose ?
As tu vraiment besoin de charger un fichier octet par octet ?


[hr]@+Cirec
[hr]
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
3 juin 2012 à 23:25
les desseins des delphinautes
sont impénétrables..

cantador
0
silvergoldsilver Messages postés 21 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 17 septembre 2012
4 juin 2012 à 12:04
Bonjour,

Bon, je dévoile tout.
J'ai repris un vieux projet. J'essaie d'imiter un programme qui s'appelle WordExtractor. Ce programme permet, entre autres choses, à partir des fichiers .exe et .dll, de convertir un byte en caractère imprimable (voir le but sur Internet)
J'ai essayé la lecture linéaire, la lecture par paquet, voire par block, et la lecture octet par octet qui est, c'est vrai, très très lente.
On m'a conseillé d'utiliser un TStringStream. J'ai essayé mais sans succès.
En fait, j'essaie un peu tout.

Merci à ceux qui ont essayé de m'apporter une aide positive dans cette recherche qui, à ce jour, reste sans réponse.

A noter :
- le Memo.refresh que propose dubois77 provoque un scintillement
- les 'procedure' que proposent walidlam et Cantador n'affichent malheureusement que quelques caractères

Salut,
sgs
0
Rejoignez-nous