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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание динамически-рисующего приложения 
:(
    Опции темы
faost
Дата 1.3.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задача такая.

Есть рисунки различных инструментов - метчиков, сверел и т. д.

В приложении вы можете открыть любой из рисунков в отдельном окне, который состоит из двух частей - сам рисунок и список переменных, при изменении значений которых будет меняться сам рисунок.
Есть ли какие идеи, как это можно реализовать? Какой графический формат использовать, например?
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
Bes
Дата 2.3.2005, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что реализовать? Говори толком. Нужно получить картинки сверел - сфотографируй их.
PM MAIL   Вверх
~FoX~
Дата 2.3.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



faost
Векторная графика однозначно.
Менять растр динамически геморойней на много.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 2.3.2005, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Чего ж тут геморойного. Обычный TImage.
Если различается размер - просто растягиваем или сжимаем.
Если другие параметры - просто другую картинку.
Цитата(faost @ 1.3.2005, 22:49)
Какой графический формат использовать, например?

Да любой, какой можно запихать в TImage. Если размер не важен, то и BMP подойдет.
PM MAIL   Вверх
bursa
Дата 2.3.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Когда-то делал программу для построения схемы жд станции. С изменением, соответственно, и размера, и положения и т.д.
Вот, куски кода, может пригодится

Код

unit Putj;
....
type
TPutj = class(TGraphicControl)

  protected

 public
  Name:string[15];
  SetMove,setSizeVL,setSizeVR,SetSizeGT,setSizeGB,selected:Boolean;
  XPosR,YPosR,nom:integer;
....
     constructor Create(AOwner:TComponent);override;
     procedure CreateOpen;virtual;
     procedure Drw(Bounds:TRect;Canvas:TCanvas);virtual;
     procedure Paint;override;
     procedure DblClick(var MousePt:TWMLButtonDblClk);message
        wm_LBUTTONDBLCLK;
     procedure MouseClick(var MousePt:TWMLButtonDown);message
        wm_LButtonDown;
     procedure MouseUp(var MousePt:TWMLButtonUp);message
        wm_LButtonUp;
     procedure MouseMov(var MousePt:TWMMouseMove);message
        wm_MouseMove;
     procedure MouseLiv(var MousePt:TWMMouseMove);message
        cm_MouseLeave;
....

....
 end;


implementation


procedure TPutj.Drw(Bounds:TRect;Canvas:TCanvas);
var ...
begin
with bounds,Canvas do
begin
 if Selected then
 pen.Color:=clBlue
 else
 pen.Color:=clBtnFace;

 brush.Style:=bsClear;
 pen.Style:=psDashDotDot;
 Rectangle(left,top,right,bottom);

 if (elem[1]<>0) or (elem[2]<>0) then

.....
   MoveTo(left,top+7*form[TekForm].ZoomIn div 2);
   LineTo(right-7*form[TekForm].ZoomIn div 2,bottom);
   Canvas.TextOut((left+right)div 2-4*form[TekForm].ZoomIn,
   (top+bottom)div 2,a);
 end else begin
.....

end;

constructor TPutj.Create(AOwner:TComponent);
var i,j:integer;
begin
inherited Create(AOwner);
Selected:=true;
if nomglobp<>0 then form[TekForm].UnSel;
 SetMove:=False;
nomglobp:=nomglobp+1;
nom:=form[TekForm].teknom;
end;

procedure TPutj.CreateOpen;
begin
inherited Create(form[TekForm]);
selected:=false;
end;

procedure TPutj.Paint;
var
DrawRct:TRect;
begin
with Canvas, DrawRct do begin
DrawRct:=ClientRect;
drw(DrawRct,Canvas);
end;
end;

procedure TPutj.MouseClick(var MousePt:TWMLButtonDown);
begin
form[TekForm].element:=1;
if not form[TekForm].setDrag then begin
form[TekForm].UnSel;
if orient = 1 then
if (MousePt.XPos<=5) then
setSizeVL:=true
else
....
end;

procedure TPutj.MouseUp(var MousePt:TWMLButtonUp);
begin
...
end;

procedure TPutj.MouseMov(var MousePt:TWMMouseMove);
var a,b:string;
   v:boolean;
begin
Hint:=
...

if SetMove then begin
 if v then form[TekForm].vnesIzm:=true;
 if grid7(Left+MousePt.XPos-XPosR) then Left:=Left+MousePt.XPos-XPosR;
 if grid7(Top+MousePt.YPos-YPosR) then Top:=Top+MousePt.YPos-YPosR;
end;
if SetSizeVL then begin
 if v then form[TekForm].vnesIzm:=true;
 if Grid7(Width+XPosR-MousePt.XPos) then Width:=Width+XPosR-MousePt.XPos;
 if Grid7(Left+MousePt.XPos-XPosR) then Left:=Left+MousePt.XPos-XPosR;
end;
if setsizeVR then begin
 if Grid7(MousePt.XPos) then Width:=MousePt.XPos;
end;
if setsizeGT then begin
 if Grid7(Height+YPosR-MousePt.YPos) then Height:=Height+YPosR-MousePt.YPos;
 if Grid7(Top+MousePt.YPos-YPosR) then Top:=Top+MousePt.YPos-YPosR;
end;
.....
end;

procedure TPutj.MouseLiv(var MousePt:TWMMouseMove);
begin
if (not SetMove) and  (form[TekForm].cursor<>crDrag) and (form[TekForm].cursor<>crDefault)
    and not setsizeVL and not setsizeVR and not setsizeGT
    and not setsizeGB
then begin
form[TekForm].cursor:=crDefault;
end;
end;

procedure TPutj.DblClick(var MousePt:TWMLButtonDblClk);
begin
form[TekForm].element:=1;
Form2.FormCreate(Form2);
form2.showmodal;

end;


function TPutj.Grid7(g:integer):boolean;
begin
if g div (7*Form[TekForm].ZoomIn) =g/(7*Form[TekForm].ZoomIn) then
grid7:=true
else
grid7:=false;
end;
end.


unit Stans;

interface

uses
...
type
 TForm1 = class(TForm)
...
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormClick(Sender: TObject);
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormActivate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormResize(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }

  Putj: array of TPutj;
  strel: array of TStr;
  soed: array of TSoedin;
...
 end;

var
 Form:array [1..100] of TForm1;
 TekForm:integer;
const  kolform:integer=1;

implementation

uses panel,table, change;

{$R *.DFM}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var el:TPutj;
begin

if setdrag then
cursor:= crDrag;
el:=nil;
if putj[form[TekForm].TekNom]<>nil then
if putj[form[TekForm].TekNom].selected then
 el:=putj[form[TekForm].TekNom];
if strel[form[TekForm].TekNom]<>nil then
if strel[form[TekForm].TekNom].selected then
 el:=strel[form[TekForm].TekNom];


if el<>nil then begin
if el.setmove=true then begin
if not VnesIzm then VnesIzm:=true;
if el.Grid7(X-el.XPosR) then el.left:=X-el.XPosR;
if el.Grid7(Y-el.YPosR) then el.top:=Y-el.YPosR;
end;
if el.SetSizeVL then begin
if not VnesIzm then VnesIzm:=true;
if el.Grid7(el.width+el.Left-X+el.XPosR) then el.width:=el.width+el.Left-X+el.XPosR;
if el.Grid7(X-el.XPosR) then el.Left:=X-el.XPosR;
end;
if el.setsizeVR then begin
if not VnesIzm then VnesIzm:=true;
if el.Grid7(X-el.Left) then el.Width:=X-el.Left;
end;
if el.SetSizeGT then begin
if not VnesIzm then VnesIzm:=true;
if el.Grid7(el.Height+el.Top-Y+el.YPosR) then el.Height:=el.Height+el.Top-Y+el.YPosR;
if el.Grid7(Y-el.YPosR) then el.Top:=Y-el.YPosR;
end;
if el.setsizeGB then begin
if not VnesIzm then VnesIzm:=true;
if el.Grid7(Y-el.Top) then el.Height:=Y-el.Top;
end;
if (el.orient=1) and (el.Width<14*ZoomIn)
 then el.Width:=14*ZoomIn;
if (el.orient=2) and (el.Height<14*ZoomIn)
 then el.Height:=14*ZoomIn;

if (not (el is TStr))and (el.orient=1) then
if el.hvost=1 then el.height:=el.width else
el.height:=7*form[TekForm].ZoomIn;

if (not (el is TStr))and (el.orient=2) then
if el.hvost=1 then el.width:=el.height else
el.width:=7*form[TekForm].ZoomIn;
end;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 begin
Soedin;
if putj[form[TekForm].TekNom]<>nil then begin
if putj[form[TekForm].TekNom].selected then
 if (cursor=crSizeWE) or (cursor=crSizeNS) then
 if Auto then Opredlin;
 putj[form[TekForm].TekNom].UnSet;
 cursor:=crDefault;
end;
if strel[form[TekForm].TekNom]<>nil then begin
if strel[form[TekForm].TekNom].selected then
 if Auto then Opredlin;
 strel[form[TekForm].TekNom].UnSet;
 cursor:=crDefault;
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
unSel;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 var j,i:integer;
begin
if setdrag then begin
if not VnesIzm then VnesIzm:=true;
if element=1 then begin
j:=1;
while (j<>KolPutj+1) and (putj[j]<>nil) do J:=J+1;
if j<>KolPutj+1 then begin
form[TekForm].TekNom:=j;
putj[j]:=TPutj.Create(self);
if Putj[j]=nil then exit;
putj[j].Parent:=Self;
putj[j].elem[1]:=0;
putj[j].elem[2]:=0;
...

Добавлено @ 10:31
и еще в форме-панели кнопочки

Код

procedure TForm3.SpeedButton1Click(Sender: TObject);
begin
form[TekForm].drag;
form[TekForm].orientaz:=1;
form[TekForm].element:=1;
form[TekForm].hvostg:=2;
end;


Это сообщение отредактировал(а) Alex - 4.3.2005, 19:05
PM MAIL   Вверх
~FoX~
Дата 2.3.2005, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



Snowy
--Resize_Images_Alt_Text--
Не умучаешься картинки рисовать под каждый угол или выемку? smile
ИМХО нерацианально это......лучше вектор. И по размеру меньше и по коду проще и таскать с сабой имиджи не надо.......задал координаты точек или углы или радиус, да что угодно и опаньки - поимел необходимую картинку.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 2.3.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Зависит от того, какие вариации требуются.
Если вариаций немного, то проще обойтись битмапами.
А вот, если их много, то тут либо рисовать все ручками, либо осваивать векторную графику.
Не вижу, чтобы это был более простой выход. Но, если вариантов много, то что делать. Придется.
PM MAIL   Вверх
faost
Дата 2.3.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Что реализовать? Говори толком. Нужно получить картинки сверел - сфотографируй их.


Картинки сверел должны быть как данные для программы. Нужну при изменении параметров (ширина какой-то части, угол другой части и т. д.) изменять сам рисунок.

Цитата
Зависит от того, какие вариации требуются.
Если вариаций немного, то проще обойтись битмапами.
А вот, если их много, то тут либо рисовать все ручками, либо осваивать векторную графику.
Не вижу, чтобы это был более простой выход. Но, если вариантов много, то что делать. Придется.


Видимо, надо действительно использовать векторную графику.
Кто может посоветовать доки по этой теме?
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
bursa
Дата 2.3.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



faost (Online) Дата 2.3.2005, 13:51
Нужну при изменении параметров (ширина какой-то части, угол другой части и т. д.) изменять сам рисунок.

Посмотри на мой код выше


в процедуре исходя из параметров экземпляра объекта TPutj рисуешь что тебе надо
procedure TPutj.Drw(Bounds:TRect;Canvas:TCanvas);

При этом тебе не надо беспокоиться о таких вещах, как перерисовка
Изменил параметры, вызвал Paint - и всё. Причем и картинки можешь вставлять, и пользоваться
LineTo, MoveTo и т.д.

А процедурами OnMouse... управляешь перемещением и изменением размеров экземпляров


PM MAIL   Вверх
Bes
Дата 3.3.2005, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Догадался уж из форума. :-)
Вообще, когда вижу такую задачу, сразу возникает вопрос: для чего это может быть нужно. Т.е. может есть способы проще? Какая-то странная задачка. Может не все так гемморойно?
PM MAIL   Вверх
~FoX~
Дата 3.3.2005, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



faost
А Bes прав, опиши задачу целиком (ну нафига это надо), может есть более простые варианты решения.
Цитата(faost @ 1.3.2005, 22:49)
Какой графический формат использовать, например?

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


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
faost
Дата 4.3.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Bes @ 3.3.2005, 07:37)
Догадался уж из форума. :-)
Вообще, когда вижу такую задачу, сразу возникает вопрос: для чего это может быть нужно. Т.е. может есть способы проще? Какая-то странная задачка. Может не все так гемморойно?

Было такое задание на диплом, на данный момент оно изменилось, так что посмотрим что будет дальше ))
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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