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

Autres IDE Pascal Discussion :

Dimensions de la fenêtre Turbo Vision [Virtual Pascal]


Sujet :

Autres IDE Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut Dimensions de la fenêtre Turbo Vision
    Bonjour ! En compilant avec Virtual Pascal le très beau Gestionnaire de Disquette de Mathieu DALBIN, j'ai observé que la "status line" n'était pas visible.

    J'ai essayé de modifier les valeurs passées à la procédure Assign() (dans les méthodes InitStatusLine() et InitDesktop()), mais je ne suis pas parvenu à obtenir un résultat correct, ni à comprendre la logique des choses.

    Que se passe-t-il exactement quand on utilise la constante smFont8x8 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetScreenMode(smCO80 + smFont8x8);
    J'ai fait également un essai de compilation avec Free Pascal et, là encore, il y a un problème, mais pas le même ! Cette fois la fenêtre est plus grande que le bureau.

    Je sollicite votre aide pour m'aider à résoudre ce problème : maîtriser les dimensions d'une grande fenêtre Turbo Vision, avec Free Pascal et avec Virtual Pascal. (J'ai même trouvé hier une bibliothèque Turbo Vision pour Delphi, mais je ne l'ai pas testée de façon approfondie.)

    Voici un extrait du gestionnaire du disquette qui permet de constater le problème.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
     
    program test;
     
    { Extrait de DISK8RED.PAS
      http://mdalbin.developpez.com/tutoriels/pascal/tvpa/
      
      Le programme original est écrit pour Turbo Pascal. En le compilant avec Free
      pascal ou avec Virtual Pascal, on rencontre différents problèmes relatifs aux
      dimensions de la fenêtre : ou bien la fenêtre est plus grande que le bureau
      (Free Pascal), ou bien la "status line" n'est pas visible (Virtual Pascal).
    }
     
    {$IFDEF VPASCAL}
    {$PMTYPE VIO}
    {$USE32+}
    {$ENDIF}
     
    uses
      Dos, App, Objects, Views, Drivers, Dialogs, MsgBox, Validate, Menus, StdDlg;
     
    {$R ICONE.RES}
     
    type
      PClockStaticText = ^TClockStaticText;
      TClockStaticText = object(TStaticText)
        private
          Second, HundredthSecond: Word;
        public
          constructor Init(var Bounds: TRect; AText: string);
          procedure SetText(AText: string);
          procedure Update;
      end;
     
      TDisk8Reader = object(TApplication)
        private
          CommandLabel: PLabel;
          ClockStaticText: PClockStaticText;
        public
          constructor Init;
          procedure HandleEvent(var Event: TEvent); virtual;
          procedure InitMenuBar; virtual;
          procedure InitStatusLine; virtual;
          procedure InitDesktop; virtual;
          procedure InitClock;
          function GetPalette: PPalette; virtual;
          procedure Idle; virtual;
          destructor Done; virtual;
      end;
     
    const
      CAppPalette = #$78#$70#$78#$74#$20#$74#$78#$73#$7F#$7A +
                    #$31#$31#$1E#$71#$00#$2F#$3F#$3A#$13#$13 +
                    #$3E#$21#$00#$70#$7F#$13#$78#$74#$70#$7F +
                    #$00#$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E +
                    #$20#$2B#$2F#$78#$2E#$70#$30#$3F#$3E#$1F +
                    #$2F#$1A#$20#$72#$31#$31#$30#$2F#$3E#$31 +
                    #$13#$00#$00;
     
    var
      Disk8Reader: TDisk8Reader;
     
    (****************************************************************************)
    (***                    *****************************************************)
    (***  TClockStaticText  *****************************************************)
    (***                    *****************************************************)
    (****************************************************************************)
     
    constructor TClockStaticText.Init(var Bounds: TRect; AText: string);
    begin
      if not inherited Init(Bounds, AText) then Fail;
      Second := 0;
      HundredthSecond := 0;
    end;
     
    procedure TClockStaticText.SetText(AText: string);
    begin
      if Text <> nil then DisposeStr(Text);
      Text := NewStr(AText);
    end;
     
    procedure TClockStaticText.Update;
    var H, M, S, Sec: Word;
        SH, SM, SS, SSec: string;
    begin
      GetTime(H, M, S, Sec);
      If (S * 100 + Sec) - (Second * 100 + HundredthSecond) >= 100 then
      begin
        Second := S;
        HundredthSecond := Sec;
        Str(H, SH); if H < 10 then SH := '0' + SH;
        Str(M, SM); if M < 10 then SM := '0' + SM;
        Str(S, SS); if S < 10 then SS := '0' + SS;
        Str(Sec, SSec);
        SetText(SH + ':' + SM + ':' + SS);
        DrawView;
      end;
    end;
     
    (****************************************************************************)
    (***                *********************************************************)
    (***  TDisk8Reader  *********************************************************)
    (***                *********************************************************)
    (****************************************************************************)
     
    constructor TDisk8Reader.Init;
    var Bounds: TRect;
        I: Integer;
    begin
      if not inherited Init then Fail;
      SetScreenMode(smCO80 + smFont8x8);
      Redraw;
      InitClock;
    end;
     
    procedure TDisk8Reader.HandleEvent(var Event: TEvent);
    begin
      inherited HandleEvent(Event);
    end;
     
    procedure TDisk8Reader.InitMenuBar;
    begin
      MenuBar := nil;
    end;
     
    procedure TDisk8Reader.InitStatusLine;
    var Bounds: TRect;
    begin
      Bounds.Assign(0, 49, 80, 50);
      StatusLine := New(PStatusLine, Init(Bounds, NewStatusDef(0, 0,
      NewStatusKey('~Alt+X~ Exit', kbAltX, cmQuit, nil), nil)));
    end;
     
    procedure TDisk8Reader.InitDesktop;
    var Bounds: TRect;
    begin
      Bounds.Assign(0, 0, 80, 49);
      Desktop := New(PDesktop, Init(Bounds));
    end;
     
    procedure TDisk8Reader.InitClock;
    var Bounds: TRect;
    begin
      Bounds.Assign(0, 0, 80, 1);
      ClockStaticText := New(PClockStaticText, Init(Bounds, ''));
      Desktop^.Insert(ClockStaticText);
    end;
     
    function TDisk8Reader.GetPalette: PPalette;
    const P: string[Length(CAppPalette)] = CAppPalette;
    begin
      GetPalette := @P;
    end;
     
    procedure TDisk8Reader.Idle;
    begin
      inherited Idle;
      ClockStaticText^.Update;
    end;
     
    destructor TDisk8Reader.Done;
    begin
      Dispose(ClockStaticText, Done);
      inherited Done;
    end;
     
    (****************************************************************************)
    (***        *****************************************************************)
    (***  Main  *****************************************************************)
    (***        *****************************************************************)
    (****************************************************************************)
     
    begin
      Disk8Reader.Init;
      Disk8Reader.Run;
      Disk8Reader.Done;
    end.
    Les essais ont été effectués sous Windows 8.1.
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Voici la suite. J'ai trouvé empiriquement les valeurs qui donnent un résultat correct avec Virtual Pascal (ou plutôt la valeur, car il n'y a que la hauteur qui pose problème).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TDisk8Reader.InitDesktop;
    var Bounds: TRect;
    begin
      //Bounds.Assign(0, 0, 80, 49);
      Bounds.Assign(0, 0, 80, 24);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TDisk8Reader.InitStatusLine;
    var Bounds: TRect;
    begin
      //Bounds.Assign(0, 49, 80, 50);
      Bounds.Assign(0, 24, 80, 25);
    J'ai rajouté une fenêtre d'information qui affiche les valeurs renvoyées par la procédure GetExtent(), pour voir si cela correspondait aux valeurs que j'avais trouvées de façon empirique. Eh bien, pas du tout ! Si vous comprenez la logique de tout cela, merci de me le dire.

    Les captures d'écran ci-jointes montrent le résultat obtenu avec lesdites valeurs. Etrange, non ?
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello Roland,

    Pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetScreenMode(smCO80 + smFont8x8);
    , elle est utilisée pour changer la résolution de l'écran en mode texte. On est censés récupérer un écran Couleur de 80 colonnes, et une police 8x8 pixels, sachant que l'écran standard fait 80 colonnes pour 25 lignes. Ce qui marchait bien avec DOS ne marche plus très bien avec les derniers Windows (à partir de Windows 7, peut-être même avant).

    Concernant les lignes noires en dessous de l'écran principal, j'avais déjà constaté ça en lançant récemment le programme, sans avoir cherché à corriger le problème ou investiguer. Je ne connaissais pas le GetExtent, c'est bon à savoir Il semblerait qu'avec certains compilateurs, on puisse avoir 58 lignes au lieu de 50 lignes...

    Sinon on peut régler la taille de la police d'une fenêtre DOS, au niveau affichage (Propriétés de la fenêtre, onglet Police/font).
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Merci Mathieu, pour la réponse. Je vais continuer d'étudier la question. Si je trouve du nouveau, j'en ferai part. En attendant, je vais peut-être renoncer au "grand écran", et me contenter de la console standard, ce qui sera peut-être plus simple.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Voilà, j'ai fait une nouvelle version de l'exemple qui donne le résultat voulu, avec les deux compilateurs.

    J'ai pu mettre la main sur un code Free Pascal qui permet de choisir les dimensions de la fenêtre. J'ai donc pu ramener le nombre de lignes à 50.

    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
     
    constructor TDisk8Reader.Init;
    var Bounds: TRect;
        I: Integer;
    {$IFDEF FPC}
        VM: TVideoMode;
    {$ENDIF}
    begin
      if not inherited Init then Fail;
    {$IFDEF FPC}
      VM.col := 80;
      VM.row := 50;
      VM.color := TRUE;
      application^.SetScreenVideoMode(VM);
    {$ELSE}
      SetScreenMode(smCO80 or smFont8x8);
    {$ENDIF}
      //Redraw;
      InitClock;
    end;
    Ensuite, pour la "status line", j'ai trouvé en tâtonnant les valeurs à utiliser suivant le compilateur, sans vraiment comprendre pourquoi c'était ces valeurs-là qu'il fallait.

    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
    procedure TDisk8Reader.InitStatusLine;
    var Bounds: TRect;
    begin
    {$IFDEF FPC}
      //Bounds.Assign(0, 49, 80, 50);
      Bounds.Assign(0, 49 + 8, 80, 50 + 8);
    {$ELSE}
      Bounds.Assign(0, 24, 80, 25);
    {$ENDIF}
      StatusLine := New(PStatusLine, Init(Bounds, NewStatusDef(0, 0,
      NewStatusKey('~Alt+X~ Exit', kbAltX, cmQuit, nil), nil)));
    end;
     
    procedure TDisk8Reader.InitDesktop;
    var Bounds: TRect;
    begin
    {$IFDEF FPC}
      Bounds.Assign(0, 0, 80, 49 + 8);
    {$ELSE}
      Bounds.Assign(0, 0, 80, 49);
    {$ENDIF}
      Desktop := New(PDesktop, Init(Bounds));
    end;
    Je joins le code complet.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Et voici une version grand écran de l'exemple OUTDIR.PAS de Turbo Pascal. C'est un joli petit programme qui représente une arborescence de dossiers avec des caractères ASCII.

    Compilation testée : Free Pascal 2.6, Virtual Pascal.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] SWT Dimension de la fenêtre avec .setsize()
    Par steelidol dans le forum SWT/JFace
    Réponses: 6
    Dernier message: 20/04/2005, 20h57
  2. Cherche doc Turbo Vision pour C++
    Par BlueX_scf dans le forum Choisir un environnement de développement
    Réponses: 7
    Dernier message: 13/09/2004, 15h04
  3. [TP][Turbo Vision] MessageBox
    Par sovo dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 18/08/2004, 20h50
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24

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