Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| L'éditeur a été remanié | |
|
+7Minibug silverman papydall Jean Claude Yannick Klaus Jack 11 participants | |
Auteur | Message |
---|
Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: L'éditeur a été remanié Mar 28 Mar 2017 - 19:19 | |
| L'éditeur a été remanié et la logique d'exécution des sources a été changée. Maintenant, lors de l'exécution du source d'un onglet, par RUN, par F9 ou par un clic sur l'éclair, un exécutable temporaire s'appelant PANORAMIC_TEMP_[nom de l'onglet].exe est généré dans le répertoire où le source a été sauvegardé, ou dans le répertoire de l'éditeur si le source est nouveau. Cet exécutable est ensuite lancé. Il n'est plus possible d'exécuter une deuxième fois le source d'un onglet si l'exécutable correspondant est en cours d'exécution. Il y a alors un message d'erreur: PANORAMIC_TEMP_*****.exe cannot be generated. Maybe already running ? In this case, kill it manually: CTRL + ALT + DEL then Task Manager.
Si pour une raison diverse, il n'est pas possible d'exécuter le source, il s'affiche: ERROR : impossible to run PANORAMIC_TEMP_*****.exe Normalement, l'éditeur ne doit ni s'arrêter, ni se figer.Cette version n'est pas encore complètement terminée, mais elle devrait résoudre les problèmes rencontrés dernièrement. Attention, cela ne concerne que l'éditeur téléchargé à partir du forum ou directement à cette adresse: http://panoramic-language.pagesperso-orange.fr/PANORAMIC_EDITOR.zipLa version téléchargeable par le site (avec l'installation) sera modifiée ultérieurement, si cette nouvelle version donne satisfaction. Remarque : le fichier PANORAMIC_TEMP_*****.exe qui s'installe dans le répertoire du source N'EST PAS l'exécutable correspondant au source. Si par mégarde vous essayez de l'exécuter, il ne se passera rien de visible (il n'a pas de fenêtre) mais il va résider en mémoire. La seule manière de l'arrêter est de le "tuer" par le gestionnaire de tâche qu'on peut lancer par la combinaison CTRL + ALT + DEL. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 19:26 | |
| Cela me paraît aller dans la bonne direction, Jack. Je télécharge et je teste. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Mar 2017 - 19:28 | |
| Merci Jack. Je viens de télécharger et je testerai dans la soirée. Suite au prochain épisode... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 19:35 | |
| Premiers tests: résultat positif !
Une vingtaine de lancements sans plantage, alors qu'auparavant, je ne dépassais guère deux ou trois.
Et le fait d'avoir un nom de process plus parlant, c'est génial !
Je continue les tests.
EDIT
Même après une erreur dans le code source, et même après un plantage dans la DLL, le lancement suivant se passe bien. A priori, le problème de Panoramic_Editor est bel en bien résolu. Bravo, Jack !
J'adopte cette version. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Mar 2017 - 19:56 | |
| J' ai lancé la nouvelle version de l' éditeur. Avast s' est mis en route et m' a averti d' un danger potentiel. Il m' a demandé de l' envoyer au centre pour vérif. Avec appréhension mais je l' ai fait quand même et là, Bonne nouvelle ! Avast m' a répondu que le fichier est sain ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 21:30 | |
| Merci Jack, Cela devenait important... Je viens de faire un test rapide, pour le moment tout va bien. Je suis entrain de finaliser un jeu, je vais pouvoir l'utiliser pour affiner les tests. A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 21:31 | |
| Autre amélioration: Depuis longtemps, je ne pouvais plus réduire l'éditeur par la petite icône de réduction, dans sa barre de titre. Il fallait cliquer sur son icône en bas, dans la barre d'état. Or, ceci est corrigé avec la version que Jack vient de publier: l'icône de réduction fonctionne à nouveau normalement !
C'est un détail, certes, mais je trouve ça positif ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 22:18 | |
| @Jack J’ai téléchargé le nouvel éditeur. J’ai fais le test avec le code suivant - Code:
-
rem ============================================================================ rem Vagues rem ============================================================================ DIM NombreVague , VitesseVague DIM PASX ,PASY,x,y,ix,iy,r,g,b NombreVague = 200 : VitesseVague = 20 : PASX = 5 : PASY = 5 width 0,700 : height 0,500 caption 0,"Click pour terminer" while "PANORAMIC" = upper$("panoramic") x = x + VitesseVague : y = y + VitesseVague FOR IY = 0 TO height(0) STEP PASX FOR IX = 0 TO width(0) STEP PASY r = mod(ix+x+iy+y,255) g = mod(ix+x+iy+y,NombreVague) b = mod(ix+x+iy+y,255) 2d_pen_color r,g,b : 2d_fill_color r,g,b : 2d_circle ix,iy,5 NEXT ix if scancode <> 0 then terminate NEXT iy end_while rem ============================================================================
Après le RUN, j’ai eu le message d’erreur suivant Puis Puis je n’arrive pas à supprimer PANORAMIC_TEMP_Vagues.bas.exe ni par le gestionnaire de tâches ni en l’envoyant à la corbeille J'ai essayé le code ultra simple suivant Je vais rédemarer mon PC pour voir si ça continuera ou ... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 22:24 | |
| @Papydall: essaie d'enregistrer ton code dans un dossier normal, sans protéction particulière. Et exécute ensuite - ça marchera.
J'ai découvert en effet que Panoramic_Editor, copié dans un sous-dossier de "Program files (x86)", ne peut pas faire exécuter ne serait-ce qu'un code d'une seule ligne, car il essaie de créer son fichier temporaire dans son dossier d'installation (c'est d'ailleurs ce que Jack a annoncé !) et évidemment, cela ne marche pas si tu ne changes pas complètement les droits sur ce dossier, ce qu'il ne faut pas faire, bien sûr !
Solution: avant d'exécuter, enregistrer le source dans un dossier normal, dépendant de "Mes documents" par exemple. Et comme par magie, tout fonctionne ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 22:42 | |
| Mon code se trouve dans un dossier sur le bureau C:\Users\acer\Desktop\Panoramic\MesProgrammes | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 22:58 | |
| Je refais d’autres tests et cette fois ça marche, mais les exécutables temporaires PANORAMIC_TEMP_XXX.bas.exe restent dans le dossier. Est-ce normal ? Ne devraient-ils pas s’auto-détruire après l’exécution ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mar 28 Mar 2017 - 23:40 | |
| Je penseque c'est provisoire. Jack a bien dit que le programme n'est as finalisée, mais que c'est juste un test sur le fond. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mer 29 Mar 2017 - 0:03 | |
| Nouveau petit problème: Je sais bien que ce programme n'est pas finalisé. Mais la recherche ne marche pas... En effet, ctrl/F ouvre bien la fenêtre de recherche, mais la validation du critère provoque le message suivant: | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Mar 2017 - 2:23 | |
| J' ai voulu ouvrir un fichier et plantage. Message violent et ouverture de l' onglet sans caption... Editeur bloqué. Bon, Je t' en offre une boite... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mer 29 Mar 2017 - 3:26 | |
| Pour ma part, je le prends. L'éditeur, pas le médoc ! Malgré certains petits ennuis, le gros problème de plantage est résolu, à condition d'enregistrer le source avant de l'exécuter. Et ceci me permet à nouveau de faire mes tests dans de bonnes conditions.
Certes, de petits problèmes restent. Identifiés à ce jour: - impossible d'exécuter un source dans un nouvel onglet sans l'avoir enregistré dans un dossier sans protection particulière - recherche de chaînes de caractères (ctrl/F ou par lemenu Edition) impossible
Je pense que Jack aura tôt fait de corriger ces ennnuis bien identifiés. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: L'éditeur a été remanié Mer 29 Mar 2017 - 12:01 | |
| @jack Ca marche bien, je n'ai pas noté d'instabilité pour le moment, excellent! Il faudrait repenser la logique des #include également; Pourquoi un fichier à inclure est inclu au cours de l'éxecution du programme? Ne devrait-il pas l'être avant le lancement? - Code:
-
test() :' une sub quelconque dans l'include
end #include "my_test.txt" Ce code ne fonctionne pas, alors qu'il le devrait. De plus, placer un #include en début de programme décale le numéro de ligne qui à provoqué une erreur.(Mais il y a moyen de bricoler pour s'en sortir) @klaus Tu n'utilises pas synedit_editor pour coder? Comment ça se fait, c'est ton editeur personnel; Cela éveil ma curiosité... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Mer 29 Mar 2017 - 12:12 | |
| @Silverman: Bien sûr que j'utilise Synedit. C'est simplement, suite aux différents messages de Panoramiciens sur le plantage de Panoramic_Editor, je voulais en avoir le coeur net et j'ai approfondi la chose? D'ailleurs, au début, je n'arrivais pas à constater de tels plantages, et j'ai posté cela. Puis, petit à petit, en suivant les discussions sur le forum, j'ai réussi à reproduire de tels incidents. Et lorsque Jack a proposé une amorce de solutions, j'ai voulu en avoir le coeur net et j'en ai fait l'évaluation. Juste histoire d'y apporter mon grain de sel, dans un problème technique qui m'intéresse. | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: L'éditeur a été remanié Jeu 6 Avr 2017 - 19:19 | |
| Voici une nouvelle version de l'éditeur avec: - quelques améliorations - correction du bug sur la fonction "recherche" (erreur "No search engine has been assigned") Cette version est encore une version provisoire pour essai. http://panoramic-language.pagesperso-orange.fr/PANORAMIC_EDITOR.zipCet éditeur contient une version Panoramic instantanée V 0.9.28i1 "en l'état". Tout ce qui suit n'a pas été complètement testé ou le codage n'est pas complètement terminé. - les variables système NUMBER_SHOW (pour FORM et TAB) et NUMBER_ACTIVATE (pour FORM) fonctionnent même si il n'y a pas eu de déclaration de traitement d'événement (ON_SHOW et ON_ACTIVATE) - les fonctions INSTR_LAST() et INSTR_RIGHT() qui avaient disparu sont réintégrées - 5 nouvelles commandes pour EXCEL (codage non terminé) - 3 nouvelles fonctions pour EXCEL (codage non terminé) - 10 nouveaux objets, principalement dus à l'intégration des objets de Domoticom dans Panoramic: MEMO_RICH BUTTON_PICTURE MAIN_MENU_POP OPEN_DIALOG_PIC SAVE_DIALOG_PIC SHAPE LED1 DIGIT1 SWITCH1 SYNEDIT Connaissant l'impatience des Panoramiciens, voici quelques informations sur certains objets: BUTTON_PICTURE est un BUTTON qui visualise un caption et une image. Il est possible de positionner l'image par rapport au caption par les commandes PICTURE_TOP, PICTURE_LEFT, PICTURE_RIGHT, PICTURE_BOTTOM LED1 est une LED qu'on allume avec MARK_ON et qu'on éteint avec MARK_OFF DIGIT1 est un afficheur de chiffres. Vert par défaut, on peut le colorer par COLOR, et afficher un chiffre avec CAPTION SWITCH1 est un interrupteur SHAPE est un objet circulaire par défaut mais qui peut prendre différentes formes avec les commandes SHAPE_RECTANGLE_ROUNDED, SHAPE_SQUARE_ROUNDED, SHAPE_RECTANGLE, SHAPE_ELLIPSE, SHAPE_SQUARE, SHAPE_CIRCLE SYNEDIT permettra de développer des éditeurs ... _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re Jeu 6 Avr 2017 - 20:06 | |
| Je prends ! Merci Jack. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: L'éditeur a été remanié Jeu 6 Avr 2017 - 20:08 | |
| Bonne nouvelle,
Surtout pour la fonction recherche qui m’empêchait d'utiliser ce nouvel éditeur.
Pour le reste, il faut que je teste....
Merci Jack.
A+
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: L'éditeur a été remanié Jeu 6 Avr 2017 - 20:21 | |
| Merci Jack En plus ça tombe bien je suis en pleine reprise de GPP ! EDIT : Bon et bien il est 23:20 passé et cela fait maintenant plusieurs heures que j'utilise le nouvel éditeur et tout semble stable. Sauf peut être lors de plantage lié à une erreur de prog ou là j'ai eu un message avec les '0000' et tout le reste... Mais bon, un petit ménage dans le gestionnaire est tout est rentré dans l'ordre. Un grand BRAVO Jack !! Tu as travaillé comme un chef ! Et merci pour toutes ces nouvelles fonctions. Je n'ai pas tout testé car pas encore la doc mais j'ai dores et déjà intégré les BUTTON_PICTURE dans GPP. Ca c'est super ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Jeu 6 Avr 2017 - 23:58 | |
| Merci, Jack ! Je prends et je teste de suite ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: L'éditeur a été remanié Ven 7 Avr 2017 - 0:15 | |
| Premier résultat: l'inversion de WPARAM et LPARAM sur USER_EVENT semble bien corrigée. Par contre, le décalage sur lles valeurs est toujours le même: au premier évènement, WPARAM et LPARAM sonr zéro, au second évènement, ces variables ont mes valeurs du premier évènement etc. EDIT Voici le programme qui le montre: - Code:
-
' demo_ObjectMover.bas
label clic1, clic21, user dim res% : ' valeur retour des fonctions de la DLL dim OM1%, OM20% : ' objets ObjectMover dim type% : ' valeur passant de façon cyclique de 0 à 4 pour déterminer l'emplacement de OM1% dim EventData%(3) : ' tableau de 4 valeurs rempli par les objets OM1% et OM20% lors d'un USER_EVENT
dll_on "KGF.dll"
' Valable pour tout ce qui a un handle et peut recevoir un clic: form 1 : top 1,60 : left 1,300 : on_click 1,clic1 ' edit 1 : top 1,100 : left 1,200 : on_click 1,clic1 ' spin 1 : top 1,100 : left 1,200 : on_click 1,clic1 ' container 1 : top 1,100 : left 1,200 : on_click 1,clic1 ' panel 1 : top 1,100 : left 1,200 : on_click 1,clic1 ' ...
button 2 : caption 2,"Créer" : on_click 2,clic1 picture 3 : top 3,40 : left 3,10 : width 3,30 : height 3,30 : color 3,0,255,255 picture 31 : top 31,40 : left 31,40 : width 31,30 : height 31,30 : color 31,255,255,0
form 20 : border_hide 20 : top 20,300 : left 20,500 clipboard_copy 3 OM20% = dll_call6("CreateObjectMover",handle(20),1,0,0,width_client(20),22) res% = dll_call5("SetObjectMoverImage",OM20%,0,0,0,0) res% = dll_call2("SetObjectMoverUserEvent",OM20%,adr(EventData%)) button 21 : height 21,20 : top 21,1 : left 21,10 : caption 21,"Cliquez-moi" : on_click 21,clic21 parent 21,20
color 3,255,0,0 alpha 4 : top 4,90 : left 4,10 : caption 4,"Icône interne:" spin 5 : top 5,110 : left 5,10 : width 5,50 : min 5,0 : max 5,362 : position 5,362 : ' numéro de l'icône "état normal" pour OM1% !
alpha 6 : top 6,150 : left 6,10 : caption 6,"Largeur:" spin 7 : top 7,170 : left 7,10 : width 7,50 : min 7,0 : max 7,width_client(1) : position 7,0 alpha 8 : top 8,200 : left 8,10 : caption 8,"Hauteur:" spin 9 : top 9,220 : left 9,10 : width 9,50 : min 9,0 : max 9,height_client(1) : position 9,0
alpha 10 : top 10,260 : left 10,10 : caption 10,"User event:" edit 11 : top 11,280 : left 11,10 : width 11,600
on_user_event user gosub clic1
end
clic1: if OM1%=0 OM1% = dll_call6("CreateObjectMover",handle(1),type%,int(width_client(1)/2)-15,int(height_client(1)/2)-15,position(7),position(9)) res% = dll_call2("SetObjectMoverUserEvent",OM1%,adr(EventData%)) type% = type% + 1 if type%=5 then type% = 0 if object_type(1)=7 then to_foreground 1 if position(5)=0 clipboard_copy 3 res% = dll_call5("SetObjectMoverImage",OM1%,1,0,0,0) clipboard_copy 31 res% = dll_call5("SetObjectMoverImage",OM1%,0,0,1,0) else clipboard_copy 31 res% = dll_call5("SetObjectMoverImage",OM1%,2,position(5),1,0) end_if caption 2,"Supprimer" else OM1% = dll_call1("DeleteObjectMover",OM1%) caption 2,"Créer" if object_type(1)=7 then to_foreground 1 end_if return clic21: message "Je sais - vous avez voulu essayer..." return user: if OM1%<>0 if user_event_WParam=OM1% text 11,"Objet="+hex$(OM1%)+": wparam="+hex$(user_event_wparam)+" lparam="+hex$(user_event_lparam)+" EventData: x="+str$(EventData%(0))+" y="+str$(EventData%(1)) + " lparam="+hex$(EventData%(2))+" objet="+hex$(EventData%(3)) return end_if end_if if OM20%<>0 if user_event_WParam=OM20% text 11,"Objet="+hex$(OM20%)+": wparam="+hex$(user_event_wparam)+" lparam="+hex$(user_event_lparam)+" EventData: x="+str$(EventData%(0))+" y="+str$(EventData%(1)) + " lparam="+hex$(EventData%(2))+" objet="+hex$(EventData%(3)) return end_if end_if ' text 11,"Oups..." text 11,"Oups wparam="+hex$(user_event_wparam)+" lparam="+hex$(user_event_lparam)+" EventData: x="+str$(EventData%(0))+" y="+str$(EventData%(1)) + " lparam="+hex$(EventData%(2))+" objet="+hex$(EventData%(3)) return
A utiliser avec KGF.dll: http://klauspanoramic.comxa.com/versions/KGF.zipMode d'emploi: - lancer le programme - positionner le curseur sur le petit carré dans la fenêtre auxiliaire en haut, ou sur la barre de titre rouge de la fenêtre auxiliaire à droite - enfoncer le bouton gauche SANS le relâcher ==> on constate le texte dans l'obhet EDIT en bas: - Citation :
- Oups: wparam=0 lparam=0 ...
alors qu'à droite dans le même EDIT, on trouve l'affichage des cellules du tableau EventData% avec les bonnes valeurs - relâcher le bouton ==> on a, dans le même EDIT, les valeurs de wparam et lparam étant celles affichées dans EventData% lors du MouseDown, alors que les valeurs actuelles des cellules de EventData% sont correctes. Et ainsi de suite. Au cas où ce serait utile, voici le code de l'unité qui gère cela, dans KGF.dll: - Spoiler:
- Code:
-
{ Cette unité crée l'objet ObjectMover. Il peut être injecté dans n'importe quel objet fenêtré. Il réagit alors comme une barre de titre d'un ojtt FORM permettant de déplacer l'objet qui l'héberge, en le tirant par la souris. Par défaut, sa taille est de 16x16 pixels, mais elle est paramétrable.
Cet objet a deux états distincts: normal et actif. L'état est actif si l'objet est accroché par la souris pour effectuer un déplacement et redevient normal en relâchant l'objet. L'image par défaut de l'état noirmal est un carré rouge, et celle de l'état actif est un carr" jaune, mais on peut lui charger une icône interne à KGF.dll ou une bitmap externe, ou encore une mage du presse-papier. L'icône interne 362 est bien adaptée à cet usage. L'image sera automatiquement ajustée aux dimensions réelles de l'ObjectMover, mais attention aux déformations !
On peut dimensionner cet objet de sorte à obtenir une barre le long d'un des 4 côtés de l'objet hébergeant, créant ainsi un semblant de barre de titre ou d'outils, réagissante aux manipulation par la souris. On peut bien entendu placer des objets visuels par-dessus.
Lors d'un début et d'une fin de déplacement, un USER_EVENT est déclenché. Ceci est fait par l'envoi d'un message WM_USER+3000 à la form 0, avec les informations suivantes: LParam: LowWord(LParam) = 1 signifie ObjectMoverEvent HighWord(LParam) = 1 signifie Start moving HighWord(LParam) = 2 signifie Stop moving Wparam: LowWord(WParam) = x contient l'abscisse HighWord(WParam) = y contient l'ordonnée
ATTENTION ! A cause d'une inversion de USER_EVENT_LPARAM et USER_EVENT_WPARAM dans Panoramic, il faudra inverser ces valeurs dans ma présente unité lorsque ce bug sera corrigé ! } unit KGF_unit_ObjectMover;
interface uses Windows, Messages, Forms, Classes, Clipbrd, ImgList, SysUtils, Graphics, Controls, Dialogs, KGF_unit_data // unité contenant la variable globale MainFormHandle: HWND; <= handle de la form 0 ;
// définition de l'objet ObjectMover - dérive de TForm type TObjectMover = class(TForm) // déclaration des procédures internes de gestion de la souris class procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); class procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); class procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private // variables internes pour les propriétés FMoving: Boolean; // flag "déplacement en cours" fDragOrigin: TPoint; // coordonnées du coin en haut à gauche de l'objet contenant ObjectMover FDownX, FDownY: integer; // coordonnées du MouseDown sur ObjectMover FWinWidth, FWinHeight: integer; // dimensions de l'objet contenant ObjectMover FUserEventData: Integer; // adresse d'un tableau de 4 entiers à remplir sur MoseDown et MouseUp FNormalBMP: TBitMap; // image état normal FActiveBMP: TBitMap; // image état actif // procédures appelées par les propriétées et méthodes procedure SetNormalBMPFromClipboard(); procedure SetActiveBMPFromClipboard(); procedure SetNormalImageFromIcon(index: integer); procedure SetActiveImageFromIcon(index: integer); procedure SetNormalImageFromFile(bmpfile: integer); procedure SetActiveImageFromFile(bmpfile: integer); // protected public constructor CreateNew(AOwner: TComponent; ADestination: HWND; ALocation, ADimension: TPoint); //override; destructor Destroy; override; published // propriétés et méthodes property NormalBMP: TBitMap read FNormalBMP; property ActiveBMP: TBitMap read FActiveBMP; property UserEventData: Integer read FUserEventData write FUserEventData; property OnMouseDown; property OnMouseMove; property OnMouseUp; end;
const USER_EVENT_Message = WM_USER + 3000; UserEventOrigin_ObjectMover = $00000001; UserEventAction_ObjectMover_Down = $00010000; UserEventAction_ObjectMover_Up = $00020000; ID_MouseDown = UserEventOrigin_ObjectMover or UserEventAction_ObjectMover_Down; // $00010001 ID_MouseUp = UserEventOrigin_ObjectMover or UserEventAction_ObjectMover_Up; // $00020001
implementation
// création de l'objet ObjectMover // act: 0=(tp,lft) 1=top left 2=top right 3=bottom right 4=bottom left function CreateObjectMover(hdest: HWND; act,lft,tp,w,h: integer):integer; stdcall; export; var FM: TObjectMover; r: TRect; t, l, w0, h0: integer; begin result := 0; // initialement: objet non créé Windows.GetClientRect(hdest,r); // dimensions de l'objet recevant ObjectMover if w=0 then w0 := 16 else w0 := w; // largeur imposée ou 16 pixels si non spécifiée if h=0 then h0 := 16 else h0 := h; // hauteur imposée ou 16 pixels si non spécifiée // définir top et left en fonction du code action case act of 0: begin // (x,y) t := tp; l := lft; end; 1: begin // top left t := 0; l := 0; end; 2: begin // top right t := 0; l := r.Right-w0; end; 3: begin // bottom right t := r.Bottom-h0; l := r.Right-w0; end; 4: begin // bottom left t := r.Bottom-h0; l := 0; end; end; // création effective de l'objet FM := TObjectMover.CreateNew(nil,hdest,point(l,t),point(w0,h0)); with FM do begin show; // créer l'image par défaut de l'état normal - un carré rouge FNormalBMP := TBitMap.Create; With FNormalBMP do begin width := 16; height := 16; Canvas.Brush.Color := clRed; Canvas.FillRect(Rect(0,0,16,16)); end; // créer l'image par défaut de l'état activé - un carré jaune FActiveBMP := TBitMap.Create; With FActiveBMP do begin width := 16; height := 16; Canvas.Brush.Color := clYellow; Canvas.FillRect(Rect(0,0,16,16)); end; Canvas.StretchDraw(Rect(0,0,w,h),NormalBMP); // dessiner l'image de l'état normal UserEventData := 0; // initialement, pas de lien vers le tableau de 4 mots paint; OnMouseDown := TObjectMover.ControlMouseDown; // imposer les routines évènement de gestion de la souris onMouseMove := TObjectMover.ControlMouseMove; OnMouseUp := TObjectMover.ControlMouseUp; end; result := integer(FM); // et retourner l'objet ObjectMover en cas de réussite end;
// supprimer un objet ObjectMover function DeleteObjectMover(OM: TObjectMover):integer; stdcall; export; begin result := 0; if not assigned(OM) then exit; // cet objet n'exise pas ? abandon ! OM.FNormalBMP.Free; // supprimer les images d'abord, par sécurité OM.FActiveBMP.Free; OM.Free; // et supprimer ObjectMover end;
// routine interne de service, pour récupérer la bitmap associée à une icône interne à KGF.dll function GetInternalIcon(i: integer):TBitMap; var imglist: TImageList;
procedure ExtractResToFile(ResType, ResName, ResNewName : String); var Res : TResourceStream; begin Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName); Res.Free; end;
begin ExtractResToFile('DATAFILE','TOOLBAR_ICONS','.\KGF_temp.ilb'); // récupérer le fichier ilb imglist := TImageList.Create(nil); // créer une imagelist temporaire imglist.DrawingStyle := dsTransparent; imglist.BkColor := clBtnFace; imglist.Height := 16; imglist.Width := 16; result := TBitMap.Create; result.Width := 16; result.Height := 16; ReadComponentResFile('.\KGF_temp.ilb', imglist) ; // charger le fichier ilb dans cette liste if (i<1) or (i>imglist.Count) then begin imglist.Free; deletefile('.\KGF_temp.ilb'); exit; end; imglist.GetBitmap(i-1,result); imglist.Free; deletefile('.\KGF_temp.ilb'); end;
// charger les deux images possibles (état normal et actif) function SetObjectMoverImage(OM: TObjectMover; NormalTyp, NormalImg, ActiveTyp, ActiveImg: integer):integer; stdcall; export; var w, h: integer; begin result := -1; // supposer échec try if not assigned(OM) then exit; // ObjectMover non créé ? w := OM.Width - 1; // récupérer ses dimensions h := OM.Height - 1; // charger l'image de l'état normal (laisser inchangé si zéro !), et dessiner de suite case NormalTyp of 1: begin // presse-papier OM.SetNormalBMPFromClipboard(); OM.Canvas.StretchDraw(Rect(0,0,w,h),OM.NormalBMP); end; 2: begin // icône interne OM.SetNormalImageFromIcon(NormalImg); OM.Canvas.StretchDraw(Rect(0,0,w,h),OM.NormalBMP); end; 3: begin // fichier image externe if NormalImg<>0 then begin OM.SetNormalImageFromFile(NormalImg); OM.Canvas.StretchDraw(Rect(0,0,w,h),OM.NormalBMP); end; end; else exit; end; // charger l'image de l'état actif (laisser inchangé si zéro !), ne pas dessiner case ActiveTyp of 1: begin // presse-papier OM.SetActiveBMPFromClipboard(); end; 2: begin // icône interne OM.SetActiveImageFromIcon(ActiveImg); end; 3: begin // fichier image externe if ActiveImg<>0 then begin OM.SetActiveImageFromFile(ActiveImg); end; end; else exit; end; result := 0; // résultat ok except end; end;
// mémoriser l'adresse de début d'un tableau de 4 entiers, pour retourner des informations sur MouseDown et MouseUp function SetObjectMoverUserEvent(OM: TObjectMover; ptr: integer):integer; stdcall; export; begin result := -1; try if not assigned(OM) then exit; // ObjectMover non créé ? OM.UserEventData := ptr; result := 0; except end; end;
// constructeur privé de ObjectMover constructor TObjectMover.CreateNew(AOwner: TComponent; ADestination: HWND; ALocation, ADimension: TPoint); begin inherited CreateNew(AOwner); // créer une form normalement BorderStyle := bsNone; // pas de bords SetBounds(0,0,ADimension.X,ADimension.Y); // dimensions imposées Top := ALocation.Y; // position imposée Left := ALocation.X; color := clSilver; // couleur imposée Paint; ParentWindow := ADestination; // injecter O bjectMover dans l'objet ciblé //SendMessage(MainFormHandle,WM_USER+3000,$234,$345); end;
// suppression privée de ObjectMover destructor TObjectMover.Destroy; begin inherited Destroy; // supprimer la TForm, en réalité end;
// charger l'image de l'état normal du presse-papier procedure TObjectMover.SetNormalBMPFromClipboard(); begin FNormalBMP.Assign(Clipboard); end;
// charger l'image de l'état actif du presse-papier procedure TObjectMover.SetActiveBMPFromClipboard(); begin FActiveBMP.Assign(Clipboard); end;
// charger l'image de l'état normal à partir d'une icône de KGF.dll procedure TObjectMover.SetNormalImageFromIcon(index: integer); begin FNormalBMP.Assign(GetInternalIcon(index)); end;
// charger l'image de l'état actif à partir d'une icône de KGF.dll procedure TObjectMover.SetActiveImageFromIcon(index: integer); begin FActiveBMP.Assign(GetInternalIcon(index)); end;
// charger l'image de l'état normal à partir d'un fichier BMP procedure TObjectMover.SetNormalImageFromFile(bmpfile: integer); var s: string; begin if bmpfile<>0 then begin s := pstring(bmpfile)^; if s='' then exit; if not FileExists(s) then exit; FNormalBMP.LoadFromFile(s); end; end;
// charger l'image de l'état actif à partir d'un fichier BMP procedure TObjectMover.SetActiveImageFromFile(bmpfile: integer); var s: string; begin if bmpfile<>0 then begin s := pstring(bmpfile)^; if s='' then exit; if not FileExists(s) then exit; FActiveBMP.LoadFromFile(s); end; end;
// procédure privé pour l'évènement MouseDown - accrocher et activer ObjectMover class procedure TObjectMover.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ind, i, w, h: integer; r: TRect; s: string; begin with (Sender as TObjectMover) do begin w := Width; // prendre les dimensions de ObjectMover h := Height; FMoving := true; // marquer "en mouvement" (actif) FDownX := X; // mémoriser les coordonnées du clic d'accroche dans ObjectMover FDownY := Y; GetWindowRect((Sender as TObjectMover).ParentWindow,r); // prendre les coordonnées de l'objet hébergeant ObjectMover Canvas.StretchDraw(Rect(0,0,w,h),ActiveBMP); // dessiner l'image de l'état actif fDragOrigin.X := r.Left; // mémoriser le point de départ du déplacement de l'objet hébergeur fDragOrigin.Y := r.Top; FWinWidth := r.Right - r.Left + 1; // calculer les dimensions de ObjectMover FWinHeight := r.Bottom - r.Top + 1; if UserEventData<>0 then begin // l'adresse d'un tableau de 4 mots a été indiquée ? pinteger(UserEventData)^ := fDragOrigin.X; // indice 0: abscisse du hébergeur pinteger(UserEventData+4)^ := fDragOrigin.Y; // indice 1: ordonnée du hébergeur pinteger(UserEventData+8)^ := ID_MouseDown; // indice 2: signaler action "down" pour "ObjectMover" pinteger(UserEventData+12)^ := integer(Sender); // ObjectMover lui-même SendMessage(MainFormHandle,USER_EVENT_Message,ID_MouseDown,integer(Sender)); // créer le USER_EVENT dans Panoramic // *** les deux lignes suivantes sont juste pour les tests s := 'objet '+inttohex(integer(Sender),8)+' '+inttohex(ID_MouseDown,8); SendMessage(MainFormHandle,WM_SETTEXT,0,integer(pchar(s))); end; end; end;
// procédure privée pour l'évènement MouseMove - déplacer l'hébergeur si ObjectMover est actif class procedure TObjectMover.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var l, t: integer; s: string; r: TRect; begin with (Sender as TObjectMover) do begin if fmoving then begin // ObjectMover est actif ? l := X - FDownX + fDragOrigin.X; // calculer la nouvelle position de l'hébergeur t := Y - FDownY + fDragOrigin.Y; fDragOrigin.X := l; // mémoriser la nouvelle position fDragOrigin.Y := t; MoveWindow((Sender as TObjectMover).ParentWindow,l,t,FWinWidth,FWinHeight,true); // déplacer l'hébergeur end; end; end;
// procédure privée pour l'évènement MouseUp - décrocher ObjectMover et désactiver class procedure TObjectMover.ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ind, stk, i, w, h: integer; s: string; begin with (Sender as TObjectMover) do begin FMoving := false; // désactiver FDownX := X; // mémoriser la position de MouseUp FDownY := Y; w := Width; // prendre les dimensions de ObjectMover h := Height; Canvas.StretchDraw(Rect(0,0,w,h),NormalBMP); // dessiner l'image de l'état normal if UserEventData<>0 then begin // l'adresse d'un tableau de 4 mots a été indiquée ? pinteger(UserEventData)^ := fDragOrigin.X; // indice 0: abscisse du hébergeur pinteger(UserEventData+4)^ := fDragOrigin.Y; // indice 1: ordonnée du hébergeur pinteger(UserEventData+8)^ := ID_MouseUp; // indice 2: signaler action "up" pour "ObjectMover" pinteger(UserEventData+12)^ := integer(Sender); // ObjectMover lui-même SendMessage(MainFormHandle,USER_EVENT_Message,ID_MouseUp,integer(Sender)); // créer le USER_EVENT dans Panoramic // *** les deux lignes suivantes sont juste pour les tests s := 'objet '+inttohex(integer(Sender),8)+' '+inttohex(ID_MouseUp,8); SendMessage(MainFormHandle,WM_SETTEXT,0,integer(pchar(s))); end; end; end;
exports CreateObjectMover, DeleteObjectMover, SetObjectMoverImage, SetObjectMoverUserEvent ;
end.
| |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: L'éditeur a été remanié Ven 7 Avr 2017 - 13:53 | |
| J'ai un souci pour créer une application. Je ne m'en étais pas rendu compte avant, mais depuis la version 0927i9, lorsque j'en cré une, je ne peux pas la lancer et son icone n'est pas celle de panoramic; Un message apparait : "ce fichier est utilisé par une autre application". Je dois fermer panoramic editor pour pouvoir lancer mon application, tandis que son icone devient celle de panoramic. Je n'ai jamais eu de souci pour le mode executable (c'est ce mode que j'utilise la plupart du temps). Pour le reste, ça marche! Je suis impatient de voir cette version d'essai passer en version instantanée, les nouveaux objets ont l'air prometteur et j'ai hate d'en manipuler quelques uns...
Dernière édition par silverman le Ven 7 Avr 2017 - 17:37, édité 1 fois | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: L'éditeur a été remanié Ven 7 Avr 2017 - 14:43 | |
| Je viens de rencontrer un plantage assez violent avec la dernière version de l'éditeur. Si on fait une recherche jusqu’à la fin du programme, la dernière recherche n’aboutis pas sur une recherche terminée mais plante complètement l'éditeur ! Il ne reste plus qu' à ouvrir le Gestionnaire de tache et supprimer violemment le processus Panoramic. | |
| | | Contenu sponsorisé
| Sujet: Re: L'éditeur a été remanié | |
| |
| | | | L'éditeur a été remanié | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |