StringList.OnChange

Verweis: stringlisten StringList.OnChanging
Uses: Classes
Eingabe: EineAdresse
Ausgabe: Sprungpunkt
Funktion: löst ein Ereignis aus nachdem eine Liste geändert wurde.

Hier haben wir das Stringlisten-Ereignis “OnChange”, welches nach einer Änderung in einer Liste in Aktion tritt. In dem Beispiel müssen Sie diesmal das ganze Programm ersetzen und nicht nur das OnClick-Ereignis von Button1. Wenn Sie den Artikel über “StringList.OnChanging” auf dieser Seite noch nicht gelesen haben, dann sollten Sie das nun nachholen. Hier wird Ihnen erklärt wie sie ein Ereignis erstellen welches vorhanden aber nicht über den Objektinspektor verfügbar ist.

Beispiel 1

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton und TMemo auf die Form. Doppelklicken sie auf den Button und ersetzen Sie den gesamten Quelltext:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Liste: TStringList;
    procedure Button1Click(Sender: TObject);
    procedure ListeChange(Sender: TObject);
  private
  public

  end;

var
  Form1: TForm1;
  GlobalIndex:Integer;
implementation

{$R *.lfm}

{ TForm1 }



procedure TForm1.ListeChange(Sender: TObject);
begin
  if Liste.Count>Globalindex then
  ShowMessage('Es wurde was hinzugefügt.');
  if Liste.Count<Globalindex then
  ShowMessage('Es wurde was gelöscht.');
  GlobalIndex:=Liste.Count;
end;


procedure TForm1.Button1Click(Sender: TObject);
const
  Farben: array[0..3] of string =
    ('rot', 'grün','gelb','weiß');
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  Liste.Sorted:=False;
  // nach dem Erstellen der Liste gleich
  // Die Adresse der Ereignissse bekannt geben
  // ist wenn die Änderung durchgeführt wurde
  Liste.OnChange := @ListeChange;
  // Array hinzufügen
  liste.AddStrings(Farben);
  // Memo übertragen.
  memo1.Lines := liste;
  ShowMessage('Nachdem Zufügen löschen wir mal.');
  // Anweisung zum löschen
  liste.Delete(2);
  // Anweisung zum löschen
  liste.Delete(1);
  // Memo übertragen.
  memo1.Lines := liste;
  //Wie immer Speicher freigeben
  Liste.Free;
end;

end.

Wenn uns das Ereignis automatisch erstellen lassen , dann ist es als Privat deklariert. Dies können wir dann gebrauchen, wenn wir auf die Komponenten unseres Formulars nicht zugreifen wollen. Dies möchten wir hier in dem Beispiel aber. Deswegen weisen wir unsere Ereigniss hier zu:

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Liste: TStringList;
    procedure Button1Click(Sender: TObject);
    procedure ListeChange(Sender: TObject);
  private

Wie wir sehen ist das Ereignis “ListeChange” ein offizieller Teil des Formulars “TForm”. Was den Vorteil hat, dass wir nun in dem Ereignis auf unsere Liste zugreifen können.

procedure TForm1.ListeChange(Sender: TObject);
begin
  if Liste.Count>Globalindex then
  ShowMessage('Es wurde was hinzugefügt.');
  if Liste.Count<Globalindex then
  ShowMessage('Es wurde was gelöscht.');
  GlobalIndex:=Liste.Count;
end;

Unser Ereignis prüft die Anzahl der Listen-Einträge mit der Zahl die in unsere globalen Index-Variable steht. Sollte die Anzahl kleiner sein dann wurde ein Eintrag gelöscht und sollte die Zahl größer sein, dann wurde ein Eintrag hinzugefügt. Am Ende wird die Globale IndexVariable wieder mit dem aktuellen Wert beschrieben.

Warum man diese Ereignisse nutzt.

Der Vorteil von diesen Ereignissen ist, das sie egal wo funktionieren. Allerdings darf dann die Liste nicht bei einem Button-OnClick Ereignis erstellt werden sondern bei dem Aktivieren des Hauptformulars. Hier ist dann auch sichergestellt das die Liste auch bereits erzeugt ist. Wenn sich dann die Liste entweder durch einen Opendialog oder durch einen Button oder durch ein Editfeld, ändern sollte, dann brauche ich mich um den Umgang mit dem neuen Eintrag nicht kümmern, da er ja automatisch, bei der Änderung der Liste in Kraft tritt. Fazit der Aufwand mit dem erstellen eines Ereignisses in einer Liste lohnt sich nur wenn wir von mehreren Stellen auf das Ereignis zugreifen. Dies bedeutet für die Liste bei jeder Änderung und das kann in einem Programm sehr häufig vorkommen.