AIDE A/S: DÉFILEMENT D'UN TEXTE SOUS FORME D'IMAGE SUR UN AFFICHEUR À LEDS [Résolu]

Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
- - Dernière réponse : zwail1
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
- 17 avril 2010 à 16:39
Salut aux utilisateurs de cet espace !
Je suis un débutant en DELPHI
J essaye de travailler un soft pour défiler du texte sur un tableau d affichage (à LEDS)
Pour cela, avec la Méthode de ScanLine, j ai fais un Scan sur mon Image qui contiens le Texte(TextOut de Mon Edit), et à l aide de deux boucle j ai l extraction des couleurs différentes du Blanc, c elles qui conçoives mon texte converti en image.
Alors le Bute :
A partir de l image Scannée je veux Obtenir des 1 et des 0 pour les faire défiler sur la grille des leds.
Le probleme : j ai rien pu contre ça ? AIDE SVP ooOOoo S.O.S
J espère que je me suis bien exprimer, et merci
Je m excuse si j ai fais un double TOPIC, normalement j ai lu tout ce qui concerne ce genre d affichage mais Ouuups; j ai pas trouver ce que je cherche
La source:
* unit Unit1;
*
* interface
*
* uses
* Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
* Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, MarqueeLed, ExtDlgs;
* Const
* sizeLetter =18;
* HeightLetter =28;
* SizeBorder =11;
* HeightComponent =42;
*
* type
* TForm1 = class(TForm)
* Edit1: TEdit;
* Button1: TButton;
* Image1: TImage;
* Button2: TButton;
* procedure Button1Click(Sender: TObject);
* procedure FormDblClick(Sender: TObject);
* private
* { Déclarations privées }
* public
* { Déclarations publiques }
*
* end;
*
* var
* Form1: TForm1;
* Bitmap:TBitmap;
* P: PbyteArray;
* X,Y,FWidth,Fsize,Z,N : Integer;
* FledOff,FLEDOn : TCOLOR;
* Cadre,Cadre1:TRECT;
* Letter,Line,A:Word;
*
* implementation
*
* {$R *.dfm}
*
* procedure TForm1.Button1Click(Sender: TObject);
* begin
* Image1.Picture := Nil;
*
* //*************************************//
* // ** Exportation du Text vers Image**//
* //************************************//
* Image1.Canvas.TextOut(0,0,Edit1.Text);
* Bitmap := TBitmap.create;
*
* //**** Bitmap := Le contenu de l'Image1***//
*
* Bitmap.Assign(Image1.Picture);
* // Bloc Try ***** Finaly **//
* try
* Bitmap.Height := Image1.Height ;
* Bitmap.Width := Image1.Width ;
* // Scan l'Image (X,Y [Height et Width]) **
* for Y := 0 to Bitmap.Height-1 do
* begin
* P := Bitmap.ScanLine[Y];
* for X := 0 to Bitmap.Width-1 do
* P[Y] := X;
* end;
* // Deux Boucles Pour Extraire la Couleur Diff de Blache
* For Z:=0 To Bitmap.Width -1 do
* Begin
* For N:=0 To Bitmap.Height -1 do
* Begin
* If BItmap.Canvas.Pixels [Z,N]<>ClWhite Then
* Begin
* // Dessiner le Texte Sur le Canvas **//
* Canvas.Pixels [10+(Z*2),8+(N*2)]:= FLedOn;
* Canvas.Pixels [Succ(10+(Z*2)),Succ(8+(N*2))]:= FLedOn;
* end;
* end;
* end;
* finally
* //Liberer Espace Bitmap
* Bitmap.free;
* end;
* end;
* //*******************************************//
* //**** DESSIN DE LA GRILLE DES LEDS ****** //
* //******************************************//
* procedure TForm1.FormDblClick(Sender: TObject);
* begin
* Edit1.Enabled := True;
* Button1.Enabled := True;
* Fsize := 35;
* FledOff := ClGreen;
* FledOn := ClLime;
* FWidth := (SizeBorder*2)+(SizeLetter*Fsize);
* Cadre.Left := 0;
* Cadre.Top :=0;
* Cadre.Right := Fwidth;
* Cadre.Bottom := HeightComponent;
* Canvas.Brush.Color := ClBlack;
* Canvas.Pen.Color := ClGreen;
* frame3D(Canvas,Cadre,ClBlack,ClBlack,1);
* frame3D(Canvas,Cadre,ClWhite,ClBtnShadow,3);
* frame3D(Canvas,Cadre,ClBtnFace,ClBtnFace,3);
* frame3D(Canvas,Cadre,ClBtnShadow,Clwhite,2);
* canvas.FillRect(cadre);
* Cadre1.Left := sizeborder;
* Cadre1.Top :=sizeborder;
* Cadre1.Right := FWidth-sizeborder;
* Cadre1.Bottom := HeightComponent-sizeborder;
* Canvas.Brush.Color := ClBlack;
* Canvas.Pen.Color := ClBlack;
* Canvas.FillRect(Cadre1);
* For Letter:= 0 To FSize-1 Do
* for A := 0 to 05 do
* for line := 0 to 6 do
* begin
* canvas.Pixels [(sizeborder+(Letter*SizeLetter)+(A*3)),SizeBorder+(Line*3)]:= FledOff;
* canvas.Pixels [ Succ(sizeborder) +(letter*SizeLetter)+(A*3),Succ(SizeBorder)+(Line*3)]:= FledOff;
* end;
* end;
*
* end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, MarqueeLed, ExtDlgs;
Const
sizeLetter =18;
HeightLetter =28;
SizeBorder =11;
HeightComponent =42;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Image1: TImage;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDblClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }

end;

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
X,Y,FWidth,Fsize,Z,N : Integer;
FledOff,FLEDOn : TCOLOR;
Cadre,Cadre1:TRECT;
Letter,Line,A:Word;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture := Nil;

//*************************************//
// ** Exportation du Text vers Image**//
//************************************//
Image1.Canvas.TextOut(0,0,Edit1.Text);
Bitmap := TBitmap.create;

//**** Bitmap := Le contenu de l'Image1***//

Bitmap.Assign(Image1.Picture);
// Bloc Try ***** Finaly **//
try
Bitmap.Height := Image1.Height ;
Bitmap.Width := Image1.Width ;
// Scan l'Image (X,Y [Height et Width]) **
for Y := 0 to Bitmap.Height-1 do
begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
// Deux Boucles Pour Extraire la Couleur Diff de Blache
For Z:=0 To Bitmap.Width -1 do
Begin
For N:=0 To Bitmap.Height -1 do
Begin
If BItmap.Canvas.Pixels [Z,N]<>ClWhite Then
Begin
// Dessiner le Texte Sur le Canvas **//
Canvas.Pixels [10+(Z*2),8+(N*2)]:= FLedOn;
Canvas.Pixels [Succ(10+(Z*2)),Succ(8+(N*2))]:= FLedOn;
end;
end;
end;
finally
//Liberer Espace Bitmap
Bitmap.free;
end;
end;
//*******************************************//
//**** DESSIN DE LA GRILLE DES LEDS ****** //
//******************************************//
procedure TForm1.FormDblClick(Sender: TObject);
begin
Edit1.Enabled := True;
Button1.Enabled := True;
Fsize := 35;
FledOff := ClGreen;
FledOn := ClLime;
FWidth := (SizeBorder*2)+(SizeLetter*Fsize);
Cadre.Left := 0;
Cadre.Top :=0;
Cadre.Right := Fwidth;
Cadre.Bottom := HeightComponent;
Canvas.Brush.Color := ClBlack;
Canvas.Pen.Color := ClGreen;
frame3D(Canvas,Cadre,ClBlack,ClBlack,1);
frame3D(Canvas,Cadre,ClWhite,ClBtnShadow,3);
frame3D(Canvas,Cadre,ClBtnFace,ClBtnFace,3);
frame3D(Canvas,Cadre,ClBtnShadow,Clwhite,2);
canvas.FillRect(cadre);
Cadre1.Left := sizeborder;
Cadre1.Top :=sizeborder;
Cadre1.Right := FWidth-sizeborder;
Cadre1.Bottom := HeightComponent-sizeborder;
Canvas.Brush.Color := ClBlack;
Canvas.Pen.Color := ClBlack;
Canvas.FillRect(Cadre1);
For Letter:= 0 To FSize-1 Do
for A := 0 to 05 do
for line := 0 to 6 do
begin
canvas.Pixels [(sizeborder+(Letter*SizeLetter)+(A*3)),SizeBorder+(Line*3)]:= FledOff;
canvas.Pixels [ Succ(sizeborder) +(letter*SizeLetter)+(A*3),Succ(SizeBorder)+(Line*3)]:= FledOff;
end;
end;

end.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
3
Merci
Redirection vers:
http://www.delphifr.com/codes/DEFILEMENT-TEXTE-SOUS-FORME-IMAGE-SUR-AFFICHEUR-LEDS_51631.aspx

Amicalement

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 111 internautes nous ont dit merci ce mois-ci

Commenter la réponse de zwail1
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
2
0
Merci
Bj
Qu'elle dimension ta matrice de Leds?
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
alors salut Jean_Jean, j'ai dû modifier le code définitivement, en fonction de ce que je rencontre, alors j'ai fait extraire des 1 et des 0 a partir des couleurs de l'image texte ===> si la couleur est blanche le memo recevra le chiffre 0 sinon il recevra le chiffre 1
comme-ça j'aurai des lignes de 1 et de 0 qui me donneront un aperçu de l'image. alors j'ai modifié le programme comme suit:

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
FledOff,FLEDOn,FLED : TCOLOR;
Cadre,Cadre1:TRECT;
S: String;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
X,Y,Z,N,K,Line : INTEGER;
begin
FLEDOn := ClLime;
FLEDOFF := ClGray;
Image1.Picture := Nil;
S:= '';
MEMO1.Lines.Clear ;
Image1.Canvas.TextOut(0,0,Edit1.Text) ;
Bitmap := TBitmap.create;
try
Bitmap.Height := Image1.Height -1 ;
Bitmap.Width := Image1.Width ;
Bitmap.Assign(Image1.Picture);
Bitmap.Canvas.Font.Name :='Tahoma';
Bitmap.Canvas.Font.Size :=5;
for Y := 0 to Bitmap.Height-1 do
Begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
For Z:=0 To Bitmap.Width -1 do
For N:=2 To (Bitmap.Height-11) do
Begin
FLED:= BItmap.Canvas.Pixels [Z,N];

// Extraire la Couleur Diff du Blanc // Image en 1 et 0
If FLED <> ClWHite Then
S := S +'1'
Else
S := S +'0';

// Chaque ligne du memo1 recevra une S (String) ayant length de 12

If Length(S) = 12 Then
Begin
Memo1.Lines.Add(S);
S := '';
end;
end;

finally
Bitmap.free;
end;
// une boucle pour effacer les 00 inutiles = plus de six (06) lignes de 00 effacer le reste des Memo.Lines

K:=0;
For Line := 0 To Memo1.Lines.Count -1 do
Begin
If Memo1.Lines[Line]='000000000000' Then
K:=K+1
else K := 0;
While (K = 6) And (Memo1.Lines[Line]='000000000000') do
Memo1.Lines.Delete(Line);
end;
end;

Pour la matrice des laids elle va avoir les dimensions de 12 Lignes en fonctions de la taille de la lettre 12 Pix, mais les colonnes je ne sais pas encore, peut-être pour la boucle de défilement je donnerai 100 Pix, pour que l'exécution ne soit pas lente? comme suit:

Var M,A : INTEGER;
begin
For M:= 30 to 130 do
For A := 10 To 22 do begin
Canvas.Pixels [M*4,A*4]:= FLedOff;
end;

end;

maintenant il me reste de faire le défilement des 1 et des 0 sur le canvas?

ex:
soit tbl un array of Integer
dont sont length(tbl,12)

> Tbl[0]:= le 1er Index de la 1 ere ligne
du memo1
Tbl[1]:= le 2eme Index de la 1 ere
ligne du memo1
.
.
.
Tbl[11]:= le 11eme Index de la 1 ere
ligne du memo1
Prog: Tbl[0]:= StrToInt(Copy(Memo1.Lines[0],0;1));
mais j'ai pas su comment exploiter ça? !!! Car j'ai 12 Index dans chaque ligne du memo(c'est pas un probleme avec une boucle de 0 à 11), mais le probleme c'est de concevoir un tableau de dimension [X,y] dont X:= 0..11 et Y:= Memo1.Lines.Count-1
et d'allumer les pixels du canvas en fonction des 0 et des 1, je ne veux pas faire du défilement en copiant des cadres. merci de votre intention.

Amicalement
Commenter la réponse de zwail1
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
2
0
Merci
bj zwail1
Le fait de passer par un mémo me semble une mauvaise idée! C'est trop lent et troP de code pour si peu.
Il vaudrait mieux que tu travaille DIRECTEMENT à partir de ton tableau de bits!
Où tu veux en venir avec ce code. Il ne fait que recopier ton texte saisi dans le Edit en Image. Traduire du texte en image, c'est ton but?
Bonne prog
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
merci jean_jean de ta réponse
avec ce code la, je veux défiler un texte sur des un tableau de leds, mais je ne veux pas défiler directement le texte, je veux défiler l'image du texte, qlq soit les caractères écris de X langue même du chinois ou hindous, je veux avoir ce défilement, sans passer par la méthode des ASCII des caractères
c'est pour cela j'ai fais convertir le texte en image, puis faire la différence entre le blanc et une autre couleur (blanc=0 sinon =1), et l'image de défilement sera conçue a partir des 1 et des 0 (Bytes), alors si j'envoi un 1 la led correspondante s'allume, sinon elle reste éteinte, en ce qui concerne le memo, il n'est qu'une phase pour que je puisse voir le résultat devant moi, et que je vais remplacer par un TString sans forcement l'afficher sur l'écran

Amicalement
Commenter la réponse de zwail1
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
2
0
Merci
Donc si j'ai bien compris, ton tableau de led, c'est en fait ton image, c'est-à-dire ton tableau de pixels.
Evidamment faire un scanline à chaque fois serait peut-être long bien que ta matrice est très petite.
Où alors, il faut que tu copies ta nouvelle image (caractère illuminé décalé) soit en fait un deuxième bitmap. Puis tu affiche ton 2ème bitmap avec une tempo courte pour l'effet.
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
excuse pour mon retard, j'étais en mission de travail de deux (02) Jours

OK, j'ai réussi le défilement, dont j'ai fait un tableau multidimensionnel array of array of Integer, et j'ai changé complétement le code comme suit:(un bouton et un timer)


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, ExtDlgs, Spin;
Const
FLedOn =ClLIme;
FledOff=ClGray;
type
TForm1 = class(TForm)
SEND: TButton;
Image1: TImage;
Memo1: TMemo;
Timer1: TTimer;
Label1: TLabel;
Edit2: TEdit;
UpDown1: TUpDown;
Edit1: TEdit;
procedure SENDClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);

private
{ Déclarations privées }

public
{ Déclarations publiques }

end;

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
FLED : TCOLOR;
Cadre,Cadre1:TRECT;
S: String;
D:Integer;
Tbl: Array Of Array of Integer;
implementation

{$R *.dfm}

procedure TForm1.SENDClick(Sender: TObject);
Var
X,Y,Z,N,K,Line : INTEGER;
begin
Bitmap := TBitmap.create;
Image1.Picture := Nil;
S:= '';
Image1.Width := (Length(Edit1.Text)*5)+1;
MEMO1.Lines.Clear ;
Image1.Canvas.TextOut(0,0,Edit1.Text) ;
try
Bitmap.Height := Image1.Height -1 ;
Bitmap.Width := Image1.Width ;
Bitmap.Assign(Image1.Picture);
Bitmap.Canvas.Font.Name :='Tahoma';
Bitmap.Canvas.Font.Size :=5;
for Y := 0 to Bitmap.Height-1 do
Begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
For Z:=0 To Bitmap.Width -1 do
For N:=2 To (Bitmap.Height-11) do
Begin
FLED:= BItmap.Canvas.Pixels [Z,N];
If FLED <> ClWHite Then
S := S +'1'
Else
S := S +'0';
If Length(S) = 12 Then
Begin
Memo1.Lines.Add(S);
S := '';
end;
end;
finally
Bitmap.free;
end;
K:=0;
For Line := 0 To Memo1.Lines.Count -1 do
Begin
If Memo1.Lines[Line]='000000000000' Then
K:=K+1
else K := 0;
While (K = 6) And (Memo1.Lines[Line]='000000000000') do
Memo1.Lines.Delete(Line);
end;
Timer1.Enabled := True;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text :='Tapez Votre Journal ici !';
D:=0;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
Timer1.Enabled := False;
Memo1.Clear;
S:= '';
end;


procedure TForm1.Timer1Timer(Sender: TObject);
Var H,J,F : Integer;
begin
While D<J Do Begin
For J:= 1 To Memo1.Lines.Count -1 do
begin
For H := 0 to 11 do
Begin
SetLength(Tbl,Memo1.Lines.Count,12);
If Memo1.Lines [J]<>'' Then
Begin
Tbl[J,H]:= StrToINT(Copy(Memo1.Lines[J],H,1));
F:= Tbl[J,H];
If F=0 Then
FLED:= FLedOff
else
FLED := FLEDON;
Canvas.Pixels[((1+J)-D)*5, (10+H)*5]:= FLED;
Canvas.Pixels[Succ(((1+J)-D)*5), Succ((10+H)*5)]:= FLED;
Canvas.Pixels[Succ(Succ(((1+J)-D)*5)), Succ(Succ((10+H)*5))]:= FLED;
Canvas.Pixels[((3+J)-D)*5, (10+H)*5]:= FLEDOFF;
Canvas.Pixels[Succ(((3+J)-D)*5), Succ((10+H)*5)]:= FLEDOFF;
Canvas.Pixels[Succ(Succ(((3+J)-D)*5)), Succ(Succ((10+H)*5))]:= FLEDOFF;
end ;
end;
end;
D:=D+2; end; If D >= J Then D:=0;
end;

end.

mais le problème est ke le défilement est soit très rapide ou très lent, en fontion de la taille du texte !

Amicalement
Commenter la réponse de zwail1
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
Remarque:

à propos de la Variable D: Integer;
elle est pour déterminer le nombre de colonnes à sauter durant le défilement de l'image

Amicalement
Commenter la réponse de zwail1
0
Merci
zwail1 : t'es prié de pas emmerder les gens en MP pour qu'on t'aide à faire ton code ou que l'on te le corrige. Si tu as une question, tu vas sur le forum. Pas la peine de pourrir les bals des gens .
Commenter la réponse de Utilisateur anonyme
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
Amicalement
Commenter la réponse de zwail1
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
2
0
Merci
Tiens francky qui se fache!
@ zwail1
C'est vrai que tu gagnerais à poser une question précise soit en terme de méthodologie, soit sur un bout de code.
Ton code en ligne, c'est pas simple à lire. Et j'avoue que je n'ai pas bien compris ce que tu veux. Il faut dire que je passe très peu de temps en Delphi en ce moment...
J'ai tester ton code à un moment, à la limite, tu aurais pu en faire une publication modeste (il a son originalité). Tu aurais pu avoir des remarques de gens qui le testent. Bien sûr il faut accepter les critiques...
Bonne prog
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
18
Date d'inscription
vendredi 27 juin 2008
Dernière intervention
3 décembre 2010
0
Merci
A Jean_Jean (le sage), f0xi, Delphiprog et à Francky23012301(qui m’a rappelé à l’Ordre)

Excusez moi de vous avoir embêtés par mes MP, j’espère qu’une telle attitude ne ce reproduira plus de ma part.
Cela fait maintenant presque plus d’une semaine que je suis sur ce truc, et je vois que ça n’avance pas, je ne veux baisser les bras aussi facilement, mais je vois aussi que j’y arrive même pas à résoudre ce problème.

Voila ! sur ce topic vous trouverez toutes les étapes que j’ai fait de ma première vue conceptuelle jusqu’à présent, j’espère trouver quelqu’un qui a déjà passé par ces étapes, ou vous pouvez me guider vers un autre topic qui a déjà étudié cette difficulté.

Alors 1000 excuse de ma conduite aussi bête !

Jean-Jean, tu penses que je pourrai publier un code qui n’est pas acheminé ?
Pour les critiques, c’est normal tant que je veux apprendre
Commenter la réponse de zwail1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.