Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2013, 08:50   #1
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию Рисование на динамически созданном TImage

Задача.
Динамически создать в области экземпляра TScrollBox массив записей пар экземпляров TImage. Экземпляры Timage в записи должны иметь одни и те же координаты и размеры, то есть располагаться в два слоя. На каждом имидже предполагается отображать данные из массивов.

Вот действия, которые выполнены с целью достижения поставленной задачи:
Код:
type
  TImageRecord = record
    LowerImg,UpperImg:TImage;
    end;
  TImgArray = array of TImageRecord;

var ImgArr:TImgArray;

function CreateImages(TopImg,FLeftImg,WidthImg,HeightImg,CountPics:Integer;
                      ScrlBx:TScrollBox):TImgArray;
var
ImgArr:TImgArray;
i,j,LeftImg:Integer;
begin
SetLength(ImgArr,CountPics);
for i:=0 to CountPics-1 do
  begin
  LeftImg:=FLeftImg+i*(WidthImg);
  with ImgArr[i] do
    begin
    LowerImg:=TImage.Create(ScrlBx);
    UpperImg:=TImage.Create(ScrlBx);
    LowerImg.Parent:=ScrlBx;
    UpperImg.Parent:=ScrlBx;
    LowerImg.SetBounds(LeftImg,TopImg,WidthImg,HeightImg);
    UpperImg.SetBounds(LeftImg,TopImg,WidthImg,HeightImg);
    UpperImg.Canvas.FillRect(UpperImg.Canvas.ClipRect);//верхний 
    UpperImg.Transparent:=True;//слой делаю прозрачным
    end;
  end;
end;

procedure FreeImages(ImgArr:TImgArray);
var
i:Integer;
begin
for i:=0 to Length(ImgArr)-1 do
with ImgArr[i] do
  begin
  LowerImg.Free;
  UpperImg.Free;
  end;
ImgArr:=Nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
T,FL,W,H,Co:Integer;
begin
T:=0;
FL:=0;
W:=ScrollBox1.Width div 2 *3;
H:=ScrollBox1.Height*2;
Co:=2;
ImgArr:=CreateImages(T,FL,W,H,Co,ScrollBox1);
//ImgArr[0].LowerImg.Canvas.Pixels[1,1]:=clBlack;//в процессе
//редактирования кода доступа к методам Tcanvas не имею. 
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeImages(ImgArr);
end;
Проблема.
Нет доступа к методам Tcanvas динамически созданных экземпляров Timage. Для пробы попытался закрасить пиксель на канве нижнего имиджа в 0-й записи, но произошла ошибка Access Violation
В чём моя ошибка и каковы пути решения? Прошу помощи у опытных программистов и благодарю всех, кто откликнется

Последний раз редактировалось Sёker; 14.07.2013 в 09:07.
Sёker вне форума Ответить с цитированием
Старый 14.07.2013, 10:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Раскоментируй сбойную строку, поставь на нее точку прерывания, и когда прога на ней брякнется наведи мышку на ImgArr[0], потом на LowerImg - посмотри не равны ли они nil
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2013, 10:41   #3
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Раскоментируй сбойную строку, поставь на нее точку прерывания, и когда прога на ней брякнется наведи мышку на ImgArr[0], потом на LowerImg - посмотри не равны ли они nil
ImgArr = nil, LowerImg = InaccessibleValue. Но имиджи на скроллбаре появляются. Видно по бегункам
Sёker вне форума Ответить с цитированием
Старый 14.07.2013, 11:17   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте задать явно ширину и высоту через свойства.
иначе пробовать создавать битмапы разве что для имгов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2013, 12:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ImgArr = nil
Ну вот. А проблема то видимо в том что CreateImages у тебя ничего не возвращает
Result:=... в ней я не вижу.
Цитата:
Но имиджи на скроллбаре появляются.
Понятное дело, они созданы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2013, 13:27   #6
Sёker
Пользователь
 
Регистрация: 30.09.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вот. А проблема то видимо в том что CreateImages у тебя ничего не возвращает
Result:=... в ней я не вижу.

Понятное дело, они созданы.
Точно же! Какая нелепая ошибка. Спасибо огромное за подсказку. В следующий раз постараюсь быть внимательнее, чтобы не засорять форум)
Sёker вне форума Ответить с цитированием
Старый 14.07.2013, 13:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
нелепая ошибка
Бывает по запарке )
Я в таких случаю люблю повторять о насущности дружбы с отладчиком...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование на TImage nanom1t C++ Builder 1 22.04.2013 18:59
Рисование поверх TImage mrbadge Мультимедиа в Delphi 4 31.03.2012 08:19
Рисование Delphi 7 на Timage Dalagardi Помощь студентам 4 24.04.2010 16:17
рисование в TImage Rusl92 Общие вопросы Delphi 8 02.05.2008 20:23
События в динамически созданном компоненте Biowulf86 Общие вопросы Delphi 2 17.09.2007 12:44