Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 672

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Не так давно начал изучать Делфи, но вот с канвой вообще понятия не имею как работать.
Поэтому прошу у вас помощи, надеюсь поможете.

"Написать программу для построения графиков функции y=f(t), где f(t) задана произвольным массивом данных, хранимого во внешнем файле, оси графика должны иметь разметку в виде сетки, цвет и толщина линии графика настраивается опционально."

Заранее очень благодарен.

Halls Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Halls (статус: Посетитель)
Вопрос отправлен: 11 октября 2011, 00:39
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Drinkenz

Здравствуйте, Halls!
Примерно так рисуется на канве.

procedure DriveLines;
var I: Integer;
begin
with Form1.Canvas do
  begin
  Pen.Width := 1;
  Pen.Color := clWhite;
  Brush.Color := clWhite;
  Rectangle ( 0, 0, Form1.ClientWidth, Form1.ClientHeight );
  I := 0;
  Pen.Color := clNavy;
 
  while I < ( Form1.ClientWidth ) do
    begin
    MoveTo ( I, 0 );
    LineTo ( I, Form1.ClientHeight );
    I := I + 25;
    end;
 
  I := 0;
 
  while I < ( Form1.ClientHeight ) do
    begin
    MoveTo ( 0, I );
    LineTo ( Form1.ClientWidth, I );
    I := I + 25;
    end;
  case Form1.RadioGroup1.ItemIndex of
    0: Pen.Color := clRed;
    1: Pen.Color := clGreen;
    2: Pen.Color := clBlue;
  end;
  Pen.Width := GraphWidth;
 
  LineTo ( 0, MassivDannih [0] );
  for I := 0 to 10 do
    begin
    Moveto ( I * 32, MassivDannih [I] );
    end;
  end;
 
end;
 
 
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  GraphWidth := TrackBar1.Position;
  DriveLines;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
begin
for I := 0 to 10 do
  begin
  MassivDannih [I] := random ( 24 );
  end;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  DriveLines;
end;
 
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  DriveLines;
end;

Ответ отправил: Drinkenz (статус: 1-ый класс)
Время отправки: 11 октября 2011, 01:56
Оценка за ответ: 5

Комментарий к оценке: Спасибо. Но всё-равно мало что понятно. :)

Ответ #2. Отвечает эксперт: min@y™

Угробил 1,5 рабочих смены!
Ну-ка зацени-ка.

Саму прогу прицепляю к ответу. Поиграйся.
Обрати внимание на подпапку "files". Там 3 готовых файла с графиками.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 октября 2011, 16:56
Оценка за ответ: 5

Комментарий к оценке: ЗДОРОВО!

Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 19 октября 2011, 12:50; участников в обсуждении: 3.
bugmenot

bugmenot (статус: 3-ий класс), 11 октября 2011, 01:20 [#1]:

Помощь заключается в выполнение Вашего домашнего задания за Вас?
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 11 октября 2011, 08:15 [#2]:

В чём заключается вопрос? "Напишите за меня лабу"?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

11 октября 2011, 08:15: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Лабораторный практикум » Delphi модератором min@y™

Halls

Halls (статус: Посетитель), 11 октября 2011, 08:48 [#3]:

С одной стороны можно сказать и так, потому что даже из кода сверху половины не понял :(.
С другой стороны охота, да и нужно научиться работать с канвой, а начинать решил с данной лабораторной, перед этим конечно почитал в общем виде про канву, рисовал фигуры, цвета изменял и т.д., но вот с графиками как то понятия не имею, что да как.
min@y™

min@y™ (статус: Доктор наук), 11 октября 2011, 09:20 [#4]:

Ну, так, чего ж ты хочешь-то? Определись уже.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Halls

Halls (статус: Посетитель), 11 октября 2011, 09:38 [#5]:

В данном случае "Напишите за меня лабу".
И если возможно, то с комментами где что, для чего и т.п....
min@y™

min@y™ (статус: Доктор наук), 11 октября 2011, 09:55 [#6]:

Цитата (Halls):

В данном случае "Напишите за меня лабу". И если возможно, то с комментами где что, для чего и т.п....

Это я могу. Осталось определиться с ценой вопроса. Сколько пива ставишь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Halls

Halls (статус: Посетитель), 11 октября 2011, 22:51 [#7]:

вот код, на что меня хватило
procedure TForm1.Button2Click(Sender: TObject);
begin
  with canvas do
    begin
      moveto (10,10);
      pen.color:=clblack;
      lineto (10,400);
      moveto (10,400);
      lineto (400,400);
      pen.Style:=psDot;
      i:=10;
      while i<400 do
        begin
          moveto(i,10);
          lineto(i,400);
          moveto(10,i);
          lineto(400,i);
          i:=i+30;
        end;
    end;
  a:=strtoint(listbox1.items[0])*30;
  b:=strtoint(listbox1.items[1])*30;
  edit1.text:=listbox1.Items[0];
  edit2.Text:=listbox1.Items[1];
  listbox1.Items.Delete(0);
  listbox1.Items.Delete(0);
  with canvas do
  begin
    pen.Style:=psSolid;
    moveto(x,y);
    lineto(10+a, 400- b);
    x:=10+a;
    y:=400-b;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  x:=10;
  y:=400;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  with canvas do
    begin
      pen.Style:=psSolid;
      moveto(x,y);
      lineto(10+a, 400- b);
      x:=10+a;
      y:=400-b;
    end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  button2.Enabled:=true;
  listbox1.items.LoadFromFile(filelistbox1.FileName);
end;
и сам исходник
http://zalil.ru/31851596
вроде как правильно, но вот у меня тока 1 четверть получилась, а хотелось бы полностью кардинатную ось
min@y™

min@y™ (статус: Доктор наук), 18 октября 2011, 21:31 [#8]:

Кто-то явно не хочет, чтобы мой ответ стал ответом месяца. Самаритянин, отзовись! Где комменты?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Halls

Halls (статус: Посетитель), 19 октября 2011, 12:12 [#9]:

Всё конечно очень круто.
Но Очень много лишнего, достаточно было нарисовать граффик и выбирать фаил с ПК. Да и разрешения файлов, тоже необязательно своё, можно обычный txt.
А на чём строиться сам граффик? В Images?
min@y™

min@y™ (статус: Доктор наук), 19 октября 2011, 12:50 [#10]:

Цитата (Halls):

Всё конечно очень круто. Но Очень много лишнего, достаточно было нарисовать граффик и выбирать фаил с ПК.

Что лишнее-то? Ты всё это сам просил сделать, когда по аське с тобой общались.

Цитата (Halls):

Да и разрешения файлов, тоже необязательно своё, можно обычный txt.

А что такое "разрешения файлов"? Может "расширение"? Получишь исходники - будешь иметь полное право поменять в них всё, что захочешь.

Цитата (Halls):

А на чём строиться сам граффик? В Images?

Что такое "Images", я не знаю. График строится на любой канве (ACanvas), в заданной прямоугольной области (ARect), которые передаются как параметры в метод Draw класса, отвечающего за отрисовку графика, хранение, загрузку и сохранение данных. Вот описание класса:
type
  // Тип данных - точка на плоскости
  TPoint2D = class
  private
    FX, FY: Single;
  public
    property X: Single read FX write FX;
    property Y: Single read FY write FY;
  end;
 
  PPoint2D = ^TPoint2D;
 
  // Класс-контейнер графика
  TPointChart = class
  private
    // Поля
    FPoints: TObjectList;  // список точек
    FBorderColor: TColor;  // цвет рамки
    FBorderWidth: Integer; // толщина рамки
    FGridColor: TColor;    // цвет сетки
    FGridWidth: Integer;   // толщина сетки
    FGridSizeX: Integer;   // кол-во горизонтальных шагов сетки
    FGridSizeY: Integer;   // кол-во вертикальных шагов сетки
    FShowGrid: Boolean;    // показывать/скрыть сетку
    FAxisColor: TColor;    // цвет осей
    FAxisWidth: Integer;   // толщина осей
    FLineColor: TColor;    // цвет линии графика
    FLineWidth: Integer;   // толщина линии графика
    FMarginX: Integer;     // ширина левого и правого полей
    FMarginY: Integer;     // высота верхнего и нижнего полей
    FFont: TFont;          // шрифт граничных меток
    FGridFont: TFont;      // шрифт отсечек сетки
 
    // Функции доступа к полям/свойствам
    function GetCount: Integer;
    function GetPoint(const Index: Integer): TPoint2D;
    function GetRootsExists: Boolean;
    procedure SetFont(ANewFont: TFont);
    procedure SetGridFont(ANewFont: TFont);
 
    // Технологические функции
  public
    // Конструктор и деструктор
    constructor Create;
    destructor Destroy; override;
 
    // Методы
    procedure Clear;
    function AddPoint(const X, Y: Single): TPoint2D;
    procedure DeletePoint(const Index: Integer);
 
    procedure Draw(ACanvas: TCanvas; const ARect: TRect);
 
    function SaveToFile(const FileName: string): Boolean;
    function LoadFromFile(const FileName: string): Boolean;
 
    // Свойства
    property Count: Integer read GetCount;
    property Points[const Index: Integer]: TPoint2D read GetPoint; default;
    property RootsExists: Boolean read GetRootsExists;
    property AxisColor: TColor read FAxisColor write FAxisColor;
    property AxisWidth: Integer read FAxisWidth write FAxisWidth;
    property BorderColor: TColor read FBorderColor write FBorderColor;
    property BorderWidth: Integer read FBorderWidth write FBorderWidth;
    property GridColor: TColor read FGridColor write FGridColor;
    property GridWidth: Integer read FGridWidth write FGridWidth;
    property GridSizeX: Integer read FGridSizeX write FGridSizeX;
    property GridSizeY: Integer read FGridSizeY write FGridSizeY;
    property ShowGrid: Boolean read FShowGrid write FShowGrid;
    property LineColor: TColor read FLineColor write FLineColor;
    property LineWidth: Integer read FLineWidth write FLineWidth;
    property MarginX: Integer read FMarginX write FMarginX;
    property MarginY: Integer read FMarginY write FMarginY;
    property Font: TFont read FFont write SetFont;
    property GridFont: TFont read FGridFont write SetGridFont;
  end;

З.Ы. Как же меня вымораживают ошибки в написании "...тся" и "...ться"!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.04 сек.