IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Sauvegarde d'écran en heap


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut Sauvegarde d'écran en heap
    Bonjour j'essai de faire une sauvegarde de l'écran en heap, et le contraire. Voilà un bout de mon code;

    J'ai vu cette techique dans plusieurs logiciel et j'essai de comprendre comment ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Program SaveScr;
    Uses
      Crt;
     
    Type
      OneChar = Record
        Character : Char;
        Attribute : Byte;
        end;
     
      RAMBuffer = Array [1..25, 1..800] of OneChar;
      RAMBufPtr = ^RAMBuffer;
    Var
      i , j : integer;
      VideoRAM : RAMBufPtr;
     
     
    procedure sauvegarde;
     
    begin
      If (LastMode = 7) { Sans pilote graphique }
        Then
          VideoRAM := Ptr ($B000, $0000) 
        Else
          VideoRAM := Ptr ($B800, $0000);
    end; 
     
    procedure restore;
      For i := 1 to 25 Do
        begin
          For j := 1 to 80 Do
            Write (VideoRAM^ [i, j].Character);
        end;
     
     
    end.
    Le problème c'est que ce bout de code affiche plusieurs fois le bout de texte de l'écran.

    Merci pour vos réponses et/ou conseils

  2. #2
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut
    Salut,

    Tu as créé un tableau de 800 colonnes / ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RAMBuffer = Array [1..25, 1..80] of OneChar;

  3. #3
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    C'est juste un faute de frappe, mais dans le vrai code, j'ai bien mis 80

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    c'est un peu vieux dans mon esprit, mais de ce que je comprend tu écris à l'écran ce qu'il y a à l'écran ... je vois pas trop l’intérêt.

    VideoRAM est un pointeur vers ma mémoire écran

    Write() affiche le caractère à l'écran...

    si tu ajoutes un GotoXY(0,0) avant ta boucles tu devrais écrire en X,Y le caractère qui est en X,Y...pas convaincant
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Oui , dans mon exemple c'est bête, mais j'ai vu de nombreuses applications qui utilise ça pour rafraîchir de manière plus rapide l'écran. Je veux juste le principe.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par titeeee Voir le message
    Oui , dans mon exemple c'est bête, mais j'ai vu de nombreuses applications qui utilise ça pour rafraîchir de manière plus rapide l'écran. Je veux juste le principe.
    haha, j'ai retrouvé un vieux code

    l'idée est de sauvegarder l'écran DOS dans la seconde page de la mémoire vidéo au démarrage du programme et de la restaurer à la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    uses crt;
    ...
    Var
     OldExit:pointer;
     OldX,OldY:Byte;
    Procedure RestoreScreen; far;
     begin
      ExitProc:=OldExit;
      Move(Mem[SegB800:80*25*2],Mem[SegB800:0],80*25*2);
      Crt.Window(1,1,80,25);
      GotoXY(OldX,OldY);
     end;
     
    begin
     OldX:=WhereX;
     OldY:=WhereY;
     Move(Mem[SegB800:0],Mem[SegB800:80*25*2],80*25*2);
     OldExit:=ExitProc;
     ExitProc:=@RestoreScreen;
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Alors alors... La zone mémoire associée à l'écran en mode texte comme dans la plupart des cas au segment B800 (mode réel !). Pour coder chaque caractère, 2 octets sont utilisés:
    • Le premier octet donne le code ASCII du caractère qu'on veut afficher,
    • Le deuxième octet donne l'attribut du caractère en question (c'est-à-dire sa couleur, la couleur du fond et le clignotement (blink).


    Les bits 0-3 (masque 0fH) donne la couleur de la police (foreground color).
    Les bits 4-6 (masque 70H) donne la couleur de fond (background color).
    Le bit 7 (masque 80H) code le blink.

    Pour sauvegarder un écran tel quel, on comprend qu'il faut donc le double d'espace que prévu ! Le plus logique est donc de coder 25 lignes pour 160 colonnes, en lisant 2 octets à chaque tout de boucle... Une approche est aussi de stocker dans un vecteur de 4000 octets (=25*160) (et non pas 2000) !

Discussions similaires

  1. Sauvegarde d'une vidéo via capture d'écran
    Par Axiome dans le forum C#
    Réponses: 0
    Dernier message: 16/07/2010, 17h18
  2. Sauvegarde d'une zone d'écran
    Par mulfycrowh dans le forum DirectX
    Réponses: 0
    Dernier message: 05/02/2010, 15h11
  3. [AC-2007] Formulaires : double écran, sauvegarde de position
    Par Manouille dans le forum IHM
    Réponses: 0
    Dernier message: 19/11/2009, 15h25
  4. Réponses: 4
    Dernier message: 31/05/2009, 20h42
  5. Comment sauvegarder une capture d'écran dans ACCESS ?
    Par GunnyMiK dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/04/2008, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo