Wenn du so richtig frei und losgelöst von allem programmieren möchtest, dann definierst du dir einfach ein Interface
Delphi-Quellcode:
type
IStringConsumer = interface
[ '{349D7AB4-F90B-416B-B31E-3E41AD5E5195}' ]
procedure Consume( const AString: string );
end;
und die Form hat dann
Delphi-Quellcode:
type
TForm1 = class( TForm )
Edit1 : TEdit;
procedure Edit1Change( Sender: TObject );
private
FStringConsumer : IStringConsumer;
end;
procedure TForm1.Edit1Change( Sender: TObject );
begin
if Assigned( FStringConsumer ) then
FStringConsumer.Consume( Edit1.Text );
end;
Jetzt kannst du ganz simpel irgendeinen StringConsumer dort unterjubeln, z.B. einen
Delphi-Quellcode:
type
TCheckBoxContainsStringConsumer = class( TInterfacedObject, IStringConsumer )
private
FCheckBox : TCheckBox;
FContainsString: string;
public
constructor Create( ACheckBox: TCheckBox; const AContainsString: string );
procedure Consume( const AString: string );
end;
{ TCheckBoxContainsStringConsumer }
procedure TCheckBoxContainsStringConsumer.Consume( const AString: string );
begin
FCheckBox.Checked := Pos( FContainsString, AString ) > 0;
end;
constructor TCheckBoxContainsStringConsumer.Create(
ACheckBox : TCheckBox;
const AContainsString: string );
begin
inherited Create;
FCheckBox := ACheckBox;
FContainsString := AContainsString;
end;
und irgendwo in einer Form-Methode erzeugst du eine Instanz
Delphi-Quellcode:
procedure TForm1.AfterConstruction;
begin
inherited;
FStringConsumer := TCheckBoxContainsStringConsumer.Create( CheckBox1, 'A' );
end;
und schon wird die Checkbox gesetzt ...
Möchtest du mehrere Consumer (z.B. CheckBoxen) ansteuern, dann erstellt man sich ganz einfach ein Aggregat:
Delphi-Quellcode:
TStringConsumerArray = array of IStringConsumer;
TAggregateStringConsumer = class( TInterfacedObject, IStringConsumer )
private
FConsumers: TInterfaceList;
public
constructor Create( AConsumers: TStringConsumerArray );
destructor Destroy; override;
procedure Consume( const AString: string );
end;
{ TAggregateStringConsumer }
procedure TAggregateStringConsumer.Consume( const AString: string );
var
LIdx: Integer;
begin
for LIdx := 0 to FConsumers.Count - 1 do
begin
IStringConsumer( FConsumers[ LIdx ] ).Consume( AString );
end;
end;
constructor TAggregateStringConsumer.Create( AConsumers: TStringConsumerArray );
var
LIdx: Integer;
begin
inherited Create;
FConsumers := TInterfaceList.Create;
for LIdx := low( AConsumers ) to high( AConsumers ) do
FConsumers.Add( AConsumers[ LIdx ] );
end;
destructor TAggregateStringConsumer.Destroy;
begin
FConsumers.Free;
inherited;
end;
und in der Form dann ganz einfach
Delphi-Quellcode:
procedure TForm1.AfterConstruction;
begin
inherited;
FStringConsumer :=
TAggregateStringConsumer.Create( [
TCheckBoxContainsStringConsumer.Create( CheckBox1, 'A' ),
TCheckBoxContainsStringConsumer.Create( CheckBox2, 'B' ),
TCheckBoxContainsStringConsumer.Create( CheckBox3, 'C' ),
TCheckBoxContainsStringConsumer.Create( CheckBox4, 'D' ),
TCheckBoxContainsStringConsumer.Create( CheckBox5, 'E' ),
TCheckBoxContainsStringConsumer.Create( CheckBox6, 'F' ),
TCheckBoxContainsStringConsumer.Create( CheckBox7, 'G' ),
TCheckBoxContainsStringConsumer.Create( CheckBox8, 'H' ),
// oder auf mehr Zeichen reagieren
TCheckBoxContainsStringConsumer.Create( CheckBox9, 'Hallo' ) ] );
end;
Die
TForm1.Edit1Change
Methode bleibt dabei immer gleich
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)