IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Recherche Composant Planning Freeware pour D7PE


Sujet :

Composants VCL Delphi

  1. #21
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour ce que tu me demande: un record, bonne idée, mais il y a toujours le problème de la limite des string à 255 caractères... Mais si c'est juste un commentaire, pas de problème...
    Un champs fourre tout bonne idée.

    Mais pourquoi ne pas faire une classe, genre une List, comme cela on pourrai sauvegarder le planning semaine/semaine, avec par jour tout les TCréneaux...
    Je poursuis mes tests...
    Non, ne t'inquietes pas, le record correspond juste à un élément de la liste (qui elle même est bien un TList encapsulé )
    Pour le string, il n'y a pas de limite, et on va même faire beaucoup mieux, on va utiliser des TStringList.
    Bidouilleuse Delphi

  2. #22
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Bon j'étais en train de modifier...Mais le temps de tout comprendre... Bref, en effet, pas besoin de Hour, sauf peut etre pour que l'utilisateur le voie quand meme...Bon là c'est dodo maintenant, on verra demain...

  3. #23
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    En attendant demain soir, voici la fameuse liste (TPlanning) qui contient des créneaux (TFiche) :
    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
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    unit UnitPlanning;
     
    interface
    uses
      Sysutils, Classes;
    {$H+}
    type
      TFiche=class
      private
        FOnEditingChange: TNotifyEvent;
        FTag: integer;
        FTitre: string;
        FDebut: TDateTime;
        FFin: TDateTime;
        FDescription: TStringList;
        procedure SetOnEditingChange(const Value: TNotifyEvent);
        procedure SetDebut(const Value: TDateTime);
        procedure SetDescription(const Value: TStringList);
        procedure SetFin(const Value: TDateTime);
        procedure SetTag(const Value: integer);
        procedure SetTitre(const Value: string);
      protected
        property OnEditingChange:TNotifyEvent read FOnEditingChange write SetOnEditingChange;
        procedure EditingChange(Sender: TObject);
      public
         constructor Create;
         destructor Destroy; override;
         function isBetween(DateHeureDebut,DateHeureFin:TDateTime):boolean;
         Property Debut : TDateTime read FDebut write SetDebut;
         property Fin : TDateTime read FFin write SetFin;
         property Titre : string read FTitre write SetTitre;
         property Description : TStringList read FDescription write SetDescription;
         property Tag:integer read FTag write SetTag;
      end;
     
      TPlanning = class
      private
        FStringList:TStringList;
        FIndexCourant: Integer;
        FFicheCourante: TFiche;
        FIsEditing: boolean;
        FOnBrowse: TNotifyEvent;
        FOnEditingChange: TNotifyEvent;
        function GetCapacity: Integer;
        function GetCount: Integer;
        procedure SetCapacity(const Value: Integer);
        function GetSorted: Boolean;
        procedure SetSorted(const Value: Boolean);
        procedure SetIndexCourant(const Value: Integer);
        function GetIndexCourant: Integer;
        procedure SetFicheCourante(const Value: TFiche);
        function GetFicheCourante: TFiche;
        procedure SetIsEditing(const Value: boolean);
        procedure SetOnBrowse(const Value: TNotifyEvent);
        procedure SetOnEditingChange(const Value: TNotifyEvent);
      protected
        function EncodeLigne(UneFiche:TFiche):string;
        procedure DecodeLigne(Ligne:string;Var UneFiche:TFiche);
        procedure EditingChange(Sender: TObject);
      public
        constructor Create;
        destructor Destroy; override;
        //Méthodes façon TStringList
        procedure Clear;
        procedure Sort;
        procedure UpdateFicheCourante;
        procedure LireFiche(Index: Integer;Var UneFiche:TFiche);
        procedure MaJFiche(Index: Integer;UneFiche:TFiche);
        function IndexOf(DateHeureCherchee:TDateTime):integer;
        function Add(UneFiche:TFiche): Integer;
        procedure Delete(Index: Integer);
        procedure Insert(Index: Integer; UneFiche:TFiche);
        procedure Move(CurIndex, NewIndex: Integer);
        procedure Exchange(Index1, Index2: Integer);
        procedure BeginUpdate;
        procedure LoadFromFile(const FileName: string);
        procedure LoadFromStream(Stream: TStream);
        procedure SaveToFile(const FileName: string);
        procedure SaveToStream(Stream: TStream);
        property Capacity: Integer read GetCapacity write SetCapacity;
        property  Count: Integer read GetCount;
        property Sorted: Boolean read GetSorted write SetSorted;
        procedure EndUpdate;
        //Méthodes Façon TTable
        property IndexCourant:Integer read GetIndexCourant write SetIndexCourant;
        Procedure First;
        Procedure Prior;
        Procedure Next;
        procedure Last;
        procedure Post;
        procedure Cancel;
        procedure New;
        procedure Del;
        property IsEditing:boolean read FIsEditing write SetIsEditing;
        property FicheCourante:TFiche read GetFicheCourante write SetFicheCourante;
        property OnEditingChange:TNotifyEvent read FOnEditingChange write SetOnEditingChange;
        property OnBrowse:TNotifyEvent read FOnBrowse write SetOnBrowse;
      end;
     
    implementation
     
    { TFiche }
     
    constructor TFiche.Create;
    begin
      inherited;
      FDescription:=TStringList.Create;
      FDescription.OnChange:=EditingChange;
    end;
     
    destructor TFiche.Destroy;
    begin
      FDescription.Free;
      FOnEditingChange:=nil;
      inherited;
    end;
     
    procedure TFiche.EditingChange(Sender: TObject);
    begin
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    function TFiche.isBetween(DateHeureDebut,
      DateHeureFin: TDateTime): boolean;
    begin
      result:=((FDebut<DateHeureFin) and (FFin>DateHeureDebut));
    end;
     
    procedure TFiche.SetDebut(const Value: TDateTime);
    begin
      FDebut := Value;
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    procedure TFiche.SetDescription(const Value: TStringList);
    begin
      FDescription.Text := Value.Text;
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    procedure TFiche.SetFin(const Value: TDateTime);
    begin
      FFin := Value;
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    procedure TFiche.SetOnEditingChange(const Value: TNotifyEvent);
    begin
      FOnEditingChange := Value;
    end;
     
    procedure TFiche.SetTag(const Value: integer);
    begin
      FTag := Value;
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    procedure TFiche.SetTitre(const Value: string);
    begin
      FTitre := Value;
      if Assigned(FOnEditingChange) then FOnEditingChange(self);
    end;
     
    { TCarnet }
     
    constructor TPlanning.Create;
    begin
      inherited;
      FStringList:=TStringList.Create;
      FIndexCourant:=-1;
      FFicheCourante:=TFiche.Create;
      FFicheCourante.OnEditingChange:=EditingChange;
      UpdateFicheCourante;
      FIsEditing:=false;
     
    end;
     
    destructor TPlanning.Destroy;
    begin
      FStringList.Free;
      FFicheCourante.Free;
      FOnBrowse:=nil;
      FOnEditingChange:=nil;
      inherited;
    end;
     
    procedure TPlanning.MaJFiche(Index: Integer; UneFiche: TFiche);
    var UneLigne:string;
    begin
      UneLigne:=EncodeLigne(UneFiche);
      FStringList.Strings[index]:=UneLigne;
    end;
     
    function TPlanning.IndexOf(DateHeureCherchee:TDateTime): integer;
    var i:integer;
        trouve:Boolean;
        UneFiche:TFiche;
    begin
      result:=-1;
      trouve:=False;
      if FStringList.Count=0 then Exit;
      UneFiche:=TFiche.Create;
      try
        i:=0;
        while ((i<FStringList.Count) and (not trouve)) do
        begin
          LireFiche(i,UneFiche);
          if ((UneFiche.FDebut<=DateHeureCherchee) and (UneFiche.FFin>=DateHeureCherchee))
          then begin
                 trouve:=true;
                 result:=i;
               end;
          inc(i);
        end;
      finally
        UneFiche.Free;
      end;
    end;
     
    procedure TPlanning.LireFiche(Index: Integer; var UneFiche: TFiche);
    var UneLigne:string;
    begin
      UneLigne:=FStringList.Strings[index];
      DecodeLigne(UneLigne,UneFiche);
    end;
     
    function TPlanning.Add(UneFiche: TFiche):integer;
    var NouvelleLigne:string;
    begin
      NouvelleLigne:=EncodeLigne(UneFiche);
      result:=FStringList.Add(NouvelleLigne);
      if FStringList.Count=1 then IndexCourant:=0;
    end;
     
    procedure TPlanning.DecodeLigne(Ligne: string; var UneFiche: TFiche);
    var ASL:TStringList;
    begin
      ASL:=TStringList.Create;
      try
        ASL.CommaText:=Ligne;
        if ASL.Count=5 then
        begin
          UneFiche.FDebut:=StrToFloat(ASL.Strings[0]);
          UneFiche.FFin:=StrToFloat(ASL.Strings[1]);
          UneFiche.FTag:=StrToInt(ASL.Strings[2]);
          UneFiche.FTitre:=ASL.Strings[3];
          UneFiche.FDescription.CommaText:=ASL.Strings[4];
        end;
      finally
        ASL.Free;
      end;
    end;
     
    function TPlanning.EncodeLigne(UneFiche: TFiche): string;
    var ASL:TStringList;
    begin
      ASL:=TStringList.Create;
      try
        ASL.Add(FloatToStr(UneFiche.FDebut));
        ASL.Add(FloatToStr(UneFiche.FFin));
        ASL.Add(IntToStr(UneFiche.FTag));
        ASL.Add(UneFiche.FTitre);
        ASL.Add(UneFiche.FDescription.CommaText);
        Result:=ASL.CommaText;
      finally
        ASL.Free;
      end;
    end;
     
    procedure TPlanning.BeginUpdate;
    begin
      FStringList.BeginUpdate;
    end;
     
    procedure TPlanning.Clear;
    begin
      FStringList.Clear;
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.Delete(Index: Integer);
    begin
      FStringList.Delete(Index);
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.EndUpdate;
    begin
      FStringList.EndUpdate;
    end;
     
    procedure TPlanning.Exchange(Index1, Index2: Integer);
    begin
      FStringList.Exchange(Index1,Index2);
    end;
     
    function TPlanning.GetCapacity: Integer;
    begin
      result:=FStringList.Capacity;
    end;
     
    function TPlanning.GetCount: Integer;
    begin
      Result:=FStringList.Count;
    end;
     
    procedure TPlanning.Insert(Index: Integer; UneFiche:TFiche);
    var NouvelleLigne:string;
    begin
      NouvelleLigne:=EncodeLigne(UneFiche);
      FStringList.Insert(Index,NouvelleLigne);
      if FStringList.Count=1 then IndexCourant:=0;
    end;
     
    procedure TPlanning.LoadFromFile(const FileName: string);
    begin
      FStringList.LoadFromFile(FileName);
      if FStringList.Count=0
      then FIndexCourant:=-1
      else FIndexCourant:=0;
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.LoadFromStream(Stream: TStream);
    begin
      FStringList.LoadFromStream(Stream);
      if FStringList.Count=0
      then FIndexCourant:=-1
      else FIndexCourant:=0;
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.Move(CurIndex, NewIndex: Integer);
    begin
      FStringList.Move(CurIndex,NewIndex);
    end;
     
    procedure TPlanning.SaveToFile(const FileName: string);
    begin
      FStringList.SaveToFile(FileName);
    end;
     
    procedure TPlanning.SaveToStream(Stream: TStream);
    begin
      FStringList.SaveToStream(Stream);
    end;
     
    procedure TPlanning.SetCapacity(const Value: Integer);
    begin
      FStringList.Capacity:=Value;
    end;
     
    procedure TPlanning.Sort;
    begin
      FStringList.Sort;
    end;
     
    function TPlanning.GetSorted: Boolean;
    begin
      result:=FStringList.Sorted;
    end;
     
    procedure TPlanning.SetSorted(const Value: Boolean);
    begin
      FStringList.Sorted:=Value;
    end;
     
    procedure TPlanning.SetIndexCourant(const Value: Integer);
    begin
      if ((Value>=0)
         and (Value<FStringList.Count)
         and (FIndexCourant<>Value))
      then begin
             FIndexCourant := Value;
             UpdateFicheCourante;
           end;  
    end;
     
    function TPlanning.GetIndexCourant: Integer;
    begin
      result:=FIndexCourant;
    end;
     
    procedure TPlanning.First;
    begin
      IndexCourant:=0;
    end;
     
    procedure TPlanning.Last;
    begin
      IndexCourant:=Count-1;
    end;
     
    procedure TPlanning.Next;
    begin
      IndexCourant:=IndexCourant+1;
    end;
     
    procedure TPlanning.Prior;
    begin
      IndexCourant:=IndexCourant-1;
    end;
     
    procedure TPlanning.SetFicheCourante(const Value: TFiche);
    begin
      FFicheCourante := Value;
      IsEditing:=true;
    end;
     
    function TPlanning.GetFicheCourante: TFiche;
    begin
      result:=FFicheCourante;
    end;
     
    procedure TPlanning.UpdateFicheCourante;
    begin
      if FStringList.Count=0 then FIndexCourant:=-1;
      if FIndexCourant>FStringList.Count-1 then FIndexCourant:=-1;
      if FIndexCourant=-1
      then with FFicheCourante do
           begin
             FDebut:=0;
             FFin:=0;
             FTag:=0;
             FTitre:='';
             FDescription.Clear;
           end
      else LireFiche(FIndexCourant,FFicheCourante);
      if Assigned(FOnBrowse) then FOnBrowse(self);
      IsEditing:=false;
    end;
     
    procedure TPlanning.Cancel;
    begin
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.Post;
    begin
    if IndexCourant<>-1 then
      MaJFiche(IndexCourant,FFicheCourante)
    else Add(FFicheCourante);
    IsEditing:=false;
    end;
     
    procedure TPlanning.New;
    var UneFicheVierge:TFiche;
    begin
      UneFicheVierge:=TFiche.Create;
      try
        Add(UneFicheVierge);
      finally
        UneFicheVierge.Free;
      end;
      Last;
    end;
     
    procedure TPlanning.Del;
    begin
      Delete(FIndexCourant);
      UpdateFicheCourante;
    end;
     
    procedure TPlanning.SetIsEditing(const Value: boolean);
    begin
      if (FIsEditing<>Value) then
      begin
        FIsEditing := Value;
        if Assigned(FOnEditingChange) then FOnEditingChange(self);
      end;
    end;
     
    procedure TPlanning.SetOnBrowse(const Value: TNotifyEvent);
    begin
      FOnBrowse := Value;
    end;
     
    procedure TPlanning.SetOnEditingChange(const Value: TNotifyEvent);
    begin
      FOnEditingChange := Value;
    end;
     
    procedure TPlanning.EditingChange(Sender: TObject);
    begin
      IsEditing:=true;
    end;
     
    end.
    Ainsi qu'un exemple d'utilisation :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, TWAPanels,Unitplanning, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        UnPlanning:TPlanning;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses DateUtils;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
     
    begin
      UnPlanning:=TPlanning.Create;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     UnPlanning.Free;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var UneFiche:TFiche;
        i:integer;
    begin
      UneFiche:=TFiche.Create; //NouvelleFiche
      UneFiche.Debut:=EncodeDateTime(2006,11,6,8,0,0,0); //le 6/11/2006 entre 8h00
      UneFiche.Fin:=EncodeDateTime(2006,11,6,9,30,0,0);  // et 9h30
      UneFiche.Titre:='RDV';
      uneFiche.Description.Add('Aller chez le médecin');
      uneFiche.Description.Add('Ne pas oublier la carte vitale');
      UnPlanning.Add(UneFiche); //Enregistrement de la fiche
     
      UneFiche:=TFiche.Create;
      UneFiche.Debut:=EncodeDateTime(2006,11,15,21,0,0,0); //le 15/11/2006 entre 21h00
      UneFiche.Fin:=EncodeDateTime(2006,11,15,23,30,0,0);  // et 23h30
      UneFiche.Titre:='Cinoche';
      uneFiche.Description.Add('On va voir quel film ?');
      UnPlanning.Add(UneFiche);
     
      UneFiche:=TFiche.Create;
      UneFiche.Debut:=EncodeDateTime(2006,11,7,12,0,0,0); //le 7/11/2006 entre 12h00
      UneFiche.Fin:=EncodeDateTime(2006,11,7,13,30,0,0);  // et 13h30
      UneFiche.Titre:='Repas';
      uneFiche.Description.Add('Resto avec le patron');
      UnPlanning.Add(UneFiche);
     
      //Sauvegarde du planning
      UnPlanning.SaveToFile('MonPlanning.pla');
     
      //Recherche d'une Fiche en particulier :
      //Que fais-je le 15/11/2006 à 22h00 ?
      i:=UnPlanning.IndexOf(EncodeDateTime(2006,11,15,22,0,0,0));
      if i>-1 then begin
                      UnPlanning.IndexCourant:=i;
                      ShowMessage(UnPlanning.FicheCourante.Titre);
                    end;
     
      //affichage de toutes les fiches entre le 1er novembre et le 10 novembre
      for i:=0 to UnPlanning.Count-1 do
      begin
        UnPlanning.IndexCourant:=i;
        if UnPlanning.FicheCourante.isBetween(EncodeDateTime(2006,11,1,0,0,0,0),EncodeDateTime(2006,11,11,0,0,0,0))
        then ShowMessage(UnPlanning.FicheCourante.Titre);
      end;
     
      //Supprimer un rendez-vous
      UnPlanning.Delete(0);
    end;
     
    end.
    Bidouilleuse Delphi

  4. #24
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Salut Waskol, bien dormi ?...
    J'ai essayé ta solution, que j'avais commencé à programmé moi meme, sur le modèle que tu avais fourni sur la discussion "sauvegarde de données" (qui était de moi !).
    J'ai pas tout saisi, et je ne vois pas comment on peut inter agir avec tes compos, genre faire apparaitre la plage en couleur, car il n'y a pas de canvas, mais on peu en faire un (via la FAQ...).
    Peut on à ton avis, mettre dans Tfiche, un shape, comme ca, à chaque nouvelle entrée dans le planning, on pourrait avoir un Shape, et un événement OnClick....
    J'y retourne...

  5. #25
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par petitprince
    Salut Waskol, bien dormi ?...
    J'ai essayé ta solution, que j'avais commencé à programmé moi meme, sur le modèle que tu avais fourni sur la discussion "sauvegarde de données" (qui était de moi !).
    J'ai pas tout saisi, et je ne vois pas comment on peut inter agir avec tes compos, genre faire apparaitre la plage en couleur, car il n'y a pas de canvas, mais on peu en faire un (via la FAQ...).
    Peut on à ton avis, mettre dans Tfiche, un shape, comme ca, à chaque nouvelle entrée dans le planning, on pourrait avoir un Shape, et un événement OnClick....
    J'y retourne...
    TFiche et TPlanning ne sont pas des composants visuels.
    Ce sont juste des classes qui permettent de manipuler/sauver/charger les données de notre planning. Un peu comme Un TStringList, un TBitmap, etc...
    La partie visuelle, encapsulera ça, comme TMeme le fait avec TstringList, TImage le fait avec TBitmap, etc...
    Patiente, on va y arriver.

    - On a l'accès aux données et leur gestion : la liste des fichess/creneaux (donc notre "base de données" à nous) est gérée avec les classes TPlanning et TFiche
    - On a la gestion des paramètres d'affichage du planning (Premier Jour à afficher+nombre de jours)

    - il nous reste l'affichage du planning
    --> On écrit une procédure qui permet d'afficher le contenu de TPlanning dans un TCanvas (comme celui d'une TPaintBox) : je pense qu'il faudra commencer par ça
    --> Puis on englobe le tout dans un composant maison dérivé de TGraphicControl (notre composant ne contiendra pas d'autres contrôles)
    --> A la rigueur, il nous faudra penser à faire une espèce de barre latérale pour afficher les heures.


    Tu vas voir, ça va marcher. Mais il ne faut pas brûler les étapes
    Bidouilleuse Delphi

  6. #26
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Euh.....Oui excuse, c'est vrai, je fonce souvent tete baissé...

  7. #27
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    C'est quasi-terminé
    Manquera encore l'interaction à la souris.
    Bidouilleuse Delphi

  8. #28
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Ben moi j'ai rien fait, je bute sur un autre problème, sur la gestion de date, genre faire une alerte 5 jours avant une date T, pour dire de penser à telle ou telle chose...
    Désolé, mais je vais essayé de m'y remettre...

  9. #29
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par petitprince
    Ben moi j'ai rien fait, je bute sur un autre problème, sur la gestion de date, genre faire une alerte 5 jours avant une date T, pour dire de penser à telle ou telle chose...
    Désolé, mais je vais essayé de m'y remettre...
    Salut,
    Oublies pour l'alerte, c'est tout simple :
    - tu récupères la date du jour avec Now
    - tu ajoutes 5 jours à cette date avec la procédure IncDay()
    - tu vérifies si tu as un évènement programmé dans le planning comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    index:=Plannning.IndexOf(LaDateCalculéeCiDessus);
    si index=-1 alors, il n'y a rien, sinon, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Planning.LireFiche(Index,UneFiche);
    Et crac, tu as l'évènement asocié.

    Voici où, j'en suis (voir projet joint), il manque encore deux trois babioles d'affichage (titre et Texte des évènements) avant d'avoir quelque chose de fonctionnel, mais c'est plutot encourageant et alléchant pour la suite
    A ce soir.
    Fichiers attachés Fichiers attachés
    Bidouilleuse Delphi

  10. #30
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Bonjour

    Quand je pense qu'il vous a fallu une semaine pour mettre ça au point...
    Chapeau bas Messieurs

    Je n'ai pas pris le temps de tout comprendre, mais quand même

    Perso, j'ai développé il y a quelques temps un agenda similaire, dont je me sers au boulot
    J'ai opté pour des records que je sauvegarde dans des fichiers
    - un record "événement" contenant:
    . sa catégorie (rendez-vous, congé, alerte...)
    . ses date et heure de début
    . ses date et heure de fin
    . son commentaire
    - un record "type d'événement" contenant
    . son libellé ("rendez-vous bureau", "férié", "congé"...)
    . sa couleur d'affichage
    . son commentaire par défaut (évite la saisie répétitive, exemple "RTT 2006")
    . son apparence (caché ou affiché)
    . son heure de début par défaut, s'il y en a une
    . son heure de fin par défaut, s'il y en a une (par ex un jour férié "commence" à 00H00 et "finit" à 23H59

    Plus un certain nombre de paramètres sauvegardés eux aussi, et qui sont conservés entre 2 lancements de l'appli, entre autres :
    - les données personnalisées des événements (libellé, couleur d'affichage...)
    - le mode d'affichage (jour, semaine, mois, trimestre, semestre, année)
    - si la semaine affichée comporte 5 ou 7 jours
    - si les WE et poses midinales s'affichent dans une couleur particulière
    - les plages horaires d'affichage choisies par l'utilisateur en mode jour et semaine (par ex 7H - 19H)
    etc...

    Le tout dans une stringgrid. Je gère l'affichage des événements dans la procédure OnDrawCell

    J'ai prévu un mode recherche sur le commentaire, un filtre d'affichage en fonction de la catégorie d'événements, un système d'alerte qui se déclenche aux date et heure prévues...

    Cerise sur le gateau : l'utilisateur peut choisir toutes les couleurs d'affichage, qui sont elles aussi sauvegardées dans un fichier

    Bon voilà. Mon but n'est pas de vous en mettre plein la vue
    Etant donné ce que j'ai lu plus haut, je ne pense pas avoir grand chose à vous montrer, côté programmation (ce serait plutôt l'inverse !)

    Je voulais juste vous donner des idées de fonctionnalités...

    Et pour le look je vous joins 1 ou 2 screenshot
    Choisir, c'est renoncer...

  11. #31
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    En tout cas c'est joli
    Et ça m'a lair rudement bien pensé

    Tu as utilisé mon code pour "fusionner" les cellules du stringgrid ?
    Bidouilleuse Delphi

  12. #32
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par waskol
    En tout cas c'est joli
    Et ça m'a lair rudement bien pensé
    Merci pour le compliment

    Citation Envoyé par waskol
    Tu as utilisé mon code pour "fusionner" les cellules du stringgrid ?
    Non
    Je gère le dessin des événements avec les méthodes Canvas.polygon et Canvas.Textout
    Les coordonnées de polygon sont calculées en fonctions des date/heure début/fin des événements... y compris en affichage hebdo lorsqu'un événement "dure" plusieurs jours ou se trouve à cheval sur 2 ou + semaines (et là, j'ai pas mal galéré)
    Je n'avais pas pensé à un système de fusion des cellules
    Est-il adapté, quand le dessin de l'événement n'est pas un rectangle strict (ex: début lundi 8H30, fin mardi 12H ?)
    Mais tu fais bien d'en parler
    J'irai voir ça de + près, ça peut toujours servir

    @+
    Choisir, c'est renoncer...

  13. #33
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Salut,

    OutOfRange, je confirme, c'est très joli (sauf peut-être, pour être honnête et sincère, ces décrochés dans la barre de titre) ; pourrais-tu nous (me) mettre une copie écran d'un affichage sur 2 semaines, siouplait ?

    Waskol, j'ai regardé ton projet (puisque moi aussi ... [revoir plus bas]), bon, j'ai pas regardé le code (pas trop le temps), dis donc, il est très ciblé 8-20 lundi-vendredi, ton truc ! Pas très adapté, imho, au 3x8 et à ceux qui bossent le week-end : inapplicable à ma boulangère, à mon coiffeur, etc.
    C'est une limitation du code de base, ou une adaptation à la demande de petitprince ?

    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #34
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Jipété
    Salut,

    OutOfRange, je confirme, c'est très joli (sauf peut-être, pour être honnête et sincère, ces décrochés dans la barre de titre) ; pourrais-tu nous (me) mettre une copie écran d'un affichage sur 2 semaines, siouplait ?

    Waskol, j'ai regardé ton projet (puisque moi aussi ... [revoir plus bas]), bon, j'ai pas regardé le code (pas trop le temps), dis donc, il est très ciblé 8-20 lundi-vendredi, ton truc ! Pas très adapté, imho, au 3x8 et à ceux qui bossent le week-end : inapplicable à ma boulangère, à mon coiffeur, etc.
    C'est une limitation du code de base, ou une adaptation à la demande de petitprince ?

    Mes 2 cts,
    --
    jp
    Tu n'as pas regardé de suffisemment prêt Jipété

    Via TPlanner.PanneauJours, tu as une palanquée de méthode que j'ai déjà décrit plus haut dans le fil de discussion qui permettent de changer la date du premier Jour (pour avoir un Samedi par exemple), et une propriété qui permet de choisir le nombres de jours à afficher (de 1 à autant que tu veux)

    Et pour TPlanner.PanneauxHeures tu choisis la première heure et la dernière heure à afficher.

    Donc il n'y a ni limitation, ni adaptation à la demande
    Bidouilleuse Delphi

  15. #35
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Merci de ta réponse, Waskol, mais toi tu m'as pas bien lu, :
    bon, j'ai pas regardé le code (pas trop le temps)
    Content d'apprendre qu'il n'y a pas de limitations, bien joué !
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #36
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Jipété
    Merci de ta réponse, Waskol, mais toi tu m'as pas bien lu, :
    Content d'apprendre qu'il n'y a pas de limitations, bien joué !
    --
    jp
    Si, je t'avais bien lu, mais c'était juste pour attirer ton attention et me faire de la "pub" sur ton dos en vantant les mérites de mon composant
    Bidouilleuse Delphi

  17. #37
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par OutOfRange
    Merci pour le compliment
    Est-il adapté, quand le dessin de l'événement n'est pas un rectangle strict (ex: début lundi 8H30, fin mardi 12H ?)
    Ben, heu non, mais le code de dessin est le même, donc en fait je fait plus ou moins comme toi pour dessiner une "fusion de cellule", mis à part que je me cale sur la dimension des cellules.

    Et en, plus tu as du comme moi avoir des soucis lorsque les scrollbars sont présentes
    Hors, j'ai trouvé un moyen de contourner le problême dans mon code

    Si tu fait une recherche sur le forum avec Fusion en mot clé, et waskol comme auteur de message, tu trouveras le fil de discussion avec le code.
    Bidouilleuse Delphi

  18. #38
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut jipété
    Citation Envoyé par Jipété
    OutOfRange, je confirme, c'est très joli (sauf peut-être, pour être honnête et sincère, ces décrochés dans la barre de titre)
    Je t'explique...
    Je fais un textout sur le canvas de la fenêtre
    Or, ici, j'ai xp et au bureau 98 et l'affichage n'est pas identique, sans doute en raison des propriétés de l'apparence
    Les 3 screenshots d'hier ont été fait ici, alors que les coordonnées de mon textout sont réglées pour que ça se dessine zouli comme tout au bureau
    Cette fois je te mets un screenshot au poil
    Je t'ai mis un exemple d'événement qui commence un jeudi à 14H pour se terminer le mardi suivant à 12H

    Salut waskol
    Citation Envoyé par waskol
    Et en, plus tu as du comme moi avoir des soucis lorsque les scrollbars sont présentes
    En fait j'ai évacué le pb en interdisant l'affichage des scrollbar de ma stringgrig

    Bon là j'ai p't'être pas bien compris ta question

    @+
    Choisir, c'est renoncer...

  19. #39
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par OutOfRange
    Bon là j'ai p't'être pas bien compris ta question
    @+
    Si, si
    Bidouilleuse Delphi

  20. #40
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    @OutOfRange : très très joli !

    Mais puis-je me permettre ? (comme je dis toujours, "mes 2 cts", hein, après, tu fais ce que tu veux) :
    • la police est trop exotique : elle serait sympa sur une affiche, un flyer, en titre, mais il ne s'agit pas d'une police de lecture courante, donc un peu plus longue à lire car on n'en a pas l'habitude ;
    • c'est pénible ces coupures de mots n'importe où dans les mots : là aussi on a du mal à lire, et donc à appréhender le message -- et c'est ça qui compte !
    • pour les heures, perso je mettrais 11:30 plutôt que 11H30, d'autant plus que les règles officielles de typographie (un sujet hélas fort méconnu...) stipulent 11_h_30 (j'ai mis des underscores pour matérialiser les espaces insécables) -- mais pour rester en harmonie avec l'horloge en bas à droite, le ":" est envisageable et prendra moins de place.


    Merci pour les copies d'écran,
    Mes 2 cts, again,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Recherche composant planning
    Par Sankasssss dans le forum VB.NET
    Réponses: 3
    Dernier message: 22/02/2011, 23h37
  2. Recherche composant ou méthode pour réaliser un plan dynamique
    Par kineton dans le forum Développement Windows
    Réponses: 0
    Dernier message: 14/10/2010, 10h14
  3. Recherche composant ou module pour newsletter+Joomla
    Par clem62173 dans le forum Autres
    Réponses: 1
    Dernier message: 11/01/2010, 17h00
  4. [Tests] Recherche Composant/outil/framework pour tester navigation web
    Par kaboume dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/11/2008, 11h34
  5. Recherche composant éditeur WYSIWYG pour Delphi (Win32)
    Par Nono40 dans le forum Composants VCL
    Réponses: 10
    Dernier message: 23/05/2008, 18h29

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