Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: Ekz 
Форум » Все о Delphi » Интернет и сети » И снова авторизация и снова ошибки(ужасные). (Страшные такие.)
И снова авторизация и снова ошибки(ужасные).
DublДата: Четверг, 21.10.2010, 18:51 | Сообщение # 1
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Привет. Все ещ практикуюсь в авторизации, на этот раз выбрал опять же соц. сеть(в прошлый раз брал вк) vgorode.ru, выбрал рандомно, это не имеет значения))

Так вот я вроде все сделал правильно, проснифил запрос, программно его передал, ну, короче, как-то так.

Вот такая ошибка получается при запуске процедуры vglogin:

Code

Access violation at address 004844CA in module "Project1.exe". Read of address 0000000C.

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

Code

Result := FHTTPProto.Request;

Видимо это строчка какого-то из компонентов.

Сам код программы:

Code

unit Unit1;

interface

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

type
   TForm1 = class(TForm)
     Label1: TLabel;
     Edit1: TEdit;
     Edit2: TEdit;
     Button1: TButton;
     Label2: TLabel;
     IdHTTP1: TIdHTTP;
     Memo2: TMemo;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   IdHTTP1: TIdHTTP;
   Memo2: TMemo;

implementation

{$R *.dfm}

procedure VGlogin(vglogin, vgpassword, rezult:string);
var datalp:TStringList; gl, gla:string;
begin

idhttp1:=TIdHTTP.Create(nil);
idhttp1.HandleRedirects:=true;
gl:=idhttp1.get('http://www.vgorode.ru/');
idhttp1.Free;
Datalp:=TStringList.Create;
Datalp.Add('user[email]='+vglogin);
Datalp.Add('user[password]='+vgpassword);
gla:=IdHTTP1.Post('http://www.vgorode.ru/', Datalp);
if pos('href="/user/exit">', gla)<>0 then
rezult:=('Авторизовались успешно')
else begin rezult:=('Херня какая-то, не авторизовались');

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
vglogin(Edit1.Text, Edit2.Text, Memo2.text)
end;

end.

 
skycarДата: Четверг, 21.10.2010, 20:58 | Сообщение # 2
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Acess violation обычно выдаётся при обращении по недопустимому адресу памяти. Почему не высвобождаешь память после отпадения надобности работы с объектом? Ведь тогда будет память замусориваться.

Code

  DataLp.Free;

перед самым концом процедуры. Этот метод есть у всех потомков TObject. Да, и ещё - зачем делать процедуру с буфером, если можно написать аналогичную функцию, к-рая будет возвращать тот или иной результат. Лучше сделать её логической, раз уж идёт проверка - авторизовались или нет. Вдобавок, зачем сперва получать просто сорц страницы, если потом постишь запрос с параметрами и уже в ответе на него ищешь нужные строки? Ошибочка у тебя потому что ты освободил память IdHTTP1 а потом вызываешь метод у этого объекта, вот и ругается прога на недопустимый запрос к памяти smile Также у тебя были одинаковы названия метода и одного из параметров, что не есть хорошо.

Code

function VgLogin(const Login, Pass: string): Boolean;
var DataLP: TStringList;
  Gla: string;
begin
  Result:=False;
  DataLp:=TStringList.Create;
  DataLp.Add('user[email]='+Login);
  DataLp.Add('user[password]='+Pass);
  IdHTTP1:=TIdHTTP.Create(nil);
  IdHTTP1.HandleRedirects:=True;
  Gla:=IdHTTP1.Post('http://vgorode.ru', DataLp);
  if Pos('href="/user/exit"', Gla) <> 0 then Result:=True
else Result:=False;
  IdHTTP1.Free;
  DataLp.Free;
end;

Далее логинимся и проверяем

Code

if VgLogin(Edit1.Text, Edit2.Text) then ShowMessage('Авторизация удалась') else
  ShowMessage('Авторизация неудачна');

Всё ясно? wink

 
DublДата: Четверг, 21.10.2010, 21:36 | Сообщение # 3
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Ок. С этим ясно. Спасибо огроменное, как всегда))

Вот ошибка эта меня просто преследует. Например вот процедура:

Code

procedure na4poloj(N:integer);
var i:integer;
begin
i:=0;
for i := 0 to (N-1) do
begin

poloj[i]:=StrToInt(Memo2.Lines[i]);
memo3.Lines.add(IntToStr(poloj[i]));

end;
end;

Я ввожу в memo2 на каждую строку N значений. N указываю в Edit1(ну не важно). И хочу чтобы в массив poloj записались данные с memo2. Ну по коду ясно я считаю. Так вот суть в том, что ошибка аналогичная, только где тут освобождать память?

 
skycarДата: Пятница, 22.10.2010, 00:46 | Сообщение # 4
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Poloj - эт что за массив? динамический? Устанавливаешь ли длину ему предварительно? Ты весь код выложи лучше.
 
DublДата: Пятница, 22.10.2010, 00:52 | Сообщение # 5
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Ага, минуточку.

Добавлено (22.10.2010, 00:52)
---------------------------------------------
Вот код, задача большая это лишь часть ее, решил проверить, вывести рез-т и тут ошибка такая, подскажи плиз что не так))

Code

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     Edit2: TEdit;
     Edit3: TEdit;
     Edit4: TEdit;
     Label1: TLabel;
     GroupBox1: TGroupBox;
     GroupBox2: TGroupBox;
     Label2: TLabel;
     Edit6: TEdit;
     Memo1: TMemo;
     Button1: TButton;
     Memo2: TMemo;
     Label3: TLabel;
     Label4: TLabel;
     Label5: TLabel;
     Memo3: TMemo;
     Label6: TLabel;
     Button2: TButton;
     GroupBox3: TGroupBox;
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   Memo2, Memo1, Memo3: TMemo;
   N, M, g, k, p: integer; a, b:real;
   plit: array of integer;
   person: array of integer;
   poloj: array of integer;

implementation

{$R *.dfm}

procedure na4poloj(N:integer);
var i:integer;
begin
i:=0;
for i := 0 to (N-1) do
begin

poloj[i]:=StrToInt(Memo2.Lines[i]);
memo3.Lines.add(IntToStr(poloj[i]));

end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
na4poloj(strtoint(edit1.text));
end;

end.
 
skycarДата: Пятница, 22.10.2010, 13:00 | Сообщение # 6
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Ну дык ты же не устанавливаешь длину массиву, посему прога снова ругается на обращение к недопустимым адресам памяти. Ведь память под динамический массив выделяется динамично, походу выполнения проги, в отличие от статичного.
Вкратце как работать с динамическим массивом
1) объявить одномерный или многомерный дин. массив
var A: array of LongInt; - одномерный
var A: array of array of LongInt; - 2-х мерный и т. д.
многомерный дин. массив - это массив массивов wink
2) Перед началом работы или если нужно увеличить размер, задать ему новое кол-во элементов процедурой SetLength()
SetLength(A, 8); // одномерный массив увел. на 8 эл.
SetLength(A, 4, 4); // 2-х мерный массив увел. на 4x4=16 эл.
3) Заполнять элементы массива, работать с ним, как обычно. У первого элемента индекса ноль, у последнего равен длине массива минус один (Length(A) - 1);
4) После работы с массивом удалять его из памяти, если он уже не требуется.

Если честно, то зачем тебе в данном случае массив? Ведь данные уже есть в строках Memo, свойство Lines это считай тоже массив, только строковый, и его размер Lines.Count, изменение размера Memo.Lines.Add() либо Memo.Lines.Delete

 
DublДата: Пятница, 22.10.2010, 19:46 | Сообщение # 7
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Quote
Если честно, то зачем тебе в данном случае массив? Ведь данные уже есть в строках Memo, свойство Lines это считай тоже массив, только строковый, и его размер Lines.Count, изменение размера Memo.Lines.Add() либо Memo.Lines.Delete

Я все понимаю, это олимпиадная задача, одним из входных параметров является положение "граффити-художников" у какой-либо стены, так вот я в memo на каждой строке пишу положения художников у какой-либо стены т е например

Code

1
3
2
4
5

и это значит, что первый художник у 1 стенки, 2ой художник у 3ей, и записываю эти данные в массив для дальнейшего выполнения задачи, если интересно, попозже скину текст задачи))

Добавлено (22.10.2010, 19:46)
---------------------------------------------
Опять ошибка с памятью:

Code

   plit: array of LongInt;
   person: array of LongInt;
   poloj: array of LongInt;

...

Code

procedure na4poloj(N:integer);
var i:integer;
begin
SetLength(poloj, N);
i:=0;
for i := 0 to (N-1) do
begin

poloj[i]:=StrToInt(Memo2.Lines[i]);
memo3.Lines.add(IntToStr(poloj[i]));

end;
end;
 
skycarДата: Пятница, 22.10.2010, 23:56 | Сообщение # 8
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Ну если так...
Code

procedure Na4Poloj;
var I: Cardinal;
begin
   SetLength(Poloj, Memo2.Lines.Count);
   for I:=0 to Length(Poloj) - 1 do
   begin
     Poloj[I]:=StrToInt(Memo2.Lines[I]);
   Memo3.Lines.Add(IntToStr(Polog[I]));
   end;
end;

если реализовывать так, как ты задумал. результат: строки из одного мемо добавятся в другой, попутно заполнив массив. А потом с этим массивом можно делать всё, что угодно.

Сообщение отредактировал skycar - Пятница, 22.10.2010, 23:58
 
DublДата: Суббота, 23.10.2010, 00:16 | Сообщение # 9
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
В другой мемо я добавить хочу для теста, т е чтобы посмотреть нормально ли заполнился массив, потом я буду просто заполнять массив))

П. С. Спасибо, пойду пробовать.

Добавлено (23.10.2010, 00:16)
---------------------------------------------
Жуть какая-то(( Честно говоря уже ничего не понимаю, вроде ничего особенного, а все ошибка(( Выдам ка я полную инфу по программе)) Когда же этот аккесс перестанет меня преследовать))

Ошибка:

Форма:

Еще раз полностью код:

Code
unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     Edit2: TEdit;
     Edit3: TEdit;
     Edit4: TEdit;
     Label1: TLabel;
     GroupBox1: TGroupBox;
     GroupBox2: TGroupBox;
     Label2: TLabel;
     Edit6: TEdit;
     Memo1: TMemo;
     Button1: TButton;
     Memo2: TMemo;
     Label3: TLabel;
     Label4: TLabel;
     Label5: TLabel;
     Memo3: TMemo;
     Label6: TLabel;
     Button2: TButton;
     GroupBox3: TGroupBox;
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   Memo2, Memo1, Memo3: TMemo;
   N, M, g, k, p: integer; a, b:real;
   plit: array of LongInt;
   person: array of LongInt;
   poloj: array of LongInt;

implementation

{$R *.dfm}

procedure na4poloj(N:integer);
var i:integer;
begin
SetLength(Poloj, Memo2.Lines.Count);
i:=0;
for i := 0 to Length(Poloj) - 1 do
begin

poloj[i]:=StrToInt(Memo2.Lines[i]);
memo3.Lines.add(IntToStr(poloj[i]));

end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
na4poloj(strtoint(edit1.text));
end;

end.

Ругается на:

Code
SetLength(Poloj, Memo2.Lines.Count);
 
skycarДата: Суббота, 23.10.2010, 00:39 | Сообщение # 10
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Для чего объявляешь переменные Memo1, Memo2, Memo3 в интерфейсном разделе? их автоматом объявит делфи в костяке класса TForm1 при добавлении на форму.
Попробуй ещё раз, удалив из интерфейсного раздела эти переменные.

Добавлено (23.10.2010, 00:39)
---------------------------------------------
Кстати, что-то мы отклонились шибко от темы, ведь наше обсуждение не относится к сетям

 
DublДата: Суббота, 23.10.2010, 00:47 | Сообщение # 11
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Quote
Кстати, что-то мы отклонились шибко от темы, ведь наше обсуждение не относится к сетям

Да да, кстати, извините, просто ошибки были похожи в этом и первоначальном случае. Тогда я тут не буду больше писать, напишу в отдельной теме, если ошибка останется не решенной.
 
Форум » Все о Delphi » Интернет и сети » И снова авторизация и снова ошибки(ужасные). (Страшные такие.)
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2018
Хостинг от uCoz