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

Windows Forms Discussion :

affichage d'une fenêtre à partir d'un backgroundworker


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut affichage d'une fenêtre à partir d'un backgroundworker
    Bonjour,
    Je suis en train d'utiliser un backgroundworker pour executer mes calculs et afficher le résultat sous forme de graphique. Dans doWork je lance mes fonctions de calcul et l'initialisation de la fenêtre contenant mes résultats.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dExtracted.Missing = cd.replaceMissingValue(dExtracted.Cleaned);
    formReplace=new frmReplace(mdiParent);
    Ensuite je procède à l'affichage de ma fenêtre de résultat dans runWorkercomplete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    formReplace.MdiParent = this;
    formReplace.Show();
    formReplace.Dock = DockStyle.Fill;
    formReplace.WindowState = FormWindowState.Normal;
    Le problème est qu'à l'affichage, j'ai un certain temps où on voit le repositionnement de ma fenêtre et du graphique à l'intérieur. Y a t il un moyen d'empécher cela? Je voudrais que l'affichage se fait de façon uniforme sans avoir les zones qui figent et les repositionnement.

    merci pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 96
    Points
    96
    Par défaut
    Je pense que c'est une question de doublebuffer.

    regarde sur ton formulaire principale si l'option "doublebuffered" est actif.

    Attention si tu as des panels ou autre conteneur, cette propriété n'est pas public, donc il faudra la surcharger en dérivant le composant.
    dev delphi | c# .Net - .Net CF - réseau - silverlight
    Motard a ses heures

  3. #3
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Quand tu parles de dériver les composants, est ce qu'il faut créer une classe pour chaque composant, par exemple Panel, datagridview, Form?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 96
    Points
    96
    Par défaut
    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public partial class TablePanel : TableLayoutPanel
        {
            public TablePanel()
            {
                InitializeComponent();
                this.DoubleBuffered = true;
            }
        }
    dev delphi | c# .Net - .Net CF - réseau - silverlight
    Motard a ses heures

  5. #5
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    J'ai créé cette classe pour Panel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public partial class PanelDoubleBuffered : Panel
        {
            public PanelDoubleBuffered()
            {
                InitializeComponent();
                this.DoubleBuffered = true;
            }
        }
    J'ai une erreur à InitializeComponent car elle n'est pas déclarée.
    Si je crée cette classe, je dois changer tous mes Panel en PanelDoubleBuffered. Pourtant les initializations du Panel se trouve dans la fonction InitializaComponent() d'une forme et qu'il est déconseillé de modifier les paramètres à l'intérieur.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 96
    Points
    96
    Par défaut
    au lieu de créer une classe directement, crée un Composant ou un usercontrol et tu change la classe de base par "Panel".
    dev delphi | c# .Net - .Net CF - réseau - silverlight
    Motard a ses heures

  7. #7
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Je l'ai créé comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public partial class PanelDoubleBuffered : Panel
        {
            public PanelDoubleBuffered()
            {            
                this.DoubleBuffered = true;
            }
        }
    La classe apparaît comme un usercomponent dans le toolbox de VS. J' ai donc changé mes panel avec PanelDoubleBuffered. J'ai mis les doublebuffered de ma form parent, les form fils à true mais j'ai toujours le même résultat comme le montre mon imprime écran (screen.jpg). C'est à dire que l'écran fige avant l'affichage.
    Images attachées Images attachées  

  8. #8
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    Je prends le sujet en cours mais j'ai une question la fenêtre qui "freeze" c'est bien celle qui est créée dans le thread dans lequel tu effectues les calculs ?

    Si c'est bien le cas, pour moi il est normal que tu observes ce résultat.
    Une appli Winforms a un thread principal, le thread UI (d'affichage), il est recommandé (notamment par Microsoft) de ne pas effectuer d'opérations longues sur ce thread sinon ben le thread se bloque sur ces tâches et l'affichage "freeze".

    Donc pour résoudre ce problème, il faut ouvrir la fenêtre dans le thread UI et effectuer les calculs dans un autre thread (via le backgroundworker c'est parfait).

  9. #9
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Bonjour,
    Oui, j'utilise un backgroundworker pour faire les calculs nécessaires pour les données de mes graphiques. Ensuite j'appelle l'affichage de ma "Form" dans runcompleted grace à form.Show().
    Si je comprends ce que vous voulez dire, c'est de faire dans premier temps le calcul avec un thread (backgroundworker) ensuite faire appel une nouvelle fois à un autre thread pour afficher la "Form".
    Mais dans le doWork, on ne peut appeller form.Show() car la form est à l'extérieur du thread. Comment on peut afficher une "Form" dans le 2eme thread? Sinon peut on juste ne pas utiliser le doWork mais seulement le runCompleted?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Non non, j'ai dû mal m'exprimer et je n'avais pas compris que le show de votre form était dans le RunCompleted.

    Sinon de quoi est composée la Form et comment les données sont rattachées aux composants les affichant ?

  11. #11
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Ma "Form" est composée d'une graphique de la librairie Dundas, d'un panel pour la gestion de mes boutons de navigation à travers les graphiques( précédent, suivant), des infos statistques sur les données. J'ai également une "Form" de navigation à gauche. Cette dernière est déjà présente avant le calcul.(voir copie d'écran le logiciel avant calcul et le logiciel après calcul)
    J'ai tenté la chose suivante, j'ai créé un autre backgroundworker juste pour afficher ma "Form", le 1er backgrounworker est utilisé pour initialiser la "Form" et calculer les données à afficher. Mais le résultat ne change guère de la 1ère procédure où je n'utilisais qu'un seul backgroundworker.
    Images attachées Images attachées   

  12. #12
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Le second impr' écran montre qu'il y a pas mal de données affichées non ?
    Quand est-il avec moins de données ?

    Pour moi, si les calculs sont effectués dans un thread différent de celui de l'affichage, tout ce qui peut ralentir celui-ci ben c'est lui, en gros qu'il a beaucoup de données à afficher.

    Je connais pas les composants Dundas mais vu tout ce qui a été dit ici, je pense qu'il faut regarder de ce coté.

  13. #13
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Oui, il y a pas mal de données car une graphique peut contenir 2000points, ce n'est pas vraiment un problème si l'écran freeze un peu. Mais là avec l'affichage de la "Form" contenant le graphique, même la "Form" de gauche freeze et ça donne l'impression pendant quelques 2 ou 3 secondes que l'outil plante. Si déjà, j'arrive à garder l'affiche comme au 1er impr ecran et que le freeze n'apparait que sur la nouvelle "Form" c'est déjà ça de gagner. Y a-t-il un moyen d'y arriver?

  14. #14
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Une question : comment sont bindées les données (je veux bien voir le code) ?

  15. #15
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Voila les codes dans la "Form" d'affichage du graphique

    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
            public uscOriginalGraph(Form1 mdi)
            {
                InitializeComponent();
                mdiP = mdi;
                originData = new DataTable();
                originData = mdiP.dExtracted.Original;
     
     
                //Creer les informations statistiques
                info = new GraphInfo();
                info.setStatInfo(originData, true);
                info.setValueGraphic(originData);
     
                //initialiser les données
     
                columnName.Columns.Add("ID");
                columnName.Columns.Add("NameVariable");
                string name = "";
     
                for (int j = 0; j < mdiP.dExtracted.Original.Columns.Count; j++)
                {
                    if (!mdiP.dExtracted.Original.Columns[j].ColumnName.Equals("Date") &&
                        !mdiP.dExtracted.Original.Columns[j].ColumnName.Equals("Index"))
                    {
                        name = Regex.Split(mdiP.dExtracted.Original.Columns[j].ColumnName, "\r\n")[1];
                        columnName.Rows.Add(mdiP.dExtracted.Original.Columns[j].ColumnName, name);
                    }
                }
                this.DoubleBuffered = true;
            }
    ensuite dans le load
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void uscOriginalGraph_Load(object sender, EventArgs e)
            {
                cbbColumn.DataSource = columnName;
                cbbColumn.DisplayMember = "NameVariable";
                cbbColumn.ValueMember = "ID";
     
                cbbColumn.SelectedIndex = 0;
     
                cbbAxisInterval.SelectedIndex = 0;
                cbbSegmentInterval.SelectedIndex = 0;
            }
    l'initialisation de cbbColumn.SelectedIndex declenche ensuite
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
            public void showGraph(Chart chartGraph, string typeGraph, ArrayList pointX, ArrayList pointY, string currentText, string segmentInt, string axisInt)
            {
                //Titre du graphique
                chartGraph.Titles[0].Text = currentText;
                // Set Title font
                chartGraph.Titles[0].Font = new Font("Times New Roman", 18, FontStyle.Bold);
     
                // Set Title color
                chartGraph.Titles[0].Color = Color.Blue;
     
                // Set manual minimum and maximum values.
     
                chartGraph.ChartAreas["Default"].AxisY.Minimum = info.getMinMaxValue(pointY)[0] -
                    Math.Round((info.getMinMaxValue(pointY)[0] * 0.1), 2);
                //}
                //on ne traite que les valeurs supérieurs ou egales à la valeur minimale
                //excluant la valeur max 0 et la valeur min 0
                if (info.getMinMaxValue(pointY)[0] <= info.getMinMaxValue(pointY)[1] &&
                    (info.getMinMaxValue(pointY)[1] != 0 && info.getMinMaxValue(pointY)[0] != 0))
                {
                    chartGraph.ChartAreas["Default"].AxisY.Maximum = info.getMinMaxValue(pointY)[1] +
                        Math.Round((info.getMinMaxValue(pointY)[1] * 0.1), 2);
                }
     
     
     
                switch (typeGraph)
                {
                    case "point":
                        // Set interval of X axis to 1 week, with an offset of 1 day
                        chartGraph.ChartAreas["Default"].AxisX.Interval = 3;
                        chartGraph.ChartAreas["Default"].AxisX.IntervalType = DateTimeIntervalType.Weeks;
                        chartGraph.ChartAreas["Default"].AxisX.IntervalOffset = 21;
                        chartGraph.ChartAreas["Default"].AxisX.IntervalOffsetType = DateTimeIntervalType.Days;
     
                        chartGraph.Series["Series1"].Type = SeriesChartType.Point;
                        chartGraph.Series["Series1"].MarkerStyle = MarkerStyle.Circle;
                        //chartGraph.Series["Series1"].XValueType = ChartValueTypes.DateTime;
                        chartGraph.Series["Series1"].Points.DataBindXY(pointX, "DateTime", pointY, "Valeur");
                        chartGraph.Series["Series1"].XValueType = ChartValueTypes.DateTime;
                        // chartGraph.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd HH:mm";
                        chartGraph.ChartAreas["Default"].AxisX.LabelStyle.Format = "g";
     
                        break;
                    case "diagram":
                        //chartGraph.Series["Series1"].Type = SeriesChartType.Column;
                        chartGraph.Series["Series1"].Points.DataBindY(pointY);
     
                        HistogramChartHelper helper = new HistogramChartHelper();
     
                        // Show the percent frequency on the right Y axis.
                        helper.ShowPercentOnSecondaryYAxis = false;//true
     
                        if (!cbbSegmentInterval.Text.Equals("") &&
                            !cbbSegmentInterval.Text.Equals("Select Interval"))
                        {
                            // Specify number of segment intervals
                            helper.SegmentIntervalNumber = int.Parse(cbbSegmentInterval.Text);
                        }
                        else
                        {
                            helper.SegmentIntervalNumber = 10;
                        }
     
                        // Create histogram series
                        try
                        {
                            helper.CreateHistogram(chartGraph, "Series1", "Histogram");
                            SetHistogramLayout(chartGraph, "Series1", "Histogram");
     
     
                            // Reset y-axis min/max
     
                            chartGraph.ChartAreas[0].AxisY.Minimum = double.NaN; ;
     
                            chartGraph.ChartAreas[0].AxisY.Maximum = double.NaN;
     
     
     
                            // Get the max x-value on Histogram
     
                            DataPoint dpMax = chartGraph.Series["Histogram"].Points.FindMaxValue("X");
     
     
     
                            // Get before and after (rounding) value
     
                            double maxXBefore = dpMax.XValue;
     
                            double maxXAfter = Math.Ceiling(dpMax.XValue);
     
     
     
                            // Set x-axis' max to rounded value
     
                            chartGraph.ChartAreas[0].AxisX.Maximum = maxXAfter;
     
                            //MessageBox.Show(string.Format("Before: {0}\nAfter: {1}", maxXBefore, maxXAfter));
     
     
                        }
                        catch (ArgumentOutOfRangeException)
                        {
                        }
                        catch (InvalidOperationException)
                        {
                        }
     
     
     
                        //set interval
                        if (!cbbAxisInterval.Text.Equals("") &&
                            !cbbAxisInterval.Text.Equals("Select Axis"))
                        {
                            chartGraph.ChartAreas[0].AxisX.Interval = int.Parse(cbbAxisInterval.Text);
                        }
                        else
                        {
                            chartGraph.ChartAreas[0].AxisX.Interval = 1;
                        }
                        //chartGraph.Titles[0].Text = Regex.Split(chartGraph.Titles[0].Text, "\r\n")[1];
                        chartGraph.Titles[0].Visible = false;
                        break;
                }
     
                //// Set Border Color
                chartGraph.ChartAreas["Default"].BorderColor = Color.Black;
     
                //// Set Border Style
                chartGraph.ChartAreas["Default"].BorderStyle = ChartDashStyle.Solid;
     
                // enable axis line
                chartGraph.ChartAreas["Default"].AxisX.MajorGrid.Enabled = false;
     
                //Legend
                chartGraph.Legends["Default"].Enabled = false;
     
     
     
                //chartGraph.Serializer.Content = SerializationContent.All;
     
                //chartGraph.Serializer.Save(@"c:\chart.xml");
     
     
     
            }
    entre temps on calcul des données pour créer PointY et PointX dans la fonction getInfo().

  16. #16
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Essaye déjà de retirer du constructeur tout ce qu'il y a après le InitializeComponent() et de mettre ça dans le Load.

    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    originData = new DataTable();
    est inutile mais là tu vas pas gagner 10 secondes non plus.

    Sinon je vois que tu as mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    catch (ArgumentOutOfRangeException)
    {
    }
    catch (InvalidOperationException)
    {
    }
    Des exceptions sont-elles levées ? Sachant que si oui, alors il vaut mieux éviter une exception (si possible) (en gros une exception qui peut être prévue n'est plus une exception) que la laisser arriver et ne pas la traiter (en terme de performance)

  17. #17
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    J'ai apporté les quelques modifications dans les codes mais le problème de freeze ne s'attenue pas.
    Je me demandais y a-t-il un moyen de rendre invisible les "Form" filles jusqu'à elles aeint fini de se charger, l'utilisation de suspendLayout peut être? Mais pour l'instant je ne trouve pas l'endroit où l'appliquer.

  18. #18
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Une possibilité : essaye d'ouvrir ta form en minimisé et à la fin de son load de la mettre en maximisé.

    Une autre possibilité : réduire le nombre de données à afficher (si possible)
    Par exemple, on voit ton graph avec plein de points, je ne sais s'il est possible de zoomer dessus mais tu pourrais ne pas dessiner les points trop proches l'un de lautre étant donné l'échelle de ton graph pour être "visibles"... Un peu comme ce qui est appliqué dans les jeux-vidéo. Mais bon c'est nettement plus complexe que la première possibilité mais elle offre pour moi un fort potentiel d'optim'

  19. #19
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    La 1ere solution aide pas mal pour attenuer le freeze. Pour la seconde, j'ai la fonction de zoom sur mes graphiques, mais pour de raison d'utilité pour les utilisateurs je dois afficher toutes les points. C'est également une possibilité à explorer dans le futur .
    Merci pour l'aide

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

Discussions similaires

  1. Affichage d'une fenêtre MFC à partir d'une DLL
    Par damdam78 dans le forum MFC
    Réponses: 1
    Dernier message: 25/11/2009, 10h24
  2. Réponses: 12
    Dernier message: 15/06/2009, 10h35
  3. Affichage d'une fenêtre WPF à partir d'une app console
    Par pcayrol dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 29/03/2008, 15h56
  4. pb affichage dans une fenêtre
    Par Mat 74 dans le forum Windows
    Réponses: 8
    Dernier message: 27/11/2005, 23h14
  5. Changer l'icône d'une fenêtre à partir d'un .res
    Par henderson dans le forum C++Builder
    Réponses: 8
    Dernier message: 11/03/2003, 10h48

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