FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Pourquoi le compilateur stagne
par Jean Claude Aujourd'hui à 9:54

» Immortaliser les photos de famille
par jjn4 Hier à 18:29

» Concours de Morpions
par jjn4 Hier à 18:11

» Compilateur FBPano
par jean_debord Hier à 10:12

» Tout est tranquille
par Jean Claude Ven 22 Sep 2017 - 21:41

» Texte en gif animé
par JL35 Ven 22 Sep 2017 - 13:29

» BasicEditor
par Yannick Mer 20 Sep 2017 - 17:17

» Simuler l’appui d'une touche ou combinaison de touches.
par pascal10000 Lun 18 Sep 2017 - 19:30

» Utilisation de HVIEWER pour afficher des images
par papydall Lun 18 Sep 2017 - 17:43

» Panoramic et les gifs animés.
par papydall Lun 18 Sep 2017 - 16:32

» recover source
par pascal10000 Dim 17 Sep 2017 - 14:21

» Recent dans vos menu
par Jean Claude Sam 16 Sep 2017 - 11:41

» Comment centrer un texte 3D.
par pascal10000 Ven 15 Sep 2017 - 20:20

» Carte interface 16 entrées et 16 sorties
par Jicehel Ven 15 Sep 2017 - 16:30

» Version instantanée V 0.9.28i9 possédant l'objet SYNEDIT
par pascal10000 Ven 15 Sep 2017 - 16:20

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 WriteTextOverPicture

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: WriteTextOverPicture   Jeu 20 Fév 2014 - 0:45

Bonsoir Klaus,
J'ai un comportement bizarre avec cette fonction de ta dll, pourtant il me semble bien que je l'utilisais avant sans problèmes.
Parfois l'affichage ne se fait pas et je ne comprends pas pourquoi (ça n'affiche jamais d'erreur, et les codes retour sont toujours à zéro).
Normalement cette fonction n'affiche qu'une seule ligne de texte, j'ai fait une petite sub pour pouvoir en afficher plusieurs, voici le petit programme de test:
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
DLL_ON "C:\PANORAMIC\KLAUS\DLLs\KGF.dll"

txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"
txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END
' ==============================================================================
SUB Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%
FONT_SIZE pic%,INT(attr%/16): ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
y% = INT(pos%/65536): x% = BIN_AND(pos%,65535)
k% = INSTR(txt$,CHR$(13)+CHR$(10)): ' si multiligne
IF k% > 0
    REPEAT
        a$ = LEFT$(txt$, k%-1): txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%: k% = INSTR(txt$,CHR$(13)+CHR$(10))
    UNTIL k% = 0
END_IF
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
' message txt$
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
END_SUB
(à la place de la boucle Repeat/Until j'avais un While/End_While qui est plus logique mais ça ne marchait pas du tout).
Je n'affiche qu'une seule ligne de texte, que ce soit un texte de 3 ligne ou d'une ligne, et si je mets des points d'arrêt pour voir (Stop ou Message), là ça s'arrête bien mais ensuite ça n'affiche plus rien du tout.
Il doit y avoir un conflit quelque part, mais j'y perds mon latin (enfin, le peu qui me reste...);

Ce n'est pas vital, mais ça m'agace de ne pas comprendre ce qui se passe.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 3:11

Bizarre. Je regarde ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 11:29

Bon, j'ai trouvé. C'était dur, car ce n'est pas une erreur d'écriture de ta part. Ce n'est pas non plus un bug dans KGF.dll.

C'est un vrai bug dans Panoramic.

Je m'explique. Que ce soit une construction REPEAT...UNTIL ou WHILE...END_WHILE, ça ne marche pas du tout, dans ta procédure. Seule une construction LABEL...IF...GOTO marche !

J'ai ajouté la solution ans ton code, avec des commentaires. Tu peux basculer dune version à l'autre, en activant ou désactivant les lignes marquées OK ou bad. Actuellement, le code est en configuration ok:
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
DLL_ON "KGF.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

label loop      : ' ok
loop:          : ' ok
' IF k% > 0          : ' bad
'    REPEAT          : ' bad
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
' END_IF                    : ' bad
if k%>0 then goto loop    : ' ok

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
END_SUB

C'est la solution brutale, mais tout en étant opérationnelle, elle prouve le problème dans Panoramic.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 11:48

C'est toi le meilleur Klaus !

Je subodorais bien quelque chose comme ça, puisque le Repeat marchait mieux (mais pas parfait) que le While qui ne marchait pas du tout. Et les stop et Message qui bloquaient tout. Mais je n'ai pas été comme toi jusqu'au Goto...

Bizarre tout de même, parce que j'avais cette sub dans ma collection, j'avais bien dû la tester, est-ce que c'est un phénomène nouveau dans Panoramic ?

Dans tous les cas un grand merci à toi Klaus qui me débloques la situation, je vais donc le faire à la brutale, avec le Goto (qui est-ce qui a dit que cette instruction devrait disparaître ?)

PS: juste une remarque, il faut quand même tester en tête de la boucle si k% > 0, sinon ça plante dans le cas d'une ligne unique:
Code:
loop:
   IF k% > 0
      ...
   END_IF
IF k% > 0 THEN GOTO loop
ce n 'est pas très joli, mais nécessaire.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité



MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 12:15

Etant bloqué pour le moment, et devant mon ordi, je jette un oeil sur ce post.
Je e suis pas d'accord sur la conclusion. Pour moi ce n'est pas repeat ou autre qui est en cause. Peut-être un problème avec la dll ou un focus. Si je rajoute un message tout simple après le premier envoi, même le goto ne fonctionne plus.

Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "C:\PANO\DLL\DLLs\kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

label loop      : ' ok
loop:          : ' ok
' IF k% > 0          : ' bad
'    REPEAT          : ' bad
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
' END_IF              : ' bad
message a$+crlf$+txt$
if k%>0 then goto loop    : ' ok

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
END_SUB

Il faut chercher ailleurs.
Revenir en haut Aller en bas
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 13:18

Tu as raison, le comportement est quand même bizarre, mais pour moi ça vient de Panoramic. Je reprends l'exemple:
Code:
DIM pic%,pid%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%,crlf$
crlf$ = chr$(13)+chr$(10)
width 0,700 : color 0,0,255,255

pic% = 1: PICTURE pic%: WIDTH pic%,300: HEIGHT pic%,300
' pid% = 2: PICTURE pid%: LEFT pid%,350: WIDTH pid%,300: HEIGHT pid%,300

DLL_ON "c:\panoramic\klaus\dlls\KGF.dll"
txt$ = "1ère ligne de 2 lignes"+crlf$+"2ème ligne de 2 lignes"+crlf$+"aaaa"+crlf$+"bbbb"
fnt$ = "Times New Roman"
pos% = 20 + 40*65536: ' x=20, y=40
attr% = 20*16: ' taille 40
coul% = 255*65536: ' couleur bleue

Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
' Text2Pic(pid%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
if label("Loop")=0 then label Loop
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
y% = INT(pos%/65536): x% = BIN_AND(pos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne
if k% > 0
Loop:
    a$ = LEFT$(txt$, k%-1): txt$ = MID$(txt$,k%+2,1000)
    pos% = x% + 65536*y%
    res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
    y% = y% + ht%
    k% = INSTR(txt$,crlf$): if k%>0 then goto Loop
end_if
pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
END_SUB
Tel quel, ça marche.
Mais si je déclare un deuxième picture à côté du 1er (décocher la ligne PICTURE pid%), ça tronque l'affichage du 1er, tout se passe comme si le 1er picture était réduit aux dimensions implicites (105x105), en largeur et en hauteur.
Si j'affiche le texte dans le 2ème, ça se fait normalement.

Et c'est ce qui se passe dans mon application, j'ai deux pictures côte à côte, et je n'arrive pas à afficher le texte dans le 1er avec la fonction de Klaus.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 13:33

Encore plus étrange: si je place le message immédiatement après le dernier appel à la fonction DLL, tout marche bien - même le dernier texte imprimé par la fonction apparaît, alors qu'à l'intérieur de la boucle, un tel message bloque l'apaprition du texte imprimé par la fonction appelée juste avant:
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

IF k% > 0
'    REPEAT          : ' bad
label loop      : ' ok
loop:          : ' ok
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
 message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
if k%>0 then goto loop    : ' ok
END_IF

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
END_SUB

Je ne comprends pas pourquoi ça marche dans ce cas, et pas quand le message est dans la boucle.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 13:46

Je commence à y vois plus clair. En fait, le handle du canvas change d'un appel à l'autre:
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hnd% = HANDLE_CANVAS(pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

IF k% > 0
'    REPEAT          : ' bad
label loop      : ' ok
loop:          : ' ok
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        if handle_canvas(pic%)<>hnd% then message "oups "+str$(handle_canvas(pic%))
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
 message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
if k%>0 then goto loop    : ' ok
END_IF

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
END_SUB
Et même si je recharge la varaible hnd% avec le nouveau handle_canvas(pic%), le lien avec le canvas précédent est perdu, et on n'affiche plus rien.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 13:56

Une nouvelle pierre au puzzle:
si je cache le picture par HIDE au début, et je le réaffiche à la fin par SHOW, la situation s'améliore:
- les (n-1) premières lignes sont bien imprimées MALGRE la présence des messages
- seule la dernière ligne a disparue

C'est donc bien lié au canvas et un problème de timing certainement pour la mise à jour visuelle. Voici la preuve:
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16) : ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte
hide pic%
hnd% = HANDLE_CANVAS(pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

IF k% > 0
'    REPEAT          : ' bad
label loop      : ' ok
loop:          : ' ok
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        if handle_canvas(pic%)<>hnd% then message "oups "+str$(handle_canvas(pic%))
        hnd% = HANDLE_CANVAS(pic%)
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
 message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
if k%>0 then goto loop    : ' ok
END_IF

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !
show pic%
END_SUB
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 15:17

Mais oui Klaus, effectivement ça semble résoudre mon problème: Je fais Hide du picture avant l'opération d'écriture puis Show après, et mon texte s'affiche correctement, toutes les lignes !

Il y a sûrement un problème de timing dans windows qui court-circuite l'affichage, bizarre tout de même et anormal, ça devrait finir par se faire, mais en tout cas j'adopte la solution Hide/Show qui fonctionne et qui me permet de faire ce que je veux, même si c'est un peu obscur...

Pour le handle, j'y avais pensé et essayé de le refaire à chaque fois, mais ça ne changeait rien.

Une petite remarque annexe, pour afficher les lignes suivantes, je fais progresser le y d'une valeur égale à Text_Height(...). Or j'ai constaté depuis longtemps que l'écartement obtenu est beaucoup trop grand, et je le multiplie par 0,65 (valeur arbitraire) pour avoir une valeur correcte. Pourquoi ? je sais pas...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 15:50

Je ne sais pas. Le l'ai constaté aussi. Dans ton exemple, si tu forces la taille de plice du picture à 24, ça semble présenter correctement. Ce qui confirme ce que tu dis.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 16:57

Une autre technique:
1. copier le picture initial via un image dans un picture caché
2. faire les écritures de textes
3. recopier le picture caché via un image dans le picture d'origine
4. faire le message qui empêchait l'affichage de la dernière ligne
===> tout est correct !
Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16)
ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte

picture 2 : hide 2 : width 2,width(pic%) : height 2,height(pic%)
image 3
2d_target_is pic%
2d_image_copy 3,0,0,width(pic%),height(pic%)
2d_target_is 2
2d_image_paste 3,0,0

' hide pic%
hnd% = HANDLE_CANVAS(2)  : ' pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

IF k% > 0
'    REPEAT          : ' bad
label loop      : ' ok
loop:          : ' ok
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
'    UNTIL k% = 0            : ' bad
if k%>0 then goto loop    : ' ok
END_IF

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !

2d_target_is 2
2d_image_copy 3,0,0,width(2),height(2)
2d_target_is pic%
2d_image_paste 3,0,0
delete 3
delete 2

' show pic%
END_SUB

Et dans ce cas, ça marche même avec la boucle REPEAT...UNTIL ! Plus besoin du LABEL...IF...GOTO !

Code:
DIM pic%,pos%,hnd%,txt$,fnt$,attr%,coul%,res%
pic% = 1: PICTURE pic%: FULL_SPACE pic%
dll_on "kgf.dll"
txt$ = "1ère ligne de 2 lignes"+CHR$(13)+CHR$(10)+"2ème ligne de 2 lignes"+CHR$(13)+CHR$(10)+"aaaa"+CHR$(13)+CHR$(10)+"bbbb"
' txt$ = "Ligne unique"
fnt$ = "Times New Roman"
pos% = 50 + 40*65536: ' x=50, y=40
attr% = 40*16: ' taille 40
coul% = 255*65536: ' couleur bleue

dim cas$
cas$ = "REPEAT"
cas$ = "GOTO"
Text2Pic(pic%,pos%,txt$,fnt$,attr%,coul%)
END

' ==============================================================================
SUB Text2Pic(pic%,xpos%,xtxt$,fnt$,attr%,xcoul%)
' Affichage du texte txt$ sur l'objet pic%, en position pos% (=X+Y*65536),
' police fnt$, attributs attr% (= B=1, I=2, U=4, S=8, + 16*taille, maxi 63),
' couleur coul% format BGR (=(256*B + G)*256 + R).
' Le texte peut faire plusieurs lignes, séparées par des RC/AL= &hOD0A
DIM_LOCAL a$,hnd%,ht%,k%,x%,y%,res%,pos%,txt$,coul%
dim_local crlf$ : crlf$ = chr$(13)+chr$(10)
FONT_SIZE pic%,INT(attr%/16)
ht% = TEXT_HEIGHT("ABCjkl",pic%): ' hauteur texte

picture 2 : hide 2 : width 2,width(pic%) : height 2,height(pic%)
image 3
2d_target_is pic%
2d_image_copy 3,0,0,width(pic%),height(pic%)
2d_target_is 2
2d_image_paste 3,0,0

' hide pic%
hnd% = HANDLE_CANVAS(2)  : ' pic%)
txt$ = xtxt$
coul% = xcoul%
y% = INT(xpos%/65536): x% = BIN_AND(xpos%,65535)
k% = INSTR(txt$,crlf$): ' si multiligne

IF k% > 0
    REPEAT          : ' bad
' label loop      : ' ok
' loop:          : ' ok
        a$ = LEFT$(txt$, k%-1)
        txt$ = MID$(txt$,k%+2,1000)
        pos% = x% + 65536*y%
        res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(a$),ADR(fnt$),attr%,coul%)
        y% = y% + ht%
        k% = INSTR(txt$,crlf$)
    UNTIL k% = 0            : ' bad
' if k%>0 then goto loop    : ' ok
END_IF

pos% = x% + 65536*y%: coul% = 255: ' couleur rouge
res% = DLL_CALL6("WriteTextOverPicture",hnd%,pos%,ADR(txt$),ADR(fnt$),attr%,coul%)
message a$+crlf$+txt$  : ' <========= cette ligne bloque la mise à jour du canvas du picture !

2d_target_is 2
2d_image_copy 3,0,0,width(2),height(2)
2d_target_is pic%
2d_image_paste 3,0,0
delete 3
delete 2

' show pic%
END_SUB
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 19:58

Merci Klaus de t'être obstiné là-dessus pour arriver à un résultat.

C'est la solution que je vais finalement adopter, je pense, ce qui me plaît moins c'est d'être obligé de déclarer des objets temporaire à l'intérieur d'une Sub mais bon, je prendrai les précautions d'usage.
Et avec un While k%>0 (à la place du Repeat/Until) plus besoin du test If en tête de la boucle. sauf que ça ne marche pas avec le While...

Merci à toi en tout cas.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 20:22

Pour les objets temporaires, tu peux faire ainsi:
Code:
dim_local PIC1%, IMG%
for PIC1%=1 to 30000
  if object_exists(PIC1%) then exit_for
next PIC1%
picture PIC1% : hide PIC1% : ...
for IMG%=PIC1%+1 to 30000
  if object_exists(IMG%) then exit_for
next IMG%
image IMG%
...
delete IMG%
delete PIC1%

Comme ça, aucun conflit possible avec des numéros d'objets existants.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5951
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: WriteTextOverPicture   Jeu 20 Fév 2014 - 20:37

Oui, c'est ce que je fais dans ce cas.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: WriteTextOverPicture   

Revenir en haut Aller en bas
 
WriteTextOverPicture
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Activité des sites créés par les Panoramiciens. :: Le site de Klaus-
Sauter vers: