Problème : Memo (Affichage)

Signaler
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012
-
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

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

@+
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
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
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

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
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
14
Salut
peut être inclure un Memo1.refresh dans la boucle (je n'ai pas testé)

Dubois77
Messages postés
107
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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;

@+
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
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
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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]
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
les desseins des delphinautes
sont impénétrables..

cantador
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

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