Delphi-PRAXiS

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)

Marco Steinebach 15. Jul 2021 20:17

Objekt im onCreate erzeugen, aber wie?
 
Hallo zusammen,
Ich habe eine von TEdit abgeleitete Klasse. Die soll ein TLabel auf die Form bringen, wenn man sie benutzt.
Auf Deutsch: in das TEdit sollen Datumswerte hinein, und ich hätte gern, dass daneben, erzeugt von meiner abgeleiteten Klasse, ein TLabel erzeugt wird, in dem der zugehörige Wochentag erscheint.
Schreibe ich im onCreate meines TEdits
Code:
fLabel := TLabel.create (fOwner);
fliegt mir schon der designer um die Ohren, ist ja auch irgendwie klar, das ist ja auch noch alles nicht fertig.
Geht sowas überhaupt, und wenn ja, wie?

Herzlich grüßt
Moo

jaenicke 15. Jul 2021 20:54

AW: Objekt im onCreate erzeugen, aber wie?
 
Was für eine Fehlermeldung kommt denn?

Leite doch einfach von TLabeledEdit ab oder schau rein wie das gemacht ist. Oder vielleicht reicht dir das ja auch schon. ;-)

stahli 15. Jul 2021 20:56

AW: Objekt im onCreate erzeugen, aber wie?
 
Schau mal, ob Dir AfterCreate hilft: https://www.swissdelphicenter.ch/de/...de.php?id=1276

Marco Steinebach 15. Jul 2021 21:17

AW: Objekt im onCreate erzeugen, aber wie?
 
Hallo Zusammen,
@Stali: toll, das After Create hilft zwar hier nicht, aber das ist alle mal besser, als es mit einem Timer zu lösen - super, jetzt wird die Nacht noch länger.

Zu meinem eigentlichen Problem (TLabeledEdit) hab ich in meinem Uralt-Delphi leider noch nicht:
Code:
constructor TMsDatumCombo.create (aOwner: TComponent);
begin
  inherited create (aOwner);
  fOwner := aOwner;
  fShowLabel := true;
  fCaption := '';
  fLabel := TLabel.create (fOwner);
  with fLabel do
  begin
    left := self.left;
    top := self.top;
    focusControl := self;
    parent := self.parent;
    Caption := self.Caption;
  end;
  self.left := self.left + 120;
end;
Im Designer klappts, nur starte ich das Programm:
Exception Class TLabel not found.
Hääää?

Und wenn ich versuche, den Items in onCreate etwas hinzuzufügen, fliegt mir gleich der Objekt-Manager um die Ohren. Sprich, ich füge die Komponente ein:
Eltern-Objekt nicht vorhanden.

Ich bitte nochmal um Hilfe.

Herzliche Grüße

stahli 15. Jul 2021 22:10

AW: Objekt im onCreate erzeugen, aber wie?
 
Evtl. musst Du Deine Unit statt compilieren noch einmal neu installieren.
Erst durch das Installieren wird die Komponente in der neuen Form in der IDE vollständig registriert.

Marco Steinebach 15. Jul 2021 22:13

AW: Objekt im onCreate erzeugen, aber wie?
 
Huhu Stahli,
Bringt leider nichts...

stahli 15. Jul 2021 22:32

AW: Objekt im onCreate erzeugen, aber wie?
 
Kannst Du Deine Unit oder ein Testprojekt oder ein Video mal zeigen?

Ich glaube zwar nicht, aber vielleicht bringt Dir SetSubComponent etwas: https://www.delphipraxis.net/79726-u...der-gruen.html
Dann wird das Label mit seinen Eigenschaften mit in der Formulardatei abgelegt (was die Formulargröße etwas erhöht).

jaenicke 16. Jul 2021 05:52

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

Zitat von Marco Steinebach (Beitrag 1492372)
Zu meinem eigentlichen Problem (TLabeledEdit) hab ich in meinem Uralt-Delphi leider noch nicht:

Da es eine aktuelle Version für nicht-kommerzielle Zwecke kostenlos gibt, ist das ja kein Hindernis...

Zitat:

Zitat von Marco Steinebach (Beitrag 1492372)
Im Designer klappts, nur starte ich das Programm:
Exception Class TLabel not found.

Versuche es einmal ohne Owner. Vielleicht klappt das mit dem Lademechanismus der Daten des Formulars nicht, wenn du da eine zusätzliche Komponente in den Owner hängst, die zur Designzeit unter dem Namen gar nicht vorhanden war. Denn die Werte werden natürlich erst nach dem Ausführen des Konstruktors geladen.

hoika 16. Jul 2021 05:57

AW: Objekt im onCreate erzeugen, aber wie?
 
Hallo,
schreib mal unten ein RegisterClass(TLabel) rein.

etwa so

Unit Kompi

Interface

Implementstion


Begin
RegistrClass
End

Und dahinter noch ein MessageBox.
Dann siehst du, ob der richtige Quellcode verwendet wird.

himitsu 16. Jul 2021 09:40

AW: Objekt im onCreate erzeugen, aber wie?
 
Wenn deine Komponente eine weitere "eigenständige" Komponente automatisch einfügen soll, dann muß sie den selben Owner bekommen. (aber das willst du ja nicht)

Deine Komponente ist Besitzer/Verwalter des Labels, also ist deine Komponente auch für die Erstellung/Freigabe verantwortlich.
* also dein Edit ist Owner des Labels (so macht es fast jeder Andere)
* oder der Owner ist NIL und du gibst im Destroy das Label selbst frei (unnötig umständlich)


Und zu TLabeledEdit
* jupp einfacher
* aber falls das mit dem Delphi 5 stimmt und nur jemand nicht zu faul war ausversehn vergessen hatte das einzustellen


PS: Ohne Clipping kann unter FMX das Label auch das Edit als Parent bekommen und dennoch außerhalb liegen.
Das erleichtert nochmal andere Dinge, wie Neuausrichtung, wenn das Edit verschoben wird, und die Skalierung.

Marco Steinebach 16. Jul 2021 11:27

AW: Objekt im onCreate erzeugen, aber wie?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,
Doch, doch, das meine Komponente Owner des Labels ist, ist völlig in Ordnung, ich bin nur nicht darauf gekommen das es geht.
Also heißt es bei mir jetzt:
Code:
constructor TMsDatumCombo.create (aOwner: TComponent);
begin
  inherited create (aOwner);
  fOwner := aOwner;
  fShowLabel := true;
  fCaption := '';
  fLabel := TLabel.create (self); // so???
  with fLabel do
  begin
    left := self.left;
    top := self.top;
    focusControl := self;
    parent := self.parent;
    Caption := self.Caption;
  end;
  self.left := self.left + 120;
end;
Das funktioniert fehlerlos, Problem ist, dass der Label nicht zu sehen ist, jedenfalls nicht für meinen Screenreader (Deshalb übrigens auch immernoch D5 ;-)).
Ist ja auch eigentlich klar, dann das Besitzende Form hat ihn ja nicht in seiner Komponentenliste...
Hab ich da noch einen Fehler drin?
Löse ich das ganze über eine Methode (init), die im onShow des Formulars aufgerufen wird, ist alles schön, aber das ist natürlich nicht der Sinn. ;-)

Könnt ihr euch das bitte nochmal anschauen?
Ich häng' mal den Quelltext dran.
Herzlich grüßt
Moo

himitsu 16. Jul 2021 11:33

AW: Objekt im onCreate erzeugen, aber wie?
 
Im Create ist Parent noch nicht zugewiesen ... kann auch nicht. (das Einzige, was du hast, ist der Owner-Parameter)

Aber du kannst SetParent deiner Komponente überschreiben und darin auch das Label aktualisieren.

Marco Steinebach 16. Jul 2021 11:56

AW: Objekt im onCreate erzeugen, aber wie?
 
Hallo Himitsu,
Erstmal Danke für deine Hilfe.
Fehlermeldungsfrei, aber das Label ist immernoch nicht zu sehen.
Code:
  protected
    { Protected-Deklarationen }
    procedure setParent (aParent: TWinControl); override;
.....
constructor TMsDatumCombo.create (aOwner: TComponent);
begin
  inherited create (aOwner);
  fShowLabel := true;
  fCaption := '';
  fLabel := TLabel.create (self);
  with fLabel do
  begin
    left := self.left;
    top := self.top;
    focusControl := self;
    Caption := self.Caption;
  end;
  self.left := self.left + 120;
end;

procedure TMsDatumCombo.setParent (aParent: TWinControl);
begin
  fLabel.parent := aParent;
  inherited setParent (aParent);
end;
Noch eine Idee, warum das Label nicht angezeigt wird?
Und, Frage 2: wo kann ich Werte für die Items einer ComboBox vorgeben, im onCreate jedenfalls nicht...

Herzlich grüßt
Moo

Delphi.Narium 16. Jul 2021 12:10

AW: Objekt im onCreate erzeugen, aber wie?
 
Eventuell so?
Delphi-Quellcode:
constructor TMsDatumCombo.create(aOwner: TComponent);
begin
  inherited create(aOwner);
  fShowLabel := true;
  fCaption := '';
  fLabel := TLabel.create(self);
  fLabel.Parent := Self;
  fLabel.left := left;
  fLabel.top := top;
  fLabel.focusControl := self;
  fLabel.Caption := Caption;
  self.left := self.left + 120;
end;

Rolf Frei 16. Jul 2021 12:28

AW: Objekt im onCreate erzeugen, aber wie?
 
Du solltest noch SetBounds überschreiben und da die Position deines Labels anpassen. Wenn die Grösse des Edits verändert wird, passt sonst die Position deines Lables nicht mehr. Das Label wird direkt hinter dem Edit platziert und daher siehst du es auch nicht.

Rollo62 16. Jul 2021 12:38

AW: Objekt im onCreate erzeugen, aber wie?
 
Vielleicht sollte man das besser in einer überladenen .Loaded; Funktion machen, da sollte schon das Meiste hochgefahren sein ?
http://docwiki.embarcadero.com/RADSt..._After_Loading
http://docwiki.embarcadero.com/RADSt..._After_Loading

Im Create würde ich möglichst wenig machen.

Rolf Frei 16. Jul 2021 12:44

AW: Objekt im onCreate erzeugen, aber wie?
 
Nein das ist eine dumme Idee, da so sonst nur Komponenten, die zur Designtime auf die Form geklatscht wurden, richtig wären und solche, die man zu Runtime erstellt, nicht funktionieren würden. Loaded wird nur aufgerufen, nachdem die Daten aus dem DFM eingelesen wurden. Bei einer zur Runtime erstellten Komponente passiert das nie.

Was er da im Create macht ist soweit schon richtig, nur braucht es da noch etwas mehr Arbeit und das Überschreiben von weiteren Methoden, damit das Label immer richtig platziert wird, wenn sich die Grösse des Edit ändert. Asserdem sollte man da auch auf die Skalierueng achten und und mit Edit.Left + Edit.Width + x die neune Position des Labels bestimmen.

Rollo62 16. Jul 2021 12:51

AW: Objekt im onCreate erzeugen, aber wie?
 
Ok, dann würde ich aber die internen Komponenten möglichst mit Align (TAlignLayout) und Margins definieren, und nicht mit festen Positionen.

Rolf Frei 16. Jul 2021 12:57

AW: Objekt im onCreate erzeugen, aber wie?
 
Margin wird es in seiner "Uralt" Delphi Version noch nicht geben. In D7 gibt es das zumindest noch nicht. SetBounds ist genau richtg um das Label zu platzieren, weil das immer bei einer Änderung der Grösse oder Position des Edit aufgerufen wird.

Wenn ich das Create anschaue, wird das Label direkt hinter dem Edit platziert und ist deswegen auch nicht sichtbar. Da müsste Label.Left := Edit.Left + Edit.Width + x sein oder halt je nachdem wo er es haben will.

Delphi.Narium 16. Jul 2021 13:57

AW: Objekt im onCreate erzeugen, aber wie?
 
Noch ein Versuch:
Delphi-Quellcode:
constructor TMsDatumCombo.create(aOwner: TComponent);
begin
  inherited create(aOwner);
  fShowLabel := true;
  fCaption := '';
  fLabel := TLabel.create(self);
  fLabel.Parent := Self;
  fLabel.left := left;
  fLabel.top := top;
  fLabel.focusControl := self;
  fLabel.Caption := Caption;
  fLabel.Height := Height; // Wie sieht es mit der Höhe eines Labels aus, dem keine Höhe zugewiesen wurde?
  fLabel.Width := 120; // Wie breit ist bei Delphi 5 ein TLabel, dem keine Breite zugewiesen wurde? Zufällig 0, dann kann es nicht sichtbar sein.
  left := left + fLabel.Width;
end;

Rolf Frei 16. Jul 2021 14:32

AW: Objekt im onCreate erzeugen, aber wie?
 
Das geht so nicht, weil die Position des Edits im DFM gespeichert ist. Beim Laden der DFM wird die Position des Edit wieder an die Position gesetzt, wie es designed wurde. Das Label ist dann aber an der selben Postion wie im Create. Die Positionierung von Subkomponenten muss im SetBounds gemacht werden, alles andere kann nicht funktionieren.

Das heisst: Die Position des Edits ist durch das DFM vorgegeben und es muss die Position der Subkomponente entsprechend angepasst werden und nicht anders rum, wie bei dir, wo du die Hauptkomponente am Label anpassen willst. Das kann nicht funktionieren.

himitsu 16. Jul 2021 14:53

AW: Objekt im onCreate erzeugen, aber wie?
 
anstatt SetBounds ginge auch WM_WINDOWPOSCHANGED,
bzw. das geht auch dann, wenn das Edit von extern (nicht über die VCL) verschoben würde.


Delphi-Quellcode:
protected
  procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
(inherited nicht vergessen)

Rolf Frei 16. Jul 2021 15:35

AW: Objekt im onCreate erzeugen, aber wie?
 
SetBounds ist der offiziele Delphi Weg wie man das macht. Wird die Message auch bei Grössenänderung verschickt, also die Position die gleiche bleibt, aber die Höhe/Länge geändert wird? Des weiteren ist das platformunabhängig, wenn man die Delphi Klassen-Methoden, die dafür vorgesehen sind, nutzt.

Marco Steinebach 16. Jul 2021 15:57

AW: Objekt im onCreate erzeugen, aber wie?
 
Hallo zusammen,
Aaaalso:
Code:
  fLabel.parent := self.parent;
geht, wie Himitsu schon geschrieben hat, im onCreate nicht, wird ja von setParent übernommen.
Blöde frage: laut meinem Code wird der Label an der Position, wie das Edit, erstellt, und, anschliessend, wird das Edit um 120 nach rechts verschoben (Scalierung und co kriegen wir, denke ich, später, wenn das Ding überhaupt zu sehen ist. ;-)
D.h. an der ursprünglichen Position steht das Label, und 120 pixel weiter rechts, das zugehörige Feld, sollte jedenfalls. ;-)
Rufe ich meine Methode init, im FormShow, auf, funktioniert alles wunderbar:
Code:
procedure TMsDatumCombo.init;
begin
  fLabel := TLabel.create (self);
  with fLabel do
  begin
    left := self.left;
    top := self.top;
    focusControl := self;
    Caption := self.Caption;
  end;
  self.left := self.left + 120;
  with items do
  begin
    clear;
    add ('vorgestern');
    add ('gestern');
    add ('heute');
    add ('nächster Tag');
    add ('übermorgen');
    add ('Sonntag');
    add ('Montag');
    add ('Dienstag');
    add ('Mitwoch');
    add ('Donnerstag');
    add ('Freitag');
    add ('Samstag');
  end;
end;
Warum funktioniert das da, aber im onCreate nicht?
Schaue ich mir form1.components an, da steht meine Combobox drin, aber das Label nicht, kann es nicht sein, dass es deshalb nicht zu sehen ist?
Gibt es nicht irgendwo einen Weg dem Formular die Komponente hinzuzufügen?

Etwas verzweifelte Grüße
Moo

himitsu 16. Jul 2021 16:01

AW: Objekt im onCreate erzeugen, aber wie?
 
Der Parent kann auch mehrmals zugewiesen/geändert werden.
Da drin also das TLabel.Create, ohne ein Assigned, wäre nicht sehr hilfreich.


Zitat:

laut meinem Code wird der Label an der Position, wie das Edit, erstellt, und, anschliessend, wird das Edit um 120 nach rechts verschoben
Da das Label seine Position speichert und lädt, darft nicht das Edit, sondern muß das Label verschoben werden.
Sonst wird bei jedem Laden und anschließendem Speichern das ganze immer mehr verschoben, bis es weg ist (außer Sichtweite).

Rolf Frei 16. Jul 2021 16:10

AW: Objekt im onCreate erzeugen, aber wie?
 
Wenn du die Komponente zur Runtime erstellst, würde es gehen, aber das ist ja nicht das was wir wollen.

Die Position wird zur Runtime aus dem DFM geladen und dann ist das was du im Create machst nicht mehr aktuell. Nach dem Laden enspricht Edit.Left dem, wie es du in der Form platziert hast. Dein Label ist aber immer noch an der Stelle wie du es im Create platziert hast. Wenn das Edit, deine Hauptkomponente, die Grösse oder Position ändert, musst du auch die Position des Labels anpassen. Das kannst du ganz einfach im überschriebenen SetBounds machen.

Delphi-Quellcode:
procedure TMsDatumCombo.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  FLabel.Left := Left - FLabel.Width - x; // x wäre der Abstand zwischen den Edit und dem Label
  FLabel.Top := Top;
end;
Für dein Parent Problem gibt es auch eine Methode die du überschreiben kannst:
Delphi-Quellcode:
procedure TMsDatumCombo.SetParent(AParent: TWinControl);
begin
  inherited;
  FLabel.Parent := AParent;
end;
Für das Listbox Problem wüsste ich im Moment selber nicht genau wo ich das am besten machen würde. Würde eigentlich erwarten, dass das im Konstruktor schon geht, denke aber, dass das eben auch beim Laden der Form gelöscht wird. Müsste das auch genauer anschauen.

Versuch doch mal in deiner Komponente das Items als nicht stored zu definierern, damit die Items nicht im DFM gespeichert werden. Dein Package mit der Komponente musst du natürlich neu kompilieren, damit das geht.
Delphi-Quellcode:
  TMsDatumCombo= class(TCombobox)
  published
    property Items; stored False;
  end;
Wenn du das Items property eventuell komplett "ausschalten" willst, damit es im Designer nicht mehr sichtbar ist, mach folgendes in deiner Register Procedure der Komponente. Bin aber nicht sicher ob es das in D5 schon gab.
Delphi-Quellcode:
uses DesignIntf;
...
procedure Register;
begin
  ...
  UnlistPublishedProperty(TMsDatumCombo, 'Items');
end;

Marco Steinebach 16. Jul 2021 17:39

AW: Objekt im onCreate erzeugen, aber wie?
 
Hallo zusammen und herzlichen Dank für eure Geduld,
Habs jetzt umgesetzt, ist aber immeernoch nix zu sehen.
Sagt mal: woher weiß der Label eigentlich, welche Caption er nehmen soll, das hab ich nämlich nicht drin.
Denn ich sage ja, was ich inzwischen entfernt habe:
caption := '';
und gleich danach:
fLabel.caption := self.caption; // sprich auch: '';
Toll! ;-)
D.h. ich müßte doch irgendwo, aber wahrscheinlich nicht im onCreate, sagen:
fLabel,Caption := self.Caption.
Aber wo?

Herzlich grüßt
Moo

Rolf Frei 16. Jul 2021 17:52

AW: Objekt im onCreate erzeugen, aber wie?
 
Versuch nochmals genauer zu beschreiben was du genau machen willst. In deinem ersten Post redest du von einem TEdit und dann auf einmal von einer Combox. Der Text in einer Combobox heist nicht Caption, sondern eben Text. Was ich nicht so recht verstehen kann, ist wozu das Label brauchst wenn der Text doch bereits in der Combobox angezeigt wird. Im Prinzip müsstest du den Text im Label neu setzten, wann immer der Anwender eine Auswahl macht.

Dalai 16. Jul 2021 18:03

AW: Objekt im onCreate erzeugen, aber wie?
 
Delphi-Referenz durchsuchenTLabel.AutoSize ist standardmäßig true. Solange TLabel.Caption leer ist, wird das Label daher so klein und unbeschriftet sein, dass man es nicht sieht. Die Größe des Labels zu setzen, hat bei aktiviertem AutoSize auch wenig Sinn...

Grüße
Dalai

Marco Steinebach 16. Jul 2021 18:28

AW: Objekt im onCreate erzeugen, aber wie?
 
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

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 23:25 Uhr.

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