Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный баг с HEX в D2010 
:(
    Опции темы
mariomario
Дата 10.4.2019, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.2.2019

Репутация: нет
Всего: нет



Всем привет. Уже часа 3 копаюсь и не могу понять в чем глюк.
Есть проект. Получаю фото из веб и отображаю на форме.
Делаю проверку какой тип изображения получил перед отображением.
Код

procedure TForm1.ImageFromStream(Stream: TStream; Image: TImage);
var
FirstBytes: AnsiString;
Graphic: TGraphic;
begin
  Graphic         := nil;
  Stream.Position := 0;
  SetLength(FirstBytes, 8);
  Stream.Read(FirstBytes[1], 8);
  if Copy(FirstBytes, 1, 2) = 'BM' then
  begin
    Graphic := TBitmap.Create;
  end else
  if FirstBytes = #137'PNG'#13#10#26#10 then
  begin
    Graphic := TPngImage.Create;
  end else
  if Copy(FirstBytes, 1, 3) =  'GIF' then
  begin
    Graphic := TGIFImage.Create;
  end else
  if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
  begin
    Graphic := TJPEGImage.Create;
  end;
  // и так далее, далее уже не важно


Код рабочий. Но если я сделаю Shift + F9 (Билд проекта), то начинаются глюки, а именно: значение #$FF#$D8 перестает восприниматься правильно и в итоге Graphic так и остается nil. 
Решил проверить. Делаю Shift + F9, запускаю:
Код

//ansis: AnsiString;
//ac1, ac2: ansichar;
//FirstBytes = #$FF#$D8#$FF#$E0#$00#$10'JF';
  ansis := AnsiString(#$FF#$D8); // 'yO'
  ac1   := AnsiChar(#$FF); // 'y'
  ac2   := AnsiChar(#$D8); // 'O'
  ansis := ac1 + ac2; // 'yO'
  ansis := AnsiString(#250#251#252#253#254#255); // 'uuuy?y'
  ansis := AnsiString(#48#49#50#51#52#53#54#55#56#57#58); // '0123456789:'


Делаю компиляцию F9(и все норм работает):
Код

//ansis: AnsiString;
//ac1, ac2: ansichar;
//FirstBytes = #$FF#$D8#$FF#$E0#$00#$10'JF'; 
  ansis := AnsiString(#$FF#$D8); // = 'яШ'
  ac1   := AnsiChar(#$FF); // = 'я'
  ac2   := AnsiChar(#$D8); // = 'Ш'
  ansis := ac1 + ac2; // = 'яШ'
  ansis := AnsiString(#250#251#252#253#254#255); // 'ъыьэюя'
  ansis := AnsiString(#48#49#50#51#52#53#54#55#56#57#58); // '0123456789:'



WTF?  Что-то с кодировкой?
upd: заметил, что если подобные конструкции а разных юнитах используются, то чтоб и там работало, их тоже нужно компилить заного

upd2: в общем, чтоб не париться, нужно использовать коды от 0 до 127, т.е. #00...#7F

Это сообщение отредактировал(а) mariomario - 10.4.2019, 19:13
PM MAIL   Вверх
kami
Дата 17.4.2019, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Если в D2010 есть TEncoding, то можно так:
Код

ansis:=TEncoding.ANSI.GetString([$FF,$D8]);

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1147 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.