Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.12.2010, 00:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию Идиотский вопрос про TImage

Вот уже битый час не могу решить элементарнейшую вещь!
Мне надо, чтобы при ресайзе формы ресайзился и TImage на фоне. Делаю так:
Код:
procedure TfrmSolar.FormResize(Sender: TObject);
begin
  imgBack.Width := ClientWidth;
  imgBack.Height := ClientHeight;
  Gradient(imgBack);
  LinkRepaint;
end;
В итоге вроде бы меняется (это видно - градиент рисуется будто картинка больше, да и ось во второй функции рисуется в новом месте), но при этом вижу я только ту же самую часть изображения, что и до этого!
Как исправить?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #2  
Старый 13.12.2010, 00:16
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Почему-то мне кажется, что ошибка где-то в отрисовке. Что за функции Gradient и LinkRepaint?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 13.12.2010, 00:27
Аватар для MMM_Corp
MMM_Corp MMM_Corp вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 37
Репутация: 13
По умолчанию

imgBack.align:=alClient;

- так будет красивее

и еще, с рисунками не все так просто, когда надо перерисовать рисунок уничтожай TImage.Picture:=nil; и нанаво пересоздавай рисунок, это заставит полностью исключить артефакты
Ответить с цитированием
  #4  
Старый 13.12.2010, 00:34
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Артефактов и так не будет - у меня идет перерисовка всего находящегося на картинке. Gradient - отрисовка градиента на картинке, LinkRepaint - перерисовка всяких линий.
Пробовал с Alingn=alClient - то же самое... пробовал и без своих фунций перерисовки.

З.Ы. но вот пересоздавание Picture помогло, спасибо. Странно...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 13.12.2010 в 00:40.
Ответить с цитированием
  #5  
Старый 13.12.2010, 00:39
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Bargest
Gradient - отрисовка градиента на картинке, LinkRepaint - перерисовка всяких линий.
Код в студию
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 13.12.2010, 00:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если найдете способ покрасивее чем пересоздавание картинки, буду признателен:
Код:
procedure TfrmSolar.Gradient(Image: TImage);
var
  i: Integer;
  Dr, Dg, Db, Colr: Extended;

begin
  Dr := (R2 - R1) / Image.Height;
  Dg := (G2 - G1) / Image.Height;
  Db := (B2 - B1) / Image.Height;
  for i := 0 to Image.Height - 1 do
  begin
    Image.Canvas.Pen.Color := rgb(Round(R1 + i * Dr), Round(G1 + i * Dg),
      Round(B1 + i * Db));
    Image.Canvas.MoveTo(0, i);
    Image.Canvas.LineTo(Image.Width - 1, i);
  end;
end;
где R1, R2, G1, G2, B1, B2 - константы начального и конечного цвета градиента.

LinkRepaint довольно сложная, но суть та же: юзаются только MoveTo, LineTo да Polygon.
Код:
procedure TfrmSolar.LinkRepaint;
const
  d = 3;
  l = 25;
var
  i, j, t: Integer;
  cx1, cy1, cx2, cy2: Integer;
  k, dx1, dy1, dx2, dy2, g: Extended;
  Points: array [0 .. 2] of TPoint;

begin
  imgBack.Canvas.Brush.Color := rgb((R1 + R2) div 2, (G1 + G2) div 2,
    (B1 + B2) div 2);
  imgBack.Canvas.Pen.Color := $FFFFFF - imgBack.Canvas.Brush.Color;
  imgBack.Canvas.Pen.Style := psDot;
  imgBack.Canvas.MoveTo(0, imgBack.Height div 2);
  imgBack.Canvas.LineTo(imgBack.Width - 1, imgBack.Height div 2);
  imgBack.Canvas.Pen.Style := psSolid;
  imgBack.Canvas.Pen.Color := $0;
  for i := 0 to cimg - 1 do
    for j := 0 to imgs[i].cl - 1 do
    begin
      cx1 := imgs[imgs[i].links[j]].Img.Left + imgs[imgs[i].links[j]]
        .Img.Width div 2;
      cy1 := imgs[imgs[i].links[j]].Img.Top + imgs[imgs[i].links[j]]
        .Img.Height div 2;
      cx2 := imgs[i].Img.Left + imgs[i].Img.Width div 2;
      cy2 := imgs[i].Img.Top + imgs[i].Img.Height div 2;
      if Max(cx1, cx2) = cx1 then
      begin
        t := cx2;
        cx2 := cx1;
        cx1 := t;

        t := cy1;
        cy1 := cy2;
        cy2 := t;
      end;
      imgBack.Canvas.MoveTo(cx1, cy1);
      imgBack.Canvas.LineTo(cx2, cy2);
      dx1 := 0;
      dy1 := 0;
      dx2 := 0;
      dy2 := 0;
      if abs(cx2 - cx1) > 5 then
      begin
        k := (cy2 - cy1) / (cx2 - cx1);
        g := arctan(d / l) + arctan(k);
        dx1 := sqrt(l * l + d * d) * cos(g);
        dy1 := sqrt(l * l + d * d) * sin(g);
        g := arctan(k) - arctan(d / l);
        dx2 := sqrt(l * l + d * d) * cos(g);
        dy2 := sqrt(l * l + d * d) * sin(g);
      end;
      Points[0].X := cx2;
      Points[0].Y := cy2;
      Points[1].X := cx2 - Round(dx1);
      Points[1].Y := cy2 - Round(dy1);
      Points[2].X := cx2 - Round(dx2);
      Points[2].Y := cy2 - Round(dy2);
      imgBack.Canvas.Brush.Color := 0;
      imgBack.Canvas.Polygon(Points);
    end;
end;
Лучше не вникать, это лишь отрисовка стрелочек между объектами.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 13.12.2010, 00:45
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А кто же, блин, будет менять размеры самого изображения? Image.Canvas, Image.Bitmap, Image.Picture.Bitmap или Image.Picture, уже не помню, но у одного из них надо изменить Height и Width.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #8  
Старый 13.12.2010, 00:47
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Width и Height есть только у самого имажа и у Picture, но у Picture они Read-only...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 13.12.2010, 00:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

О нашел! у Picture.Grafics. Спасибо большое!
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 13.12.2010, 01:30
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Цитата:
for i := 0 to Image.Height - 1 do
Лучше так не делать. Размеры TImage могут отличаться от размеров TBitmap в нем. С Canvas'ом может, и пронесет, но при прямом доступе к памяти(через Scanline) может вылезти Access violation (уже встречался с этим)
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #11  
Старый 13.12.2010, 10:52
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию Hfpvths TImage

>Размеры TImage могут отличаться от размеров TBitmap
Точнее так. В самом начале Image.Picture = nil.
Когда вы в первый раз обращаетесь к Image.Canvas, создаётся Bitmap с размерами, равными размеру Image. Если размеры не менять, то всё работает и у пользователя создаётся впечатление, что что Image - единый объект. Но вот когда размер меняется, то вылезает различие между TImage и TImage.Picture.
Ответить с цитированием
  #12  
Старый 13.12.2010, 17:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Спасибо за объяснения.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter