Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Zeichnen in Paintbox erst nach Refresh

  Alt 24. Sep 2014, 12:41
Hi,

ich bastel grad an einer Urlaubplanerkomponente.
Die Komponente setze ich aus Panels zusammen, damit ich feststehende Zeilen und Spalten, und einen scrollbaren Anzeigebereich habe.
Jetzt will ich in einer Paintbox, die ich mir auf ein Panel gesetzt habe die Datumscala zeichnen, aber das will nicht so richtig funktionieren. Im Grunde zeichnet er erst, wenn ich die Komponente in eine Form setze, diese starte und ein Refresh auf meinem Basispanel durchführe.

Hier mal mein Create der Komponente und die Function in der ich zeichnen will:

Delphi-Quellcode:
constructor TUrlaubsplaner.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  self.FPersons:=TPersons.Create(TPerson);
  self.FEntryTypes:=TEntryTypes.Create(TEntryType);
  self.FEntries:=TEntries.Create(TEntry);
  self.FColors:=TColors.Create;
  self.FColors.BackColor:=clWhite;
  self.FColors.DayColorMo:=clGradientActiveCaption;
  self.FColors.DayColorDi:=clGradientInactiveCaption;
  self.FColors.DayColorMi:=clGradientActiveCaption;
  self.FColors.DayColorDo:=clGradientInactiveCaption;
  self.FColors.DayColorFr:=clGradientActiveCaption;
  self.FColors.DayColorSa:=clHighlight;
  self.FColors.DayColorSo:=clHotLight;
  self.FColors.PersonColor1:=clCream;
  self.FColors.PersonColor2:=clMoneyGreen;
  self.FColors.GridLineColor:=clBlack;
  self.FColors.PersonGridColor:=clBlack;
  self.FColors.DayGridColor:=clBlack;
  self.FColors.Color:=clCream;
  self.FShowMonths:=True;
  self.FColumnDayWidth:=20;
  self.FStartDay:=Now;
  self.FEndDay:=now+10;

  FPanelLeft:= TPanel.Create(Self); //alLeft
  FPanelLeft.Parent:=Self;
  FPanelLeft.Align:=alLeft;
  FPanelLeft.Width:=80;
  FPanelLeft.BevelOuter:=bvNone;

  FPanelLeftBottom:=TPanel.Create(Self); //alBottom
  FPanelLeftBottom.Parent:=FPanelLeft;
  FPanelLeftBottom.Align:=alBottom;
  FPanelLeftBottom.Height:=17;
  FPanelLeftBottom.BevelOuter:=bvNone;
  FPanelLeftBottom.Color:=self.FColors.Color;

  FPanelLeftTop:=TPanel.Create(Self); //alTop
  FPanelLeftTop.Parent:=FPanelLeft;
  FPanelLeftTop.Align:=alTop;
  FPanelLeftTop.Height:=40;
  FPanelLeftTop.BevelOuter:=bvNone;
  FPanelLeftTop.Color:=self.FColors.Color;

  FPanelPersonal:=TPanel.Create(Self); //alClient
  FPanelPersonal.Parent:=FPanelLeft;
  FPanelPersonal.Align:=alClient;
  FPanelPersonal.BevelOuter:=bvNone;

  FSplitter:=TSplitter.Create(self);
  FSplitter.Parent:=Self;
  FSplitter.Left:=185;
  FSplitter.Align:=alLeft;
  FSplitter.Color:=clSilver;

  FPanelRight:=TPanel.Create(Self); //alClient
  FPanelRight.Parent:=self;
  FPanelRight.Align:=alClient;
  FPanelRight.BevelOuter:=bvNone;

  FPanelRightBottom:=TPanel.Create(Self); //alBottom
  FPanelRightBottom.Parent:=FPanelRight;
  FPanelRightBottom.Align:=alBottom;
  FPanelRightBottom.Height:=17;
  FPanelRightBottom.BevelOuter:=bvNone;

  FPanelRightBottomRight:=TPanel.Create(self); //alRight
  FPanelRightBottomRight.Parent:=FPanelRightBottom;
  FPanelRightBottomRight.Align:=alRight;
  FPanelRightBottomRight.Width:=17;
  FPanelRightBottomRight.BevelOuter:=bvNone;
  FPanelRightBottomRight.Color:=self.FColors.Color;

  FScrollbarHorizontal:=TScrollbar.Create(Self); //alRight
  FScrollbarHorizontal.Parent:=FPanelRightBottom;
  FScrollbarHorizontal.Kind:=sbHorizontal;
  FScrollbarHorizontal.Align:=alClient;

  FPanelRightTop:=TPanel.Create(Self); //alTop
  FPanelRightTop.Parent:=FPanelRight;
  FPanelRightTop.Align:=alTop;
  FPanelRightTop.Height:=40;
  FPanelRightTop.BevelOuter:=bvNone;

  FPanelRightTopRight:=TPanel.Create(Self); //alRight
  FPanelRightTopRight.Parent:=FPanelRightTop;
  FPanelRightTopRight.Align:=alRight;
  FPanelRightTopRight.Width:=17;
  FPanelRightTopRight.BevelOuter:=bvNone;
  FPanelRightTopRight.Color:=self.FColors.Color;

  FPanelDate:=TPanel.Create(Self); //alClient
  FPanelDate.Parent:=FPanelRightTop;
  FPanelDate.Align:=alClient;
  FPanelDate.BevelOuter:=bvNone;

  FPanelDays:=TPanel.Create(Self); //alClient
  FPanelDays.Parent:=FPanelRight;
  FPanelDays.Align:=alClient;
  FPanelDays.BevelOuter:=bvNone;

  FScrollbarVertical:=TScrollBar.Create(Self); //alClient
  FScrollbarVertical.Parent:=FPanelDays;
  FScrollbarVertical.Kind:=sbVertical;
  FScrollbarVertical.Align:=alRight;

  FDatePaint:=TPaintBox.Create(self);
  FDatePaint.Parent:=FPanelDate;
  FDatePaint.Left:=0;
  FDatePaint.Top:=0;
  FDatePaint.Height:=FPanelDate.Height;

  GenerateDatePanelView;
  self.Refresh; //hat nichts verändert.
end;

procedure TUrlaubsplaner.GenerateDatePanelView;
var
  NumOfDays: Integer;
  RectMonth: TRect;
  r: TRect;
  AktMonth: Integer;
  DayName: string;
  I: Integer;
begin
  NumOfDays:=DaysBetween(self.FStartDay, self.FEndDay);
  FDatePaint.Width:=NumOfDays*Self.FColumnDayWidth;
  RectMonth.Left:=FDatePaint.Left;
  RectMonth.Top:=FDatePaint.Top;
  RectMonth.Height:=20;
  for I := 0 to NumOfDays do
  begin
    r.Left:=FDatePaint.Left+(i*FColumnDayWidth);
    if FShowMonths then
      r.Top:=FDatePaint.Top+RectMonth.Height+1 else
      r.Top:=FDatePaint.Top;
    r.Height:=20;
    r.Width:=FColumnDayWidth;
    case DayOfWeek(FStartDay+i) of
      1: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorSo;
      2: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorMo;
      3: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorDi;
      4: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorMi;
      5: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorDo;
      6: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorFr;
      7: FDatePaint.Canvas.Brush.Color:=self.FColors.DayColorSa;
    end;
    case DayOfWeek(FStartDay+i) of
      1: DayName:='So';
      2: DayName:='Mo';
      3: DayName:='Di';
      4: DayName:='Mi';
      5: DayName:='Do';
      6: DayName:='Fr';
      7: DayName:='Sa';
    end;
    FDatePaint.Canvas.Pen.Color:=self.FColors.DayGridColor;
    FDatePaint.Canvas.FillRect(r);
    FDatePaint.Canvas.MoveTo(r.Right-1, r.Top);
    FDatePaint.Canvas.LineTo(r.Right-1, r.Bottom);
    FDatePaint.Canvas.TextRect(r, 2, 2, IntToStr(DayOf(FStartDay+i)));
    FDatePaint.Canvas.TextRect(r, 12, 2, DayName);
  end;
end;
Die fest eingetragenen Werte sind erstmal nur zum Testen, sind hier zu vernachlässigen.

Bitte nicht gleich steinigen, weil ich es so gemacht, wie ich es gemacht habe. Ist halt learning by doing.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat