Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Checkbox aktivieren bei bestimmten buchstaben in TEdit

  Alt 25. Aug 2015, 22:40
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)
  Mit Zitat antworten Zitat