Графический редактор в Delphi |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Графический редактор в Delphi |
SeregaR1Val |
21.01.2011 17:30
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 37 Пол: Мужской Реальное имя: Серёга Репутация: 0 |
Добрый день! Необходимо написать графический редактор следующего вида:
Окно разбито на 2 части, в левой вводятся параметры фигуры, в правой она отрисовывается. Например: для начала задан прямоугольник высотой 50 и шириной 100. Указываем высоту - 25, на ней ширина 50 и фигура должна преобразоваться, приняв форму песочных часов и далее в этом духе. Надеюсь нормально объяснил... Программу еще не начал, код писать не прошу, необходима консультация в том, какие элементы выбрать для разработки, TPaintBox или TImage и т.д. и как лучше всё это отрисовывать, может кто может дать совет? |
TarasBer |
21.01.2011 18:30
Сообщение
#2
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Что-то я пока не очень понял.
Если мы можем только менять ширину на конкретной высоте. То есть фигура может иметь только такой вид? Сообщение отредактировано: TarasBer - 21.01.2011 18:30 Эскизы прикрепленных изображений -------------------- |
Гость |
21.01.2011 19:51
Сообщение
#3
|
Гость |
Да, только такой, возможно надо будет сругленные углы добавить, но пока только такой вид! Может есть у кого какие соображения? Опыт подсказывает, что первое попавшееся решение потом приходится переделывать, хотелось бы узнать мнение знающих людей и приступить к работе!
|
TarasBer |
21.01.2011 20:38
Сообщение
#4
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
То есть все инструкции определяются только двумя параметрами - высота и ширина?
Ну так и храни массив пар (высота, ширина) Изначально массив состоит из 2 пар: (25, 100) и (-25, 100) Каждая команда добавляет пару к массиву. Потом отсортируй по высоте. Потом просто выведи ломаную линию (стандартная функция, передай в неё массив пар (ширина пополам плюс середина экрана, высота)), отрази её (передай пары (середина экрана минус ширина пополам, высота)). Потом нарисуй верхнюю и нижнюю грани (длину линии определи по ширине на максимальной и минимальной высоте). -------------------- |
RussoTuristo |
4.02.2011 10:51
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Извините, придется заходить не под собой, мой профиль исчез куда-то))))
Навоял что-то, но работает оно совсем не так... Отрисовывается что-то непонятное, а из-за того, что изображение строю в буфере, отследить по шагам не удается... Может я что не так делаю? Подскажите, пожалуйста... Код:
Массивы ar1 и ar2 из StringGrid по-моему он не заполняет... или потом не считывает.... Сообщение отредактировано: RussoTuristo - 4.02.2011 10:54 Прикрепленные файлы 1.rar ( 9.06 килобайт ) Кол-во скачиваний: 314 |
TarasBer |
4.02.2011 11:17
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> StringGrid1.Cells[0,0]:='Ширина';
> StringGrid1.Cells[1,0]:='Высота'; > StringGrid1.Cells[0,1]:='70'; > StringGrid1.Cells[1,1]:='200'; > StringGrid1.Cells[0,2]:='120'; > StringGrid1.Cells[1,2]:='300'; > 0 1 > img.Canvas.MoveTo(10,10); > for i:=1 to 100 do begin > if (ar1[1, i]<>0) and (ar1[2, i]<>0) then begin > img.Canvas.LineTo(Round(ar1[1,i]),Round(ar1[2,i])); > end; > end; > img.Canvas.MoveTo(10,10+l); > for i:=1 to 100 do begin > if (ar2[1, i]<>0) and (ar2[2, i]<>0) then begin > img.Canvas.LineTo(Round(ar2[1,i]),Round(ar2[2,i])); > end; > end; > 1 2 У тебя нумерация сбилась. -------------------- |
RussoTuristo |
4.02.2011 11:25
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Что-то до меня не доходит... В строке 0 - заголовочная часть, её пропускаем, часть StringGrida заполнена, она начинается со строки 1 и считываем для отрисовки соответственно со строки 1... Не понимаю, где ошибся. Объясните, пожалуйста, еще немного...
|
TarasBer |
4.02.2011 11:30
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Я тебе привёл 2 фрагмента.
В одном ты берёшь 1й индекс 0 и 1 В другом ты берёшь 1й индекс 1 и 2. Кстати, 1й индекс - это точно номер столбца? -------------------- |
RussoTuristo |
4.02.2011 11:52
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
В одном ты берёшь 1й индекс 0 и 1
В другом ты берёшь 1й индекс 1 и 2. Структуры-то разные по сути, StringGrid и массивы ar1. ar2, если ошибаюсь и здесь ошибка - извините заранее... А насчет индекса навёл много сомнений, только с массивами я работал не так основательно, что-то сам вникнуть не могу, по моей какой-то логике и примеру из учебника вроде так, но буду благодарен, если вы меня разубедите ... |
TarasBer |
4.02.2011 12:03
Сообщение
#10
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ещё раз.
Вот тебе два куска твоего кода: StringGrid1.Cells[0,0]:='Ширина'; StringGrid1.Cells[1,0]:='Высота'; a1:=StrToInt(StringGrid1.Cells[1, i]); a2:=StrToInt(StringGrid1.Cells[2, i]); Что, не настораживает? Ещё раз: StringGrid1.Cells[0,0]:='Ширина'; StringGrid1.Cells[1,0]:='Высота'; a1:=StrToInt(StringGrid1.Cells[1, i]); a2:=StrToInt(StringGrid1.Cells[2, i]); > Структуры-то разные по сути, StringGrid и массивы ar1. ar2 Нет, ты и там и там обращаешься к "массиву" StringGrid.Cells. -------------------- |
RussoTuristo |
4.02.2011 12:11
Сообщение
#11
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Спасибо, понял, что с индексами не так!
|
volvo |
4.02.2011 12:36
Сообщение
#12
|
Гость |
Цитата придется заходить не под собой, мой профиль исчез куда-то)))) Ничего не исчезло. Посмотри первое сообщение. Если б профиль исчез, там было бы написано, что сообщение оставил Гость. Пароль забыл, что-ли? |
RussoTuristo |
4.02.2011 12:46
Сообщение
#13
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Ничего не исчезло. Посмотри первое сообщение. Если б профиль исчез, там было бы написано, что сообщение оставил Гость. Пароль забыл, что-ли? Есть подозрения, что меня взломали, пароль не пашет. Копировал имя из этого поста и просил отправить пароль на ящик, написано было, что такого имени нет на форуме, странно... Чтоб много сообщений не оставлять, спрошу здесь: Все заработало как надо, отрисовывается, но появился ламерский вопрос: как имитировать нажатие кнопки BitBtn? Раньше знал, сейчас даже в drkb найти не могу... Сообщение отредактировано: RussoTuristo - 4.02.2011 12:51 |
TarasBer |
4.02.2011 13:00
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Просто пишешь BitBtn1Click(Sender);
-------------------- |
RussoTuristo |
4.02.2011 13:40
Сообщение
#15
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Помогите, пожалуйста, еще с одной вещью: как правильно отсортировать двумерный массив по одному из индексов. Мне нужно расположить значения массивов ar1 и ar2 в порядке возрастания по высоте (2-й столбец). Но это оказывается непросто:
for i:=1 to 100 do Что-то пытаюсь придумать, но чушь какая-то выходит.... Сообщение отредактировано: RussoTuristo - 4.02.2011 13:45 |
TarasBer |
4.02.2011 13:48
Сообщение
#16
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Надо так:
buf1:=ar1[1,j]; buf2:=ar1[2,j]; ar1[1,j]:=ar1[1,i]; ar1[2,j]:=ar1[2,i]; ar1[1,i]:=buf1; ar1[2,i]:=buf2; да что же у тебя так хреново с индексами-то... -------------------- |
RussoTuristo |
4.02.2011 14:32
Сообщение
#17
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Спасибо! Невнимательность моя... вроде могу сообразить принцип, а мелочи, даже очень значительные, пропускаю...
Можно узнать, а есть ли в Delphi возмоожность подогнать изображение под холст, то есть, например: на форме есть место под PaintBox размером 200 на 400 пикселей, а изображение может быть очень большим, можно ли как-нибудь "подогнать" его, чтобы оно оставшись своих размеров, отображалось в уменьшенном виде? |
TarasBer |
4.02.2011 14:37
Сообщение
#18
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
PaintBox1.Canvas.StretchDraw(какие-то параметры, не помню, дельфи сама подскажет)
-------------------- |
RussoTuristo |
7.02.2011 8:45
Сообщение
#19
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
StretchDraw не подойдет на сколько я понимаю....
Paintbox не имеет свойства Graphic... Paintbox1.Canvas.StretchDraw(MyRect,Paintbox1.Graphic); выдает ошибку... Может есть другие способы, или необходимо Painbox менять на что-то? И еще вопросик... Изображение получается недолговечным... перетаскиваешь какое-нибудь окно или просто сворачиваешь и нету ничего.... как сделать чтобы изображение не стиралось? Сообщение отредактировано: RussoTuristo - 7.02.2011 9:01 |
volvo |
7.02.2011 9:11
Сообщение
#20
|
Гость |
У тебя какой-то "неправильный мёд" (С)
В PaintBox-е всегда был Canvas: TPaintBox.Canvas Property А чтобы изображение было "долговечным", и его не надо было перерисовывать каждый раз по OnPaint, используй TImage, он "хранит" свое содержимое... |
Текстовая версия | 28.04.2024 23:38 |