Mémo v1.0.0

Description

Après 1 an et demi consacré aux MMORPG, je me remets à la programmation en Delphi.
Voici donc pour me refaire un peu la main un programme dont j'avais besoin et qui j'espère pourrait vous être utile.

C'est un programme d'un petit mémo ou post-it qui gère des évènements en fonction de la date et de l'heure.
Le programme est suffisamment intuitif pour ne pas être documenté, quelques secondes suffisent pour le prendre en main.
Je ne sais pas s'il apportera quelque chose de nouveau mais on peut y trouver la gestion d'un .ini, d'un TrayIcon, l'utilisation de la propriété Tag pour jongler avec les composants... ainsi qu'un code très commenté pour aider au mieux les débutants comme moi.

L'idée du programme est basée sur le widget igoogle : http://www.google.com/ig/directory?type=gadgets&url=www.labpixies.com/campaigns/todo/todo.xml que j'utilise mais qui était incomplet.

Source / Exemple :


{==============================================================================================
Code Source : BEAUMONT Christophe
Version     : 1.0.0
Date        : 26 Octobre 2010

Projet 02 - Un programme de gestion d'évènements à partir de la date et de l'heure.
Utilise les ressources internes pour l'utilisation du son.
Retrouvez d'autres sources également sur mon site : "http://www.delphinautes.fr"
==============================================================================================}
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Menus,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  Vcl.Imaging.pngimage, // Pour utiliser une image au format PNG pour le fond
  IniFiles,             // Pour utiliser TIniFile
  Registry,             // Pour utiliser TRegistry
  DateUtils,            // Pour utiliser CompareDateTime
  mmSystem              // Pour jouer le son .wav
  ;

type
  TPostIt = class(TForm)
    Date1: TLabel;
    Date2: TLabel;
    Date3: TLabel;
    Date4: TLabel;
    Date5: TLabel;
    Date6: TLabel;
    Date7: TLabel;
    Date8: TLabel;
    Date9: TLabel;
    Date10: TLabel;
    Memo1: TLabel;
    Memo2: TLabel;
    Memo3: TLabel;
    Memo4: TLabel;
    Memo5: TLabel;
    Memo6: TLabel;
    Memo7: TLabel;
    Memo8: TLabel;
    Memo9: TLabel;
    Memo10: TLabel;
    Heure1: TLabel;
    Heure2: TLabel;
    Heure3: TLabel;
    Heure4: TLabel;
    Heure5: TLabel;
    Heure6: TLabel;
    Heure7: TLabel;
    Heure8: TLabel;
    Heure9: TLabel;
    Heure10: TLabel;
    Curs1: TLabel;
    Curs2: TLabel;
    Curs3: TLabel;
    Curs4: TLabel;
    Curs5: TLabel;
    Curs6: TLabel;
    Curs7: TLabel;
    Curs8: TLabel;
    Curs9: TLabel;
    Curs10: TLabel;
    Fond: TImage;
    ImgInterrogation: TImage;
    ImgFlecheHaut: TImage;
    ImgFlecheBas: TImage;
    ImgHorloge: TImage;
    ImgPoubelle: TImage;
    TrayIcon: TTrayIcon;
    PopupMenu: TPopupMenu;
    MenuRestaurer: TMenuItem;
    MenuPropos: TMenuItem;
    MenuQuitter: TMenuItem;
    ChkWindows: TCheckBox;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure LabMouseLeave(Sender: TObject);
    procedure LabMouseEnter(Sender: TObject);
    procedure LabMouseClick(Sender: TObject);
    procedure ImgFlecheHautClick(Sender: TObject);
    procedure ImgFlecheBasClick(Sender: TObject);
    procedure ImgHorlogeClick(Sender: TObject);
    procedure ImgPoubelleClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure TrayIconDblClick(Sender: TObject);
    procedure MenuQuitterClick(Sender: TObject);
    procedure ImgInterrogationClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ChkWindowsClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    { Déclarations privées }
    procedure EchangeString(L1, L2: TLabel);
  public
    { Déclarations publiques }
// On déclare ces données en publique pour y avoir accès depuis les autres unités
    CursPos: integer;
    LabDate1, LabHeure1, LabMemo1, LabCurs1: TLabel;
  end;

var
  PostIt: TPostIt;
  Fond: TBitmap;
  StringTime: String;
  INI: TIniFile;
  DTime, DTimeNow: TDateTime;
  LabDate2, LabHeure2, LabMemo2, LabCurs2: TLabel;

implementation

{$R *.dfm}

uses New, APropos;

procedure TPostIt.FormCreate(Sender: TObject);
var i: integer;
begin
// On définit le curseur ◄ comme étant sur la première ligne
 CursPos:= 1;
// On démarre le programme en mode non fenêtré
 WindowState := wsMinimized;
// On affiche l'icône dans le SysTray
 TrayIcon.Visible := True;
// On affiche la bulle info
 TrayIcon.ShowBalloonHint;
// Spécifie le nom du fichier .ini à utiliser
 INI := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Memo.ini');
// Charge l'état du lancement au démarrage de Windows
 ChkWindows.Checked := INI.ReadBool('Options','Windows',False);
// On va traiter les 10 lignes du Mémo
 for i := 1 to 10 do
   begin
// Charge la date sinon valeur = '' par défaut
    TLabel(FindComponent('Date'+IntToStr(i))).Caption := INI.ReadString('Memos','Date'+IntToStr(i),'');
// Charge l'heure sinon valeur = '' par défaut
    TLabel(FindComponent('Heure'+IntToStr(i))).Caption := INI.ReadString('Memos','Time'+IntToStr(i),'');
// Charge le descriptif sinon valeur = '' par défaut
    TLabel(FindComponent('Memo'+IntToStr(i))).Caption := INI.ReadString('Memos','Text'+IntToStr(i),'');
   end;
// On libère le fichier .ini
 INI.Free;
end;

procedure TPostIt.FormDestroy(Sender: TObject);
// Je redéclare i comme variable locale pour la boucle FOR, cela fait plaisir au compilateur
var i: integer;
begin
// On créé le fichier Ini dans le répertoire courant s'il n'existe pas
 INI := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Memo.ini');
// Sauvegarde l'état du lancement au démarrage de Windows
  INI.WriteBool('Options','Windows',ChkWindows.Checked);
// On va traiter les 10 lignes du Mémo
 for i := 1 to 10 do
  begin
// Sauve la date
   INI.WriteString('Memos','Date'+IntToStr(i),TLabel(FindComponent('Date'+IntToStr(i))).Caption);
// Sauve l'heure
   INI.WriteString('Memos','Time'+IntToStr(i),TLabel(FindComponent('Heure'+IntToStr(i))).Caption);
// Sauve le descriptif
   INI.WriteString('Memos','Text'+IntToStr(i),TLabel(FindComponent('Memo'+IntToStr(i))).Caption);
  end;
// On libère le fichier .ini
  INI.Free;
end;

procedure TPostIt.LabMouseLeave(Sender: TObject);
var i: integer;
begin
// On sauvegarde le Tag du contrôle qui a déclenché l'évènement OnMouseLeave
  i:= TLabel(Sender).Tag;
// Et on restaure la couleur des 4 Labels formant la ligne
  TLabel(FindComponent('Date'+IntToStr(i))).Color := $0086F3F7;
  TLabel(FindComponent('Heure'+IntToStr(i))).Color := $0086F3F7;
  TLabel(FindComponent('Memo'+IntToStr(i))).Color := $0086F3F7;
  TLabel(FindComponent('Curs'+IntToStr(i))).Color := $0086F3F7;
end;

procedure TPostIt.LabMouseEnter(Sender: TObject);
var i: integer;
begin
// On sauvegarde le Tag du contrôle qui a déclenché l'évènement OnMouseEnter
  i:= TLabel(Sender).Tag;
// Et on éclaircit la couleur des 4 Labels formant la ligne
  TLabel(FindComponent('Date'+IntToStr(i))).Color := $00A1F7F7;
  TLabel(FindComponent('Heure'+IntToStr(i))).Color := $00A1F7F7;
  TLabel(FindComponent('Memo'+IntToStr(i))).Color := $00A1F7F7;
  TLabel(FindComponent('Curs'+IntToStr(i))).Color := $00A1F7F7;
end;

procedure TPostIt.LabMouseClick(Sender: TObject);
begin
// On récupère l'ancien contrôle et on efface le curseur ◄
  TLabel(FindComponent('Curs'+IntToStr(CursPos))).Caption := '';
// On sauvegarde la nouvelle position du curseur
  CursPos:= TLabel(Sender).Tag;
// On cherche le nouveau contrôle et on place le curseur
  TLabel(FindComponent('Curs'+IntToStr(CursPos))).Caption := '◄';
end;

procedure TPostIt.ImgFlecheHautClick(Sender: TObject);
begin
// On vérifie si on est déjà en haut de page
 if CursPos=1 then exit;
// On sauve les données de toute la ligne actuelle
  LabDate1 := TLabel(FindComponent('Date'+IntToStr(CursPos)));
  LabHeure1 := TLabel(FindComponent('Heure'+IntToStr(CursPos)));
  LabMemo1 := TLabel(FindComponent('Memo'+IntToStr(CursPos)));
  LabCurs1:= TLabel(FindComponent('Curs'+IntToStr(CursPos)));
// On sauve les données de toute la ligne du dessus
  LabDate2 := TLabel(FindComponent('Date'+IntToStr(CursPos-1)));
  LabHeure2 := TLabel(FindComponent('Heure'+IntToStr(CursPos-1)));
  LabMemo2 := TLabel(FindComponent('Memo'+IntToStr(CursPos-1)));
  LabCurs2:= TLabel(FindComponent('Curs'+IntToStr(CursPos-1)));
// On switch le contenu de la ligne avec celle du dessus
  EchangeString(LabDate1, LabDate2);
  EchangeString(LabHeure1, LabHeure2);
  EchangeString(LabMemo1, LabMemo2);
  EchangeString(LabCurs1, LabCurs2);
// On décrémente la position du curseur
  Dec(CursPos);
end;

procedure TPostIt.ImgFlecheBasClick(Sender: TObject);
begin
// On vérifie si on est déjà en bas de page
 if CursPos=10 then exit;
// On sauve les données de toute la ligne actuelle
  LabDate1 := TLabel(FindComponent('Date'+IntToStr(CursPos)));
  LabHeure1 := TLabel(FindComponent('Heure'+IntToStr(CursPos)));
  LabMemo1 := TLabel(FindComponent('Memo'+IntToStr(CursPos)));
  LabCurs1:= TLabel(FindComponent('Curs'+IntToStr(CursPos)));
// On sauve les données de toute la ligne du dessous
  LabDate2 := TLabel(FindComponent('Date'+IntToStr(CursPos+1)));
  LabHeure2 := TLabel(FindComponent('Heure'+IntToStr(CursPos+1)));
  LabMemo2 := TLabel(FindComponent('Memo'+IntToStr(CursPos+1)));
  LabCurs2:= TLabel(FindComponent('Curs'+IntToStr(CursPos+1)));
// On switch le contenu de la ligne avec celle du dessous
  EchangeString(LabDate1, LabDate2);
  EchangeString(LabHeure1, LabHeure2);
  EchangeString(LabMemo1, LabMemo2);
  EchangeString(LabCurs1, LabCurs2);
// On incrémente la position du curseur
  Inc(CursPos);
end;

procedure TPostIt.ImgHorlogeClick(Sender: TObject);
begin
// On sauvegarde les données de la ligne avant de changer d'unité
  LabDate1 := TLabel(FindComponent('Date'+IntToStr(CursPos)));
  LabHeure1 := TLabel(FindComponent('Heure'+IntToStr(CursPos)));
  LabMemo1 := TLabel(FindComponent('Memo'+IntToStr(CursPos)));
// On ouvre la fenêtre de création des évènements
  NewLine.Show;
end;

procedure TPostIt.ImgPoubelleClick(Sender: TObject);
begin
// On efface la ligne
  TLabel(FindComponent('Date'+IntToStr(CursPos))).Caption := '';
  TLabel(FindComponent('Heure'+IntToStr(CursPos))).Caption := '';
  TLabel(FindComponent('Memo'+IntToStr(CursPos))).Caption := '';
end;

procedure TPostIt.ChkWindowsClick(Sender: TObject);
var Reg: TRegistry;
begin
// crée un objet TRegistry pour l'application
 Reg := TRegistry.Create;
// Spécifie la clé racine
 Reg.RootKey := HKEY_CURRENT_USER;
// faire de la clé spécifiée, la clé courante. On la créé si elle n'existe pas
 Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True);
// Si la checkbox est cochée, on stocke le nom du programme et son chemin dans la valeur 'Memo'
  if ChkWindows.Checked = true then Reg.WriteString('Memo', Application.ExeName)
// Sinon on efface la valeur 'Memo' associée à la clé en cours
  else Reg.DeleteValue('Memo');
// Ecrit la clé en cours dans le registre et ferme cette clé
 Reg.CloseKey;
// Détruire l'objet TRegistry
 Reg.Free;
end;

procedure TPostIt.TimerTimer(Sender: TObject);
// Variables locales pour les boucles FOR
var t, s: integer;
begin
// On efface le string
 StringTime := '';
// On va traiter les 10 lignes
 for t := 1 to 10 do
  begin
// On place la date du label dans le string
   StringTime := TLabel(FindComponent('Date'+IntToStr(t))).Caption;
// Puis l'heure
   StringTime := StringTime + TLabel(FindComponent('Heure'+IntToStr(t))).Caption;
// S'il n'y avait rien d'inscrit alors on passe à l'itération suivante
   if StringTime = '' then Continue;
// Sinon on transforme la chaine en TDateTime
   DTime := StrToDateTime(StringTime);
// On récupère la date et l'heure actuelle
   DTimeNow := Now;
// On vérifie si l'heure est passée, sinon on passe à l'itération suivante
   if CompareDateTime(DTime,DTimeNow)=1 then Continue;
// On désactive le Timer le temps de traiter l'évènement
   Timer.Enabled := False;
// On affiche la ligne de l'évènement en rouge
   TLabel(FindComponent('Date'+IntToStr(t))).Font.Color := clRed;
   TLabel(FindComponent('Heure'+IntToStr(t))).Font.Color := clRed;
   TLabel(FindComponent('Memo'+IntToStr(t))).Font.Color := clRed;
   TLabel(FindComponent('Curs'+IntToStr(t))).Font.Color := clRed;
// On contrôle si le mémo est minimisé, donc dans le SysTray
   if  WindowState = wsMinimized then
    begin
// On retire l'icône du SysTray
     TrayIcon.Visible := False;
// On affiche la fiche
     Show();
// On restaure la fenêtre sinon elle reste dans la barre des tâches
     WindowState := wsNormal;
// On place l'application au premier plan
     Application.BringToFront;
    end;
// On joue l'alarme 3 fois
   for s := 1 to 3 do PlaySound('Alerte', HInstance, SND_RESOURCE);
// On invite à effacer l'évènement en contrôlant le bouton OK
   if MessageDlg('Souhaitez-vous effacer l''évènement ?',mtWarning, mbOKCancel, 0)= mrOK then
    begin
// On efface toute la ligne et on  rend au texte sa couleur noire
     TLabel(FindComponent('Date'+IntToStr(t))).Caption := '';
     TLabel(FindComponent('Date'+IntToStr(t))).Font.Color := clBlack;
     TLabel(FindComponent('Heure'+IntToStr(t))).Caption := '';
     TLabel(FindComponent('Heure'+IntToStr(t))).Font.Color := clBlack;
     TLabel(FindComponent('Memo'+IntToStr(t))).Caption := '';
     TLabel(FindComponent('Memo'+IntToStr(t))).Font.Color := clBlack;
     TLabel(FindComponent('Curs'+IntToStr(t))).Caption := '';
     TLabel(FindComponent('Curs'+IntToStr(t))).Font.Color := clBlack;
    end;
// On réactive le Timer
   Timer.Enabled := True;
// On sort de la boucle  for t := 1 to 10 do
   Break;
  end;
end;

//Merci à Mauricio de Delphi.fr pour cette procédure
procedure TPostIt.EchangeString(L1, L2: TLabel);
var L0: string;
begin
// On switch les textes des 2 TLabel en passant par un buffer
 L0 := L1.Caption;
 L1.Caption := L2.Caption;
 L2.Caption := L0;
end;

procedure TPostIt.FormResize(Sender: TObject);
begin
// On vérifie si la fenêtre a été minimisée
 if WindowState = wsMinimized then
 begin
// On cache la fiche
  Hide();
// On affiche l'icône dans le SysTray
  TrayIcon.Visible := True;
// On affiche la bulle info
  TrayIcon.ShowBalloonHint;
 end;
end;

procedure TPostIt.TrayIconDblClick(Sender: TObject);
begin
// On retire l'icône du SysTray
 TrayIcon.Visible := False;
// On restaure la fenêtre sinon elle reste dans la barre des tâches
 WindowState := wsNormal;
// On affiche la fiche
 Show();
// On place l'application au premier plan
 Application.BringToFront;
end;

procedure TPostIt.ImgInterrogationClick(Sender: TObject);
begin
// Affiche la fenêtre d'informations
 frmAPropos.Show;
end;

procedure TPostIt.MenuQuitterClick(Sender: TObject);
begin
// On quitte le programme à partir du popMenu
 Close;
end;

end.

Conclusion :


D'autres programmes et sources sur mon site :

www.delphinautes.fr

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.