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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2010, 13:31   #1
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию новый roundrect в Delphi

всем привет. у меня такая вот задачка: Написать процедуру построения прямоугольника со скруглениями радиуса R. я нашел в программе PascalABC как раз то что мне нужно. там он представляет procedure RoundRect(x1,y1,x2,y2,w,h: integer);

Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

но собрать это всё в кучу у меня не получается
если Вам не трудно помогите пожалуйста
вот что я там накопал
Код:
unit RoundRect;

interface

implementation






RoundRectABC=class(BoundedObjectABC)
  private
    r: integer;
    procedure SetRadius(rr: integer);
//    constructor Create(x,y,w,h: integer; cl: ColorType); begin end;
  public
    constructor Create(x,y,w,h,rr: integer; cl: ColorType); begin r:=rr; inherited Create(x,y,w,h,cl); end;
    constructor CreateBy(r: RoundRectABC);
    procedure Draw(x,y: integer);
    property Radius: integer read r write SetRadius;
    function Clone0: ObjectABC; begin Result:=RoundRectABC.CreateBy(Self); end;
    function Clone: RoundRectABC; begin Result:=RoundRectABC(Clone0) end;
  end;

function CreateRoundRectABC(x,y,w,h,r: integer; cl: ColorType): RoundRectABC;

//------ RoundRectABC ------
constructor RoundRectABC.CreateBy(r: RoundRectABC);
begin
  Radius:=r.Radius;
  inherited CreateBy(r);
end;

procedure RoundRectABC.SetRadius(rr: integer);
begin
  if rr=r then Exit;
  r:=rr;
  Redraw;
end;

procedure RoundRectABC.Draw(x,y: integer);
var z,z1: integer;
begin
  z:=BorderWidth div 2;
  z1:=(BorderWidth-1) div 2;
  SetDrawSettings;
  RoundRect(x+z,y+z,x+Width-z1,y+Height-z1,r,r);
  DrawText(x,y);
end;


function CreateRoundRectABC(x,y,w,h,r: integer; cl: ColorType): RoundRectABC;
begin
  Result:=RoundRectABC.Create(x,y,w,h,r,cl);
end;





end.
Alex3463 вне форума Ответить с цитированием
Старый 27.06.2010, 13:55   #2
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Хм, а разве в Delphi у Canvas нет метода RoundRect? Насколько я помню, что-то такое было.

Верно ли я понял твой вопрос? Ты хочешь скопировать из ABCPascal код функции RoundRect? Если неверно - поправь.

В приведённом тобой коде нет реализации этой функции. Код, который ты привёл - всего лишь класс-обёртка, использующий эту функции, но не реализующий её.

Мне кажется, если нужно именно написать свою фунцию RoundRect для Delphi, стоит просто воспользоваться возможностью рисовать эллипсы и прямоугольники в Delphi на TCanvas и на их основе строить прямоугольник со скругленными краями.
kogemrka вне форума Ответить с цитированием
Старый 27.06.2010, 14:05   #3
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию

да, мне нужно заново написать процедуру RoundRect. её реализация в PascalABC мне бы вполне подошла, но как Вы говорите что здесь только оболочка, я не знаю что делать
Alex3463 вне форума Ответить с цитированием
Старый 27.06.2010, 14:12   #4
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

У Canvas есть методы для рисования элипсов, закрашенных прямоугольнииков, линий и заливки. Если тебе можно пользоваться этими методами - напиши функцию сам на их основе.

Прояви фантазию. Нарисуй эллипсы по краям будущего прямоугольника. Закрашенными прямоугольниками сотри лишние части эллипса, дорисуй прямоугольниками и линиями до нужного рисунка. Если фантазии тебе не хватает - напиши, нарисую тебе gif-ку, объясняющую как это сделать)
kogemrka вне форума Ответить с цитированием
Старый 27.06.2010, 14:39   #5
260526052605
Пользователь
 
Регистрация: 31.07.2008
Сообщений: 12
По умолчанию

Canvas.RoundRect(x1,y1,x2,y2,x3,y3: Integer);
это метод канвы в дельфи, x3 и y3 это как w и h в Паскале
260526052605 вне форума Ответить с цитированием
Старый 27.06.2010, 14:48   #6
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию

мне нужно написать процедуру, а не использовать Canvas.RoundRect
Alex3463 вне форума Ответить с цитированием
Старый 27.06.2010, 15:02   #7
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию

скажите, как мне получить из рисунка1 рисунок2?

рис1



рис2

Alex3463 вне форума Ответить с цитированием
Старый 28.06.2010, 00:55   #8
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Цитата:
Сообщение от Alex3463 Посмотреть сообщение
скажите, как мне получить из рисунка1 рисунок2?
Включи фантазию)

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



Затем рисуй два закрашенных цветом фона прямоугольника следующим образом:
(для наглядности я нарисую их отличающимся цветом, чтобы было понятно)




Результат, который должен получиться:
kogemrka вне форума Ответить с цитированием
Старый 28.06.2010, 10:23   #9
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию

спасибо, буду пробовать
Alex3463 вне форума Ответить с цитированием
Старый 28.06.2010, 10:45   #10
Alex3463
Новичок
Джуниор
 
Регистрация: 27.06.2010
Сообщений: 6
По умолчанию

а есть какой нибудь алгоритм, чтобы построить многоугольник со скруглениями радиуса R?
Alex3463 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
новый антивирус на delphi - Normal antivirus skanner alesandro2 Софт 14 26.02.2014 10:29
Как в редактор кода Delphi 7 добавить новый шрифт? lexaltd Общие вопросы Delphi 13 22.06.2012 18:34
как создать новый лист в ecxel sql запросом из delphi? betirsolt БД в Delphi 2 14.06.2010 15:47
Новый модуль WinProc для работы с процессами (Delphi) Terran Компоненты Delphi 1 10.01.2010 22:38