ich hab mal wieder ein "kleines" Problemchen, was mehr und mehr zu einem Großen wird.
Eigentlich nur eine Schönheitskorrektur für meiner Komponente.
Ich möchte lediglich 4 Werte einstellen, für 4 Abstände um einen Text herum.
Das funktioniert auch alles schon, sieht aber unschön aus im Objektinspektor
und so dachte ich mir, ich könnte das so machen, wie bei der Eigenschaft "Constraints":
Pfeil aufklappen und da sind die 4 Werte einzustellen. So, die Idee.
Wie man das macht, keine Ahnung, also habe ich herumprobiert. Man lernt ja nie aus.
Mit jedem neuen Ergebnis kamen leider immer neuere Probleme.
Vermutlich bin ich hier völlig auf dem Holzweg:
Um es zu verdeutlichen, habe ich mal eine komplett abgespekte Komponente dafür gebaut,
um lediglich die Funktionalität zu prüfen.
So habe ich mir eine Komponente TTextSpace erstellt und in die Komponente mit aufgenommen.
Bei create meiner Komponente rufe ich dann
FTextSpace := TTextSpace.create(self) auf.
Somit wird sie ja auch automatisch zerstört bei Komponente.free.
Im Prinzip scheint das "vorerst" zu laufen, aber:
merkwürdigerweise nur so lange ich noch in der Designphase bin.
Beim Starten des Programms geht es nicht mehr, bzw. hat die Komponente anscheinend die Werte vergessen...
Zudem erscheinen im Objektinspektor die Eigenschaften "Name" und "Tag" die ich garnicht haben möchte.
Ich habe mal die minimalistische Komponente angefügt:
Code: Alles auswählen
{ Siro 25.04.2017 }
{ lediglich zum prüfen der Funktionalität von TextSpace }
{ im Objektinspektor TextSpace.Left einstellen, das geht }
{ wenn das Programm aber gestartet wurde, geht es nicht mehr }
unit LAZ_TestLabel;
interface
uses
LCLIntf,
Classes,
Graphics,
Controls, { TControl }
StdCtrls; { TCustomLabel }
Type TTextSpace = class(TComponent)
private
FLeft : Integer;
FRight : Integer;
FTop : Integer;
FBottom : Integer;
protected
procedure SetLeftSpace (space:Integer);
procedure SetTopSpace (space:Integer);
procedure SetRightSpace (space:Integer);
procedure SetBottomSpace(space:Integer);
public
constructor create(aOwner:TComponent); override;
published
property Left : Integer read FLeft write SetLeftSpace;
property Right : Integer read FRight write SetRightSpace;
property Top : Integer read FTop write SetTopSpace;
property Bottom : Integer read FBottom write SetBottomSpace;
end;
Type TTestLabel = class(TCustomLabel)
private
FTextSpace : TTextSpace; // das ist der neue Knackpunkt :-)
public
constructor create(aOwner:TComponent); override;
procedure paint; override;
published
property Caption;
property AutoSize;
property TextSpace : TTextSpace read FTextSpace write FTextSpace;
end;
procedure register;
Implementation
constructor TTextSpace.create(aOwner:TComponent);
begin
inherited;
// rundrum sollen 2 Pixel Platz bleiben
(*
Fleft :=2;
FTop :=2;
FRight :=2;
FBottom :=2;
*)
end;
procedure TTextSpace.SetLeftSpace(space:Integer);
begin
if Left = space then exit;
FLeft:=space;
// ohne die Abfrage Assigned gibts Chaos.....
if Assigned(owner) then TControl(Owner).invalidate;
end;
procedure TTextSpace.SetTopSpace(space:Integer);
begin
if Top = space then exit;
FTop:=space;
if Assigned(owner) then TControl(Owner).invalidate;
end;
procedure TTextSpace.SetRightSpace(space:Integer);
begin
if Right = space then exit;
FRight:=space;
if Assigned(owner) then TControl(Owner).invalidate;
end;
procedure TTextSpace.SetBottomSpace(space:Integer);
begin
if Bottom = space then exit;
FBottom:=space;
if Assigned(owner) then TControl(Owner).invalidate;
end;
constructor TTestLabel.create(aOwner:TComponent);
begin
inherited;
AutoSize:=FALSE; // lediglich zum Testen
// die TextSpace Komponente erstellen
FTextSpace:=TTextSpace.create(self);
end;
procedure TTestLabel.paint;
begin
// lediglich einen schwarzen Rahmen aussen
canvas.brush.color:=clBlack; // FrameRect wird immer mit brush gezeichnet
canvas.FrameRect(ClientRect);
canvas.brush.color:=clWhite; // Texthintergrund in weiss
// und den Text ausgeben
canvas.TextOut(FTextSpace.left, // Textposition X
FTextSpace.Top, // Textposition Y
caption);
end;
{******************************************************************************}
{ alle Komponenten registrieren }
procedure Register;
begin
// RegisterComponents('LAZ_Siro', [TTextSpace]); ich dachte ich muss es evtl. registrieren..
RegisterComponents('LAZ_Siro', [TTestLabel]);
end;
Initialization
Finalization
end.
Warum geht es nicht mehr zur Laufzeit ?
Jetzt sehe ich grade, die Daten der TTextSpace Komponente landen garnicht in der .lfm Datei
dann kann das ja auch nicht funktionieren. Hmmmm
--------------
Nächster Versuch: Ich habe mir dann mal die Komponente "Constraints" angesehen,
die ist abgeleitet von TPersistent, das habe ich dann auch mal probiert.
Vorteil: Die Komponenteneigenschaften "Name" und Tag sind jetzt verschwunden. Supi genau das wollte ich ja
Aber es gibt gar keinen Constructor den ich überschreiben könnte.
Habe die Komponente dann trotzdem mittels create erzeugt, das ging wohl auch....
Nun wollte ich aber meine Hauptkomponente auch informieren, wenn sich einer der 4 Werte ändert.
Da kommt das nächste Problem, wo ist der Besitzer "owner" habe es dann mit GetOwner von TPersistent und Invalidate probiert.
Hier gibt es dann Zugriffsveletzungen.
Nun bin ich an dem Punkt, doch mal nachzufragen
Eigentlich brauche ich doch "NUR" eine Record mit 4 Integern die ich im Objektinspektor einstelle
und dann soll natürlich Invalidate ausgeführt werden, damit die Komponente auch neu gezeichnet wird.
Könnt Ihr mich auf den "richtigen" Weg bringen ?
Siro