AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wozu haben Komponenten Namen?

Ein Thema von Der schöne Günther · begonnen am 28. Okt 2013 · letzter Beitrag vom 28. Okt 2013
Antwort Antwort
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Wozu haben Komponenten Namen?

  Alt 28. Okt 2013, 11:37
Ich glaube hier findet ständig eine Verwechselung statt zwischen den Komponenten-Namen und den Variablen-Namen. Der Komponenten-Name dient ausschließlich der Zuordnung von gestreamten Resourcen zu den korrekten Variablen beim Laden der Formulare.

Im dfm wird dann vom Reader erkannt, dass:
  object Label1: TLabel hiermit verknüpft werden soll:
Delphi-Quellcode:
TForm1 = class(TForm)
  Label1: TLabel;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.687 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wozu haben Komponenten Namen?

  Alt 28. Okt 2013, 12:17
Ich glaube hier findet ständig eine Verwechselung statt zwischen den Komponenten-Namen und den Variablen-Namen. Der Komponenten-Name dient ausschließlich der Zuordnung von gestreamten Resourcen zu den korrekten Variablen beim Laden der Formulare.

Im dfm wird dann vom Reader erkannt, dass:
  object Label1: TLabel hiermit verknüpft werden soll:
Delphi-Quellcode:
TForm1 = class(TForm)
  Label1: TLabel;
Das hat eigentlich gar nichts mit dem Streaming zu tun. Wenn du eine Klasse von TComponent ableitest und darin ein Feld mit einem ebenfalls von TComponent abgeleiteten Typ mit der passenden Sichtbarkeit (published) deklarierst, dann wird dieses Feld bei einem Aufruf von InsertComponent mit einer Instanz als Parameter, deren Name dem Feldnamen entspricht, genau auf diese Instanz gesetzt. Deshalb dürfen die Komponentennamen der Child-Komponenten auch nur eindeutig innerhalb der Parent-Komponente oder leer sein (weil ein Leerstring ja kein Variablenname ein kann).

Insofern würde das obige Beispiel:

Delphi-Quellcode:
   newButton := TButton.Create(self);
   newButton.Name := 'Testbutton';
   newButton.Parent := self;

...


   testButton.Click();

durchaus funktionieren, wenn testButton entsprechend als Feld im Form deklariert ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.049 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Wozu haben Komponenten Namen?

  Alt 28. Okt 2013, 12:21
Um es noch etwas zu verdeutlichen:
Wenn du eine Komponente zur Designzeit plazierst, generiert die IDE dafür eine Feldvariable im published Teil deines Forms (Frames, Datamodules, ...).
Diese wird so genannt, wie du im ObjektInspektor in der Eigenschaft Name einstellst. Somit kannst du deiner Komponente einen vernünftigen Namen verpassen (die IDE sorgt dafür, dass die Feldvariable auch passend umbenannt wird), um dich nicht hinterher im Sourcecode zu fragen, wofür nochmal Button24 oder TListbox17 waren.

Fun fact:
Wenn du niemals auf deinen Button im Sourcecode zugreifst, kannst du sogar die Feldvariable entfernen (nicht empfohlen) und dein Programm funktioniert noch - mit der kleinen Einschränkung, dass diese Klasse mit RegisterClass registriert werden muss, da sonst der dfm Streaming Mechanismus fehlschlagen würde, weil in diesem Fall aus dem Klassennamen, die in der dfm steht, eine Instanz der entsprechenden Klasse erzeugen muss.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (28. Okt 2013 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.687 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wozu haben Komponenten Namen?

  Alt 28. Okt 2013, 13:02
Fun fact:
Wenn du niemals auf deinen Button im Sourcecode zugreifst, kannst du sogar die Feldvariable entfernen (nicht empfohlen) und dein Programm funktioniert noch - mit der kleinen Einschränkung, dass diese Klasse mit RegisterClass registriert werden muss, da sonst der dfm Streaming Mechanismus fehlschlagen würde, weil in diesem Fall aus dem Klassennamen, die in der dfm steht, eine Instanz der entsprechenden Klasse erzeugen muss.
Fun Fact 2:
Der Typ der Feldvariablen muss nicht mal der Klasse in der dfm entsprechen, solange beide von TComponent abgeleitet sind.

Delphi-Quellcode:
program FunFact2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes;

type
  TChild1 = class(TComponent)
  private
    FValue: Integer;
  public
    property Value: Integer read FValue write FValue;
  end;

  TChild2 = class(TComponent)
  private
    FValue: Boolean;
  public
    property Value: Boolean read FValue write FValue;
  end;

  TParent = class(TComponent)
  published
    Child: TChild1;
  end;

procedure Main;
var
  parent: TParent;
  child: TChild2;
begin
  parent := TParent.Create(nil);
  try
    child := TChild2.Create(nil);
    child.Name := 'Child';
    child.Value := true;
    parent.InsertComponent(child);
    Writeln(Parent.Child.Value);
    child.Value := false;
    Writeln(Parent.Child.Value);
  finally
    parent.Free;
  end;
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz