Hallo
DP´ler,
ich baue gerade eine Komponente THixHistograph, welche von TCustompanel abgeleitet ist.
Es wird ein Hintergrund gezeichnet und darauf eine Darstellungsfläche.
Nun soll an die Darstellungsfläche in X und Y eine Skalierung, welche sich auch mit der Breiten-und Höhenänderung der Komponente angleicht.
Die Skalen sind bereits Komponenten, welche ich in dieser verwende, da ich alle eigenschaften nicht neu setzen will.
Nun zum Problem:
Die Scalen, welche von THorScale und TVertScale abgeleitet sind, haben aufgrund Ihrer Erzeugung ein Width und Height bereits aus ihrem Constructor...
Die Darstellungsfläche hat im Komponentenconstructor ja auch gesetzte Werte, wie mach ich das, dass sich die Darstellung der Skalen an den Width und Height der Darstellungsfläche orientiert und nicht mit den eigenen Werten...
Delphi-Quellcode:
constructor THixHistoGraph.Create(AOwner: TComponent);
begin
inherited;
FColor := clBtnFace;
FHistoBkColor := clBtnFace;
Width := 270;
Height := 200;
FGapTop := 40;
FGapBottom := 60;
FGapLeft := 70;
FGapRight := 40;
FBorderstyle := bsSingle;
FVisible := true;
FFont := TFont.Create;
FGridLineStyle := psSolid;
FViewXCurrentMin := 0;
FViewXCurrentMax := 10;
FViewYMin := 0;
FViewYMax := 10;
FXScale := THorScale.Create(Self);
FXScale.Parent := Self;
FXScale.Width := Width - GapLeft- GapRight - 1;
FXScale.Top := Height - GapBottom;
FYScale := TVertScale.Create(Self);
FYScale.Parent := Self;
FYScale.Height := Height - GapTop - GapBottom;
end;
Sieht gut aus, außer, wenn man die Komponente größer bzw. kleiner zieht
Delphi-Quellcode:
procedure THixHistoGraph.DrawComponent;
var
ComponentBackround : TRect; // zeichnet den Hintergrund der Komponente
HistoBackround : TRect; // zeichnet die Darstellungsfläche der Komponente
begin
inherited;
if (Parent = NIL) or not visible
then Exit;
begin
ComponentBackround := Rect(0, 0, Width, Height);
end;
Canvas.Brush.Color := FColor;
Canvas.Pen.Color := FColor;
Canvas.FillRect(ComponentBackround);
Frame3D(Canvas, ComponentBackround, clBtnHighlight, clBtnShadow, 1); // 3D Rahmen mit der Breite von 1 für Komponentenhintergrund
with HistoBackround do
begin
HistoBackround := Rect(GapLeft,
GapTop,
Width - GapRight,
Height - GapBottom);
end;
Canvas.Brush.Color := FHistoBkColor;
Canvas.Pen.Color := FHistoBkColor;
Canvas.FillRect(HistoBackround);
Frame3D(Canvas, HistoBackround, clBtnShadow, clBtnHighlight, 1);
end;
procedure THixHistoGraph.DrawScales;
begin
inherited;
if (Parent = NIL) or not visible
then Exit;
with XScale do
begin
XScale.Left := GapLeft+1;
end;
with YScale do
begin
YScale.Left := 1;
YScale.Top := GapTop + 1;
YScale.Width := GapLeft - 2;
end;
end;
Bin Dankbar für jeden Denkanstoß
Hier mal noch ein Screenshot