Перейти к содержанию
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 эмодзи.

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

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

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

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