1

Тема: Не працює ф-ція. Дані кешуються?

Знову делфі...
Проблема в тому, що після введення логіну:паролю він запам'ятовуються чи що.
Увів правильно, а потім переправив не неправильний - код всерівно працює.
Увів неправильно, виправив на правильно а код і далі вважає його неправильними.

procedure TForm1.Button1Click(Sender: TObject);
var stringstream: TStringStream;
var balance, xml, bb: String;
var root, lib: IXMLNode;
var sms_count, b1: Real;
//var i:integer;
begin
  if (edit1.text = '') OR (edit2.text = '') OR (edit3.text = '') OR (edit4.text = '') then
    begin
      showMessage('Введіть налаштування!');
    end
    else
    begin
      phone_number := edit3.text;   // Куди слати
      username := edit1.text; // Логін для авторизації через АРІ
      password := edit2.text;  //   пароль для авторизації через АРІ

      stringstream:=TStringStream.Create('');
      try
        xml := '<?xml version="1.0" encoding="utf-8"?><request><operation>GETBALANCE</operation></request>';
        stringstream.WriteString(xml);
        stringstream.Position:=0;
        IdHTTP1.Request.ContentType:='application/x-www-form-urlencoded';
        IdHTTP1.Request.ContentLength:=stringstream.Size;
        IdHTTP1.Request.BasicAuthentication:= true;
        IdHTTP1.Request.UserName := username;
        IdHTTP1.Request.Password := password;

        balance:=IdHTTP1.Post(apiurl, stringstream);
      finally
        stringstream.Free;
      end;

      if (balance <> 'Access denied!') then
        begin
          XMLDocument2.LoadFromXML(balance); // Завантажуємо файл з балансом.
          XMLDocument2.Active := true;
          root := XMLDocument2.DocumentElement;
          bb := trim(root.ChildNodes['balance'].Text);
          b1 := StrToFloat_UK(bb);
          sms_count:= b1 / 0.16;
          Label1.Caption := Label1.Caption + bb + ' грн ' + FloatToStr(sms_count);
        end
        else
        begin
          showMessage('Логін або пароль введено не вірно!');
        end;
    end;
end;

2

Re: Не працює ф-ція. Дані кешуються?

http://www.delphigroups.info/2/1/508248.html

3 Востаннє редагувалося Sensetivity (28.03.2015 21:32:01)

Re: Не працює ф-ція. Дані кешуються?

Вже сам розібрався.
Треба було створювати об'єкт динамічно  IdHTTP1:=TIdHTTP.Create(nil);
Я ж просто кинув елемент на форму.
Ф-ція тепер виглядає так:

Прихований текст
procedure TForm1.Button1Click(Sender: TObject);
var stringstream: TStringStream;
var balance, xml, bb: String;
var root, lib: IXMLNode;
var sms_count, b1: Real;
var IdHTTP1: TIdHTTP;
//var i:integer;
begin

  if (edit1.text = '') OR (edit2.text = '') OR (edit3.text = '') OR (edit4.text = '') then
    begin
      showMessage('Ââåä³òü íàëàøòóâàííÿ!');
    end
    else
    begin
      phone_number := edit3.text;   // Êóäè ñëàòè
      username := edit1.text; // Ëîã³í äëÿ àâòîðèçàö³¿ ÷åðåç Àв
      password := edit2.text;  //   ïàðîëü äëÿ àâòîðèçàö³¿ ÷åðåç Àв

      stringstream:=TStringStream.Create('');
      try
        xml := '<?xml version="1.0" encoding="utf-8"?><request><operation>GETBALANCE</operation></request>';
        stringstream.WriteString(xml);
        stringstream.Position:=0;

        IdHTTP1:=TIdHTTP.Create(nil);
        IdHTTP1.Request.ContentType:='application/x-www-form-urlencoded';
        IdHTTP1.Request.ContentLength:=stringstream.Size;
        IdHTTP1.Request.BasicAuthentication:= true;
        IdHTTP1.Request.UserName := username;
        IdHTTP1.Request.Password := password;

        balance:=IdHTTP1.Post(apiurl, stringstream);
        //SHowMessage(idHTTP1.Response.ResponseText);
      finally
        stringstream.Free;
        IdHTTP1.Disconnect;
      end;

      if (balance <> 'Access denied!') then
        begin
          XMLDocument2.LoadFromXML(balance); // Çàâàíòàæóºìî ôàéë ç áàëàíñîì.
          XMLDocument2.Active := true;
          root := XMLDocument2.DocumentElement;
          bb := trim(root.ChildNodes['balance'].Text);
          b1 := StrToFloat_UK(bb);
          sms_count:= b1 / 0.16;
          Label1.Caption := Label1.Caption + bb + ' ãðí ' + FloatToStr(sms_count);
        end
        else
        begin
          showMessage('Ëîã³í àáî ïàðîëü ââåäåíî íå â³ðíî!');
        end;
    end;
end;
Подякували: koala, 0xDADA11C72

4

Re: Не працює ф-ція. Дані кешуються?

У вас тут пам'ять тече: http://www.gunsmoker.ru/2009/05/blog-post_24.html

5

Re: Не працює ф-ція. Дані кешуються?

Torbins написав:

У вас тут пам'ять тече: http://www.gunsmoker.ru/2009/05/blog-post_24.html

Ви явно переоцінюєте мій рівень :)
Прочитав запис але так і не зрозумів, що тут тече?
Чи ви про функції з XML ?

6

Re: Не працює ф-ція. Дані кешуються?

Sensetivity написав:
Torbins написав:

У вас тут пам'ять тече: http://www.gunsmoker.ru/2009/05/blog-post_24.html

Ви явно переоцінюєте мій рівень :)
Прочитав запис але так і не зрозумів, що тут тече?
Чи ви про функції з XML ?

Може Torbins має на увазі, що треба в кінці процедури робити
[code=pas]idHTTP.free;
[/code]
і інші об'єкти так само.
На тему.

7

Re: Не працює ф-ція. Дані кешуються?

Chemist-i написав:
Sensetivity написав:
Torbins написав:

У вас тут пам'ять тече: http://www.gunsmoker.ru/2009/05/blog-post_24.html

Ви явно переоцінюєте мій рівень :)
Прочитав запис але так і не зрозумів, що тут тече?
Чи ви про функції з XML ?

Може Torbins має на увазі, що треба в кінці процедури робити
[code=pas]idHTTP.free;
[/code]
і інші об'єкти так само.
На тему.

А хіба

IdHTTP1.Disconnect;

Не включає у себе "idHTTP.free;" ?

8

Re: Не працює ф-ція. Дані кешуються?

Розрив з’єднання і знищення об’єкту це різні речі. Окрім того, ви можете намагатися з’єднатися після розриву з’єднання.

Подякували: Chemist-i, koala2

9 Востаннє редагувалося Sensetivity (29.03.2015 21:51:06)

Re: Не працює ф-ція. Дані кешуються?

Переписав отак:

         begin
            stringstream:=TStringStream.Create('');
            IdHTTP1:=TIdHTTP.Create(nil);
            try
              SkypeText := '<?xml version="1.0" encoding="utf-8"?><request><operation>SENDSMS</operation>';
              SkypeText := skypetext + '<message start_time="AUTO" end_time="AUTO" lifetime="4" rate="120" desc="Skype" source="SMS">';
              SkypeText := SkypeText + '<body>' + textBody + '</body>';
              SkypeText := SkypeText + '<recipient>' + phone_number + '</recipient></message></request>';
              stringstream.WriteString(SkypeText);
              stringstream.Position:=0;

              IdHTTP1.Request.ContentType:='application/x-www-form-urlencoded';
              IdHTTP1.Request.ContentLength:=stringstream.Size;
              IdHTTP1.Request.BasicAuthentication:= true;
              IdHTTP1.Request.UserName := username;
              IdHTTP1.Request.Password := password;

              balance:=IdHTTP1.Post(apiurl, stringstream);
              Memo1.Lines.Append(balance);
            finally
              stringstream.Free;
              IdHTTP1.Disconnect;
              IdHTTP1.Free;
              SkypeText:= '';
            end;
          end;

10

Re: Не працює ф-ція. Дані кешуються?

Sensetivity
Дуже добре. Тільки ще код

stringstream:=TStringStream.Create('');
IdHTTP1:=TIdHTTP.Create(nil);

занесіть під try, а перед try додайте

stringstream:=Nil;
IdHTTP1:=Nil;

Бо інакше якщо "TIdHTTP.Create(nil)" видасть ексепшон (наприклад не вистачає пам'яті), то stringstream нікому буде видалити.