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 :

Comment faire défiler verticalement une Form


Sujet :

Composants FMX Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 80
    Par défaut Comment faire défiler verticalement une Form
    Bonjour à tous,
    Je découvre Delphi 12 multiplateforme. J'utilise delphi 12 Community.
    Je développe une application perso avec Delphi12 qui sera déployée sur un Android.
    Et je bute un sujet:
    Sur ma Form bien plus grande qu'un écran de tel, car j'ai de nombreux objets et donc sur l'écran de l'utilisateur , je n'ai qu'une partie de ma Form.
    Quel composant, quelle propriété ,doit-on utiliser pour faire défiler l’écran verticalement avec le doigt ?
    En vous remerciant par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 801
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    En première approche j'utiliserai un TVertScrollBox qui contiendrai la dite Forme ou Frame (cadre).
    Pour aller plus loin, je regarderai ce qu'il est possible de faire en utilisant FrameStand (téléchargeable via Getit ou sur GitHub)plutôt que les TForm et TFrame

    Ne pas oublier que la scrollbar, sur Android, disparait et donc un utilisateur n'aura pas d'indication quant au défilement vers le bas possible.

    Mais avant tout cette indication
    Sur ma Form bien plus grande qu'un écran de tel, car j'ai de nombreux objets et donc sur l'écran de l'utilisateur
    est peut-être plus révélatrice d'un problème de design, c'est d'ailleurs pour ce genre de chose que l'on peut avoir des vues différentes (combobox Vue en haut et à droite lorsque l'on est en conception)
    ce qui permet d'avoir une présentation desktop et des présentations différentes pour les autres cas et ce sans changer la partie programme.

    Je développe une application perso avec Delphi12 qui sera déployée sur un Android.
    en ce cas, il faudrait prendre en compte d'entrée de jeu un format Android plutôt que de faire des formes "trop grandes".

    Il va falloir aussi prendre en compte le clavier et le problème de positionnement que cela peut générer (zone d'édition invisible si trop basse elle est couverte par le clavier).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 80
    Par défaut
    Bonjour, merci pour ces conseils qui m'ont permis de faire ce que je voulais.
    Le problème initial est donc résolu.

    Toutefois, j'observe une particularité avec les Images.
    Après avoir charger une image par le composant TImageControl, au déploiement sur Android, l'image qui à la base est plus grande que l'écran (volontairement) , se réduit systématiquement à la taille de l'écran.
    Je ne trouve aucune propriété sur l'inspecteur d'objet qui contraindrait ou non à la taille de l'écran.

    Les composants ScrollBox ainsi que ImageControl ont tous deux la proprité align sur Client; par conséquent , je m'attendais à ce sur l'image couvre la totalité de la forme

    Comment faire pour faire en sorte de ne plus réduire cette image sur Android ?
    Encore une fois merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 801
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par BECHE Voir le message
    Les composants ScrollBox ainsi que ImageControl ont tous deux la proprité align sur Client
    Justement c'est là le souci
    Il faut que l'image ne soit pas alignée mais de sa taille totale
    Rapidement quelque chose comme ça

    Citation Envoyé par design
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Test photo dans scrollbox'
      ClientHeight = 536
      ClientWidth = 425
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop]
      DesignerMasterStyle = 3
      object ScrollBox1: TScrollBox
        Align = Client
        Size.Width = 425.000000000000000000
        Size.Height = 496.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 0
        Viewport.Width = 425.000000000000000000
        Viewport.Height = 496.000000000000000000
        object Image1: TImage
          MultiResBitmap = <
            item
            end>
        end
      end
      object ftnload: TButton
        Align = Top
        Size.Width = 425.000000000000000000
        Size.Height = 40.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 1
        Text = 'Charger'
        OnClick = ftnloadClick
      end
      object OpenDialog1: TOpenDialog
        Filter = 'Fichiers png|*.png|Fichiers jpg|*.jpg; *.jpeg'
        Left = 272
        Top = 56
      end
    end

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Layouts;
     
    type
      TForm1 = class(TForm)
        ScrollBox1: TScrollBox;
        Image1: TImage;
        ftnload: TButton;
        OpenDialog1: TOpenDialog;
        procedure ftnloadClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.ftnloadClick(Sender: TObject);
    begin
    if opendialog1.execute then
     begin
       ScrollBox1.BeginUpdate;
       image1.Bitmap.LoadFromFile(opendialog1.FileName);
       image1.Width:=Image1.Bitmap.Size.width;
       image1.Height:=Image1.Bitmap.Size.height;
       Scrollbox1.EndUpdate;
     end;
    end;
     
    end.
    et voilà côté windows ce que ça donne
    Nom : Capture.PNG
Affichages : 238
Taille : 304,8 Ko
    Bien sûr, côté Android, il va falloir ajouter les permissions mais, pour l'instant, je m'arrête à cette étape puisque
    Citation Envoyé par sergiomaster
    Rapidement quelque chose comme ça

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 801
    Billets dans le blog
    65
    Par défaut
    Moins rapidement, ce matin j'ai fait l'application Android, ce qui m'a permis de constater que je me suis rouillé durant ces quelques mois "d'hibernation"
    En quelques images
    Nom : Capture_1.PNG
Affichages : 228
Taille : 97,1 KoNom : Capture_2.PNG
Affichages : 220
Taille : 159,8 KoNom : Capture_3.PNG
Affichages : 217
Taille : 262,6 Ko

    Quelques erreurs trainent encore et surtout je constate que je ne sais pas utiliser le zoom (gesture manager) et les TImageControl (comment faire pour "strecher" l'image chargée ?)

    à part ces soucis voici le zip de mon travail (à améliorer)
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 801
    Billets dans le blog
    65
    Par défaut
    Bogues :
    Problème avec liste vide, corrigez la première partie de la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.TabControl1Change(Sender: TObject);
    var
      image: String;
    begin
      if Assigned(ListBox1.Selected) then
        image := System.IOUtils.TPath.Combine(dir, ListBox1.Selected.Text)
      else
        if Listbox1.Items.Count>0 then
           image := System.IOUtils.TPath.Combine(dir, ListBox1.ListItems[0].Text);
    Taille de image1 (toujours dans la même procedure) trop importante impliquant la pixelisation
    - j'ai tenté de diviser par le scalefactor obtenu ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function GetScreenScale: Single;
    var
      ScreenService: IFMXScreenService;
    begin
      Result := 1;
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService,
        IInterface(ScreenService)) then
        Result := ScreenService.GetScreenScale;
    end;
    mais sans résultat probant , je suis donc ouvert à toute suggestion.

    Android
    pas d'accès aux images en poubelle (trash*.*) autorisation à trouver.

    Todo :
    gestion des mouvements (zoom), même après un tour dans les mobiles snippets que l'on ne retrouve plus dans les démos de la version 12 d'ailleurs c'est resté inefficace. Hors sujet, j'ouvrirai peut-être une nouvelle discussion

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 80
    Par défaut
    Bonjour et merci beaucoup pour vos réponses.
    Votre premier post m'a permis de trouver la solution à mon problème et de plus, bien mieux maitriser tout la partie scroll

    J'avoue que vos 2 derniers posts sont un peu "hard" pour moi, ils font en partie référence à l’accès aux fichiers sur Android.
    Et sur ce point, je bute un peu.

    Mon application a besoin d'un fichier "parametres.txt" pour construire les composants lors de la création de la Form.
    Ces parametres sont modifiables par l'utilisateur., donc ne peuvent pas être installés par l'inspecteur d'objets (car seraient figés)
    Par conséquent, ce fichier (à mon sens ) ne peut être placé que sur le dossier "Documents" ou sur la carte SD de l'appareil Android, accessibles hors appli
    Or les chemins qui me semblaient être du style '/storage/emulated/0/Documents/parametres.txt'
    ou / storage/3333-3134/parametres.txt' pour la carte Sd ne fonctionnent pas

    J'ai bien compris que le chemin pour charger un fichier dans l'appli ou pour l'enregister dans le repertoire de l'appli est:
    fileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetHomePath,'parametres.txt');
    J'ai essayé :
    fileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath,'parametres.txt');

    J'ai donc trouvé une solution complétement inconfortable pour arriver à enregistrer mes données sur le répertoire de l'appli en opérant en 2 temps
    ETAPE 1
    Par l'intermédiaire de l'inspecteur d'objet, j'ai chargé mon fichier de données dans une ListBox
    dans le code, je copie les éléments de la ListBox dans un StringList
    puis j'enregistre ce StringList dans le répertoire de l'appli.
    à l'aide du chemin fileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetHomePath,'parametres.txt');
    et de la fonction SaveToFile(FileName)
    Du coup, maintenant mes données sont dans le répertoire de l'appli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
       Procedure Enregistrement();       // enregistre tout le listbox dans un fichier
     var
       ma_liste : TStringList;
       FileName : string;
       i : integer;
    begin
      ma_liste:= TStringList.Create;
       For i:= 0 to 63 do ma_liste.Add(Form2.ListBox1.Items[i])  ; // rempli le stringtext (ma_liste) par le listbox
        try                   // déploiement uniquement sur Android
         fileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetHomePath,'parametres.txt');
         ma_liste.SaveToFile(FileName);//create a new file from a TStringList
      finally
         ma_liste.Free;
      end;
     end;
    ETAPE 2
    Modification du programme
    en rajoutant à l'événement Form.Create une procédure pour copier mes données du répertoire de l'appli
    et les copier dans ma listBox pour être exploitées dans l'appli
    Ces données seront donc toujours à jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure TForm2.FormCreate(Sender: TObject);
    var
       TextFile : TStringList;
       FileName : string;
       i: integer;
    begin
    try
      textFile := TStringList.Create;
      try                                       // déploiement uniquement sur Android
         fileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetHomePath,'parametres.txt');
         if FileExists(FileName) then begin
           textFile.LoadFromFile(FileName);   //load the file in TStringList
           for  i:=0 to 63 do
           ListBox1.Items[i] := textFile.Strings[i] ;
        end;
      finally
         textFile.Free;
      end;
    except
      on E : Exception do ShowMessage('ClassError: '+e.ClassName+#13#13+'Message: '+e.Message);
       end;
    end;
    puis re-déploiement avec le code modifié


    Dorénavant, les données seront enregistrées et récupérées dans et à partir du répertoire de l'appli (sans connaitre son véritable chemin absolu).

    Par ce moyen, j'ai le résultat attendu, mais , par le biais de manips compliquées .

    Malgré toutes mes recherches sur les forums et autres, je n'ai pas trouvé mon bonheur, tout ceci étant plutôt "touffu" pour moi

    Ma question est donc;
    Quel est la méthode (avec explication) pour aller chercher soit dans le dossier Documents de l'Android , ou soit sur la carte SD ,un fichier si trouvant avant le déploiement de l'appli

    Merci encore pour vos conseils et le temps consacré

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 801
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par BECHE Voir le message
    J'avoue que vos 2 derniers posts sont un peu "hard" pour moi, ils font en partie référence à l’accès aux fichiers sur Android.
    Android est plus complexe que windows, en particulier les problèmes de permissions qui évoluent chaque année

    Quel est la méthode (avec explication) pour aller chercher soit dans le dossier Documents de l'Android , ou soit sur la carte SD ,un fichier si trouvant avant le déploiement de l'appli
    Voilà le pourquoi du code du post #5, pour les répertoires android "partagés" il faut passer par un ajout de permissions et par du code spécifique pour obtenir le chemin.

    Pour, très certainement schématiser, voilà ce que je comprend sur cette partie.
    1- une application peut être comparée à un container. Le container contient une partie (dossiers) documents etc..., propres à l'application cela ne nécessite aucun droits.
    2- une application qui veut accéder à d'autres espaces (dans mon zip) le dossier contenant les photos prises par la caméra se doit de demander des permissions d'accès (car en dehors du container)

    Si je suis vos explications, le fichier texte, n'étant utilisé que par l'application il serait conseillé de mettre ce fichier dans ce container

    en reprenant le document sur les fonctions https://docwiki.embarcadero.com/RADS...ises_en_charge je vois qu'au lieu de m'embêter j'aurais pu utiliser GetSharedCameraPath

    Chose que je vais essayer dés que j'aurai accès à mon poste de DEV

    une autre chose m'a interpellé dans le code présenté , la boucle pour remplir le listbox remplaçable par Listbox1.Items.LoadFromFile(nomfichier); idem pour la sauvegarde Listbox1.Items.SavetoFile(nomfichier);
    de plus dans le code 2 il y a une utilisation d'une varaible (textFile) qui me semble être un mot réservé

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/07/2006, 15h55
  2. Comment faire pour qu'une Form reste en avant-plan?
    Par Bodom-Child dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2005, 11h28
  3. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 16h31
  4. Comment faire pour killer une application ?
    Par tintin22 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 17/08/2004, 19h16
  5. comment faire pour qu'une application soit toujours visible ?
    Par goldbar dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/03/2004, 15h35

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