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
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.