Erreur dans un mémo

Résolu
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006 - 21 mai 2006 à 17:44
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006 - 25 mai 2006 à 01:36
Bonjour,
J'ai créé un formulaire avec 4 checkbox, pour une commande de cadeaux avec prix a côté.
J'ai un bouton total qui affiche le prix total à côté et un mémo qui reprend le détail des produit sélectionné.
Mon problème se situe au niveau de mon mémo, au premier clic sur le bouton total il m'affiche correctement les produits sélectionné,
mais si j'en déselectionne un ce qui à été affiché au premier clic reste affiché.
j'ai éssayé mémo.lines.clear.
pour faire en sorte qu'un texte s'affiche dans le mémo j'ai utilisé un array
comment pourrais-je faire en sorte qu'a chaque foi que je clic sur le bouton mon mémo se vide et affiche la sélection actuel

voici mon code source
Type
  Taantalklikken = Array [0..3] of Integer; // de beste artikel
  TProducten = Array [0..3] of String[20];

var
 Form2: TForm2;
 I:Integer;
 Aantalklikken :Taantalklikken ;
 Producten : TProducten;

  implementation

uses Unit1, Unit3, UnitEind;

{$R *.dfm}

//_______________FormCreate__________

// Array : na een keer klikken komt er een message de voorschijn

procedure TForm2.FormCreate(Sender: TObject);
 var
  I : integer;
begin

 for I:=0 to 3 do
  AantalKlikken[i]:=0;

  Producten[0] := 'LoveHearts';
  Producten[1] := 'Kader';
  Producten[2] := 'Tas';
  Producten[3] := 'Bloemen';
   end;

//         Meerdere Functies bij deze button

procedure TForm2.ButtonTotaalClick(Sender: TObject);
var
 Totaal : Real;   // SOM MAKEN
 I:Integer; // ARRAY

//           ___________Begin Som Maken____________

Begin
 Totaal :=0;

 if checkbox1.Checked = true
  then Totaal := Totaal + 12.90;

 if checkbox2.Checked = true
  then Totaal := Totaal + 14.90 ;

 if checkbox3.Checked = true
  then Totaal := Totaal + 9.90 ;

 if checkbox4.Checked = true
  then Totaal := Totaal + 39.90;

 LabelTotaal.caption :=FloatToStr(Totaal);

//            end SOM maken

 ButtonBevestigen.Enabled:=True ;

//            ________Begin Array________

begin
 MemoTop.Lines.Clear;

 If Checkbox1.checked=True
  Then AantalKlikken[0]:= AantalKlikken[0] +1;

 If Checkbox2.checked=True
  Then AantalKlikken[1]:= AantalKlikken[1] +1;

 If Checkbox3.checked=True
  Then AantalKlikken[2]:= AantalKlikken[2] +1;

 If Checkbox4.checked=True
  Then AantalKlikken[3]:= AantalKlikken[3] +1;

                   // begin for to do
 For i := 0 to 3 do
  If AantalKlikken[i] >= 1
   then// als u bloemen niet aangevink zijn (verchillen van aanvinken)
   //dus bij aanklikken memo verschijnen
   memoTop.lines.add(Producten[i] + ' is uw gekozen product,');
   end;
end;


Gwenaëlle

25 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
21 mai 2006 à 20:13
Dag Gwenaëlle,

Je continue en français si tu veux bien, pcq mon nederlands...

Tu as bien pensé à vider ton memo, mais tu as oublié de remettre ton tableau à 0.
Donc :

   MemoTop.Lines.Clear;
   for i:= 0 to 3 do
      AantalKlikken[i]:= 0;

Thierry
3
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
21 mai 2006 à 17:44
merci d'avance

Gwenaëlle
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 mai 2006 à 18:39
et aller, c'est la fete de l'identifiant en allemand ...

pas envie de traduire ... ecrivez vos identifiants en anglais!
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 mai 2006 à 19:16
Ah non, pardon, à mon avis c'est du néerlandais...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
21 mai 2006 à 19:32
"na een keer klikken komt er een message de voorschijn" mais qué que c'est que ça??? C'est absolument incompréhensible...
"pas envie de traduire ... ecrivez vos identifiants en anglais!" ou en français...

<hr size="2" width="100%" />La paresse est la mère du génie...
0
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
21 mai 2006 à 21:13
merci
J'ai éssayé mais ou ça ne va pas ou j'ai des érreurs
vous n'auriez pas d'autres idées ?

et pour répondre aux autres c'est du Néerlandais!
Comme je suis à l'unniversité en néerlandais et que c'est mon travail de fin d'étude je suis obligée de le commanter en Néerlandais!
voila

merci

Gwenaëlle
0
Utilisateur anonyme
21 mai 2006 à 21:28
Salut Gwen,


Si je peux me permettre je te conseille de reposter ta source en
traduisant tout en Francais sinon tu risques de ne pas avoir de
réponses. Ce n'est pas pour t'embeter mais on,doit comprendre à quoi
correspondent tes identifiants (sinon on va lutter).


Merci à toi


@+
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
21 mai 2006 à 23:52
Salut Gwennie,

Dans le code envoyé, ta section __begin array__ fait partie de la procedure ButtonTotaalClick (il y déjà un begin et un end de trop: laisse le 1° begin et le dernier end).
Au début de la procedure tu remets Totaal = 0.
Donc chaque client  ne peut acheter chaque produit que 1 x
Puis tu augmente le stock vendu : AantalKlikken[0]:= AantalKlikken[0] +1;
Tu ajoutes les lignes dans ton memo si aantalklikken[...] >= 1 :  il est donc normal qu'après x passages par le bouton, tu gardes tous les produits dans le mémo !!!
Donc que veux-tu faire : afficher dans le memo les quantités par produit ? 
       ou  afficher le choix d'un seul client ?
 
A +
Thierry
0
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
22 mai 2006 à 00:44
Le voici en français





Type

  Tnombredeclic= Array [0..3] of Integer; 

  TProduits = Array [0..3] of String[20];//de zéro a trois car j’ai quatre
checkbox


var

 Form2: TForm2;

 I:Integer;

 nombredeclic :Tnombredeclic ;

 Produits : TProduits;


  implementation


uses Unit1, Unit3, Unitfin;


{$R *.dfm}


//_______________FormCreate__________


// Array : Apres avoir cliquer une fois , y’a un texte qui s’affiche dans le mémo


procedure TForm2.FormCreate(Sender: TObject);

 var

  I : integer;

begin


 for I:=0 to 3 do

  Nombredeclic[i]:=0;


  Produits[0] := 'LoveHearts';

  Produits[1] := 'Cadre';

 Produits [2] := 'Tasse';

 Produits [3] := 'fleurs';

   end;


//         Plusieurs fonctions sur ce
bouton


procedure TForm2.ButtonTotalClick(Sender: TObject);

var

 Total : Real;   // Pour faire la somme 

 I:Integer; // Pour le Array


//           ___________Debut
pour la somme____________


Begin

 Total :=0;


 if checkbox1.Checked = true

  then Total := Total + 12.90;


 if checkbox2.Checked = true

  then Total := Total + 14.90 ;


 if checkbox3.Checked = true

  then Total := Total + 9.90 ;


 if checkbox4.Checked = true

  then Total := Total + 39.90;


 LabelTotal.caption :=FloatToStr(Total);


//            end  de la somme


 ButtonConfirmer.Enabled:=True ;


//            ________Debut
Array________


begin





 MemoTop.Lines.Clear;// ceci fait en sorte que quand on décoche et coche  le texte ne s’affiche pas plusieurs fois dans
le mémo !! 


 If Checkbox1.checked=True

  Then Nombredeclic[0]:= Nombredeclic [0] +1;


 If Checkbox2.checked=True

  Then Nombredeclic [1]:= Nombredeclic [1] +1;


 If Checkbox3.checked=True

  Then Nombredeclic [2]:= Nombredeclic [2] +1;


 If Checkbox4.checked=True

  Then Nombredeclic [3]:= Nombredeclic [3] +1;


                  
// debut  for to do

 For i := 0 to 3 do

  If Nombredeclic [i] >= 1

   then// après avoir cliquer une fois sur le boutton total  le même enregistre les checkbox cocher et
note les dans le mémo 

   memoTop.lines.add(Produits[i] + ' est votre choix');

   end;

end;
0
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
22 mai 2006 à 00:46
Réponse pour [auteurdetail.aspx?ID=659199 ThWilliam]

je ne veux pas de stock il n'y a qu'un choix je veux juste qu'il affiche les checkbox coché au moment du clic sur le total
voila

Gwenaëlle
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mai 2006 à 05:56
Type
  // on definit un enregistrement pour les produits, cela evite d'avoir 36 variables a gerrer.
  TProductRec = record
     Name     : string[32]; // nom
     Price    : currency;   // prix
     Selected : boolean;    // selection
     Tag      : integer;    // tag pour le developpeur
  end;
  // ensuite le type tableau pour les produits ...
  TProducts = array[0..3] of TProductRec;

var
 Products : TProducts;

// permet de remplir d'un coup un enregistrement de produit
function SetProduct(const AName : string; const APrice : currency; const ASelected : boolean;
                    const ATag  : integer) : TProductRec;
begin
  result.Name     := AName;
  result.Price    := APrice;
  result.Selected := ASelected;
  result.Tag      := ATag;
end;

// remet a Zero le Tag de tout les elements d'un TProducts
procedure ResetProductTag(var AProducts : TProducts);
var N : integer;
begin
  if Length(AProducts) = 0 then exit;
  for N := 0 to High(AProducts) do
      AProducts[N].Tag := 0;
end;

// remet a False la selection de tout les elements d'un TProducts
procedure ResetProductSel(var AProducts : TProducts);
var N : integer;
begin
  if Length(AProducts) = 0 then exit;
  for N := 0 to High(AProducts) do
      AProducts[N].Selected := False;
end;

// init du tableau de produits
procedure TForm2.FormCreate(Sender: TObject);
begin
                         {[ nom | prix | selection | tag ]}
 Products[0] := SetProduct('LoveHearts', 12.90, false, 0);
 Products[1] := SetProduct('Cadre',      14.90, false, 0);
 Products[2] := SetProduct('Tasse',       9.90, false, 0);
 Products[3] := SetProduct('fleurs',     39.90, false, 0);
end;

// methode de calcul du total et affichage des infos ...
procedure TForm2.ButtonTotalClick(Sender: TObject);
var
  I     : integer;
  Total : Currency; // le type currency est fait exprés pour les calculs monaitaire
Begin
 // on vide memotop ... tu aurais du utiliser une ListBox qui est plus adaptée a ce genre
 // de chose ... un memo ne sert pas a ça!
 MemoTop.Lines.Clear;

 // on init total a zero
 Total := 0;

 // on assigne la valeur des checkbox a la selection des produits
 Products[0].Selected := CheckBox1.Checked;
 Products[1].Selected := CheckBox2.Checked;
 Products[2].Selected := CheckBox3.Checked;
 Products[3].Selected := CheckBox4.Checked;

 // on manipule tout cela, High permet d'aller jusqu'au dernier indice du tableau ...
 // cela permet d'en modifier la taille sans aller corriger le code.
 for I := 0 to high(Products) do begin
     with Product[I] do                   
             

// pour le produit I

          if Selected then begin          
             

// si il est selectionné

             Total := Total + Price;                     // on ajoute son prix au total
             memoTop.lines.add(Name+' est votre choix'); // on l'affiche dans la liste
             { si on doit avoir plus de 50 produits, l'utilisation d'un buffer TStringlist
               serat necessaire pour accelerer les traitements. }
          end;
 end;

 // on utilise format pour afficher le prix (voir le tuto sur format)
 LabelTotal.caption := Format('%.2m',[Total]); // %.2m pour avoir : xxxx.mm ?
                                               // %.2f pour avoir : xxxx.ff
 ButtonConfirmer.Enabled := True ;
end;

voila, ne te reste plus qu'a corriger ça et la ...
0
Utilisateur anonyme
22 mai 2006 à 08:07
Salut Gwen,

Je saute sur l'occasion : fOxi qui a eu la gentillesse de corriger totalement ton code t'a fait différentes remarques afin d'améliorer la souplesse de ce dernier. Pour ceux qui ne s'en souviennent pas tu réalises un projet de fin d'études dont le but est de réaliser un programme pour la gestion d'un magazin. Vu les remarques de fOxi, il me semble évident que pas mal de choses ne vont pas en termes de conception. Une table de données (par exemple paradox) semble s'imposer dans ton cas de figure. Mais bon, libre à toi ^^.

Déjà des checkbox pour les produits : si tu as rien que 100 produits dans ton magazin, cela fait 100 checkbox : aie aie aie!!! Une listbox serait déjà plus adatée (possibilité de rajouter de nouveaux articles par l'utilisateur, gain de places, souplesse d'utilisation ect ect).

En plus utiliser des tableaux pour de telles choses en terme de conception, c'est plutot caca pour dire les choses softement.

Je pense que tu es partie sur une mauvaise piste et que tu risques malheureusement d'en payer le prix fort le jours de ta soutenance (Crois en mon expérience de formateur).

Je te conseille d'arreter ton projet et de mieux le penser :

-Réalise un synoptique de ton projet pour savoir ou tu vas
-Réaliser ensuite l'interface en respectant différents points : souplesse, esthétique, et aération.
-Etudie la meilleure méthodologie (Table de données, tableaux ect ect)
-Ensuite code

Fais déjà les deux premières étapes et on t'aidera tant bien que mal pour la suite.

Je demandes aux autres membres de donner leurs avis sur la méthodologie que tu utilises vu l'objectif à atteindre (Mais à ma connaissance tout les magazins utilisent des tables de données lol).

Bon coding et courage

@+

PS : Les tables de données ne sont pas spécialement synonymes de difficultés en terme de code.
0
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
22 mai 2006 à 17:55
Bonjour,
je voulais tous vous remercier
Merci a thierry pour la reponse du memo. Desoler j'avais pas penser, en plus c'est tout con!!
Desoler que c'étais en neerlandais.

Mon travail de fin d'année est enfin fini grace à votre aide.
à Bientot

Bisous

Gwenaëlle
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mai 2006 à 19:05
en effet gwen, comme le dit francky ... ton code ou meme le miens s'adapte bien a moins de 5 articles...
même si l'optique est mauvaise, il nous demontre les limites d'un tel systeme mais aussi les possibilitée.

le probleme des base de données : il faut un pilote ou une DLL (SQLite)

on pourrait egalement créer notre propre type de fichier de base (les structures record s'y prete bien) ...

avantage du delphi, les possibilitée d'application sont immense. on peu ecrire un programme de diverse façon, le tout etant d'en choisir l'une des meilleures.

ici il faut voir les partie importante du programme :

une liste de produit + gestion de cette liste
un panier client + gestion de ce panier

comme je le dis souvent, les tableaux sont bien mais il ne peuvent pas permettre par exemple d'effacer un element avant la fin du tableau ce qui est trés contraignant.

le mieux, des listes, add, delete ect... tout y existe deja pour gerer ce genre de chose et la nous pourrons gerrer X produits rapidement et efficacement.

il ne faut pas perdre de vus qu'un programme doit etre souple et qu'il pourras etre utiliser au dela des cas qu'on lui donne.
dans un concept d'evolution bien entendus.

de plus cela donneras une certaine valeur ajoutée a tes travaux, les examinateurs ou correcteurs y seront sensible.
vois cela comme un excercice de style et donc toutes tes connaissances (et les notres en passant) doivent figurer dans ton travail pour montrer ce dont tu es capable.
faire le minimum ... c'est bien ... 10/20
faire de son mieux ... c'est honorable ... 12/20
faire son maximum ... c'est benefique ... 15/20
depasser ses limites ... c'est ce qu'il faut ... 20/20

venons en a TListBox!
TListbox n'est pas qu'une simple liste de chaine ... elle permet egalement de dessiner a l'interieur d'ajouter des images, modifier la couleur de fond, du texte, la police, la presentation ect... ect...

bien sur, cela demande du code suplementaire ... mais au final ... quel superbe resultat ...

si ton sujet est : faite une application qui gere l'achat de 4 produits vendus en magasins avec un panier client.

tu ne doit pas t'arreter a une simple gestion bete et mechante de 4 produits.
ton programme devrat egalement avoir la possibilitée de gerer plus que ce nombre.

aller je suis sympa, je t'ai fait un gros exemple que je trouve plutot reussis :

Source :
Télécharger (8ko - Zip - Pure VCL - faire un scan anti-virus avant de la decompresser!)

(nombreux commentaires explicatif)

Fonctionnalitées :
Ajout/Suppression de produit a un panier et calcul du montant total. (Form1 unité Main)
Ajout, Edition et suppression de produits dans la liste produits. (Form1 unité Main et Form2 unité GProdList)
Sauvegarde et chargement de la liste de produits. (Form1 unité Main)

Screenshoot :

si tu galere, hesite pas a faire signe.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mai 2006 à 19:14
je mets le code principal au cas ou le zip ne serait pas dispo ( hebergement free )

fichier Main.pas :

<hr size= "2" width="100%" />
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    ListBox2: TListBox;
    Label2: TLabel;
    Label3: TLabel;
    PopupMenu1: TPopupMenu;
    DelProduct1: TMenuItem;
    N1: TMenuItem;
    EditProduct1: TMenuItem;
    N2: TMenuItem;
    AddProduct1: TMenuItem;
    StatusBar1: TStatusBar;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    N3: TMenuItem;
    Chargerunelistedeproduits1: TMenuItem;
    Sauverlalistedeproduits1: TMenuItem;
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ListBox1DblClick(Sender: TObject);
    procedure ListBox2DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ListBox2DblClick(Sender: TObject);
    procedure DelProduct1Click(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure AddProduct1Click(Sender: TObject);
    procedure EditProduct1Click(Sender: TObject);
    procedure Chargerunelistedeproduits1Click(Sender: TObject);
    procedure Sauverlalistedeproduits1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

function GetStrPart(const Delimiter, S: String; const Offset: cardinal = 1): String;
procedure CalculTotal;

implementation

{$R *.dfm}

{
Les elements de ListBox1 sont sous la forme : Nom/Prix/Description/Reference
Les elements de ListBox2 sont sous la forme : Nom/Prix/Quantitée

-------

on peu sauvegarder ou charger une liste de produits dans listbox1
grace a ListBox1.Items.SaveToFile ou Listbox1.Items.LoadFromFile
le fichier liste contiendras une suite d'elements sous cette forme :
   Nom/Prix/Description/Reference
   Nom/Prix/Description/Reference
   Nom/Prix/Description/Reference

on pourrat egalement faire de meme avec le panier.

-------

il serat simple d'ecrire un programme de gestion de la liste produit pour en
ajouter ou en supprimer ou en modifier.
Nous utiliserons GetStrPart pour recuperer les infos de la liste, il suffirat ensuite
d'utiliser les methode Add ou Delete pour ajouter ou supprimer un produit ou encore
"Items[ItemIndex] := S" pour modifier le produit selectionné.

-------

Pour GetStrPart dans les produits, offset a pour valeur :
1 : nom
2 : prix
3 : description
4 : reference

Pour GetStrPart dans le panier, offset a pour valeur :
1 : nom
2 : prix
3 : quantitée

-------

la propriété Style de Listbox1 et Listbox2 doivent etre a lbOwnerDrawFixed.
la propriété IntegralHeight des deux liste doivent etre a True.
la propriété ItemHeight de listbox1 est a 34
la propriété ItemHeight de listbox2 est a 16

-------

les valeurs DecimalSeparator et le symbole monaitaire generé par format sont dependant
du systeme sur lequel l'application est lancée. Ces symboles sont gerrer par les
options regionnale du systeme, Delphi recupere automatiquement ces valeurs.

}

uses StrUtils, { utile pour GetStrPart }
     GProdList;

{ ------------------------------------------------------------------------------------------------ }

{ permet de recuperer du texte dans un texte delimité }
function GetStrPart(const Delimiter, S: String; const Offset: cardinal = 1): String;
var I,P1,P2 : integer;
begin
  Result := '';
  if (posex(Delimiter,S[1]) = 1) and (Offset <= 1) then exit;
  P1 := 1;
  for I := 1 to Offset-1 do begin
      P1 := posex(Delimiter, S, P1);
      if P1 = 0 then exit
      else P1 := P1 + length(Delimiter);
  end;
  P2 := posex(Delimiter, S, P1);
  if P2 = 0 then P2 := length(S) + 1;
  Result := copy(S, P1, P2 - P1);
end;

{ ------------------------------------------------------------------------------------------------ }

{ Calcul du total panier }
procedure CalculTotal;
var Total : currency;
    N     : integer;
begin
  with Form1 do begin
    // on init a 0
    Total := 0;
    // on parcours le panier (listbox2)
    for N := 0 to listbox2.Count-1 do begin
        // Total = Total + (Prix*quantitée)
        Total := Total +
               (
                 StrToFloatDef( GetStrPart('/',Listbox2.Items[N],2), 0.0)
                 *
                 StrToIntDef( GetStrPart('/',Listbox2.Items[N],3), 1)
               );
    end;
    // affichage dans label2 grace a format %.2m (format monaitaire)
    Label2.Caption := format('Total : %.2m',[Total]);
  end;
end;

{ ------------------------------------------------------------------------------------------------ }

{ Dessin de la liste 1, la propriété Style doit etre sur lbOwnerDrawFixed }
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var S,Ref,Name,Price,Desc : string;
begin
  // on recupere les infos
  S := Listbox1.Items[index];
  // nom
  Name  := GetStrPart('/',S,1);
  // prix
  Price := format('%.2m',[StrToFloatDef(GetStrPart('/',S,2), 0.0)]);
  // description
  Desc  := GetStrPart('/',S,3);
  // reference
  Ref   := GetStrPart('/',S,4);
  // on vide S
  S := '';

  // voila, on vas dessiner
  with listbox1.Canvas do begin

     brush.Style := bssolid;
     pen.Color   := $FFFFFF;
     // si l'item est selectionné la couleur est differente
     if odSelected in State then
        pen.Color := pen.Color - $404040;
     brush.Color := pen.Color;
     // on efface la zone de dessin de l'item
     fillrect(rect);

     // si l'item n'est pas selectionné on dessine une ligne de separation
     if not (odSelected in State) then begin
        pen.Color := $BFBFBF;
        moveto(rect.Left,rect.Bottom-1);
        Lineto(rect.Right,rect.Bottom-1);
     end;

     // si l'item est selectionné on ecrit en rouge pale sinon en noir
     if odSelected in state then
        font.Color := $7070FF
     else
        font.Color := $000000;

     // on utilise la police Arial
     Font.Name  := 'Arial';

     // le nom et le prix sont en gras et ecrit en gros
     Font.Size  := 12;
     Font.Style := [fsBold];

     // nom
     TextOut(Rect.Left+2, Rect.Top, Name);
     // prix
     TextOut(Rect.Right-TextWidth(Price)-10, Rect.Top, Price);

     // les autres infos sont ecritent normalement
     Font.Size  := 8;
     Font.Style :=[];

     // reference
     TextOut(Rect.Left+2, Rect.Bottom-TextHeight(Ref)-2, '('+Ref+')');
     // description
     TextOut(Rect.Left+TextWidth('('+Ref+')')+10, Rect.Bottom-TextHeight(Desc)-2, Desc);
  end;
end;

{ ------------------------------------------------------------------------------------------------ }

{ ajout d'un produit au panier }
procedure TForm1.ListBox1DblClick(Sender: TObject);
var N, IPrice, index : integer;
    S, Name, Price : string;
begin
  // on recupere les infos du produit
  S := Listbox1.Items[Listbox1.ItemIndex];
  Name := GetStrPart('/',S,1);
  Price:= GetStrPart('/',S,2);
  S := Name+'/'+Price+'/';

  // si le panier est vide on ajoute tout simplement
  if listbox2.Count = 0 then begin
     ListBox2.Items.Add( S+'1' );
  end else begin
     // sinon on vas chercher si le produit est deja present
     index := -1;
     for N := 0 to Listbox2.Count-1 do begin
         if pos(S,Listbox2.Items[N]) <> 0 then begin
            // si on trouve le produit dans le panier on recupere l'index
            index := N;
            // et on sort de la boucle
            break;
         end;
     end;
     if index <> -1 then begin
        // le produit est deja present, on incremente la quantitée
        IPrice := StrToIntDef(GetStrPart('/',Listbox2.Items[index],3), 1) + 1;
        Listbox2.Items[index] := S + IntToStr(IPrice);
     end else
        // sinon on ajoute le produit avec quantitée a 1
        ListBox2.Items.Add( S+'1' );
  end;

  // on calcul le total
  CalculTotal;
end;

{ ------------------------------------------------------------------------------------------------ }

{ Dessin de la liste 2, la propriété Style doit etre sur lbOwnerDrawFixed }
procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var S,Name,Price,Quant : string;
begin
  // on recupere les infos
  S := Listbox2.Items[index];
  // nom
  Name  := GetStrPart('/',S,1);
  // prix
  Price := format('%.2m',[StrToFloatDef(GetStrPart('/',S,2), 0.0)]);
  // quantitée
  Quant := GetStrPart('/',S,3)+' x ';
  // on vide S
  S := '';

  // on dessine comme dans listbox1
  with Listbox2.Canvas do begin
     brush.Style := bssolid;
     pen.Color   := $FFFFFF;
     if odSelected in State then
        pen.Color := pen.Color - $404040;
     brush.Color := pen.Color;
     fillrect(rect);

     if not (odSelected in State) then begin
        pen.Color := $BFBFBF;
        moveto(rect.Left,rect.Bottom-1);
        Lineto(rect.Right,rect.Bottom-1);
     end;

     if odSelected in state then
        font.Color := $7070FF
     else
        font.Color := $000000;

     Font.Name  := 'Arial';

     Font.Size  := 9;
     Font.Style := [fsBold];

     // nom
     TextOut(Rect.Left+2, Rect.Top, Name);
     // quantitée x prix
     TextOut(Rect.Right-TextWidth(Quant+Price)-10, Rect.Top, Quant+Price);
  end;
end;

{ ------------------------------------------------------------------------------------------------ }

{ suppression d'un produit du panier }
procedure TForm1.ListBox2DblClick(Sender: TObject);
var S,Name,Price : string;
    Quant : integer;
begin
  // on recupere les infos
  s := Listbox2.Items[Listbox2.itemindex];
  // nom
  Name  := GetStrPart('/',S,1);
  // prix
  Price := GetStrPart('/',S,2);
  // quantitée
  Quant := StrToIntDef( GetStrPart('/',S,3), 1);
  // on vide S
  S := '';

  // si il y a plus d'un produit
  if Quant > 1 then begin
     // on decremente la quantitée
     Quant := Quant - 1;
     // on modifie les données de l'item
     Listbox2.Items[Listbox2.ItemIndex] := Name+'/'+Price+'/'+IntToStr(Quant);
  end else
     // sinon on efface l'item
     Listbox2.DeleteSelected;

  // on calcul le total
  CalculTotal;
end;

{ ------------------------------------------------------------------------------------------------ }

{ popupmenu de listbox 1 : OnPopup }
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  // si itemindex est different de -1 on active ou non les menus Editer et Supprimer
  EditProduct1.Enabled := (listbox1.ItemIndex <> -1);
  DelProduct1.Enabled  := (listbox1.ItemIndex <> -1);
end;

{ popupmenu de listbox 1 : supprimer le produit }
procedure TForm1.DelProduct1Click(Sender: TObject);
begin
  // on affiche une boite de confirmation
  if MessageDlg('Voulez-vous effacer ce produit ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
     Listbox1.DeleteSelected;
end;

{ popupmenu de listbox 1 : ajouter un produit }
procedure TForm1.AddProduct1Click(Sender: TObject);
begin
  GProdList.ShowGLP(-1,pmAdd);
end;

{ popupmenu de listbox 1 : editer un produit }
procedure TForm1.EditProduct1Click(Sender: TObject);
begin
  GProdList.ShowGLP(Listbox1.ItemIndex,pmEdit);
end;

{ popupmenu de listbox 1 : charger une liste }
procedure TForm1.Chargerunelistedeproduits1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
     Listbox1.Items.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.Sauverlalistedeproduits1Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
     Listbox1.Items.SaveToFile(SaveDialog1.FileName);
end;

end.

<hr size="2" width="100%" />










fichier GProdList.pas :




<hr size ="2" width="100%" />
unit GProdList;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Button1: TButton;
    GroupBox1: TGroupBox;
    procedure FormShow(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

  TGestMode = (pmAdd,pmEdit);

var
  Form2     : TForm2;

{ permet d'afficher la boite d'ajout/edition }
procedure ShowGLP(const AIndex : integer; const AMode : TGestMode);

implementation

{$R *.dfm}

uses Main;

var
  ProdIndex : integer   = -1;    { index de l'item selectionné (mode edition) }
  Mode      : TGestMode = pmAdd; { mode de la fenetre Ajout ou Edition }

{ ------------------------------------------------------------------------------------------------ }

procedure ShowGLP(const AIndex : integer; const AMode : TGestMode);
begin
  ProdIndex := AIndex;
  Mode      := AMode;
  // on affiche la fenetre
  Form2.Show;
end;

{ ------------------------------------------------------------------------------------------------ }

procedure TForm2.FormShow(Sender: TObject);
var s : string;
begin
  // selon le mode
  Case Mode of
    pmAdd : begin
      // on modifie le titre et on mets par defaut les TEdits
      GroupBox1.Caption := 'Ajouter un produit';
      edit1.Text := '';
      edit2.Text := '0'+DecimalSeparator+'00';
      edit3.Text := '';
      edit4.Text := '000000';
    end;
    pmEdit: begin
       // on modifie le titre et on recupere les infos
       GroupBox1.Caption := 'Editer le produit';
       if ProdIndex <> -1 then begin
          S := Main.Form1.ListBox1.Items[ProdIndex];
          edit1.Text := GetStrPart('/',S,1);
          edit2.Text := GetStrPart('/',S,2);
          edit3.Text := GetStrPart('/',S,3);
          edit4.Text := GetStrPart('/',S,4);
       end;
    end;
  end;
end;

{ ------------------------------------------------------------------------------------------------ }

{ edit prix }
procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  // n'autorise que les chiffres et separateur de decimale
  if not (key in #08,#48..#57,DecimalSeparator) then key := #0;
end;

{ edit reference }
procedure TForm2.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
  // n'autorise que les chiffres
  if not (key in #08,#48..#57) then key := #0;
end;

{ ------------------------------------------------------------------------------------------------ }

{ boutton ok }
procedure TForm2.Button1Click(Sender: TObject);
begin
  // selon le mode
  case Mode of
    pmAdd : begin
       // on demande confirmation de l'action
       if MessageDlg('Voulez-vous ajouter ce produit ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
          // on ajoute le produit a la liste
          Main.Form1.ListBox1.Items.Add(Edit1.Text+'/'+Edit2.Text+'/'+Edit3.Text+'/'+Edit4.Text);
    end;
    pmEdit: begin
       // on demande confirmation de l'action
       if MessageDlg('Voulez-vous modifier ce produit ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
          // on modifie le produit
          Main.Form1.ListBox1.Items[ProdIndex] := Edit1.Text+'/'+Edit2.Text+'/'+Edit3.Text+'/'+Edit4.Text;
    end;
  end;
  // on cache la fenetre de gestion
  Form2.Hide;
end;

end.

<hr size="2" width="100%" />
0
Utilisateur anonyme
22 mai 2006 à 20:16
Si tu permets fOxi :

Gwen si tu fais les choses comme tu les as faits, tu va droit à la catastrophe par rapport à ton projet.
Ayant corrigé quelques projets dans ma vie, je peux t'assurer qu'un
jury sera beaucoup intransigeant à l'égard d'un projet mal pensé qu'un
projet contenant des beugs.


Tu aurais pu utiliser une table paradox qui est simple et souple
d'utilisation (je t'avais déjà alarmé et passé l'url d'un tuto). Cela
aurait été amplement suffisant pour ton projet (bien que fOxi est
totalement raison mais c'est un travail beaucoup plus complexe).


 Si j'étais toi je posterais immédiatement ton projet sur CS : ainsi on pourra le tester et mieux t'aider.
0
Gwennie28 Messages postés 23 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 24 mai 2006
23 mai 2006 à 08:49
bonjour

Je vous assure je devais pas faire quelque choses de compliquer car nous avions eu seulement la base.

Comme le DLL je ne connais pas et encore d'autres truc...

J'ai fais de mon mieux , j'ai durment bossé pour ce que j'aie
maintenant et n'aie plus le temps pour  le refaire complement.


Voici le le site ou mon projet se trouve car j'ai du aussi faire HTML



http/student.vub.ac.be/~gpetrov/

Cliquer sur delphi et puis download....


Merci quand même

Gwenaëlle
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
23 mai 2006 à 17:20
heu ... la redirection sur le site du journal le monde c'est normal ?

et je dout que de villepin est un quelqu'onque rapport avec Delphi .
0
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
23 mai 2006 à 19:05
Moi ça m'a permis de savoir que l'Indonésie subit une inquiétante poussée de grippe aviaire... lol

Y doit y avoir un petit bug dans l'adresse non Francky???

<hr size="2" width="100%" />La paresse est la mère du génie...
0
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
23 mai 2006 à 19:06
Voila la vraie adresse : http://student.vub.ac.be/~gpetrov/

<hr size="2" width="100%" />La paresse est la mère du génie...
0
Rejoignez-nous