Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Solution à mon problème
Bonjour la communauté,
Le problème que je m’en vais décrire, je l’ai déjà posé sur ce forum, mais face à mes difficultés dans la résolution de celui-ci, et en relisant mes anciens posts, je me suis dit que je posais sûrement mal le problème d’où les réponses bien que constructives ne m’ont pas aidé à apporter des solutions. Je me permets donc de refaire un post en décrivant à mon avis clairement ce que je vis comme difficulté. Je vous prie donc d’être indulgent.
J’ai eu à designer les fenêtres d’une application que j’ai eu à développer sur un écran de très haute résolution (1366*900). Je pensais que cela devait se comporter comme toutes les autres applications développé avec d’autres logiciels qui ajustent leur fenêtre ainsi que ses composants (Champs de texte, Boutons, etc…) ou controls (Dans la terminologie PowerBuilder) automatiquement en fonction des écrans d’ordinateurs sur lesquelles elles seront installés.
En effet, dans mon application j’ai toutes mes fenêtres héritent d’une fenêtre mère que j’ai appelée w_app_basesheet qui elle-même hérite de Windows. Je voudrai que les controls ainsi que la fenêtre principale, les fenêtres filles ainsi que les controls puisses s’ancrer automatiquement que le logiciel fonctionne sous un ordinateur avec écran de résolution 800*600(Réduction de la hauteur et de la largeur des controls par rapport à l’origine) ou un ordinateur de résolution de 1660*1440(Augmentation de la hauteur et de la largeur des controls par rapport à l’origine).
J’espère avoir été claire cette fois. Je suis à votre « écoute » pour d’éventuelle question y relative.
Bonne fête du travail à tous.
Hors ligne
Bonjour,
Tu souhaites que les fenêtres que tu as développé s'affichent de la même façon quelque soit la résolution de l'écran. Il faut donc partir sur le fait que la résolution 1366*900 (ta résolution de développement) est la résolution étalon.
La seule chose a faire est de déterminer le ratio entre la résolution étalon et la résolution de l'utilisateur.
Exemple : Un utilisateur avec un écran en 1660*1440 a une résolution 1,22% (1660 / 1366) plus grande en largeur et 1,6% (1440 / 900) plus grande en hauteur.
Tu as désormais tout ce qu'il faut pour redimensionner les contrôles à l’intérieur de l'écran en codant l’événement resize.
Exemple : en reprenant l'exemple ci dessus
//evenement resize de la fenêtre mère Decimal{2} ratio_largeur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Decimal{2} ratio_hauteur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Integer nb_controles Integer i=1 ratio_largeur = newWidth/il_largeur_etalon // il_largeur_etalon est la variable d'instance représentant la largeur de la résolution étalon : 1366 ratio_hauteur = newHeigth/il_hauteur_etalon // il_hauteur_etalon est la variable d'instance représentant la hauteur de la résolution étalon : 900 nb_controles = UpperBound(this.Control) // Nombre de contrôles sur la fenêtre For i=1 To nb_controles this.Control[i].X = this.Control[i].X * ratio_largeur this.Control[i].Width = this.Control[i].Width * ratio_largeur this.Control[i].Y = this.Control[i].Y * ratio_hauteur this.Control[i].Heigth = this.Control[i].Heigth * ratio_hauteur Next
Je n'ai pas du tout testé le code mais ça devrait être quelque chose du genre.
Hors ligne
Bonjour,
Merci Nephtis pour cette piste de solution qui me semble être la plus intéressante. Cependant j'ai pris le soin de mettre ce bout de code dans l'évènement resize dans le but de le tester, mais je suis actuellement buté sur une erreur que voici :
"Incompatibe property x for type windowobject"
"Incompatibe property width for type windowobject"
"Incompatibe property y for type windowobject"
"Incompatibe property heigth for type windowobject"
Je viens auprès de vous pour m'aider à résoudre ce problème
Bonne journée à tous
Hors ligne
En fait la propriété Control d'une fenêtre renvoie une liste de WindowObject
Control[ ] WindowObject Contains the controls in the window. You should not change the contents of this array in a script.
Ce n'est pas un objet manipulable en tant que tel, il te faut encore déterminer son type : datawindow, bouton, champ de texte, ...
Pour déterminer le type d'un objet il faut utiliser la fonction TypeOf()
Ce qui donne dans l'exemple :
//evenement resize de la fenêtre mère Decimal{2} ratio_largeur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Decimal{2} ratio_hauteur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Integer nb_controles Integer i=1 // Liste des types d'objets possibles sur la fenêtre Datawindow ldw_datawindow Button lbt_button UserObject luo_userobject // ... etc ratio_largeur = newWidth/il_largeur_etalon // il_largeur_etalon est la variable d'instance représentant la largeur de la résolution étalon : 1366 ratio_hauteur = newHeigth/il_hauteur_etalon // il_hauteur_etalon est la variable d'instance représentant la hauteur de la résolution étalon : 900 nb_controles = UpperBound(this.Control) // Nombre de contrôles sur la fenêtre For i=1 To nb_controles // Si c'est une datawindow If (TypeOf(this.Control[i]) = Datawindow!) Then ldw_datawindow = this.Control[i] ldw_datawindow.X = ldw_datawindow.X * ratio_largeur ldw_datawindow.Width = ldw_datawindow.Width * ratio_largeur ldw_datawindow.Y = ldw_datawindow.Y * ratio_hauteur ldw_datawindow.Height = ldw_datawindow.Height * ratio_hauteur End If // Si c'est un bouton //... etc Next
Hors ligne
Bonsoir,
Merci beaucoup Nephtis pour ce coup de main. Cela marche très bien pour des frames qui héritent directement de l'Object WINDOW.
Dans mon application la majorité des frames héritent de w_app_basesheet qui elle même hérite de l'Object WINDOW. Or lorsque je place ce code dans l'évènement resize d'une des frames qui héritent de w_app_basesheet. Elle ne me donne pas un rendu satisfaisant. Bref elle ne fonctionne pas.
Comment puis je m'y prendre pour résoudre ce cas?
Bon week end
Hors ligne
legagneur a écrit:
Bref elle ne fonctionne pas.
C'est un peu vague comme description.
Ton code de redimensionnement est dans le resize des enfants de w_app_basesheet ? Ce serait mieux de le mettre dans cet ancêtre directement.
Quand "ça ne fonctionne pas", serait-ce parce qu'il y a déjà déjà un code dans le resize de l'ancêtre qui perturbe ton code ?
Ou une histoire de "extend ancestor" coché ou non coché ?
Hors ligne
Bonsoir SEKI,
J'ai mis le code de redimensionnement dans le resize de w_app_basesheet, et je n'ai rien mis dans le resize de ces fils. Cela ne m'a pas donné de rendu satisfaisant. Par la suite j'ai remis le bout de code aussi dans simultanément dans le resize de w_app_basesheet ainsi que dans ses fils. Jusque là pas de rendu satisfaisant.
Lorsque je dis que cela na marche pas, je veux dire que ce que je n'ai pas de rendu que j'attends.
Hors ligne
legagneur a écrit:
Par la suite j'ai remis le bout de code aussi dans simultanément dans le resize de w_app_basesheet ainsi que dans ses fils. Jusque là pas de rendu satisfaisant.
ça il faut éviter la duplication de code. Soit l'évènement est appelé sur les 2 niveaux de l'objet (son ancêtre, puis lui même) si l'enfant étend le code de son ancêtre, soit il ne l'étend pas et il n'y a que l'évènement à son niveau qui est appelé.
legagneur a écrit:
Lorsque je dis que cela na marche pas, je veux dire que ce que je n'ai pas de rendu que j'attends.
Mais le code est bien appelé donc ? (vérifiable avec un OutputDebugString() par exemple)
C'est un problème de calcul des dimensions ? Peut-être un problème entre les pixels et les pbunits (voir avec PixelsToUnits() et UnitsToPixels()) : les tailles et positions des contrôles PB s'expriment en pbunits (environ 4 pbunits pour 1 pixel en horizontal et 4.1 pbunits pour 1 pixel vertical - ou le contraire) et tu mixes peut-être les 2 unités dans tes calculs ?
Hors ligne
Les valeurs de X,Y,WIDTH et HEIGHT que l'ont utilisent sont déjà les valeurs en PBUnits
Est-ce que le besoin de convertir se pose encore?
Hors ligne
legagneur a écrit:
Les valeurs de X,Y,WIDTH et HEIGHT que l'ont utilisent sont déjà les valeurs en PBUnits
Est-ce que le besoin de convertir se pose encore?
ça dépend comment tu calcules tes ratio : par rapport à une taille de référence en pixels ou en pb units, et la taille de l'écran tu la récupères en pixels ou pbunits ?
à tout hasard : tu as peut-être un problème de prise en compte des DPI de l'écran ? (suivant le nombre de dpi, une taille en pixels ne sera pas identique d'un écran à l'autre même si les dimensions en pixels sont identiques)
Dernière modification par seki (08-05-2015 15:40:42)
Hors ligne
Bonjour,
J'ai pris en compte toutes les remarques, mais je n'ai pas jusqu'à present un rendu satisfaisant. Les questions que je me posent sont les suivantes :
1- Pourquoi ce bout de code fonctionne pour des frames qui héritent directement de l'Object WINDOW et ne fonctionne pas pour celle qui héritent de w_app_basesheet?
2- Pourquoi lorsque nous mettons ce bout de code dans le resize de w_app_basesheet, les frames héritant de celles ci ne donne pas le rendu que l'on attend?
3- Lorsqu'au lieu de mettre le bout de code dans le resize de w_app_basesheet, on le met dans le resize des frames enfants, nous n'avons pas toujours le rendu que l'on attend?
Merci
Hors ligne
legagneur a écrit:
Bonjour,
J'ai pris en compte toutes les remarques, mais je n'ai pas jusqu'à present un rendu satisfaisant. Les questions que je me posent sont les suivantes :
1- Pourquoi ce bout de code fonctionne pour des frames qui héritent directement de l'Object WINDOW et ne fonctionne pas pour celle qui héritent de w_app_basesheet?
2- Pourquoi lorsque nous mettons ce bout de code dans le resize de w_app_basesheet, les frames héritant de celles ci ne donne pas le rendu que l'on attend?
3- Lorsqu'au lieu de mettre le bout de code dans le resize de w_app_basesheet, on le met dans le resize des frames enfants, nous n'avons pas toujours le rendu que l'on attend?
Merci
Quel est le problême?
Les contrôles sont trop grands? trop petits? pas a la bonne place?
Une capture d'écran pourrais nous permettre de comprendre car là c'est trop vague comme description du problème
Hors ligne
Bonsoir,
Je vous présente quelques captures d'écrans.
L'image ci dessous est obtenu avec une résolution de 1600*900
L'image ci dessous est obten après avoir appliqué mis le bout de code dans l'évenement resize de feuille fille et être passer à une résolution 1024*768
Dernière modification par legagneur (11-05-2015 16:35:31)
Hors ligne
Bonjour,
Je présente ici le bout de code que j'ai introduit dans le resize
//evenement resize de la fenêtre mère Decimal{2} ratio_largeur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Decimal{2} ratio_hauteur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Integer nb_controles Integer newWidth1,newHeigth1 Integer i=1 environment myEnv GetEnvironment(myEnv) newWidth=myEnv.ScreenWidth newHeight=myEnv.ScreenHeight // Liste des types d'objets possibles sur la fenêtre Datawindow ldw_datawindow Button lbt_button UserObject luo_userobject CommandButton lcb_commandbutton PictureButton lpb_picturebutton CheckBox lcb_checkbox RadioButton lrb_radiobutton StaticText lst_statictext StaticHyperLink lshl_statichyperlink Picture lp_picture PictureHyperLink lphl_picturehyperlink GroupBox lgb_groupbox Line ll_line Oval lo_oval Rectangle lr_rectangle SingleLineEdit lsle_singlelineedit EditMask lem_editmask MultiLineEdit lmle_multilineedit RichTextEdit lrte_richtextedit HScrollBar lhsb_hscrollbar VScrollBar lvsb_vscrollbar HTrackBar lhtb_htrackbar HprogressBar lhpb_hprogressbar VprogressBar lvpb_vprogressbar DropDownListBox lddlb_dropdownlistbox PictureListBox lplb_picturelistbox ListView llv_ListView TreeView ltv_treeview Tab lt_tab Graph lg_graph MonthCalendar lmc_monthcalendar DatePicker ldp_datepicker Animation la_animation InkEdit lie_inkedit InkPicture llp_lnkpicture //OLE lo_ole // ... etc ratio_largeur = newWidth / 1366 ratio_hauteur = newHeight / 900 nb_controles = UpperBound(this.Control ) // Nombre de contrôles sur la fenêtre For i=1 To nb_controles // Si c'est une datawindow If (TypeOf(this.Control[i]) = Datawindow!) Then ldw_datawindow = this.Control[i] ldw_datawindow.X =ldw_datawindow.X * ratio_largeur ldw_datawindow.Width = ldw_datawindow.Width * ratio_largeur ldw_datawindow.Y = ldw_datawindow.Y * ratio_hauteur ldw_datawindow.Height = ldw_datawindow.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = CommandButton!) Then lcb_commandbutton = this.Control[i] lcb_commandbutton.X = lcb_commandbutton.X * ratio_largeur lcb_commandbutton.Width = lcb_commandbutton.Width * ratio_largeur lcb_commandbutton.Y = lcb_commandbutton.Y * ratio_hauteur lcb_commandbutton.Height = lcb_commandbutton.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = UserObject!) Then luo_userobject = this.Control[i] luo_userobject.X = luo_userobject.X * ratio_largeur luo_userobject.Width = luo_userobject.Width * ratio_largeur luo_userobject.Y = luo_userobject.Y * ratio_hauteur luo_userobject.Height = luo_userobject.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = PictureButton!) Then lpb_picturebutton = this.Control[i] lpb_picturebutton.X = lpb_picturebutton.X * ratio_largeur lpb_picturebutton.Width = lpb_picturebutton.Width * ratio_largeur lpb_picturebutton.Y = lpb_picturebutton.Y * ratio_hauteur lpb_picturebutton.Height = lpb_picturebutton.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = CheckBox!) Then lcb_checkbox = this.Control[i] lcb_checkbox.X = lcb_checkbox.X * ratio_largeur lcb_checkbox.Width = lcb_checkbox.Width * ratio_largeur lcb_checkbox.Y = lcb_checkbox.Y * ratio_hauteur lcb_checkbox.Height = lcb_checkbox.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = RadioButton!) Then lrb_radiobutton = this.Control[i] lrb_radiobutton.X = lrb_radiobutton.X * ratio_largeur lrb_radiobutton.Width = lrb_radiobutton.Width * ratio_largeur lrb_radiobutton.Y = lrb_radiobutton.Y * ratio_hauteur lrb_radiobutton.Height = lrb_radiobutton.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = StaticText!) Then lst_statictext = this.Control[i] lst_statictext.X = lst_statictext.X * ratio_largeur lst_statictext.Width = lst_statictext.Width * ratio_largeur lst_statictext.Y = lst_statictext.Y * ratio_hauteur lst_statictext.Height = lst_statictext.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = StaticHyperLink!) Then lshl_statichyperlink = this.Control[i] lshl_statichyperlink.X = lshl_statichyperlink.X * ratio_largeur lshl_statichyperlink.Width = lshl_statichyperlink.Width * ratio_largeur lshl_statichyperlink.Y = lshl_statichyperlink.Y * ratio_hauteur lshl_statichyperlink.Height = lshl_statichyperlink.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Picture!) Then lp_picture = this.Control[i] lp_picture.X = lp_picture.X * ratio_largeur lp_picture.Width = lp_picture.Width * ratio_largeur lp_picture.Y = lp_picture.Y * ratio_hauteur lp_picture.Height = lp_picture.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = PictureHyperLink!) Then lphl_picturehyperlink = this.Control[i] lphl_picturehyperlink.X = lphl_picturehyperlink.X * ratio_largeur lphl_picturehyperlink.Width = lphl_picturehyperlink.Width * ratio_largeur lphl_picturehyperlink.Y = lphl_picturehyperlink.Y * ratio_hauteur lphl_picturehyperlink.Height = lphl_picturehyperlink.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = GroupBox!) Then lgb_groupbox = this.Control[i] lgb_groupbox.X = lgb_groupbox.X * ratio_largeur lgb_groupbox.Width = lgb_groupbox.Width * ratio_largeur lgb_groupbox.Y = lgb_groupbox.Y * ratio_hauteur lgb_groupbox.Height = lgb_groupbox.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Oval!) Then lo_oval = this.Control[i] lo_oval.X = lo_oval.X * ratio_largeur lo_oval.Width = lo_oval.Width * ratio_largeur lo_oval.Y = lo_oval.Y * ratio_hauteur lo_oval.Height = lo_oval.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Rectangle!) Then lr_rectangle = this.Control[i] lr_rectangle.X = lr_rectangle.X * ratio_largeur lr_rectangle.Width = lr_rectangle.Width * ratio_largeur lr_rectangle.Y = lr_rectangle.Y * ratio_hauteur lr_rectangle.Height = lr_rectangle.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = SingleLineEdit!) Then lsle_singlelineedit = this.Control[i] lsle_singlelineedit.X = lsle_singlelineedit.X * ratio_largeur lsle_singlelineedit.Width = lsle_singlelineedit.Width * ratio_largeur lsle_singlelineedit.Y = lsle_singlelineedit.Y * ratio_hauteur lsle_singlelineedit.Height = lsle_singlelineedit.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = EditMask!) Then lem_editmask = this.Control[i] lem_editmask.X = lem_editmask.X * ratio_largeur lem_editmask.Width = lem_editmask.Width * ratio_largeur lem_editmask.Y = lem_editmask.Y * ratio_hauteur lem_editmask.Height = lem_editmask.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = EditMask!) Then lem_editmask = this.Control[i] lem_editmask.X = lem_editmask.X * ratio_largeur lem_editmask.Width = lem_editmask.Width * ratio_largeur lem_editmask.Y = lem_editmask.Y * ratio_hauteur lem_editmask.Height = lem_editmask.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = MultiLineEdit!) Then lmle_multilineedit = this.Control[i] lmle_multilineedit.X = lmle_multilineedit.X * ratio_largeur lmle_multilineedit.Width = lmle_multilineedit.Width * ratio_largeur lmle_multilineedit.Y = lmle_multilineedit.Y * ratio_hauteur lmle_multilineedit.Height = lmle_multilineedit.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = RichTextEdit!) Then lrte_richtextedit = this.Control[i] lrte_richtextedit.X = lrte_richtextedit.X * ratio_largeur lrte_richtextedit.Width = lrte_richtextedit.Width * ratio_largeur lrte_richtextedit.Y = lrte_richtextedit.Y * ratio_hauteur lrte_richtextedit.Height = lrte_richtextedit.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = HScrollBar!) Then lhsb_hscrollbar = this.Control[i] lhsb_hscrollbar.X = lhsb_hscrollbar.X * ratio_largeur lhsb_hscrollbar.Width = lhsb_hscrollbar.Width * ratio_largeur lhsb_hscrollbar.Y = lhsb_hscrollbar.Y * ratio_hauteur lhsb_hscrollbar.Height = lhsb_hscrollbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = VScrollBar!) Then lvsb_vscrollbar = this.Control[i] lvsb_vscrollbar.X = lvsb_vscrollbar.X * ratio_largeur lvsb_vscrollbar.Width = lvsb_vscrollbar.Width * ratio_largeur lvsb_vscrollbar.Y = lvsb_vscrollbar.Y * ratio_hauteur lvsb_vscrollbar.Height = lvsb_vscrollbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = HTrackBar!) Then lhtb_htrackbar = this.Control[i] lhtb_htrackbar.X = lhtb_htrackbar.X * ratio_largeur lhtb_htrackbar.Width = lhtb_htrackbar.Width * ratio_largeur lhtb_htrackbar.Y = lhtb_htrackbar.Y * ratio_hauteur lhtb_htrackbar.Height = lhtb_htrackbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = HprogressBar!) Then lhpb_hprogressbar = this.Control[i] lhpb_hprogressbar.X = lhpb_hprogressbar.X * ratio_largeur lhpb_hprogressbar.Width = lhpb_hprogressbar.Width * ratio_largeur lhpb_hprogressbar.Y = lhpb_hprogressbar.Y * ratio_hauteur lhpb_hprogressbar.Height = lhpb_hprogressbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = VprogressBar!) Then lvpb_vprogressbar = this.Control[i] lvpb_vprogressbar.X = lvpb_vprogressbar.X * ratio_largeur lvpb_vprogressbar.Width = lvpb_vprogressbar.Width * ratio_largeur lvpb_vprogressbar.Y = lvpb_vprogressbar.Y * ratio_hauteur lvpb_vprogressbar.Height = lvpb_vprogressbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = VprogressBar!) Then lvpb_vprogressbar = this.Control[i] lvpb_vprogressbar.X = lvpb_vprogressbar.X * ratio_largeur lvpb_vprogressbar.Width = lvpb_vprogressbar.Width * ratio_largeur lvpb_vprogressbar.Y = lvpb_vprogressbar.Y * ratio_hauteur lvpb_vprogressbar.Height = lvpb_vprogressbar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = DropDownListBox!) Then lddlb_dropdownlistbox = this.Control[i] lddlb_dropdownlistbox.X = lddlb_dropdownlistbox.X * ratio_largeur lddlb_dropdownlistbox.Width = lddlb_dropdownlistbox.Width * ratio_largeur lddlb_dropdownlistbox.Y = lddlb_dropdownlistbox.Y * ratio_hauteur lddlb_dropdownlistbox.Height = lddlb_dropdownlistbox.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = PictureListBox!) Then lplb_picturelistbox = this.Control[i] lplb_picturelistbox.X = lplb_picturelistbox.X * ratio_largeur lplb_picturelistbox.Width = lplb_picturelistbox.Width * ratio_largeur lplb_picturelistbox.Y = lplb_picturelistbox.Y * ratio_hauteur lplb_picturelistbox.Height = lplb_picturelistbox.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = ListView!) Then llv_ListView = this.Control[i] llv_ListView.X = llv_ListView.X * ratio_largeur llv_ListView.Width = llv_ListView.Width * ratio_largeur llv_ListView.Y = llv_ListView.Y * ratio_hauteur llv_ListView.Height = llv_ListView.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = TreeView!) Then ltv_treeview = this.Control[i] ltv_treeview.X = ltv_treeview.X * ratio_largeur ltv_treeview.Width = ltv_treeview.Width * ratio_largeur ltv_treeview.Y = ltv_treeview.Y * ratio_hauteur ltv_treeview.Height = ltv_treeview.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Tab!) Then lt_tab = this.Control[i] lt_tab.X = ceiling(lt_tab.X * ratio_largeur) lt_tab.Width = ceiling(lt_tab.Width * ratio_largeur) lt_tab.Y =ceiling (lt_tab.Y * ratio_hauteur) lt_tab.Height =ceiling( lt_tab.Height * ratio_hauteur) End If If (TypeOf(this.Control[i]) = Tab!) Then lt_tab = this.Control[i] lt_tab.X = lt_tab.X * ratio_largeur lt_tab.Width = lt_tab.Width * ratio_largeur lt_tab.Y = lt_tab.Y * ratio_hauteur lt_tab.Height = lt_tab.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Graph!) Then lg_graph = this.Control[i] lg_graph.X = lg_graph.X * ratio_largeur lg_graph.Width = lg_graph.Width * ratio_largeur lg_graph.Y = lg_graph.Y * ratio_hauteur lg_graph.Height = lg_graph.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = MonthCalendar!) Then lmc_monthcalendar = this.Control[i] lmc_monthcalendar.X = lmc_monthcalendar.X * ratio_largeur lmc_monthcalendar.Width = lmc_monthcalendar.Width * ratio_largeur lmc_monthcalendar.Y = lmc_monthcalendar.Y * ratio_hauteur lmc_monthcalendar.Height = lmc_monthcalendar.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = DatePicker!) Then ldp_datepicker = this.Control[i] ldp_datepicker.X = ldp_datepicker.X * ratio_largeur ldp_datepicker.Width = ldp_datepicker.Width * ratio_largeur ldp_datepicker.Y = ldp_datepicker.Y * ratio_hauteur ldp_datepicker.Height = ldp_datepicker.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = Animation!) Then la_animation = this.Control[i] la_animation.X = la_animation.X * ratio_largeur la_animation.Width = la_animation.Width * ratio_largeur la_animation.Y = la_animation.Y * ratio_hauteur la_animation.Height = la_animation.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = InkEdit!) Then lie_inkedit = this.Control[i] lie_inkedit.X = lie_inkedit.X * ratio_largeur lie_inkedit.Width = lie_inkedit.Width * ratio_largeur lie_inkedit.Y = lie_inkedit.Y * ratio_hauteur lie_inkedit.Height = lie_inkedit.Height * ratio_hauteur End If If (TypeOf(this.Control[i]) = InkPicture!) Then llp_lnkpicture = this.Control[i] llp_lnkpicture.X = llp_lnkpicture.X * ratio_largeur llp_lnkpicture.Width = llp_lnkpicture.Width * ratio_largeur llp_lnkpicture.Y = llp_lnkpicture.Y * ratio_hauteur llp_lnkpicture.Height = llp_lnkpicture.Height * ratio_hauteur End If Next
Hors ligne
legagneur a écrit:
//...
ratio_largeur = newWidth / 1366
ratio_hauteur = newHeight / 900
//...
Je suppose que ces données sont exprimées en pixels. Or X,Y,width et height sont exprimées en unités. Il faut d'abord convertir les pixel avec la méthode PixelToUnits()
PixelsToUnits(1366, XPixelsToUnits!) = 6245
PixelsToUnits(900, XPixelsToUnits!) = 3600
Ensuite j'ai l'impression que c'est un tab control qui est affiché sur l'écran. Ce contrôle contient des tab pages qui sont des user object contenant des contrôles.
pb_help a écrit:
A Tab control contains tab pages, which are user objects that contain controls.
Et j’imagine qu'aucun resize des ces user object n'a été codé, d'où le résultat obtenu ...
Hors ligne
Nephtis a écrit:
legagneur a écrit:
//...
ratio_largeur = newWidth / 1366
ratio_hauteur = newHeight / 900
//...Je suppose que ces données sont exprimées en pixels. Or X,Y,width et height sont exprimées en unités. Il faut d'abord convertir les pixel avec la méthode PixelToUnits()
Pas forcément, la doc (PB11.5) précise pour Environment.ScreenHeight « Height of the screen in pixels », et idem pour ScreenWidth.
Mais je n'ai pas vérifié si c'était bien des pixels, ce ne serait pas la première fois que le doc ment.
Si ce sont bien des pixels, un ratio en pixels ou en units c'est pareil pour redimensionner les tailles et positions.
Hors ligne
Nephtis a écrit:
Ensuite j'ai l'impression que c'est un tab control qui est affiché sur l'écran. Ce contrôle contient des tab pages qui sont des user object contenant des contrôles.
pb_help a écrit:
A Tab control contains tab pages, which are user objects that contain controls.
Et j’imagine qu'aucun resize des ces user object n'a été codé, d'où le résultat obtenu ...
Nous avons codé les resize des user object dans ce bout de code
If (TypeOf(this.Control[i]) = UserObject!) Then luo_userobject = this.Control[i] luo_userobject.X = luo_userobject.X * ratio_largeur luo_userobject.Width = luo_userobject.Width * ratio_largeur luo_userobject.Y = luo_userobject.Y * ratio_hauteur luo_userobject.Height = luo_userobject.Height * ratio_hauteur End If
A moins que ce n'est pas ce qu'il fallu faire. Est ce que c'est à ce niveau qu'il fallait gérér cela? sinon, où placer ce bout de code?
Hors ligne
seki a écrit:
Nephtis a écrit:
legagneur a écrit:
//...
ratio_largeur = newWidth / 1366
ratio_hauteur = newHeight / 900
//...Je suppose que ces données sont exprimées en pixels. Or X,Y,width et height sont exprimées en unités. Il faut d'abord convertir les pixel avec la méthode PixelToUnits()
Pas forcément, la doc (PB11.5) précise pour Environment.ScreenHeight « Height of the screen in pixels », et idem pour ScreenWidth.
Mais je n'ai pas vérifié si c'était bien des pixels, ce ne serait pas la première fois que le doc ment.
Si ce sont bien des pixels, un ratio en pixels ou en units c'est pareil pour redimensionner les tailles et positions.
Je parle des X,Y,Width et Height des contrôles (pas de l'objet environnement)
pb_help a écrit:
The Height property specifies the height of a control or window in PowerBuilder units.
The Width property specifies the width of a control or window in PowerBuilder units.
The X property specifies the X coordinate of an object or control in PowerBuilder units.
The Y property specifies the Y coordinate of an object or control in PowerBuilder units.
newWidth et newHeight de l'évènement resize sont exprimés en PowerBuilder units
pb_help a écrit:
newwidth Integer by value (the width of the client area of a window or DataWindow control in PowerBuilder units).
newheight Integer by value (the height of the client area of a window or DataWindow control in PowerBuilder units).
Donc il faut bien convertir pour comparer ce qui est comparable
Hors ligne
legagneur a écrit:
Nephtis a écrit:
Ensuite j'ai l'impression que c'est un tab control qui est affiché sur l'écran. Ce contrôle contient des tab pages qui sont des user object contenant des contrôles.
pb_help a écrit:
A Tab control contains tab pages, which are user objects that contain controls.
Et j’imagine qu'aucun resize des ces user object n'a été codé, d'où le résultat obtenu ...
Nous avons codé les resize des user object dans ce bout de code
Code: pb
If (TypeOf(this.Control[i]) = UserObject!) Then luo_userobject = this.Control[i] luo_userobject.X = luo_userobject.X * ratio_largeur luo_userobject.Width = luo_userobject.Width * ratio_largeur luo_userobject.Y = luo_userobject.Y * ratio_hauteur luo_userobject.Height = luo_userobject.Height * ratio_hauteur End If
A moins que ce n'est pas ce qu'il fallu faire. Est ce que c'est à ce niveau qu'il fallait gérér cela? sinon, où placer ce bout de code?
Ce bout de code redimensionne le contenant, pas le contenu. La taille du user object est bien modifiée mais pas tous les objets qui la composent. Pour ça il serait bien de faire une fonction récursive.
Dernière modification par Nephtis (12-05-2015 09:15:26)
Hors ligne
Nephtis a écrit:
Je parle des X,Y,Width et Height des contrôles (pas de l'objet environnement)
pb_help a écrit:
The Height property specifies the height of a control or window in PowerBuilder units.
The Width property specifies the width of a control or window in PowerBuilder units.
The X property specifies the X coordinate of an object or control in PowerBuilder units.
The Y property specifies the Y coordinate of an object or control in PowerBuilder units.newWidth et newHeight de l'évènement resize sont exprimés en PowerBuilder units
pb_help a écrit:
newwidth Integer by value (the width of the client area of a window or DataWindow control in PowerBuilder units).
newheight Integer by value (the height of the client area of a window or DataWindow control in PowerBuilder units).Donc il faut bien convertir pour comparer ce qui est comparable
Oui, mais justement, au début de sont évènement resize(), il semble écraser les arguments en units avec des pixels
environment myEnv GetEnvironment(myEnv) newWidth=myEnv.ScreenWidth newHeight=myEnv.ScreenHeight
mais il a aussi ceci au début du code, qui est un peu louche (il s'est peut-être trompété)
Integer newWidth1,newHeigth1
Hors ligne
seki a écrit:
Nephtis a écrit:
Je parle des X,Y,Width et Height des contrôles (pas de l'objet environnement)
pb_help a écrit:
The Height property specifies the height of a control or window in PowerBuilder units.
The Width property specifies the width of a control or window in PowerBuilder units.
The X property specifies the X coordinate of an object or control in PowerBuilder units.
The Y property specifies the Y coordinate of an object or control in PowerBuilder units.newWidth et newHeight de l'évènement resize sont exprimés en PowerBuilder units
pb_help a écrit:
newwidth Integer by value (the width of the client area of a window or DataWindow control in PowerBuilder units).
newheight Integer by value (the height of the client area of a window or DataWindow control in PowerBuilder units).Donc il faut bien convertir pour comparer ce qui est comparable
Oui, mais justement, au début de sont évènement resize(), il semble écraser les arguments en units avec des pixels
Code:
environment myEnv GetEnvironment(myEnv) newWidth=myEnv.ScreenWidth newHeight=myEnv.ScreenHeightmais il a aussi ceci au début du code, qui est un peu louche (il s'est peut-être trompété)
Code:
Integer newWidth1,newHeigth1
Ah oui j'avais pas vu cette partie du code, il a du s’emmêler les pinceaux
Hors ligne
Nephtis a écrit:
seki a écrit:
Nephtis a écrit:
Je parle des X,Y,Width et Height des contrôles (pas de l'objet environnement)
newWidth et newHeight de l'évènement resize sont exprimés en PowerBuilder units
Donc il faut bien convertir pour comparer ce qui est comparableOui, mais justement, au début de sont évènement resize(), il semble écraser les arguments en units avec des pixels
Code:
environment myEnv GetEnvironment(myEnv) newWidth=myEnv.ScreenWidth newHeight=myEnv.ScreenHeightmais il a aussi ceci au début du code, qui est un peu louche (il s'est peut-être trompété)
Code:
Integer newWidth1,newHeigth1Ah oui j'avais pas vu cette partie du code, il a du s’emmêler les pinceaux
Nephtis, après tes remarques sur la conversion, j'ai pris le soin de mettre à jour le code en convertissant les pixels en Unit.
Seki, la remarque sur la déclaration de newwidth1 et newheight1 sont fondés, mais je ne l'ai pas utilisé dans la suite du code, j'ai déjà pris le soin de les enlever. Merci
Dernière modification par legagneur (12-05-2015 10:42:30)
Hors ligne
legagneur a écrit:
Nephtis, après tes remarques sur la conversion, j'ai pris le soin de mettre à jour le code en convertissant les pixels en Unit.
Seki, la remarque sur la déclaration de newwidth1 et newheight1 sont fondés, mais je ne l'ai pas utilisé dans la suite du code, j'ai déjà pris le soin de les enlever. Merci
Les variables locales non utilisées, ce n'est pas grave. Par contre je faisais remarquer que localement dans ton évènement resize(), tu masquais les paramètres de l'évènement qui te donnent la nouvelle taille de l'objet en units par la taille de l'écran (en pixels), qui ne varie pas... La logique est un peu bizarre.
De plus, juste pour chipoter, recalculer le ratio en interrogeant l'environnement pour connaître la taille de l'écran à chaque évènement resize() c'est peu performant, tu ne devrais calculer ce ratio qu'à la création ou open() de l'objet, voir une fois à l'ouverture de l'application, pour ce genre de trucs, une variable globale calculée une seule fois, ça passe
Alors ça donne quoi maintenant ?
Dernière modification par seki (12-05-2015 11:05:21)
Hors ligne
Bonjour,
Je doit avouer que ce bout de code me donne les insomnies.
J'ai essayé avec la recursivité, mais PowerBuilder Bugue et nous sommes obligés d'arrêter le logiciel et de relancer.
Je qui me gêne le plus c'est que je n'arrive pas à comprendre la nature du problème.
D'après vous pourquoi, je n'ai pas de très bon résultats?
Bonne journée et bonne fête
Hors ligne
J'ai testé en local et effectivement il y avait un petit problème de conception.
On ne recalculait pas les dimensions a partir des dimensions originales, il fallait donc les sauvegarder lors de l'initialisation de la fenêtre.
// Variables d'instance boolean i_bOpenFini = False Long i_lScreenWidth Long i_lScreenHeight String i_sObjects[] // Ne sers pas au final Long i_lX[] Long i_lY[] Long i_lWidth[] Long i_lHeight[] Long i_lNbObjects = 0
//A la fin de l'évenement open i_bOpenFini = True i_lScreenWidth = this.Width i_lScreenHeight = this.Height Datawindow ldw_datawindow // ... et les autres types d'objets Integer nb_controles Integer i=1 nb_controles = UpperBound(this.Control ) // Nombre de contrôles sur la fenêtre For i=1 To nb_controles // Si c'est une datawindow If (TypeOf(this.Control[i]) = Datawindow!) Then ldw_datawindow = this.Control[i] i_lNbObjects ++ i_sObjects[i_lNbObjects] = "Datawindow" i_lX[i_lNbObjects] = ldw_datawindow.X i_lY[i_lNbObjects] = ldw_datawindow.Y i_lWidth[i_lNbObjects] = ldw_datawindow.Width i_lHeight[i_lNbObjects] = ldw_datawindow.Height End If // ... et les autres types d'objets
//Dans l'evenement resize Decimal{2} ratio_largeur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Decimal{2} ratio_hauteur // 2 chiffres après la virgule pour l'exemple mais on peut bien sur mettre plus Integer nb_controles Integer i=1 // Liste des types d'objets possibles sur la fenêtre Datawindow ldw_datawindow // ... et les autres types d'objets If i_bOpenFini = True Then // On s'assure qu'on a bien fini l'évenement open ratio_largeur = newWidth / i_lScreenWidth ratio_hauteur = newHeight / i_lScreenHeight nb_controles = UpperBound(i_sObjects ) // Nombre de contrôles sur la fenêtre For i=1 To nb_controles // Si c'est une datawindow If (TypeOf(this.Control[i]) = Datawindow!) Then ldw_datawindow = this.Control[i] ldw_datawindow.X = i_lX[i] * ratio_largeur ldw_datawindow.Width = i_lWidth[i] * ratio_largeur ldw_datawindow.Y = i_lY[i] * ratio_hauteur ldw_datawindow.Height = i_lHeight[i] * ratio_hauteur End If // ... et les autres types d'objets Next End If
Hors ligne