Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.24;
Скачать: CL | DM;

Вниз

как правильнее составить цикл?   Найти похожие ветки 

 
linuxoid   (2010-07-26 08:26) [0]

Здравствуйте!

Имеется код программы(параллельный поток), которая пингует хост. теперь нужно сделать так, чтобы адреса хостов она вытаскивала из базы. как теперь это организовать в цикле?

unit thrd;

interface

uses
 Windows,  SysUtils,  Classes,
 StdCtrls, winsock;

type
 TThreadScan = class(TThread)
 private
 msg,msg2: string;
 procedure addstr;
   { Private declarations }
 protected
   procedure Execute; override;
 end;

 type
   ip_option_information = packed record  // Информация заголовка IP (Наполнение
       // этой структуры и формат полей описан в RFC791.
       Ttl : byte;   // Время жизни (используется traceroute-ом)
       Tos : byte;   // Тип обслуживания, обычно 0
       Flags : byte;  // Флаги заголовка IP, обычно 0
       OptionsSize : byte;  // Размер данных в заголовке, обычно 0, максимум 40
       OptionsData : Pointer; // Указатель на данные
   end;

  icmp_echo_reply = packed record
       Address : u_long;        // Адрес отвечающего
       Status : u_long;       // IP_STATUS (см. ниже)
       RTTime : u_long;       // Время между эхо-запросом и эхо-ответом
            // в миллисекундах
       DataSize : u_short;        // Размер возвращенных данных
       Reserved : u_short;        // Зарезервировано
       Data : Pointer;    // Указатель на возвращенные данные
       Options : ip_option_information; // Информация из заголовка IP
   end;

   PIPINFO = ^ip_option_information;
   PVOID = Pointer;

       function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
       function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL"  name "IcmpCloseHandle";
       function IcmpSendEcho(
                         IcmpHandle : THandle;    // handle, возвращенный IcmpCreateFile()
                         DestAddress : u_long;    // Адрес получателя (в сетевом порядке)
                         RequestData : PVOID;     // Указатель на посылаемые данные
                         RequestSize : Word;      // Размер посылаемых данных
                         RequestOptns : PIPINFO;  // Указатель на посылаемую структуру
                                           // ip_option_information (может быть nil)
                         ReplyBuffer : PVOID;     // Указатель на буфер, содержащий ответы.
                         ReplySize : DWORD;       // Размер буфера ответов
                         Timeout : DWORD          // Время ожидания ответа в миллисекундах
                        ) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";

implementation

uses Unit1;

procedure TThreadScan.addstr;
begin
Form1.ListBox1.Items.Add(msg);
end;

procedure TThreadScan.Execute;
var
  hIP : THandle;
   pingBuffer : array [0..31] of Char;
   pIpe : ^icmp_echo_reply;
   pHostEn : PHostEnt;
   wVersionRequested : WORD;
   lwsaData : WSAData;
   error : DWORD;
   destAddress : In_Addr;
   i, count:integer;
   //adress : array [1..30] of pansichar;
   IPReply: string;
begin
  // Создаем handle
   hIP := IcmpCreateFile();

   GetMem( pIpe,
           sizeof(icmp_echo_reply) + sizeof(pingBuffer));
   pIpe.Data := @pingBuffer;
   pIpe.DataSize := sizeof(pingBuffer);

   wVersionRequested := MakeWord(1,1);
   error := WSAStartup(wVersionRequested,lwsaData);

  // начало цикла
pHostEn := gethostbyname(adress[i]);
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;

   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                100);

   error := GetLastError();
   if (error <> 0) then
   begin

        msg:=(adress[i]+"  N/A");
      synchronize(addstr);
        //continue;
   end else begin

   msg:=(adress[i]+"  Reply time: "+IntToStr(pIpe.RTTime)+" ms");
   synchronize(addstr);
   end;

//конец цикла
   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);

end;

end.


 
Юрий Зотов ©   (2010-07-26 08:53) [1]

with Query do
begin
 Text := "select IP from ... where ...";
 Open;
 while not EoF do
   пинг(FieldByName(IP).As...)
end;


 
linuxoid   (2010-07-26 09:07) [2]

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


 
Anatoly Podgoretsky ©   (2010-07-26 09:17) [3]

// начало цикла
//конец цикла

Здесь нет цикла.


 
linuxoid   (2010-07-26 09:31) [4]


> Здесь нет цикла.


вот и я хочу чтоб, то что там написано внутри цикла...


 
Anatoly Podgoretsky ©   (2010-07-26 10:01) [5]

> linuxoid  (26.07.2010 09:31:04)  [4]

Поскольку это поток, то там цикл не нужен. Он должен быть внешним.


 
linuxoid   (2010-07-26 10:04) [6]


> Поскольку это поток, то там цикл не нужен. Он должен быть
> внешним.


я так понял, значит цикл надо организовать здесь?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;


 
Anatoly Podgoretsky ©   (2010-07-26 10:24) [7]

> linuxoid  (26.07.2010 10:04:06)  [6]

Именно здесь и передавать параметры для пинга одного дареса в поток.


 
linuxoid   (2010-07-26 10:52) [8]


> Именно здесь и передавать параметры для пинга одного дареса
> в поток.


адреса хостов находятся у меня в базе. и их предостаточно.
мне нужно же это как-то организовать в цикле.

form1.table.Open;
while not form1.table.Eof do begin
adress:=pchar(form1.table.FieldByName("nodeip").AsString);
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;
end;

примерно так оно должно выглядить?


 
Anatoly Podgoretsky ©   (2010-07-26 11:17) [9]

> linuxoid  (26.07.2010 10:52:08)  [8]

new1.freeonterminate := true;
// вот здесь извлечение из базы и передача в поток.
new1.resume;


 
linuxoid   (2010-07-26 11:47) [10]


> // вот здесь извлечение из базы и передача в поток.


а как правильнее сделать?

с этим циклом у мения не получается...
form1.table.Open;
form1.table.First;
for i:=1 to form1.table.RecordCount do begin
adress[i]:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
form1.table.Next;
end;


 
Dennis I. Komarov ©   (2010-07-26 11:55) [11]

Ща тебя расстреляють за такое...


 
Anatoly Podgoretsky ©   (2010-07-26 12:00) [12]

А с этим циклом и не надо, ведь уже есть правильный цикл
while not form1.table.Eof do begin


 
linuxoid   (2010-07-26 12:05) [13]


> Ща тебя расстреляють за такое...

))) я в этом деле еще новичок


 
linuxoid   (2010-07-26 12:10) [14]


> А с этим циклом и не надо, ведь уже есть правильный цикл
> while not form1.table.Eof do begin


begin
form1.table.Open;
form1.table.First;
i:=1;
while not form1.table.Eof do begin
adress[i]:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
listbox1.Items.Add(adress[i]);
form1.table.Next;
end;
end;

вот примерное такое?


 
Anatoly Podgoretsky ©   (2010-07-26 12:16) [15]

> linuxoid  (26.07.2010 12:10:14)  [14]

Непонятно, что такое adress[i] и зачем оно нужно. Что тут делает PChar,
зачем данные в цикле пишутся в adress[1] - это конечно не ошибка, это просто
абсурд. Где здесь поток, куда он пропал?


 
Anatoly Podgoretsky ©   (2010-07-26 12:17) [16]

> linuxoid  (26.07.2010 12:05:13)  [13]

Не льсти себе, тебе еще до новичка далеко.


 
linuxoid   (2010-07-26 12:27) [17]

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=form1.table.Fields.FieldByName("nodeip").AsString;
form1.table.Next;
end;
new1.resume;
end;


 
linuxoid   (2010-07-26 12:28) [18]

в этом случае он пингует только один хост.


 
brother ©   (2010-07-26 12:38) [19]

где в коде вызов пинга вообще?


 
brother ©   (2010-07-26 12:40) [20]

а понял.
и где описано: adress?
как оно попадет в поток?


 
brother ©   (2010-07-26 12:41) [21]

я еще раз тебе советую: раз ты в начинающих - используй мой код на таймере сделаный...


 
linuxoid   (2010-07-26 12:46) [22]


> где в коде вызов пинга вообще?


вызываю поток.
new1.resume;


 
linuxoid   (2010-07-26 12:48) [23]


> и где описано: adress?
> как оно попадет в поток?


вот с этим мне надо разобраться


 
brother ©   (2010-07-26 12:49) [24]

я бы в конструкторе, добавил еще один параметр...


 
Anatoly Podgoretsky ©   (2010-07-26 12:51) [25]

> linuxoid  (26.07.2010 12:27:17)  [17]

Теперь все это в цикле


 
linuxoid   (2010-07-26 12:52) [26]

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=form1.table.Fields.FieldByName("nodeip").AsString;
form1.table.Next;
end;
new1.resume;
end;

здесь он передает токо один хост


 
brother ©   (2010-07-26 12:52) [27]

> Теперь все это в цикле

согласен на сабж ответили)


 
Anatoly Podgoretsky ©   (2010-07-26 12:54) [28]

> brother  (26.07.2010 12:40:20)  [20]

А также new1 и неизвестно какой form1 используется
Вот я и говорю, что до начинающих еще далеко. Пока идет бездумный перебор
кодовых кусков.


 
linuxoid   (2010-07-26 12:54) [29]


> Теперь все это в цикле


а какие должны быть параметры цикла?


 
brother ©   (2010-07-26 12:56) [30]

перекрывай конструктор TThread, добавляй еще один параметр, при создании будешь подсовывать конструктору адресс, и он будет стартовать с нужным адресом...
зы ты так и не ответил, где описана    //adress : array [1..30] of pansichar;


 
brother ©   (2010-07-26 12:56) [31]

> Вот я и говорю, что до начинающих еще далеко. Пока идет
> бездумный перебор

согласен, чет надоело уже... учи мат часть!


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [32]

> linuxoid  (26.07.2010 12:54:29)  [29]

А про какой цикл спрашиваешь?


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [33]

> brother  (26.07.2010 12:56:30)  [30]

Совсем не обязательно, можно присвоить свойству/члену без всякого
перекрытия.


 
linuxoid   (2010-07-26 13:00) [34]


> зы ты так и не ответил, где описана    //adress : array
> [1..30] of pansichar;

это я исползовал вначале, када использовал обычный цикл.


 
linuxoid   (2010-07-26 13:03) [35]


> А про какой цикл спрашиваешь?


Anatoly Podgoretsky ©   (26.07.10 12:51) [25]

> linuxoid  (26.07.2010 12:27:17)  [17]

Теперь все это в цикле


 
brother ©   (2010-07-26 13:03) [36]

> можно присвоить свойству/члену без всякого
> перекрытия.

можно, чет в "не те степи" меня прет)


 
Anatoly Podgoretsky ©   (2010-07-26 13:21) [37]

> brother  (26.07.2010 13:03:36)  [36]

Пытаешься сложно делать, а ты отнесись как к обычному классу, со своими
членами и свойтвами, я за свойство, но Линуксоид погибнет с ними, пусть
делает обычного public члена класса.


 
linuxoid   (2010-07-26 13:26) [38]


> Anatoly Podgoretsky ©   (26.07.10 13:21) [37]


но все же как мне быть с этим. как поступить с этим циклом?


 
Anatoly Podgoretsky ©   (2010-07-26 13:39) [39]

> linuxoid  (26.07.2010 13:26:38)  [38]

Тебе столько написали, что ты уже должен был сделать сразу несколькими
путями.


 
linuxoid   (2010-07-26 13:42) [40]


> Тебе столько написали, что ты уже должен был сделать сразу
> несколькими
> путями.


можете наглядный алгоритм написать. пытаюсь но что то у мя выходит


 
Anatoly Podgoretsky ©   (2010-07-26 13:52) [41]

Вроде уже в самом начале ЮЗ представил алгоритм в виде кода.

1. Проход по базе, от начала до конца;
2. Выборка ИП для пинга из базы;
3. Вызов пинга (в потоке или последовательно);
4. переход к следующей иттерации.


Каждый кусок по отдельности уже фигурировал, собирай в целое. Это запускать внутри цикла таймера.


 
linuxoid   (2010-07-26 14:11) [42]


>
> Каждый кусок по отдельности уже фигурировал, собирай в целое.
>  Это запускать внутри цикла таймера.


procedure TForm1.Timer1Timer(Sender: TObject);

begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.resume;
form1.table.Next;
end;
end;

вот собрал. но здесь он по циклу не проходит. берет только последнее значение из базы.


 
Anatoly Podgoretsky ©   (2010-07-26 14:45) [43]

> linuxoid  (26.07.2010 14:11:42)  [42]

Как будто ничего не говорили, не проходит по циклу, поскольку это у тебя вне
цикла.


 
linuxoid   (2010-07-26 14:51) [44]


>
> Как будто ничего не говорили, не проходит по циклу, поскольку
> это у тебя вне
> цикла.


а как теперь тада передать данные в поток в цикле?


 
Anatoly Podgoretsky ©   (2010-07-26 14:53) [45]

> linuxoid  (26.07.2010 14:51:44)  [44]

Поток.поле := значение
Поток.свойство := значение


 
linuxoid   (2010-07-26 15:07) [46]


> Поток.поле := значение
> Поток.свойство := значение


а как это будет в коде выглядить?


 
Dennis I. Komarov ©   (2010-07-26 15:12) [47]

new1.adrees:=Dataset.FieldByName("adress").AsString;


 
linuxoid   (2010-07-26 15:22) [48]


> > Поток.свойство := значение


какое свойство должно описываться?


 
Юрий Зотов ©   (2010-07-26 15:35) [49]


> linuxoid   (26.07.10 15:22) [48]

Может быть, прежде, чем заниматься объектно-ориентированным программированием в Delphi, есть смысл прочитать хотя бы одну книжку по нему?

Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.


 
Anatoly Podgoretsky ©   (2010-07-26 15:46) [50]

> linuxoid  (26.07.2010 15:07:46)  [46]

Так и будет выглядеть, только замени на английский


 
Anatoly Podgoretsky ©   (2010-07-26 15:47) [51]

> linuxoid  (26.07.2010 15:22:48)  [48]

Я тебе уже говорил, не лезь во свойства, тебе это тяжело, используй поля


 
sniknik ©   (2010-07-26 15:51) [52]

> Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.
и опять, почти дословно, тот же совет ему дают ... "а воз и нынче там" ;)


 
linuxoid   (2010-07-26 16:02) [53]

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
form1.table.Next;
end;
end;

вот попробовал сделать так. работает около 5 минит затем выскакивает сообщение с ошибкой "access violation at address 06783007 in module "bordbk70.dll". read of address 0b880000";


 
Dennis I. Komarov ©   (2010-07-26 16:11) [54]


> linuxoid   (26.07.10 16:02) [53]

Значит у тебя ошибка в программе...


 
linuxoid   (2010-07-26 16:32) [55]


> > linuxoid   (26.07.10 16:02) [53]
>
> Значит у тебя ошибка в программе...


а какая может быть ошибка и тем более возникает через минут 5?


 
Юрий Зотов ©   (2010-07-26 16:35) [56]

Это срабатывает внутренний таймер VCL.


 
linuxoid   (2010-07-26 16:39) [57]

чтобы исправить эту ошибку нужно что-то дописать или в коде исправить какие то моменты?


 
Dennis I. Komarov ©   (2010-07-26 17:14) [58]

Чтобы работать с потоками надо понимать их... а ты пишешь не понимая того, что пишешь...


 
Anatoly Podgoretsky ©   (2010-07-26 20:18) [59]


> linuxoid   (26.07.10 16:02) [53]

Тебя уже спрашивали про эти странные переменные

form1
new1

Ты же никаких выводов из этого не сделал.


 
linuxoid   (2010-07-27 08:23) [60]

вот два листинга программы.

main

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, thrd, DB, ADODB, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   conn: TADOConnection;
   table: TADOTable;
   tablenodeid: TAutoIncField;
   tableparentid: TIntegerField;
   tablenodename: TWideStringField;
   tablenodetype: TIntegerField;
   tablenodeip: TWideStringField;
   tablenodeother: TWideStringField;
   Timer1: TTimer;
   ListBox1: TListBox;
   dstable: TDataSource;
   Button2: TButton;

   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
 new1:TThreadScan;
 hThread:array of array of Cardinal;

   { Public declarations }
 end;

var
 Form1: TForm1;

   //adress: array [1..30] of pansichar;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
table.Open;
table.First;
while not form1.table.Eof do begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
table.Next;
end;
end;
end.


 
linuxoid   (2010-07-27 08:26) [61]

это второй листинг.
thrd

unit thrd;

interface

uses
 Windows,  SysUtils,  Classes,
 StdCtrls, winsock;

type
 TThreadScan = class(TThread)
 adress: string;
 private

 msg: string;
 procedure addstr;
   { Private declarations }
 protected
   procedure Execute; override;
 end;

 type
   ip_option_information = packed record
       Ttl : byte;  
       Tos : byte;  
       Flags : byte;  
       OptionsSize : byte;  
       OptionsData : Pointer;
   end;

  icmp_echo_reply = packed record
       Address : u_long;      
       Status : u_long;      
       RTTime : u_long;      
           
       DataSize : u_short;        
       Reserved : u_short;      
       Data : Pointer;    
       Options : ip_option_information;
   end;

   PIPINFO = ^ip_option_information;
   PVOID = Pointer;

       function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
       function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL"  name "IcmpCloseHandle";
       function IcmpSendEcho(
                         IcmpHandle : THandle;    
                         DestAddress : u_long;    
                         RequestData : PVOID;    
                         RequestSize : Word;      
                         RequestOptns : PIPINFO;  
                                           
                         ReplyBuffer : PVOID;  
                         ReplySize : DWORD;      
                         Timeout : DWORD          
                        ) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";

implementation

uses Unit1;

procedure TThreadScan.addstr;
begin
Form1.ListBox1.Items.Add(msg);
end;

procedure TThreadScan.Execute;
var
  hIP : THandle;
   pingBuffer : array [0..31] of Char;
   pIpe : ^icmp_echo_reply;
   pHostEn : PHostEnt;
   wVersionRequested : WORD;
   lwsaData : WSAData;
   error : DWORD;
   destAddress : In_Addr;
    i:integer;
   IPReply: string;

begin
  // &#209;&#238;&#231;&#228;&#224;&#229;&#236; handle
   hIP := IcmpCreateFile();

   GetMem( pIpe,
           sizeof(icmp_echo_reply) + sizeof(pingBuffer));
   pIpe.Data := @pingBuffer;
   pIpe.DataSize := sizeof(pingBuffer);

   wVersionRequested := MakeWord(1,1);
   error := WSAStartup(wVersionRequested,lwsaData);

pHostEn := gethostbyname(pchar(adress));
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;

   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                100);

   error := GetLastError();
    IPReply:=("Reply from "+
                IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
               IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
               IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
               IntToStr(HiByte(HiWord(pIpe^.Address))));
   if (error <> 0) then
   begin
     
        msg:=(IPReply+"  N/A");
       synchronize(addstr);
        exit;
   end;

   msg:=(IPReply+"Reply time: "+IntToStr(pIpe.RTTime)+" ms");
   synchronize(addstr);

   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);

end;

end.


 
Dennis I. Komarov ©   (2010-07-27 15:43) [62]


> вот два листинга программы.

и нафига они нам?


> procedure TThreadScan.addstr;
> begin
> Form1.ListBox1.Items.Add(msg);
> end;

И откуда такое чудо вычитано?


 
Плохиш ©   (2010-07-28 01:17) [63]


> linuxoid   (27.07.10 08:23) [60]
>
> вот два листинга программы.

Не вижу листингов, только маразматические испражнения...


 
Германн ©   (2010-07-28 01:50) [64]


> Плохиш ©   (28.07.10 01:17) [63]
>
>

Я уже давно плюнул на эти испражнения.


 
Anatoly Podgoretsky ©   (2010-07-28 08:38) [65]

> Плохиш  (28.07.2010 01:17:03)  [63]

А нафига тебе листинги без вопросов?



Страницы: 1 2 вся ветка

Текущий архив: 2010.10.24;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.008 c
2-1280900619
adminwik
2010-08-04 09:43
2010.10.24
Помогите составить алгоритм!


15-1279534576
azlk
2010-07-19 14:16
2010.10.24
установка неизвестного устройства


2-1280818376
12
2010-08-03 10:52
2010.10.24
delphi - oracle - null параметр


2-1280382192
mm0
2010-07-29 09:43
2010.10.24
Выпадающий список как в google в строке поиска


15-1279139379
Юрий
2010-07-15 00:29
2010.10.24
С днем рождения ! 15 июля 2010 четверг