Les Snippets

Connexion

Programmer un BeginUpdate/EndUpdate pour bloquer des evenements dans un composant

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 26/08/2007 22:19:32 et initié par f0xi [Liste]
Date de mise à jour : 26/08/2007 22:20:46
Vue : 1588
Catégorie(s) : Trucs & Astuces, Divers, Class, Control
Langages dispo pour ce code :
- Delphi 5



Langage : Delphi 5
Date ajout : 26/08/2007
Posté par f0xi [Liste]
DateMAJ : 26/08/2007

Démonstration de l'élaboration d'un système de mise a jours des données
d'un composant, permettant l'arrêt des méthodes ou évènements appelés 
a chaque action sur ces données.
Pratique pour les Listes et Collections par exemple, usitée dans la classe TStrings, 
ou elle permet de bloquer l'évènement OnChange qui est appelé 
a chaque Add, Append, Delete, Exchange etc.

{ interface }

Type
  { Remarque : en général vous introduirez directement le code ci-dessous
    dans votre composant. }
  TUpdateControl = class(TObject) 
  private
    { compteur d'appel a BeginUpdate/EndUpdate }
    fUpdateCount : integer;
    { "reader" pour la propriété UpdateState }
    function  GetUpdateState : boolean;
  protected
    { methode abstraite a surcharger pour adapter TUpdateControl a vos besoins }
    procedure SetUpdateState(const Updating: Boolean); virtual; abstract;
  public
    constructor Create; //override; si besoin
    { debut de la mise a jours, doit etre suivie par un Try...Finally }
    procedure BeginUpdate;
    { fin de la mise a jours, doit figurer dans le Finally }
    procedure EndUpdate;
    { propriété permettant de connaitre l'etat de la mise a jours }
    property UpdateState : boolean read GetUpdateState;
  end;

{ implementation }

{ TUpdateControl }

constructor TUpdateControl.Create;
begin
  // inherited Create; si besoin
  {mise a zero du compteur de mise a jours }
  fUpdateCount := 0;
end;

procedure TUpdateControl.BeginUpdate;
begin
  { appel SetUpdateState avec True si on part de 0 }
  if fUpdateCount = 0 then
     SetUpdateState(True);
  { incremente le compteur de mise a jours }
  fUpdateCount := fUpdateCount + 1;
end;

procedure TUpdateControl.EndUpdate;
begin
  { decremente le compteur de mise a jours }
  fUpdateCount := fUpdateCount - 1;
  { appel SetUpdateState avec False si on reviens a 0 }
  if fUpdateCount = 0 then
     SetUpdateState(False);
end;

function TUpdateControl.GetUpdateState : boolean;
begin
  { renvois True si fUpdateCount est different de 0
    ce qui sous entend qu'il y a deja eu un appel
    a l'une des methode BeginUpdate ou EndUpdate }
  result := fUpdateCount <> 0;
end;
   
Il ne reste plus qu'a interroger la propriété UpdateState pour savoir si une méthode
ou un évènement ne doit plus être exécuter tant que la mise a jours est en cours,
exemple d'utilisation dans votre composant :

procedure AppelEvenement;
begin
  { arrête la méthode si le composant est en cours de mise a jours }
  if UpdateState then
    Exit;
  
  { ce code ne serat pas exécuter si UpdateState est a True }
  if Assigned(fEvenement) then
    fEvenement(arguments);
end;

Note : n'oubliez pas que BeginUpdate et EndUpdate s'appellent comme ceci dans
votre programme :

procedure Methode;
begin
  { S'utilise dans un bloc Try...Finally pour s'assurer de decrementation
    du compteur de mise a jours. }
   MonComposant.BeginUpdate;
  Try
    { code }
  Finally
    MonComposant.EndUpdate;
  end;
end;



Snippets en rapport avec : Propriété, Evenement, Beginupdate, Endupdate, Update



Codes sources en rapport avec : Propriété, Evenement, Beginupdate, Endupdate, Update

{C# / C#.NET} GESTION D'ÉVENEMENTS INTER FORM
Bonjour, Je poste ce premier squelette pour aider les personnes désireuses de gérer des Form enfa...

{PHP} GÉNÉRATEUR SQL D'INSERTION OU DE MISE À JOUR
Cette fonction permet de générer automatiquement un SQL INSERT ou UPDATE par l'entremise d'un tablea...

{Visual Basic, VB6, VB.NET, VB 2005} XGUPDATE (XML + HTTP)
Logiciel permettant de mettre à jour par ex : un de vos programmes. Le tout en n'ajoutant qu'un fich...

{C# / C#.NET} SCANNER IP
C'est un simple scanner ip permettant de reconnaitre un certains nombres de port, programmer en csha...

{Visual Basic, VB6, VB.NET, VB 2005} LAUNCHER - VÉRIFICATEUR DE NOUVELLE VERSION AVANT EXÉCUTION D'UNE APPLICATION (OU D'UN FICHIER DÉPENDANT D'UNE APPLICATION)
Bonjour, Cette application sert à exécuter un exécutable ou un fichier nécessitant une applicatio...

{Visual Basic, VB6, VB.NET, VB 2005} LISTER LES PROPRIÉTÉS, EVENTS, SUBS D'UNE FORM
Bonjour a tous, Il me semble n'avoir pas vu beaucoup de source traitant ce genre sujet, cette so...

{C# / C#.NET} PROPRIÉTÉS D'EXTENSION AVEC C# 3.0
Ceci est un code qui permet de simuler des propriétés d'extension grâce à aux méthodes d'extension d...

{Visual Basic, VB6, VB.NET, VB 2005} APPLICATION AUTO UPDATE IN VB.NET
Ce code permet de faire un auto update de fichiers depuis un serveur web dans votre application, (co...

{Delphi} ECRIRE DANS L'OBSERVATEUR D'ÉVÉNEMENT WINDOWS
Ce code est un exemple d'écriture dans l'obervateur d'événement ... Apparement, on pourrait même éc...

{C# / C#.NET} CASSE BRIQUE DEBUTANT
C'est une petite application qui implémente un casse brique. il y a 3 niveaux, gestion du score, d...