Форум: "Начинающим";
Текущий архив: 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