Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

Methodenzeiger zur Designtime

  Alt 31. Mär 2011, 11:43
Mahlzeit!

Meine Problemstellung: Ich habe auf einem Formular diverse Komponenten unterschiedlicher Klassen sitzen, und diese sollen eine Beschriftung in Form eines Labels erhalten. Diese Beschriftung ergibt sich im Regelfall aus dem Namen der zu beschriftenden Komponente, es können aber Variationen nach diversen Regeln vorkommen (z.B. eine zweite Komponente spendiert einen Teil der Beschriftung, oder es sind Zeichen zu entfernen, etc.). Die Anzahl, Art, Anordnung und Funktion der Komponenten ist dabei völlig beliebig, d.h. ich kann keine "Labeled"-Komponenten erstellen, bzw. würde das die gewünschte Arbeitsersparnis nicht aufwiegen.
Das ganze muss noch unter Delphi 7 gehen.

Eine eigene Label-Komponente habe ich bereits, die würde ich gern dahin gehend erweitern. Meine Idee so weit:
Delphi-Quellcode:
  TMyLabelBuilder = procedure(var Output: String; String1, String2, String3, String4: String) of object;
  TMyLabel = class(TGraphicControl)
  private
    FCaption: String;
    FSource1: TComponent;
    FSource2: TComponent;
    FSource3: TComponent;
    FSource4: TComponent;
    FOnBuild: TMyLabelBuilder;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Caption: String read FCaption write SetCaption;
    property Source1: TComponent read FSource1 write SetSource1;
    property Source2: TComponent read FSource2 write SetSource2;
    property Source3: TComponent read FSource3 write SetSource3;
    property Source4: TComponent read FSource4 write SetSource4;
    property OnBuildCaption: TMyLabelBuilder read FOnBuild write SetOnBuild;
  end;

implementation

procedure TMyLabel.Paint;
var
  s1, s2, s3, s4: String;
begin
  inherited;

  if Assigned(FOnBuild) then
  begin
    if Assigned(FSource1) then s1 := FSource1.Name else s1 := '';
    if Assigned(FSource2) then s2 := FSource2.Name else s2 := '';
    if Assigned(FSource3) then s3 := FSource3.Name else s3 := '';
    if Assigned(FSource4) then s4 := FSource4.Name else s4 := '';
    FOnBuild(FCaption, s1, s2, s3, s4);
  end;
  // Eigentliches Zeichnen
end;
Ich setze dann ein solches Label auf ein Formular, und schreibe dort einen Event-Handler für OnBuildCaption. Problem: Assigned(FOnBuild) scheint zur Designtime immer false zu sein, sprich die eigentliche Zuweisung der Methode findet nicht statt. Ließe sich das ähnlich, oder ggf sogar ganz anders lösen?
Ich könnte natürlich auf die Designtime verzichten, und dort mit einer Dummy-Caption arbeiten, aber es wäre erheblich komfortabler dort gleich die richtigen zu sehen. Besonders um die Platzierung besser handhaben zu können.

Bevor jemand fragt: Sinn des ganzen ist, dass solche Komponentengrüppchen bei uns oftmals einmalig erstellt werden, und dann vielfach und ggf. leicht abgewandelt kopiert werden, wobei sich die ganzen Namen der Komponenten ändern. Ich will mir/uns also im Grunde das zusätzliche manuelle Ändern der Beschriftungen ersparen. Das wäre ein erheblicher Zeitfaktor der sich so eliminieren ließe.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat