Wykres liniowy w Delphi

0

Witam.
Jak narysować wykres liniowy?
Ściągnąłem gotowy program wyliczający x i y<url> http://www.speedyshare.com/821169556.html</url>
i chciałbym go przerobić żeby dodatkowo rysował ten wykres w nowym formie.
Powiecie mi czemu nie mogę rozszerzyć tego okienka z programem w projekcie?
Jeszcze jedno pytanko: jak zrobić żeby w buttonie napisy był pionowo( z góry na dół).
Z góry dziękuję za odp

0

Jeśli chcesz własnoręcznie rysować wykres to poczytaj o Canvas. Jeśli chcesz gotowy komponent to jest bodajże TChart (ale w darmowych wersjach go nie ma).

0

Słyszałem o Canvas...powie mi ktoś jak do form2 przypisać coś z forma 1??

0
seba612 napisał(a)

Słyszałem o Canvas...

Więc w czym problem?

0

Problem w tym, że jak przypisuję w tym formie gdzie ma być narysowany wykres do zmiennej wartości z form 1 to piszę, że taka wartosc jest niezdeklarowana

0

A po co się w takie pierdołki bawić? Nie lepiej zrobić na jednej formie? Na jakimś Shapie np.

0

Dostałem w szkole konkretne zadanie, które muszę zrobić i chcę żeby to było tak jak mi zostało polecone.

0

Czy w module (unicie) dotyczącym formy 1 masz dodany w sekcji uses unit dotyczący formy 2 ?
Bo jesli nie, a probujesz sie do niej odwolac, to nie dziwne, ze masz komunikat o niezadeklarowanym typie.

0

Tak, jest w sekcji uses

0

To jak jest w uses to na pewno możesz się do niego odwołać, co do zrobienia buttona z pionowym Caption
to siedziałem i stworzyłęm takie coś jak poniżej. Chyba działa ok. To komponent dziedziczący z TBitBrn, ale
nie umiem zablokować zmiany własności Glyph, dlatego przy niej nie grzeb. Na standardowym Buttonie - nie
dało się rysować odwróconego tekstu, dlatego wykorzystałem Glyph z BitBtn. I przykład użycia komponentu:

var
  A : TVerticalCaptionButton;
begin
  A := TVerticalCaptionButton.Create(Self);
  A.Parent := Self;
  A.Left := 20;
  A.Top := 20;
  A.Height := 300;
  A.Width := 100;
  A.SetVerticalText(rdFromDownToUp, 'Jakiś tekst napisany pionowo');
end;

Kierunki są dwa rdFromDownToUp oraz rdFromUpToDown. To powyżej to tworzenie komponentu w sposób
dynamiczny (ale to pewnie już wiesz). Możesz jednak też zainstalować komponent. Kod całego modułu tutaj:

unit vertbtn;

interface

uses
  Windows, Buttons, Messages, Classes, Controls, Graphics;

const
  BorderSpace = 10;

type
  TRotateDirection = (rdFromDownToUp, rdFromUpToDown);

type
  TVerticalCaptionButton = class(TBitBtn)
  private
    FBmp : TBitmap;
    FText : string;
    FRotateDirection : TRotateDirection;
  protected
    procedure WMPaint(var Message : TMessage); message WM_PAINT;
    procedure WMSize(var Message : TWMSize); message WM_SIZE;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure SetVerticalText(const RotateDirection : TRotateDirection; const Text : string);
  end;

procedure Register;

implementation

procedure RotTextOut(ACanvas : TCanvas; X, Y, Angle : Integer; Text : string);
var
  LF : TLogFont;
  TF : TFont;
begin
  with ACanvas do
  begin
    Font.Name := 'Arial';
    Font.Size := 10;
    TF := TFont.Create;
    try
      TF.Assign(Font);
      GetObject(TF.Handle, SizeOf(lf), @lf);
      LF.lfEscapement := Angle * 10;
      LF.lfOrientation := 0;
      SetBkMode(Handle, TRANSPARENT);
      TF.Handle := CreateFontIndirect(lf);
      Font.Assign(tf);
    finally
      TF.Free;
    end;
    TextOut(X, Y, Text);
  end;
end;

constructor TVerticalCaptionButton.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csSetCaption, csOpaque, csDoubleClicks];
  Width := 40;
  Height := 220;
  TabStop := True;
  FText := '';
  FBmp := TBitmap.Create;
end;

destructor TVerticalCaptionButton.Destroy;
begin
  FBmp.Free;
  inherited Destroy;
end;

procedure TVerticalCaptionButton.SetVerticalText(const RotateDirection : TRotateDirection; const Text : string);
var
  TextHeight, TextWidth, XPosition, YPosition, RotateAngle : integer;
begin
  FText := Text;
  Caption := '';
  FRotateDirection := RotateDirection;
  FBmp.Height := Height;
  FBmp.Width := Width;
  FBmp.Canvas.Brush.Color := clBtnFace;
  FBmp.Canvas.FillRect(ClientRect);
  TextHeight := FBmp.Canvas.TextHeight(Text);
  TextWidth := FBmp.Canvas.TextWidth(Text);
  XPosition := 0;
  YPosition := 0;
  RotateAngle := 0;
  case RotateDirection of
    rdFromDownToUp :
      begin
        XPosition := ((Width - TextHeight) div 2) - BorderSpace;
        YPosition := (Height - BorderSpace) div 2 + (TextWidth div 2);
        RotateAngle := 90;
      end;
    rdFromUpToDown :
      begin
        XPosition := Width - (Width div 2);
        YPosition := (Height - BorderSpace) div 2 - (TextWidth div 2);
        RotateAngle := 270;
      end;
  end;
  RotTextOut(FBmp.Canvas, XPosition, YPosition, RotateAngle, Text);
  Glyph.Height := Height - BorderSpace;
  Glyph.Width := Width - BorderSpace;
  Glyph.Canvas.Draw(0, 0, FBmp);
  SendMessage(Handle, WM_PAINT, 0, 0);
end;

procedure TVerticalCaptionButton.WMPaint(var Message : TMessage);
begin
  if Assigned(FBmp) then
    Glyph.Canvas.Draw(0, 0, FBmp);
  inherited;
end;

procedure TVerticalCaptionButton.WMSize(var Message : TWMSize);
begin
  inherited;
  SetVerticalText(FRotateDirection, FText);
end;

procedure Register;
begin
  RegisterComponents('Samples', [TVerticalCaptionButton]);
end;

end.
0

cholerka taka pierdoła, a tyle kodu...myślałem, że to jest gdzieś w object inspector. Wielkie dzięki za zaangażowanie

1 użytkowników online, w tym zalogowanych: 0, gości: 1