|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Рисует!!!!!!!!
|