![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
В каком месте кода? Я скажем решил в процедуру Button1Click, что бы функция пренадлежала ей и вызывалась нажатием кнопки. В public ведь скрывать мне нечего. Я не уверен чито так надо. Понял что я смутно очинь смутно представляю как надо.
Ошибка при компиляции на первой же строке функции. Да я ожидал что обьявление функции если оно верное будит скомпилировано, без ошибок. Без использования функции. Если в другом модуле эта функция не нужна её можно и не объявлять. А как их правильно вообще обьявлять? Я имено с Дельфи почти некак, незнаком. Принцип классов в общем понимаю, но тут много особеностей. Почти наугад делаю. Вот тоже вышла ошибка Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
TFunc = function (x: real): real;
procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
max, min: real;
sx, sy: real;
xmid, ymid: integer;
begin
sx := (c.ClipRect.Right)/(b-a);
h := 1/sx;
xmid := c.ClipRect.Right div 2;
ymid := c.ClipRect.Bottom div 2;
x := a;
max := f( x);
min := max;
while x<=b do
begin
y := f( x);
if y<min then min := y;
if y>max then max := y;
x := x + h;
end;
sy := c.ClipRect.Bottom/ (max-min);
c.Brush.Color := clBlack;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color := clYellow;
c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid);
c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom);
x := a;
y := f(x);
c.Pen.Color := clWhite;
c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
while x<=b do
begin
y := f(x);
c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
x := x + h;
end;
end;
Canvas.Brush.Style:=bsCross;
Canvas.Brush.Color:=clRed;
Canvas.Pen.Color:=clRed;
Canvas.Ellipse(100,100,300,200);
end;
end.Ага. Undeclared identifier TFunc |
|
#2
|
||||
|
||||
|
Код:
procedure TForm1.Button1Click(Sender: TObject);
type TFunc = function (x: real): real;
procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var
x, y, h, max, min, sx, sy: real;
xmid, ymid: integer;
begin
sx:= (c.ClipRect.Right) / (b-a);
h:= 1 / sx;
xmid:= c.ClipRect.Right div 2;
ymid:= c.ClipRect.Bottom div 2;
x:= a;
max:= f(x);
min:= max;
while x <= b do
begin
y:= f(x);
if y < min then min:= y;
if y > max then max:= y;
x:= x + h;
end;
sy:= c.ClipRect.Bottom / (max - min);
c.Brush.Color:= clBlack;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color:= clYellow;
c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid);
c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom);
x:= a;
y:= f(x);
c.Pen.Color:= clWhite;
c.MoveTo(xmid + round(sx * x), ymid - round(sy * y));
while x <= b do
begin
y:= f(x);
c.LineTo(xmid + round(sx * x), ymid - round(sy * y));
x:= x + h;
end;
end;
begin
Canvas.Brush.Style:= bsCross;
Canvas.Brush.Color:= clRed;
Canvas.Pen.Color:= clRed;
Canvas.Ellipse(100, 100, 300, 200);
end;
З.Ы. Небольшое бегинендовое нарушение синтаксиса языка, пропущено ключевое слово, одним словом мелочёвка по невнимательности, результат - на форме рисуется красный клетчатый овал Последний раз редактировалось Alegun, 06.06.2014 в 19:22. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Dimka-super (06.06.2014)
| ||
|
#3
|
|||
|
|||
|
Ответ вижу!!
|
|
#4
|
|||
|
|||
|
Да, я видел. Рассматриваю код, пытаюсь понять закономерности. Там вообще то вроде еще координатная ось должна быть!
|
|
#5
|
||||
|
||||
|
Цитата:
Последний раз редактировалось Alegun, 06.06.2014 в 20:14. |
|
#6
|
|||
|
|||
|
Хм.. Да я не знаю. По описанию функция притязала на ее отрисовку.
|
|
#7
|
|||
|
|||
|
Введение
В Delphi для прорисовки различных элементов управления используется специальный класс TCanvas. Можно выделить 4 основных направления, в которых используется этот класс: 1. Загрузка и хранение графических изображений. 2. Создание новых и изменение хранимых изображений с помощью пера, кисти, шрифта. 3. Рисование и/или закраска фигур, линий, текстов. 4. Комбинирование изображений. Как Вы уже поняли, мы пойдем по третьему направлению. Теперь давайте рассмотрим некоторые свойства и методы класса TCanvas. Сразу скажу, что я буду рассматривать далеко не все методы и свойства класса TCanvas, а лишь те, которые мы будем использовать потом. TCanvas Свойства: 1. property Brush: TBrush; Данное свойство позволяет определить цвет (Brush.Color) и стиль (Brush.Style) заполнения замкнутых фигур и фона. 2. property ClipRect: TRect; - read-only Данное свойство позволяет получить доступную область рисования. Вне этой области рисовать невозможно. Тип TRect, описанный в модуле Windows, имеет следующий синтаксис: Код Delphi 1 2 3 4 5 6 7 8 9 10 11 Type TRect = record Case integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; 3. property Pen: TPen; Данное свойство позволяет задать цвет пера, рисующего фигуры или линии. Методы: 1. procedure FillRect (const Rect: TRect); Метод позволяет заполнить цветом прямоугольную область холста Rect, используя текущее значение кисти Brush. 2. procedure MoveTo (x, y: integer); Метод позволяет переместить перо в точку (X, Y). 3. procedure LineTo (x, y: integer); Метод позволяет нарисовать прямую линию, которая начинается с текущей позиции пера и заканчивается точкой (x, y). При рисовании используются текущие установки пера Pen. Ну вот, пожалуй, и все, что нам будет нужно, для успешного построения графика. Построение графика. Теория. Для начала предлагаю немного теории. Мы собираемся писать процедуру построения графика функции на определенной поверхности, заданной свойством Canvas. Я предлагаю поставить оси координат в середине этой области, а график растянуть так, чтобы он растянулся на всю область. Строить мы будем методом lineto. Поэтому нам нужно определиться с шагом изменения величины аргумента. Я предлагаю взять его обратным к масштабу по оси ординат. Так наш график будет выглядеть плавно при любой функции и любом начальном и конечном значении абсциссы. Масштаб по оси абсцисс считается, отношение ширины поверхности к разнице максимального и минимального значения абсциссы. Масштаб по оси ординат считается аналогично: отношение высоты поверхности к разнице между максимальным и минимальным значениями данной функции на данном интервале. Процедура DrawGraph Ну вот и все с теорией и я приведу полный код функции. Код:
TFunc = function (x: real): real;
procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
max, min: real;
sx, sy: real;
xmid, ymid: integer;
begin
sx := (c.ClipRect.Right)/(b-a);
h := 1/sx;
xmid := c.ClipRect.Right div 2;
ymid := c.ClipRect.Bottom div 2;
x := a;
max := f( x);
min := max;
while x<=b do
begin
y := f( x);
if y<min then min := y;
if y>max then max := y;
x := x + h;
end;
sy := c.ClipRect.Bottom/ (max-min);
c.Brush.Color := clBlack;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color := clYellow;
c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid);
c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom);
x := a;
y := f(x);
c.Pen.Color := clWhite;
c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
while x<=b do
begin
y := f(x);
c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
x := x + h;
end;
end; |
|
#8
|
|||
|
|||
|
Конечно, я, Димка, может что то не так прочёл иле не так понял, криво скопировал.
Да я и не знаю Дельфи. Я чуть знаком с С++ и совсем немного с Ассемблером, и другими языками. |
|
#9
|
|||
|
|||
|
Не знаю.. Я должн был взять функцию внутрь бэгин- энд. Иначе она не может реагировать на нажатие кнопки. Верно? ....Выходит [Error] Unit1.pas(28): Statement expected but 'TYPE' found
У меня пока код выглядит так Код:
unit Risuem1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
type TFunc = function (x: real): real;
procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h, max, min, sx, sy: real;
xmid, ymid: integer;
begin sx:= (c.ClipRect.Right) / (b-a);
h:= 1 / sx;
xmid:= c.ClipRect.Right div 2;
ymid:= c.ClipRect.Bottom div 2;
x:= a; max:= f(x);
min:= max;
while x <= b do begin y:= f(x);
if y < min then min:= y;
if y > max then max:= y;
x:= x + h; end;
sy:= c.ClipRect.Bottom / (max - min);
c.Brush.Color:= clBlack;
c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
c.Pen.Color:= clYellow; c.MoveTo(0, ymid);
c.LineTo(c.ClipRect.Right, ymid); c.MoveTo(xmid, 0);
c.LineTo(xmid, c.ClipRect.Bottom); x:= a; y:= f(x);
c.Pen.Color:= clWhite; c.MoveTo(xmid + round(sx * x), ymid - round(sy * y));
while x <= b do begin y:= f(x);
c.LineTo(xmid + round(sx * x), ymid - round(sy * y));
x:= x + h; end; end; end;
end. |
|
#10
|
||||
|
||||
|
А может такое подойдёт
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x0, y0: integer; // координаты начала координатных осей
dx, dy: integer; // шаг координатной сетки (в пикселях)
h, w: integer; // высота и ширина области вывода координатной сетки
x, y: integer;
lx, ly: real; // метки (оцифровка) линий сетки по X Y
dlx, dly: real; // шаг меток (оцифровки) линий сетки по X и Y
cross: integer; // счетчик не оцифрованных линий сетки
dcross: integer; // количество не оцифрованных линий между оцифрованными
begin
x0:= 30;
y0:= 220; // оси начинаются в точке (40,250)
dx:= 40;
dy:= 40; // шаг координатной сетки 40 пикселей
dcross:= 1; // помечать линии сетки X: 1 - каждую, 2 - через одну, 3 - через две
dlx:= 0.5; // шаг меток оси X
dly:= 1.0; // шаг меток оси Y, метками будут: 1, 2, 3 и т.д.
h:= 200;
w:= 300;
with form1.Canvas do
begin
cross:= dcross;
MoveTo(x0, y0);
LineTo(x0, y0 - h); // ось X
MoveTo(x0, y0);
LineTo(x0 + w, y0); // ось Y
// засечки, сетка и оцифровка по оси X
x := x0 + dx;
lx := dlx;
repeat
MoveTo(x, y0 - 3);
LineTo(x, y0 + 3); // засечка
cross := cross - 1;
if cross = 0 then //оцифровка
begin
TextOut(x - 8, y0 + 5, FloatToStr(lx));
cross := dcross;
end;
Pen.Style := psDot;
MoveTo(x, y0 - 3);
LineTo(x, y0 - h); // линия сетки
Pen.Style := psSolid;
lx := lx + dlx;
x := x + dx;
until (x > x0 + w);
// засечки, сетка и оцифровка по оси Y
y := y0 - dy;
ly := dly;
repeat
MoveTo(x0 - 3, y);
LineTo(x0 + 3, y); // засечка
TextOut(x0 - 20, y, FloatToStr(ly)); // оцифровка
Pen.Style := psDot;
MoveTo(x0 + 3, y);
LineTo(x0 + w, y); // линия сетки
Pen.Style := psSolid;
y := y - dy;
ly := ly + dly;
until (y < y0 - h);
end;
Canvas.Brush.Style:= bsCross;
Canvas.Brush.Color:= clRed;
Canvas.Pen.Color:= clRed;
Canvas.Ellipse(100, 100, 300, 200);
end; |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Dimka-super (06.06.2014)
| ||
|
#11
|
|||
|
|||
|
Спасибо!! Попробую!
![]() |
|
#12
|
|||
|
|||
|
СПАСИБО ОГРОМНЕЙШЕЕ!!!!!! Расписано, читаю.
Чего было-т. Я стал в Дельфи вставлять код, он расположился в линию. Стал его править. Вдруг весь код сбежал в окне вверх, я не мог его удержать. Стали расти цифры строк внизу. я пробовал дергать рычажок. И вдруг окно само стало всячески менять форму! Я в шоке. Я стал выключать дельфи. Дельфи замигал всеми формами и окнами, чаще и чаще, имено с частатой реального стробоскопа!! Все сверкает по глазам- все окна, форумы, надпись форум по программированию! Это риально было что-то!! Красиво! Вы такого еще не видели. Я тоже. Стремно! Я вырубил комп кнопкой с третьего раза не выясняя что это. Полежал минут 15. В кафе музыка, расслабон ниреальный. Только включил комп. Да, пока все путем. |
|
#13
|
||||
|
||||
|
4250 Что за бред такой? Явно перегрев у товарища
|
|
#14
|
|||
|
|||
|
Рисует!!!!!!!!
![]() |