Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.05;
Скачать: CL | DM;

Вниз

перетаскивание имаджев соединёных линией   Найти похожие ветки 

 
b86   (2010-09-16 09:38) [0]

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


 
12 ©   (2010-09-16 09:42) [1]

canvas.lineto


 
И. Павел ©   (2010-09-16 09:46) [2]

> Подскажите, пожалуйста.

Поскольку вопроса как такового нет, то объясню самую суть процесса :)

> т.е. если имейджы дальше друг от друга  - линия длинее,
> ближе - линия короче.

Может быть будет удобнее рисавать сразу все (блоки и связи между ними) на одной канве? А то TImage при перетаскивании может мелькать (даже при двойной буферизации).
А что касается линии, то наверное, будет удобно хранить связи между блоками в графе, например, если 1 и 3 блоки связаны, то граф будет выглядеть так:

001
000
100


А при перетаскивании блока смотреть - с чем он связан, и перери совывать эти линии (ну или все сразу перерисовывать, если линии могут проходить через блоки). Сначала создаете канву (нгапример на TImage), а потом ее выводите (копируете TImage на канву формы).
Ну а если нужно, чтобы линии связей были ломанными и обходили блоки, то придется их хранить и придумывать алгоритм для "обхода препятствий".


 
Anatoly Podgoretsky ©   (2010-09-16 09:58) [3]

> b86  (16.09.2010 09:38:00)  [0]

А вопрос то какой?


 
Anatoly Podgoretsky ©   (2010-09-16 09:59) [4]

А задача похоже на школьную, задали решить?


 
Ega23 ©   (2010-09-16 10:43) [5]


> Сначала создаете канву (нгапример на TImage), а потом ее
> выводите (копируете TImage на канву формы).


Может таки виртуальный битмап?


 
И. Павел ©   (2010-09-16 10:47) [6]

> Может таки виртуальный битмап?

Ну если нужно экономить каждый байт и не нужно использовать начальную канву в Design Time, то можно и так.


 
Ega23 ©   (2010-09-16 10:56) [7]


> Ну если нужно экономить каждый байт и не нужно использовать
> начальную канву в Design Time, то можно и так.


Что-то, друк, я не совсем понимаю, что ты хочешь сказать.


 
И. Павел ©   (2010-09-16 11:06) [8]

Я имею ввиду что холст, на котором будет вестись предварительное рисование можно выбрать разным - и невидимым TImage (если там есть фон - у меня так было, поэтому использовал его, все равно в нем именно битмап и работал), и динамическим bitmap. Главное чтобы он нигде не рисовался и имел возможность скопироваться на видимую канву.


 
Ega23 ©   (2010-09-16 11:17) [9]


> и невидимым TImage


Вот это я как-то не понимаю. Давай ещё для загрузки текстового файла TMemo создавать будем. А чо, там тоже TStrings есть.
Чем не код:
with TMemo.Create(nil) do
begin
 try
   Lines.LoadFromFile("C:\1.txt");
   Lines.Delete(0);
   Lines.SaveToFile("C:\1.txt");
 finally
   Free;    
 end;
end;

?


 
И. Павел ©   (2010-09-16 11:23) [10]

> [9] Ega23 ©  

Ну я и ответил в [6].
Если нужна скорость и минимальный объем, то в принципе ООП это вообще лишнее.
C TImage можно работать на форме в DesignTime, этим он удобен. Если эта возможность не нужна, то конечно его использовать нет смысла.


 
b86   (2010-09-16 11:25) [11]

Мой вопрос, как сделать так что бы линии тянулись или сокращались при перетаскивание? как сделать, что бы было видно именно её изменения в процессе перетаскивания? Мне не надо экономить байты и огибать препятствия.


 
Ega23 ©   (2010-09-16 11:31) [12]


> Мой вопрос, как сделать так что бы линии тянулись или сокращались
> при перетаскивание? как сделать, что бы было видно именно
> её изменения в процессе перетаскивания?


1. Отрисовать эту линию по старым координатам цветом фона.
2. Нарисовать линию по новым координатам своим цветом.
Выполнять пункты 1 и 2 в OnMouseMove


 
Ega23 ©   (2010-09-16 11:34) [13]


> Ну я и ответил в [6].
> Если нужна скорость и минимальный объем, то в принципе ООП
> это вообще лишнее.
> C TImage можно работать на форме в DesignTime, этим он удобен.
>  Если эта возможность не нужна, то конечно его использовать
> нет смысла.

Тут дело такое. Если ты внимательно посмотришь, то эта конфа - для начинающих. А ты советы даёшь мягко говоря весьма чудесатые.
А начинающий без понятия, чудесатый ему совет дали, или нет. Он и загрузку файла как в [9] запросто сделает (а чо, работает же?).

Аккуратнее надо быть, коль отвечать берёшься.


 
И. Павел ©   (2010-09-16 11:34) [14]

> Мой вопрос, как сделать так что бы линии тянулись или сокращались
> при перетаскивание?

см [1]. Этот метод позволяет нарисовать на канве (любой - например формы) линию.
Автоматически, спомощью стандартных компонентов, задачу вроде бы не сделать.
Чтобы тянуть/сокращать линию, нужно самостоятельно расчитывать координаты линии и рисовать ее в OnPaint канвы формы (к примеру, но в принципе можно где угодно - лишь бы была канва - объект TCanvas).
Если это для вас пока сложновато - можно строить линию спомощью двух TShape - сначала горизонтальный а потом вертикальный отрезки, меняя их Left, Top, Width, Height.

Вы начните. А как будут сложности - спрашивайте. А то пока мне, например, непонятно, что вам непонятно :)


 
Ega23 ©   (2010-09-16 11:37) [15]


> Если это для вас пока сложновато - можно строить линию спомощью
> двух TShape - сначала горизонтальный а потом вертикальный
> отрезки, меняя их Left, Top, Width, Height.


мама, роди меня обратно....


 
И. Павел ©   (2010-09-16 11:37) [16]

> [13] Ega23 ©

Вот тут тоже люди за каждый байт бьются: http://10k.aneventapart.com/Uploads/83/#
Спорить не буду. Смысла просто нет никакого этим заниматься.


 
b86   (2010-09-16 11:38) [17]

И. Павел, спасибо. Буду стараться.


 
И. Павел ©   (2010-09-16 11:38) [18]

Если это для вас пока сложновато - можно строить линию спомощью
двух TShape - сначала горизонтальный а потом вертикальный
отрезки, меняя их Left, Top, Width, Height.


 
Ega23 ©   (2010-09-16 11:39) [19]


> Спорить не буду. Смысла просто нет никакого этим заниматься.


> Если это для вас пока сложновато - можно строить линию спомощью
> двух TShape - сначала горизонтальный а потом вертикальный
> отрезки, меняя их Left, Top, Width, Height.


LMD.


 
b86   (2010-09-16 11:44) [20]

по поводу LMD. Раздел называется для начинающих, не так ли?

Чванливые зануды MD.


 
Ega23 ©   (2010-09-16 11:45) [21]

Собственно, именно по этой причине и распространено мнение, что Delphi - батонокидательство и нормальные люди на нём не пишут.


 
Ega23 ©   (2010-09-16 11:48) [22]


> по поводу LMD. Раздел называется для начинающих, не так ли?
> Чванливые зануды MD.


Поясняю. Тебе сейчас товарищ оказал медвежью услугу. Он тебе сказал, что надо делать. И таки да, работать оно будет. И ты это весело и радостно запомнишь и начнёшь повсеместно использовать.
А потом очень удивишься, почему собеседование не удаётся нигде пройти.

Так вот. Уж коли взялся отвечать в "Начинающим" - будь любезен отвечать правильно. Либо не отвечай совсем, если не понимаешь.


 
Anatoly Podgoretsky ©   (2010-09-16 11:58) [23]

Тебе нужны резиновые линии, а они делаются не просто, а очень просто.
Двойное рисование с XOR


 
b86   (2010-09-16 12:00) [24]

Дааа! Резиновые линии. Где посмотреть про XOR?


 
Ega23 ©   (2010-09-16 12:02) [25]


> Где посмотреть про XOR?


Не поверишь: в справке.


 
b86   (2010-09-16 12:14) [26]


> Не поверишь: в справке.


Смотрю вы сегодня неудержимы.

Попробовал Ваш совет из [12]. Линия перерисовывается, а не тянется. То ли я дурак, то ли лыжи не едут.

Ваш вариант?


 
Anatoly Podgoretsky ©   (2010-09-16 12:16) [27]

В справке, по методам канвы


 
Amoeba_   (2010-09-16 12:18) [28]


> b86   (16.09.10 12:14) [26]

Может это наведет на мысль?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=94


 
b86   (2010-09-16 12:23) [29]

Круть. Спасибо.


 
Ega23 ©   (2010-09-16 12:28) [30]


> Смотрю вы сегодня неудержимы.

Я что-то не так сказал? Или неправильно?

> Попробовал Ваш совет из [12]. Линия перерисовывается, а
> не тянется. То ли я дурак, то ли лыжи не едут.

Есть некий объект. У него есть текущий размер и текущие координаты. Когда ты этот объект "тащишь", то меняются его текущие координаты.
Дальше. К объекту "ведут стрелочки". Данный объект знает, где какая стрелка у него заканчивается (относительно его координат).
Ну а дальше всё просто. Меняются координаты объекта. Он сначала "стирает себя" по старым координатам, стирает все свои линии по старым координатам (а стереть - это прорисовать их цветом фона). Потом рисует всё по новым.
Можно немного иначе. Заливаем весь рисунок фоном и перерисовываем его опять же весь.
Можно ещё иначе. Создаём виртуальный битмап, рисуем на нём что надо, а потом тупо копируем изображение на канву (что, собственно, DoubleBuffered и делает).
When DoubleBuffered is false, the windowed control paints itself directly to the window. When DoubleBuffered is true, the windowed control paints itself to an in-memory bitmap that is then used to paint the window. Double buffering reduces the amount of flicker when the control repaints, but is more memory intensive.


 
Anatoly Podgoretsky ©   (2010-09-16 12:44) [31]

> b86  (16.09.2010 12:23:29)  [29]

Резиновые линии не круть, а элементарщина.



Страницы: 1 вся ветка

Текущий архив: 2010.12.05;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.007 c
15-1282763419
Desdechado
2010-08-25 23:10
2010.12.05
Каптча в стиле дзен


4-1242124565
Zalum
2009-05-12 14:36
2010.12.05
передать и принять несколько параметров


15-1282854584
Юрий
2010-08-27 00:29
2010.12.05
С днем рождения ! 27 августа 2010 пятница


6-1210699123
San1712
2008-05-13 21:18
2010.12.05
Какие есть функции в Windows Xp для управления раб столом ?


2-1284615492
b86
2010-09-16 09:38
2010.12.05
перетаскивание имаджев соединёных линией