czesc panowie potrzebuje malej pomocy nie potrafie dobrze programowac w delphi czy mozna dane z stringgrid przedstawic jako wykres w canvas
Nie :) bo jest cos lepszego TChart.
Nie no crowa - można, trzeba tylko się trochę napisać. Oto przykład:
http://www.ge0dezja.republika.pl/img/perioder1.jpg
b
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
wiec jakies propzycje panowie??
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.
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()
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)
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.