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