Массив строк в компоненте Memo

кристина19

И снова здравствуйте =)У меня есть задачка с компонентами Memo/ Мне немного непонятно как делать, но есть исходники того, что я пыталась сделать. После условия их выложу.Задача :Дан массив строк. Вывести на экран строки, которые встречаются в массиве больше одного раза. Замечания к задаче : Сконструируем форму, на которой: компонент Memo1 используется для ввода массива, компонент Memo2 — для вывода полученного результата, компоненты Label1 и Label2 — для вывода пояснительного текста, Button1 — для чтения элементов в массив, Button2 — для выполнения действий, указанных в задаче.При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать клавишу ввода.4. Объявите динамический массив, выбрав необходимую область действия идентификатора.5. Получить доступ к находящейся в поле Memo строке текста можно при помощи его свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля), например: Memol.Lines[0], где Memol — имя Memo-компонента, Lines — свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку текста, находящегося в поле Memo.6. Чтение данных из компонента Memo в массив оформить в виде подпрограммы, которую вызвать в обработчике события OnClick компонента Button1.7. Решение задачи своего варианта также оформить в виде подпрограммы, которую вызвать в обработчике события OnClick кнопки Button2.8. Вывод данных из массива в компонент Memo оформить в виде подпрограммы. Для добавления элементов массива в Memo использовать метод Add свойства Lines. Например: Memo2.Lines.Add(<то, что надо добавить>). Вызвать подпрограмму вывода данных после их обработки в процедуре OnClick кнопки Button2.Вот исходники того, что пыталась сделать сначала. Сама понимаю, они ни о чём, но в любом случае пыталась. Кому не сложно , прошу попробовать мне объяснить как делать. Заранее огромное мерси
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    Memo2: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=5;// размер массива
 
var
a:array [1..SIZE] of string [30];//массив;
n:integer;//количество строк,введённых в поле memo
i:integer;//индекс элемента массива
st:string;
 R:string;
 
Begin
  n:=Memo1.Lines.Count;
  If n=0 then
  Begin
  ShowMessage('Исходные данные не ввведены');
  Exit;//выход из процедуры обработки события
  End;
 
// в поле Memo есть текст
 
If n>SIZE then
 
Begin
  ShowMessage('Количество строк превышает размер массива');
  n:=SIZE;//будем вводить только первые SIZE сторк
End;
 
for i:=1 to n do
a[i]:=Form1.Memo1.Lines[i-1];//строки Memo пронумерованы с нуля
//вывод массива в окно сообщения
if n>0 then
 
Begin
  st:='Введённый массив:';
  for i := 1 to n do
  st:=st+IntToStr(i)+''+a[i];
memo2.Text:=(st);
End;
End;
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
memo2.Clear;
End;
End.
11 ответов

кристина19

1. По условию задачи массив должен быть динамическим:
var
  a: array of string;
...
  SetLenght(a, Memo1.Lines.Count); // Устанавливаем размерность массива;
...
Нумерация элементов динамического массива начинается с 0 по Lenght(a) 2. Для получения количества введенных в Memo строк используем соответствующее свойство самого компонента а не конструкцию типа:
n:=Memo1.Lines.Count;
If n=0 then
  Begin
    ShowMessage('Исходные данные не ввведены');
    Exit;//выход из процедуры обработки события
  End;


кристина19

harmless , спасибо конечно, но всё равно немного непонятно как делать )) сейчас буду книжки штудировать в поисках ) завтра зачёт.но всё равно спасибо, что откликнулись =)


кристина19

У меня сейчас Delphi под рукой нету - через час-полтора, если никто не напишет, выложу чего-нить...


кристина19

harmless , и ещё раз благодарю =) Вы не подумайте, я не лентяйка, просто специализация другая. геометр я, а delphi недавно ввели. вот пытаюсь разбираться.


кристина19

harmless,
a: array of string;
И в каком месте тут динамический массив?


кристина19

Я не много посидел и решил сделать так..вот держи..Будут вопросы задавай...


кристина19

leejack , спасибочки сейчас вопросами буду мучить )))1). можно я очищу форму чтоб изначально строки пустые были, а потом просто сама вводить буквы/строки какие нужны ? планирую использовать :
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
memo2.Clear;
End;
можно поподробнее про inc и count ? вопрос глупый, я знаю =) но мне нужно понять, завтра зачёт, спрашивать ведь будут что и откуда.


кристина19

1) Можно конечно, только потом сама напиши текст в левый компонент... 2) Inc - это функция стандартная в Delphi... Равносильно Inc(i)- i=i+1; т.е. счетчик. Вместо того, чтобы писать i:=i+1 мы пользуемся ей.... Count - это количество повторов... Всмысле это я уже сам считаю, сколько раз встретилась эта строка...


кристина19

И в каком месте тут динамический массив?
Ну видимо в таком.
Разработчики Delphi в последних версиях (5,6) своего продукта реализовали достаточно гибкий механизм для работы с динамическими массивами. Нам уже не нужно создавать динамические списки, мы уже никогда не забудем поставить знак "^" при обращении к элементу списка и на определенное время забудем о процедурах new, mark и dispose. Примечание. В более ранних версиях (например, 3) такого механизма не существовало. Динамические массивы не имеют фиксированного размера или длины. Для объявления такого массива достаточно записать: var My_Array : array of Real; Как вы видите, мы просто говорим Delphi, что нам нужен одномерный массив типа Real, а об его размере мы сказать просто-напросто забыли. При таком объявлении память не выделяется, поэтому мы можем объявить хоть сотню таких массивов, не особо беспокоясь о системных ресурсах, и использовать любой массив по мере необходимости. Для выделения памяти для динамического массива используется процедура SetLength: SetLength(My_Array,100);


кристина19

Ну видимо в таком.
На сколько я помню, то нам преподавали, что эти массивы являются просто открытыми... А динамически создавать их это значит указывать адрес ручками.... А это больше вариант статического открытого массива....


кристина19

Открытые массивы существуют в Паскале, для использования их только в качестве параметров подпрограмм. http://www.intbook.info/pascal/gl8_4.html