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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2011, 04:24   #1
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию массив TImage в потоке

собственно вот в чем мой вопрос:
есть поток, который создает массив TImage на ScrollBox'е основной формы
поток работает, параметры в него заходят, все вроде бы хорошо, но на ScrollBox ничего не отображается.
Подскажите, в чем моя ошибка?

модуль потока:
Код:
type
  TInParams = record
    Paths : TStrings;
    ScrBox : TScrollBox;
  end;

  TImages = Array of TImage;

  TImgThread = class(TThread)
  private
    Paths : TStrings;
    ScrBox : TScrollBox;
    imgs : TImages;
  public
    constructor Create(params : TInParams);
    procedure Execute; override;
  end;

implementation

constructor TImgThread.Create(params : TInParams);
begin
  inherited Create(false);
  Paths := params.Paths;
  ScrBox := params.ScrBox;
end;

procedure TImgThread.Execute;
  var
    i : integer;
begin
    SetLength(imgs, Paths.Count);
    SetLength(lbls, Paths.Count);
    for i := 0 to Paths.Count-1 do
    begin
      imgs[i] := TImage.Create(ScrBox);
      imgs[i].Parent := ScrBox ;
      imgs[i].Picture.LoadFromFile(Paths.Strings[i]);
    end;
end;
и как я его вызываю:
Код:
procedure TForm1.Button1Click(Sender: TObject);
  var
    thr : TImgThread;
    params : TInParams;
begin
    params.Paths := Memo1.Lines;
    params.ScrBox := Form1.ScrollBox1;
    thr := TImgThread.Create(params);
end;

Последний раз редактировалось Bayazet; 03.12.2011 в 04:31.
Bayazet вне форума Ответить с цитированием
Старый 03.12.2011, 04:32   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)такое в поток выносить нет смысла.
2)в потоке нарушено правило VCL.(читаем комментарий в пустом модуле потока)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2011, 04:37   #3
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

1) смысл есть. я не стал нагружать вопрос всеми нюансами задачи. если в кратце, то это будет некий просмотрщик картинок, находящихся в папке. кликаем на первую папку, запускается поток, начинает отрисовывать все картинки, которые в этой папке. кликаем на другую папку, поток прерывается и начинается отрисовка картинок из другой папки.
2) не очень понял, что где читать?
Bayazet вне форума Ответить с цитированием
Старый 03.12.2011, 04:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
начинает отрисовывать все картинки
нет не начинает.
рисует основной поток, грузит то этот.
НО надо тогда сначало грузить картинку, а лишь потом ставить родителя.
кстати, а ошибка в том что не задаете размеры и координаты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2011, 05:02   #5
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

да. что-то я забыл про это. в смысле, когда вопрос публиковал. размеры и координаты я задаю. вот так:
Код:
procedure TImgThread.Execute;
  var
    i : integer;
begin
    SetLength(imgs, Paths.Count);
    for i := 0 to Paths.Count-1 do
    begin
      imgs[i] := TImage.Create(ScrBox);
      imgs[i].Parent := ScrBox;
      imgs[i].Stretch := true;
      imgs[i].Proportional := false;
      imgs[i].Width := ImgWidth;
      imgs[i].Height := ImgHeight;
      imgs[i].AutoSize := false;
      imgs[i].Left := (i mod (ScrBox.Width div ImgWidth))*(ImgWidth + 10);
      imgs[i].Top := (i div (ScrBox.Width div ImgWidth))*(ImgHeight + 20);
      imgs[i].Picture.LoadFromFile(Paths.Strings[i]);
  end;
end;
так много шелухи в позиционировании TImage чтобы они по ScrollBox'у распределялись в виде таблицы

ЗЫ: даже если Parent в самом конце метода устанавливать, все равно не рисуется

Последний раз редактировалось Bayazet; 03.12.2011 в 05:05.
Bayazet вне форума Ответить с цитированием
Старый 03.12.2011, 09:14   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Эх, молодежь....
Код:
procedure TImgThread.DrawImg;
var
  i: integer;
begin
    SetLength(imgs, Paths.Count);
    for i := 0 to Paths.Count-1 do
    begin
      imgs[i] := TImage.Create(ScrBox);
      imgs[i].Parent := ScrBox;
      imgs[i].Stretch := true;
      imgs[i].Proportional := false;
      imgs[i].Width := ImgWidth;
      imgs[i].Height := ImgHeight;
      imgs[i].AutoSize := false;
      imgs[i].Left := (i mod (ScrBox.Width div ImgWidth))*(ImgWidth + 10);
      imgs[i].Top := (i div (ScrBox.Width div ImgWidth))*(ImgHeight + 20);
      imgs[i].Picture.LoadFromFile(Paths.Strings[i]);
  end;
end;

procedure TImgThread.Execute;
begin
  Synchronize(DrawImg);
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.12.2011, 12:05   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
procedure TImgThread.Execute;
begin
  Synchronize(DrawImg);
end;
этот набор операторов можно упростить:

Код:
DrawImg();
заодно избавившись от потока. Пользы будет в 5 раз больше.

Bayazet, не получится у вас рисовать не в главном потоке. Загрузить что-то, возможно, получится (не факт), рисовать — нет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 03.12.2011, 12:52   #8
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

3D Hunter, все так же не рисует
как понимаю, других вариантов, кроме как потоком просто рисовать на канве основной формы каждую картинку, нет? не получится загрузить массив TImage
Bayazet вне форума Ответить с цитированием
Старый 06.12.2011, 11:00   #9
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

решение проблемы вот:
в цикле создаем TImage: imgs[i] := TImage.Create(nil);
а уже после всех настроек оного имаджа, загрузки в него картинки, вызываем метод
Synchronize(PostImg);
где
Код:
procedure TImgThread.PostImgLbl;
begin
  b_img.Parent := ScrBox;
end;
Bayazet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив изображений TImage BigDa Помощь студентам 6 26.11.2011 08:46
Массив Timage Алекссс Мультимедиа в Delphi 2 07.11.2011 09:52
Запуск программы, помещённой в массив байт, в отдельном потоке RKT878 Общие вопросы Delphi 1 25.09.2011 22:12
Delphi. Массив TImage Sna1L Помощь студентам 3 23.06.2011 16:10
2хм. массив из TImage Viteef Общие вопросы Delphi 10 08.02.2010 21:14