И снова авторизация и снова ошибки(ужасные). |
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 обычно выдаётся при обращении по недопустимому адресу памяти. Почему не высвобождаешь память после отпадения надобности работы с объектом? Ведь тогда будет память замусориваться. перед самым концом процедуры. Этот метод есть у всех потомков TObject. Да, и ещё - зачем делать процедуру с буфером, если можно написать аналогичную функцию, к-рая будет возвращать тот или иной результат. Лучше сделать её логической, раз уж идёт проверка - авторизовались или нет. Вдобавок, зачем сперва получать просто сорц страницы, если потом постишь запрос с параметрами и уже в ответе на него ищешь нужные строки? Ошибочка у тебя потому что ты освободил память IdHTTP1 а потом вызываешь метод у этого объекта, вот и ругается прога на недопустимый запрос к памяти Также у тебя были одинаковы названия метода и одного из параметров, что не есть хорошо. 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('Авторизация неудачна'); Всё ясно?
|
|
| |
|
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-х мерный и т. д. многомерный дин. массив - это массив массивов 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 на каждой строке пишу положения художников у какой-либо стены т е например и это значит, что первый художник у 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 Кстати, что-то мы отклонились шибко от темы, ведь наше обсуждение не относится к сетям Да да, кстати, извините, просто ошибки были похожи в этом и первоначальном случае. Тогда я тут не буду больше писать, напишу в отдельной теме, если ошибка останется не решенной.
|
|
| |
|