Графический редактор в Delphi |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Графический редактор в Delphi |
RussoTuristo |
7.02.2011 9:26
Сообщение
#21
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Извините за Canvas, действительно пропустил, но Paintbox1.Canvas.Graphic тоже не работает....
То есть чтобы оно "хранилось" вместо Paintbox необходимо использовать Image? Еще раз извините за глупый вопрос, просто не хочется из-за недопонимания переписывать всё... |
volvo |
7.02.2011 9:49
Сообщение
#22
|
Гость |
TPaintBox так устроен, что не хранит изображение, которое в нем нарисовано. Ему просто негде его хранить. Это обычная канва. Чем-то напоминает "узоры на песке", их тоже видно, пока ветер не подует или пока дождь не пойдет. Пока твое окно не перекрыто другими окнами - все видно. Как только окно перекроется - все, что было тобой нарисовано в PaintBox-е сотрется. Чтобы восстановить изображение, тебе придется перерисовать его. Поэтому заполняют TPaintBox обычно в событии OnPaint, то есть, полностью перерисовывают содержимое каждый раз, когда приходит сообщение WM_PAINT.
TImage снимает с тебя заботу о перерисовке своего содержимого. Допустим, по нажатию TButton ты нарисовал линию, свернул программу на таскбар, развернул - линия ровно в том же месте, где и была. PaintBox в аналогичном случае будет пуст. |
RussoTuristo |
7.02.2011 9:56
Сообщение
#23
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Спасибо за разъяснение, запомню и переделаю, в принципе не так много работы прибавится.
|
TarasBer |
7.02.2011 10:29
Сообщение
#24
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Извините за Canvas, действительно пропустил, но Paintbox1.Canvas.Graphic тоже не работает....
Просто Canvas, блин, без .Graphic! -------------------- |
RussoTuristo |
7.02.2011 16:37
Сообщение
#25
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Вместо Paintbox взял Image, всё отрисовывается хорошо, не исчезает никуда, но StretchDraw упрямится - ошибок не выдает но и не сжимает ничего, когда изображение больше, чем Image, видна лишь часть изображения...
MyRect := Rect(0,0,250,450); Может я что-то опять напутал? и еще вопросик: Изображение не пропадает, но не делает это вообще: Пишу в событии кнопки первой строкой Img.free и выдает ужасную ошибку: Invalide Pointer operation Сообщение отредактировано: RussoTuristo - 7.02.2011 16:43 |
TarasBer |
7.02.2011 16:57
Сообщение
#26
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
А ты задай MyRect побольше (или поменьше) раз в 10, узнаешь, напутал, или нет. А лучше задавай MyRect в зависимости от максимального и минимального из вводимых значений.
-------------------- |
RussoTuristo |
7.02.2011 17:19
Сообщение
#27
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Действительно, ошибок не выдает, но это не значит, что работает... думаю я не в том месте его указываю(хотя пробовал в разных) или аргументы не те, посмотрите, пожалуйста, может какие замечания будут по стилю или применению функций, новичок в этом деле, готов учиться на своих ошибках...
procedure TForm1.BitBtn1Click(Sender: TObject); Без StretchDraw никак, а он не пашет... |
TarasBer |
7.02.2011 17:46
Сообщение
#28
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Кто так сортировку пишет? У тебя она неправильно сортирует вообще.
Видимо, ты откуда-то переписал, причём очень небрежно и не глядя, что там происходит. for i:=1 to 100 do for j:=i+1 to 100 do Дальше, а с чего StretchBlt будет работать, если у тебя и буфер, и область вывода, и прямоугольник, который ты выводишь - одного размера? Чему там и куда сжиматься? И зачем ты копируешь из себя в себя? > Image1.Canvas.StretchDraw(MyRect, Image1.Picture.Graphic); Ты сам понимаешь, что ты написал? Почему так нельзя? MyRect := Rect(0,0,Image1.ClientWidth,Image1.ClientHeight); Image1.Canvas.StretchDraw(MyRect, img); Почему фигура у тебя выводится от 10, если должна рисоваться от середины буфера (от img.Width div 2)? ar1[1,1]:=img.Width div 2; и так далее надо -------------------- |
RussoTuristo |
7.02.2011 18:00
Сообщение
#29
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Насчет изображения понял... Почему-то такие глобальные ошибки сам не замечаешь, путаясь в мелочах, я рисовал от кромки, а чтобы она не была вплотную, сделал отступ в 10 пикселей, переделаю, чтобы всё от середины плясало, поэтому в принципе и сжать-то невозможно было... Спасибо огромное, переделаю, напишу.
А по поводу цикла - это эксперимент был и он удался, если сделать как ты говоришь, то появляются какие-то левые 2 линии по бокам, даже не знаю откуда, но тоже попробую привести к человеческому виду. Еще раз спасибо, будем работать! |
RussoTuristo |
8.02.2011 8:54
Сообщение
#30
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Помогите, пожалуйста, с удалением изображения, Img.Destroy напрочь отказывается работать, всё та же ошибка - Invalid Pointer Operation. По идее Create - Destroy, но что-то не так тут...
|
TarasBer |
8.02.2011 10:27
Сообщение
#31
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Create-Free, а не Create-Destroy.
Опять невнимательность! -------------------- |
RussoTuristo |
8.02.2011 10:51
Сообщение
#32
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Free тоже самое выдает, я пробовал....
|
TarasBer |
8.02.2011 11:13
Сообщение
#33
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Покажи, как ты этот Free вызываешь?
-------------------- |
RussoTuristo |
8.02.2011 11:32
Сообщение
#34
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
img.free; первым делом при нажатии кнопки...
Пробовал одновременно с этим буфер очищать, но тогда вообще ошибка сразу с нулями вылетает. |
TarasBer |
8.02.2011 11:38
Сообщение
#35
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ты создаёшь img при создании формы, а уничтожаешь при нажатии кнопки.
Где логика. В OnDestroy деструкторы перенеси. -------------------- |
RussoTuristo |
9.02.2011 10:06
Сообщение
#36
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Форма-то заново не создается и не уничтожается, деструкторы походу оттуда не работают, поэтому и помещал их в кнопку, т.к. в момент нажатия они должны уничтожаться:
procedure TForm1.FormDestroy(Sender: TObject); Без ошибок и без результатов. и вопросик по поводу StretchDraw: Моя логика, решил не строить от середины, почему-то не удобно: Создаем в памяти изображение нужной ширины+50, и высоты+50: // 50 отведено на небольшие подписи img.Width:=l+50; Рисуем на нём всё, что нужно Создаем область необходимого размера(место, выделенное под фигуру на форме): MyRect := Rect(0,0,250,450); Вставляем в Image1 наше изображение, сжатое/растянутое до размеров этой области: Image1.Canvas.StretchDraw(MyRect, Image1.Picture.Graphic); По моей логике все нормально, но чувствую она далека от идеала.... Подскажите, пожалуйста, что делаю не так? Сообщение отредактировано: RussoTuristo - 9.02.2011 10:54 |
TarasBer |
9.02.2011 11:02
Сообщение
#37
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Без ошибок и без результатов.
Какой результат тебе нужен? Создаются они у тебя при создании формы, то есть 1 раз. Значит, и удалять их надо 1 раз. То есть при уничтожении формы. > Подскажите, пожалуйста, что делаю не так? Ты всё делаешь не так. > Image1.Canvas.StretchDraw(MyRect, Image1.Picture.Graphic); Покажи мне в этой строчке слово img или buffer. > Image1.Canvas.CopyRect(bounds(0,0,img.Width,img.Height), img.Canvas,bounds(0,0,img.Width,img.Height)); Это что, это зачем? Зачем копировать ещё раз? Ты сначала зачем-то вывел содержимое Image1 на себя со сжатием, а потом без сжатия туда же скопировал буфер. Я же тебе сказал, как правильно выводить. А ты забил и сделал свою хрень неправильно. У тебя полное непонимание того, что ты делаешь. -------------------- |
RussoTuristo |
11.02.2011 11:37
Сообщение
#38
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Цитата Какой результат тебе нужен? Чтобы при нажатии кнопки BitBtn1 старое изображение уничтожалось, а не при уничтожении формы Цитата Я же тебе сказал, как правильно выводить. А ты забил и сделал свою хрень неправильно. > Image1.Canvas.StretchDraw(MyRect, Image1.Picture.Graphic); Покажи мне в этой строчке слово img или buffer. Stretchdraw ожидает в качестве параметра тип .Graphic, img.Canvas такого свойства не имеет, поэтому как туда вставить его я не знаю... в этом и проблема основная. Вообще уже не знаю что делать, весь мозг сломал, помогите, пожалуйста, переделать. |
TarasBer |
11.02.2011 11:44
Сообщение
#39
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Чтобы при нажатии кнопки BitBtn1 старое изображение уничтожалось, а не при уничтожении формы
Хорошо. А создавать новое изображение тогда надо когда? > Stretchdraw ожидает в качестве параметра тип .Graphic, img.Canvas такого свойства не имеет Тебе нужен тип или свойство? Я же тебе написал, как надо использовать StretchDraw! Ищи сам в этой теме. -------------------- |
RussoTuristo |
11.02.2011 11:50
Сообщение
#40
|
Пионер Группа: Пользователи Сообщений: 80 Пол: Мужской Репутация: 0 |
Цитата Image1.Canvas.StretchDraw(MyRect, Img); Я так понимаю, речь идёт об этой строке, но изображение всё равно не сжимается, а часть его остается где-то за пределами.... Цитата Хорошо. А создавать новое изображение тогда надо когда? При нажатии кнопки первым делом удаляем старое, и строим новое. Делаю так, потому что форма не уничтожается в процессе работы. Сообщение отредактировано: RussoTuristo - 11.02.2011 11:52 |
Текстовая версия | 29.04.2024 8:43 |