Wysyłanie danych do formularza z poziomu delphi.

0

Witam, chciałbym zrobić program który by wysyłał dane do formularza na mojej stronie internetowej, ale nie wiem jak się do tego zabrać.

Na razie trafiłem tylko na coś takiego:

var
  PostDataStream : TStringStream; //zwracane wartości
  ParamData : TStringStream; //wysyłane zapytanie
begin
  PostDataStream := TStringStream.Create;
  ParamData := TStringStream.Create;
  ParamData.WriteString('action=create');
  ParamData.WriteString('&tresc=' + Memo1.Lines.Text);
  ParamData.WriteString('&tresc2='+tresc2);
  try
    http1.Post('http://strona.pl/1.php', ParamData, PostDataStream);
  finally
    ParamData.Free;
    PostDataStream.Free;
  end;
end;

Proszę o pomoc.

0

podaj może stronę tę i będzie prościej, a przy okazji ktoś ci może poda nazwy tych pól, formularzy (czyli w kodzie strony "name"), może gotowca dostaniesz, bo to prosta rzecz, zresztą mniej więcej kod już masz, trochę zmienisz go i w Memo najwyżej wyświetlisz odpowiedź serwera

0

Ja chcę połączyć się z własną stroną i swoim formularzem.

Mam teraz inny problem, mianowicie dodałem do Formy komponent IdHTTP ale i tak pokazuje mi błąd że nie znaleziono TidHTTP i IdHTTP i kilka innych.
Kod jaki wpisałem to tylko to:

unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdHTTP.Post(?http://adres.www/index.php?, Stream_in, Stream_out);
end;

end.
0

Co chcesz w ogóle wysłać to ma być GET czy POST? Nie wiedząc co to za strona nikt nie napisze Ci więcej poza podobnym przykładem do tego który sam już znalazłeś. Błędy o których piszesz są oczywiste przecież z tego co widzę dziwnie nie masz w uses IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP a przecież Delphi dodaje gdy się dodaje komponent.

0

Oczywiście POST. A co do strony to "http://agent-pendrive.c0.pl/plik.php". Ale mam problem może ze skryptem PHP, może w Delphi.

Kod delphi:

unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTP: TIdHTTP;
    btnSend: TButton;
    memHTML: TMemo;
    edt1: TEdit;
    procedure btnSendClick(Sender: TObject);
    procedure IdHTTPConnected(Sender: TObject);
    procedure IdHTTPDisconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnSendClick(Sender: TObject);
var
  StreamIn, StreamOut : TStringStream;
begin
  IdHTTP.Request.Host := 'agent-pendrive.c0.pl';
  StreamIn := TStringStream.Create('');
  StreamOut := TStringStream.Create('');
  try
    StreamIn.WriteString(Format('imie=%s', [edt1.Text]));
    IdHTTP.Post('http://agent-pendrive.c0.pl/plik.php', StreamIn, StreamOut);
    memHTML.Lines.Text := PChar(StreamOut.DataString);
  finally
    StreamIn.Free;
    StreamOut.Free;
  end;
end;

procedure TForm1.IdHTTPConnected(Sender: TObject);
begin
  ShowMessage('Connected!');
end;

procedure TForm1.IdHTTPDisconnected(Sender: TObject);
begin
  ShowMessage('Disonnected!');
end;

end.

A tutaj skrypt PHP:

<?php
  echo 'Cześć, ', $_POST['imie'];
?>
<style type="text/css">/*<![CDATA[ */
.cbalink {
display:none;
}
/*]]>*/</style> 

Otóż, gdy włączam program i wpisuje to co chcę wysłać w parametrze imie, to w zwracanym kodzie nie pisze mi to co wpisałem w cześniej, tylko samo "Cześć, "

0

napisz porządnie skrypt na stronie i zdecyduj się jak ma przyjmować dane, czy to ma być method POST, czy GET. Tak w ogóle to w google wpisz coś w stylu: php formularz
i sobie przejrzyj kilka stron, jak nic ciekawego nie będzie to wpisz w google php formularz tutorial (lub zamiast słowa tutorial użyj słowa artykuł)...
na pewno coś znajdziesz

i później w tym skrypcie php na stronie ustaw se dla pewności widoczne pola do wypełnienia i przycisk "wyślij" i zapamiętaj nazwy tych wszystkich pól, czyli ich "name", żeby w delphi później wklepać te nazwy.
A mają porządny formularz na stronie, to sobie od razu bez użycia delphi przetestujesz, czy działa idealnie, czy nie. Dopiero jak upewnisz się, że na 100% wszystko działa dobrze, to próbuj w delphi to zrobić. Ogólnie jak zamierzasz kiedyś formularze kontaktowe robić, czy inne bajery, to wybierz metodę POST, a jak chcesz by do strony trafiało coś przez słowa w adresie to wybierz GET i wtedy w adresie strony wpiszesz se imię np. http://4programmers.net/Szukaj?q=Marian a w delphi nazwą pola (czyli zmienną) będzie w tym przypadku litera q. W metodzie POST wygląda to inaczej, w adresie nie ma żadnych słówek widocznych, są przekazywane inaczej.

Także google i przeczytaj krutki artykulik obu metod, zrób sobie coś w obu dla zyskania doświadczenia i wtedy w delphi się baw.

0

Przepraszam, tak POST. Mały błąd bo sprawdzałem czy GET zadziała i skopiowałem kod z GET.
A więc tak, z GET wszystko jest git, ale z POST dane nie dochodzą, albo ja coś źle napisałem. Może ktoś wie o co chodzi że te dane nie dochodzą?

P.S.

print_r($_POST);

Zwraca:

Array
(
)
2

Zapomniałeś o:

IdHTTP.Request.ContentType:= 'application/x-www-form-urlencoded';
0

Dzięki wielkie, mam jeszcze pytanie. Jak zrobić aby program wyciągał tekst od jakiegoś znaku do znaku. Np.

<NIEKOPIOWANE>[KOPIOWANE]<NIEKOPIOWANE>

Ale chciałbym aby kopiowanie zaczynało się od jakiego znaku i kończyło też na jakimś(np. "[" i "]"), z tym że, pomijało by je na końcu w wyniku.

0

Wyrażenia regularne. Zależy jaka wersja Delphi nowsze mają wbudowany moduł od ich obsługi. W starszych można użyć: http://regexpstudio.com/TRegExpr/TRegExpr.html.
Oczywiście można też bawić się w funkcje Pos, PosEx, Copy ale dużo z tym zabawy jak jest dużo tekstu do wyciągania.

0

Właśnie o nich czytałem w artykułach, ale jak wyobraziłem to sobie, aż mnie przytkało. A będzie to działało z RAD Studio XE3?

0

A jak skonfigurować to aby kopiował tekst od znaku "[" do "]" :

var
  RegEx: TRegEx;
  Match: TMatch;
  HTML: string;
begin
  HTML:= Memo1.Text;
  RegEx:= TRegEx.Create('<span class="FormFieldError" >(?<moje>[^<]+)</span>', //zakładam ze w tekscie ktory ma byc wyciagniety nie ma znaku <
    [roIgnoreCase,roMultiLine]);
  Match:= RegEx.Match(HTML);
  if Match.Success then
    ShowMessage(Match.Groups['moje'].Value);
end;

Jest to kod napisany przez Ciebie na forum.

0

W starszych wersjach działa z użyciem zewnętrznego modułu do którego podałem link (nie wiem czy w nowszych też zadziała ale pewnie tak):

uses RegExpr;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegExp: TRegExpr;
begin
  RegExp:= TRegExpr.Create;
  try
  RegExp.Expression:= '\[([^\]]+)\]';
  if RegExp.Exec(Memo1.Text) then
  repeat
    Memo2.Lines.Add(RegExp.Match[1]);
  until not RegExp.ExecNext;
  finally
  RegExp.Free;
  end;
end;

Jednak po co dodatkowy zewnętrzny moduł skoro jest w Delphi:

uses RegularExpressionsCore;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegExp: TPerlRegEx;
begin
  RegExp:= TPerlRegEx.Create;
  try
  RegExp.RegEx:= '\[([^\]]+)\]';
  RegExp.Subject:= Memo1.Text;
  if RegExp.Match then
  repeat
    Memo2.Lines.Add(RegExp.Groups[1]);
  until not RegExp.MatchAgain;
  finally
  RegExp.Free;
  end;
end;

EDIT// To miało być ze znakami [ ] włącznie bo ja zrobiłem pomiędzy.

Wszystko działa na zasadzie ([] ]+) oznacza wszystkie znaki z wyjątkiem ] (] jest znakiem specjalnym dlatego trzeba poprzedzić go ) jak łatwio się domyślić aby parsować wszystko pomiędzy > a < wyrażenie ma mieć postać >([<]+)<

1

Zakładając, że na stronie masz ładnie wyróżnione teksty np.

<start>jakiś tekst do wyciągnięcia</stop>

czyli chcesz wyciągnąć z tego tekst ze środka, to można to zrobić łatwo funkcjami jak Pos, Copy, Delete i PosEX (nie trzeba PosEX używać wcale, ale można).

I za pomocą tych funkcji można na różne sposoby wyciągać dane z tego tekstu. Do zmiennej typu String ładujesz kod źródłowy strony i później przeszukujesz ten string funkcją Pos, ta funkcja wskaże ci numerek, że np. tekst, który chcesz wyciągnąć zaczyna się od 123-ego znaku, a drugi pos dla innego tagu, czyli np. </stop> powie ci, że tekst kończy się w np. 137 znaku i mając te dwie informacje możesz wyciągnąć tekst funkcją Copy. Możesz wtedy wywalić tekst od znaku 1 do miejsca drugiego tagu funkcją Delete i wtedy szukasz kolejnego tekstu do wyciągnięcia i tak w pętli robisz dużo razy, aż zostanie spełniony warunek, że w kodzie strony (czyli w tej zmiennej string) już nie istnieje żaden tag <start> lub </stop>, którego chciałeś i wtedy pętla się przerywa i robisz co chcesz z wydobytymi tekstami.

Można to wszystko zrobić funkcją PosEX, to byłby drugi sposób tej samej rzeczy, pewnie jest jeszcze kilka innych sposobów. A teraz po prostu zobacz w google przykład użycia funkcji danej i przećwicz to w delphi w nowym projekcie.

Napisałem ci edukacyjny kodzik mały. Przykładowo na formę wstaw jeden Button, kliknij na nim dwa razy i zrób tak, by kod wyglądał tak:

procedure TForm1.Button1Click(Sender: TObject);
var
  dlugi_tekst, wydobyty_tekst: String;
  pozycja1, pozycja2: Integer;
  tag1, tag2: String;
begin
  dlugi_tekst:= 'Była sobie śnieżka bla bla <start>Tekst do wyciągnięcia!</stop> bla bla coś tam dalej.';
  tag1:= '<start>';
  tag2:= '</stop>';

  {a niżej szukanie tekstu tego w tagach}
  pozycja1:= Pos(tag1, dlugi_tekst); //pozycja1 będzie miala wartość 28, czyli od 28 znaku zaczyna się tekst
  pozycja2:= Pos(tag2, dlugi_tekst); //a tu zmienna pozycja2 będzie miała jakąś większą wartość

  wydobyty_tekst:= Copy(dlugi_tekst, pozycja1 + Length(tag1), pozycja2 - pozycja1 - Length(tag1)); {kopiuje tekst ze zmiennej dlugi_tekst i wkleja do zmiennej wydobyty_tekst}
  Form1.Caption:= wydobyty_tekst; //wyświetli wyciągnięty tekst w pasku tytułowym programu
end;

Wiesz po co dodane jest to Length? Jest to funkcja, która zwraca długość stringa itd, czyli mówi nam, że np. słowo Basia ma 5 znaków. Możesz wywalić z kodu te fragmenty jak:

  • Length(tag1)
    oraz
  • Length(tag1)

i zobaczysz sobie co program wyświetli w pasku tytułowym, w jednym miejscu do wydobytego tekstu doda tag, bo trzeba brać pod uwagę, że funkcja Pos wskazując np. na tag <ewsfesdfgverwsdfewsfw> pokaże jego początek pozycji np. 1, a nie ostatnią literę, czyli dalszy numerek, dlatego trzeba dodawać coś lub odejmować. Sprawdź se ten przykład gotowy, a później baw się bardziej. Może nauczysz się wyciągać ze stron różne rzeczy. Ja funkcją Pos itd wyciągałem czasem wszystkie linki ze strony zaczynające się od href=" i kończące na znaku ". Różne rzeczy można.

0

Hahhaha, dzięki wielkie! To naprawdę było łatwę, dzięki jeszcze za bardzo dobry przykład i łatwe wytłumaczenie!

0

A mam, jeszcze mały problem, ucina mi ostatnią literkę np.

echo '<ap_data>check_update=v01.06.01</ap_data>';

i dostaję check_update=v01.06.0

Kod z delphi:

    Token1 := '<ap_data>';
    Token2 := '</ap_data>';
    Pos1:= Pos(Token1, PChar(StreamOut.DataString));
    Pos2:= Pos(Token2, PChar(StreamOut.DataString));
    Writeln(Copy(PChar(StreamOut.DataString), Pos1 + Length(Token1), Pos2 - Pos1 - Length(Token2)));

Kod PHP:

<?php
print_r($_POST);
if ($_POST['product'] == 'Agent_PenDrive')
{
  if ($_POST['password'] == 'apd_2013')
  {
    if ($_POST['version'] == 'v01.06.xx')
    {
      if ($_POST['section'] == 'boot')
      {
      }
      if ($_POST['section'] == 'kernel')
      {
      }
      if ($_POST['section'] == 'system')
      {
        if ($_POST['module'] == 'updater')
        {
          if ($_POST['function'] == 'check_update')
          {
            echo '<ap_data>check_update=v01.06.01</ap_data>';
          }
        }
      }
    }
  } else echo 'Unauthorised acces!';
}
?>
<style type="text/css">/*<![CDATA[ */
.cbalink {
display:none;
}
/*]]>*/</style>

Zwracany kod:

Array
(
    [product] => Agent_PenDrive
    [password] => apd_2013
    [version] => v01.06.xx
    [section] => system
    [module] => updater
    [function] => check_update
    [function2] => 
    [function3] => 
    [function4] => 
    [function5] => 
)
<ap_data>check_update=v01.06.01</ap_data><style type="text/css">/*<![CDATA[ */
.cbalink {
display:none;
}
/*]]>*/</style><!-- cba <!--]>--><div style="text-align:center;font-size:11px" class="cbalink"><a rel="nofollow" href="http://www.cba.pl/" title="darmowy hosting">Darmowy Hosting</a> CBA.PL<br/><br/></div>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
<script type="text/javascript">
_uacct = "UA-2289508-3";
urchinTracker();
</script>
<!-- (C) 2000-2009 Gemius SA - gemiusAudience / ver 11.1 / pp.cba.pl / podstrony-->
<script type="text/javascript">
 <!--//--><![CDATA[//><!--
var pp_gemius_identifier ="p9.lpfe6LVht.FvD5q6cb8Pc7Mq_YOxZNwdcvPdYR1n.u7";
//--><!]]>
</script>
<script type="text/javascript" src="http://gapl.hit.gemius.pl/xgemius.js"></script>
<script type="text/javascript" src="http://a.cba.pl/r1.js"></script>
<script type="text/javascript" charset="utf-8" src="http://go.evolutionmedia.bbelements.com/bb/bb_one2n.js"></script>
<script type="text/javascript">/* <![CDATA[ */ 
if (ok) bmone2n.addPosition("17490.1.1.1","");
if (ok) bmone2n.getAd("go.evolutionmedia.bbelements.com","",""+(typeof(bburlparam)=="string"?"&"+bburlparam:""),"utf-8");
/* ]]> */</script>
<div id="bmone2t-17490.1.1.1" style="display:none"><script type="text/javascript">/* <![CDATA[ */ if (ok) bmone2n.makeAd("17490.1.1.1"); /* ]]> */</script></div>
<script type="text/javascript">/* <![CDATA[ */ if (ok) bmone2n.moveAd(); /* ]]> */</script>
</body><!-->
2

Co do wyrażeń regularnych, to ja się nauczyłem, że dla dowolnego tekstu, o dowolnej długości, ale przynajmniej jednym znaku, stosuje zawsze wyrażenie (.+?). Natomiast co do szybkiego wycięcią treści z pomiędzy dwóch znaczników stosuje taka funkcję, jak poniżej wkleiłem. Kiedyś pokazał mi to @Misiekd, w kodzie dla mnie. A że On jest o wiele bardziej doświadczonym programistą, również w Delphi - to nie wnikam tylko się trzymam takiego rozwiązania jeżeli potrzebuję.

Możesz też sobie łatwo przekształcić tę funkcję tak, aby zwracała Tobie jako parametr na przykład pozycję ostatniego znacznika + długośc jego tekstu. Wtedy łatwo sobie możesz parsować kod html usuwając poprzedni tekst. Co może się przydać na przykład gdy kiedyś będziesz pisać w WinAPI albo kiedy nie chcesz używać dodatkowych modułów. Wiadomo, RegExpr to najwygodniejsze rozwiązanie. Jednak czasami do prostego zastosowania może być to jak używanie TWebBrowser gdzie spokojnie można Indy / Synapse / SimpleTcp. Czyli polowanie z armatą na muchy ;)

function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
  B, E : integer;
begin
  Result := '';
  if StrBegin = '' then
  begin
    B := 1;
  end
  else
  begin
    B := Pos(StrBegin, Str);
  end;
  if B > 0 then
  begin
    Str := Copy(Str, B + Length(StrBegin), MaxInt);
    if StrEnd = '' then
    begin
      E := Length(Str) + 1;
    end
    else
    begin
      E := Pos(StrEnd, Str);
    end;
    if E > 0 then
    begin
      Result := Copy(Str, 1, E - 1);
    end;
  end;
end;

Przykład użycia (oczywiście dowolny parametr może być też zmienną typu string:

  Memo1.Text := SimpleParse('<ap_data>', '</ap_data>', '<ap_data>JAKIŚ TEKST</ap_data>');
0

Dzięki wielkie! Nic nie ucina i łatwe w "obsłudze". Poprzedni przykład też dobry, ale niestety jak dwa tokeny/tagi był do siebie podobne, to ucinał ostatnią literkę.

A wie ktoś jak podesłać dane Login i Hasło do gotowego formularza(http://site.agent-pendrive.c0.pl/login.php)?

1
procedure TForm1.IdHTTPHelpRedirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod);
begin
  VMethod:= Id_HTTPMethodGet;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  BASE_URL = 'http://site.agent-pendrive.c0.pl/';
  LOGIN_URL = BASE_URL + 'login.php';
  NEWS_URL = BASE_URL + 'news.php';
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0';
  CONTENT_TYPE = 'application/x-www-form-urlencoded';
  LOGIN_ERROR_STR = 'Nieprawidłowa nazwa użytkownika lub hasło';
  LOGIN = 'login';
  PASSWORD = 'haslo';
var
  slPostData: TStringList;
  sHTML: string;
begin
  IdHTTP.HandleRedirects:= True;
  IdHTTP.Request.UserAgent:= USER_AGENT;
  IdHTTP.Request.ContentType:= CONTENT_TYPE;
  slPostData:= TStringList.Create;
  try
  IdHTTP.Get(LOGIN_URL);
  IdHTTP.Request.Referer:= LOGIN_URL;
  slPostData.Add('user_name=' + LOGIN);
  slPostData.Add('user_pass=' + PASSWORD);
  slPostData.Add('login=Zaloguj');
  //dziwnie na tej stronie Indy nie razi sobie poprawnie z autoredirectem robi POST zamiast GET
  //zapetla się (źle skonfigurowany serwer?) dlatego trzeba bedzie mu troche "pomóc" ;)
  IdHTTP.OnRedirect:= IdHTTPHelpRedirect;
  sHTML:= IdHTTP.Post(NEWS_URL, slPostData, TEncoding.ASCII);
  finally
  slPostData.Free;
  end;
  if Pos(LOGIN_ERROR_STR, sHTML) > 0 then
    ShowMessage(LOGIN_ERROR_STR);
  IdHTTP.OnRedirect:= nil; //dalej juz mam nadzieje "pomoc" nie bedzie potrzebna
end;
0

Kurcze działa! Nie do końca to rozumiem, ale działa!

P.S.
Zamiast:

procedure TForm1.IdHTTPHelpRedirect(Sender: TObject; var dest: string;

Utworzyłem zdarzenie Redirect:

procedure TfrmMain.IdHTTP1Redirect(Sender: TObject; var dest: string;

A resztę zamknąłem w procedurze Login:

procedure Login(LOGIN, PASSWORD : string);
const
  BASE_URL = 'www.site.agent-pendrive.c0.pl';
  LOGIN_URL = BASE_URL + 'login.php';
  NEWS_URL = BASE_URL + 'news.php';
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0';
  CONTENT_TYPE = 'application/x-www-form-urlencoded';
  LOGIN_ERROR_STR = 'Nieprawidłowa nazwa użytkownika lub hasło';
var
  slPostData: TStringList;
  sHTML: string;
begin
  frmMain.IdHTTP1.HandleRedirects:= True;
  frmMain.IdHTTP1.Request.UserAgent:= USER_AGENT;
  frmMain.IdHTTP1.Request.ContentType:= CONTENT_TYPE;
  slPostData:= TStringList.Create;
  try
  frmMain.IdHTTP1.Get(LOGIN_URL);
  frmMain.IdHTTP1.Request.Referer:= LOGIN_URL;
  slPostData.Add('user_name=' + LOGIN);
  slPostData.Add('user_pass=' + PASSWORD);
  slPostData.Add('login=Zaloguj');
  frmMain.IdHTTP1.OnRedirect:= frmMain.IdHTTP1Redirect;
  sHTML:= frmMain.IdHTTP1.Post(NEWS_URL, slPostData, TEncoding.ASCII);
  finally
  slPostData.Free;
  end;
  if Pos(LOGIN_ERROR_STR, sHTML) > 0 then
    ShowMessage(LOGIN_ERROR_STR);
  frmMain.IdHTTP1.OnRedirect:= nil;
end;

Może tak być? U mnie działa, ale wolę spytać...

0

Oczywiście że może być, przecież własne procedury, funkcje, zmienne możesz nazywać sobie wedle własnego uznania. Tylko pamiętaj aby kod był w miarę czytelny dla Ciebie i dla innych (nawet jak nie masz zamiaru go nikomu pokazywać i sam "kodzić" gdzieś w domowym zaciszu to lepiej nie uczyć się brzydkich nawyków).
W przypadku tego kodu błędem jest to że jak chyba zauważyłeś wszędzie stałe są wielkimi literami a Ty parametry LOGIN, PASSWORD też napisałeś wielkimi literami.

0

Dziękuję za cenną uwagę. Zawsze staram się aby kod był jak najbardziej czytelny, już trochę programuję i wiem że jest to ważna rzecz. Delphi jescze się uczę i nie wiedziałem o tej zasadzie, ale dobrze że mi powiedziałeś. Wcześniej pisałem dużo skryptów Bash a jeszcze więcej w Batch(niby banał, a naprawdę wiele uczy) i trochę VBS. Ale głównie programowanie obiektowe to jeszcze nie opanowane u mnie.

A wiesz jak zrobić abym mógł w jednym parametrze przesłać kilka nazw obiektów? Np. coś takiego:

procedure Login(login_url, redirect_url, obiects : string); // Jedna zmienna obiects.
const
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0';
  CONTENT_TYPE = 'application/x-www-form-urlencoded';
  LOGIN_ERROR_STR = 'ERROR COMM-AAC-C-0140! Incorrect Login or Password!';
var
  slPostData: TStringList;
  sHTML: string;
begin
  frmMain.IdHTTP1.HandleRedirects:= True;
  frmMain.IdHTTP1.Request.UserAgent:= USER_AGENT;
  frmMain.IdHTTP1.Request.ContentType:= CONTENT_TYPE;
  slPostData:= TStringList.Create;
  try
    frmMain.IdHTTP1.Get(login_url);
    frmMain.IdHTTP1.Request.Referer:= login_url;
    slPostData.Add(login);               // Zamiast dopisywać cały czas slPostData.Add(obiekt=dane),
    slPostData.Add(password);            // napisać raz slPostData.Add(obiekty).
    slPostData.Add(button_name);         // Aby mógł w przyszłości po skompilowaniu, samemu kontrolować jakie obiekty i ile ma ich być.
    frmMain.IdHTTP1.OnRedirect:= frmMain.IdHTTP1Redirect;
    sHTML:= frmMain.IdHTTP1.Post(redirect_url, slPostData, TEncoding.ASCII);
  finally
    slPostData.Free;
  end;
  if Pos(LOGIN_ERROR_STR, sHTML) > 0 then Writeln(LOGIN_ERROR_STR);
  frmMain.IdHTTP1.OnRedirect:= nil;
end;

Albo jakiś inny sposób, ważny abym mógł przesłać w jednym parametrze wszystkie obiekty Np. ParamStr(x)='user_name=Login, user_pass=Password, login=Zaloguj';
Jeśli nie rozumiesz, nie dziwie się, nie wiem jak to wytłumaczyć dokładniej...

2

A co za problem zamiast TStringList użyć TStringStream?

var
  sPostDataParams: string;
  ssPostData: TStringStream;
  sHTML: string;
begin
  sPostDataParams:= 'user_name=Login&user_pass=Password&login=Zaloguj'; //w takim formacie maja byc parametry (oddzielone &)
  //...
  ssPostData:= TStringStream.Create;
  try
  ssPostData.WriteString(sPostDataParams);
  sHTML:= IdHTTP.Post(URL, ssPostData);
  finally
  ssPostData.Free;
  end;
end;
0

Kurcze, wszystko działa tak że aż wydaje mi się że to za piękne, już mogę się podpiąć pod każdy formularz strony, właśnie założyłem piewszego użytkownika u siebie dla testu. Dzięki wielkie za pomoc, po raz kolejny!

P.S. Jeszcze jedno małe pytanko, czy ciasteczka się kasują gdy program skończy działać, czy zostają?

0

Indy nie przechowuje ciasteczek na dysku (choć na upartego można je sobie zapisać i później załadować). Można je też wyczyścić w trakcie działania programu zarządzanie ciastkami ułatwia TIdCookieMenager.

0

Tak tylko z ciekawości pytałem, to dobrze że je trzyma w pamięci zamiast w plikach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1