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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2016, 23:11   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я же сказал куда вставлять.
перед тем как вы закрываете поток.
(это fs.Free)
но не забывать сбросить положение потока, fs.Position:=0 перед загрузкой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 07:21   #12
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Файл передается, сохраняется на жесткий диск, но в image1 не отображается.
исключение как вылетало, так и вылетает.
Код:
    if fs.Size = fSize then
       begin
          Receiving := False;
          fs.Position:=0;
          Image1.Picture.Graphic.LoadFromStream(fs);
          fs.Free;
          Jornal('Файл принят!', Unassigned, clGreen);
       end;
Код:
const
  bSize : Integer = 4000;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
begin
ClientSocket1.Active := True;
Receiving := False;
cmd := TStringList.Create;
fSize := 0;
fName := '';
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ClientSocket1.Active then ClientSocket1.Active := False;
if Assigned(cmd) then cmd.Free;
end;



procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  nRead : Integer;
  rBuf : Pointer;
begin
// если не находимся в режиме получения файла, то значит пришли команды
// в нашем случае это имя и размер файла 
if not Receiving then //получение команды - параметров файла
  begin
      cmd.Text := Socket.ReceiveText;

      fName := cmd.Strings[0];
      fSize := StrToInt64(cmd.Strings[1]);
      Jornal('Прием файла ' + QuotedStr(cmd.Strings[0]), fsItalic);
      Jornal('Размер файла ' + QuotedStr(cmd.Strings[1]), fsBold);

      Gauge1.MinValue := 0;
      Gauge1.Progress := 0;
      Gauge1.MaxValue := fSize;
      Jornal('------------------------------------------', Unassigned);

      // переход в режим приема файла  и создание потока для приема файла
      Receiving := True;
      fs := TFileStream.Create(fName, fmCreate);

      Gauge1.Progress := 0;
      //Уведомление сервера о готовности приема файла
      cmd.Clear;
      cmd.Add('send');
      cmd.Add(fName);
      Socket.SendText(cmd.Text);
  end
else // режим получения файла
  begin
    repeat
      Socket.Lock;
      // выделение памяти под принятый кусок данных
      GetMem(rBuf, bSize + 1);
      // считывание данных nRead = количество считанных байт
      nRead := Socket.ReceiveBuf(rBuf^, bSize);
      // если что то считалось, то запись данных в файл
      if nRead > 0 then
        begin
          //fs.Seek(0, soFromEnd);
          fs.WriteBuffer(rBuf^, nRead);
          Gauge1.Progress := fs.Size;
        end;

      FreeMem(rBuf);
      Socket.Unlock;
      Application.ProcessMessages;
    until (nRead <= 0);


    // если всё данные считались, то переключение режима приема обратно и освобождение переменной потока
    if fs.Size = fSize then
       begin
          Receiving := False;
          fs.Position:=0;
          Image1.Picture.Graphic.LoadFromStream(fs);
          fs.Free;
          Jornal('Файл принят!', Unassigned, clGreen);
       end;
  end;
end;


// процедура вывода данных в журнал [текст сообщения, стиль текста, цвет текста]
procedure TForm1.Jornal(txt: string; fst : TFontStyle; clr : TColor);
var
  time : string;
  totallen, curlen, sstart : Integer;
begin
if txt = '' then Exit;
time := '[' + DateTimeToStr(now) + '] ';
RxRichEdit1.Lines.Add(time+txt);
RxRichEdit1.SelStart := Length(RxRichEdit1.Lines.Text) - Length(time+txt) - RxRichEdit1.Lines.Count - 1;
RxRichEdit1.SelLength := Length(time+txt);

end;


procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Jornal('> Подключён к серверу [' + Socket.RemoteAddress + ']', Unassigned, clGreen);
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Jornal('< Отключён от сервера [' + Socket.RemoteAddress + ']', Unassigned, clRed);
end;

end.
stlcrash вне форума Ответить с цитированием
Старый 25.09.2016, 07:34   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

то что вы посылаете вообще картинка?

эксепш кстати тоже семью тайнами покрыт?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 10:17   #14
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

да картинка. в формате BMP. она сохраняется на диск и открывается. но в программе в immage не отображается и вылетает на строчке

fs.Position:=0;
Image1.Picture.Graphic.LoadFromStre am(fs);
stlcrash вне форума Ответить с цитированием
Старый 25.09.2016, 12:03   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а на диске то файл открывается?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 16:51   #16
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а на диске то файл открывается?
да.
stlcrash вне форума Ответить с цитированием
Старый 25.09.2016, 18:23   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

текст эксепшена озвучьте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 19:29   #18
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
текст эксепшена озвучьте.
First chance exception at $005D12D0. Exception class $C0000005 with message 'access violation at 0x005d12d0: read of address 0x00000000'. Process Client.exe (4924)

stlcrash вне форума Ответить с цитированием
Старый 25.09.2016, 19:48   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если не ошибаюсь, не так из потока надо картинку грузить.
у вас Graphics скорее всего nil.
вообще вы не пробовали в момент исключения посмотреть переменные, тут же бы нашли причину, отладчик хорошая вещь
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 20:36   #20
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если не ошибаюсь, не так из потока надо картинку грузить.
у вас Graphics скорее всего nil.
вообще вы не пробовали в момент исключения посмотреть переменные, тут же бы нашли причину, отладчик хорошая вещь
был бы я еще программистом )
stlcrash вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безопасность в локальной сети. tomstorm Безопасность, Шифрование 2 07.03.2016 08:00
Эмулятор локальной сети Mid1987 C/C++ Сетевое программирование 3 05.09.2013 17:49
Socket: Подключение клиента из глобальной сети к серверу, расположенному в локальной сети Дамир Общие вопросы .NET 4 01.12.2010 12:12
Построение локальной сети Blade Компьютерное железо 6 04.09.2009 12:46