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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2009, 14:02   #1
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию помогите приделать прогрессбар.

имеется программа для отправки файлов на гейт. вот код-
Код:
unit Unit1;

interface

uses
  Windows, Messages, winsock, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)

    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    ListBox1: TListBox;
    Button3: TButton;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function SendFile(host, script, filename:string):string;
var
  sock : dword;
  ca : sockaddr_in;
  HTTPHeader : string;
  boundary : string;
  fs:dword;
  hFile : DWORD;
  buf : array [0..4095] of char;
  p : PHostEnt;
  rb : cardinal;
  len : integer;
  SubHeader1 : string;
  SubHeader2 : string;
begin
  result := '';
  // îòêðûâàåì ôàéë íà ÷òåíèå
  hFile := CreateFile(PChar(filename), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if hFile <> INVALID_HANDLE_VALUE then // åñëè âñ¸ íîðì
  begin
    fs := GetFileSize(hFile, nil); // ïîëó÷èì ðàçìåð ôàéëà
    // ñîçäàåì ñîêåò
    sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    // åñëè ñîçäàëñÿ ñîêåò
    if sock <> INVALID_SOCKET then // åñëè íîðì
    begin
      ca.sin_family := AF_INET;
      ca.sin_port := htons(80); // ïîðò 

      p := GetHostByName(PChar(host)); // ïîëó÷èì ip ïî äîìåíó
      if p = nil then // åñëè íåòó
      begin
        // çíà÷èò ýòî IP
        ca.sin_addr.s_addr := inet_addr(pchar(host));
      end
      else
      begin
        // âûäåðèì ip
        ca.sin_addr := PInAddr(p.h_addr_list^)^;
      end;

      // êîííåêòèìñÿ
      if connect(sock, ca, sizeof(ca)) <> -1 then
      begin
        // åñëè âñ¸ íîðì
        // ãåíåðèì ðàçäåëèòåëü
        boundary := inttohex(random(65535), 4)+inttohex(random(65535), 4)+inttohex(random(65535), 4);
          // ñîçäàåì ÷àñòè HTTP çàãîëîâêà
        SubHeader1 :=  '--'+boundary+#13#10+
                      'Content-Disposition: form-data; name="myfile"; filename="'+filename+'"'#13#10+
                      'Content-Type: application/octet-stream'#13#10#13#10;
        SubHeader2 := #13#10+'--'+boundary+'--'#13#10;
        HTTPHeader := 'POST '+script+' HTTP/1.1'#13#10+
                      'Host: '+host+#13#10+
                      'Connection: close'#13#10+
                      'Content-Type: multipart/form-data; boundary='+boundary+#13#10+
                      'Content-Length: '+inttostr(fs + length(SubHeader1) + length(SubHeader2))+#13#10#13#10+SubHeader1;

         // ïîñûëàåì çàãîëîâîê
        send(sock, HTTPHeader[1], length(HTTPHeader), 0);
        while true do
        begin
          rb := 0;
          // ÷èòàåì 4 êèëà èç ôàéëà
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // åñëè íå ñ÷èòàëîñü òî âûõîä èç öèêëà
          send(sock, buf, rb, 0); // ïîøëåì ñ÷èòàííûå äàííûå
        end;
          // ïîøåë ïîñëåäíèé ðàçäåëèòåëü
        send(sock, SubHeader2[1], length(SubHeader2), 0);
        while true do // ê öèêëå æäåì îòâåòà îò ñåðâåðà
        begin
          len := recv(sock, buf, 4096, 0); // ñ÷èòàëè äàííûå
          if len > 0 then // åñëè åñòü ÷òîòî
          begin
            result := result + copy(buf, 0, len);
          end
          else
          begin // åñëè íåò áîëüøå äàííûõ òî âûõîäèì èç öèêëà
            break;
          end;
        end;
      end;
      closesocket(sock); // çàêðûâàåì ñîêåò
end;
CloseHandle(hFile); // çàêðûâàåì ôàéë
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ws : TWSAData;
s : string;
begin
WSAStartup($101, ws);
s := SendFile(Edit1.Text, '/get.php', opendialog1.FileName);
ShowMessage(s);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
FStream : TFileStream;
begin
with OpenDialog1 do
if Execute then
begin
Listbox1.Items.Add(opendialog1.FileName);
FStream:=TFileStream.Create(OPenDialog1.FileName,fmOpenRead);
Edit2.Text:=IntToStr(Round(FStream.Size/1024))+' êèëîáàéò.';
FStream.free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Listbox1.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SendMessage(ListBox1.Handle,LB_SETHORIZONTALEXTENT,width,0);
end;
end.
нужно сюда приделать прогрессбар.
Mobile™ вне форума Ответить с цитированием
Старый 18.10.2009, 14:40   #2
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию

может кто поможет?
Mobile™ вне форума Ответить с цитированием
Старый 18.10.2009, 14:59   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

в цикле отправки пакетов добавьте что-то вроде...
Код:
inc(num_packet);
progressbar.position:= num_packet* 4096 div sizeof(hfile)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 18.10.2009, 15:06   #4
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию

а куда именно добавить?
Mobile™ вне форума Ответить с цитированием
Старый 18.10.2009, 15:46   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

а вот это уже сами подумайте
...
подсказка- у вас есть цикл отправки пакетов
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 18.10.2009, 15:55   #6
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
а вот это уже сами подумайте
...
подсказка- у вас есть цикл отправки пакетов
ну помогите уже третий день сижу перепробовал все что можно. ктомуже я дубовый в дельфи
Mobile™ вне форума Ответить с цитированием
Старый 18.10.2009, 18:18   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вам по своему коду трудно пройтись... ну например тут
Код:
while true do
        begin
          rb := 0;
          // ?????? 4 ???? ?? ?????
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // ???? ?? ????????? ?? ????? ?? ?????
          send(sock, buf, rb, 0); // ?????? ????????? ??????
        end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 18.10.2009, 19:17   #8
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
вам по своему коду трудно пройтись... ну например тут
Код:
while true do
        begin
          rb := 0;
          // ?????? 4 ???? ?? ?????
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // ???? ?? ????????? ?? ????? ?? ?????
          send(sock, buf, rb, 0); // ?????? ????????? ??????
        end;
дык и что сделать чтобы проогрессбар работал?
Mobile™ вне форума Ответить с цитированием
Старый 18.10.2009, 19:31   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
inc(num_packet);
progressbar.position:= num_packet* 4096 div fs
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 18.10.2009, 19:41   #10
Mobile™
Заблокирован
 
Регистрация: 26.06.2009
Сообщений: 60
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Код:
inc(num_packet);
progressbar.position:= num_packet* 4096 div fs
Код:
while true do
        begin
          rb := 0;
          // читаем 4 кила из файла
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // если не считалось то выход из цикла
          send(sock, buf, rb, 0); // пошлем считанные данные
          inc(num_packet);
          progressbar.position:= num_packet* 4096 div fs
          end;
вставил так но не работает
Mobile™ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прогрессбар... Лёка Общие вопросы Delphi 12 18.03.2010 14:41
База данных приделать поиск demon9999 Помощь студентам 0 03.06.2008 00:26
Обратный отсчет в прогрессбар Stanislav Общие вопросы Delphi 3 09.01.2008 16:49