Динамические массивы. |
Dubl | Дата: Суббота, 30.10.2010, 05:18 | Сообщение # 1 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Ребят. Я честно говоря уже не знаю, почему мне не даются эти динамические массивы. Помогите пожалуйста разобраться в сей ситуации. Итак. Я имею memo, в котором в каждой строке надпись типа 111;222. Я хочу разделить ее. Так вот 111 я хочу записать в 1 массив а 222 в другой массив.(я делю логин и пароль). И опять у меня Валиант аккесс Мой код: Code unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, lib, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; logins, passes:array[1..n] of string; n:integer;
implementation
{$R *.dfm}
procedure razdel; var i:integer; begin
setlength(logins,150); setlength(passes,150);
i:=1; while Form1.Memo1.lines[i]<>'0' do begin logins[i]:=parser(Form1.Memo1.lines[i],'',';',0,0); i:=i+length(Form1.Memo1.lines[i]); end;
while Form1.Memo1.lines[i]>'0' do begin passes[i]:=parser(Form1.Memo1.lines[i],';','',0,0); i:=i+length(Form1.Memo1.lines[i]); end;
end;
procedure TForm1.Button1Click(Sender: TObject); begin razdel; edit1.text:=logins[1]; end;
end.
|
|
| |
|
Admin | Дата: Суббота, 30.10.2010, 10:51 | Сообщение # 2 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Я бы посоветовал использовать два TStringList, будет удобнее. Code while Form1.Memo1.lines[i]<>'0' do begin тут пока i-тая строка не будет равна строке '0', будет выполняться цикл. Как я понял это не совсем то что тебе нужно. Code For i:=0 to memo1.lines.count-1 do begin ... Так ты пробежиш все строки в memo.
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
Dubl | Дата: Суббота, 30.10.2010, 16:38 | Сообщение # 3 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Так так, я опять решил полностью переделать алгоритм)) и подстроку до разделителя мне удалось выудить и записать в stringlist, я решил, что с массивами не хочу работать. Теперь несколько в другом трабла, до разделителя все записывается а после нет, подскажите, где я напортачил пожалуйста: Code unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Memo2: TMemo; Button2: TButton; Button3: TButton; Memo3: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; logins, passes: TStringList; i:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin memo1.Clear; memo2.Clear; memo3.Clear; end;
procedure TForm1.Button1Click(Sender: TObject); var poss:integer; begin logins := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); logins.add(copy(memo1.lines[i],1,poss-1)); end; end;
procedure TForm1.Button3Click(Sender: TObject); var poss, poss2:integer; begin passes := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); poss2:=pos(#13#10,memo1.lines[i]); passes.add(copy(memo1.lines[i],poss,poss2-poss)); end; end;
procedure TForm1.Button2Click(Sender: TObject); begin For i:=0 to logins.count-1 do begin memo2.lines.add(logins[i]); end;
For i:=0 to passes.count-1 do begin memo3.lines.add(passes[i]); end; end;
end.
|
|
| |
|
Admin | Дата: Суббота, 30.10.2010, 16:55 | Сообщение # 4 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| 3 момента: 1 - i обнулять перед циклом for i... не обязательно 2 - Все (получить и пароли и логины) можно выполнить в одном цикле. 3 - насчет получения второй части. Имеется такая функция Length(S), где S - строка. Функция возвращает длину строки. А теперь смотри. Есть длина, есть номер символа ";". Вторую часть легко получить - копируем от символа ";" до длинны строки минус позиция символа ";". В функцию Copy можно передать (в параметр сколько символов копировать) и длинну строки - эффект тотже будет. Вот тут я незнаю обрабатывается ли в функции copy то, что копируем больше символов чем есть в строке...
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
Dubl | Дата: Воскресенье, 31.10.2010, 02:34 | Сообщение # 5 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Спасибо, совсем забыл про Length(S). Щас все заработало, а в 2 цикла я делал для удобства)) щас в 1 спихну)) Добавлено (31.10.2010, 02:30) --------------------------------------------- Блин, при создании процедуры из того, что я написал опять выявляется ошибка с памятью(( Подскажите, что теперь не так))) Code unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Button4: TButton; Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; logins1, passes1: TStringList; i:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin memo1.Clear; memo2.Clear; memo3.Clear; end;
procedure logpass(logins, passes:TStringList; razd:string; pole:TMemo); var poss,poss2:integer; begin logins := TStringList.create; //создаём класс i:=0;
for i:=0 to pole.lines.count-1 do begin poss:=pos(razd,pole.lines[i]); logins.add(copy(pole.lines[i],1,poss-1)); end;
passes := TStringList.create; //создаём класс i:=0;
for i:=0 to pole.lines.count-1 do begin poss2:=pos(razd,pole.lines[i]); passes.add(copy(pole.lines[i],poss2+1,Length(pole.lines[i])-poss2)); end;
end;
procedure TForm1.Button4Click(Sender: TObject); begin logpass(logins1, passes1,';', memo1); if logins1[0]<>'' then edit1.text:='Ок' else edit1.text:='Дерьмо'; end;
end. Добавлено (31.10.2010, 02:34) --------------------------------------------- и когда эта ошибка выскакивает показывает на строку Code if logins1[0]<>'' then edit1.text:='Ок' else edit1.text:='Дерьмо';
|
|
| |
|
skycar | Дата: Воскресенье, 31.10.2010, 02:26 | Сообщение # 6 |
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
| :))) замечательный стиль отладки опять же, чего нужно добиться? рассортировать логины и пароли по разным строкам разных объектов класса TStringList? Code function GetLogin(const S: string): string; // возвращает логин... begin Result:=Copy(S, 1, Pos(';', S) - 1); //... в комб. логин;пас end;
function GetPass(const S: string): string; // возвращает пароль begin Result:=Copy(S, Pos(';', S) + 1, Length(S)); end;
procedure TForm1.Button1.Click(Sender: TObject); var I: Cardinal; Logins, Passes: TStringList; begin // создавать объекты Logins:=TStringList.Create; // вне цикла, иначе Passes:=TStringList.Create; // может быть утечка памяти for I:=0 to Memo1.Lines.Count - 1 do begin Logins.Add(GetLogin(Memo1.Lines[I])); Passes.Add(GetPass(Memo1.Lines[I])); end; Memo2.Lines.Assign(Logins); // Логины в мемо2 Memo3.Lines.Assign(Passes); // пароли в мемо3 Logins.Free; // соотв. их надо разместить на форме Passes.Free; end; всё понятно? если я неправильно понял твою задачу, то разъясни, что ты подразумевал сделать... Добавлено (31.10.2010, 02:26) --------------------------------------------- Я подразумеваю, что в мемо1 будут комбинации, а в мемо2 и мемо3 соответственно будут добавлены логины и пароли из комбинаций
|
|
| |
|
Dubl | Дата: Воскресенье, 31.10.2010, 04:50 | Сообщение # 7 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Дело-то не в этом, вот смотри. Я хочу просто преобразовать мою, так сказать, мини-программу в отдельную ф-ии. Т е вот код мини-программы, который работает безукоризненно: Code unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Memo2: TMemo; Button2: TButton; Button3: TButton; Memo3: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; logins, passes: TStringList; i:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin memo1.Clear; memo2.Clear; memo3.Clear; end;
procedure TForm1.Button1Click(Sender: TObject); var poss:integer; begin logins := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); logins.add(copy(memo1.lines[i],1,poss-1)); end; end;
procedure TForm1.Button3Click(Sender: TObject); var poss:integer; begin passes := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); passes.add(copy(memo1.lines[i],poss+1,Length(memo1.lines[i])-poss)); end; end;
procedure TForm1.Button2Click(Sender: TObject); begin For i:=0 to logins.count-1 do begin memo2.lines.add(logins[i]); end;
For i:=0 to passes.count-1 do begin memo3.lines.add(passes[i]); end; end;
end. А вот из этого кода я хочу получить процедуру обобщающую, так сказать, эти процессы для дальнейшего использования. Пишу следующий код: Code unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Memo2: TMemo; Button2: TButton; Button3: TButton; Memo3: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; logins, passes: TStringList; i:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin memo1.Clear; memo2.Clear; memo3.Clear; end;
procedure TForm1.Button1Click(Sender: TObject); var poss:integer; begin logins := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); logins.add(copy(memo1.lines[i],1,poss-1)); end; end;
procedure TForm1.Button3Click(Sender: TObject); var poss:integer; begin passes := TStringList.create; //создаём класс i:=0;
for i:=0 to memo1.lines.count-1 do begin poss:=pos(';',memo1.lines[i]); passes.add(copy(memo1.lines[i],poss+1,Length(memo1.lines[i])-poss)); end; end;
procedure TForm1.Button2Click(Sender: TObject); begin For i:=0 to logins.count-1 do begin memo2.lines.add(logins[i]); end;
For i:=0 to passes.count-1 do begin memo3.lines.add(passes[i]); end; end;
end. И в это коде вылезает ошибка памяти, по непонятной причине. И кстати, освобождать переменные хранения пассов и логинов мне не нужно)) она же мне понадобятся)) При ошибке ругается на строку: Code if logins1[0]<>'' then edit1.text:='Ок' else edit1.text:='Дерьмо'; Так вот мне нужно проделать то, что я задумал(перевод мини-программы в обобщающую процедуру и записать в 2е переменные логины и пассы, что я собственно и сделал). Подскажи в чем моя ошибка при преобразовании пожалуйста.
|
|
| |
|
skycar | Дата: Воскресенье, 31.10.2010, 13:56 | Сообщение # 8 |
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
| Мини-программа - в смысле код написан лишь в сгенерированных событиях, а не в своих подпрограммах? Относительно освобождения объектов класса TStringList: у себя в коде я просто приводил пример подобного алгоритма Попробуй под глобальные переменные выделять память в другом месте, например, при создании формы или в разделе инициализации Ну вот должна быть примерно такая процедура, раз уж так Code procedure Sorting(ALogins, APasses: TStringList); var I: Cardinal; S: string; begin for I:=0 to Form1.Memo1.Lines.Count - 1 do begin S:=Form1.Memo1.Lines[I]; ALogins.Add(Copy(S, 1, Pos(';', S) - 1)); APasses.Add(Copy(S, Pos(';', S) + 1, Length(S))); end; end; В качестве параметров при вызове следует указывать уже созданные глобальные переменные. Можешь также очищать в начале процедуры ALogins, APasses, если надо.
|
|
| |
|
Dubl | Дата: Воскресенье, 31.10.2010, 15:42 | Сообщение # 9 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Quote Попробуй под глобальные переменные выделять память в другом месте, например, при создании формы или в разделе инициализации Спасибо, вот это помогло)) Добавлено (31.10.2010, 15:42) --------------------------------------------- Такой еще вопросик, я вот проверил, что будет если не ввести ни одного аккаунта, прога зависает и там далее, после чего я сделал проверку на введенные данные, и если данные не введены то мы вообще ничего не сортируем и так далее, и вылезает мое сообщение о том, что ничего не введено, но сразу после моего сообщения вылезает уже системная ошибка Code list index out of bounds (0) . Но я же ведь сделал проверку)) что не так?)))
|
|
| |
|
skycar | Дата: Воскресенье, 31.10.2010, 16:45 | Сообщение # 10 |
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
| Напиши код своего условия У тебя же аккаунты вводятся в Memo1? Тогда примерно так Code if Memo1.Lines.Count > 0 then ...
|
|
| |
|
Dubl | Дата: Воскресенье, 31.10.2010, 17:28 | Сообщение # 11 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Code if Form1.Memo1.text<>'' then begin for I:=0 to Form1.Memo1.Lines.Count - 1 do begin S:=Form1.Memo1.Lines[I]; ALogins.Add(Copy(S, 1, Pos(';', S) - 1)); APasses.Add(Copy(S, Pos(';', S) + 1, Length(S))); end; end else showmessage('Вы не ввели ни одного аккаунта'); end;
|
|
| |
|
skycar | Дата: Воскресенье, 31.10.2010, 18:02 | Сообщение # 12 |
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
| Code if Form1.Memo1.Lines.Count > 0 then for I:=0 to Form1.Memo1.Lines.Count - 1 do begin S:=Form1.Memo1.Lines[I]; ALogins.Add(Copy(S, 1, Pos(';', S) - 1)); APasses.Add(Copy(S, Pos(';', S) + 1, Length(S))); end else ShowMessage('Вы не ввели ни одного аккаунта'); end; Попробуй так можно ещё написать функцию, котрая будет проверять валидность комбинаций
|
|
| |
|