понедельник, 12 апреля 2010 г.

Проверка почты средствами Delphi Часть 1

   Доброе время суток. Я начинаю цикл статей которые направлены на работу по созданию почтового клиента с помощью компонент Indy.
   Для начала определимся с инструментарием: при написании программы я использовал Delphi 2010 (Delphi 2009) компоненты Indy v10 
   В этой части мы выполним следующие задания:
  1. Проверка почты на наличие сообщений;
  2. Возможность задания периода проверки почты;
  3. Вывод уведомлений при наличии каких либо сообщений;

   Раз определились с планом действий - приступим к следующему этапу - созданию. Создаем новый проект, и размещаем на форме компонент idPOP3, который находиться на закладке IndyClients.
   Для того чтобы проверить почту нам необходимо передать компоненту idPOP3 некоторые параметры для подключения, а именно:

UserName – адрес электронной почты в формате (xxx@xxx.xx)
Password – пароль к данному почтовому ящику
Host – POP3 сервер (pop.mail.ru; pop3.ukr.net)
Port – порт (по умолчанию 110)
   Размещаем на форме компонент GroupBox из вкладки Standard – для группирования полей. Для того чтобы программа была более "гибкой" - поместим 4 компонента Edit и Label, они находятся на закладке Standard. Установим свойства компонентов, как показано в Табл.1.
Табл.1.
Компонент Свойство Значение Описание
Form1 Name MainForm
GroupBox1 Caption Настройки ящика

Name SettingsGroupBox
Label1 Caption Адрес

Name AdressLabel
Label2 Caption Пароль

Name PassLabel
Label3 Caption POP3 сервер

Name Pop3Label
Label4 Caption Порт

Name PortLabel
Edit1 Text
Адрес

Name AdressEdit
Edit2 Text
Пароль

Name PassEdit

PasswordChar *
Edit3 Text
POP3 сервер

Name Pop3Edit
Edit4 Text
Порт

Name PortEdit

NumbersOnly true Можно вводить только числа
idPop31 Name idPop31

Результат можно просмотреть на  Рис.1.

Рис. 1. 
   Что касается 2-го задания. Нам необходимо еще разместить на форме компонент Timer, который находиться на закладке System. Для задания интервала проверки, нам необходимо добавить на форму поле ввода Edit (панель Standard), компонент Memo для вывода системных сообщений и кнопку (Button на панели Standard) для подтверждения введеной информации. Установим для них следующие свойства (Табл. 2):
Табл. 2
Компонент
Свойство
Значение
Button1 Caption Установить
Name OkBtn
Memo1 Lines
Name ResultMemo
Edit5 Text
Name IntervalEdit
NumbersOnly true
Timer1 Enabled false
Name CheckTimer

   В результате мы получим следующий вид окна (Рис.2.):

Рис. 2.
   Напишем функцию присвоения значений таймера, его активацию и вывод соответствующих сообщений в ResultMemo.
function TMainForm.StartTimer(T:TTimer;int:Integer):string;
var
  sec:Integer; // объявляем переменную для записи в неё количество мсек.
begin
  T.Enabled:=false; //остановка таймера
  sec:=int*60000; // определяем интервал проверки
  T.Interval:=sec; // задаём интервал проверки
  T.Enabled:=true; //запускаем таймера
  Result:='Почта будет проверена через '+IntToStr(int)+' мин.'; // передача обратно оповещения
end;
Обьявим данную функцию в приватной секции главной формы:
private
  { Private declarations }
  function StartTimer(T:TTimer;int:Integer):string;
   Данная функция задает настройки таймера и возвращает строку с сообщением, через какой период будет проверена почта.

   Дальше создадим код для события onClick кнопки OkButton (для того чтобы создать данное событие необходимо два раза кликнуть на кнопку, или перейти в Object Inspector, открыть закладку Events, и два раза кликнуть по пустому полю возле названия onClick): После создания события автоматически сгенерируется следующий код:
procedure TMainForm.OkBtnClick(Sender: TObject);
begin
end;
Используем ранее написанную функцию, для этого передадим необходимые параметры:
procedure TMainForm.OkBtnClick(Sender: TObject);
begin
  ResultMemo.Lines.Add(StartTimer(CheckTimer,StrToInt(IntervalEdit.Text)));
end;
   Рассмотрим более детально: ResultMemo.Lines.Add(); - добавляем запись в ResultMemo которую возвращает написанная нами процедура StartTimer(CheckTimer,StrToInt(IntervalEdit.Text)).
   Всё очень просто мы останавливаем таймер, в том случае если он запущен, определяем время его срабатывания, записываем данное время в интервал и запускаем таймер.
Теперь перейдём непосредственно к таймеру. Два раза кликаем левой кнопкой мыши на компонент Timer, после чего вы перейдёте в редактор кода, при этом автоматически генерируется обработчик события OnTimer:
procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
end;
   Дальше реализуем процедуру для получения писем:
function TMainForm.CheckMail(IP:TIdPOP3;User,Pass,Host:string;Port:Integer):String;
var
  NumOfMsgs:Integer; // Количество писем
begin
try
  IP.Username:=User; // адрес электронной почты в формате (xxx@xxx.xx)
  IP.Password:=Pass; // пароль к данному почтовому ящику
  IP.Host:=Host; // POP3 сервер (pop.mail.ru; pop3.ukr.net)
  IP.Port:=Port; // порт
  IP.Connect; // подключаемся
  if IP.Connected then // если подключение прошло успешно
  begin
    // записываем в NumOfMsgs количество писем
    NumOfMsgs := IP.CheckMessages;
    // Возвращаем результат
    Result:='Подключение прошло успешно!'+#13#10;
    Result:=Result+'У вас '+IntToStr(NumOfMsgs)+' сообщений';
  end
  except // Если произошла ошибка- возвращаем текст ошибки
    on E:Exception do Result:='Ошибка подключения! '+E.Message;
  end;
  IP.Disconnect; // Отключаемся
end;
   И обявим ее в приватной секции главной формы:
private
  ...
  function CheckMail(IP:TIdPOP3;User,Pass,Host:string;Port:Integer):String;
   Переходим в обработчик события OnTimer и компонента CheckTimer и пишем следующий код для того чтобы почта проверялась при активации таймера:
procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
  ResultMemo.Lines.add(CheckMail(IdPOP31,AdressEdit.Text,PassEdit.Text,Pop3Edit.Text,StrToInt(PortEdit.Text)));
end;
   Теперь посмотрим что же получилось, заполняем все поля (настройки для получения почты можно взять на почтовых серверах, где у вас зарегистрирован почтовый ящик) (Рис.3):
Рис.3.
   Тестирование прошло успешно. Сегодня попробую протестировать на других почтовых серверах.
   PS: Если есть пожелания - пишите, с удовольствием выслушаю и по возможности реализую.
Продолжение во 2-й части: Проверка почты средствами Delphi - часть 2

вторник, 6 апреля 2010 г.

Google Street View в 3D

   В Google Street View теперь встроена технология стереопросмотра. Для его активации необходимо нажать на соответствующею иконку:
   Для просмотра только нужно использовать специальные стереоочки. Пример можно просмотреть ниже:


пятница, 2 апреля 2010 г.

Коды ошибок Run-Time Error

   Бывают ситуации, при которых возникают ошибки Run-Time Error. Ниже привожу расшифровку кодов ошибок Run-Time Error
1 - Invalid function number
2 - File not found
3 - Path not found
4 - Too many open files
5 - File access denied
6 - Invalid file handle
12 - Invalid file access code
15 - Invalid drive number
16 - Cannot remove current directory
17 - Cannot rename across drives
100 - Disk read error
101 - Disk write error
102 - File not assigned
103 - File not open
104 - File not open for input
105 - File not open for output
106 - Invalid numeric format
200 - Division by zero
201 - Range check error
202 - Stack overflow error
203 - Heap overflow error
204 - Invalid pointer operation
205 - Floating point overflow
206 - Floating point underflow
207 - Invalid floating point operation
210 - Object not initialized
211 - Call to abstract method
212 - Stream registration error
213 - Collection index out of range
214 - Collection overflow error
215 - Arithmetic overflow error
216 - General protection fault

Расшифровка кодов ошибок при работе с сокетами: Socket error xxxxx

   При работе с сокетами бывают исключительные ситуации, при которых возникают ошибки с некими кодами. Немножко поискав - нашел описание ошибок. Решил привести данное описание в своем блоге:
Socket error 10004 - Interrupted function call
Socket error 10013 - Permission denied
Socket error 10014 - Bad address
Socket error 10022 - Invalid argument
Socket error 10024 - Too many open files
Socket error 10035 - Resource temporarily unavailable
Socket error 10036 - Operation now in progress
Socket error 10037 - Operation already in progress
Socket error 10038 - Socket operation on non-socket
Socket error 10039 - Destination address required
Socket error 10040 - Message too long
Socket error 10041 - Protocol wrong type for socket
Socket error 10042 - Bad protocol option
Socket error 10043 - Protocol not supported
Socket error 10044 - Socket type not supported
Socket error 10045 - Operation not supported
Socket error 10046 - Protocol family not supported
Socket error 10047 - Address family not supported by protocol family
Socket error 10048 - Address already in use
Socket error 10049 - Cannot assign requested address
Socket error 10050 - Network is down
Socket error 10051 - Network is unreachable
Socket error 10052 - Network dropped connection on reset
Socket error 10053 - Software caused connection abort
Socket error 10054 - Connection reset by peer
Socket error 10055 - No buffer space available
Socket error 10056 - Socket is already connected
Socket error 10057 - Socket is not connected
Socket error 10058 - Cannot send after socket shutdown
Socket error 10060 - Connection timed out
Socket error 10061 - Connection refused
Socket error 10064 - Host is down
Socket error 10065 - No route to host
Socket error 10067 - Too many processes
Socket error 10091 - Network subsystem is unavailable
Socket error 10092 - WINSOCK.DLL version out of range
Socket error 10093 - Successful WSAStartup not yet performed
Socket error 10094 - Graceful shutdown in progress
Socket error 11001 - Host not found
Socket error 11002 - Non-authoritative host not found
Socket error 11003 - This is a non-recoverable error
Socket error 11004 - Valid name, no data record of requested type