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

Bases de données Delphi Discussion :

[D6] Forcer un composant non visible à se mettre à jour


Sujet :

Bases de données Delphi

  1. #1
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut [D6] Forcer un composant non visible à se mettre à jour
    Bonsoir,

    Ca fait deux heures que je tourne en rond sur ce pb :
    - Je créée un Cadre (descendant de TFrame) dans un Panel situé dans une page d'un TTabbedNoteBook non visible au moment de la création.
    - Le Panel s'align sur le client
    - Le cadre s'aligne sur le client
    Et bien tant que l'onglet contenant le panel ne sera pas visible, la taille du cadre sera fausse.

    Extrait du code, j'ai ajouté tout un tas d'essais mais rien ne marche :
    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
     
      // Création du cadre
      // LeParent est un paramètre de la procédure de type TWinControl, donc le Panel dans l'exemple
      Result := TCadreAutomate.Create(LeParent);
      Result.Parent := LeParent;
      // Ici on affiche 443 (cadre) et 1280 (Panel)
      ShowMessage(IntToStr(Result.Width)+' '+IntToStr(LeParent.Width));
      Result.Align:=alClient;
      // Ici on affiche toujours 443 (cadre) et 1280 (Panel)
      ShowMessage(IntToStr(Result.Width)+' '+IntToStr(LeParent.Width));
      LeParent.Ralign;
      // Ici on affiche toujours 443 (cadre) et 1280 (Panel)
      ShowMessage(IntToStr(Result.Width)+' '+IntToStr(LeParent.Width));
      FenPrinc.Onglet.PageIndex:=3;
      // Ici on affiche enfin 1280 (cadre) et 1280 (Panel)
      ShowMessage(IntToStr(Result.Width)+' '+IntToStr(LeParent.Width));
    Le basculement de l'onglet semble bien mettre à jour le cadre, mais ce n'est pas ce que je veux : je ne veux pas que l'onglet change. D'autre part c'est ici un shunt en dur sur le nom de la fenêtre et de son onglet. Au final LeParent pourra être tout type de TWinControl.

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Après encore une série d'essais il semble que déjà le Panel ne soit pas encore créé convenablement.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ShowMessage(IntToStr(LeParent.Top)+' '+IntToStr(LeParent.Left)+' '+IntToStr(LeParent.Width)+' '+IntToStr(LeParent.Height));
      Result.Top := 0;
      Result.Left := 0;
      Result.Width := LeParent.ClientWidth;
      Result.Height := LeParent.ClientHeight;
      ShowMessage(IntToStr(LeParent.Top)+' '+IntToStr(LeParent.Left)+' '+IntToStr(LeParent.Width)+' '+IntToStr(LeParent.Height));
    Le premier ShowMessage me donne bien 0 0 1280 981
    Mais le deuxième me donne 0 0 0 0


    J'ai vu aussi que dans un onglet de TTabSheet je n'ai pas de souvcis... Je sents que je vais passer par du couper coller des pages des TTabbedNoteBook vers des TTabSheet. Mais comme j'en ai un paquet dans ce cas je serais curieux de voir s'il y a une solution.

  3. #3
    Membre habitué Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Points : 197
    Points
    197
    Par défaut
    Bonsoir,
    J'ai pas bien compris de quoi il s'agit, mais je vois une création dynamique de Ttabsheat dans la quelle il y a un TFrame. voici une procédure que j'utilise dans mon code qui crée tant de Page que d'enregistrement dans une BD et dans chaque Page il y a instanciation d'un TFrame. j'espère que ca t'aide.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    procedure TForm1.StartProcess();
    var sqlr,sqli:TSQLQuery;
    I,J,K,H:integer;
    tbs : TTabSheet;
    tf : TFrame1;
    begin
      sqlr := TSQLQuery.Create(Owner);
      sqlr.SQLConnection := pingerdbconn;
      sqlr.SQL.Clear;
      sqli := TSQLQuery.Create(Owner);
      sqli.SQLConnection := pingerdbconn;
      sqlr.SQL.Add('SELECT * FROM W_CLASSE_PING WHERE W_CL_PING_ACTIF = 1');
      sqlr.ExecSQL(true);
      sqlr.Active:=true;
      for I := 0 to sqlr.RecordCount - 1 do
        begin
          tv.Items.Add(nil,sqlr.Fields.FindField('W_CL_PING_NAME').AsString);
          tbs := TTabSheet.Create(Self);
          tf := TFrame1.Create(self);
          tf.Name := sqlr.Fields.FindField('W_CL_PING_NAME').AsString;
          tf.Align := alClient;
          tf.Parent := tbs;
          tf.CLPINGID := sqlr.Fields.FindField('W_CL_PING_ID').AsInteger;
          tf.min := 1000;
          tf.max := 0;
          tf.tt.Interval := sqlr.Fields.FindField('W_CL_PING_POLLING').AsInteger;
          tf.gb.Caption := ' Panneau de controle du processus ' + sqlr.Fields.FindField('W_CL_PING_NAME').AsString + ' ';
          tf.l.Caption := 'Le processus ' + sqlr.Fields.FindField('W_CL_PING_NAME').AsString + ' est actif depuis '+ datetostr(now) + ' '+timetostr(now);
          tf.sb.Panels[0].Text := sqlr.Fields.FindField('W_CL_PING_NAME').AsString + '('+datetostr(now) + ' '+timetostr(now)+')';
          tbs.PageControl := pc;
          tbs.Caption := sqlr.Fields.FindField('W_CL_PING_NAME').AsString;
          for J := 0 to tv.Items.Count - 1 do
            begin
              if tv.Items[J].Text = sqlr.Fields.FindField('W_CL_PING_NAME').AsString then
                begin
                  tv.Items[J].ImageIndex:= 0;
                  tv.Items[J].SelectedIndex:= 0;
                  tv.Items[J].Data := tbs;
                  tbs.Tag := Longint(tv.Items[J]);
                  sqli.SQL.Clear;
                  sqli.SQL.Add('SELECT * FROM W_INTERFACE WHERE W_CL_PING_ID = '+ inttostr(sqlr.Fields.FindField('W_CL_PING_ID').AsInteger) + ' AND W_INTER_ACTIF = 1');
                  sqli.ExecSQL(true);
                  sqli.Active:=true;
                  for K := 0 to sqli.RecordCount - 1 do
                    begin
                      tv.Items.AddChild(tv.Items.Item[J],sqli.Fields.FindField('W_INTER_IPADD').AsString);
     
                      for H := 0 to tv.Items.Count - 1 do
                        begin
                          if tv.Items[H].Parent = tv.Items[J] then
                            begin
                              tv.Items[H].ImageIndex := 1;
                              tv.Items[H].SelectedIndex := 1;
                            end;
                        end;
     
                      sqli.Next;
                    end;
                end;
            end;
        sqlr.Next;
        end;
        sqlr.Close;
        sqlr.Free;
        sqli.Close;
        sqli.Free;
    end;
    Bon Courage,

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Bonsoir,

    Justement je ne crée pas le TabSheet car le TFrame est créé dans un control existant. Dans l'exempl il s'agit d'un TPanel existant (créé à la conception) mais situé dans une page d'un TTabbedNoteBook aussi créé à la conception.

    Le problème n'est pas sur la création dynamique qui fonctionne bien, mais sur le fait que tant que les composants situés dans un TTabbedNoteBook ne sont pas visibles ils ont des propriétés délirantes. En général on s'en fout car tout se place bien une fois que l'utilisateur va dans l'onglet. Mais là ça me gène car dans le TFrame je place des composants en fonction de la taille, or la taille du parent (TPanel) est complètement fausse à ce moment là.

    J'ai refais des essais depuis en virant le TTabbedNoteBook et en le remplaçant par un TTabControl. Là ça fonctionne, même les composants dans les onglets non visible prennent de suite leurs propriétés correctes.

Discussions similaires

  1. Evènement d'un sous-composant non visible
    Par guillemouze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/04/2013, 11h47
  2. Capture d'évênement clavier par un composant non visible
    Par _Ulysse_ dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2012, 16h14
  3. données non visibles après mise à jour (MYSQL)
    Par dida.ratsimba dans le forum W4 Express
    Réponses: 3
    Dernier message: 02/12/2008, 08h18
  4. Fenetre affichee vide / composants non visibles
    Par Malawi dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 15/09/2008, 23h11
  5. Composants non visible dans certaines applications
    Par chtom dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 22/03/2006, 17h33

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