Commentaires

  1. Avatar de CinePhil
    • |
    • permalink
    Vous devriez poser votre demande dans le forum Postgresql plutôt que sur votre blog.

    Ceci dit...
    1) Postgresql n'est pas, à proprement parler, une base de données objet.
    Existe t-il d'ailleurs encore des SGBDR objet ? Je n'en ai jamais vu et j'ai lu ici ou là que cette tentative fut un échec.

    Son métier de Services Financiers d'Assurances fait que les modèles purement relationnels sont insuffisants et mènent à une redondance dans les structures de données
    S'il y a redondance de données, ça veut seulement dire que le modèle de données est raté !
    Une base de données relationnelle correctement modélisée empêche justement toute redondance de données.
    On peut, dans certains cas et pour des besoins de performance, en introduire mais c'est généralement plutôt à éviter.

    qui pourrait être évitée par l'utilisation des techniques d'héritage.
    On peut tout à fait faire de l'héritage de données avec une base de données relationnelle.

    Exemple...
    Règles de gestion :
    R1 : Une voiture est un véhicule et un véhicule peut être une voiture.
    R2 : Un camion est un véhicule et un véhicule peut être un camion.

    MCD :
    Voiture -(1,1)----être----0,1- Vehicule
    Camion -(1,1)----être----0,1-----|

    Tables :
    te_vehicule_veh (veh_id, veh_immatriculation, veh_date_achat...)
    th_voiture_voi (voi_id_vehicule, voi_nb_places...)
    th_camion_cam (cam_id_vehicule, cam_tonnage...)

    Le souci de votre client tient donc plutôt dans la modélisation des données que dans le choix potentiel d'un hypothétique SGBD objet.

    L'équipe à former comprend 3 personnes.
    Vous ne dites pas où ni sous quel délai.

    Encore une fois, réexaminez la problématique sous un angle différent. L'application utilise la base de données mais ne détermine pas le modèle de données. Et quand on développe une application utilisant une base de données, il est préférable de commencer par la modélisation des données. Ne pas confondre les classes métiers qui sont dans l'application et les tables de la base de données.

    Étant micro-entrepreneur et assez qualifié en matière de modélisation des données, nous pouvons, si vous le souhaitez, en discuter de manière plus approfondie. Contactez-moi, le cas échéant, en messagerie privée de Developpez.net.
  2. Avatar de JLChelin
    • |
    • permalink
    J’étais développeur en ASM 370 IBM une belle éclate dans un langage très proche de la machine, depuis j'ai bien profité de ce site pour faire quelque outil en PERL, VB NET, HTML.
    A chaque recherche sur le site je suis admiratif des solutions proposée par l'ensemble des contributeurs, continuez tous.
    et un grand merci
  3. Avatar de michaelvd
    • |
    • permalink
    Très sympa.. C'est agréable de s'arrêter un instant sur quelque chose de précis.
  4. Avatar de badoquealex
    • |
    • permalink
    Article très intéressant, surtout pour moi qui ai appris le C# par la pratique.
    Je connaissais la subtilité concernant l’initialisation du readonly dans le constructeur, mais pas le "one more thing".
  5. Avatar de Dendrite
    • |
    • permalink
    Ah oui, je réponds aussi à ceci. Willy dit à juste titre que les ';' ne sont pas obligatoires. On parle bien sûr des ';' du SQL.
    Pour la bonne raison que PDO ne gère qu'une instruction SQL à la fois.
    Si vous souhaitiez créer une table puis la remplir via une requête PDO, vous ne pourriez pas mettre ces 2 instructions dans votre requête. Vous seriez obligé de passer par 2 instructions PDO différentes.
    Code SQL : 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
    CREATE TABLE IF NOT EXISTS `contact` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(100) NOT NULL,
      `prenom` varchar(100) NOT NULL,
      `mail` varchar(200) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `nom` (`nom`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
     
    INSERT INTO `contact` (`id`, `nom`, `prenom`, `mail`) VALUES
    (1, 'ACCOYER', 'Alain', 'alain.accoyer@gmail.com'),
    (2, 'BRABOIS', 'Bernard', 'bbrabois@yahoo.fr'),
    (3, 'CHAZAL', 'Claire', 'chaz@wanadoo.fr'),
    (4, 'DENDRITE', 'Daisy', 'dendy@gmail.com'),
    (5, 'CHAZAL', 'Etienne', 'chazet@gmail.com'),
    (6, 'CHAZAL', 'Chantal', 'chacha@monfai.fr'),
    (7, 'CHAZAL', 'Kevin', 'kevcha@noos.fr'),
    (8, 'ZANZIBAR', 'Zoé', 'zanzo@orange.ocm'),
    (9, 'CASERATI', 'Michel', 'michoucase@voila.fr'),
    (10, 'FRIPON', 'Françoise', 'francoise.fripon@gmail.com');
  6. Avatar de Dendrite
    • |
    • permalink
    Le problème des débutants, c'est qu'ils ne préparent JAMAIS les requêtes quand il le faut. Alors je fais simple. Je leur montre comment TOUJOURS préparer leurs requêtes. Ca manque totalement de nuances ? M'en fous. C'est PDO une soupe et au lit. Pour les nuances, on laisse ici, en commentaire... Donc pour ceux que ça intéresse, Willy a raison.
    Pour le chapitre 5, sans filtre, et celui-là seulement, pas de risque d'injection SQL ! on peut donc se passer de requête préparée, et gagner une ligne.
    en remplaçant

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = $db->prepare($sql);
    $stmt ->execute();

    par

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $stmt = $db->query($sql);
  7. Avatar de Willy_k
    • |
    • permalink
    Sans filtre, il n y a vraiment aucun gain à préparer la requête, query aurait suffit, et les ; ne sont pas obligatoires.
  8. Avatar de Dendrite
    • |
    • permalink
    Ok willy. Merci, c'est corrigé.
  9. Avatar de Willy_k
    • |
    • permalink
    Il est marqué

    Ci-dessous les exemples qui démontrent la façon de modifier proprement le jeu de caractères lors de l'exécution en utilisant chacune des APIs.
    Comme un conseil, non ?
  10. Avatar de Dendrite
    • |
    • permalink
    Bonjour Willy !
    Ton lien me montre que c'est possible à partir de PHP 5.3.6. Tu as un lien qui me montre que c'est conseillé ?
  11. Avatar de Willy_k
    • |
    • permalink
    Bonjour,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'Pour une version supérieure ou égale à 5.3.6, il est conseillé de passer le ;charset dans le DSN http://php.net/manual/fr/mysqlinfo.concepts.charset.php
  12. Avatar de Dendrite
    • |
    • permalink
    Salut Raw,

    Merci j'ai corrigé !
  13. Avatar de rawsrc
    • |
    • permalink
    Salut miss,

    le paragraphe 4 (Le bloc try catch : afficher les exceptions) est mal formulé :
    Code php : 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
    try{ 
       //ici vous écrivez tout votre script
       //On vérifie que notre connexion est bonne avant d'aller plus loin
       $pdo = include 'db_mysql.php';
       if($pdo instanceof PDO) {
          echo 'Connexion réussie ! On peut continuer !';
       }
       else{
          echo 'Connexion ratée ! Essaie encore !';
       }
       //jusqu’à la fin, s’il y a une exception, elle sera interceptée par le catch
    } 
    catch(Exception $e){
       //s'il y a un probleme PHP ou SQL, que ce soit un warning ou une erreur fatale, tout s'affichera ici
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    Le code de connexion te renvoie obligatoirement une ressource PDO sinon il déclenche une erreur fatale.
    Donc tout ce code est à remplacer simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdo = include 'db_mysql.php';
    Après quand tu prépares et exécutes du SQL, il est nécessaire d'encapsuler ces bouts de code dans un try...catch car à l'ouverture de la connexion on indique expressément qu'en cas de problème PDO doit nous avertir en déclenchant une erreur PDOException avec PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  14. Avatar de Dendrite
    • |
    • permalink
    Bonjour !
    N'hésitez pas à tester et commenter ici si vous rencontrez la moindre difficulté !
    C'est fait pour ça !
  15. Avatar de naute
    • |
    • permalink
    Bonjour Gilles .

    Après avoir tout saisi à la main ça fonctionne parfaitement. Comme je ne comprenais pas ce qui s'était passé, j'ai comparé les fichiers des deux versions. L'erreur est dans le fichier test.lpr. La ligne Application.CreateForm(TForm, MainForm); n'est pas correcte, mais, curieusement, elle ne déclenche aucune exception. .

    Fichier fonctionnel :
    Code Pascal : 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
     
    program test;
     
    {$mode objfpc}{$H+}
     
    uses
     {$IFDEF UNIX}{$IFDEF UseCThreads}
     cthreads,
     {$ENDIF}{$ENDIF}
     Interfaces, // this includes the LCL widgetset
     Forms, main
     { you can add units after this };
     
    {$R *.res}
     
    begin
     RequireDerivedFormResource:=True;
     Application.Initialize;
     Application.CreateForm(TMainForm, MainForm);
     Application.Run;
    end.
    Fichier erroné :
    Code Pascal : 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
     
    program test;
     
    {$mode objfpc}{$H+}
     
    uses
     {$IFDEF UNIX}{$IFDEF UseCThreads}
     cthreads,
     {$ENDIF}{$ENDIF}
     Interfaces, // this includes the LCL widgetset
     Forms, main
     { you can add units after this };
     
    {$R *.res}
     
    begin
     RequireDerivedFormResource:=True;
     Application.Initialize;
     Application.CreateForm(TForm, MainForm);
     Application.Run;
    end.
    Comme j'avais fait un copié/collé, la synchronisation n'a pas été automatique et quand j'ai modifié à la main, j'ai zappé ce détail . Désolé de t'avoir fait perdre ton temps pour une bête erreur de ma part.
    Je vais pouvoir commencer la deuxième partie de tes tutos .

    Merci encore,
    amicalement,
    Hervé.
  16. Avatar de naute
    • |
    • permalink


    Effectivement, aucun des gestionnaires d’événement n'était affecté. J'ai donc remédié à cela mais sans grand résultat malheureusement.

    Voici mon nouveau fichier lfm :

    Code Pascal : 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
     
    object MainForm: TMainForm
      Left = 351
      Height = 525
      Top = 226
      Width = 905
      Caption = 'Test de rectangle - BGRABITMAP'
      ClientHeight = 525
      ClientWidth = 905
      OnCreate = FormCreate
      OnDestroy = FormDestroy
      Position = poScreenCenter
      LCLVersion = '1.8.2.0'
      object PaintBox: TPaintBox
        Left = 24
        Height = 440
        Top = 8
        Width = 440
      end
      object gbSimple: TGroupBox
        Left = 480
        Height = 232
        Top = 8
        Width = 176
        Caption = 'Simples'
        ClientHeight = 213
        ClientWidth = 174
        TabOrder = 0
        object btnRectdmSet: TButton
          Left = 16
          Height = 25
          Top = 16
          Width = 136
          Caption = 'Rectangle (dmSet)'
          OnClick = btnRectdmSetClick
          TabOrder = 0
        end
        object btnRectangleBGRAPixel: TButton
          Left = 16
          Height = 25
          Top = 48
          Width = 136
          Caption = 'Rectangle (BGRAPixel)'
          OnClick = btnRectangleBGRAPixelClick
          TabOrder = 1
        end
        object btnRectangleBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 80
          Width = 136
          Caption = 'Rectangle (Border/Fill)'
          OnClick = btnRectangleBorderFillColorClick
          TabOrder = 2
        end
        object btnFillRect: TButton
          Left = 16
          Height = 25
          Top = 112
          Width = 136
          Caption = 'FillRect (color)'
          OnClick = btnFillRectClick
          TabOrder = 3
        end
        object btnRoundRect: TButton
          Left = 16
          Height = 25
          Top = 144
          Width = 136
          Caption = 'RoundRect (BGRAPixel)'
          OnClick = btnRoundRectClick
          TabOrder = 4
        end
        object btnRoundRectBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 176
          Width = 136
          Caption = 'RoundRect (Border/Fill)'
          OnClick = btnRoundRectBorderFillColorClick
          TabOrder = 5
        end
      end
      object btnClear: TButton
        Left = 24
        Height = 25
        Top = 480
        Width = 75
        Caption = 'Nettoyer'
        OnClick = btnClearClick
        TabOrder = 1
      end
    end

    Plutôt que de te faire perdre ton temps, je vais tout recommencer à zéro, à la main, sans faire de copie pour essayer de gagner du temps. Je te tiens au courant quelque soit le résultat.

    Amicalement,
    Hervé.
  17. Avatar de gvasseur58
    • |
    • permalink
    Bonjour Hervé,

    A première vue, c'est ton fichier LFM qui indique ce qui ne va pas : aucun composant n'est associé aux gestionnaires d'événements . Ainsi, la fenêtre principale devrait être associée aux gestionnaires OnCreate et OnDestroy, mais ce n'est pas le cas.

    En fait, si c'est le problème, le code de l'unité ne suffit pas : il faut absolument que le fichier LFM reflète les liaisons entre composants et gestionnaires.
    Deux solutions :
    1. cliquer sur les bons gestionnaires dans l'inspecteur d'objets pour chaque objet concerné.
    2. reprendre le fichier LFM selon le modèle suivant...

    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
    object MainForm: TMainForm
      Left = 250
      Height = 525
      Top = 184
      Width = 905
      Caption = 'Test de Rectangle - BGRABITMAP'
      ClientHeight = 525
      ClientWidth = 905
      OnCreate = FormCreate
      OnDestroy = FormDestroy
      Position = poScreenCenter
      LCLVersion = '1.6.2.0'
      object PaintBox: TPaintBox
        Left = 24
        Height = 440
        Top = 8
        Width = 440
      end
      object gbSimple: TGroupBox
        Left = 480
        Height = 232
        Top = 8
        Width = 176
        Caption = 'Simples'
        ClientHeight = 212
        ClientWidth = 172
        TabOrder = 0
        object btnRectdmSet: TButton
          Left = 16
          Height = 25
          Top = 16
          Width = 136
          Caption = 'Rectangle (dmSet)'
          OnClick = btnRectdmSetClick
          TabOrder = 0
        end
        object btnRectangleBGRAPixel: TButton
          Left = 16
          Height = 25
          Top = 48
          Width = 136
          Caption = 'Rectangle (BGRAPixel)'
          OnClick = btnRectangleBGRAPixelClick
          TabOrder = 1
        end
        object btnRectangleBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 80
          Width = 136
          Caption = 'Rectangle (Border/Fill)'
          OnClick = btnRectangleBorderFillColorClick
          TabOrder = 2
        end
        object btnFillRect: TButton
          Left = 16
          Height = 25
          Top = 112
          Width = 136
          Caption = 'FillRect (color)'
          OnClick = btnFillRectClick
          TabOrder = 3
        end
        object btnRoundRect: TButton
          Left = 16
          Height = 25
          Top = 144
          Width = 136
          Caption = 'RoundRect (BGRAPixel)'
          OnClick = btnRoundRectClick
          TabOrder = 4
        end
        object btnRoundRectBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 176
          Width = 136
          Caption = 'RoundRect (Border/Fill)'
          OnClick = btnRoundRectBorderFillColorClick
          TabOrder = 5
        end
      end
      object btnClear: TButton
        Left = 24
        Height = 25
        Top = 480
        Width = 75
        Caption = 'Nettoyer'
        OnClick = btnClearClick
        TabOrder = 1
      end
    end
    J'espère que tout ira bien après ça !

    Gilles
  18. Avatar de naute
    • |
    • permalink
    Bonjour Gilles .

    Voilà les informations. Comme je te l'ai précisé précédemment, c'est du copié/collé. Je n'ai normalement pas changé une virgule,

    test.lpr
    Code Pascal : 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
     
    program test;
     
    {$mode objfpc}{$H+}
     
    uses
     {$IFDEF UNIX}{$IFDEF UseCThreads}
     cthreads,
     {$ENDIF}{$ENDIF}
     Interfaces, // this includes the LCL widgetset
     Forms, main
     { you can add units after this };
     
    {$R *.res}
     
    begin
     RequireDerivedFormResource:=True;
     Application.Initialize;
     Application.CreateForm(TForm, MainForm);
     Application.Run;
    end.
    main.pas
    Code Pascal : 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
     
    { |========================================================================|
      |                                                                        |
      |                  Projet : découverte de BGRABITMAP                     |
      |                  Description : Programme exemple 05 RECTANGLES         |
      |                  Unité : main.pas                                      |
      |                  Site : www.developpez.com                             |
      |                  Copyright : © Gilles VASSEUR 2017                     |
      |                                                                        |
      |                  Date:    17/02/2017 14:40:10                          |
      |                  Version : 1.0.0                                       |
      |                                                                        |
      |========================================================================| }
     
    unit main;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
      StdCtrls, BGRABitmapTypes, BGRABitmap;
     
    type
     
      { TMainForm }
     
      TMainForm = class(TForm)
        btnRectdmSet: TButton;
        btnRectangleBGRAPixel: TButton;
        btnRectangleBorderFillColor: TButton;
        btnFillRect: TButton;
        btnRoundRect: TButton;
        btnRoundRectBorderFillColor: TButton;
        btnClear: TButton;
        gbSimple: TGroupBox;
        PaintBox: TPaintBox;
        procedure btnClearClick(Sender: TObject);
        procedure btnFillRectClick(Sender: TObject);
        procedure btnRectangleBGRAPixelClick(Sender: TObject);
        procedure btnRectangleBorderFillColorClick(Sender: TObject);
        procedure btnRectdmSetClick(Sender: TObject);
        procedure btnRoundRectBorderFillColorClick(Sender: TObject);
        procedure btnRoundRectClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { private declarations }
        bmpWork: TBGRABitmap;
      public
        { public declarations }
      end;
     
    var
      MainForm: TMainForm;
     
    implementation
     
    {$R *.lfm}
     
    { TMainForm }
     
    procedure TMainForm.btnRectdmSetClick(Sender: TObject);
    // Rectangle(x, y, x2, y2: integer; c: TBGRAPixel; mode: TDrawMode); override;
    begin
      bmpWork.Rectangle(20, 20, 100, 80, BGRAWhite, dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnRoundRectBorderFillColorClick(Sender: TObject);
    // RoundRect(X1, Y1, X2, Y2: integer; DX, DY: integer; BorderColor, FillColor:
    //   TBGRAPixel; ADrawMode: TDrawMode = dmDrawWithTransparency); override;
    begin
      bmpWork.RoundRect(300, 100, 380, 140, 15, 15, BGRA(255, 0, 0), BGRA(128, 128, 255),
        dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnRoundRectClick(Sender: TObject);
    // RoundRect(X1, Y1, X2, Y2: integer; DX, DY: integer; BorderColor: TBGRAPixel;
    //   ADrawMode: TDrawMode = dmDrawWithTransparency); override;
    var
      Lc: TBGRAPixel;
    begin
      Lc := BGRA(255, 128, 128);
      bmpWork.RoundRect(260, 60, 340, 120, 12, 12, Lc, dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnRectangleBGRAPixelClick(Sender: TObject);
    // Rectangle(x, y, x2, y2: integer; c: TBGRAPixel; mode: TDrawMode); override;
    var
      Lc: TBGRAPixel;
    begin
      Lc := BGRA(255, 128, 128);
      bmpWork.Rectangle(60, 60, 140, 120, Lc, dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnFillRectClick(Sender: TObject);
    // FillRect(x, y, x2, y2: integer; c: TBGRAPixel; mode: TDrawMode); override;
    //   overload;
    begin
      bmpWork.FillRect(120, 120, 200, 160, BGRA(0, 255, 0), dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnClearClick(Sender: TObject);
    begin
      bmpWork.FillRect(0, 0, PaintBox.Width, PaintBox.Height, BGRABlack);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.btnRectangleBorderFillColorClick(Sender: TObject);
    // Rectangle(x, y, x2, y2: integer; BorderColor, FillColor: TBGRAPixel;
    //   mode: TDrawMode); override;
    begin
      bmpWork.Rectangle(100, 100, 180, 140, BGRA(255, 0, 0), BGRA(128, 128, 255),
        dmSet);
      bmpWork.Draw(PaintBox.Canvas, 0, 0);
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      bmpWork := TBGRABitmap.Create(PaintBox.Width, PaintBox.Height, BGRABlack);
    end;
     
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      bmpWork.Free;
    end;
     
    end.

    main.lfm
    Code Pascal : 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
     
    object MainForm: TMainForm
      Left = 351
      Height = 525
      Top = 226
      Width = 905
      Caption = 'Test de rectangle - BGRABITMAP'
      ClientHeight = 525
      ClientWidth = 905
      Position = poScreenCenter
      LCLVersion = '1.8.2.0'
      object PaintBox: TPaintBox
        Left = 24
        Height = 440
        Top = 8
        Width = 440
      end
      object gbSimple: TGroupBox
        Left = 480
        Height = 232
        Top = 8
        Width = 176
        Caption = 'Simples'
        ClientHeight = 213
        ClientWidth = 174
        TabOrder = 0
        object btnRectdmSet: TButton
          Left = 16
          Height = 25
          Top = 16
          Width = 136
          Caption = 'Rectangle (dmSet)'
          TabOrder = 0
        end
        object btnRectangleBGRAPixel: TButton
          Left = 16
          Height = 25
          Top = 48
          Width = 136
          Caption = 'Rectangle (BGRAPixel)'
          TabOrder = 1
        end
        object btnRectangleBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 80
          Width = 136
          Caption = 'Rectangle (Border/Fill)'
          TabOrder = 2
        end
        object btnFillRect: TButton
          Left = 16
          Height = 25
          Top = 112
          Width = 136
          Caption = 'FillRect (color)'
          TabOrder = 3
        end
        object btnRoundRect: TButton
          Left = 16
          Height = 25
          Top = 144
          Width = 136
          Caption = 'RoundRect (BGRAPixel)'
          TabOrder = 4
        end
        object btnRoundRectBorderFillColor: TButton
          Left = 16
          Height = 25
          Top = 176
          Width = 136
          Caption = 'RoundRect (Border/Fill)'
          TabOrder = 5
        end
      end
      object btnClear: TButton
        Left = 24
        Height = 25
        Top = 480
        Width = 75
        Caption = 'Nettoyer'
        TabOrder = 1
      end
    end
    test.lps
    Code xml : 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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <CONFIG>
      <ProjectSession>
        <Version Value="10"/>
        <BuildModes Active="Default"/>
        <Units Count="3">
          <Unit0>
            <Filename Value="test.lpr"/>
            <IsPartOfProject Value="True"/>
            <EditorIndex Value="2"/>
            <CursorPos X="40" Y="18"/>
            <UsageCount Value="20"/>
            <Loaded Value="True"/>
          </Unit0>
          <Unit1>
            <Filename Value="main.pas"/>
            <IsPartOfProject Value="True"/>
            <ComponentName Value="MainForm"/>
            <ResourceBaseClass Value="Form"/>
            <CursorPos X="40" Y="22"/>
            <UsageCount Value="20"/>
            <Loaded Value="True"/>
            <LoadedDesigner Value="True"/>
          </Unit1>
          <Unit2>
            <Filename Value="../../../Applications/lazarus/packages/bgrabitmap-master/bgrabitmap/bgrabitmap.pas"/>
            <UnitName Value="BGRABitmap"/>
            <IsVisibleTab Value="True"/>
            <EditorIndex Value="1"/>
            <UsageCount Value="10"/>
            <Loaded Value="True"/>
          </Unit2>
        </Units>
        <JumpHistory Count="7" HistoryIndex="6">
          <Position1>
            <Filename Value="main.pas"/>
            <Caret Line="25" Column="7"/>
          </Position1>
          <Position2>
            <Filename Value="main.pas"/>
            <Caret Line="13" Column="62"/>
          </Position2>
          <Position3>
            <Filename Value="main.pas"/>
            <Caret Line="22" Column="13" TopLine="4"/>
          </Position3>
          <Position4>
            <Filename Value="main.pas"/>
            <Caret Line="25" Column="41" TopLine="16"/>
          </Position4>
          <Position5>
            <Filename Value="main.pas"/>
            <Caret Line="34" Column="100" TopLine="73"/>
          </Position5>
          <Position6>
            <Filename Value="main.pas"/>
            <Caret Line="35" Column="100" TopLine="23"/>
          </Position6>
          <Position7>
            <Filename Value="main.pas"/>
            <Caret Line="22" Column="40"/>
          </Position7>
        </JumpHistory>
      </ProjectSession>
    </CONFIG>

    Amicalement,
    Hervé.
  19. Avatar de gvasseur58
    • |
    • permalink
    Bonjour Hervé,

    Merci pour des encouragements qui sont toujours les bienvenus !

    Pour ce qui est de ton problème, peux-tu me faire parvenir par MP ou dans le fil de cette discussion le code exact que tu as utilisé ? Il m'est difficile de répondre sans support concret.

    A très bientôt,

    Gilles
  20. Avatar de naute
    • |
    • permalink
    Bonjour Gilles .

    D'abord tous mes remerciements pour l'aide que tu apportes à chacun, que ce soit au niveau technique ou au niveau traduction. Je sais que c'est banal et que cela va sans dire, mais comme l'a très bien dit quelqu'un sur ce forum, cela va bien aussi en le disant .

    Désireux d'essayer la librairie BGRABitmap pour palier certaines carences de Lazarus au niveau graphique, du moins sous GTK2, je me suis précipité sur ton "mini tutoriel", comme tu le nommes.

    J'en ai fait une copie conforme, du moins je le pense, mais quelque chose ne fonctionne pas. La compilation se passe parfaitement, sans aucun warning, mais seule une fenêtre vide s'affiche à l'écran, et ce qui est étonnant, elle ne répercute même pas ses paramètres de taille et de position.

    Est-ce que le problème est évident et sa solution triviale ou préfères-tu que j'ouvre un fil sur ce sujet?

    Amicalement,
    Hervé.
Page 1 sur 3 123 DernièreDernière