Einzelnen Beitrag anzeigen

Benutzerbild von Ookami
Ookami

Registriert seit: 20. Nov 2009
Ort: Baden Württemberg
77 Beiträge
 
Delphi 2009 Architect
 
#1

VCL-Komponenten aufeinander aufbauen

  Alt 30. Mär 2014, 19:29
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
Miniaturansicht angehängter Grafiken
unbenannt.png  
Wolfgang
Grüße und Danke
Wolfgang
  Mit Zitat antworten Zitat