Как ввести программу в delphi

   Работа с графикой в Delphi это не только линии и рисунки, но также и печать текстовых документов. Поэтому в Delphi работе с графикой нужно уделить немного времени. Работа с графикой в Delphi предполагает обращение к канве - свойству Canvas компонентов. Canvas Delphi это холст, который позволяет программисту иметь доступ к каждой своей точке (пикселу), и словно художнику отображать то, что требуется.

Конечно, рисовать попиксельно для работы с графикой в Delphi не приходится, система Delphi предоставляет для мощные средства работы с графикой, облегчающие задачу программиста.

   В работе с графикой в Delphi в распоряжении программиста находятся канва (холст, полотно - свойство Canvas Delphi компонентов), карандаш (свойство Pen), кисть (свойство Brush) того компонента или объекта, на котором предполагается рисовать.

У карандаша Pen и кисти Brush можно менять цвет (свойство Color) и стиль (свойство Style). Доступ к шрифтам предоставляет свойство канвы Font. Эти инструменты позволяют отображать как текст, так и достаточно сложные графики математического инженерного содержания, а также рисунки. Кроме этого, работа с графикой позволяет использовать в Delphi такие ресурсы Windows как графические и видеофайлы.

   Конечно, не все компоненты в Delphi имеют эти свойства.

На вкладке Additional расположен специализированный компонент TImage, специально предназначенный для рисования, но также свойство Canvas имеют, например, такие компоненты как ListBox, ComboBox, StringGrid, а также и сама Форма, которая размещает наши компоненты!

Кроме того, для печати документов Delphi обращается к свойству Canvas такого объекта как принтер.

   Основное свойство такого объекта как Canvas Delphi - Pixels[i, j] типа TColor, то есть это двумерный массив точек (пикселов), задаваемых своим цветом.

Рисование на канве происходит в момент присвоения какой-либо точке канвы заданного цвета. Каждому пикселу может быть присвоен любой доступный для Windows цвет. Например, выполнение оператора

приведёт к рисованию красной точки с координатами [100, 100]. Узнать цвет пиксела можно обратным присвоением:

   Тип TColor определён как длинное целое (LongInt). Его четыре байта содержат информацию о долях синего (B), зелёного (G), и красного (R) цветов.

В 16-ричной системе это выглядит так: $00BBGGRR. Доля каждого цвета может меняться от 0 до 255. Поэтому чтобы отобразить максимально красную точку, ей нужно присвоить цвет $000000FF.
   Для стандартных цветов в Delphi определён набор текстовых констант.

Увидеть его можно, открыв в Инспекторе Объектов свойство Color, например, той же Формы.

   Следующая таблица содержит некоторые свойства и методы канвы:

Процедура TextOut(X, Y: Integer; const Text: WideString);
Производит вывод строки Text начиная с (X, Y) - левого верхнего пиксела текста.
Свойство TextWidth(var Text: String): Integer;
Содержит длину строки Text в пикселах.

Свойство TextHeight(var Text: String): Integer;
Содержит высоту строки Text в пикселах.
Процедура MoveTo(X, Y: Integer);
Производит перемещение позиции к пикселу с адресом (X, Y).

Процедура LineTo(X, Y: Integer);
Производит рисование прямой линии из точки текущей позиции к пикселу с адресом (X, Y). Адрес (X, Y) становится точкой текущей позиции.
Процедура FillRect(const Rect: TRect);
Заполняет прямоугольник Rect на холсте, используя текущую кисть.

Может использоваться, в том числе, для стирания части изображения на холсте.


   Напишем, используя только эти методы канвы, приложение для изображения на канве компонента Image текста, который вводится в компонент Memo:



   Расположите на форме компоненты Memo, Image (находится как ввести программу в delphi странице Additional), Как ввести программу в delphi, UpDown (находится на странице Win32).

Свойство Associate компонента UpDown приравняйте в выпадающем списке нашему компоненту Как ввести программу в delphi. Этим компонентом мы будем изменять размер шрифта. Поскольку и Memo и Image находятся у нас на одном устройстве вывода - на нашем экране, размер как ввести программу в delphi у них одинаков, и поэтому размеры изображения будут равны.



   Первое, что мы сделаем, это инициализацию переменных при старте программы.

Необходимо определить размеры области рисования (создадим для этого глобальную переменную Rect типа TRect) и сделать цвет фона Image белым:

   Затем нарисуем рамку по сторонам Image:

   Попробуем, что получилось. Всё работает, но рамка пока не выводится.

Поэтому добавим процедуру page в в процедуру FormCreate. Теперь красиво. Далее напишем простую процедуру стирания, очищения Image. Её нужно будет вызывать перед любым обновлением изображения, как ввести программу в delphi предыдущее и последующее изображения будут перекрываться.

   Теперь пришла очередь непосредственно процедуры вывода текста. Начнём выводить текст от точки (3, 3) - верхнего левого угла листа, с небольшим отступом в 3 пиксела.

Каждую последующую строку будем смещать на высоту строки:

   Теперь всё готово для вывода текста. Делать это будем по событию OnChange:

   Ну и напоследок процедура изменения размера шрифта:

   Можно модифицировать эту программу для вывода текста на печать.

Для работы с принтером нужно подключить модуль Printers:

   При работе с принтером как с полотном для начала печати вызывается метод BeginDoc, затем производится вывод документа, завершается как ввести программу в delphi вызовом метода EndDoc:

   Ширина и высота полотна принтера доступны через свойства Printer.PageWidth и Printer.PageHeight.

Закончить печать на одной странице и начать печатать на другой можно с помощью метода Printer.NewPage.


Создание интерфейса           В начало урока          Потоки в Delphi  

Уроки Delphi начинающим



Вопросы и комментарии (129)      Решение задач в Delphi

Сергей, добавлено 8.10.10, 11:26:02 
У меня есть форма, на ней расположенны несколько элементов; такие как ScrollBox на которой в свою очередь так же раположенны некоторые элементы тем самым создовая Определенный документ который я хочу распечатать подскажите как мне это лучше сделать?????


Автор, добавлено 8.10.10, 15:48:46 
Хм, распечатывайте каждый из этих элементов по очереди. Неопределенный ответ на неопределенный вопрос. Графика и печать - большая тема, в двух словах не раскроешь, я только начал. Продолжить завтра смогу, пожалуй с того как напечатать табличку.
Сергей, добавлено 11.10.10, 16:04:05 
Еще раз попробую сформулировать чего я хочу добится
например есть главная форма где вводятся данные человека (ФИО, и т.д.)они должны записаться в другой форме где я расположил компоненты в виде карточки ну скажем медицинской, и эти саммые данные мне нужно вывести в печать.

как мне лучше это сделать?


Автор, добавлено 11.10.10, 16:29:30 
Можно наверное так, как это сделано в программе выше. Сначала выведите все данные в Memo, пусть даже он будет невидимым, а при разработке и видимым для наглядности, а затем перенесите это на принтер, как показано как ввести программу в delphi.

Только вместо Image1.Canvas напишите Printer.Canvas и размеры области печати тоже нужно модифицировать.


veronica, добавлено 17.12.10, 21:43:38 
как сделать чтобы вместо цвета формы была картинка, помогите пожалуйста
Автор, добавлено 18.12.10, 09:20:06 
Нужно воспользоваться методом холста Формы

Form1.Canvas.StretchDraw()

Он принимает параметры

Rect - прямоугольник с размерами рисунка
var Rect: TRect;

Graphic - один из классов изображений, например TBitmap
var Foto: Как ввести программу в delphi

Соответственно, в обработчике OnCreate Формы создаём прямоугольник с размерами Формы:

Rect.Left:=0;
Rect.Top:=0;
Rect.Right:=Width;
Rect.Bottom:=Height;

и объект Bitmap:

Foto:=TBitmap.Create;

Bitmap имеет метод загрузки изображений:

Foto.LoadFromFile('Адрес_Рисунка');

Выводить рисунок нужно не в момент создания Формы, а с небольшой задержкой, я ввёл её с помощью таймера, имеющего задержку 10 мс.

Вот и всё. Получилось:


Антон, добавлено 31.01.11, 21:00:34 
А где же обещанная печать таблички?
Автор, добавлено 31.01.11, 21:14:34 
Антон! Спасибо что напомнил!
Антон, добавлено 1.02.11, 18:58:41 
Незачто))) А как понимать фразу ". Печать документа ." В кодеPrinter.BeginDoc;
with Printer.Canvas do
  begin
.

Печать документа .
  end;
Printer.EndDoc;


Автор, добавлено 1.02.11, 19:56:42 
Это значит, что я не буду же за вас документы печатать! Методы я показал, как линеечки поводить, должно быть понятно, как буковки печатать. Вот и таблицу уже самим можно делать. В общем, пробовать надо. Тогда станет, например, и самому понятно, что нужно сначала буковки в табличке печатать, а как ввести программу в delphi уже ячейки рисовать, иначе в некоторых местах линеечки будут затёрты!

Но, конечно, в скорости про печать таблиц сделаю.


Новичок , добавлено 27.03.11, 21:46:45 
Извините, а как ввести программу в delphi поставить нужную иконку после создания в ярлык?


Автор, добавлено 27.03.11, 21:59:29 
Также извините, вопрос не понял. Ярлык программы? Тогда так:

 Application.Icon.LoadFromFile('имя файла с иконкой');

Или сразу через меню Delphi: Как ввести программу в delphi - Options.

и в появившемся окне на вкладке Application есть кнопка для загрузки иконки приложения.


Дмитрий, добавлено 7.04.11, 15:52:06 
подскажите пожалуйста как перемещать один image по другому?
Автор, добавлено 7.04.11, 16:24:11 
Дмитрий, что значит перемещать? Двигать по Форме?

А каков ваш вариант? В общем, не понял вопрос.


Дмитрий, добавлено 24.04.11, 14:36:57 
Немного размытокак ввести программу в delphi смысл понятен
Вячеслав, добавлено 17.05.11, 12:30:37 
Как перевести пиксели в миллиметры?
Вячеслав, добавлено 17.05.11, 12:33:01 
Как згенерировать процедуру "procedure TForm1.page;" - после нажатия Ctr+Shift+C выдайотса ошыбка???


Автор, добавлено 17.05.11, 14:22:36 
А вручную написать влом? Я так делаю. Как ввести программу в delphi пикселей. Есть метод экрана (объекта Screen) PixelsPerInch - переводит пиксели в дюймы. А далее дюймы в мм: 1 дюйм равен 25.4 мм.
Андрей, добавлено 5.08.11, 13:39:11 
Здравствуйте.

Как загрузить экселевский файл (или т.п.) в виде рисунка? В какой компонент не важно, просто основная цель загрузить док и наложить сверху еще несколько картинок с переменным положением (задаваемым вручную).


Автор, добавлено 5.08.11, 14:49:22 
Как вы это представляете?

Дело в том, что экселевский как ввести программу в delphi это не рисунок, даже если и содержит рисунок. Что, нужно их экселевского файла средствами delphi выделить рисунок? Не проще ли сделать это ручками, достать рисунок, сохранить у себя использовать?


Автор, добавлено 5.08.11, 14:53:07 
Можно ещё открыть программу Excel в рамках формы delphi, и попробовать наложить сверху другие рисунки.

Здесь посмотрите: cyberforum.ru/delphi-beginners/thread274393-page2.html


Данил, добавлено 6.09.11, 14:40:55 
Можете показать что в итоге получается, плз!
Автор, добавлено 6.09.11, 15:45:54 
Это вы об чём?
Данил, добавлено 6.09.11, 20:02:50 
Я о програмке, ради которой создавалась эта страничка. Просто я написал все что выше изложено и никакого результата.Компилятор срабатывает без ошибок.

Возможно я что то недопонимаю - я в delphi новичок.


Автор, добавлено 7.09.11, 04:26:04 
Теперь понял. Хорошо, в течение дня выложу архив с рабочим проектом.
Автор, добавлено 7.09.11, 12:14:31 
Данил, кстати, ваша проблема, видимо, в том, что вы просто все процедуры скопировали в проект, но не сопоставили с обработчиками событий компонентов.

То есть у как ввести программу в delphi компоненты не привязаны к этим процедурам. Посмотрите, какие обработчики компонентов используются, щёлкните по ним в Инспекторе Объектов - появятся процедуры, которые могут им соответствовать.

Тогда всё и заработает.


Данил, добавлено 12.09.11, 07:02:39 
Спасибо, помогло!!!
нубчик, добавлено 12.09.11, 20:37:51 
не работает у меня (( ошибки на page;clearing;prn;Memo1Change и прочее они же не заданы никак
Автор, добавлено 12.09.11, 22:15:00 
Да, подождите пару дней, я переделал пример, чтобы сразу всё было правильно.
А впрочем, прежде чем изучать графику, научитесь создавать процедуры, тогда поймёте как их задавать, чтобы они заработали.

А пока просто добавьте в описание класса Формы, там где


Данил, добавлено 13.09.11, 14:11:51 
Доброго времени суток, Автор!
Если не сложно - подскажите пожалуйста. Пишу программку для печати пропусков. Возникла проблема с выводом на печать.
Разрешение принтера больше чем разрешение экрана.

Я масштабировал изображение, но оно получилось очень нечетким. Как с этим бороться?


Автор, добавлено 13.09.11, 16:01:20 
Чтобы ответить, мне нужно ''поковыряться'', но принтера нет. Так что эту тему я плохо знаю, извините.
Я, добавлено 13.10.11, 22:12:16 
А как обозначить что принтер будет печатать?


Автор, добавлено 13.10.11, 22:24:57 
Что как ввести программу в delphi "обозначить"? Сделать сообщение, что сейчас начнётся печать? Или задать текст, который будет напечатан? Короче, не понял фразы.
Я, добавлено 13.10.11, 22:29:22 
Всмысле, какой компонент?
Автор, добавлено 13.10.11, 22:32:59 
Растолкуйте значение первой фразы, пожалуйста - что вы хотите уточнить.
Автор, добавлено 13.10.11, 22:34:39 
Принтер будет печатать то, что будет расположено между BeginDoc и EndDoc.

Это обычное рисование методами канвы.


Андрей, добавлено 7.11.11, 12:59:22 
А как передать рисунок с одной формы на другую в Image
Автор, добавлено 7.11.11, 13:13:38 
Нет ничего проще.

Image1.Picture:=Form1.Image1.Picture;
Олег, добавлено 14.02.12, 17:16:38 
Здравствуйте автор. Прочел ваши рекомендации по поводу графики.

Но решить свою проблему никак не могу, вот: вывести график функции, образованной сложением двух синусоид. Период одной в 5 раз больше периода.

Из математики понимаю, что график будет в в виде синусоиды, только не плавные перегибы, а частотные на всем определении функции. Так же понимаю, что график будет лежать на канве и отсюда длина оси х и будет длина формы. Помогите разобрать эту как ввести программу в delphi.



вот сумел сделать синусоиду, но без периода, вот код - работает!

procedure TForm1.FormPaint(Sender: TObject);
 var
 X,Y: real; // координаты функции
 PX,PY: longint; // координаты пикселей
begin
 Color:=clWhite;
 Canvas.MoveTo(0,ClientHeight div 2);
 for PX:=0 to ClientWidth do как ввести программу в delphi begin
  {X - аргумент графика,
  соответствующий пикселю с координатой РХ}
  X := PX*4*Pi/ClientWidth;
  Y := 2*Sin(X);
  {PY — координата пикселя,
  соответствующая координате Y}
  PY := trunc(ClientHeight - (Y+1)*ClientHeight/2);
  {Проводится линия на графике}
  Canvas.LineTo(PX,PY);
  end;
end;


Автор, добавлено 15.02.12, 00:05:18 
С утра посмотрю.


Автор, добавлено 15.02.12, 10:46:31 
Всё написал, затем Касперский заблокировал работу и всё удалил. Вирус, видите ли, обнаружил! Повторяю:

Я бы проще делал. Сначала провёл бы координатную линию по оси Х: и засечки, соответствующие периоду в 2*Pi:

Затем строил бы график функции Y:=sin(X)+sin(X/5):

Но получается не график, а мазня - всё слишком мелко.

Вводим масштаб, по Х в 20 раз, а по Y во все 100. И вот что получается:

Единственно, засечки перенёс вниз процедуры, выкрасил в красный цвет, как ввести программу в delphi сделал потолще.


кирилл , добавлено 28.02.12, 17:40:03 
Добрый как ввести программу в delphi могу доделать работу подскажите: необходимо чтобы окружность маленького радиуса двигалась по линиям семилучевой звезды.

вот наработки мои:
procedure TForm3.a(Sender: TObject; var Key: Char);
begin
cc:=key; edit1.Text:=key;
end; //отвечает за управление как ввести программу в delphi

procedure TForm3.s(Sender: TObject);
var x,y,r,j,i:word; B:array[1.360] of integer;G:array[1.360] of integer;
a:real;
begin
R:=200;
for i:=0 to 360 do
begin
  if i mod 45=0 then
  a:=(i*pi)/180 ;
x:=250+round(R*cos(a));
y:=250+round(R*sin(a));
b[i]:=x; g[i]:=y;
end;
canvas.MoveTo(b[45],g[45]);
canvas.LineTo(b[180],g[180]);
canvas.LineTo(b[315],g[315]);
canvas.LineTo(b[90],g[90]);
canvas.LineTo(b[225],g[225]);
canvas.lineto(b[360],g[360]);
canvas.LineTo(b[135],g[135]);
canvas.LineTo(b[270],g[270]);
canvas.LineTo(b[45],g[45]); //начертил семиугольник.


begin
form3.Color:=clnavy;
form3.KeyPreview:=true;
canvas.Pen.Width:=3; a:=0;
repeat
Application.processMessages;
canvas.Pen.Color:=clyellow;
canvas.ellipse(x,y,x+12,y+12);
sleep(5);
canvas.Pen.color:=clNavy;
Canvas.Ellipse(x,y,x+12,y+12) ; //пустил эллипс с одинаковыми радиусами по линиям.

но вот это и не получается.
until cc='q'; // клавиша q отвечает за конец операции иначе не остановить.

end;
end;
end.


Автор, добавлено 28.02.12, 19:52:52 
Через часок доберусь домой, посмотрю.
Автор, добавлено 29.02.12, 06:59:28 
Вот начертили вы семиугольник.

Затем закрасили Форму синим. Каждый пиксел стал синим. И семиугольник что? - пропал. Форму красить сразу нужно, а затем семиугольник рисовать.

Далее. Рисуем эллипс.

canvas.Pen.Width:=3; a:=0;
repeat
Application.processMessages;
canvas.Pen.Color:=clyellow;
canvas.ellipse(x,y,x+12,y+12);
sleep(5);
canvas.Pen.color:=clNavy;
Canvas.Ellipse(x,y,x+12,y+12) ;
until cc='q';

a:=0; - зачем, где это используется?



Как будет движение осуществляться? Координаты же не меняются.

А как вы собираетесь вычислять каждый пиксел вашей звезды, чтобы эллипс по ней шёл? Это не констатация ошибки, просто интересно.



И красивее когда центр окружности движется по линии, а у вас угол квадрата, куда она вписана. Правильнее так:

Canvas.Ellipse(x-6,y-6,x+6,y+6) ;

А остановка движения. Через ввод символа в Edit??? Естественнее ввести переменную

var Move: Boolean=False;

А цикл такой:

repeat
вычисления
until Move=False;

Ну и менять переменную нажатием кнопки:

Move:=not Move;


кирилл, добавлено 29.02.12, 19:11:44 
да,вначале красим форму синим, чертим семиугольник тоже синим, чтоб как ввести программу в delphi форме его не было видно, потом запускаем окружность по заданной нам траектории семиугольника, остановка движения производится вводом символа q в эдит.

Вот.
но существует проблема, тот код который я написал не работает, он даже не чертит семиугольник. Нужно запускать цикл, точнее семь циклов для траектории, но я не знаю как это сделать.


Автор, добавлено 1.03.12, 09:17:19 
Да. Ваша фигура, естественно, не семилучевая, а восьмилучевая звезда. Для правильного её рисования нужно сместить begin на 1 строку вниз:

Автор, добавлено 1.03.12, 09:29:46 
А дальше и в самом деле нужно 8 циклов, где окружность будет двигаться из угла в угол.


Автор, добавлено 1.03.12, 16:11:26 
И ещё. Я путём высоконаучных экспериментов выЯснил, что запустить эллипс в той же процедуре не получается. Введите таймер, и последним оператором в процедуре активируйте. По каждому срабатыванию стирайте старый эллипс, меняйте координаты, рисуйте новый.
кирилл, добавлено 10.04.12, 20:59:26 
Создать массив из 8-ми объектов изображающих движение двух треугольников в пределах формы по случайным траекториям.

пропорции и скорость движения выбираются на вкус. В программе предусмотреть алгоритм перехода от одного объекта к другому. т.е. создать радиогруппу из 8 радиокнопок и на каждую кнопку повесить различные по масштабу треугольники с различной скоростью движения. помогите не могу сообразить


Автор, добавлено 10.04.12, 21:16:51 
Мне всё понятно, за исключением объектов.

Что это за объект, изображающий движение двух треугольников? Изобразить это можно например на компоненте Image. Ну, массив из 8 Image. При выборе радиокнопки один из Image видим, остальные. Может, так?


кирилл, добавлено 11.04.12, 14:12:24 
я если честно,тоже не все понимаю скорей всего это
type как ввести программу в delphi и ProcedureShow; ProcedureHide;
Глеб, добавлено 14.04.12, 21:44:57 
Добрый день!

Помогите мне в такой проблеме. Мне надо чтобы при запуске моей программы не было рамок формы!

Я сам не знаю как это делать как ввести программу в delphi или в настройках есть такая опция. Дельфи 7 лайт


Автор, добавлено 14.04.12, 21:58:01 
Свойство Формы BorderStyle, значение bsNone. Я про это в первом же уроке написал. Можно и программно, по событию OnCreate, или сразу в Инспекторе Объектов.
Глеб, добавлено 15.04.12, 14:58:11 
Только вот есть одно дополнение) если ставить bsNone - то фору нельзя двигать по рабочему столу, а мне это нужно
Автор, добавлено 15.04.12, 15:27:00 
Нужно сделать функционал, который будет как ввести программу в delphi при нажатии левой клавиши мышки её координаты на Форме, и при последующем движении мышки поддерживать эти координаты постоянными:

Xo и Yo - глобальные переменные.


Олеся, добавлено 17.04.12, 19:09:00 
Подскажите,пожалуйста,как работать с относительньіми координатами?чтоб изменяя размер формьі,размер рисунка тоже менялся.заранее спасибо!


Автор, добавлено 17.04.12, 23:38:20 
Canvas имеет такой метод как StretchDraw, который выводит рисунок в любой заранее определенный прямоугольник. Более развернуто, с примером, смогу ответить завтра к вечеру.


Антон, добавлено 18.04.12, 17:14:11 
Здравствуйте. Скажите пожалуйста, какими способами как ввести программу в delphi задавать цвета рисования в делфи.


Мне для решения задачи необходимо, что бы при повышении значения переменной x цвет точки на экране менялся по градиенту от зеленого к красному.
Спасибо.


Антон, добавлено 18.04.12, 17:59:22 
И еще, скажите каким как ввести программу в delphi нужно в делфи рисовать круг. Понятно, что при помощи функции ellipse, но у меня компилятор ругается на нее, выдавая следующую ошибку There is no overloaded version of 'Ellipse' that can be called with these arguments.


Что и где нужно ввести, как ввести программу в delphi бы он понял меня?


Автор, добавлено 18.04.12, 20:13:03 
Что касается Ellipse, то что-то вы неправильно задали. Вот попробуйте просто:

Form1.Canvas.Ellipse(100, 100, 200, 200);

И всё нарисуется.Напишите ваш вариант, вместе посмотрим что не.



А насчёт цвета, как выше написано, это целая величина, в 16-ричном виде $00BBGGRR. Самый красный цвет: $000000FF, самый зелёный: $0000FF00. Вот и делайте сумму двух переменных: green и red, где green будет постепенно уменьшаться от $0000FF00 до $00000000, а red постепенно увеличиваться от $00000000 до $000000FF. Для этого от green отнимайте $00000100, а к red прибавляйте $00000001. Но помните, что делать это можно не более $FF раз, то есть от 0 до 255.

Вот как-то так:

Вначале цвет совсем зелёный, а в конце совсем красный. Поэтому можно выбрать диапазон изменения где-то посредине. Но здесь я не истина в последней инстанции, всё это только что придумал. Может, есть и более лучший вариант.


Антон, добавлено 18.04.12, 20:23:25 
Разобрался с проблемой по рисованию окружности.
Ну как разобрался. На ее месте тут же встала другая. Компилятор требует, что бы циферки в скобочках после ellipse были константами.

Но меня это не устраивает, нужен тип хотя бы integer, а то и вовсе real. Как этого добиться?


Автор, добавлено 18.04.12, 20:28:18 
Ну почему константами:

procedure TForm1.Button1Click(Sender: TObject);
var x1, y1, x2, y2: Integer;
begin
X1:=100; y1:=100;
X2:=200; y2:=200;
canvas.Ellipse(x1, y1, x2, y2);
end;

А вот насчёт Real вы загнули.

Это же координаты в пикселах. Где вы видели нецелый пиксел? А если вы вычисляете некую формулу, то нужно округлять функцией Round.


Антон, добавлено 18.04.12, 20:32:12 
У меня на вот такую запись Image1.Canvas.Ellipse(x-6,y-6, x+6,y+6);
выдается вот такая ошибка Constant expression expected
Может я не понимаю, что она означает?
Автор, добавлено 18.04.12, 20:43:01 
Взял вашу строчку скопировал - ничего не выдаётся, рисуется кружочек.


Антон, добавлено 18.04.12, 20:44:40 
Если нужно, то вот полный текст программы

 Read(F, x,y,radon);
 case radon of
 1.10: Image1.Canvas.Brush.Color:=clGreen;
 11.20: Image1.Canvas.Brush.Color:=clYellow;
 21.30: Image1.Canvas.Brush.Color:=clRed;
 Image1.Canvas.Ellipse(x-6,y-6, x+6,y+6);
 end;

end.


Автор, добавлено 18.04.12, 21:00:27 
Оператор case неправильно использовали. Перенесите

Image1.Canvas.Ellipse(x-6,y-6, x+6, y+6);

за end; 
Антон, добавлено 18.04.12, 21:06:14 
Огромное спасибо, вы даже не подозреваете, насколько вы помогли (не только мне).
Антон, добавлено 18.04.12, 21:09:21 
Но оказывается мои мучения не закончились.

Как ввести программу в delphi проблема в чтении файла. У меня данные представлены в виде трех столбцов в файле txt по сути - просто 3 числа в строке.

Когда программа считывает данные, как она это делает? (имеется в виду все три числа сразу или по одному?)


Автор, добавлено 18.04.12, 21:20:02 
Текстовый файл читается построчно. Лично я не заморачиваюсь и читаю текстовые файлы компонентами типа Memo, или создаю для этого StringList.


Антон, добавлено 18.04.12, 22:05:34 
Переделал с условием перевода строк в числа, и разбиения строки на три числа (пишутся через пробелы), но опять ругается на несовместимость типов.
while (not EOF(F)) do
 begin
 Read(F, s);
 p:=pos(' ', s);
 x:=StrToInt(copy(s, 1, p-1));
 s:=delete(s, 1, p);
 p:=pos(' ', s);
 y:=StrToInt(copy(s, 1, p-1));
 s:=delete(s, 1, p);
 radon:=StrToInt(s);
 case radon of как ввести программу в delphi Image1.Canvas.Brush.Color:=clGreen;
 11.20: Image1.Canvas.Brush.Color:=clYellow;
 21.30: Image1.Canvas.Brush.Color:=clRed;
 end;
 Image1.Canvas.Ellipse(x-6,y-6, x+6,y+6);
end;
Автор, добавлено 18.04.12, 22:14:51 
Мне интересно, а то что вы прочитали в строку S, это и правда три числа, вы проверяли?

Выведите в какой-нибудь компонент, я использую Form1.Caption для проверки что там.


Антон, добавлено 18.04.12, 22:22:05 
Пробовал только.

Я просто удалил все разбиение строки, добавил Memo и попытался записать строку. Программа зависла. Я специально вставил вместо Reset (оно было выше и в скопированный кусок как ввести программу в delphi вошло) Rewrite. Но файл не перезаписался. То есть программа не дошла и до.

Тем не менее, текст который был на тот момент в Memo исчез. Что это за бред я не знаю. В файле лежат три строки по три числа. Ниже код.


Антон, добавлено 18.04.12, 22:22:31
 s:=delete(s, 1, pos(' ', s));
 p:=pos(' ', s);
 y:=StrToInt(copy(s, 1, pos(' ',s)-1));
 s:=delete(s, 1, pos(' ', s));
 radon:=StrToInt(s);

Антон, добавлено 18.04.12, 22:30:24 
В этом коде программа ругается на несоответствие типов в процедурах delete
(Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter')
Автор, добавлено 18.04.12, 22:39:16 
ТщательнЕЕ.

delete это не функция а процедура. Присвоение нужно убрать. И вообще, вместо чтения файла построчно, считайте файл в Memo целиком и читайте строки оттуда. Что-то меня смущают эти операции. Вроде как текстовый файл читается не Read а Readln.


Аноним, добавлено 18.04.12, 22:52:29 
Нннда, заработался видать.

Преогромное вам спасибо, программа прекрасно работает. Еслибы не вы. в общем было бы очень плохо. Чуть позже я адаптирую эту программу под нужные условия и в дальнейшем она будет указывать на опасность возникновения оползня в том или ином районе.


Аноним, добавлено 21.04.12, 16:03:44 
Скажите, а как можно сохранить в памяти программы изображение нарисованное на Image?
Просто у меня при изменении размеров формы изменяются размери Image, соответствено рамку по краям и белый фон приходится прорисовывать заново, а значит изображение стирается.

Я пробовал так
Picture:=Image1.Picture;
clearing;
page;
Image1.Picture:=Picture;
Но изображение не появляется.
И еще один ворпос: почему у меня при изменении как ввести программу в delphi формы Image может увеличиваться только до определеного предела?

В какой-то момент размеры формы продолжаюи изменяться, а размеры Как ввести программу в delphi - нет, при этом исчезает граница (прорисована процедурой page) с той стороны, с которой происходило увеличение.


Автор, добавлено 21.04.12, 16:30:09 
А как изображение вообще в Image появляется? А если ещё раз так же как и в первый?


А насчёт размеров - напишите как вы изменяете размер, посмотрим.


Аноним, добавлено 21.04.12, 16:47:43 
Изображение считывается по как ввести программу в delphi данным из указанного мной файла.

Считывание происходит по событию нажатия кнопки. Если сослаться на это нажатие, то считывание произойдет даже в том случае, если у меня Image чистая, тоесть при изменении размеров формы картинка появится в любом случае.
А вот код изменения размеров Image:
procedure TForm1.FormResize(Sender: TObject);
var picture : TPicture;
begin
Image1.Height := Form1.Height-130;
Image1.Width := Form1.Width-267;
Image1.Left := 24;
Image1.Top := 16;
Picture:=Image1.Picture;
clearing;
page;
Image1.Picture:=Picture;
end;


Автор, добавлено 21.04.12, 17:12:18 
Понятно насчёт размеров.

Вы бы не размер Image фиксировали, а расстояние до нижнего и правого краёв Формы. По событию OnCreate Формы вычисляли бы и потом изменяли бы ширину и высоту чтобы эти значения оставались постоянными. Тогда правый и нижний края Image не будут вылезать за правый и нижний края Формы.


Аноним, добавлено 21.04.12, 17:19:11 
Так они у меня и так не вылезают за края.

У меня наоборот при определенном увеличении размеров формы Image перестает увеличиваться. Я собственно именно так и делаю, как вы предложили, за тем исключением, как ввести программу в delphi расстояния до правого и нижнего краев у меня вычесленны не в коде программы, а заренее.


Аноним, добавлено 21.04.12, 17:20:09 
Если все равно не понятно, то скажите, куда можно выложить скрины программы.
Автор, добавлено 21.04.12, 17:34:18 
Понятно. Вернее непонятно.

как ввести программу в delphi

Но меня размер компонента меняется как угодно. Попробуйте в другом, тестовом проекте сделать процедуру изменения размеров, посмотрите в чём разница.


Аноним, добавлено 21.04.12, 18:01:07 
Пробовал и в других своих программах делать процедуру изменения размеров - то же. Что интересно: размер Image не превышает тех размеров, которые имел первоначально.

И что самое главное: попытка увеличить его на форме (на этапе задания размеров) ни к чему не приводит.


Аноним, добавлено 21.04.12, 18:12:56 
Сделал как надо (правда через одно место, увеличив размеры Image еще на этапе как ввести программу в delphi, затем развернул форму и свернул ее снова).


Тут возможны два варианта: либо глючность Delphi, либо ошибка в процедуре прорисовки рамки и белого фона (эту процедуру, кстати я безжалостно содрал из урока выше).
procedure TForm1.clearing;
begin
 Rect.Left:=0;
 Rect.Top:=0;
 Rect.Right:=Image1.Width;
 Rect.Bottom:=Image1.Height;
 Image1.Canvas.Brush.Color:=clWhite;
 Image1.Canvas.FillRect(Rect);
end;
Вот мне интересно: не из-за того ли проблема, что переменные Rect.Right Rect.Bottom
не меняются при повторном вызове процедуры?


Автор, добавлено 21.04.12, 18:38:34 
А! Да. И имидж у вас меняет размеры, только этого не. Ведь он не имеет собственных границ, и мы видим только то что нарисовано. Если размер имиджа меньше размера рисунка, то и будет обрыв. Так что меняйте Rect.
Аноним, добавлено 21.04.12, 18:49:28 
А вот нифига, похоже как ввести программу в delphi глюки Делфи. Других объяснений я не вижу. Да, Image действительно меняет размеры, но вот прямоугольник хоть убейте не хочет прорисовываться больше чем начальные размеры Image.


Скажите, а как ввести программу в delphi эти две переменные: Image1.Width Image1.Height, они точно изменяются?


Аноним, добавлено 21.04.12, 18:50:06 
Хотя по идее должны, я же присваиваю им новые значения в зависимости от размеров формы.
Автор, добавлено 21.04.12, 19:20:17 
А вот выведите куда-нибудь значения размеров и посмотрите.

А вообще Canvas имеют и другие компоненты, StringGrid например. Оставить одну ячейку и рисовать в ней, там Rect уже определён.


Глеб, добавлено 28.04.12, 18:40:22 
Добрый день

А можно в дельфи сделать форму не квадраную, а скажем с закругленными краями?

Допусти чтобы при запуске программы отображалась форма в виде круга


Автор, добавлено 28.04.12, 21:47:27 
Да, это. Но описывать создание регионов у меня желания. Хотите, погуглите сами: "создание регионов delphi".
Глеб, добавлено 29.04.12, 13:26:00 
procedure TForm1.FormShow(Sender: TObject);
  var
  frm: HRGN;
begin
frm := CreateRoundRectRgn(0, 0, form1.Width,form1.Height100 ,100);
  SetWindowRgn(form1.Handle, frm, FALSE);
  end;
end.



Вот пример прямоугольника с закругленными как ввести программу в delphi.
Автору спасибо как ввести программу в delphi "ключ" поиска


Олег, добавлено 10.05.12, 18:32:43 
здравствуйте,помогите в такой проблеме необходимо создать движение квадратика по сложной хаотичной траектории и создать 5 радиокнопок изменяющие габариты ,цвет квадратика и скорость передвижения.

вот движение по сложной траектории квадратика ,а как сделать радиокнопки и задать им св-ва я не знаю,помогите:
var
inx,y,h,w: word;
a,b:real;
r,q,z:byte;
begin Randomize ; h:=form1.height; w:=form1.width;
button1.top:=h; form1.color:=clblack;
x:=300; y:=250;
form1.keypreview:=true; canvas.pen.width:=3;
repeat h:=random(200)+20; a:=random*8-4; b:=random*8-4;
r:=random(50)+40 ; g:=random(150);z:=random(256);
for i:=1 to n do begin application.processmessages;
x:=round(x+a*sin(i/20)+a/2); if (x>w)or(x



Источник: http://www.delphi-manual.ru/drawing.php?com=yes

Copyright © 2018.