Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.06.2014, 18:28
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Обоснуйте пожалуста, где обьявить функцию?

В каком месте кода? Я скажем решил в процедуру 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  
Старый 06.06.2014, 19:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
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  
Старый 06.06.2014, 19:16
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ответ вижу!!
Ответить с цитированием
  #4  
Старый 06.06.2014, 20:05
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да, я видел. Рассматриваю код, пытаюсь понять закономерности. Там вообще то вроде еще координатная ось должна быть!
Ответить с цитированием
  #5  
Старый 06.06.2014, 20:12
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Dimka-super
...Там вообще то вроде еще координатная ось должна быть!
Откуда? Процедура её отрисовки DrawGraph присутствует, но ни разу не вызывается, рисуется лишь овал

Последний раз редактировалось Alegun, 06.06.2014 в 20:14.
Ответить с цитированием
  #6  
Старый 06.06.2014, 20:14
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Хм.. Да я не знаю. По описанию функция притязала на ее отрисовку.
Ответить с цитированием
  #7  
Старый 06.06.2014, 20:19
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Введение

В 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  
Старый 06.06.2014, 20:23
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Конечно, я, Димка, может что то не так прочёл иле не так понял, криво скопировал.

Да я и не знаю Дельфи. Я чуть знаком с С++ и совсем немного с Ассемблером, и другими языками.
Ответить с цитированием
  #9  
Старый 06.06.2014, 21:19
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не знаю.. Я должн был взять функцию внутрь бэгин- энд. Иначе она не может реагировать на нажатие кнопки. Верно? ....Выходит [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  
Старый 06.06.2014, 21:39
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А может такое подойдёт
Код:
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  
Старый 06.06.2014, 22:02
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо!! Попробую!
Ответить с цитированием
  #12  
Старый 06.06.2014, 23:15
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

СПАСИБО ОГРОМНЕЙШЕЕ!!!!!! Расписано, читаю.



Чего было-т. Я стал в Дельфи вставлять код, он расположился в линию. Стал его править. Вдруг весь код сбежал в окне вверх, я не мог его удержать. Стали расти цифры строк внизу. я пробовал дергать рычажок. И вдруг окно само стало всячески менять форму! Я в шоке. Я стал выключать дельфи. Дельфи замигал всеми формами и окнами, чаще и чаще, имено с частатой реального стробоскопа!! Все сверкает по глазам- все окна, форумы, надпись форум по программированию! Это риально было что-то!! Красиво! Вы такого еще не видели. Я тоже. Стремно! Я вырубил комп кнопкой с третьего раза не выясняя что это.

Полежал минут 15. В кафе музыка, расслабон ниреальный. Только включил комп.
Да, пока все путем.
Ответить с цитированием
  #13  
Старый 06.06.2014, 23:27
Аватар для Facepalm
Facepalm Facepalm вне форума
Прохожий
 
Регистрация: 03.02.2013
Сообщения: 40
Репутация: 2552
По умолчанию

4250 Что за бред такой? Явно перегрев у товарища
__________________
Ну ты понел ^_^.
Ответить с цитированием
  #14  
Старый 07.06.2014, 11:32
Dimka-super Dimka-super вне форума
Прохожий
 
Регистрация: 11.02.2014
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Рисует!!!!!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter