Announcement

Collapse
No announcement yet.

Komponten im IDesigner suchen und bearbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Komponten im IDesigner suchen und bearbeiten

    Hallo,

    folgendes Problem:
    Ich erstelle im Designmodus eine Komponente auf einer Form.
    Danach erstelle ich eine zweite Form und dort wieder die gleiche Komponente.

    Wenn ich nun eine bestimmte Eigenschaft der Komponente ändere, will ich, dass alle (!) anderen Komponenten im selben Projekt diese Änderung mitbekommen, auch wenn sie auf anderen Forms liegen.

    Das Problem ist, das GetProjectModules mir zwar alle Programmmodule liefert, aber nur das akutell bearbeitete instanziert ist, alle anderen Formen sind nil.

    Kann man trotzdem auf andere Komponente zugreifen?
    Wenn ja wie?

  • #2
    <i>Wenn ich nun eine bestimmte Eigenschaft der Komponente ändere, will ich, dass alle (!) anderen Komponenten im selben Projekt diese Änderung mitbekommen, auch wenn sie auf anderen Forms liegen.</i><br>
    Zur Designzeit kannst du das vermutlich knicken (bzw. es wird ein Heidenaufwand).
    Was hast du denn vor?
    <br>Uli

    Comment


    • #3
      Ich hab mal was zusammengeschrieben das helfen sollte:
      <PRE>
      unit TestNotifyLabel;

      interface

      uses
      Controls, Classes, SysUtils, Graphics, StdCtrls;

      type
      TNotifyLabel = class(TLabel)
      private
      function GetColor: TColor;
      procedure SetColor(const Value: TColor);
      protected
      procedure DoChange;
      procedure NotifierChange(const AColor: TColor);
      public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      published
      property Color: TColor read GetColor write SetColor;
      end;

      type
      TComponentNotifier = class
      private
      FList: TList;
      public
      constructor Create;
      destructor Destroy; override;
      procedure Register(AComponent: TNotifyLabel);
      procedure UnRegister(AComponent: TNotifyLabel);
      procedure NotifyAllOther(Sender: TNotifyLabel);
      end;

      var
      Notifier: TComponentNotifier;

      procedure Register;

      implementation

      procedure Register;
      begin
      RegisterComponents('Tests', [TNotifyLabel]);
      end;

      { TNotifyLabel }

      constructor TNotifyLabel.Create(AOwner: TComponent);
      begin
      inherited Create(AOwner);
      Notifier.Register(Self);
      end;

      destructor TNotifyLabel.Destroy;
      begin
      Notifier.UnRegister(Self);
      inherited Destroy;
      end;

      procedure TNotifyLabel.DoChange;
      begin
      Notifier.NotifyAllOther(Self);
      end;

      function TNotifyLabel.GetColor: TColor;
      begin
      Result := inherited Color;
      end;

      procedure TNotifyLabel.SetColor(const Value: TColor);
      begin
      inherited Color := Value;
      DoChange;
      end;

      procedure TNotifyLabel.NotifierChange(const AColor: TColor);
      begin
      inherited Color := AColor;
      end;

      { TComponentNotifier }

      constructor TComponentNotifier.Create;
      begin
      inherited;
      FList := TList.Create;
      end;

      destructor TComponentNotifier.Destroy;
      begin
      FreeAndNil(FList);
      end;

      procedure TComponentNotifier.NotifyAllOther(Sender: TNotifyLabel);
      var
      i: Integer;
      begin
      for i := 0 to Pred(Flist.Count) do
      begin
      if FList.Items[i] &lt;&gt; Sender then
      TNotifyLabel(FList.Items[i]).NotifierChange(Sender.Color);
      end;
      end;

      procedure TComponentNotifier.Register(AComponent: TNotifyLabel);
      begin
      // wenn bereits eine Componente eingetragen ist, dann die neue benachrichtigen:
      if FList.Count &gt; 0 then
      AComponent.NotifierChange(TNotifyLabel(FList.Items[0]).Color);
      // neue Compo eintragen
      FList.Add(AComponent);
      end;

      procedure TComponentNotifier.UnRegister(AComponent: TNotifyLabel);
      begin
      FList.Remove(AComponent);
      end;

      initialization
      Notifier := TComponentNotifier.Create;
      finalization
      FreeAndNil(Notifier);
      end.

      </PRE>

      Ich erzeuge einfach im initialization-Abschnitt eine Instanz welche eine Liste aller TNotifyLabel-Instanzen verwaltet, diese tragen sich über den Con-/Destructor automatisch ein und aus. Über das DoChange des Labels greife ich auf den Notifier zu und rufe das NotifierChange aller anderen Label auf.
      Wichtig ist nur hierfür eine getrennte Methode einzuführen um endlose DoChange-Aufrufe zu vermeiden.

      [EDIT]Sorry, die &lt;PRE&gt;Tags wollen scheinbar nicht so wie ich[/EDIT]

      MfG,
      Dir

      Comment

      Working...
      X