Мультимедийные возможности Delphi

Графика в Delphi




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Работа с графикой в 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 цвет. Например, выполнение оператора

   Image1.Canvas.Pixels[100, 100]:=clRed;

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

   Color:=Image1.Canvas.Pixels[100, 100];

   Тип TColor определён как длинное целое (LongInt). Его четыре байта содержат информацию о долях синего (B), зелёного (G), и красного (R) цветов. В 16-ричной системе это выглядит так: $00BBGGRR. Доля каждого цвета может меняться от 0 до 255. Поэтому чтобы отобразить максимально красную точку, ей нужно присвоить цвет $000000FF.
   Для стандартных цветов в Delphi определён набор текстовых констант. Увидеть его можно, открыв в Инспекторе Объектов свойство Color, например, той же Формы.

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

Процедура TextOut(X, Y: Integer; const Text: WideString);
Производит вывод строки Text начиная с (X, Y) - левого верхнего пиксела текста.
Свойство TextWidth(var Text: String): Integer;
Содержит длину строки Text в пикселах.
Свойство TextHeight(var Text: String): Integer;
Содержит высоту строки Text в пикселах.
Процедура MoveTo(X, Y: Integer);
Производит перемещение позиции к пикселу с адресом (X, Y).
Процедура LineTo(X, Y: Integer);
Производит рисование прямой линии из точки текущей позиции к пикселу с адресом (X, Y). Адрес (X, Y) становится точкой текущей позиции.
Процедура FillRect(const Rect: TRect);
Заполняет прямоугольник Rect на холсте, используя текущую кисть. Может использоваться, в том числе, для стирания части изображения на холсте.

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



   Расположите на форме компоненты Memo, Image (находится на странице Additional), Edit, UpDown (находится на странице Win32). Свойство Associate компонента UpDown приравняйте в выпадающем списке нашему компоненту Edit. Этим компонентом мы будем изменять размер шрифта. Поскольку и Memo и Image находятся у нас на одном устройстве вывода - на нашем экране, размер пиксела у них одинаков, и поэтому размеры изображения будут равны.


   Первое, что мы сделаем, это инициализацию переменных при старте программы. Необходимо определить размеры области рисования (создадим для этого глобальную переменную 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;

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

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:

unit Unit1;

Interface

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.


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

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



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

Сергей, добавлено 8.10.10, 11:26:02 
У меня есть форма, на ней расположенны несколько элементов; такие как ScrollBox на которой в свою очередь так же раположенны некоторые элементы тем самым создовая Определенный документ который я хочу распечатать подскажите как мне это лучше сделать?????
Автор, добавлено 8.10.10, 15:48:46 
Хм, распечатывайте каждый из этих элементов по очереди... Неопределенный ответ на неопределенный вопрос. Графика и печать - большая тема, в двух словах не раскроешь, я только начал. Продолжить завтра смогу, пожалуй с того как напечатать табличку.
Сергей, добавлено 11.10.10, 16:04:05 
Еще раз попробую сформулировать чего я хочу добится
например есть главная форма где вводятся данные человека (ФИО, и т.д.)они должны записаться в другой форме где я расположил компоненты в виде карточки ну скажем медицинской, и эти саммые данные мне нужно вывести в печать. как мне лучше это сделать?
Автор, добавлено 11.10.10, 16:29:30 
Можно наверное так, как это сделано в программе выше. Сначала выведите все данные в Memo, пусть даже он будет невидимым, а при разработке и видимым для наглядности, а затем перенесите это на принтер, как показано выше. Только вместо 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 := PX*4*Pi/ClientWidth;
  Y := 2*Sin(X);
  {PY — координата пикселя,
  соответствующая координате Y}
  PY := trunc(ClientHeight - (Y+1)*ClientHeight/2);
  {Проводится линия на графике}
  Canvas.LineTo(PX,PY);
  end;
end;

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

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

Canvas.MoveTo(0, Height div 2);
Canvas.LineTo(Width, Height div 2);
PX:=0;
Period:=2*Pi;
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:=2*Pi*Mx;
Yo:=Trunc(Height/2);
for Px:=0 to Width do
  begin
  Y := sin(Px/Mx)+sin(Px/5/Mx);
  Py :=Yo-trunc(Y*My);
  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:=(i*pi)/180 ;
x:=250+round(R*cos(a));
y:=250+round(R*sin(a));
b[i]:=x; g[i]:=y;
end;
canvas.MoveTo(b[45],g[45]);
canvas.LineTo(b[180],g[180]);
canvas.LineTo(b[315],g[315]);
canvas.LineTo(b[90],g[90]);
canvas.LineTo(b[225],g[225]);
canvas.lineto(b[360],g[360]);
canvas.LineTo(b[135],g[135]);
canvas.LineTo(b[270],g[270]);
canvas.LineTo(b[45],g[45]); //начертил семиугольник.
begin
form3.Color:=clnavy;
form3.KeyPreview:=true;
canvas.Pen.Width:=3; a:=0;
repeat
Application.processMessages;
canvas.Pen.Color:=clyellow;
canvas.ellipse(x,y,x+12,y+12);
sleep(5);
canvas.Pen.color:=clNavy;
Canvas.Ellipse(x,y,x+12,y+12) ; //пустил эллипс с одинаковыми радиусами по линиям. но вот это и не получается.
until cc='q'; // клавиша q отвечает за конец операции иначе не остановить.

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

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

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

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

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

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

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

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

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

var Move: Boolean=False;

А цикл такой:

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

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

Move:=not Move;
кирилл, добавлено 29.02.12, 19:11:44 
да,вначале красим форму синим, чертим семиугольник тоже синим, чтоб на форме его не было видно, потом запускаем окружность по заданной нам траектории семиугольника, остановка движения производится вводом символа q в эдит. Вот так.
но существует проблема, тот код который я написал не работает, он даже не чертит семиугольник. Нужно запускать цикл, точнее семь циклов для траектории, но я не знаю как это сделать.
Автор, добавлено 1.03.12, 09:17:19 
Да. Ваша фигура, естественно, не семилучевая, а восьмилучевая звезда. Для правильного её рисования нужно сместить begin на 1 строку вниз:

for i:=0 to 360 do
  if (i mod 45) = 0 then
 begin
  a:=(i*pi)/180 ;
  x:=250+round(R*cos(a));
  y:=250+round(R*sin(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-ричном виде $00BBGGRR. Самый красный цвет: $000000FF, самый зелёный: $0000FF00. Вот и делайте сумму двух переменных: green и red, где green будет постепенно уменьшаться от $0000FF00 до $00000000, а red постепенно увеличиваться от $00000000 до $000000FF. Для этого от green отнимайте $00000100, а к red прибавляйте $00000001. Но помните, что делать это можно не более $FF раз, то есть от 0 до 255. Вот как-то так:

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
 red, green: Integer;
 Color: TColor;
begin
Canvas.MoveTo(100, 100);
red:=$00000000;
green:=$0000FF00;
Color:=green;
with Canvas do
for i:=0 to 255 do
  begin
    red:=red+$00000001;
    green:=green-$00000100;
    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:=random*8-4; b:=random*8-4;
r:=random(50)+40 ; g:=random(150);z:=random(256);
for i:=1 to n do begin application.processmessages;
x:=round(x+a*sin(i/20)+a/2); if (x>w)or(x<5) then a:=-a; y :=round(y+b*cos(i/20)+b/2); if (b>h) or (b<5) then b:=-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 »
:)
Оставить комментарий:

Имя  

Текст комментария