Hallo Gemeinde,
ich wollte mal was Testen und das raubt mir gerade den Verstand.
Was jetzt folgt ist viel Stoff zum Lesen, aber ich wollte mal sicher gehen, dass ich mich nicht umständlich und falsch ausdrücke.
Mein Problem, ich wollte eine
VCL-Komponente aufbauen. Der Bereich TBMBasic. Der Funktioniert auch soweit.
Der Code ist
a. noch nicht fertig und
b. der Übersicht halber beschnitten.
Delphi-Quellcode:
Type TMBBasic = Class (TGraphicControl)
private
fMouseOver : Boolean;
fPushDown : Boolean;
fHasFrame : Boolean;
fFrameStyle : TPenStyle;
fFrameThickness : Integer;
fFrameColor : TColor;
fBackFilling : tBrushStyle;
fBackGroundColor : TColor;
Procedure SetHasFrame (Value : Boolean);
Procedure SetFrameStyle (Value : TPenStyle);
Procedure SetFrameThickness (Value : Integer);
Procedure SetBackFilling (Value : TBrushStyle);
Procedure SetFrameColor (Value : TColor);
Procedure SetBackGroundColor (Value : TColor);
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Override;
procedure CMMouseLeave (var Message: TMessage); message CM_MouseLeave;
procedure CMMouseEnter (var Message: TMessage); message CM_MouseEnter;
procedure CMFontChanged (var Message: TMessage); message CM_FONTCHANGED;
procedure CMTextChanged (var Message: TMessage); message CM_TEXTCHANGED;
public
procedure Paint; override;
constructor Create(AOwner:Tcomponent);override;
destructor Destroy; override;
published
property HasFrame : Boolean read fHasFrame write SetHasFrame;
property FrameStyle : TPenStyle read fFrameStyle write SetFrameStyle;
property FrameThickness : Integer read fFrameThickness write SetFrameThickness;
property FrameColor : TColor read fFrameColor write SetFrameColor;
property BackFilling : tBrushStyle read fBackFilling write SetBackFilling;
property BackGroundColor: TColor read fBackGroundColor write SetBackGroundColor;
Hier die Paint-Methode. Wie gesagt funktioniert.
Delphi-Quellcode:
procedure TMBBasic.Paint;
var rgn : Hrgn;
Area : TRect;
Procedure DrawFrame;
Begin
canvas.pen.style:= fFrameStyle;
canvas.Pen.Width := fFrameThickness;
canvas.pen.color := fFrameColor;
canvas.brush.Style := bsClear;
canvas.Rectangle(0, 0, Width-fFrameThickness+1, Height-fFrameThickness+1);
End;
Begin
Area := Rect(0, 0, Width, Height);
canvas.pen.style:= fFrameStyle;
canvas.brush.color := fBackGroundColor;
canvas.brush.Style := fBackFilling;
canvas.FillRect(Area);
if fHasFrame then drawframe;
End;
Ich habe von hier eine Klasse abgeleitet, die wiederum auch funktioniert.
Delphi-Quellcode:
Type TMBTitleLine = Class (TMBBasic)
private
fTitle : String;
fDirection : sdDirection;
procedure SetTitle (Value : String);
procedure SetDirection (Value : sdDirection);
protected
public
procedure Paint; override;
constructor Create(AOwner:Tcomponent);override;
destructor Destroy; override;
published
property Title : String read fTitle write SetTitle;
property Direction : sdDirection read fDirection write SetDirection;
End;
in der Paint-Methode
Delphi-Quellcode:
procedure TMBTitleLine.Paint;
var rgn : Hrgn;
Area : TRect;
procedure drawcaption;
begin
canvas.brush.style := bsclear;
canvas.font.color := Font.color;
DrawText (canvas.handle, @Title[1], -1, Area, DT_SINGLELINE or DT_VCENTER or DT_CENTER or DT_END_ELLIPSIS);
end;
Procedure DrawFrame;
Begin
canvas.pen.style:= fFrameStyle;
canvas.Pen.Width := fFrameThickness;
canvas.pen.color := fFrameColor;
canvas.brush.Style := bsClear;
canvas.Rectangle(0, 0, Width-fFrameThickness+1, Height-fFrameThickness+1);
End;
Begin
canvas.font.Assign(Font);
canvas.brush.style:=bssolid;
Height := font.Size * 5; <== Das scheint nicht zu gehen
Area := Rect(0, 0, Width, Height);
canvas.pen.style:= fFrameStyle;
canvas.brush.color := fBackGroundColor;
canvas.brush.Style := fBackFilling;
canvas.FillRect(Area);
if fHasFrame then drawframe;
if Title<>'' then DrawCaption;
End;
Soweit sogut: Nun wollte ich eine weitere Komponente, die dann später die Hauptkomponente sein wird aufbauen.
Nennen wir die mal TMBPaintBoard und schon gingen die Probleme los.
Delphi-Quellcode:
Type TMBPaintBoard = Class (TGraphicControl)
private
fMouseOver : Boolean;
fPushDown : Boolean;
fMBTitleLine : TMBTitleLine;
Procedure SetTitleLine (Value : TMBTitleLine);
protected
public
procedure Paint; override;
constructor Create(AOwner:Tcomponent);override;
destructor Destroy; override;
published
property Titleline : TMBTitleLine read fMBTitleLine write SetTitleLine;
End;
Das nächste dann, wenn ich versuche diese in der Paint-Methode zu zeichnen,
Delphi-Quellcode:
procedure TMBPaintBoard.Paint;
var rgn : Hrgn;
Area : TRect;
Procedure DrawFrame;
Begin
canvas.pen.style:= fFrameStyle;
canvas.Pen.Width := fFrameThickness;
canvas.pen.color := fFrameColor;
canvas.brush.Style := bsClear;
canvas.Rectangle(0, 0, Width-fFrameThickness+1, Height-fFrameThickness+1);
End;
Begin
Area := Rect(0, 0, Width, Height);
canvas.pen.style:= fFrameStyle;
canvas.brush.color := fBackGroundColor;
canvas.brush.Style := fBackFilling;
canvas.FillRect(Area);
if fHasFrame then drawframe;
fMBTitleLine.Left := Left + 5;
fMBTitleLine.Top := Top + 5;
fMBTitleLine.Width := Width - 10;
fMBTitleLine.fBackGroundColor := clSkyBlue;
fMBTitleLine.Parent := self.Parent;
fMBTitleLine.Paint;
Wenn ich das dann starten möchte dann wird das soweit auch gezeichnet.
Ich habe die Komponente registriert und eingebunden. Funktioniert auch. Taucht auf der TForm als MBPaintBoard1 auf, wird gezeichnet und eigentlich könnte ich zufrieden sein.
Nur die Properties, die ich dann im Objektinspektor bekomme schauen schon mal seltsam aus und Zuweisungen funktionieren garnicht, d.h. nicht so ganz.
Im Designmode zeigt es mir die Geschichte korrekt an, im Laufzeitmode nicht.
Ich habe mal ein Bild Ausschnitt vom Objektinspekor mit angehängt.
Wäre toll, wenn einer von euch ne Antwort weiß. Ich komm grad nicht wirklich weiter.
Thx