Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проблема с прорисовкой несколько Image


Рагим

Вопрос

Добрый день.

 

Столкнулся с проблемой. Приложение изначально писал на XE6, потом перенес на XE7 - все работало без проблем. Обновился до XE8 и код перестал работать. Причем никаких ошибок не выкидывает. Просто зависает не отрабатывает процедура. Прошу не бить ногами за дилетантский код. Главное до этого нормально работал. Суть такая: есть два приложения под Андроид. Связаны между собой по сети. Назовем их сервер и клиент (вернее 4 клиента). Одно из них посылает сообщение на другой и при получении сообщения должна отрабатывать эта процедура. Взависимости от того кто и когда послал сообщение, появляются разные картинки. 

 

procedure TForm1.ShowPlus(a,b:byte);
//a - Номер строки
//b - Цвет команды
begin
 but[a]:=b;
 case a of
  1: begin
      case b of
       1: begin
           form1.PlusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bplus.png');
           form1.MinusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bminus.png');
          end;


       2: begin
           form1.PlusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yplus.png');
           form1.MinusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yminus.png');
          end;


       3: begin
           form1.PlusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gplus.png');
           form1.MinusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gminus.png');
          end;


       4: begin
           form1.PlusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rplus.png');
           form1.MinusImage1.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rminus.png');
          end;
      end;


     end;


  2: begin
      case b of
       1: begin
           form1.PlusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bplus.png');
           form1.MinusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bminus.png');
          end;


       2: begin
           form1.PlusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yplus.png');
           form1.MinusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yminus.png');
          end;


       3: begin
           form1.PlusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gplus.png');
           form1.MinusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gminus.png');
          end;


       4: begin
           form1.PlusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rplus.png');
           form1.MinusImage2.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rminus.png');
          end;
      end;


     end;


  3: begin
      case b of
       1: begin
           form1.PlusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bplus.png');
           form1.MinusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bminus.png');
          end;


       2: begin
           form1.PlusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yplus.png');
           form1.MinusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yminus.png');
          end;


       3: begin
           form1.PlusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gplus.png');
           form1.MinusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gminus.png');
          end;


       4: begin
           form1.PlusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rplus.png');
           form1.MinusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rminus.png');
          end;
      end;


     end;


  4: begin
      case b of
       1: begin
           form1.PlusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bplus.png');
           form1.MinusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'bminus.png');
          end;


       2: begin
           form1.PlusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yplus.png');
           form1.MinusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'yminus.png');
          end;


       3: begin
           form1.PlusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gplus.png');
           form1.MinusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'gminus.png');
          end;


       4: begin
           form1.PlusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rplus.png');
           form1.MinusImage4.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rminus.png');
          end;
      end;
     end;
 end;
end;

 

Буду рад любой помощи в исправлении ошибок или оптимизации кода.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

первое что пришло в голову, проверить есть ли эти картинки на местах

 

ну и вот так я бы примерно написал

procedure TForm1.ShowPlus(a, b: byte);
// a - Номер строки
// b - Цвет команды
const
  cPlusName: array [1 .. 4] of string = ('bplus.png', 'yplus.png', 'gplus.png', 'rplus.png');
  cMinusName: array [1 .. 4] of string = ('bminus.png', 'yminus.png', 'gminus.png', 'rminus.png');
var
  sPlusName: string;
  sMinusName: string;

  iPlusImg: TImage;
  iMinusImg: TImage;
begin
  sPlusName := TPath.GetDocumentsPath + PathDelim + cPlusName[b];
  sMinusName := TPath.GetDocumentsPath + PathDelim + cMinusName[b];
  case a of
    1:
      begin
        iPlusImg := form1.PlusImage1;
        iMinusImg := form1.MinusImage1;
      end;
    2:
      begin
        iPlusImg := form1.PlusImage2;
        iMinusImg := form1.MinusImage2;
      end;
    3:
      begin
        iPlusImg := form1.PlusImage3;
        iMinusImg := form1.MinusImage3;
      end;
    4:
      begin
        iPlusImg := form1.PlusImage4;
        iMinusImg := form1.MinusImage4;
      end;
  end;
  iPlusImg.Bitmap.LoadFromFile(sPlusName);
  iMinusImg.Bitmap.LoadFromFile(sMinusName);
end;

писал на форуме, так что подправите если будут ошибки

Ссылка на комментарий
  • 0

первое что пришло в голову, проверить есть ли эти картинки на местах

 

ну и вот так я бы примерно написал

procedure TForm1.ShowPlus(a, b: byte);
// a - Номер строки
// b - Цвет команды
const
  cPlusName: array [1 .. 4] of string = ('bplus.png', 'yplus.png', 'gplus.png', 'rplus.png');
  cMinusName: array [1 .. 4] of string = ('bminus.png', 'yminus.png', 'gminus.png', 'rminus.png');
var
  sPlusName: string;
  sMinusName: string;

  iPlusImg: TImage;
  iMinusImg: TImage;
begin
  sPlusName := TPath.GetDocumentsPath + PathDelim + cPlusName[b];
  sMinusName := TPath.GetDocumentsPath + PathDelim + cMinusName[b];
  case a of
    1:
      begin
        iPlusImg := form1.PlusImage1;
        iMinusImg := form1.MinusImage1;
      end;
    2:
      begin
        iPlusImg := form1.PlusImage2;
        iMinusImg := form1.MinusImage2;
      end;
    3:
      begin
        iPlusImg := form1.PlusImage3;
        iMinusImg := form1.MinusImage3;
      end;
    4:
      begin
        iPlusImg := form1.PlusImage4;
        iMinusImg := form1.MinusImage4;
      end;
  end;
  iPlusImg.Bitmap.LoadFromFile(sPlusName);
  iMinusImg.Bitmap.LoadFromFile(sMinusName);
end;

писал на форуме, так что подправите если будут ошибки

Не помогло. Все равно изображения не отображаются. Свойство Visible у них равно false, т.е. сначала загружаю файлы с изображением, а затем только показываю. Попробовал отображать перед загрузкой - отображается первая пара, от второй пары отображается только кнопка минус и то не с загруженным в рантайм изображением, а с тем что я загрузил в дизайне.

Ссылка на комментарий
  • 0

Проблема с прорисовкой в Image так и не решил. Сделал по-другому. Загрузиk все изображения в TImageList и стал оттуда подгужать в TGlyph. Проблема устранена. Проблему устранил, но точно не знаю почему не работало. Возможно потому что одновременно с прорисовкой еще идет отправка/получение сообщений на другие устройства и прорисовка происходит не в основном потоке. Поблуждав по просторам форума понял что у Image такое иногда бывает (проблемы с прорисовкой не в основном потоке).

Ссылка на комментарий
  • 0

смотрите внимательно значит свой код, что вы передаёте в метод ShowPlus

передаются два параметра: каждый это целое число от 1 до 4. С этим проблемы нет. Раньше ведь все работало.

Ссылка на комментарий
  • 0

Вот рабочий вариант. 


procedure TForm1.ShowPlus(a, b: byte);
// a - Номер строки
// b - Цвет команды
begin
 case a of
  1: begin
      form1.PlusGlyph1.ImageIndex:=b-1;
      form1.MinusGlyph1.ImageIndex:=b+3;
     end;
 
  2: begin
      form1.PlusGlyph2.ImageIndex:=b-1;
      form1.MinusGlyph2.ImageIndex:=b+3;
     end;
 
  3: begin
      form1.PlusGlyph3.ImageIndex:=b-1;
      form1.MinusGlyph3.ImageIndex:=b+3;
     end;
 
  4: begin
      form1.PlusGlyph4.ImageIndex:=b-1;
      form1.MinusGlyph4.ImageIndex:=b+3;
     end;
 end;
end;
Изменено пользователем Рагим
Ссылка на комментарий
  • 0
прорисовка происходит не в основном потоке

 

 

в этом проблема. что бы все прорисовывалось надо вызывать синхронизацию либо оборачивать выполнение загрузки в 

 

     TThread.Synchronize(TThread.CurrentThread, procedure()
     begin
           form1.PlusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rplus.png');

           form1.MinusImage3.Bitmap.LoadFromFile(System.IOUtils.TPath.GetDocumentsPath + PathDelim+'rminus.png');

    end;
Ссылка на комментарий
  • 0

Личное мнение, не претендующее на истину:

 

Обращение к визуальному компоненту из потока - сразу не лучший выбор, можно синхронизировать или лочить, все равно будет громоздко и ненадежно.

Если рисование занимает много времени - надо оптимизировать рисование, а не выносить в поток, ресурсы будут заняты в любом случае плюс время на синхронизацию.

Поток не дает выигрыша в производительности, скорее наоборот.

Потоки хороши при ожиданиях ввода вывода, или при диких расчетах чтобы пользователь не видел эффекта зависания.

Загрузка из файла занимает не больше нескольких мсек., если это долго, то что мешает загрузить четыре png сразу при запуске.

Отрисовка займет микросекунды - ради этого воротить срэды?

Изменено пользователем Камышев Александр
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...