StringList.OnChanging

Verweis: stringlisten StringList.OnChange
Uses: Classes
Eingabe: EineAdresse
Ausgabe: Sprungpunkt
Funktion: löst ein Ereignis aus bevor eine Liste geändert wird.

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;
    procedure Button1Click(Sender: TObject);
  private
    procedure ListeChange(Sender: TObject);
    procedure ListeChanging(Sender: TObject);

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.ListeChanging(Sender: TObject);
begin
  ShowMessage('Vorher');
end;

procedure TForm1.ListeChange(Sender: TObject);
begin
  ShowMessage('Nachher');
end;


procedure TForm1.Button1Click(Sender: TObject);
const
  Farben: array[0..1] of string =
    ('rot', 'grün');
var
  Liste: TStringList; //Verknüpfe Variable mit liste
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  // nach dem Erstellen der Liste gleich
  // Die Adresse der Ereignissse bekannt geben
  // On changing ist am Begin der Änderung
  Liste.OnChanging := @ListeChanging;
  // ist wenn die Änderung durchgeführt wurde
  Liste.OnChange := @ListeChange;
  // Array hinzufügen
  liste.AddStrings(Farben);
  // Memo übertragen.
  memo1.Lines := liste;
  ShowMessage('Jeweils 2 Aufrufe für das Einfügen von 2 Zeilen.');
  // Anweisung zum sortieren
  liste.Sorted := True;
  // Memo übertragen.
  memo1.Lines := liste;
  ShowMessage('Aber auch beim Sortieren wird das Ereignis aufgerufen.');
  //Wie immer Speicher freigeben
  Liste.Free;
end;

end.

Diesmal ist das Beispiel etwas länger. Diesmal sollten sie den Gesamten Quelltext ersetzen. Dies entbindet sie aber nicht davon das Memofeld und den Button nicht auf die Form zu ziehen, Diese Komponenten brauchen wir für die Durchführung der Übung trotzdem. Da aber der quelltext lang ist und es dementsprechend unübersichtlich ist hier hin und her zu scrollen werden wir einzelne Abschnitte besprechen. Fangen wir allerdings in der Mitte des Quelltextes an:

  Liste.OnChanging := @ListeChanging;

Wenn Sie nach dem Eintrag “Liste.OnChanging” die Shift+Control -Taste gedrückt halten und zusätzlich noch “C” tippen, dann aktivieren sie die Autovervollständigung von Lazarus. Es geschieht dann folgendes:

  private
    procedure ListeChange(Sender: TObject);
    procedure ListeChanging(Sender: TObject);

  public

In den Privatbereich der Unit wird die Procedure ListeChanging hinzugefügt. Dies braucht der Compiler hier im Kopfbereich, um während des Kompilierens die Adresse zuweisen zu können. Die wir hier mit:

@ListeChanging;

Zuweisen. Dabei bedeutet das “@” die Adresse. Als Letztes wird natürlich

procedure TForm1.ListeChanging(Sender: TObject);

Der Procedure Text erstellt den wir nach belieben mit Inhalt füllen können. Wichtig ist hierbei, das dieses Ereignis auch ein Teil von TForm1 geworden ist. Es gehört also zu dem Objekt und kann nicht eine eigene abgekoppelte Unit gepackt werden. Wenn sie diesen Vorgang bei:

  Liste.OnChange := @ListeChange;

wiederholen, dann bekommen sie analog dazu ein weiteres Ereignis zur Verfügung gestellt. Dieses heißt OnChange und bezeichnet den Zeitpunkt nach dem Einfügen.

Zum Programmablauf

Der Ablauf ist im Vergleich zum Aufwand relativ dürftig. Hier haben wir nun 2 Ereignisse die bei 2 Zeilen jeweils wechselseitig mit “Vorher” und “Nachher” aufgerufen werden. Dies war zu erwarten, da die Liste geändert wurde. Dennoch haben wir hier noch mal ein “Sorted := true” hinter geschickt, um ihnen zu zeigen dass, ein Aufruf zum sortieren ebenfalls diese Ereignisse auslöst. Dabei spielt es keine Rolle ob wirklich sortiert wird oder nicht. Was Sie mit den Ereignissen machen, bleibt Ihnen überlassen, wir haben hier nur “Vorher” und “Nachher” Schilder verteilt. Wenn Sie mehr über die Anwendung erfahren wollen, dann schauen Sie hier vorbei.