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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2011, 01:23   #1
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию как прописать функцию?

Подскажите, пожалуйста.

нужно Ip преобразовать в число. Нашёл образец, как его преобразовывать(кажется, вот отсюда), вставил в виде функции в свою программу.
Задача - как в программе теперь подставить в значение прокси-порта это число?

вот код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ComCtrls, ToolWin, ImgList, WinInet, urlmon,   ComObj,
  NMICMP, Math, StrUtils;

type
  TForm1 = class(TForm)
    wb1: TWebBrowser;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    cbb1: TComboBox;
    cbb2: TComboBox;
    cbb3: TComboBox;
    btn2: TButton;
    clbr1: TCoolBar;
    tlb1: TToolBar;
    btn3: TToolButton;
    btn4: TToolButton;
    btn5: TToolButton;
    btn6: TToolButton;
    btn7: TToolButton;
    dlgOpen1: TOpenDialog;
    stat1: TStatusBar;
    il1: TImageList;
    cbb4: TComboBox;
    pb1: TProgressBar;
    btn1: TButton;
    nmpng1: TNMPing;
    procedure cbb4KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    procedure wb1StatusTextChange(Sender: TObject; const Text: WideString);
    procedure wb1ProgressChange(Sender: TObject; Progress,
      ProgressMax: Integer);
    procedure btn1Click(Sender: TObject);
    

   
    
  private
    function IP2HEX(OrgIP:string):string;
   
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

....

procedure proxy_go(proxy: AnsiString);
var proxy_info : PInternetProxyInfo;
begin
New (proxy_info);
proxy_info^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
proxy_info^.lpszProxy := PAnsiChar(proxy);
proxy_info^.lpszProxyBypass := PAnsiChar('');
UrlMkSetSessionOption(INTERNET_OPTION_PROXY, proxy_info, SizeOf(Internet_Proxy_Info), 0);
Dispose(proxy_info);
end;



 procedure TForm1.btn1Click(Sender: TObject); /////ïåðåõîäèò íà ñàéò ÷åðåç ïðîêñè ïî ê íàæàòèþ
 var                                          /////читает список прокси-серверов из экселя.
 Excel: variant;
 i, pg,  port:Integer;
 ip: AnsiString;
begin
 Excel := CreateOleobject('Excel.Application');
 Excel.Workbooks.open('C:\Program Files\hen\proxy_list.xls');
 Excel.Visible := False;
 pg:=100;
  for i := 1 to 649 do            //в экселе 649 строк с адресами прокси
  begin
     if StrToInt(Excel.Sheets[1].Cells[i,3].Text) < pg then
     begin
     pg :=strtoint (Excel.Sheets[1].Cells[i, 3].Text);
    // ip:=StrToInt());
     //lbl2.Caption:=(IP2HEX());                  /////////вот в этом месте пытаюсь в лейбл вывести преобразованный айпишник.
     port := StrToInt(Excel.Sheets[1].Cells[i, 2].Text);

     end;
  end;
 Excel.quit;
 Excel := Unassigned;
 proxy_go('ip:port');             ///а здесь нужно вместо переменной IP подставить значение, которое вычислила функция IP2HEX
 WB1.Navigate('http://ip-whois.net/ip.php');
 end;
////////////////////////////////////////
////преобразовываем айпишник////
////////////////////////////////////////
function TForm1.IP2HEX(OrgIP:string):string;
var
  // Ñîõðàíÿåì îðèãèíàëüíîå çíà÷åíèå IP àäðåñà
  OrgVal: string;
  // ÷àñòè îðèãèíàëüíîãî IP
  O1,O2,O3,O4: string;
  // øåñòíàäöàòèðè÷íûå ÷àñòè
  H1,H2,H3,H4: string;
  // Çäåñü áóäóò ñîáðàíû âñå øåñòíàäöàòèðè÷íûå ÷àñòè
  HexIP: string;
  XN: array[1..8] of Extended;
  Flt1: Extended;
  Xc: Integer;
begin

  // Ñîõðàíÿåì â îáðàòíîì ïîðÿäêå äëÿ ïðîñòîãî ñëó÷àÿ
  Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);
  Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);

  // Ñîõðàíÿåì îðèãèíàëüíûé IP àäðåñ
  OrgVal:=OrgIP;
  O1:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O2:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O3:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O4:=OrgVal;

  H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);
  H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);

  // Ïîëó÷àåì øåñòíàäöàòèðè÷íîå çíà÷åíèå IP àäðåñà
  HexIP:=H1+H2+H3+H4;

  // Ïðåîáðàçóåì ýòî áîëüøîå øåñòíàäöàòèðè÷íîå çíà÷åíèå â ïåðåìåííóþ Float
  Flt1:=0;

  for Xc:=1 to 8 do
  begin
    case HexIP[Xc] of
      '0'..'9': Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);
      'A': Flt1:=Flt1+(10*Xn[Xc]);
      'B': Flt1:=Flt1+(11*Xn[Xc]);
      'C': Flt1:=Flt1+(12*Xn[Xc]);
      'D': Flt1:=Flt1+(13*Xn[Xc]);
      'E': Flt1:=Flt1+(14*Xn[Xc]);
      'F': Flt1:=Flt1+(15*Xn[Xc]);
    end;
  end;
  Result:=FloatToStr(Flt1);
end;

end.

Последний раз редактировалось voverrr; 25.08.2011 в 01:26.
voverrr вне форума Ответить с цитированием
Старый 25.08.2011, 01:40   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
нужно Ip преобразовать в число.
Собственно а зачем?

Код:
     pg :=strtoint (Excel.Sheets[1].Cells[i, 3].Text);
    // ip:=StrToInt());
     //lbl2.Caption:=(IP2HEX());                  /////////вот в этом месте пытаюсь в лейбл вывести преобразованный айпишник.
     port := StrToInt(Excel.Sheets[1].Cells[i, 2].Text);

     end;
  end;
 Excel.quit;
 Excel := Unassigned;
 proxy_go('ip:port');             ///а здесь нужно вместо переменной IP подставить значение, которое вычислила функция IP2HEX
 WB1.Navigate('http://ip-whois.net/ip.php');
а можно пример исходных данных из вашего файла?
Что там закодированый IP, что нужно столько бредятины делать при помоши IP2HEX?

Мне кажется все на много проще, чемвы думаете...


________

А ошибки у вас вот какие:
Код:
....

procedure proxy_go(proxy: AnsiString);
var proxy_info : PInternetProxyInfo;
begin
New (proxy_info);
proxy_info^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
proxy_info^.lpszProxy := PAnsiChar(proxy);
proxy_info^.lpszProxyBypass := PAnsiChar('');
UrlMkSetSessionOption(INTERNET_OPTION_PROXY, proxy_info, SizeOf(Internet_Proxy_Info), 0);
Dispose(proxy_info);
end;



 procedure TForm1.btn1Click(Sender: TObject); /////ïåðåõîäèò íà ñàéò ÷åðåç ïðîêñè ïî ê íàæàòèþ
 var                                          /////читает список прокси-серверов из экселя.
 Excel: variant;
 i, pg,  port:Integer;
 ip: AnsiString;
begin
 Excel := CreateOleobject('Excel.Application');
 Excel.Workbooks.open('C:\Program Files\hen\proxy_list.xls');
 Excel.Visible := False;
 pg:=100;
  for i := 1 to 649 do            //в экселе 649 строк с адресами прокси
  begin
     if StrToInt(Excel.Sheets[1].Cells[i,3].Text) < pg then
     begin
     pg :=strtoint (Excel.Sheets[1].Cells[i, 3].Text);
    // ip:=StrToInt());
     //lbl2.Caption:=(IP2HEX(<Входной параметр не задан>));                  //вот в этом месте пытаюсь в лейбл вывести преобразованный айпишник.
     port := StrToInt(Excel.Sheets[1].Cells[i, 2].Text);

     end;
  end;
 Excel.quit;
 Excel := Unassigned;
 proxy_go(IP2HEX(<Входной параметр не задан>+':'+IntToStr(Port));
 WB1.Navigate('http://ip-whois.net/ip.php');
 end;
////////////////////////////////////////
////преобразовываем айпишник////
////////////////////////////////////////
function TForm1.IP2HEX(OrgIP:string):string;
var
  // Ñîõðàíÿåì îðèãèíàëüíîå çíà÷åíèå IP àäðåñà
  OrgVal: string;
  // ÷àñòè îðèãèíàëüíîãî IP
  O1,O2,O3,O4: string;
  // øåñòíàäöàòèðè÷íûå ÷àñòè
  H1,H2,H3,H4: string;
  // Çäåñü áóäóò ñîáðàíû âñå øåñòíàäöàòèðè÷íûå ÷àñòè
  HexIP: string;
  XN: array[1..8] of Extended;
  Flt1: Extended;
  Xc: Integer;
begin

  // Ñîõðàíÿåì â îáðàòíîì ïîðÿäêå äëÿ ïðîñòîãî ñëó÷àÿ
  Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);
  Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);

  // Ñîõðàíÿåì îðèãèíàëüíûé IP àäðåñ
  OrgVal:=OrgIP;
  O1:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O2:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O3:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
  O4:=OrgVal;

  H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);
  H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);

  // Ïîëó÷àåì øåñòíàäöàòèðè÷íîå çíà÷åíèå IP àäðåñà
  HexIP:=H1+H2+H3+H4;

  // Ïðåîáðàçóåì ýòî áîëüøîå øåñòíàäöàòèðè÷íîå çíà÷åíèå â ïåðåìåííóþ Float
  Flt1:=0;

  for Xc:=1 to 8 do
  begin
    case HexIP[Xc] of
      '0'..'9': Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);
      'A': Flt1:=Flt1+(10*Xn[Xc]);
      'B': Flt1:=Flt1+(11*Xn[Xc]);
      'C': Flt1:=Flt1+(12*Xn[Xc]);
      'D': Flt1:=Flt1+(13*Xn[Xc]);
      'E': Flt1:=Flt1+(14*Xn[Xc]);
      'F': Flt1:=Flt1+(15*Xn[Xc]);
    end;
  end;
  Result:=FloatToStr(Flt1);
end;

end.

Последний раз редактировалось Человек_Борща; 25.08.2011 в 01:52.
Человек_Борща вне форума Ответить с цитированием
Старый 25.08.2011, 21:13   #3
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

О_о
спасибо за подсказку! Сейчас сяду разбираться.

Что там закодированый IP


не, не особенно закодированный. Идея в том, чтобы при каждом обновлении страницы(переходе)браузер выбирал бы новый айпишник из списка и переподключался бы через него.
Айпишник я просто снaчала пытался присвоить переменной 'ip', а когда это не получилось - начал пробовать вывести в лейбл хотя бы его значение. Это тоже не вышло. Насколько я понял - тип переменной для айпишника должен быть AnsiString. Соответственно, и у функции IP2HEXвыходной параметр тоже должен быть AnsiString. Там же прописан просто :string.

Тут у меня в шапке его ещё комбобоксы с выбором сайта-логина-пароля, но это я уж сам догоню(надеюсь как-нибудь).

В списке айпишников 650штук. Предварительно они пингуются и сортируются по времени, начиная от самых быстрооткликающихся. Эти операции выполняются в другом приложении, здесь я его не привожу. Получается список экселевский из трёх колонок - айпи, порт, пинг. Затем определяется диапазон, у которых время отклика не длиннее 100(например) мс и из этого диапазона выбирается случайным образом один, по которому и подключаемся. При обновлении/переходе страницы выбирается другой, и т.д.

вот комикс я нарисовал - что там должно происходить.


в архиве экселевский файл: он должен быть расположен по адресу C->program files->Hen->Proxy_list.xls
Адрес http://ip-whois.net/ip.php я прописал тут чтобы было сразу видно, подключается ли браузер напрямую или же через прокси(т.е. заработала ли программа).
Вложения
Тип файла: rar браузер.rar (27.4 Кб, 9 просмотров)

Последний раз редактировалось voverrr; 25.08.2011 в 21:20.
voverrr вне форума Ответить с цитированием
Старый 25.08.2011, 21:20   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
C->program files->Hen->Proxy_list.xls
1)помочь совершенно не могу, у меня нет диска С.
вывод, относительные/относительно-абсолютные пути всегда лучше(а если привязаны к другой программе то стоит где то сохранять её местоположение(Application Data, реестр) чтоб можно было её найти, ну и на крайняк сделать выбор этого файла)
2)я так полагаю используете ActiveX Excel? тогда тоже не могу помочь.
вывод: почему бы свой формат не использовать? или же банальный csv(помоему то расширение написал, формат в который Excel умеет экспортировать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 21:36   #5
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

да я вроде её для личного пользования делаю, так что думаю, что один-да пути пока что пропишу в тексте программы, а то если ещё и с относительными путями разбираться - то погрязну вовсе. Как видите, с дельфи только-только разбираюсь, поэтому иду путём таким: написать хоть как по-индусски, чтобы работало, а затем уже смотреть, что тут можно улучшить.
Если нет диска Цэ, можно разместить на Дэ или на каком есть, только в строке 141 поменять надо буковку.

2)я так полагаю используете ActiveX Excel?
))))

Такие вопросы задаёте, что не удобно отвечать. Даже. (с)

а чччорт иво знает. Не дошёл ещё до изучения этого))
voverrr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать указатель на функцию в функцию WIN32APIist Общие вопросы C/C++ 1 27.01.2011 10:35
Как прописать условие? bwitcher Помощь студентам 7 18.12.2010 01:02
Как прописать программу Miha85193 Общие вопросы Delphi 6 12.07.2010 00:24
Где и как прописать функцию а имменно subbota Помощь студентам 1 28.07.2009 20:47
подскажите как прописать alexs2141 Помощь студентам 6 03.06.2008 14:32