Добрый день! Необходимо написать графический редактор следующего вида: Окно разбито на 2 части, в левой вводятся параметры фигуры, в правой она отрисовывается. Например: для начала задан прямоугольник высотой 50 и шириной 100. Указываем высоту - 25, на ней ширина 50 и фигура должна преобразоваться, приняв форму песочных часов и далее в этом духе. Надеюсь нормально объяснил...
Программу еще не начал, код писать не прошу, необходима консультация в том, какие элементы выбрать для разработки, TPaintBox или TImage и т.д. и как лучше всё это отрисовывать, может кто может дать совет?
Да, только такой, возможно надо будет сругленные углы добавить, но пока только такой вид! Может есть у кого какие соображения? Опыт подсказывает, что первое попавшееся решение потом приходится переделывать, хотелось бы узнать мнение знающих людей и приступить к работе!
То есть все инструкции определяются только двумя параметрами - высота и ширина? Ну так и храни массив пар (высота, ширина) Изначально массив состоит из 2 пар: (25, 100) и (-25, 100) Каждая команда добавляет пару к массиву. Потом отсортируй по высоте. Потом просто выведи ломаную линию (стандартная функция, передай в неё массив пар (ширина пополам плюс середина экрана, высота)), отрази её (передай пары (середина экрана минус ширина пополам, высота)). Потом нарисуй верхнюю и нижнюю грани (длину линии определи по ширине на максимальной и минимальной высоте).
Извините, придется заходить не под собой, мой профиль исчез куда-то)))) Навоял что-то, но работает оно совсем не так... Отрисовывается что-то непонятное, а из-за того, что изображение строю в буфере, отследить по шагам не удается... Может я что не так делаю? Подскажите, пожалуйста... Код:
procedure TForm1.BitBtn1Click(Sender: TObject); var i:integer; a1,a2:real; begin //ar1 и ar2-содержат точки аттриума(1-левая грань,2-правая) img.Canvas.Pen.Color:=clBlack; l:=StrtoInt(edit1.text); h:=StrtoInt(edit2.text); //Начальная фигура -прямоугольник(зададим углы) ar1[1,1]:=10; ar1[2,1]:=10; ar1[1,100]:=10; ar1[2,100]:=10+h; ar2[1,1]:=10+l; ar2[2,1]:=10; ar2[1,100]:=10+l; ar2[2,100]:=10+h; //заполним массивы точками из таблицы for i:=2 to 100 do begin if (StringGrid1.Cells[1, i]<>'') and (StringGrid1.Cells[2, i]<>'') then begin a1:=StrToInt(StringGrid1.Cells[1, i]); a2:=StrToInt(StringGrid1.Cells[2, i]); ar1[1,i]:=10+Round((h-a1)/2); ar1[2,i]:=10+a2; ar2[1,i]:=10+Round((h-a1)/2)+a1; ar2[2,i]:=10+a2; end; end; //Тут надо отсортировать массивы ar1 и ar2 по высоте
//Печать того, что получилось 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;
//Отрисовка верхней и нижней граней img.Canvas.MoveTo(10,10); img.Canvas.LineTo(10+l,10); img.Canvas.MoveTo(10,10+l); img.Canvas.LineTo(10+h,10+l); //Перевод изображения из буфера paintbox1.Canvas.CopyRect(bounds(0,0,img.Width,img.Height), img.Canvas,bounds(0,0,img.Width,img.Height)); end;
end.
Массивы ar1 и ar2 из StringGrid по-моему он не заполняет... или потом не считывает....
> 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;
Что-то до меня не доходит... В строке 0 - заголовочная часть, её пропускаем, часть StringGrida заполнена, она начинается со строки 1 и считываем для отрисовки соответственно со строки 1... Не понимаю, где ошибся. Объясните, пожалуйста, еще немного...
В одном ты берёшь 1й индекс 0 и 1 В другом ты берёшь 1й индекс 1 и 2. Структуры-то разные по сути, StringGrid и массивы ar1. ar2, если ошибаюсь и здесь ошибка - извините заранее...
А насчет индекса навёл много сомнений, только с массивами я работал не так основательно, что-то сам вникнуть не могу, по моей какой-то логике и примеру из учебника вроде так, но буду благодарен, если вы меня разубедите ...
Ничего не исчезло. Посмотри первое сообщение. Если б профиль исчез, там было бы написано, что сообщение оставил Гость. Пароль забыл, что-ли?
Есть подозрения, что меня взломали, пароль не пашет. Копировал имя из этого поста и просил отправить пароль на ящик, написано было, что такого имени нет на форуме, странно...
Чтоб много сообщений не оставлять, спрошу здесь: Все заработало как надо, отрисовывается, но появился ламерский вопрос: как имитировать нажатие кнопки BitBtn? Раньше знал, сейчас даже в drkb найти не могу...
Помогите, пожалуйста, еще с одной вещью: как правильно отсортировать двумерный массив по одному из индексов. Мне нужно расположить значения массивов ar1 и ar2 в порядке возрастания по высоте (2-й столбец). Но это оказывается непросто:
for i:=1 to 100 do for j:=1 to 100 do if ar1[2,i]<ar1[2,j] then begin buf1:=ar1[1,i]; buf2:=ar1[2,i]; ar1[1,j]:=ar1[1,i]; ar1[2,j]:=ar1[2,i]; ar1[1,i]:=buf1; ar1[2,i]:=buf2; end;
Что-то пытаюсь придумать, но чушь какая-то выходит....
Спасибо! Невнимательность моя... вроде могу сообразить принцип, а мелочи, даже очень значительные, пропускаю...
Можно узнать, а есть ли в Delphi возмоожность подогнать изображение под холст, то есть, например: на форме есть место под PaintBox размером 200 на 400 пикселей, а изображение может быть очень большим, можно ли как-нибудь "подогнать" его, чтобы оно оставшись своих размеров, отображалось в уменьшенном виде?
StretchDraw не подойдет на сколько я понимаю.... Paintbox не имеет свойства Graphic... Paintbox1.Canvas.StretchDraw(MyRect,Paintbox1.Graphic); выдает ошибку... Может есть другие способы, или необходимо Painbox менять на что-то?
И еще вопросик... Изображение получается недолговечным... перетаскиваешь какое-нибудь окно или просто сворачиваешь и нету ничего.... как сделать чтобы изображение не стиралось?