canwas wykres

0

czesc panowie potrzebuje malej pomocy nie potrafie dobrze programowac w delphi czy mozna dane z stringgrid przedstawic jako wykres w canvas

0

Nie :) bo jest cos lepszego TChart.

0

Nie no crowa - można, trzeba tylko się trochę napisać. Oto przykład:

http://www.ge0dezja.republika.pl/img/perioder1.jpg

b

0

to moze ktorys z panow zapoda jakis kod zrodlowy do tego canvasa bo mam zaliczenie i nie wiem jak to polaczyc zeby rysolawo debe bardzo wdzieczny

0

wiec jakies propzycje panowie??

0

oto moj kod
chce zeby mi rysowalo wykres pobierajac dane z tabeli ale nie moge sobie poradzic z tym wykres musi byc wykladniczy dla kazdej kolumny osobny

procedure TForm1.Button1Click(Sender: TObject);

begin
//Pobranie parametrow
a:= StrToint(edit1.Text);

//Rysowanie ukladu wspolrzednych
With Image1 do
begin
Canvas.MoveTo(0,0);
Canvas.LineTo(10, 20);
Canvas.MoveTo(0,0);
Canvas.LineTo(20, 10);
end;

//Rysowanie wykresu funkcji

x := -100;
repeat

Image1.Canvas.Pixels[round(x)+100,(round(a*x)+100)]:=clblue;

x := x + 0.01;

until (x>101)

end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
x1:=stringgrid1.col;
y1:=stringgrid1.row;
stringgrid1.cells[x1,y1]:='';

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then stringgrid1.cells[x1,y1]:=edit1.text;
end;

end.

0

wiem ze mozna rysowac po dowolnym canvasie ale po co? :)
Najlepiej poczytaj o TChart chyba ze koniecznie takie sa wymagania wtedy posluguj sie Canvas.PolyLine()

0

a tak w ogóle to po co Ci to przesuniecie o 0.01.
Na Canvasie mozesz rysowac tylko integer'y wiec musisz przeskalowac dane.
Ja bym w ogóle zaczal od zadeklarowania tablicy danych.
Globalna zmienna
var fData: array of array of Double;
Pozniej zadeklarowalbym funkcje np

function Compute(): Integer;
var i: Integer;
begin
  for i := Low(fData) to High(fData) do
  begin
     // tutaj wzor na wyliczenie Y
     fData[i,0] := //wzor
  end;

end; 

deklarujesz tylko rozmiar fData za pomoca
SetLength(fData, np 10, 2);

Pozniej juz tylko rysujesz :)

Podaj adres mail to Ci wysle gotowca (tak na szybko zrobione)

0

a tutaj listing kodu (nie czepiac sie bylo pisane na kolanie - to ma tylko pokazac jak to trzeba zrobic).
Sam bedziesz musial pokombinowac ze skalowaniem (ja bym je oparl na podstawie wspolczynnika osi X i Y)


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids, Math;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Panel1: TPanel;
Button1: TButton;
Image1: TImage;
Edit1: TEdit;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
function Compute(): Integer;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
fData: array of array of Double;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
with Image1.Canvas do
begin
Pen.Color := clRed;
MoveTo(0,0);
for i := Low(fData) to High(fData) do
LineTo(Trunc(fData[i,0]), Trunc(fData[i,1]*100));
end;
end;

function TForm1.Compute(): Integer;
var i: Integer;
begin
for i := Low(fData) to High(fData) do
begin
fData[i,1] := Ln(fData[i,0]);
StringGrid1.Cells[i+1,1] := FloatToStr(fData[i,1]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
StringGrid1.Cells[0,0] := 'X';
StringGrid1.Cells[0,1] := 'Y';
StringGrid1.ColCount := StrToInt(Edit1.Text);
SetLength(fData, StrToInt(Edit1.Text));
for i := Low(fData) to High(fData) do
begin
SetLength(fData[i], 2);
fData[i,0] := i+1;
StringGrid1.Cells[i+1,0] := IntToStr(i);
end;

Compute();

end;

end.

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