Правила Форума редакция от 22.06.2020 |
|
|
|
|
|
Опции темы | Опции просмотра | Language |
27.06.2006, 13:56 | #76 |
Гость
Сообщений: n/a
|
Re: Вопросы по Delphi/Pascal
как работать с FTP?
|
Реклама: | Рекомендуем гипермаркет КНС.ру - exp43 - Подарок каждому покупателю! | напольные стойки для телевизоров | привод клапана belimo | подарочная корзина на новый год | Рекомендуем KNS - мфу xerox b225 - Подарок каждому покупателю! |
28.06.2006, 10:46 | #77 | |||||||||||||||||||||||
Re: Вопросы по Delphi/Pascal
Впервые компонент для работы в сети Internet по FTP протоколу - TFTP появился в третьей версии Дельфи, в составе пакета Internet. Компонент имеет один очень существенный недостаток: после выполнения какой-либо команды необходимо дождаться освобождения компонента (свойство Busy), и только потом можно обратиться с новой командой. Из-за этого недостатка при выполнении команд на удаленном сервере необходимо либо организовывать циклы ожидания освобождения компонента, либо организовывать работу с помощью таймера, или использовать другие приемы. Все этого увеличивает размер исходного текста программы и уменьшает ее быстродействие. Пример использования циклов ожидания. FTP.UserName := UserNameEdit.Text; FTP.Pwd := PasswordEdit.Text; FTP.RemoteHost := RemoteHostEdit.Text; FTP.RemotePort := StrToInt(RemotePortEdit.Text); //установка параметров соединения FTP.Connect(RemoteHost, RemotePort); //соединение с FTP сервером while (FTP.Busy <> True) do begin end; // ожидание освобождения FTP FTP.PutFile('localfile.txt','file.txt'); // передача файла localfile.txt на FTP сервер // на FTP сервере файл будет сохранен под именем file.txt while (FTP.Busy <> True) do begin end; // ожидание освобождения FTP FTP.GetFile('removefile.txt','file.txt'); // прием файла removefile.txt с FTP сервера // файл будет сохранен в текущей директории под именем //file.txt FTP. Disconnect; // отключение от FTP сервера В Delphi четвертой версии появился новый компонент NMFTP, в котором были устранены недостатки предыдущего компонента. Теперь при выполнении нескольких команд достаточно записать их подряд, а компонент будет сам последовательно запускать каждую команду. Пример использования NMFTP. NMFTP.Host := RemoteHostEdit.Text; NMFTP.Port := 21; NMFTP.Timeout := 5000; NMFTP.UserID := UserNameEdit.Text; NMFTP.Password := PasswordEdit.Text; //установка параметров соединения NMFTP.Connect; //соединение с FTP сервером NMFTP.Download('removefile.txt','file.txt'); // прием файла removefile.txt с FTP сервера // файл будет сохранен в иекущей директории под именем //file.txt NMFTP.Upload('localfile.txt','file.txt'); // передача файла localfile.txt на FTP сервер // на FTP сервере файл будет сохранен под именем file.txt NMFTP.Disconnect; // отключение от FTP сервера
__________________
Все великие люди мало жили. Вот и мне что-то нездоровится... |
||||||||||||||||||||||||
04.07.2006, 18:35 | #78 |
Re: Вопросы по Delphi/Pascal
Может кто делал такое - программа запускается и сразу же сваливается в трей. Вроде бы ничего сложного, но загвоздка в том, чтобы скрыть окно, а не просто его свернуть, а метод Application.Run делает видимым главное окно программы не смотря ни на что.
Решил временно проблему закоментарив Application.Run, но пришлось еще добавить (не смеятся!) while true do Application.Processmessages =) |
|
04.07.2006, 19:50 | #79 |
Re: Вопросы по Delphi/Pascal
neonman, посмотри этот модуль. Он для трея и все что с ним связано... http://www.nowa.ru/showpost.php?p=91384&postcount=7
__________________
Все великие люди мало жили. Вот и мне что-то нездоровится... |
|
Сказали спасибо: |
04.07.2006, 22:23 | #80 |
Re: Вопросы по Delphi/Pascal
Тогда еще вопрос: хочу получить размер файла на удаленном сервере в инете. InternetQueryDataAvailable возвращает странные значения, не относящиеся к размеру файла. =( Склоняюсь к использованию HTTP запроса через сокет для этого. Мне сказали что разны серваки по-разному работают с InternetQueryDataAvailable, но верных данных он мне так и не вернул.
|
|
05.07.2006, 12:06 | #81 |
Re: Вопросы по Delphi/Pascal
neonman,
InternetQueryDataAvailable показывает сколько осталось докачать (если на сервере есть докачка). Почитай это: Закачиваем файлы с докачкой ТЕОРИЯ: Для начала рассмотрим все функции, константы и типы, которые мы будем использовать: 1) HINTERNET, вот как он описан: type HINTERNET = Pointer; PHINTERNET = ^HINTERNET; При детальном рассмотрении, это обычный указатель. 2) функции InternetOpen и InternetCloseHandle: function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET; stdcall; где: lpszAgent <-|Имя программы, с помощью которой мы соединяемся, |может принимать любые значения dwAccessType <-|Каким макаром соединяться с и-нетом |принимаемые значения: | PRE_CONFIG_INTERNET_ACCESS -как в системном реестре | LOCAL_INTERNET_ACCESS -напрямую | GATEWAY_INTERNET_ACCESS -через GateWay | CERN_PROXY_INTERNET_ACCESS -через проксю lpszProxy <-|Имя прокси сервера (ставим в nil) lpszProxyBypass<-|Не уверен, но смахивает на имена хостов, для которых не |использовать проксю (ставим в nil) dwFlags <-|Принимаеемые значения: | INTERNET_FLAG_ASYNC -этот запрос асинхронный (если есть | поддержка), но мы поставим 0 возвращает пресловутый HINTERNET, который будет требоваться при вызове всех остальных функций. С вызова этой функции начинается вся наша работа с интернетом, а с вызова второй заканчивается. function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall; где: nInet ранее созданый указатель. 3) функция InternetOpenUrl: function InternetOpenUrl(hInet: HINTERNET; lpszUrl: PChar; lpszHeaders: PChar; dwHeadersLength: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall; где: hInet <-|Ранее созданый указатель lpszUrl <-|Сам УРЛ lpszHeaders <-|Дополнительные строки в НТТР запрос dwHeadersLength<-|Длинна предыдущего dwFlags <-|Принимаемые значения: | INTERNET_FLAG_RAW_DATA -принимать как RAW данные | INTERNET_FLAG_EXISTING_CONNECT -не создавать для | объекта нового соединения | (поставим в 0) dwContext <-|пока не знаю, ставим в 0 Функция возвращает HINTERNET, указывающий на конкретный файл (далее он в параметрах функций будет называться hFile). 4) функция InternetReadFile: function InternetReadFile(hFile: HINTERNET; lpBuffer: Pointer; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall; где: hFile <-|Указатель, созданый предыдущей функцией lpBuffer <-|Указатель на буфер куда читать dwNumberOfBytesToRead<-|Сколько максимум читать (можно сказать размер | буфера, хотя не факт) lpdwNumberOfBytesRead<-|Сколько реально прочитано байт Этой функой мы будем читать файл из и-нета. 5) функция InternetSetFilePointer: function InternetSetFilePointer(hFile: HINTERNET; lDistanceToMove: Longint; pReserved: Pointer; dwMoveMethod, dwContext: DWORD): DWORD; stdcall; где: hFile <-|Указатель созданый функцией InternetOpenUrl lDistanceToMove<-|На сколько байт смещать указатель pReserved <-|?? dwMoveMethod <-|Как смещать (=0) dwContext <-|?? Собственно, эта функция и поможет нам организовать докачку. Она смещает указатель в файле, после чего передача файла начнется с этого места. В принципе этих данных уже достаточно для наших целей, но есть еще одна полезная функция, которая пригодится нам: function InternetQueryDataAvailable(hFile: HINTERNET; var lpdwNumberOfBytesAvailable: DWORD; dwFlags, dwContext: DWORD): BOOL; stdcall; где: hFile <-|Указатель, созданный функцией InternetOpenUrl lpdwNumberOfBytesAvailable<-|Сколько осталось байт dwFlags <-|?? dwContext <-|?? Как вы уже догадались, с помощью этой функции можно узнать сколько осталось байт скачать (или размер файла, если вызвать ее сразу после InternetOpenUrl). Ну, собственно, и все по теории. ПРАКТИКА: Условия задачи: 1. Скачиваемый файл сохраняется как c:\123.tmp 2. При очередном старте скачки идет проверка на наличие оного файла на винте, если он есть, считаем что надо докачивать. Размер этого файла является признаком того, с какого места надо качать. Требуемые материалы: 1. Форма (TForm)-1 шт. 2. Кнопки (TButton)-2 шт. 3. Строка ввода (TEdit)-1 шт. 4. Progress bar для красоты (TProgressBar)-1 шт. 5. Метки (TLabel)-по необходимости. Зависимости: WinInet Автор: [NIKEL], [email protected], Norilsk Copyright: Some site Дата: 15 сентября 2002 г. ********************************************** } unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, wininet, StdCtrls, ComCtrls; type TForm1 = class(TForm) Edit1: TEdit; //<-строка для УРЛа Label1: TLabel; Button1: TButton; //<-кнопка Start Button2: TButton; //<-кнопка Stop ProgressBar1: TProgressBar;//<-декорация procedure Button1Click(Sender: TObject);//<-|процедура начала скачки procedure Button2Click(Sender: TObject);//<-|принудительный обрыв procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; stop:boolean;//<-|вспомогательная переменная отв. за // |остановку скачки implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var hInet, //<-переменная сод. указатель на сессию hURL:HINTERNET; //<-указатель на URL fSize, //<-размер файла ReadLen, //<-количество реально прочитанных байт RestartPos:DWORD;//<-|позиция с которой начинается // |докачка fBuf:array[1..1024]of byte;//<-буфер куда качаем f:file; //<-файл куда качаем Header:string;//<-|дополнительная переменная в HTTP // |заголовок begin RestartPos:=0; //<- |инициализация fSize:=0; //<- |переменных Button1.Enabled:=false; Button2.Enabled:=true; //Если на винте есть файл то считаем, что нужно докачивать if FileExists('c:\123.tmp') then begin AssignFile(f,'c:\123.tmp'); Reset(f,1); RestartPos:=FileSize(F); Seek(F, FileSize(F)); end else begin //иначе с начала AssignFile(f,'c:\123.tmp'); ReWrite(f,1); end; //открываем сессию hInet := InternetOpen('Mozilla', PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0); //Пишем дополнительную строку для заголовка Header:='Accept: */*'; //открываем URL hURL := InternetOpenURL(hInet, PChar(Edit1.Text), pchar(Header), StrLen(pchar(Header)), 0, 0); //устанавливаем позицию в файле для докачки if RestartPos>0 then InternetSetFilePointer(hURL, RestartPos, nil, 0, 0); //смотрим ск-ко надо скачать InternetQueryDataAvailable(hURL, fSize,0,0); if RestartPos>0 then begin ProgressBar1.Min:=0; ProgressBar1.Max:=fSize+RestartPos; ProgressBar1.Position:=RestartPos; end else begin ProgressBar1.Min:=0; ProgressBar1.Max:=fSize+RestartPos; end; //качаем до тех пор пока реально прочитаное число байт не //будет равно нулю или не стор while (ReadLen<>0) and (stop=false) do begin //читаем в буфер InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen); //смотрим ск-ко осталось докачать InternetQueryDataAvailable(hURL, fSize,0,0); ProgressBar1.Position:=ProgressBar1.Max-fSize; BlockWrite(f, fBuf, ReadLen);//<-пишем в файл Application.ProcessMessages; end; stop:=false; Button1.Enabled:=true; Button2.Enabled:=false; InternetCloseHandle(hURL); //<-|закрываем InternetCloseHandle(hInet);//<-|сесcии CloseFile(f); //<-|и файл end; procedure TForm1.FormCreate(Sender: TObject); begin stop:=false;//<-прервать скачку Button2.Enabled:=false;//<-кнопка останова скачки end; procedure TForm1.Button2Click(Sender: TObject); begin stop:=true;//<-сообщаем о необходимости прерывания скачки end; end.
__________________
Все великие люди мало жили. Вот и мне что-то нездоровится... |
|
06.07.2006, 16:13 | #82 |
Re: Вопросы по Delphi/Pascal
IQDA возвращает, похоже сколько осталось байт в текущем блоке (~8 кб), после окончания блока возвращает опять 8 кб и так пока не скачает весь файл. Это я тоже пробовал. Вообще, люди, кто-нить пробовал компилить эти исходники? Качают, докачивают, но не выдают размера! =( Сервер finam.ru, файл *.zip, 1,2 Мб.
|
|
06.07.2006, 23:39 | #83 | |||||||||||||||||||||||
Re: Вопросы по Delphi/Pascal
Вообще то уже ответили, но если рыть глубоко неохота, посмотри компоненты Internet Component Suite на http://www.overbyte.be. Под все версии делфей, исходный код, тьма примеров в т.ч. FTP client&server . |
||||||||||||||||||||||||
21.07.2006, 18:55 | #84 |
Неактивный пользователь
Пол: Регистрация: 16.06.2006
Сообщений: 9
Репутация: 1
|
Delphi для PocketPC
Както раз в сети встречал некую надстройку для Delphi чтобы можнобыло пистаь для PocketPC на ней самой софт .. А сейчас вот понадобилось да не могу найти - может кто поделится? Буду премного благодарен!
|
23.07.2006, 03:48 | #85 |
Пользователь
Пол: Регистрация: 18.09.2005
Адрес: Vladivostok
Сообщений: 42
Репутация: 9
|
осцилограф/графики.
Нужно написать программу - осцилограф, примерно как в протеусе, ворбенче, мультисиме. Нужно изменять щшаг по горизонтали, по вертикали и тд. Пробовал использовать графики в делфи но немножко не то получается, если график сдвинуть то он и остается в таком положении как ты его поставил и ты не вмдиш что рисуется дальше.
Люди никто не подкинет примерчика лучше на делфи, за неимением другого на С. Задача именно научится писать такие вещи поэтому предложения по поводу почему бы не использовать готовые программы не корректны, да они есть, но я хочу научится писать их сам. Вот нашел как оно приблизительно должно выглядеть Также может кто нибудь подскажет как лучше сохранять данные с графика,что бы их можно было потом загрузить и просмотреть. Может есть у кого пример для сохранения в формат CoolEdit, тогда и внем можно будет просматривать. И как сохранить в графический формат. |
26.07.2006, 10:37 | #86 |
Гость
Сообщений: n/a
|
Re: Вопросы по Delphi/Pascal
Есть оракловая процедура, которая возвращает данные типа PL/SQL Table. И есть прога на Delphi, которая эту процедуру юзает (через DOA). Знает кто-нибудь как обрабатывать такой тип данных в Delphi?
|
26.07.2006, 16:08 | #87 | |||||||||||||||||||||||
Неактивный пользователь
Пол: Регистрация: 25.07.2006
Сообщений: 4
Репутация: 5
|
Re: Вопросы по Delphi/Pascal
есть системная переменная DecimalSeparator - в ней опредлен знак разделения десятичной части, если в него занести '.' то будет точка, если ',' то запятая, просто в программе перед функцией strtofloat() необходимо написать DecimalSeparator:=',' а после DecimalSeparator:='.' и все обработается путем |
|||||||||||||||||||||||
28.07.2006, 13:24 | #88 |
Re: Вопросы по Delphi/Pascal
Привет знатокам!
Данные: Сервер - Firebird 1.5 Компоненты - FIBPlus Дано две таблицы Master-Details1 и Master-Details2. Пользователь в гриде выбирает запись и жмет на кномку ПЕРЕНОСА данной записи. Требуеться перенести текущие данные из Master-Details1 в Master-Details2 (естественно с сохранением связей)? А если я переношу абсолюбтно все поля, типа: INSERT INTO MASTER2 (...) SELECT ... FROM MASTER1 WHERE MASTER1_ID = <ID>; INSERT INTO DETAIL2 (...) SELECT ... FROM DETAIL1 WHERE DETAIL1_MASTER = <ID>; DROP FROM DETAIL1 WHERE DETAIL1_MASTER = <ID>; DROP FROM MASTER1 WHERE MASTER1_ID = <ID>; то все получаеться, но в будущем возникает проблема, если запись (MASTERID) переносимого Мастера или Детейла уже будет сущевствовать, то возникнет ошибка одинаковы ключей. Заранне всем спасибо!
__________________
Тиха украинская ночь ... Но сало надо перепрятать ! |
|
30.07.2006, 01:00 | #89 |
Re: Вопросы по Delphi/Pascal
Как выключить обновление DBGrid'а на время изменения запроса? Может кто сталкивался... Очень нада
|
|
30.07.2006, 01:43 | #90 |
Re: Вопросы по Delphi/Pascal
neonman, если ничего не путаю, то DBGrid1.Enabled:=false;
__________________
Все великие люди мало жили. Вот и мне что-то нездоровится... |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PASCAL | Алексей М | Моделирование программ | 1 | 27.02.2009 16:52 |
Castalia for Delphi 2008.1 - эксперт IDE Delphi | Minotawr | Компоненты | 0 | 03.09.2008 02:17 |
Pascal | Fiesta_Life | Delphi | 4 | 01.06.2008 03:11 |
Pascal | puella | Delphi | 5 | 18.02.2008 18:11 |
|
|