Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Нужно создать что-то типа CAD-системы 
V
    Опции темы
ilya_z
Дата 10.1.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



В-общем, проблема такая: пытаюсь написать программку визуализации измерений. Т.е. с координатно-измерительной машины приходят координаты точек, а моя задача - отображать их в одной из трёх выбираемых плоскостей с учётом масштаба и, соответственно, отображаемой области.
Основа программы уже вырисовывается, уткнулся в то, что как-то нужно описать объекты. Пока задумал четыре объекта: отрезок, дуга, окружность, размерная линия (отрезок со стрелками). И сижу балуюсь с элементами TShape (рисую окружности) и TCanvas (рисую отрезки и окружности; а вот дуги получаются плохо: никак не врублюсь, как правильно указывать координаты, передаваемые в функцию Arc). Очевидно, что это не то, что мне нужно.
Ну, к примеру, такая штука меня не устраивает тем, что объекты то я вставляю в форму, вот только потом к ним никак обратиться не могу:

Код

var CPoint:TShape;
...
  CPoint:=TShape.Create(form1);
  CPoint.Name:='Point'+IntToStr(DotsCount);
  with CPoint do
  Begin
     Shape:=stCircle;
     if fSelect then Brush.Color:=clNavy else Brush.Color:=clYellow;
     Height:=Trunc(6/scaleY);
     if (Height<3) then Height:=3;
     if (Height>10) then Height:=10;
     Width:=Trunc(6/scaleX);
     if (Width<3) then Width:=3;
     if (Width>10) then Width:=10;
     case form1.RadioGroup1.ItemIndex of
     0: Begin
            Left:=Trunc((X-X0)/scaleX+form1.Shape1.Left);
            Top:=Trunc((Y0-Y)/scaleY+form1.Shape1.Top);
         end;
     1: Begin
            Left:=Trunc((X-X0)/scaleX+form1.Shape1.Left);
            Top:=Trunc((Y0-Z)/scaleY+form1.Shape1.Top);
         end;
     2: Begin
            Left:=Trunc((Y-X0)/scaleX+form1.Shape1.Left);
            Top:=Trunc((Y0-Z)/scaleY+form1.Shape1.Top);
         end;
     end;
     Left:=Trunc(Left-Width/2);
     Top:=Trunc(Top-Height/2);
  end;
  CPoint.OnMouseDown:=Form1.OnMouseDown;
  CPoint.Parent:=form1;
  if ((CPoint.Left<form1.Shape1.Left) or (CPoint.Top<form1.Shape1.Top) or (CPoint.Left>form1.Shape1.Left+form1.Shape1.Width) or (CPoint.Top>form1.Shape1.Top+form1.Shape1.Height)) then
  Begin
     CPoint.Visible:=false;
     if (MessageDlg('Выбранная точка находится за пределами отображаемой области. Чтобы уменьшить масштаб и вписать точку в экран нажимай "Yes", иначе нажимай "No"',mtConfirmation,[mbYes,mbNo],0)=mrYes) then
     Begin
        m1:=CPoint.Left/form1.Shape1.Width;
        m2:=CPoint.Top/form1.Shape1.Height;
        if (m2>m1) then m1:=m2;
        form1.SpinEdit4.Value:=Trunc(form1.SpinEdit4.Value/(m1*10))*10;
     end;
  end;


Так-то вроде бы это то, что нужно, только как к объекту то обратиться? Я знаю его имя, но дальше то что? Искать с помощью FindNextControl не представляется возможным потому, что объекты типа TShape, хоть и являются потомками класса TControl, но почему-то не нумеруются: после добавления такого объекта счётчик Form1.ControlCount не инкрементируется. Вата какая-то получается. Это ещё полбеды: кроме окружностей, я хочу рисовать и другие объекты, а их в TShape нету. Получается, что мне всё равно придётся описывать их на основе класса TGraphicControl. А этого я, к сожалению, делать и не умею.

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

Это сообщение отредактировал(а) ilya_z - 10.1.2007, 13:42
PM MAIL   Вверх
Alexeis
Дата 10.1.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ilya_z @  10.1.2007,  13:36 Найти цитируемый пост)
Получается, что мне всё равно придётся описывать их на основе класса TGraphicControl. А этого я, к сожалению, делать и не умею.


   Зачем же так. Каждый потомок будет иметь свой канвас, а этого ни кому не надо. Достаточно иметь у класс имеющий канву. Он и будет всех рисовать. А сами фигуры будут хранить чисто свои координаты и состояние. 
  Что касается ARC. Первые 2 точки определяют прямоугольник описанный около эллипса. 3я точка с центром эллипса образует прямую точка пересечения прямой и эллипса есть начало дуги. 4я точка аналогично 3й только определяет конец дуги.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ilya_z
Дата 11.1.2007, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



Посмотрел я, чего пишут про TGraphicControl:
"Graphic controls cannot receive the input focus, nor can they contain other controls. Because a graphic control doesn’t need a Windows handle, it’s demand on system resources is lessened, and painting a graphic control is quicker than painting a windowed control.
To create a control that can receive input focus or contain other controls, but which needs a Canvas property and a Paint method, derive a class from TCustomControl."
Теперь стало ясно, почему объекты типа TShape не нумеруются: не могут они иметь фокус. Хотя это и так уже было ясно. Получается, что свой класс мне нужно делать на основе не TGraphicControl, а только на основе TCustomControl.

Всё равно хороший пример нужен, однако. Книжки-то по программированию я не люблю читать. Все они "водянистые" какие-то, пока до сути доберёшься - состаришься. Вот фантастику какую почитать - это совсем другое дело.

Думаю, может быть и сам справлюсь. Пока читаю вот это:
http://podgoretsky.com/ftp/Docs/Delphi/D5/...ustom.html#3418
а там, глядишь, и новые мысли появятся.

Это сообщение отредактировал(а) ilya_z - 11.1.2007, 06:11
PM MAIL   Вверх
ilya_z
Дата 12.1.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



Процесс пошёл. Оказалось, что в "Delphi 3 Pro" всё, что нужно для создания новых компонентов, уже есть. Хороший help и описание API-функций (MSDN). Раньше я на объекты в палете sample внимания не обращал, а теперь понял, что их то в первую очередь и нужно смотреть. Тогда сразу становится ясно, как писать свои компоненты.

Сейчас наткнулся на два камня:
1) новые объекты не хотят уничтожаться: хотя при их создании никаких более объектов или динамических переменных не создаётся, но при вызове деструктора происходит переполнение стэка (при зацикливании на процедуре free). В чём причина - не догоняю.
destructor TCustomControl1.Destroy;
Begin
  Free;
  inherited Destroy;
end;
2) новые объекты не хотят становиться прозрачными при задании:
Brush.Style:=bsClear;
PM MAIL   Вверх
Alexeis
Дата 12.1.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ilya_z @  12.1.2007,  10:03 Найти цитируемый пост)
destructor TCustomControl1.Destroy;
Begin
  Free;
  inherited Destroy;
end;


И не удивительно! метод Free - вызывает метод Destroy (по определению), он ведь виртуальный. Вот и циклический вызов.


M
Alexeis
Модератор: Пожалуйста, один топик - один вопрос.


  Форум не занимается решением ваших задач. (Это делается только одном единственном разделе - "Центр помощи"). Форум следует использовать для решения определенных вопросов. Каждый вопрос это отдельная тема. Не следует поднимать вопросы, которые уже имеют решение. Для этого перед созданием темы следует минимум посмотреть в DRKB (крупнейший делфийский фак) и осуществить поиск по форуму  и только после этого создавать тему с вопросом, а не с группой несвязанных между собой вопросов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ilya_z
Дата 12.1.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



Да ладно уж. Можно подумать, я кого-то напрягаю или флудом каким занимаюсь. Если это так, то прошу прощения.
Я всегда сам со своими проблемами разбирался, и у меня есть основания полагать, что и с этим делом справлюсь. Просто времени больше на это уйдёт. Зато лучше пойму суть вопроса: что, почему и зачем.
А за помощь - спасибо.

По поводу поиска хочу выразить своё личное мнение (как это теперь модно писать в среде "папуасов" - IMHO): куда ни ткнись, а ничего толкового на форумах не находится, за редким исключением. Может это потому, что вопросы у всех разные, а может потому, что одним людям, хоть чего-нибудь понимающим, в лом разбираться с чужими проблемами, а остальные просто сильно умственно отсталые (УО), и от их советов только вред. К сожалению, вторых подавляющее большинство.

И по своей теме я уже инет покопал, ничего толкового, конечно же, пока не накопал и, скорее всего, не накопаю. Есть хорошие примеры (демки), да только вот исходников-то всё равно на них нет. Потому проще написать своё и не терять время и силы зря.
PM MAIL   Вверх
Alexeis
Дата 12.1.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



ilya_z, дело не в том напрягать или нет, дело в порядке. Вопросы по графике должны быть созданны тут, а вопросы по ООП и созданию компонентов в разделе "Общих вопросов". 
  Зря вы ругаете поиск. На очень многие из новых заданных вопросов обычно находят ответ или в факе или в DRKB или на форуме. Особенно это касается раздела "Общие вопросы". В настоящее время в разделе делфи 20994 тем! У нас есть раздел Арсенал форумистов где люди выкладывают свои удачные решения и еще много чего другого. Это обычная практика.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ilya_z
Дата 12.1.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.1.2007
Где: Екатеринбург

Репутация: нет
Всего: нет



Ничего я не ругаю. Просто обычно того, что нужно, почему-то никогда нигде нет. И пока ищешь ответы на свои вопросы, то всегда быстрее получается самому догадаться с помощью метода "научного тыка" и хэлпа, чем найти хоть что-то полезное. Поэтому по-пустякам я никогда не лезу в поиск, потому что поиск ни фига "не рулит", и это не пустой трёп, а тенденция. Всегда лучше сначала сесть и подумать, полистать хэлп, - и решение придёт само собой, чем упираться рогами в поиск и тупо искать чёрную кошку в тёмной комнате, особенно, если известно, что там её нет.
А DRKB я полистал, и ничего интересного там не увидел. Даже не знаю в чём тут дело. Про себя не могу сказать, что я какой-то крутой программер. Заурядный самоучка. Может быть просто этот DRKB для совсем чайников писан? А по моей теме там нет вообще ничего, т.е. zero.

Это сообщение отредактировал(а) ilya_z - 12.1.2007, 18:40
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.