Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Objekt im onCreate erzeugen, aber wie? (https://www.delphipraxis.net/208331-objekt-im-oncreate-erzeugen-aber-wie.html)

haentschman 17. Jul 2021 08:29

AW: Objekt im onCreate erzeugen, aber wie?
 
Moin...:P

...deswegen funktioniert das nicht:

Zitat:

with fLabel do
with items do
Sorry ich konnte es mir nicht verkneifen...:lol:

Marco Steinebach 18. Jul 2021 11:00

AW: Objekt im onCreate erzeugen, aber wie?
 
Huhu,
Was konntest du dir nicht verkneifen?
with FLabel do // erstellt den Label
with Items do // bezieht sich auf die Combobox bzw. auf deren Items.
Das sind doch zwei völlig verschiedene Baustellen, wenn auch in der gleichen Methode?
Herzlich grüßt
Moo

Delphi.Narium 18. Jul 2021 11:37

AW: Objekt im onCreate erzeugen, aber wie?
 
Das Problem hierbei ist einfach nur die Benutzung von With. Wenn man Pech hat und sich ein bisserl verschreibt, kommt ggfls. trotzdem kompilierbarer Code heraus und bei der Fehlersuche wird es dann ggfls. sehr haarig.
Delphi-Quellcode:
with fLabel do
begin
  left := self.left;
  top := self.top;
  focusControl := self;
  parent := self.parent;
  Caption := self.Caption;
end;
Ist erstmal soweit ok.

Mir persönlich wäre es aber so deutlich lieber:
Delphi-Quellcode:
fLabel.left := left;
fLabel.top := top;
fLabel.focusControl := self;
fLabel.parent := parent;
fLabel.Caption := Caption;
Sollte ich in diesem Fall nämlich links von der Zuweisung ein Attribut nehmen, dass es bei TLabel nicht gibt, aber sehr wohl bei Self, bekäme ich eine Compilermeldung.

Wenn Self z. B. eine TCombobox ist, so kann dashier nicht funktionieren:
Delphi-Quellcode:
fLabel.left := self.left;
fLabel.top := self.top;
fLabel.focusControl := self;
fLabel.parent := self.parent;
fLabel.Caption := self.Caption;
fLabel.ItemIndex := self.ItemIndex;
Bei der Verwendung von With aber sehrwohl:
Delphi-Quellcode:
with fLabel do
begin
  left := self.left;
  top := self.top;
  focusControl := self;
  parent := self.parent;
  Caption := self.Caption;
  ItemIndex := self.ItemIndex;
end;
Links vom Gleichheitszeichen werden alle an der Stelle bekannten Attribute akzeptiert und nicht nur die, die zum with fLabel do gehören. Und da man Self nicht zwingend angeben muss, da alles, was ohne Self und ohne eine andere Komponente ... angegeben wird, automatisch Self zugeordnet wird, kann man sich hier schon ziemlichen "Strubbel" einhandeln, der trotzdem kompilierbar ist.

Ohne with ist das Auffinden von Fehlern schlicht und einfach deutlich einfacher, weil hier immer eine eindeutige Angabe der Attribute nötig ist.

Und ob ich links nun immer fLabel. davor schreibe und mir rechts das self. erspare, ist vom Schreibaufwand jetzt auch nicht so unbedingt ein großes Mengenproblem ;-)

Rolf Frei 19. Jul 2021 12:15

AW: Objekt im onCreate erzeugen, aber wie?
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1492437)
Hallo,
Mir ein bißchen Arbeit sparen.
Ich brauche ein TLabel, sagen wir:
Geburtsdatum
und rechts daneben, die Combobox. Das soll, wenn wir es zum Laufen kriegen, dann auch für die Kombi
TLabel mit TEdit
gehen.
Bislang hab ich halt, ganz normal ein TLabel erzeugt, beschriftet, dann das TEdit erzeugt. Da mein Projekt aber ziemlich viele solcher Felder hat dachte ich, ich könnte es vereinfachen. Daher hab ich der Combobox, meinetwegen auch dem TEdit, eine Caption mitgegeben, die dann aber das zugehörige Label kriegen soll.
Das sollte es werden. ;-)
Vielleicht ist ja mein ganzer Ansatz quatsch?

Herzlich grüßt
Moo

Dein Ansatz ist schon ok aber halt nicht ganz so simpel wie du vieleicht meinst. Dein Problem, das du nun noch hast, ist die Beschriftung des Labels, wenn du alles andere von mir gepostete implentiert hast. Dazu kannst du z.B. die Change oder Select Methode überchreiben. Das musst du selber testen, was dir da besser passt. Eventuell soll das Label auch erst beim Exit geändert werden, dazu gäbe es auch eine Methode.
Delphi-Quellcode:
TMsDatumCombo= class(TCombobox)
...
protected
  procedure Select; override;
...
end;

procedure TMsDatumCombo.Select;
begin
  inherited;
  FLabel.Caption := Text; // Hier kannst du den Labeltext setzen, je nach dem was ausgewählt wurde.
                          // Text ist der aktuell selektierte Eintrag in der Combo.
end;
Schau dir die doch bitte auch die Sourcen zu TCombobox und TEdit und deren Vorfahren an. Alles was da als Virtual oder Dynasmic deklariert ist, kannst du in einer abgeleiteten Komponente überschreiben und erweitern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz