FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
WriteTextOverPicture Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
WriteTextOverPicture Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
WriteTextOverPicture Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
WriteTextOverPicture Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
WriteTextOverPicture Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
WriteTextOverPicture Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
WriteTextOverPicture Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
WriteTextOverPicture Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
WriteTextOverPicture Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
WriteTextOverPicture Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
WriteTextOverPicture Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
WriteTextOverPicture Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
WriteTextOverPicture Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
WriteTextOverPicture Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
WriteTextOverPicture Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -29%
DYSON V8 Origin – Aspirateur balai sans fil
Voir le deal
269.99 €

 

 WriteTextOverPicture

Aller en bas 
2 participants
AuteurMessage
JL35




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

WriteTextOverPicture Empty
MessageSujet: WriteTextOverPicture   WriteTextOverPicture EmptyMer 19 Fév 2014 - 22: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
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 1:11

Bizarre. Je regarde ça.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 9: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
http://klauspanoramic.comxa.com/index.html
JL35




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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 9: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
Invité
Invité




WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 10: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 : 7112
Localisation : 77
Date d'inscription : 29/11/2007

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 11: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
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 11: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
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 11: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
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 11: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
http://klauspanoramic.comxa.com/index.html
JL35




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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 13: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
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 13: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
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 14: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
http://klauspanoramic.comxa.com/index.html
JL35




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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 17: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
Klaus

Klaus


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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 18: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
http://klauspanoramic.comxa.com/index.html
JL35




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

WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture EmptyJeu 20 Fév 2014 - 18:37

Oui, c'est ce que je fais dans ce cas.
Revenir en haut Aller en bas
Contenu sponsorisé





WriteTextOverPicture Empty
MessageSujet: Re: WriteTextOverPicture   WriteTextOverPicture Empty

Revenir en haut Aller en bas
 
WriteTextOverPicture
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: