Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > "сетевая Грабилка"


Автор: DonPager 19.6.2003, 20:17
Прости мне конечно мою лень....
просто наверняка уже кто- то занимался этим вопросом.... и может подсказать
Итак для грабилки файлов нужно реализовать:
1)возможность докачки файла... (самое важное и я не знаю как sad.gif )
2) создать табличку в которой вместо строк:
кнопка, флажок,поле, поле,прогресбарчик,поле....
(я знал но забыл....)
подскажите....

Автор: dm9 19.6.2003, 22:34
По второму вопросу: сделай компонент, в основе которого - Panel или ScrollBox. Положи на него нужные тебе вещи - прогрессбары, эдиты, чекбоксы и прочее. Затем создавай такие компоненты, запихивай, например, в динамический массив, располагй один под другим, и все будет ОК. Я похожее когда-то делал.

Автор: SmaLL 20.6.2003, 08:21
Грабилка файлов из локальной сети или из инета?

Автор: altarasjuk 20.6.2003, 12:46
Цитата
По второму вопросу: сделай компонент, в основе которого - Panel или ScrollBox. Положи на него нужные тебе вещи - прогрессбары, эдиты, чекбоксы и прочее. Затем создавай такие компоненты, запихивай, например, в динамический массив, располагй один под другим, и все будет ОК. Я похожее когда-то делал.
Ну ты и садист....
Я щас делаю примерно такое же, только без прогрессбара. Вообще это всё можно найти уже готовым, если кто знает где, то скажите, плиз. А я делаю так: Беру обычный стринг грид и в его ячейках рисую то, что мне надо(кнопочки и чекбоксы) ну и прогресс там реализовать думаю будет не сложно.

Автор: dm9 20.6.2003, 18:06
Хотелось бы спросить, что значит "рисую"? Просто сам обрабатываешь OnDrawCell и рисуешь ручками кнопки и чекбоксы? Если так, то экономия памяти налицо... но и гораздо сложнее.

Автор: altarasjuk 20.6.2003, 18:22
Цитата
Просто сам обрабатываешь OnDrawCell и рисуешь ручками кнопки и чекбоксы? Если так, то экономия памяти налицо... но и гораздо сложнее.
Ага карандашом на мониторе.... biggrin.gif А если серьёзно, то некоторые вещи (например все кнопки - картинки) загнал в один графический вайл, и потом рисую их Canvas.CopyRect, а некоторые и руками: результат налицо - если много дескрипторов на графику - на 98 появляется экран смерти(там где предлагают разместить твою рекламу smile.gif ).... А так получаем один единственный дескриптор на всё приложение (я и другую графику так рисовал.....). И Дядя Билли может спать спокойно - 98 работает. А вот под 2000|XP такой проблемы нет.

Автор: DonPager 21.6.2003, 11:25
Цитата
Я щас делаю примерно такое же, только без прогрессбара. Вообще это всё можно найти уже готовым, если кто знает где, то скажите, плиз. А я делаю так: Беру обычный стринг грид и в его ячейках рисую то, что мне надо(кнопочки и чекбоксы) ну и прогресс там реализовать думаю будет не сложно.

так немного не красиво получается... приходится два раза таб нажимать...да и прогресы обновлять каждый раз надо... лажечка получается....
2 Small
Цитата
Грабилка файлов из локальной сети или из инета?

из локалки....

Хех, вот вы и наказали меня за размещение 2х вопросов....
...ответили на тот, который меня меньше интерисовал...
Самое главное щас для меня реализовать докачку...

Автор: altarasjuk 21.6.2003, 12:19
Цитата
Самое главное щас для меня реализовать докачку...
по http протоколу?

Автор: Mikel 21.6.2003, 15:13
Можно конечно самому написать используя WinInet, но и можно скачать JVCL- там есть такой компонент

Автор: DonPager 21.6.2003, 21:20
Цитата
по http протоколу?

по полной тсп/ип (ЛОКАЛКА!!!) само собой это будет работать и на фтп и на нттр и т.д..
2Mikel
а стандартными средствами никак не получится?

Автор: altarasjuk 21.6.2003, 22:14
ну если по локалке, то очень просто начинаешь читать файл с нужного байта.
А если по http, то так не получится, надо почитать доку, не все сервера это поддерживают, для http если я не ошибаюсь при запросе в стриме надо передавать байт с которого начинать читать, но опять же скажу надо почитать доку.
И кстати если не секрет, то зачем докачка по локалу?

Автор: DonPager 21.6.2003, 22:41
Цитата
И кстати если не секрет, то зачем докачка по локалу?

допустим хочешь ты фильму перекачать , качаешь.... а у етого гада вдруг на последнем проценте пробки выбивает или ещё что....
а по поводу открываешь , читаешь....
почуть поподробней....
я делаю так:
открываю файл , читаю его размер , запоминаю...начинаю читать по биту

создаю файл, пишу в него по биту и считаю..... и запоминаю....
.... ну и т.д...
проблема с автоматическим пуском докачки ......вешает сеть...

Автор: DonPager 21.6.2003, 22:50
smile.gif только што решил проблему...
пускаю ачала пинги....

Автор: Mikel 22.6.2003, 08:33
Я отдал статью на сайт по WinInet. Как опубликуют, так дам ссылку. Там есть пример закачки файла.

Автор: altarasjuk 23.6.2003, 10:18
Цитата
открываю файл , читаю его размер , запоминаю...начинаю читать по биту
не по биту а по байту

Автор: DonPager 24.6.2003, 18:42
Цитата
не по биту а по байту
smile.gif НУ ДА
.... только вот одна проблемка с этим sad.gif - больше 4б за раз не получается передавть....
а так ооооооочень медленно...

Автор: altarasjuk 24.6.2003, 18:54
>больше 4б за раз не получается передавть....
ПОЧЕМУconfused.gifconfused.gifconfused.gif?
ИМХО, нужно это дело буфферизировать.
Смотри пример:
Код

procedure TCoreBackup.Execute;
var
 readlen: Integer;
 inf: file;
 outf: file;
 buffer: array[1..131072] of Char;
begin
 try
   FilePos:= 0;
   AssignFile(inf,fSourceFileName);
   Reset(inf,1);
   AssignFile(outf,fDestignationFileName);
   Rewrite(outf,1);
   repeat
     BlockRead(inf, buffer, 131072, readlen);
     BlockWrite(outf, buffer, readlen);
     FilePos:= FilePos+readlen;
     if Self.Terminated then begin
       CloseFile(inf);
       CloseFile(outf);
       try
         if FileExists(fDestignationFileName) then
           DeleteFile(fDestignationFileName);
       finally
         Synchronize(SyncRaiseEventEnd);
         Self.Suspend;
       end;
       Exit;
     end;
   until readlen=0;
   CloseFile(inf);
   CloseFile(outf);
   Synchronize(SyncRaiseEventEnd);
 except
   Synchronize(SyncRaiseEventEnd);
 end;
end;

Автор: DonPager 24.6.2003, 19:38
Я тоже через буфер делаю... только что-то не могу его больше 4х байт сделать...
[CODE]var
Src, Dest : TFileStream;
TMP: TMemoryStream;
P :Int64;
cnt : Int64;

begin
STOP := false;
Src := TFileStream.Create(DataFileNew[CntDownload-1].InFile,fmOpenRead);
Dest := TFileStream.Create(DataFileNew[CntDownload-1].OutFile,fmOpenWrite);
ProgressBar1.Max := DataFileNew[CntDownload-1].FileSize;
Tmp := TMemoryStream.Create;
cnt := DataFileNew[CntDownload-1].Loaded;
P := Src.Seek(cnt,soFromBeginning);
Src.Position := P;
Dest.Position := P;

try
while (cnt <= DataFileNew[CntDownload-1].FileSize)and(not STOP) do
begin
Dest.Write(TMP,Src.Read(TMP,4));
//ProgressBar1.Position := cnt;
Memo1.Lines.Add(IntToStr(cnt));
Inc(cnt,4);
if cnt > DataFileNew[CntDownload-1].FileSize then
cnt := DataFileNew[CntDownload-1].FileSize;
Application.ProcessMessages;
end;
finally
DataFileNew[CntDownload-1].Loaded := cnt;
Tmp.Free;
Src.Free;
Dest.Free;
end;
end;[CODE]

Автор: altarasjuk 24.6.2003, 20:13
Нафига ты такие сложности написал ? Возьми тот исходник, щють-щють подкорректируй, тебе там собственно только на if Self.Terminated then begin надо чёто менять и юзай на здоровье и не парся. Там ты чё-то такого навоял, что глаз режет. И кстати, я б тебе советовал почитать про рефакторинг. Тогда и код будет легче писать. smile.gif

Автор: DonPager 25.6.2003, 21:54
Цитата
Нафига ты такие сложности написал ?

сам по себе то кодик маленький...
Код
Src := TFileStream.Create(InFileName,fmOpenRead);
Dest := TFileStream.Create(OutFileName,fmOpenWrite);
Tmp := TMemoryStream.Create;
while (cnt < InFilesize) do
begin
Dest.Write(TMP, Src.Read(TMP,4));
Inc(cnt,4);
end;

просто он из проекта выдернут ....
и никаких сложностей... smile.gif кроме того что не работает..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)