Здравствуйте, Гость
Вторник, 21.11.2017, 04:49
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Динамические массивы. (Снова трабла с ними.)
Динамические массивы.
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... не обязательно smile
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;

всё понятно? wink если я неправильно понял твою задачу, то разъясни, что ты подразумевал сделать...

Добавлено (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;

Попробуй так
можно ещё написать функцию, котрая будет проверять валидность комбинаций

 
Форум » Все о Delphi » Начинающим » Динамические массивы. (Снова трабла с ними.)
Страница 1 из 11
Поиск:

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