Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
14 - MOTS DE 2 ET 3 LETTRES AU SCRABBLE

PRÉSENTATION : Ce programme permet d'imprimer sur une double page la liste des mots de 2 et 3 lettres admis au Scrabble.
ZIP : Téléchargez le zip APERÇUS :

NOTES : Ce n'est pas simplement une liste alphabétique, le programme trie les mots de trois lettres par extension avant ou arrière des mots de trois lettres. C'est très utile pour étudier des coups de maçonnerie dans le jeu.
Ce programme est un exemple de traitement d'un fichier texte, et d'impression directe en utilisant le TPrinter.

CODE :
Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

Type
  TForm1 = Class(TForm)
    Ouvrir: TOpenDialog;
    Button1: TButton;
    Procedure Button1Click(Sender: TObject);
  Private
    { Déclarations privées }
  Public
    { Déclarations publiques }
  End;

Var
  Form1: TForm1;

Implementation

Uses Printers;
{$R *.dfm}

Var
  Tableau2:Array[1..1000]Of String[2];
  Tableau3:Array[1..1000]Of String[3];
  TableauB:Array[1..1000]Of Boolean;
  Tableau4:Array[1..1000]Of String[4];
  Nombre2:Integer;
  Nombre3:Integer;

Const NombreY=60;
      Lettres='JKQWXYZ';

Procedure TForm1.Button1Click(Sender: TObject);
Var Liste:TStrings;
    TempStr:ShortString;
    i,j,k:Integer;
    Nombre:Integer;
    X,Y  :Integer;
    Base :Integer;
Begin
  If Not Ouvrir.Execute Then Exit;

  Liste:=TStringList.Create;
  Try
    // Lecture du fichier
    Liste.LoadFromFile(Ouvrir.FileName);
    Nombre2:=0;
    Nombre3:=0;
    For i:=0 To Liste.Count-1 Do If (Liste[i]<>''And (Liste[i][1]<>';'Then
    Begin
      If Length(Liste[i])=2
      Then Begin
        Inc(Nombre2);
        Tableau2[Nombre2]:=UpperCase(Liste[i]);
      End;
      If Length(Liste[i])=3
      Then Begin
        Inc(Nombre3);
        Tableau3[Nombre3]:=UpperCase(Liste[i]);
      End;
    End;

    // Tri des tableaux
    For j:=1 To Nombre2-1 Do For k:=j+1 To Nombre2 Do If Tableau2[j]>Tableau2[k]
      Then Begin TempStr:=Tableau2[j];Tableau2[j]:=Tableau2[k];Tableau2[k]:=TempStr;End;
    For j:=1 To Nombre3-1 Do For k:=j+1 To Nombre3 Do If Tableau3[j]>Tableau3[k]
      Then Begin TempStr:=Tableau3[j];Tableau3[j]:=Tableau3[k];Tableau3[k]:=TempStr;End;

    // Suppression des doublons
    i:=1;
    While i<Nombre2 Do
    Begin
      If Tableau2[i]=Tableau2[i+1]
      Then Begin
        For j:=i To Nombre2-1 Do Tableau2[j]:=Tableau2[j+1];
        Dec(Nombre2);
      End
      Else Begin
        Inc(i);
      End;
    End;
    i:=1;
    While i<Nombre3 Do
    Begin
      If Tableau3[i]=Tableau3[i+1]
      Then Begin
        For j:=i To Nombre3-1 Do Tableau3[j]:=Tableau3[j+1];
        Dec(Nombre3);
      End
      Else Begin
        Inc(i);
      End;
    End;

    // Création de la liste des mots
    Liste.Clear;
    FillChar(TableauB,SizeOf(TableauB),#0);
    For i:=1 To Nombre2 Do
    Begin
      Liste.Add('_'+Tableau2[i]+'_');
      Nombre:=0;
      For j:=1 To Nombre3 Do
      Begin
        If Pos(Tableau2[i],Tableau3[j])=1
        Then Begin
          Inc(Nombre);
          Tableau4[Nombre]:='_'+Tableau3[j];
          TableauB[j]:=True;
        End;
        If Pos(Tableau2[i],Tableau3[j])=2
        Then Begin
          Inc(Nombre);
          Tableau4[Nombre]:=Tableau3[j]+'_';
          TableauB[j]:=True;
        End;
      End;
      For j:=1 To Nombre-1 Do For k:=j+1 To Nombre Do If Tableau4[j]>Tableau4[k]
        Then Begin TempStr:=Tableau4[j];Tableau4[j]:=Tableau4[k];Tableau4[k]:=TempStr;End;
      For j:=1 To Nombre Do Liste.Add(Tableau4[j]);
      Liste.Add('');
    End;

    // Impression
    With Printer Do With Printer.Canvas Do
    Begin
      // En mode paysage
      Orientation:=poLandscape;
      BeginDoc;

      // Il faut toujours adapter la taille de la police à la résolution de l'imprimante !!!
      Font.Name:='Courier New';
      Y:=PageHeight Div (NombreY+8);
      Font.Height:=-Y;
      X:=TextWidth('A');

      // Impression des mots 'croisés'
      Base:=0;
      MoveTo(Base*X*7+X*5,y*6);
      LineTo(Base*X*7+X*5,y*6+NombreY*Y);
      For i:=0 To Liste.Count-1 Do
      Begin
        TempStr:=Liste[i];
        While Pos('_',TempStr)<>0 Do TempStr[Pos('_',TempStr)]:=' ';
        TextOut(((i Div NombreY)+Base)*X*7+X*6,(i Mod NombreY)*Y+Y*6,TempStr);
        If (i Mod NombreY)=0
        Then Begin
          MoveTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6);
          LineTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6+NombreY*Y);
        End;
        If TempStr=''
        Then Begin
          MoveTo(((i Div NombreY)+Base  )*X*7+X*5,(i Mod NombreY)*Y+Y*6+(Y Div 2));
          LineTo(((i Div NombreY)+Base+1)*X*7+X*5,(i Mod NombreY)*Y+Y*6+(Y Div 2));
        End;
      End;

      // Impression des autres mots
      Liste.Clear;
      Base:=17;
      MoveTo(Base*X*7+X*5,y*6);
      LineTo(Base*X*7+X*5,y*6+NombreY*Y);
      For i:=1 To Nombre3 Do If Not TableauB[i] Then Liste.Add(Tableau3[i]);
      For i:=0 To Liste.Count-1 Do
      Begin
        TempStr:=Liste[i];
        TextOut(((i Div NombreY)+Base)*X*7+X*6,(i Mod NombreY)*Y+Y*6,TempStr);
        If (i Mod NombreY)=0
        Then Begin
          MoveTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6);
          LineTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6+NombreY*Y);
        End;
      End;

      // Impression du titre
      Font.Name:='Arial';
      Font.Height:=-2*Y;
      TextOut(X*7,Y*3,'MOTS DE TROIS LETTRES GROUPES PAR EXTENSION D''UN MOT DE DEUX LETTRES');

      NewPage;
      Font.Name:='Courier New';
      Font.Height:=-Y;

      // Impression mots de deux lettres
      Liste.Clear;
      Base:=0;
      MoveTo(Base*X*7+X*5,y*6);
      LineTo(Base*X*7+X*5,y*6+NombreY*Y);
      For i:=1 To Nombre2 Do Liste.Add(Tableau2[i]);
      For i:=0 To Liste.Count-1 Do
      Begin
        TempStr:=Liste[i];
        TextOut(((i Div NombreY)+Base)*X*7+X*6,(i Mod NombreY)*Y+Y*6,TempStr);
        If (i Mod NombreY)=0
        Then Begin
          MoveTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6);
          LineTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6+NombreY*Y);
        End;
      End;

      // Impression des mots de trois lettres
      Liste.Clear;
      Base:=3;
      MoveTo(Base*X*7+X*5,y*6);
      LineTo(Base*X*7+X*5,y*6+NombreY*Y);
      For i:=1 To Nombre3 Do Liste.Add(Tableau3[i]);
      For i:=0 To Liste.Count-1 Do
      Begin
        TempStr:=Liste[i];
        TextOut(((i Div NombreY)+Base)*X*7+X*6,(i Mod NombreY)*Y+Y*6,TempStr);
        If (i Mod NombreY)=0
        Then Begin
          MoveTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6);
          LineTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6+NombreY*Y);
        End;
      End;

      // Impression des mots avec lettres chères
      For k:=1 To Length(Lettres) Do
      Begin
        Liste.Clear;
        Base:=14+K;
        MoveTo(Base*X*7+X*5,y*6);
        LineTo(Base*X*7+X*5,y*6+NombreY*Y);
        For i:=1 To Nombre2 Do If Pos(Lettres[k],Tableau2[i])<>0 Then Liste.Add(Tableau2[i]);
        For i:=1 To Nombre3 Do If Pos(Lettres[k],Tableau3[i])<>0 Then Liste.Add(Tableau3[i]);
        For i:=0 To Liste.Count-1 Do
        Begin
          TempStr:=Liste[i];
          TextOut(((i Div NombreY)+Base)*X*7+X*6,(i Mod NombreY)*Y+Y*6,TempStr);
          If (i Mod NombreY)=0
          Then Begin
            MoveTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6);
            LineTo(((i Div NombreY)+Base+1)*X*7+X*5,y*6+NombreY*Y);
          End;
        End;
      End;

      // Impression du titre
      Font.Name:='Arial';
      Font.Height:=-2*Y;
      TextOut(X*7,Y*3,'LISTE COMPLETE DES MOTS DE DEUX ET TROIS LETTRES');

      EndDoc;
    End;
  Finally
    Liste.Free;
  End;
End;

End.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -