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;