Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2010, 21:40   #1
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию Incompatible types "HDC" and "Real"

Ребят, помогите кто может! пишу программу. выдает ошибку Incompatible types "HDC" and "Real". Уже всё перепробовал. не знаю что делать. программа для построения графика функции. объясните мне, пожалуйста, что я делаю неправильно. help!
Вот код программы:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x,y:real;
n:real;
begin
with Form1.Image1.Canvas do
begin
x:=-3;
while x<3 do
x:=x+0.3;
y:=(x*x*x)*Sin(x)-1.18;
Pixels[Round(100*x)+200,200-Round(20*y)]:=clBlack;
end;
Form1.Image1.Canvas.MoveTo(0,200);
Form1.Image1.Canvas.LineTo(500,200) ;
Form1.Image1.Canvas.MoveTo (250,0);
Form1.Image1.Canvas.LineTo(250,500) ;
n:=0;
while n<500 do
begin
n:=n+100;
Form1.Image1.Canvas.MoveTo(Round(n) ,190);
Form1.Image1.Canvas.LineTo(Round(n) ,190);
TextOut(n,200,FloatToStr((n-250)/50));
end;
n:=0;
while n<400 do
begin
n:=n+100;
Form1.Image1.Canvas.MoveTo(245,Roun d(400-n));
Form1.Image1.Canvas.LineTo(255,Roun d(400-n));
TextOut(245,400-n,FloatToStr(Round((n-200)/10)));
end;
end;
end.
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 21:46   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Процедуру TextOut вызываете неправильно )

Код:
BOOL TextOut(
  __in  HDC hdc,
  __in  int nXStart,
  __in  int nYStart,
  __in  LPCTSTR lpString,
  __in  int cbString
);
http://msdn.microsoft.com/en-us/libr...33(VS.85).aspx
netrino вне форума Ответить с цитированием
Старый 05.03.2010, 21:47   #3
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Код:
Вместо 
TextOut(n,200,FloatToStr((n-250)/50));
использовать 
Canvas.TextOut(n,200,FloatToStr((n-250)/50));
Тогда n здесь не может быть типа Real. Только целочисленный тип (Integer).

Последний раз редактировалось Karabash; 05.03.2010 в 21:49.
Karabash вне форума Ответить с цитированием
Старый 05.03.2010, 21:49   #4
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию

У меня уже голова кругом от этого...
Можете исправить, а? ребят... а то я уже всё... сдаюсь)))
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 21:50   #5
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию

Я n изменил на integer. теперь пишет Incompatible types "Integer" and "String"
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 21:52   #6
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию

всё сделал как вы посоветовали) работает! но как-то н играфик не рисует и подписи по осям в другом месте находятся формы... что делать?)
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 21:58   #7
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x,y:real;
  n : Integer;
begin
  with Form1.Image1.Canvas do begin
    x:=-3;
    while x<3 do begin
      x:=x+0.3;
      y:=(x*x*x)*Sin(x)-1.18;
      Pixels[Round(100*x)+200,200-Round(20*y)]:=clBlack;
    end;
  end;
  Form1.Image1.Canvas.MoveTo(0,200);
  Form1.Image1.Canvas.LineTo(500,200) ;
  Form1.Image1.Canvas.MoveTo (250,0);
  Form1.Image1.Canvas.LineTo(250,500) ;
  n:=0;
  while n<500 do begin
    n:=n+100;
    Form1.Image1.Canvas.MoveTo(Round(n) ,190);
    Form1.Image1.Canvas.LineTo(Round(n) ,190);
    Form1.Image1.Canvas.TextOut(n, 200,FloatToStr((n-250)/50));
  end;
  n:=0;
  while n<400 do begin
    n:=n+100;
    Form1.Image1.Canvas.MoveTo(245, Round(400-n));
    Form1.Image1.Canvas.LineTo(255, Round(400-n));
    Form1.Image1.Canvas.TextOut(245,400-n,FloatToStr(Round((n-200)/10)));
  end;
end;
В таком виде график рисуется. А где надо чтобы "подписи по осям" были?
Karabash вне форума Ответить с цитированием
Старый 05.03.2010, 22:01   #8
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию

Спасибо большое) Теперь мне осталось программу написать чтоб график нарисовать..
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 22:09   #9
savinkoff9090
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 10
По умолчанию

Вот смотрите, я сюда еще приписал программу которая строит график, но она тоже не хочет работать...

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x,y:real;
n:integer;
begin
with Form1.Image1.Canvas do
begin
x:=-3;
while x<3 do
x:=x+0.3;
y:=(x*x*x)*Sin(x)-1.18;
Pixels[Round(100*x)+200,200-Round(20*y)]:=clBlack;
end;
Form1.Image1.Canvas.MoveTo(0,200);
Form1.Image1.Canvas.LineTo(500,200) ;
Form1.Image1.Canvas.MoveTo (250,0);
Form1.Image1.Canvas.LineTo(250,500) ;
n:=0;
while n<500 do
begin
n:=n+35;
Form1.Image1.Canvas.MoveTo(n,190);
Form1.Image1.Canvas.LineTo(n,190);
Form1.Image1.Canvas.TextOut(n,200,F loatToStr((n-250)/50));
end;
n:=0;
while n<400 do
begin
n:=n+35;
Form1.Image1.Canvas.MoveTo(245,400-n);
Form1.Image1.Canvas.LineTo(255,400-n);
Form1.Image1.Canvas.TextOut(245,400-n,FloatToStr(Round((n-200)/10)));



x:=-3;
repeat
y:= (x*x*x)*Sin(x)-1.18;
Pixels[Round(100*x)+200,200-Round(20*y)]:=clRed;
x:=x+0,3;
until (x>=3);
end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Form1.Image1.Canvas.FillRect(Rect(0 ,0,ClientWidth,ClientHeight));
GrOfFunc;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GrOfFunc;
end;
end;
end;
end.

Про Pixels ошибку выдает...
savinkoff9090 вне форума Ответить с цитированием
Старый 05.03.2010, 22:18   #10
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Потому что Pixels это свойство класса TCanvas.
Код:
Form1.Image1.Canvas.Pixels[...]
И зачем приписывать "программу, которая строит график", если построение графика функции уже есть в первой процедуре TForm1.Button1Click.

Последний раз редактировалось Karabash; 05.03.2010 в 22:26.
Karabash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Под прикрытием "кризиса" наши доблестные "управители" хотят утопить нас в радиоактивных отходах mihali4 Свободное общение 1 17.01.2009 01:43