Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.12.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.003 c
2-1284365809
zmxncbv
2010-09-13 12:16
2010.12.05
Модальные формы


2-1284447582
ZV
2010-09-14 10:59
2010.12.05
Замерять время выполнения процедуры в мс.


2-1284292105
rosl
2010-09-12 15:48
2010.12.05
управление


6-1229967143
UnDISCOvery
2008-12-22 20:32
2010.12.05
Импорт WSDL для SOAP-клиента не работает!


15-1282728977
Baks
2010-08-25 13:36
2010.12.05
Хостинг Agava.ru vs NTHost.ru





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский