IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Layout et scale : quelle stratégie ? [Android]


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Layout et scale : quelle stratégie ?
    Bonjour,

    j'en suis à l'organisation des Forms. Je pars d'un projet FMX-Win 32 et dans ce projet je veux créer a peu près la même couche métier pour mes Forms Win32 et Androïd (A priori, je suis obligé de différencier le code de certains événements).

    Je suis un peu perplexe. En FMX, il y des layout (y compris Flow) et chaque composant peut-être affecté d'une échelle. A priori, cela donne beaucoup d'aisance et de facultés d'adaptation au développement. Seulement par mes quelques expériences en tablette/smartphone, je me suis rendu compte que l'organisation fluide était très délicate et chronophage. J'en suis arrivé à la conclusion, qu'il était préférable d'utiliser plusieurs modèles de pages (de Forms) avec des tailles différentes.

    Cette dernière méthode est-elle gérable en FMX? fLogin, fLoginAndroidTaille1, fLoginAndroidTaille2,... ?

    Cordialement. Gilles
    Dernière modification par Invité ; 29/09/2014 à 15h08.

  2. #2
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Tu voudrais gérer tes forms en fonction de la taille de l'écran ?

    Si c'est le cas, on peut utiliser les services liés à la plateform avec FMX.Platform.IFMXScreenService


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    uses FMX.Platform;
     
    ...
     
    var   l_Svc: IFMXScreenService;
          l_TailleEcran : TPointF;
     
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(l_Svc)) = True then
        l_TailleEcran := l_Svc.GetScreenSize;
     
    end;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Thierry,

    Merci pour votre réponse. Ma question manque de précision en effet.

    Voici le résultat obtenu hier sur un Samsung S à partir de la Form définie initialement à gauche:

    Sur la photo de l'écran Samsung, on voit qu'il serait possible d'utiliser toute la surface de l'écran en agrandissant les champs contenus au prorata X et Y.

    D'une manière plus générale, ce que permettrait peut-être de faire Delphi (et que je ne suis pas arrivé à faire autrement) c'est d'optimiser l'affichage en fonction de la taille de l'écran et de sa résolution (quelques caractéristiques ici).
    Le principe serait d'utiliser les scale en effet et une organisation par layout pour traiter par exemple une image d'origine ainsi...

    1 est la Form d'origine (la copie d'écran de la photo)
    2 en fonction des capacités d'affichage, on agrandit jusqu'à une scale max pour occuper le maximum de la surface d'écran (cas du Samsung S).
    3 si on dépasse le scale max (écran trop grand, il faut garder des tailles de polices raisonnables, par exemple pour un Galaxy Tab), on garde cet agrandissement max et on centre dans l'écran.

    Sinon je ne vois pas d'autre solution que d'utiliser plusieurs "types" de form pré-définies en fonction des tailles, ce qui sous-entend une déclinaison de chacune des Forms. J'ai pratiqué ainsi avec d'autres IDE : c'est usant et mal commode ! Or dans Delphi, je ne vois rien qui me permettent de décliner une Form plusieurs fois dans un même environnement Androïd. Je peux différencier la Form Win d'une Form Androïd mais pas de 2 androïds clonées. Donc je me demande quelle stratégie présente Delphi en la matière compte tenu du fait qu'à priori en Androïd, la possibilité des écrans d'affichage est variée. Cela l'est moins chez Apple.

    Evidemment en cas de rotation de l'écran, on définit une autre stratégie (le centrage n'est pas nécessairement de rigueur... ou mieux suivant le contenu, le centrage peut être programmé ou non). C'est l'énorme avantage ici d'utiliser Delphi.

    Mais peut-être que je me fourvoie encore totalement... comme pour les styles. Quoique pour les styles, j'obtiens quelque chose de significatif même si ce n'est pas prévu pour fonctionner ainsi


    PS : question sans rapport mais comme je lisais votre code.. Il n'y a pas de complétion automatique dans les uses de XE7 ? Systématiquement, je suis obligé de saisir le nom complet de l'unité que je veux ajouter.
    Dernière modification par Invité ; 29/09/2014 à 15h46.

  4. #4
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Citation Envoyé par selzig Voir le message
    1 est la Form d'origine (la copie d'écran de la photo)
    2 en fonction des capacités d'affichage, on agrandit jusqu'à une scale max pour occuper le maximum de la surface d'écran (cas du Samsung S).
    3 si on dépasse le scale max (écran trop grand, il faut garder des tailles de polices raisonnables, par exemple pour un Galaxy Tab), on garde cet agrandissement max et on centre dans l'écran.
    C'est ce que fait le ScaledLayout pour les desktop, par contre je n'ai jamais essayé avec les mobiles, il faudrait faire un essai en mettant un ScaledLayout ( propriété Align = Client ) sur la form et peut être que cela fonctionne, je serais curieux de savoir si cela fonctionne ( je en peux pas faire l'essai aujourd'hui )

    Citation Envoyé par selzig Voir le message
    PS : question sans rapport mais comme je lisais votre code.. Il n'y a pas de complétion automatique dans les uses de XE7 ? Systématiquement, je suis obligé de saisir le nom complet de l'unité que je veux ajouter.
    La complétion auto sur les uses fonctionne avec XE4 et je viens de faire l'essai avec XE7, apparemment cela ne fonctionne pas non plus chez moi...

  5. #5
    Membre Expert
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Par défaut
    Bonjour,

    En fait il faut mixer un Layout normal avec un alignement alFit et un ScaledLayout. Je vous conseille de jeter un oeil au lien suivant :

    http://www.ledevdujeudi.com/layouts/

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Thierry,

    Cela pourrait être un bon début. Mais le système est entièrement automatisé et évidemment l'image par exemple en devient floue.

    Par ailleurs, j'apprécie votre aide et celle de ce forum, mais le lien fourni Projet ScaledFit (86.2 Ko) n'est pas exploitable... facilement.

    Sur le fond, comme le traitement est entièrement automatisé, il faut que je démonte une par une les interactions pour voir comment cela fonctionne.... et les neutraliser si j'en ai besoin... et avec une telle approche j'en aurai besoin ! Mais, je ne veux pas d'une procédure d'affichage automatique. Je veux une procédure d'agrandissement et de centrage raisonnée... si c'est possible. Je préférerais connaître les principes de fonctionnement potentiellement à ma disposition et extraire ceux dont j'ai besoin... Il est vrai que le code est commenté.

    Déjà, ce n'est pas une vidéo anglo-saxonne avec un accent incompréhensible

    Plus anecdotique mais fatigant à la fin car beaucoup trop fréquent, pour la Form (i.e. sur la forme), ce n'est pas exploitable facilement non plus. Ma première tentative de compilation du projet dézippé :
    Vérification des dépendances de projet...
    Compilation de ScaledFit.dproj (Release, Win32)
    Ligne de commande dcc pour "ScaledFit.dpr"
    c:\program files\embarcadero\studio\15.0\bin\dcc32.exe -$D0 -$L- -$Y- --no-config -M -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;
    Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DRELEASE
    -E.\Win32\Release -I"c:\program files\embarcadero\studio\15.0\lib\Win32\release\FR";"c:\program files\embarcadero\studio\15.0\lib\Win32\release";
    C:\Users\gillesh\Documents\Embarcadero\Studio\15.0\Imports;"c:\program files\embarcadero\studio\15.0\Imports";
    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp;"c:\program files\embarcadero\studio\15.0\include";"C:\Program Files\FastReports\LibD21";
    "C:\Program Files\Raize\CS5\Lib\RS-XE7\Win32" -LEC:\Users\Public\Documents\Embarcadero\Studio\15.0\Bpl
    -LNC:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp -NU.\Win32\Release\DCUs -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;
    Bde;System;Xml;Data;Datasnap;Web;Soap; -O"c:\program files\embarcadero\studio\15.0\lib\Win32\release";
    C:\Users\gillesh\Documents\Embarcadero\Studio\15.0\Imports;"c:\program files\embarcadero\studio\15.0\Imports";
    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp;"c:\program files\embarcadero\studio\15.0\include";"C:\Program Files\FastReports\LibD21";
    "C:\Program Files\Raize\CS5\Lib\RS-XE7\Win32" -R"c:\program files\embarcadero\studio\15.0\lib\Win32\release\FR";"c:\program
    files\embarcadero\studio\15.0\lib\Win32\release";C:\Users\gillesh\Documents\Embarcadero\Studio\15.0\Imports;"c:\program
    files\embarcadero\studio\15.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp;"c:\program files\embarcadero\studio\15.0\include";
    "C:\Program Files\FastReports\LibD21";"C:\Program Files\Raize\CS5\Lib\RS-XE7\Win32" -U"c:\program files\embarcadero\studio\15.0\lib\Win32\release\FR";
    "c:\program files\embarcadero\studio\15.0\lib\Win32\release";C:\Users\gillesh\Documents\Embarcadero\Studio\15.0\Imports;"c:\program
    files\embarcadero\studio\15.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp;"c:\program files\embarcadero\studio\15.0\include";
    "C:\Program Files\FastReports\LibD21";"C:\Program Files\Raize\CS5\Lib\RS-XE7\Win32" -NBC:\Users\Public\Documents\Embarcadero\Studio\15.0\Dcp
    -NHC:\Users\Public\Documents\Embarcadero\Studio\15.0\hpp\Win32 -NO.\Win32\Release\DCUs ScaledFit.dpr
    [dcc32 Erreur] uMain.pas(35): E2003 Identificateur non déclaré : 'TButton'
    [dcc32 Erreur] uMain.pas(37): E2003 Identificateur non déclaré : 'TLabel'
    [dcc32 Erreur] uMain.pas(38): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(39): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(40): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(41): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(42): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(43): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(44): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(45): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(46): E2007 Constante ou identificateur de type attendu
    [dcc32 Erreur] uMain.pas(62): E2003 Identificateur non déclaré : 'TBitmap'
    [dcc32 Erreur] uMain.pas(86): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(90): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(109): E2066 Opérateur ou point-virgule manquant
    [dcc32 Avertissement] uMain.pas(145): W1000 Le symbole 'alNone' est déprécié: 'Use TAlignLayout.None'
    [dcc32 Avertissement] uMain.pas(151): W1000 Le symbole 'alFit' est déprécié: 'Use TAlignLayout.Fit'
    [dcc32 Erreur] uMain.pas(163): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(164): E2066 Opérateur ou point-virgule manquant
    [dcc32 Avertissement] uMain.pas(188): W1000 Le symbole 'alNone' est déprécié: 'Use TAlignLayout.None'
    [dcc32 Avertissement] uMain.pas(199): W1000 Le symbole 'alFit' est déprécié: 'Use TAlignLayout.Fit'
    [dcc32 Erreur] uMain.pas(200): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(200): E2029 '(' attendu(e) mais ':=' trouvé(e)
    [dcc32 Erreur] uMain.pas(201): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(201): E2029 '(' attendu(e) mais ':=' trouvé(e)
    [dcc32 Erreur] uMain.pas(203): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(219): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur] uMain.pas(227): E2029 'THEN' attendu(e) mais identificateur 'Enabled' trouvé(e)
    [dcc32 Erreur] uMain.pas(234): E2035 Pas assez de paramètres originaux
    [dcc32 Erreur] uMain.pas(240): E2029 '.' attendu(e) mais ';' trouvé(e)
    [dcc32 Erreur] uMain.pas(249): E2029 'THEN' attendu(e) mais identificateur 'Enabled' trouvé(e)
    [dcc32 Erreur] uMain.pas(260): E2066 Opérateur ou point-virgule manquant
    [dcc32 Erreur fatale] ScaledFit.dpr(16): F2063 Impossible de compiler l'unité utilisée 'uMain.pas'
    Echec
    Temps écoulé : 00:00:00.4
    Alors en vrac,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     {$IFDEF VER260+}
      // L'objet TBitmap a été déplacé de l'unité FMX.Types à FMX.Graphics en version XE5
      FMX.Graphics,
      {$ENDIF}
    -> Oui mais XE7 aussi en a besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure btnLoadImageDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
    -> incompatible XE7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uses FMX.StdCtrls;   {TLabel & TButton}
    -> oublié !?

    Et enfin, si on fait des copier-coller sur les 2 pages, ce n'est guère plus exploitable : le bmpTag n'est pas défini dans procedure TfrmMain.DisplayTag(X, Y: Single);
    Le problème c'est que je peux vous présenter toute une liste de dproj téléchargés sur internet dans le même état... et c'est l'objet de ma proposition sur ce forum. Dater, "versionner" tous les exemples et si possible les mettre à jour au fil des versions. Seul réel avantage des 2 pages, les commentaires qui indiquent partiellement pourquoi les objets sont imbriqués de telles façons ou qui présentent quelles sont leurs propriétés utilisées...
    Dernière modification par tourlourou ; 30/09/2014 à 09h37.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BitmapEffect] Quelle stratégie à long terme ?
    Par Marcolinho dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 15/09/2008, 09h43
  2. Quelle stratégie pour l'authentification ?
    Par Invité dans le forum Struts 1
    Réponses: 8
    Dernier message: 19/02/2008, 15h29
  3. Quelle stratégie pour coupler Hibernate et Swing ?
    Par sethys dans le forum Hibernate
    Réponses: 5
    Dernier message: 09/10/2007, 19h38
  4. Quelle stratégie d'archivage?
    Par Alexandre_P dans le forum Oracle
    Réponses: 14
    Dernier message: 21/09/2007, 15h23
  5. Réponses: 4
    Dernier message: 04/04/2006, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo