Как сделать скат горки своими руками

Как сделать скат горки своими руками

   Работа с графикой в 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-ричной системе это выглядит так:

   Работа с графикой в 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-ричной системе это выглядит так: BBGGRR. Доля каждого цвета может меняться от 0 до 255. Поэтому чтобы отобразить максимально красную точку, ей нужно присвоить цвет 0000FF.
   Для стандартных цветов в Delphi определён набор текстовых констант. Увидеть его можно, открыв в Инспекторе Объектов свойство Color, например, той же Формы.

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

procedure TForm1.FormCreate(Sender: TObject);
begin
Rect.Left:=0;
Rect.Top:=0;
Rect.Right:=Image1.Width;
Rect.Bottom:=Image1.Height;
Image1.Canvas.Brush.Color:=clWhite;
end;

procedure TForm1.page;
begin
with Image1.Canvas do
  begin
    MoveTo(0, 0);
    LineTo(Image1.Width-1, 0);
    LineTo(Image1.Width-1, Image1.Height-1);
    LineTo(0, Image1.Height-1);
    LineTo(0, 0);
  end;
end;

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

procedure TForm1.clearing;
begin
Image1.Canvas.FillRect(Rect); //Прямоугольник Rect заполняется белым цветом, изображение стирается.
end;

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

procedure TForm1.prn;
var i: Integer;
begin
with Image1.Canvas do
  for i:=1 to Memo1.Lines.Count do
    TextOut(3, 3+(i-1)TextHeight('A'), Memo1.Lines[i-1]);
end;

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

procedure TForm1.Memo1Change(Sender: TObject);
begin
  clearing;
  prn;
  page;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Memo1.Font.Size:=UpDown1.Position;
  Image1.Canvas.Font.Size:=UpDown1.Position;
  Memo1Change(Sender);
end;

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

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

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

Printer.BeginDoc;
with Printer.Canvas do
  begin
... Печать документа ...
  end;
Printer.EndDoc;

   Ширина и высота полотна принтера доступны через свойства Printer.PageWidth и Printer.PageHeight. Закончить печать на одной странице и начать печатать на другой можно с помощью метода Printer.NewPage.

Сергей, добавлено 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, пусть даже он будет невидимым, а при разработке и видимым для наглядности, а затем перенесите это на принтер, как показано выше. Только вместо 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: TBitmap;
Соответственно, в обработчике OnCreate Формы создаём прямоугольник с размерами Формы:
Rect.Left:=0;
Rect.Top:=0;
Rect.Right:=Width;
Rect.Bottom:=Height;
и объект Bitmap:
Foto:=TBitmap.Create;
Bitmap имеет метод загрузки изображений:
Foto.LoadFromFile('Адрес_Рисунка');
Выводить рисунок нужно не в момент создания Формы, а с небольшой задержкой, я ввёл её с помощью таймера, имеющего задержку 10 мс. Вот и всё. Получилось:
var
  Form1: TForm1;
  Rect: TRect;
  Foto: TBitmap;
implementation
{$R .dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Rect.Left:=0;
  Rect.Top:=0;
  Rect.Right:=Width;
  Rect.Bottom:=Height;
  Foto:=TBitmap.Create;
  Foto.LoadFromFile('Адрес_Рисунка');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=False;
  Form1.Canvas.StretchDraw(Rect, Foto);
end; Антон, добавлено 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 
Это значит, что я не буду же за вас документы печатать! Методы я показал, как линеечки поводить, должно быть понятно, как буковки печатать тоже. Вот и таблицу уже самим можно делать. В общем, пробовать надо... Тогда станет, например, и самому понятно, что нужно сначала буковки в табличке печатать, а потом уже ячейки рисовать, иначе в некоторых местах линеечки будут затёрты! Но, конечно, в скорости про печать таблиц сделаю. Новичок , добавлено 27.03.11, 21:46:45 
Извините, а как поставить нужную иконку после создания в ярлык? Автор, добавлено 27.03.11, 21:59:29 
Также извините, вопрос не понял. Ярлык программы? Тогда так:
 Application.Icon.LoadFromFile('имя файла с иконкой');
Или сразу через меню Delphi: Project - Options... и в появившемся окне на вкладке Application есть кнопка для загрузки иконки приложения. Дмитрий, добавлено 7.04.11, 15:52:06 
подскажите пожалуйста как перемещать один image по другому? Автор, добавлено 7.04.11, 16:24:11 
Дмитрий, что значит перемещать? Двигать по Форме? А каков ваш вариант? В общем, не понял вопрос... Дмитрий, добавлено 24.04.11, 14:36:57 
Немного размыто , но смысл понятен Вячеслав, добавлено 17.05.11, 12:30:37 
Как перевести пиксели в миллиметры? Вячеслав, добавлено 17.05.11, 12:33:01 
Как згенерировать процедуру "procedure TForm1.page;" - после нажатия Ctr+Shift+C выдайотса ошыбка??? Автор, добавлено 17.05.11, 14:22:36 
А вручную написать влом? Я так делаю иногда. Насчёт пикселей. Есть метод экрана (объекта Screen) PixelsPerInch - переводит пиксели в дюймы. А далее дюймы в мм: 1 дюйм равен 25.4 мм. Андрей, добавлено 5.08.11, 13:39:11 
Здравствуйте. Как загрузить экселевский файл (или т.п.) в виде рисунка? В какой компонент не важно, просто основная цель загрузить док и наложить сверху еще несколько картинок с переменным положением (задаваемым вручную). Автор, добавлено 5.08.11, 14:49:22 
Как вы это представляете? Дело в том, что экселевский файл это не рисунок, даже если и содержит рисунок. Что, нужно их экселевского файла средствами 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 
Данил, кстати, ваша проблема, видимо, в том, что вы просто все процедуры скопировали в проект, но не сопоставили с обработчиками событий компонентов. То есть у вас компоненты не привязаны к этим процедурам. Посмотрите, какие обработчики компонентов используются, щёлкните по ним в Инспекторе Объектов - появятся процедуры, которые могут им соответствовать. Тогда всё и заработает. Данил, добавлено 12.09.11, 07:02:39 
Спасибо, помогло!!! нубчик, добавлено 12.09.11, 20:37:51 
не работает у меня (( ошибки на page;clearing;prn;Memo1Change и прочее они же не заданы никак Автор, добавлено 12.09.11, 22:15:00 
Да, подождите пару дней, я переделал пример, чтобы сразу всё было правильно.
А впрочем, прежде чем изучать графику, научитесь создавать процедуры, тогда поймёте как их задавать, чтобы они заработали. А пока просто добавьте в описание класса Формы, там где
type
TForm1 = class(TForm)
следующие строки вслед за procedure FormCreate(Sender: TObject);
procedure page;
procedure clearing;
procedure prn;
procedure Memo1Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
Данил, добавлено 13.09.11, 14:11:51 
Доброго времени суток, Автор!
Если не сложно - подскажите пожалуйста. Пишу программку для печати пропусков. Возникла проблема с выводом на печать.
Разрешение принтера больше чем разрешение экрана. Я масштабировал изображение, но оно получилось очень нечетким. Как с этим бороться? Автор, добавлено 13.09.11, 16:01:20 
Чтобы ответить, мне нужно ''поковыряться'', но принтера нет... Так что эту тему я плохо знаю, извините. Я, добавлено 13.10.11, 22:12:16 
А как обозначить что принтер будет печатать? Автор, добавлено 13.10.11, 22:24:57 
Что такое "обозначить"? Сделать сообщение, что сейчас начнётся печать? Или задать текст, который будет напечатан? Короче, не понял фразы. Я, добавлено 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 раз больше периода другой. Из математики понимаю, что график будет в в виде синусоиды, только не плавные перегибы, а частотные на всем определении функции. Так же понимаю, что график будет лежать на канве и отсюда длина оси х и будет длина формы. Помогите разобрать эту задачу.
вот сумел сделать синусоиду, но без периода, вот код - работает!
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
  begin
  {X - аргумент графика,
  соответствующий пикселю с координатой РХ}
  X := PX4Pi/ClientWidth;
  Y := 2Sin(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 
Всё написал, затем Касперский заблокировал работу и всё удалил... Вирус, видите ли, обнаружил! Повторяю:
Я бы проще делал. Сначала провёл бы координатную линию по оси Х: и засечки, соответствующие периоду в 2Pi:
Canvas.MoveTo(0, Height div 2);
Canvas.LineTo(Width, Height div 2);
PX:=0;
Period:=2Pi;
Yo:=Trunc(Height/2);
while PX <= Width do
  begin
  Px:=Trunc(Px+Period);
  Canvas.MoveTo(Px, Yo-10);
  Canvas.LineTo(Px, Yo+10);
  end;
Затем строил бы график функции Y:=sin(X)+sin(X/5):
Canvas.MoveTo(0, Height div 2);
for PX:=0 to Width do
  begin
  Y := sin(Px)+sin(Px/5);
  Py :=Yo-trunc(Y);
  Canvas.LineTo(Px, Py);
  end;
Но получается не график, а мазня - всё слишком мелко. Вводим масштаб, по Х в 20 раз, а по Y во все 100. И вот что получается:
procedure TForm1.FormPaint(Sender: TObject);
 var X, Y: Real;
  Period: Real;
  Mx, My, Px, Py, Yo: Integer;
begin
Mx:=20; My:=100;
Canvas.MoveTo(0, Height div 2);
Canvas.LineTo(Width, Height div 2);
Canvas.MoveTo(0, Height div 2);
Period:=2PiMx;
Yo:=Trunc(Height/2);
for Px:=0 to Width do
  begin
  Y := sin(Px/Mx)+sin(Px/5/Mx);
  Py :=Yo-trunc(YMy);
  Canvas.LineTo(Px, Py);
  end;
X:=0;
Canvas.Pen.Width:=2;
Canvas.Pen.Color:=clRed;
while X <= Width do
  begin
  X:=X+Period;
  Px:=Trunc(X);
  Canvas.MoveTo(Px, Yo-10);
  Canvas.LineTo(Px, Yo+10);
  end;
end;
Единственно, засечки перенёс вниз процедуры, выкрасил в красный цвет, и сделал потолще. кирилл , добавлено 28.02.12, 17:40:03 
Добрый вечер,не могу доделать работу подскажите: необходимо чтобы окружность маленького радиуса двигалась по линиям семилучевой звезды. вот наработки мои:
procedure TForm3.a(Sender: TObject; var Key: Char);
begin
cc:=key; edit1.Text:=key;
end; //отвечает за управление процессом
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:=(ipi)/180 ;
x:=250+round(Rcos(a));
y:=250+round(Rsin(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 
да,вначале красим форму синим, чертим семиугольник тоже синим, чтоб на форме его не было видно, потом запускаем окружность по заданной нам траектории семиугольника, остановка движения производится вводом символа q в эдит. Вот так.
но существует проблема, тот код который я написал не работает, он даже не чертит семиугольник. Нужно запускать цикл, точнее семь циклов для траектории, но я не знаю как это сделать. Автор, добавлено 1.03.12, 09:17:19 
Да. Ваша фигура, естественно, не семилучевая, а восьмилучевая звезда. Для правильного её рисования нужно сместить begin на 1 строку вниз:
for i:=0 to 360 do
  if (i mod 45) = 0 then
 begin
  a:=(ipi)/180 ;
  x:=250+round(Rcos(a));
  y:=250+round(Rsin(a));
  b[i]:=x; g[i]:=y;
 end;
Автор, добавлено 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
poligon=object и ProcedureShow; ProcedureHide; Глеб, добавлено 14.04.12, 21:44:57 
Добрый день!
Помогите мне в такой проблеме. Мне надо чтобы при запуске моей программы не было рамок формы! Я сам не знаю как это делать программно или в настройках есть такая опция. Дельфи 7 лайт Автор, добавлено 14.04.12, 21:58:01 
Свойство Формы BorderStyle, значение bsNone. Я про это в первом же уроке написал. Можно и программно, по событию OnCreate, или сразу в Инспекторе Объектов. Глеб, добавлено 15.04.12, 14:58:11 
Только вот есть одно дополнение) если ставить bsNone - то фору нельзя двигать по рабочему столу, а мне это нужно Автор, добавлено 15.04.12, 15:27:00 
Нужно сделать функционал, который будет вычислять при нажатии левой клавиши мышки её координаты на Форме, и при последующем движении мышки поддерживать эти координаты постоянными:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Xo:=X; Yo:=Y;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var dx, dy: Integer;
begin
dx:=X-Xo; dy:=Y-Yo;
if (ssLeft in Shift) then
  begin
  Left:=Left+dx;
  Top:=Top+dy;
  end;
end;
Xo и Yo - глобальные переменные. Олеся, добавлено 17.04.12, 19:09:00 
Подскажите,пожалуйста,как работать с относительньіми координатами?чтоб изменяя размер формьі,размер рисунка тоже менялся.заранее спасибо! Автор, добавлено 17.04.12, 23:38:20 
Canvas имеет такой метод как StretchDraw, который выводит рисунок в любой заранее определенный прямоугольник. Более развернуто, с примером, смогу ответить завтра к вечеру. Антон, добавлено 18.04.12, 17:14:11 
Здравствуйте. Скажите пожалуйста, какими способами можно задавать цвета рисования в делфи.
Мне для решения задачи необходимо, что бы при повышении значения переменной x цвет точки на экране менялся по градиенту от зеленого к красному.
Спасибо. Антон, добавлено 18.04.12, 17:59:22 
И еще, скажите каким образом нужно в делфи рисовать круг. Понятно, что при помощи функции ellipse, но у меня компилятор ругается на нее, выдавая следующую ошибку There is no overloaded version of 'Ellipse' that can be called with these arguments.
Что и где нужно ввести, что бы он понял меня? Автор, добавлено 18.04.12, 20:13:03 
Что касается Ellipse, то что-то вы неправильно задали. Вот попробуйте просто:
Form1.Canvas.Ellipse(100, 100, 200, 200);
И всё нарисуется.Напишите ваш вариант, вместе посмотрим что не так.
А насчёт цвета, как выше написано, это целая величина, в 16-ричном виде BBGGRR. Самый красный цвет: 0000FF, самый зелёный: 00FF00. Вот и делайте сумму двух переменных: green и red, где green будет постепенно уменьшаться от 00FF00 до 000000, а red постепенно увеличиваться от 000000 до 0000FF. Для этого от green отнимайте 000100, а к red прибавляйте 000001. Но помните, что делать это можно не более $FF раз, то есть от 0 до 255. Вот как-то так:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
 red, green: Integer;
 Color: TColor;
begin
Canvas.MoveTo(100, 100);
red:=000000;
green:=00FF00;
Color:=green;
with Canvas do
for i:=0 to 255 do
  begin
    red:=red+000001;
    green:=green-

Вы представьте, как ноет душа…
Как она от обиды плачет,
Как забившись одна в уголок 
В кулачок свои слёзы прячет.
Как не хочется ей показать, 
Что она опять недовольна,
Что раздавлена и грустна
И сегодня ей… очень больно.
Вы представьте… как тяжело
Делать вид «ничего не случилось»,
А при этом… сердце толкать, 
Чтоб оно веселее билось…
Настроение пытаться поднять 
И собрать… последние мысли,
Те, что вновь от печали — тоски
Разбежались и где-то… зависли.
Доброта, прошу: «Перестань
Как всегда по головке гладить
Тех, кто в гости к тебе пришел 
С одной целью — в душу нагадить.»
Розбицкая Наталья
Не торопись сказать обидные слова...
Не торопись сказать обидные слова…
Не всё и не всегда в нас время лечит…
Пусть даже пролетят потом годА…
Слова те… Душу просто искалечат…
Не дай обидам сердце покорить…
И не пускай туда отростки мести…
Забудь всё… и начни опять любить,
Не уронив достоинства и чести…
Дай Бог тебе, терпения и любви…
Дай Бог, уметь прощать и просто верить…
Обидные слова… их прочь гонИ…
Когда уйдут… закрой плотнее двери…
Галина Воленберг
Любимых никогда не обижайте,
Прощайте слабости, ошибки и грешки,
Любимых никогда не предавайте
В минуты ревности, разлуки и тоски.
Любимых не вводите в заблужденье
Холодным безучастием сердец,
И не читайте им нравоученья,
Не разобравшись подлинно в себе.
Не унижайте нежность чувств гордыней,
Несвойственной, возможно, даже вам,
Все испытанья унижением обычно
Приводят к обвинительным речам.
И не ищите идеалов в этой жизни,
Хотя, дай Бог, чтоб повстречались всё же вам,
Своих любимых из любви вы сотворите,
Она ведь самый ценный материал.
Тамара Маршалова
ЖдалА звонка, как ждут спасенья.
«Алло, сынок, как рада я…
Да, принимаю поздравленья,
Да, юбилей… года, года.
А как же ты, уж не болеешь,
вот слава Богу, что здоров.
да, да я знаю вечерееет
и гости все уж за столом…
Спасибо, что меня поздравил,
пусть Бог хранит твою семью.
пока, сынок… спешишь…я знаю,
целую, трубочку ложу…»
Сын позвонил, слеза скатилась.
какое счастье для неё…
«я голос слышу, это милость,
лицо б увидеть, мне, твоё.»
А ведь живет, рукой подать…
и каждый день проездом мимо.
уж восемь лет… тебе ль не знать,
что сын ты ей, родной, любимый. 
взглянуть хотела б на тебя,
девятые ей уже десяток,
ты обижаешь маму зря…
и пред тобой не виновата.
Когда-то, может быть поймешь.
но будет поздно, пожалеешь.
ну как ты без нее живешь…
без той, что жизнь дала и верит…
она ведь мама
Людмила Щерблюк
Обидеть близкого совсем не сложно.
Трудней понять и попросить прощенье.
Порою, кажется, что это невозможно.
Но лучше победить нелепые сомненья.
С гордыней жизнь становиться сложнее.
Она, как аспид, нашу душу травит.
Ведь все же близкие куда важнее!
Так пусть же разум все же нами правит!
Ирина Лобанцева
Уходите слезы, ведь нельзя иначе, 
Улыбнись девчонка — гордые не плачут. 
И назло обиде, ты должна смеяться, 
Пусть от боли сердце будет разрываться! 
Прячь от всех на свете горькие те слезы. 
Ты хозяйка жизни, а не куст мимозы!
Как больно ждать и знать, что ты не ждешь 
Как больно знать, что больше ты не любишь 
Так знай, душа - ты от любви умрешь 
А ты взмахнешь рукой и все забудешь 
Так больно было вымолвить «прощай» 
Еще больней простить тебя мне будет 
И даже если я прощу тебе, пускай 
Но сердце такой боли не забудет 
Как больно слезы жгут мои глаза 
Все в черно – белом цвете оказалось 
Через окно ругается гроза 
На то, что небо тоже разрыдалось 
Как больно от того, что не вернуть те дни 
Когда могла тобою любоваться 
Нам не хватило на двоих моей большей любви 
Как больно от того, что нам пришлось расстаться 
Как больно от того, что больше ненужна 
Я для тебя растаяла с снегами 
Как больно от того, что больше не важна 
Тебе важней всего, что ты с друзьями 
Как больно от того, что больно не тебе 
Дай Бог, чтоб мы не встретились с тобой когда-то 
Как больно от того, что все же встречи жду 
Мне стоит все забыть, не хочется, а надо 
Как больно от того, что больше не коснусь 
Твоей щеки своими теплыми руками 
Как больно от того, что больше не вернусь 
В твой дом – ты для меня отныне под замками 
Как больно от того, что больше нечего сказать 
Да и зачем, все сказано глазами 
И на прощанье остается помолчать 
Прощай Андрей , теперь ты только память ...
Так больно мог мне сделать только ты 
Ты сердце взял мoе и сжал рукой 
Ты больно сделав смог потом уйти 
А я теперь живу с одной тоской. 
Она съедает душу изнутри 
Ее уже оттуда не прогонишь 
Так больно мог мне сделать только ты 
И только ты вернуть все сможешь. 
Мне не нужна любовь которая была 
Мне не нужны твои слова строкой 
Одно отдай-что б только я жила 
Верни назад душе моей покой. 
Так больно мог мне сделать только ты 
Но я надеюсь ты когда-нибудь поймешь 
Что не всегда сбываются мечты 
Что иногда мечтой бывает просто ложь.
Я закрываю Сердце — на замок…
Простите те — кто не успел согреться…
Я пробовала жить — с открытым сердцем…
Не получилось… Вынесла урок….
Чертовски сложно — верной быть себе…
Чертовски сложно — быть тому неверной…
Которому в Любви — призналась первой…
Хотела многого — осталась в пустоте…
Я закрываю свое Сердце — навсегда….
По крайней мере, на года, я знаю точно….
Я буду гордой… независимой… порочной…
Но в Сердце больше — не поселится беда….
Я так старалась жить… И, видит Бог…
Я так… умела…Я почти… сломалась…
Смотрите – вот, что от меня осталось…
Я закрываю…. Сердце… на замок…
Прошу тебя — не отводи свой взгляд,
Не закрывай   души  глухие шторы,
Не заставляй поставить в один ряд
Постыдные сомненья и укоры.
,
Ведь всё произошло. И в чём вопрос ?
Я  не готовила тебе ловушку.
Сейчас не  нужно лжи , не надо слёз..
Произошло. Прими всё как игрушку…
,
Я без тебя  всё это проживу ,
Переживу, перестрадаю молча,
Но  не пойму :за что и почему
Ты прячешь взгляд и праведника корчишь…
Шли Двое… через пустоту….Сбивая… Души о Дорогу….
Несли Вдвоем — одну Мечту…Одну Надежду и тревогу… 
Стучало Сердце у виска…А злость и нежность – в горле комом……
Шагали Двое…плюс тоска ….По переулкам незнакомым…
По бездорожью умных фраз… По паутине пыльных буден…
Пообещав – в который раз! — Не верить ни Богам, ни людям…
И в серость вечную глядя… Палитра замкнутого круга…
Бежали Двое…от себя..Любя мучительно.. Друг Друга…
Так, по сожженному мосту… По тишине уснувших улиц ….
Шли Двое… через пустоту…
И… так… печально…
разминулись…
Да что ж творится на душе, куда всё катится?
До хрипа голос сорвала, а всё не выплачусь…
Ну почему же за любовь лишь болью платится?
А может, мне тебя забыть — тогда и вылечусь?
Быть может, бросить всё к чертям, и успокоиться —
И просто вычеркнуть тебя в своём сознании?..
Ведь, право, не о чем, почти-что, беспокоиться…
Какая может быть любовь на расстоянии?..
Суметь проснуться в понедельник с «чистой совестью»,
(Ну что мне стоит хоть разок, но смалодушничать?)
И спрятать (я же героиня НОВОЙ повести!)
Под свитер крылья — перед кем мне показушничать?..
В борьбе с любовью мне несложно будет выстоять,
Неважно, что ты в каждом зеркале мне чудишься…
Всё позабудется, и пятница, и исповедь…
Вот только ты, такой родной…не позабудешься…
Я тихо умру. И никто не услышит.
Я к тебе подойду, мягко делая шаг.
Обо мне  этой жизни никто не напишет.
Извини, ели сделала что-то не так.
Не буди и не трогай – замёрзли ресницы;
В них с восходом вчера закатилась слеза.
Нашей радости дни улетели как птицы
И теперь неживые лишь смотрят глаза.
Оставляю тебе я себя половинку,
Половинку себя – половинкой души.
На ручонках моих не растает снежинка,
Здесь меня больше нет – ты меня не ищи.
Извини и пойми, что не я виновата,
Я хотела бы жить, укрывая любя.
Но ведь знаешь, что жизнь наша замысловата.
Я теперь лишь дождём поцелую тебя.
Идти, куда глядят глаза…
Пока не гаснет взгляд,
Туда, где прячется гроза
В давно знакомый ад…
Туда, где иней вместо рос
И воздух колет грудь,
Туда, где ночь не держит слез,
Залив обратный путь…
Туда, где места нет душе,
Где сбит сердечный ритм…
Где чувств пробитая мишень
Без пламени горит…
Где небо падает в песок
От тяжести молвы,
Где не стучится пульс в висок
В преддверии весны.
Где скрыты слезы между слов,
И черен ореол…
Чтоб в этом мире страшных снов
Забыть, что ты ушел…

000100;
    Color:=red+green;
    Pen.Color:=Color;
    LineTo(200, 100+i);
    MoveTo(100, 100+i+1);
  end;
end;
Вначале цвет совсем зелёный, а в конце совсем красный. Поэтому можно выбрать диапазон изменения где-то посредине. Но здесь я не истина в последней инстанции, всё это только что придумал. Может, есть и более лучший вариант. Антон, добавлено 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 
Но оказывается мои мучения не закончились. Теперь проблема в чтении файла. У меня данные представлены в виде трех столбцов в файле 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
 1..10: 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 (оно было выше и в скопированный кусок не вошло) 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;
Но изображение не появляется.
И еще один ворпос: почему у меня при изменении размеров формы Image может увеличиваться только до определеного предела? В какой-то момент размеры формы продолжаюи изменяться, а размеры Image - нет, при этом исчезает граница (прорисована процедурой page) с той стороны, с которой происходило увеличение. Автор, добавлено 21.04.12, 16:30:09 
А как изображение вообще в Image появляется? А если ещё раз так же как и в первый?
А насчёт размеров - напишите как вы изменяете размер, посмотрим. Аноним, добавлено 21.04.12, 16:47:43 
Изображение считывается по некоторым данным из указанного мной файла. Считывание происходит по событию нажатия кнопки. Если сослаться на это нажатие, то считывание произойдет даже в том случае, если у меня 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 перестает увеличиваться. Я собственно именно так и делаю, как вы предложили, за тем исключением, что расстояния до правого и нижнего краев у меня вычесленны не в коде программы, а заренее. Аноним, добавлено 21.04.12, 17:20:09 
Если все равно не понятно, то скажите, куда можно выложить скрины программы. Автор, добавлено 21.04.12, 17:34:18 
Понятно. Вернее непонятно. Но меня размер компонента меняется как угодно. Попробуйте в другом, тестовом проекте сделать процедуру изменения размеров, посмотрите в чём разница. Аноним, добавлено 21.04.12, 18:01:07 
Пробовал и в других своих программах делать процедуру изменения размеров - то же самое. Что интересно: размер Image не превышает тех размеров, которые имел первоначально. И что самое главное: попытка увеличить его на форме (на этапе задания размеров) ни к чему не приводит. Аноним, добавлено 21.04.12, 18:12:56 
Сделал как надо (правда через одно место, увеличив размеры Image еще на этапе редактированияя, затем развернул форму и свернул ее снова).
Тут возможны два варианта: либо глючность 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 
А вот нифига, похоже это глюки Делфи... Других объяснений я не вижу. Да, Image действительно меняет размеры, но вот прямоугольник хоть убейте не хочет прорисовываться больше чем начальные размеры Image.
Скажите, а вот эти две переменные: 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.Height , 100 ,100);
  SetWindowRgn(form1.Handle, frm, FALSE);
  end;
end.
Вот пример прямоугольника с закругленными углами.
Автору спасибо за "ключ" поиска Олег, добавлено 10.05.12, 18:32:43 
здравствуйте,помогите в такой проблеме необходимо создать движение квадратика по сложной хаотичной траектории и создать 5 радиокнопок изменяющие габариты ,цвет квадратика и скорость передвижения. вот движение по сложной траектории квадратика ,а как сделать радиокнопки и задать им св-ва я не знаю,помогите:
var
i , n , x,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:=random8-4; b:=random8-4;
r:=random(50)+40 ; g:=random(150);z:=random(256);
for i:=1 to n do begin application.processmessages;
x:=round(x+asin(i/20)+a/2); if (x>w)or(xh) or (b
canvas.pen/color:=clyellow;
canvas.rectangle(x,y,x+12,y+12); sleep(5);
canvas.pen.color:=RGB(r,g,z);
canvas.rectangle(x,y,x+12,y+12); end;
until cc='q' ;
end; Автор, добавлено 11.05.12, 06:54:34 
Пять радиокнопок это пять вариантов. Каждый вариант описывает свой набор свойств квадратика. Вот как выбрать вариант по нажатию радиокнопки. Каждой радиокнопке присваиваем свойство Tag от 1 до 5. Создаём ОДИН обработчик события OnClick для всех:
var Tag: Integer;
begin
Tag:=(Sender as TRadioButton).Tag;
case Tag of
  1: atribut1;
  2: atribut2;
  3: atribut3;
  4: atribut4;
  5: atribut5;
end;
end;
atributN - процедуры, придающие квадратику тот или иной вид. Такой вариант более "культурен", чем просто
if Tag=1 then
  begin
{Первый набор атрибутов}
  end;
if Tag=2 then
  begin
{Второй набор атрибутов}
  end; и так далее, Впрочем, неважно, вам решать. олег , добавлено 11.05.12, 16:58:56 
хм,а вы не могли бы показать мне хотя бы на одном примере как делать ,а я дальше по аналогии.буду благодарен Автор, добавлено 11.05.12, 17:40:42 
Хорошо, но только завтра, согласны? Май! олег, добавлено 11.05.12, 17:54:34 
ах..завтра сдавать..хорошо спасибо. Автор, добавлено 11.05.12, 18:22:14 
Да чего показать-то... Как присвоить нескольким компонентам один обработчик? Как создать процедуры? Как присвоить квадратику соответствующие процедуры? Просто не вижу что может быть неясно... олег, добавлено 11.05.12, 18:53:02 
неясно с чего начинать программу и чем заканчивать. и так же как присвоить квадратику процедуру. Автор, добавлено 11.05.12, 19:21:17 
Утром после 9... Иосиф, добавлено 31.05.12, 20:26:55 
ВСЕМ ПРИВЕТ, ПОМОГИТЕ ПОЖАЛУЙСТА ВСЕ ОБЛАЗИЛ НЕМОГУ НАЙТИ, КАК СДЕЛАТЬ, ЧТОБЫ КАРТИНКА НА ФОРМЕ АВТОМАТИЧЕСКИ ПОДСТРАИВАЛАСЬ, НА ВЕСЬ ЭКРАН МОНИТОРА, С ЛЮБЫМ РАЗШИРЕНИЕМ, А ТО НА МОЕМ 1024Х768 ОНА НА ВЕСЬ ЭКРАН, А НА ДРУГОМ НЕ НА ВЕСЬ ЭКРАН, СПАСИБО ВСЕМ КТО ПОМОЖЕТ Автор, добавлено 31.05.12, 22:51:19 
Есть такой объект Screen, или Application.Screen, у него есть размеры экрана. Ну и рисуйте методом StretchDraw. Автор, добавлено 31.05.12, 22:57:14 
А вы что к стати, рисуете по экрану? Если всё же по Форме, то вместо размеров экрана - размеры Формы. Илья, добавлено 9.10.12, 21:33:24 
как осуществить перерисовку? рисую на форме Автор, добавлено 9.10.12, 21:45:35 
Уточните, непонятно. Илья, добавлено 9.10.12, 22:00:26 
что непонятно? при закрытие изображения другими окнами изображение исчезает, как от этого избавиться Автор, добавлено 9.10.12, 22:15:01 
Получается, что после исчезновения изображения вследствие перекрытия его другими окнами, нужно прорисовать его ещё раз. Как? Так же как и первый раз. Анализируйте перекрытие, и выводите изображение. Илья, добавлено 9.10.12, 22:35:02 
а в коде можно? я только начал разбираться вообще то с этой канвой, а вы мне уже "анализируйте перекрытие"... поподробнее пжл Автор, добавлено 10.10.12, 06:59:29 
Я не знаю как работает ваше приложение, каким образом перекрывается нарисованное изображение. Вы в программе должны увидеть, что произошло перекрытие, и тогда нарисовать его ещё раз. Ну или не рисуйте по Форме. Поставьте компонент Image, и всё. Автор, добавлено 10.10.12, 07:04:03 
Или поставьте таймер, и рисуйте по его срабатыванию, например раз в секунду. Хотя это плохой совет, но будет работать. Юлия, добавлено 5.04.13, 22:23:54 
Бльшое спасибо, очень пригодилось Шамурат туркменистан, добавлено 2.05.13, 14:33:31 
Спасибо Михаил, добавлено 29.08.13, 22:16:59 
Пока мало, что понимаю в DELPHI. Есть вопрос по работе с графикой. Как заставить мышь передвигая её по форме с координатной сеткой,рисовать линию вслед за этим считывать значения по какой-нибудь координатной оси. Спасибо. Автор, добавлено 30.08.13, 10:59:59 
Пришлось чуток повозиться. Вот что получилось по рисованию линии (при нажатой левой кнопке мыши). На форме должен быть компонент Timer (в начальный момент выключенный) со значением Interval как можно меньше, я взял 10:
var
  Form1: TForm1;
  Xo, Yo, X1, Y1: Integer;
implementation
{$R .dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Canvas.MoveTo(Xo, Yo);
Image1.Canvas.LineTo(X1, Y1);
Xo:=X1;
Yo:=Y1;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Timer1.Enabled=False then
  begin
    Xo:=X;
    Yo:=Y;
    Timer1.Enabled:=True;
  end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled:=False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if X<>Xo then X1:=X;
if Y<>Yo then Y1:=Y;
end;
Михаил, добавлено 30.08.13, 18:57:28 
Спасибо за оперативность буду пробовать Сергей, добавлено 10.12.13, 23:37:22 
Здравствуйте, у меня на форме находится анкета в виде панели с эдитами, проблема в том, чтобы распечатать эту панель. Автор, добавлено 11.12.13, 05:32:40 
У Формы есть метод Print, он распечатывает Форму со всем её содержимым. У компонента Panel такого метода нет. И если Форма не устраивает, то придётся рисовать всё содержимое панели на принтере. Аноним, добавлено 12.12.13, 01:58:15 
Printer.BeginDoc;
  Panel1.PaintTo(Printer.Handle, 10, 10);
Printer.EndDoc;
Как отмасштабировать? Автор, добавлено 12.12.13, 09:10:09 
Метод PaintTo отрисовывает компонент как он есть, без масштабирования. Он не предназначен для собственно рисования, а только для перерисовки компонента в случае каких-либо изменений. Я в предыдущем ответе имел в виду не отрисовать панель, а нарисовать вручную её содержимое, методами MoveTo, LineTo.
Но можно попробовать сначала отмасштабировать панель методом ScaleBy - увеличить её размер на Форме, затем напечатать её на принтере, затем опять уменьшить панель. Как программа себя поведёт при этом, не могу сказать - принтера нет, попробовать не могу. Возможно, во время печати Форма исказится. Можно попробовать сделать панель невидимой, или перенести на другую Форму, невидимую или свёрнутую. Сергей, добавлено 13.12.13, 00:30:54 
нашел как масштабировать:
Panel1.SetBounds(Panel1.Left, Panel1.Top, Printer.PageWidth, Printer.PageHeight);
теперь другая проблема, как отмасштабировать все компоненты на ней? Сергей, добавлено 13.12.13, 00:52:07 
ну и через ScaleBy получилось:
Panel1.ScaleBy(100, 16);
только не все компоненты корректно отобразились; а можно это все вывести на предварительный просмотр в Fast Report? Автор, добавлено 13.12.13, 04:38:33 
Можно, наверное. Но я с ФастРепортом дела не имел. Сергей, добавлено 14.12.13, 01:17:45 
И на том большое спасибо) Майлз, добавлено 26.12.13, 18:36:38 
Позвольте задать вопрос: а возможно ли получить цвет пикселя из стороннего изображения не отрисовывая его при этом? Автор, добавлено 26.12.13, 19:41:55 
Пиксель это элемент канвы. Нужно создать битовую карту TBitMap - она имеет свойство Canvas, загрузить туда изображение, и исследовать пиксели. Майлз, добавлено 27.12.13, 09:21:39 
Спасибо, разобрался! Филлип, добавлено 20.02.14, 23:41:26 
Аноним, добавлено 21.04.12, 18:49:28
А вот нифига, похоже это глюки Делфи... Других объяснений я не вижу. Да, Image действительно меняет размеры, но вот прямоугольник хоть убейте не хочет прорисовываться больше чем начальные размеры Image.
Скажите, а вот эти две переменные: Image1.Width Image1.Height, они точно изменяются?
Аноним, добавлено 21.04.12, 18:50:06
Хотя по идее должны, я же присваиваю им новые значения в зависимости от размеров формы.
Автор, добавлено 21.04.12, 19:20:17
А вот выведите куда-нибудь значения размеров и посмотрите. А вообще Canvas имеют и другие компоненты, StringGrid например. Оставить одну ячейку и рисовать в ней, там Rect уже определён.
---------------------------------
Вывел значения размеров - они меняются. Как быть? Филлип, добавлено 21.02.14, 00:09:02 
О! Сам нашёл ответ:
При изменении размеров TImage размер его Canvas не меняется (Delphi)

Иногда возникает ситуация, когда необходимо в ходе выполнения программы изменить размеры компонента TImage, а потом на его холсте что-то нарисовать. Но все новые рисунки на холсте TImage ограничены старыми габаритами. Как это решить?

Необходимо вместе с размерами TImage изменить размеры его Bitmap.

Image1.Height := 80;
Image1.Width := 33;
Image1.Picture.Bitmap.Height := 80;
Image1.Picture.Bitmap.Width := 33;

RelatedCommand line calculator on Rails — dentaku
In "Программирование"Как изменить стандартный crHandPoint на системный (Delphi)
In "Программирование"Кто вызвал PopupMenu? (Delphi)
In "Программирование"

Об авторе alvisx
Good muzhik.
Все записи автора alvisx »
:)

BBGGRR
. Доля каждого цвета может меняться от 0 до 255. Поэтому чтобы отобразить максимально красную точку, ей нужно присвоить цвет 0000FF.
   Для стандартных цветов в Delphi определён набор текстовых констант. Увидеть его можно, открыв в Инспекторе Объектов свойство Color, например, той же Формы.

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

procedure TForm1.FormCreate(Sender: TObject);
begin
Rect.Left:=0;
Rect.Top:=0;
Rect.Right:=Image1.Width;
Rect.Bottom:=Image1.Height;
Image1.Canvas.Brush.Color:=clWhite;
end;

procedure TForm1.page;
begin
with Image1.Canvas do
  begin
    MoveTo(0, 0);
    LineTo(Image1.Width-1, 0);
    LineTo(Image1.Width-1, Image1.Height-1);
    LineTo(0, Image1.Height-1);
    LineTo(0, 0);
  end;
end;

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

procedure TForm1.clearing;
begin
Image1.Canvas.FillRect(Rect); //Прямоугольник Rect заполняется белым цветом, изображение стирается.
end;

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

procedure TForm1.prn;
var i: Integer;
begin
with Image1.Canvas do
  for i:=1 to Memo1.Lines.Count do
    TextOut(3, 3+(i-1)TextHeight('A'), Memo1.Lines[i-1]);
end;

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

procedure TForm1.Memo1Change(Sender: TObject);
begin
  clearing;
  prn;
  page;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Memo1.Font.Size:=UpDown1.Position;
  Image1.Canvas.Font.Size:=UpDown1.Position;
  Memo1Change(Sender);
end;

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

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

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

Printer.BeginDoc;
with Printer.Canvas do
  begin
... Печать документа ...
  end;
Printer.EndDoc;

   Ширина и высота полотна принтера доступны через свойства Printer.PageWidth и Printer.PageHeight. Закончить печать на одной странице и начать печатать на другой можно с помощью метода Printer.NewPage.

Сергей, добавлено 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, пусть даже он будет невидимым, а при разработке и видимым для наглядности, а затем перенесите это на принтер, как показано выше. Только вместо 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: TBitmap;
Соответственно, в обработчике OnCreate Формы создаём прямоугольник с размерами Формы:
Rect.Left:=0;
Rect.Top:=0;
Rect.Right:=Width;
Rect.Bottom:=Height;
и объект Bitmap:
Foto:=TBitmap.Create;
Bitmap имеет метод загрузки изображений:
Foto.LoadFromFile('Адрес_Рисунка');
Выводить рисунок нужно не в момент создания Формы, а с небольшой задержкой, я ввёл её с помощью таймера, имеющего задержку 10 мс. Вот и всё. Получилось:
var
  Form1: TForm1;
  Rect: TRect;
  Foto: TBitmap;
implementation
{$R .dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Rect.Left:=0;
  Rect.Top:=0;
  Rect.Right:=Width;
  Rect.Bottom:=Height;
  Foto:=TBitmap.Create;
  Foto.LoadFromFile('Адрес_Рисунка');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=False;
  Form1.Canvas.StretchDraw(Rect, Foto);
end; Антон, добавлено 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 
Это значит, что я не буду же за вас документы печатать! Методы я показал, как линеечки поводить, должно быть понятно, как буковки печатать тоже. Вот и таблицу уже самим можно делать. В общем, пробовать надо... Тогда станет, например, и самому понятно, что нужно сначала буковки в табличке печатать, а потом уже ячейки рисовать, иначе в некоторых местах линеечки будут затёрты! Но, конечно, в скорости про печать таблиц сделаю. Новичок , добавлено 27.03.11, 21:46:45 
Извините, а как поставить нужную иконку после создания в ярлык? Автор, добавлено 27.03.11, 21:59:29 
Также извините, вопрос не понял. Ярлык программы? Тогда так:
 Application.Icon.LoadFromFile('имя файла с иконкой');
Или сразу через меню Delphi: Project - Options... и в появившемся окне на вкладке Application есть кнопка для загрузки иконки приложения. Дмитрий, добавлено 7.04.11, 15:52:06 
подскажите пожалуйста как перемещать один image по другому? Автор, добавлено 7.04.11, 16:24:11 
Дмитрий, что значит перемещать? Двигать по Форме? А каков ваш вариант? В общем, не понял вопрос... Дмитрий, добавлено 24.04.11, 14:36:57 
Немного размыто , но смысл понятен Вячеслав, добавлено 17.05.11, 12:30:37 
Как перевести пиксели в миллиметры? Вячеслав, добавлено 17.05.11, 12:33:01 
Как згенерировать процедуру "procedure TForm1.page;" - после нажатия Ctr+Shift+C выдайотса ошыбка??? Автор, добавлено 17.05.11, 14:22:36 
А вручную написать влом? Я так делаю иногда. Насчёт пикселей. Есть метод экрана (объекта Screen) PixelsPerInch - переводит пиксели в дюймы. А далее дюймы в мм: 1 дюйм равен 25.4 мм. Андрей, добавлено 5.08.11, 13:39:11 
Здравствуйте. Как загрузить экселевский файл (или т.п.) в виде рисунка? В какой компонент не важно, просто основная цель загрузить док и наложить сверху еще несколько картинок с переменным положением (задаваемым вручную). Автор, добавлено 5.08.11, 14:49:22 
Как вы это представляете? Дело в том, что экселевский файл это не рисунок, даже если и содержит рисунок. Что, нужно их экселевского файла средствами 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 
Данил, кстати, ваша проблема, видимо, в том, что вы просто все процедуры скопировали в проект, но не сопоставили с обработчиками событий компонентов. То есть у вас компоненты не привязаны к этим процедурам. Посмотрите, какие обработчики компонентов используются, щёлкните по ним в Инспекторе Объектов - появятся процедуры, которые могут им соответствовать. Тогда всё и заработает. Данил, добавлено 12.09.11, 07:02:39 
Спасибо, помогло!!! нубчик, добавлено 12.09.11, 20:37:51 
не работает у меня (( ошибки на page;clearing;prn;Memo1Change и прочее они же не заданы никак Автор, добавлено 12.09.11, 22:15:00 
Да, подождите пару дней, я переделал пример, чтобы сразу всё было правильно.
А впрочем, прежде чем изучать графику, научитесь создавать процедуры, тогда поймёте как их задавать, чтобы они заработали. А пока просто добавьте в описание класса Формы, там где
type
TForm1 = class(TForm)
следующие строки вслед за procedure FormCreate(Sender: TObject);
procedure page;
procedure clearing;
procedure prn;
procedure Memo1Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
Данил, добавлено 13.09.11, 14:11:51 
Доброго времени суток, Автор!
Если не сложно - подскажите пожалуйста. Пишу программку для печати пропусков. Возникла проблема с выводом на печать.
Разрешение принтера больше чем разрешение экрана. Я масштабировал изображение, но оно получилось очень нечетким. Как с этим бороться? Автор, добавлено 13.09.11, 16:01:20 
Чтобы ответить, мне нужно ''поковыряться'', но принтера нет... Так что эту тему я плохо знаю, извините. Я, добавлено 13.10.11, 22:12:16 
А как обозначить что принтер будет печатать? Автор, добавлено 13.10.11, 22:24:57 
Что такое "обозначить"? Сделать сообщение, что сейчас начнётся печать? Или задать текст, который будет напечатан? Короче, не понял фразы. Я, добавлено 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 раз больше периода другой. Из математики понимаю, что график будет в в виде синусоиды, только не плавные перегибы, а частотные на всем определении функции. Так же понимаю, что график будет лежать на канве и отсюда длина оси х и будет длина формы. Помогите разобрать эту задачу.
вот сумел сделать синусоиду, но без периода, вот код - работает!
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
  begin
  {X - аргумент графика,
  соответствующий пикселю с координатой РХ}
  X := PX4Pi/ClientWidth;
  Y := 2Sin(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 
Всё написал, затем Касперский заблокировал работу и всё удалил... Вирус, видите ли, обнаружил! Повторяю:
Я бы проще делал. Сначала провёл бы координатную линию по оси Х: и засечки, соответствующие периоду в 2Pi:
Canvas.MoveTo(0, Height div 2);
Canvas.LineTo(Width, Height div 2);
PX:=0;
Period:=2Pi;
Yo:=Trunc(Height/2);
while PX <= Width do
  begin
  Px:=Trunc(Px+Period);
  Canvas.MoveTo(Px, Yo-10);
  Canvas.LineTo(Px, Yo+10);
  end;
Затем строил бы график функции Y:=sin(X)+sin(X/5):
Canvas.MoveTo(0, Height div 2);
for PX:=0 to Width do
  begin
  Y := sin(Px)+sin(Px/5);
  Py :=Yo-trunc(Y);
  Canvas.LineTo(Px, Py);
  end;
Но получается не график, а мазня - всё слишком мелко. Вводим масштаб, по Х в 20 раз, а по Y во все 100. И вот что получается:
procedure TForm1.FormPaint(Sender: TObject);
 var X, Y: Real;
  Period: Real;
  Mx, My, Px, Py, Yo: Integer;
begin
Mx:=20; My:=100;
Canvas.MoveTo(0, Height div 2);
Canvas.LineTo(Width, Height div 2);
Canvas.MoveTo(0, Height div 2);
Period:=2PiMx;
Yo:=Trunc(Height/2);
for Px:=0 to Width do
  begin
  Y := sin(Px/Mx)+sin(Px/5/Mx);
  Py :=Yo-trunc(YMy);
  Canvas.LineTo(Px, Py);
  end;
X:=0;
Canvas.Pen.Width:=2;
Canvas.Pen.Color:=clRed;
while X <= Width do
  begin
  X:=X+Period;
  Px:=Trunc(X);
  Canvas.MoveTo(Px, Yo-10);
  Canvas.LineTo(Px, Yo+10);
  end;
end;
Единственно, засечки перенёс вниз процедуры, выкрасил в красный цвет, и сделал потолще. кирилл , добавлено 28.02.12, 17:40:03 
Добрый вечер,не могу доделать работу подскажите: необходимо чтобы окружность маленького радиуса двигалась по линиям семилучевой звезды. вот наработки мои:
procedure TForm3.a(Sender: TObject; var Key: Char);
begin
cc:=key; edit1.Text:=key;
end; //отвечает за управление процессом
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:=(ipi)/180 ;
x:=250+round(Rcos(a));
y:=250+round(Rsin(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 
да,вначале красим форму синим, чертим семиугольник тоже синим, чтоб на форме его не было видно, потом запускаем окружность по заданной нам траектории семиугольника, остановка движения производится вводом символа q в эдит. Вот так.
но существует проблема, тот код который я написал не работает, он даже не чертит семиугольник. Нужно запускать цикл, точнее семь циклов для траектории, но я не знаю как это сделать. Автор, добавлено 1.03.12, 09:17:19 
Да. Ваша фигура, естественно, не семилучевая, а восьмилучевая звезда. Для правильного её рисования нужно сместить begin на 1 строку вниз:
for i:=0 to 360 do
  if (i mod 45) = 0 then
 begin
  a:=(ipi)/180 ;
  x:=250+round(Rcos(a));
  y:=250+round(Rsin(a));
  b[i]:=x; g[i]:=y;
 end;
Автор, добавлено 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
poligon=object и ProcedureShow; ProcedureHide; Глеб, добавлено 14.04.12, 21:44:57 
Добрый день!
Помогите мне в такой проблеме. Мне надо чтобы при запуске моей программы не было рамок формы! Я сам не знаю как это делать программно или в настройках есть такая опция. Дельфи 7 лайт Автор, добавлено 14.04.12, 21:58:01 
Свойство Формы BorderStyle, значение bsNone. Я про это в первом же уроке написал. Можно и программно, по событию OnCreate, или сразу в Инспекторе Объектов. Глеб, добавлено 15.04.12, 14:58:11 
Только вот есть одно дополнение) если ставить bsNone - то фору нельзя двигать по рабочему столу, а мне это нужно Автор, добавлено 15.04.12, 15:27:00 
Нужно сделать функционал, который будет вычислять при нажатии левой клавиши мышки её координаты на Форме, и при последующем движении мышки поддерживать эти координаты постоянными:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Xo:=X; Yo:=Y;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var dx, dy: Integer;
begin
dx:=X-Xo; dy:=Y-Yo;
if (ssLeft in Shift) then
  begin
  Left:=Left+dx;
  Top:=Top+dy;
  end;
end;
Xo и Yo - глобальные переменные. Олеся, добавлено 17.04.12, 19:09:00 
Подскажите,пожалуйста,как работать с относительньіми координатами?чтоб изменяя размер формьі,размер рисунка тоже менялся.заранее спасибо! Автор, добавлено 17.04.12, 23:38:20 
Canvas имеет такой метод как StretchDraw, который выводит рисунок в любой заранее определенный прямоугольник. Более развернуто, с примером, смогу ответить завтра к вечеру. Антон, добавлено 18.04.12, 17:14:11 
Здравствуйте. Скажите пожалуйста, какими способами можно задавать цвета рисования в делфи.
Мне для решения задачи необходимо, что бы при повышении значения переменной x цвет точки на экране менялся по градиенту от зеленого к красному.
Спасибо. Антон, добавлено 18.04.12, 17:59:22 
И еще, скажите каким образом нужно в делфи рисовать круг. Понятно, что при помощи функции ellipse, но у меня компилятор ругается на нее, выдавая следующую ошибку There is no overloaded version of 'Ellipse' that can be called with these arguments.
Что и где нужно ввести, что бы он понял меня? Автор, добавлено 18.04.12, 20:13:03 
Что касается Ellipse, то что-то вы неправильно задали. Вот попробуйте просто:
Form1.Canvas.Ellipse(100, 100, 200, 200);
И всё нарисуется.Напишите ваш вариант, вместе посмотрим что не так.
А насчёт цвета, как выше написано, это целая величина, в 16-ричном виде BBGGRR. Самый красный цвет: 0000FF, самый зелёный: 00FF00. Вот и делайте сумму двух переменных: green и red, где green будет постепенно уменьшаться от 00FF00 до 000000, а red постепенно увеличиваться от 000000 до 0000FF. Для этого от green отнимайте 000100, а к red прибавляйте 000001. Но помните, что делать это можно не более $FF раз, то есть от 0 до 255. Вот как-то так:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
 red, green: Integer;
 Color: TColor;
begin
Canvas.MoveTo(100, 100);
red:=000000;
green:=00FF00;
Color:=green;
with Canvas do
for i:=0 to 255 do
  begin
    red:=red+000001;
    green:=green-000100;
    Color:=red+green;
    Pen.Color:=Color;
    LineTo(200, 100+i);
    MoveTo(100, 100+i+1);
  end;
end;
Вначале цвет совсем зелёный, а в конце совсем красный. Поэтому можно выбрать диапазон изменения где-то посредине. Но здесь я не истина в последней инстанции, всё это только что придумал. Может, есть и более лучший вариант. Антон, добавлено 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 
Но оказывается мои мучения не закончились. Теперь проблема в чтении файла. У меня данные представлены в виде трех столбцов в файле 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
 1..10: 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 (оно было выше и в скопированный кусок не вошло) 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;
Но изображение не появляется.
И еще один ворпос: почему у меня при изменении размеров формы Image может увеличиваться только до определеного предела? В какой-то момент размеры формы продолжаюи изменяться, а размеры Image - нет, при этом исчезает граница (прорисована процедурой page) с той стороны, с которой происходило увеличение. Автор, добавлено 21.04.12, 16:30:09 
А как изображение вообще в Image появляется? А если ещё раз так же как и в первый?
А насчёт размеров - напишите как вы изменяете размер, посмотрим. Аноним, добавлено 21.04.12, 16:47:43 
Изображение считывается по некоторым данным из указанного мной файла. Считывание происходит по событию нажатия кнопки. Если сослаться на это нажатие, то считывание произойдет даже в том случае, если у меня 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 перестает увеличиваться. Я собственно именно так и делаю, как вы предложили, за тем исключением, что расстояния до правого и нижнего краев у меня вычесленны не в коде программы, а заренее. Аноним, добавлено 21.04.12, 17:20:09 
Если все равно не понятно, то скажите, куда можно выложить скрины программы. Автор, добавлено 21.04.12, 17:34:18 
Понятно. Вернее непонятно. Но меня размер компонента меняется как угодно. Попробуйте в другом, тестовом проекте сделать процедуру изменения размеров, посмотрите в чём разница. Аноним, добавлено 21.04.12, 18:01:07 
Пробовал и в других своих программах делать процедуру изменения размеров - то же самое. Что интересно: размер Image не превышает тех размеров, которые имел первоначально. И что самое главное: попытка увеличить его на форме (на этапе задания размеров) ни к чему не приводит. Аноним, добавлено 21.04.12, 18:12:56 
Сделал как надо (правда через одно место, увеличив размеры Image еще на этапе редактированияя, затем развернул форму и свернул ее снова).
Тут возможны два варианта: либо глючность 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 
А вот нифига, похоже это глюки Делфи... Других объяснений я не вижу. Да, Image действительно меняет размеры, но вот прямоугольник хоть убейте не хочет прорисовываться больше чем начальные размеры Image.
Скажите, а вот эти две переменные: 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.Height , 100 ,100);
  SetWindowRgn(form1.Handle, frm, FALSE);
  end;
end.
Вот пример прямоугольника с закругленными углами.
Автору спасибо за "ключ" поиска Олег, добавлено 10.05.12, 18:32:43 
здравствуйте,помогите в такой проблеме необходимо создать движение квадратика по сложной хаотичной траектории и создать 5 радиокнопок изменяющие габариты ,цвет квадратика и скорость передвижения. вот движение по сложной траектории квадратика ,а как сделать радиокнопки и задать им св-ва я не знаю,помогите:
var
i , n , x,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:=random8-4; b:=random8-4;
r:=random(50)+40 ; g:=random(150);z:=random(256);
for i:=1 to n do begin application.processmessages;
x:=round(x+asin(i/20)+a/2); if (x>w)or(xh) or (b
canvas.pen/color:=clyellow;
canvas.rectangle(x,y,x+12,y+12); sleep(5);
canvas.pen.color:=RGB(r,g,z);
canvas.rectangle(x,y,x+12,y+12); end;
until cc='q' ;
end; Автор, добавлено 11.05.12, 06:54:34 
Пять радиокнопок это пять вариантов. Каждый вариант описывает свой набор свойств квадратика. Вот как выбрать вариант по нажатию радиокнопки. Каждой радиокнопке присваиваем свойство Tag от 1 до 5. Создаём ОДИН обработчик события OnClick для всех:
var Tag: Integer;
begin
Tag:=(Sender as TRadioButton).Tag;
case Tag of
  1: atribut1;
  2: atribut2;
  3: atribut3;
  4: atribut4;
  5: atribut5;
end;
end;
atributN - процедуры, придающие квадратику тот или иной вид. Такой вариант более "культурен", чем просто
if Tag=1 then
  begin
{Первый набор атрибутов}
  end;
if Tag=2 then
  begin
{Второй набор атрибутов}
  end; и так далее, Впрочем, неважно, вам решать. олег , добавлено 11.05.12, 16:58:56 
хм,а вы не могли бы показать мне хотя бы на одном примере как делать ,а я дальше по аналогии.буду благодарен Автор, добавлено 11.05.12, 17:40:42 
Хорошо, но только завтра, согласны? Май! олег, добавлено 11.05.12, 17:54:34 
ах..завтра сдавать..хорошо спасибо. Автор, добавлено 11.05.12, 18:22:14 
Да чего показать-то... Как присвоить нескольким компонентам один обработчик? Как создать процедуры? Как присвоить квадратику соответствующие процедуры? Просто не вижу что может быть неясно... олег, добавлено 11.05.12, 18:53:02 
неясно с чего начинать программу и чем заканчивать. и так же как присвоить квадратику процедуру. Автор, добавлено 11.05.12, 19:21:17 
Утром после 9... Иосиф, добавлено 31.05.12, 20:26:55 
ВСЕМ ПРИВЕТ, ПОМОГИТЕ ПОЖАЛУЙСТА ВСЕ ОБЛАЗИЛ НЕМОГУ НАЙТИ, КАК СДЕЛАТЬ, ЧТОБЫ КАРТИНКА НА ФОРМЕ АВТОМАТИЧЕСКИ ПОДСТРАИВАЛАСЬ, НА ВЕСЬ ЭКРАН МОНИТОРА, С ЛЮБЫМ РАЗШИРЕНИЕМ, А ТО НА МОЕМ 1024Х768 ОНА НА ВЕСЬ ЭКРАН, А НА ДРУГОМ НЕ НА ВЕСЬ ЭКРАН, СПАСИБО ВСЕМ КТО ПОМОЖЕТ Автор, добавлено 31.05.12, 22:51:19 
Есть такой объект Screen, или Application.Screen, у него есть размеры экрана. Ну и рисуйте методом StretchDraw. Автор, добавлено 31.05.12, 22:57:14 
А вы что к стати, рисуете по экрану? Если всё же по Форме, то вместо размеров экрана - размеры Формы. Илья, добавлено 9.10.12, 21:33:24 
как осуществить перерисовку? рисую на форме Автор, добавлено 9.10.12, 21:45:35 
Уточните, непонятно. Илья, добавлено 9.10.12, 22:00:26 
что непонятно? при закрытие изображения другими окнами изображение исчезает, как от этого избавиться Автор, добавлено 9.10.12, 22:15:01 
Получается, что после исчезновения изображения вследствие перекрытия его другими окнами, нужно прорисовать его ещё раз. Как? Так же как и первый раз. Анализируйте перекрытие, и выводите изображение. Илья, добавлено 9.10.12, 22:35:02 
а в коде можно? я только начал разбираться вообще то с этой канвой, а вы мне уже "анализируйте перекрытие"... поподробнее пжл Автор, добавлено 10.10.12, 06:59:29 
Я не знаю как работает ваше приложение, каким образом перекрывается нарисованное изображение. Вы в программе должны увидеть, что произошло перекрытие, и тогда нарисовать его ещё раз. Ну или не рисуйте по Форме. Поставьте компонент Image, и всё. Автор, добавлено 10.10.12, 07:04:03 
Или поставьте таймер, и рисуйте по его срабатыванию, например раз в секунду. Хотя это плохой совет, но будет работать. Юлия, добавлено 5.04.13, 22:23:54 
Бльшое спасибо, очень пригодилось Шамурат туркменистан, добавлено 2.05.13, 14:33:31 
Спасибо Михаил, добавлено 29.08.13, 22:16:59 
Пока мало, что понимаю в DELPHI. Есть вопрос по работе с графикой. Как заставить мышь передвигая её по форме с координатной сеткой,рисовать линию вслед за этим считывать значения по какой-нибудь координатной оси. Спасибо. Автор, добавлено 30.08.13, 10:59:59 
Пришлось чуток повозиться. Вот что получилось по рисованию линии (при нажатой левой кнопке мыши). На форме должен быть компонент Timer (в начальный момент выключенный) со значением Interval как можно меньше, я взял 10:
var
  Form1: TForm1;
  Xo, Yo, X1, Y1: Integer;
implementation
{$R .dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Canvas.MoveTo(Xo, Yo);
Image1.Canvas.LineTo(X1, Y1);
Xo:=X1;
Yo:=Y1;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Timer1.Enabled=False then
  begin
    Xo:=X;
    Yo:=Y;
    Timer1.Enabled:=True;
  end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled:=False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if X<>Xo then X1:=X;
if Y<>Yo then Y1:=Y;
end;
Михаил, добавлено 30.08.13, 18:57:28 
Спасибо за оперативность буду пробовать Сергей, добавлено 10.12.13, 23:37:22 
Здравствуйте, у меня на форме находится анкета в виде панели с эдитами, проблема в том, чтобы распечатать эту панель. Автор, добавлено 11.12.13, 05:32:40 
У Формы есть метод Print, он распечатывает Форму со всем её содержимым. У компонента Panel такого метода нет. И если Форма не устраивает, то придётся рисовать всё содержимое панели на принтере. Аноним, добавлено 12.12.13, 01:58:15 
Printer.BeginDoc;
  Panel1.PaintTo(Printer.Handle, 10, 10);
Printer.EndDoc;
Как отмасштабировать? Автор, добавлено 12.12.13, 09:10:09 
Метод PaintTo отрисовывает компонент как он есть, без масштабирования. Он не предназначен для собственно рисования, а только для перерисовки компонента в случае каких-либо изменений. Я в предыдущем ответе имел в виду не отрисовать панель, а нарисовать вручную её содержимое, методами MoveTo, LineTo.
Но можно попробовать сначала отмасштабировать панель методом ScaleBy - увеличить её размер на Форме, затем напечатать её на принтере, затем опять уменьшить панель. Как программа себя поведёт при этом, не могу сказать - принтера нет, попробовать не могу. Возможно, во время печати Форма исказится. Можно попробовать сделать панель невидимой, или перенести на другую Форму, невидимую или свёрнутую. Сергей, добавлено 13.12.13, 00:30:54 
нашел как масштабировать:
Panel1.SetBounds(Panel1.Left, Panel1.Top, Printer.PageWidth, Printer.PageHeight);
теперь другая проблема, как отмасштабировать все компоненты на ней? Сергей, добавлено 13.12.13, 00:52:07 
ну и через ScaleBy получилось:
Panel1.ScaleBy(100, 16);
только не все компоненты корректно отобразились; а можно это все вывести на предварительный просмотр в Fast Report? Автор, добавлено 13.12.13, 04:38:33 
Можно, наверное. Но я с ФастРепортом дела не имел. Сергей, добавлено 14.12.13, 01:17:45 
И на том большое спасибо) Майлз, добавлено 26.12.13, 18:36:38 
Позвольте задать вопрос: а возможно ли получить цвет пикселя из стороннего изображения не отрисовывая его при этом? Автор, добавлено 26.12.13, 19:41:55 
Пиксель это элемент канвы. Нужно создать битовую карту TBitMap - она имеет свойство Canvas, загрузить туда изображение, и исследовать пиксели. Майлз, добавлено 27.12.13, 09:21:39 
Спасибо, разобрался! Филлип, добавлено 20.02.14, 23:41:26 
Аноним, добавлено 21.04.12, 18:49:28
А вот нифига, похоже это глюки Делфи... Других объяснений я не вижу. Да, Image действительно меняет размеры, но вот прямоугольник хоть убейте не хочет прорисовываться больше чем начальные размеры Image.
Скажите, а вот эти две переменные: Image1.Width Image1.Height, они точно изменяются?
Аноним, добавлено 21.04.12, 18:50:06
Хотя по идее должны, я же присваиваю им новые значения в зависимости от размеров формы.
Автор, добавлено 21.04.12, 19:20:17
А вот выведите куда-нибудь значения размеров и посмотрите. А вообще Canvas имеют и другие компоненты, StringGrid например. Оставить одну ячейку и рисовать в ней, там Rect уже определён.
---------------------------------
Вывел значения размеров - они меняются. Как быть? Филлип, добавлено 21.02.14, 00:09:02 
О! Сам нашёл ответ:
При изменении размеров TImage размер его Canvas не меняется (Delphi)

Иногда возникает ситуация, когда необходимо в ходе выполнения программы изменить размеры компонента TImage, а потом на его холсте что-то нарисовать. Но все новые рисунки на холсте TImage ограничены старыми габаритами. Как это решить?

Необходимо вместе с размерами TImage изменить размеры его Bitmap.

Image1.Height := 80;
Image1.Width := 33;
Image1.Picture.Bitmap.Height := 80;
Image1.Picture.Bitmap.Width := 33;

RelatedCommand line calculator on Rails — dentaku
In "Программирование"Как изменить стандартный crHandPoint на системный (Delphi)
In "Программирование"Кто вызвал PopupMenu? (Delphi)
In "Программирование"

Об авторе alvisx
Good muzhik.
Все записи автора alvisx »
:)

Как сделать скат горки своими руками 297
Как сделать скат горки своими руками 910
Как сделать скат горки своими руками 790
Как сделать скат горки своими руками 623
Как сделать скат горки своими руками 759
Как сделать скат горки своими руками 649
Как сделать скат горки своими руками 348
Как сделать скат горки своими руками 542
Как сделать скат горки своими руками 608
Как сделать скат горки своими руками 292
Как сделать скат горки своими руками 759
Как сделать скат горки своими руками 654
Как сделать скат горки своими руками 347
Как сделать скат горки своими руками 312
Как сделать скат горки своими руками 429
Как сделать скат горки своими руками 608
Как сделать скат горки своими руками 668
Как сделать скат горки своими руками 757
Как сделать скат горки своими руками 972

Похожие записи:

  • Кромочный ряд в вязании спицами
  • Оригинальные подарки с днем рождения сестре
  • Дизайн межкомнатных. дверей своими руками
  • Поздравление с солидным юбилеем мужчине
  • Поздравления с прилагательными на день рождения женщине