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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2010, 12:21   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию как правельно обработать полученное изображение через HHTP?

привет всем!
Возникла проблема.. вот в чем задумка:
програма при запуске, отдельным потоком скачивает картинку по указанному полному http:// адресу.
Сохраняет в папку временных файлов. и загружает в TImage...
при закрытии программы изображение удаляется из Temp-папки.

но вот проблема с реализацией.. реализовать то я реализовал а правельно ли? Может есть другой вариант?

вот код потока:
Код:
function TGetImgThread.FNameFromURL(const AUrl: string): string; //вытаскиваем имя изображения из ссыкиизвлекаем имя файла и расширение из ссылки
var
  i: Integer;
begin
  i := LastDelimiter('/', AUrl);
  Result := Copy(AUrl, i + 1, Length(AUrl) - (i));
end;

function TGetImgThread.GetImgName: string;
begin
  Result := MainForm.GetTemp + FNameFromURL(MainForm.LogoEdit.Text); //получаем путь к временной папке и приписываем имя файла, потлучаем локальный путь до файла
end;

procedure TGetImgThread.Execute;
var
  http: TIdHTTP;
  FM: TMemoryStream;
begin
  Http := TIdHTTP.Create(nil);
  FM := TMemoryStream.Create;
  try
    Http.Get(MainForm.LogoEdit.Text, FM); //LogoEdit это TEdit в котором ссылка на файл. вот тут возникает ошибка и выскакивает исключение после except
    FM.SaveToFile(GetImgName); //записываем картинку из потока в файл
  except
    MainForm.Log.Items.Add('[Ошибка]Неудалось загрузить Лого-изображение.');
    Exit;
  end;
  if FileExists(GetImgName) then //проверяем если изображение существует то..
  begin
    Synchronize(LoadImg); //синхринизируем.. загружаем в Timage (эх как жаль что все так сложно=))
  end
  else //иначе возбуждаем исключение
    MainForm.Log.Items.Add('[Ошибка]Возможно лого-изображение повреждено при загрузке.');
  Http.Free;
  FM.Free;
end;

procedure TGetImgThread.LoadImg;
begin
  try
    MainForm.HosterLogo.Picture.LoadFromFile(GetImgName); //загружаем изображение
    MainForm.HosterLogo.Repaint;  //перерисовываем его, при скинировании изображение не показывается=( поэтому вот так
  except
    MainForm.Log.Items.Add('[Ошибка]Возможно лого-изображение повреждено.');
    exit;
  end;
end;
Может тут где-то ошибка? Может есть другой вариант реализации?
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2010, 12:55   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Может тут где-то ошибка?
работает?делает то что надо?
если да значит нет ошибки.
Цитата:
Может есть другой вариант реализации?
есть и не мало
(но вам они не к чему, сейчас)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.06.2010, 13:27   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

---Delete this---
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2010, 13:27   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Весь прикол в том что на локальном сервере (AppServ) все как часы..

но если ссылка откуда-то из далека, то возникает исключение. Ошибка растёт отсюда:
Код:
  try
    Http.Get(MainForm.LogoEdit.Text, FM); //LogoEdit это TEdit в котором ссылка на файл. вот тут возникает ошибка и выскакивает исключение после except
  FM.SaveToFile(GetImgName); //записываем картинку из потока в файл
  except
    MainForm.Log.Items.Add('[Ошибка]Неудалось загрузить Лого-изображение.');
    Exit;
  end;
если бы все работало=) Я бы не создовал тему....
А можно про другие варианты по подробнее пожалуйста=)?

Последний раз редактировалось Человек_Борща; 02.06.2010 в 13:30.
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2010, 18:20   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

народ.. поможет кто?
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2010, 19:00   #6
bitSoft
Programming...
Форумчанин
 
Аватар для bitSoft
 
Регистрация: 13.03.2010
Сообщений: 198
По умолчанию

a ti udali block try...except..end, i posmotri shto za oshibka, ano budet i tvoi otvet...
Код:
With TProgrammersForum.Create do  AddNewTopic('Title','Content...');
bitSoft вне форума Ответить с цитированием
Старый 02.06.2010, 22:35   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

да возникает ошибка...
Код:
    Http.Get(MainForm.LogoEdit.Text, FM);
    FM.SaveToFile(GetImgName);
ошибка следующего содержания...
...raised exception class EidSockedError with error "Socker Error #10054 connection reset by peer."..

не понимаю почему ошибка, картинка существует! нарисовал с бутылкой пива, по этому извеняюсь за содержание:
http://s42.radikal.ru/i098/1006/e9/9029d3d3fe6d.jpg
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2010, 22:46   #8
bitSoft
Programming...
Форумчанин
 
Аватар для bitSoft
 
Регистрация: 13.03.2010
Сообщений: 198
По умолчанию

hmm, no neznaiu, u menya vsio otlichino rabotaet, vot KOD prastoi
Код:
var
 HTTP : TidHTTP;
 Temp : TFileStream;
begin
 HTTP := TIdHTTP.Create(Self);
 Temp := TFileStream.Create('c:\123.jpg',fmOpenWrite or fmCreate);
 HTTP.Get(edt1.Text,Temp);
 Temp.Free;
 HTTP.Free;
end;
Код:
With TProgrammersForum.Create do  AddNewTopic('Title','Content...');
bitSoft вне форума Ответить с цитированием
Старый 02.06.2010, 23:12   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

неет.. неработает..
Код:
  FM: TFileStream;
begin
  Http := TIdHTTP.Create(nil);
  FM := TFileStream.Create(FNameFromURL(MainForm.LogoEdit.Text),fmOpenWrite or fmCreate);
  try
    Http.Get(MainForm.LogoEdit.Text, FM);
  except
    MainForm.Log.Items.Add('[Ошибка]Неудалось загрузить Лого-изображение.');
    Exit;
  end;
ошибка как есть так и осталась...
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработать изображение bender3190 Общие вопросы Delphi 2 18.04.2010 14:06
Как правельно отобразить на кнопке картинку во VB6? С.М.С Помощь студентам 3 27.06.2009 18:57
Как правельно поставить for между if и and Des Общие вопросы Delphi 3 07.05.2009 10:18
Как правельно создать базу учета передвижения документов kazhan БД в Delphi 20 19.01.2009 23:29
Как правельно составить запрос!! Areostar SQL, базы данных 3 16.02.2008 19:49