Делфи связать формы


  •    Компонент Delphi Memo это простой текстовый редактор. Delphi Memo позволяет вводить многострочный текст с клавиатуры, загружать его из файла, редактировать и сохранять в файл текстового формата. При изучении работы с Delphi Edit советую посетить страничку работа со строками Delphi, так как там описываются функции Delphi для работы с данными, представленными в текстовой форме, с которыми и оперирует компонент Memo.

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

       Текст в компоненте Delphi Memo размещается построчно. Поэтому имеется доступ к каждой строке текста отдельно. Строки в редакторе Delphi Memo являются объектами Lines[i] типа String, где i - номер строки, отсчитываемый от нуля. Объект Lines[i] доступен и для чтения, и для записи. Соответственно, текст в компоненте Memo можно редактировать не только с клавиатуры, но и программно:

    var S: String;
    begin
     Memo1.Lines[3]:='Четвёртая строка по счёту';
     S:=Memo1.Lines[3];
    end;

       Естественно, для успешного присвоения текста определённой строке необходимо, чтобы эта строка физически существовала! То есть, данным способом можно только редактировать текст. Новую строку создать таким способом невозможно. Для создания новых строк служат методы

    begin
     Memo1.Lines.Add('Это будет последняя строка');
     Memo1.Lines.Insert(2, 'Эта строка будет третьей');  //Так как отсчёт идёт от нуля!
    end;

       Пользуясь этим, например поиск фрагмента 'Нужный_Текст' в строках можно организовать так:

    var i: Integer;
    begin
      for i:=0 to Memo.Lines.Count-1 do
        begin
          if AnsiPos('Нужный_Текст', Memo.Lines[i])<>0 then
            begin
              Caption:='Найдено в строке №'+IntToStr(i);
              break;
            end;
        end;
    end;

       Компонент Delphi Memo позволяет получить доступ к тексту как целому. Свойство Text типа String является текстом, содержащимся в редакторе, в виде одной строки. Необходимо учитывать, что эта строка также будет включать в себя и непечатаемые символы конца строки #13 и символы переноса строки #10. Кстати, чтобы продолжить текст с новой строки, необходимо использовать последовательно оба этих символа:

       Delphi Memo обладает свойствами для перемещения курсора и выделения текста, такими же, как и у компонента Delphi Edit:

       Для того, чтобы выделение текста было заметно на экране, небходимо, чтобы компонент обладал фокусом ввода. То есть, чтобы ранее либо пользователь переместил туда курсор, клавишей Tab или щёлкнув мышкой, либо был выполнен оператор Memo1.SetFocus.

       Остаётся вопрос, как определить, где сейчас находится курсор, на какой строке, и позицию в строке. Эти параметры содержатся в свойстве CaretPos компонента Delphi Memo, которое имеет тип TPoint, то есть точка - запись с координатами X и Y:

       Memo1.CaretPos.X // позиция курсора в строке (в отличие от SelStart);
       Memo1.CaretPos.Y // номер строки где находится курсор;

    Михаил, добавлено 9.11.10, 23:25:45 
    Мне нужно написать программу где в поле мемо будет выводится 100000 значений из 200000 возможных но чтобы они не повторялись!! Михаил, добавлено 9.11.10, 23:28:21 
    Заранее спасибо помогите те кто может:( Аноним, добавлено 9.11.10, 23:29:29 
    у меня есть кусочек кода но он не совсем верный и выдаёт одинаковые значения
    procedure TForm2.Button1Click(Sender: TObject);
    label 1;
    var
    tir,a,i,n,z:integer;
    begin
    randomize;
    tir:=StrToint(form1.Edit2.Text);
    a:=StrToint(form2.Edit1.Text);
    for i:=0 to a do begin
    1:z:=random(tir);
    for n:=0 to memo1.Lines.Count-1 do
      memo1.Lines.Add(inttostr(random(tir)));
    end; Автор, добавлено 10.11.10, 08:02:47 
    Михаил, есть чудесный объект как раз для такого случая - StringList. Он умеет контролировать своё содержимое на предмет дубликатов. Повторю основные положения. Создаём объект типа StringList:
    var Unique: TStringList;
    begin
    //Его свойства для блокирования дубликатов:
    Unique.Sorted:=True;
    Unique.Duplicates:=dupError;
    {Добавьте перед randomize в вашей программе. Теперь при добавлении дубликата будет исключительная ситуация. Перед добавлением в Memo добавляем значение в Unique в секции try/except. Если значение уникально, программа пойдёт дальше и запишет его в Memo, а если неуник, то перейдёт к секции except/end. Там может ничего и не быть. Внутренний цикл:}
    for n:=0 to Memo1.Lines.Count-1 do
    try
      Unique.Add(IntToStr(z));
      Memo1.Lines.Add(IntToStr(z));
    except
    end;
    Алекс, добавлено 12.11.10, 05:52:53 
    Добрый день, не подскажите,как в memo удалить все пустые строки? Автор, добавлено 12.11.10, 07:18:19 
    Есть метод Memo1.Lines.Delete[i] - удаляет строку с индексом i:
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
    begin
    for i:=0 to Memo1.Lines.Count-1 do
      if Memo1.Lines[i]=''
        then Memo1.Lines.Delete(i);
    end; Игорь, добавлено 17.11.10, 13:21:13 
    Как сделать так, что б при выделение какой нибудь строки в memo и нажатие на кнопку 'курсив' курсивным стала только выделенное , а не всё Автор, добавлено 17.11.10, 17:12:35 
    В Memo это нельзя. Этот компонент не имеет возможностей форматирования. Используйте компонент RichEdit. Ольга, добавлено 4.12.10, 09:34:54 
    Здравствуйте, у меня к вам два вопроса:
    1) Я делаю список терминов, которые читаются из файла и выводятся в memo. При чтении получается что читаем с последнего определения, как сделать чтобы в memo читалось все с первой строки а не с последней.
    2) Как в этот список добавить еще одну строчку между терминами, чтобы это все не выглядело слипшись. Автор, добавлено 4.12.10, 09:44:08 
    Ольга, вообще-то нужно приводить ваш вариант программы, а то гадать приходится, как файл создан, как читается, и почему не так, как вы хотите.
    Мой совет: создавайте ваш список в Memo, вставляйте сразу разделительную строку, методом SaveToFile сохраняйте - и всё при чтении будет так, как вы сделали.
    Нынешнее положение вещей вот как можно поправить:
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
        S: String;
    begin
    S:='';
    for i:=Memo1.Lines.Count-1 downto 0 do
      S:=S+Memo1.Lines[i]+#13#10#13#10; //#13#10 - перевод на новую строку, делаем дважды
    Memo1.Text:=S;
    Memo1.Lines.SaveToFile('Имя_Вашего_Файла');
    end;
    Если это не подходит, повторюсь: приведите ваш вариант, и будем думать. Ольга, добавлено 5.12.10, 07:00:33 
    Мой вариант:
    procedure TForm82.FormCreate(Sender: TObject);
      var Name:string;
    begin
      Name:='Gloss.txt';
      memo1.Lines.LoadFromFile(Name);
      edit1.SetFocus;
    end;
    procedure TForm82.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
     var i:Integer;
    begin
      memo2.Clear;
      for i:=1 to (memo1.Lines.Count-1) do
      if Pos(edit1.Text,memo1.Lines.Strings[i])=1 then
       memo2.Lines.Add('   '+memo1.Lines.Strings[i]);
    end;
    Можно здесь упростить как-нибудь - чтобы он считывал сразу из файла и выводил в memo1, не создавать memo2 чтобы он сначала загружал туда, и только потом выводил в memo1? Автор, добавлено 5.12.10, 16:08:19 
    Итак, вы хотите найти в файле строки, начинающиеся на edit1.text, и вести их в Memo2. Есть методы чтения из текстового файла, вместо Read используется Readln. Но на мой взгляд, это приемлемо
     если операция производится один раз. А если вы постоянно запрашиваете информацию, то это очень накладный процесс - постоянно читать с диска. Гораздо быстрее искать в памяти! Считать
    один раз файл в тот же Memo, или лучше в StringList, и потом обращаться уже к нему.
    //Глобальная переменная 
    var Gloss: TStringList;
    procedure TForm82.FormCreate(Sender: TObject);
    begin
      Gloss:=TStringList.Create;
      Gloss.LoadFromFile('Gloss.txt');
    end;
    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    var i: Integer;
    begin
      Memo1.Clear;
      for i:=0 to Gloss.Count-1 do
        if pos(Edit1.Text, Gloss[i])=1
          then Memo1.Lines.Add('   '+Gloss[i]+#13#10#13#10);
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Gloss.Free;
    end;
    Ну и кроме того, в процедуре OnFormCreate невозможно выполнить Edit1.SetFocus; Вместо этого, поставьте Edit1 в верх списка TabOrder... Ольга, добавлено 6.12.10, 04:47:51 
    спасибо, в принципе все работает, но получается что он ищет только при нажатии Enter, а не сразу при введении первой буквы, и вторая проблема, я никак не могу сообразить как сделать так
     чтобы при поиске он всеже показывал с первого термина, а не с последнего...(( Ольга, добавлено 6.12.10, 04:51:17 
    Вот, я сделал все таки вместо OnKeyDown, OnKeyUp теперь он ищет сразу же, но вот вторая проблема.. как мне избавиться от того чтобы он выводил все с первого термина, все таки осталась( Ольга, добавлено 6.12.10, 04:59:37 
    Да, и если я еще совсем не надоела.. есть маленький вопросик, как сделать так, чтобы при разных разрешениях экрана, все находилось на своих местах, а не съезжало.. Автор, добавлено 6.12.10, 07:39:17
    Получается, что очередной термин добавляется в конец списка и, когда их уже достаточно много, верхние термины уходят вверх, и не видны, в этом проблема? Нужно использовать промежуточную переменную. Cуммировать термины в неё, а потом показать в Memo:
    procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    var i: Integer;
        S: String;
    begin
      Memo1.Clear;
      S:='';
      for i:=0 to Gloss.Count-1 do
        if pos(Edit1.Text, Gloss[i])=1
          then S:=S+Gloss[i]+#13#10#13#10;
      Memo1.Text:=S;
    end;
    Оксана, добавлено 9.12.10, 13:58:51 
    Здравствуйте, как сделать так, чтобы при чтении из файла, в memo выводилась надпись не зависимо с какой буквы мы ведем поиск. Например: "Привет"."ПРИВЕТ","привет".
    Автор, добавлено 9.12.10, 14:10:26 
    Вопрос не совсем понятен, точнее совсем не понятен - Memo, поиск, чтение, куда, чего... Но управлять регистром символов можно операторами
      AnsiUpperCase('Текст')='ТЕКСТ' - переводит в верхний регистр
      AnsiLowerCase('ТЕКСТ')='текст' - переводит в нижний регистр
    Те же операторы без Ansi не понимают русские символы, то есть англ. будут переведены в нужный регистр, а русские останутся как есть (сведения для полноты картины). Ольга, добавлено 10.12.10, 14:05:07 
    Извините за беспокойство, это сново я. При поиске я столкнулась с проблемой, что при вводе в edit текст, допустим с маленькой буквы, он ее не ищет, так как в файле у меня записано все с большой буквы.. Автор, добавлено 10.12.10, 15:51:00 
    Сравнивайте при поиске значения из Edit и Gloss предварительно переведённые в верхний или нижний регистр:
    if pos(AnsiUpperCase(Edit1.Text), AnsiUpperCase(Gloss[i]))=1
      then S:=S+Gloss[i]+#13#10#13#10;
    Ну чего уж проще... Ольга, добавлено 11.12.10, 06:57:58 
    Ну я ведь только учусь, и как вы могли заметить у меня с трудом это получается. Спросить больше не у кого... Спасибо большое за помощь!!! Андрей, добавлено 14.12.10, 19:34:20 
    Добрый день. Это забавно, но разве в списке вариантов, когда пишешь "Form1.Memo1.", должен Add значится функцией(Borland Delphi 7)? У меня Access Violation на этой строке:
     Form1.Memo1.Lines.Add(str); // str типа string
      Автор, добавлено 14.12.10, 20:54:57 
    Вопрос неясен. Гость, добавлено 14.12.10, 21:50:43 
    Я заполнил MEMO через StringGrid надо чтоб я в вожу в edit номер строки(MEMO) нажимаю ок и вдругом МЕМО выводилось то что содержится в этой строке Автор, добавлено 14.12.10, 22:04:19 
    Содержимое i-й строки Memo:
    Memo1.Lines[i]
    Показать текст в Memo:
    Memo2.Text:=Memo1.Lines[StrToInt(Edit1.Text)];
    Мне грустно такие ответы "помогать". Гость, добавлено 14.12.10, 22:37:42 
    чет не фурычит Автор, добавлено 15.12.10, 05:36:45 
    У меня фурычит. Алексей, добавлено 19.12.10, 12:07:12 
    уважаемые специалисты подскажите а то я уже мозг дымится
    как заключить в цикл несколько Memo, есть 8 штук мемо, как их поставить в цикл, что-то типа
    for i:=1 to 8 do
     memo[i].lines.add('');
    но так не пройдет, есть ли способ чтобы сразу во все 8 мемо вставить одну строку...? Алексей, добавлено 19.12.10, 12:33:29 
    нашел на самом гугла, мож кому пригодиться :
    "..массив из компонентов TMemo
    mas:array [0..n] of TMemo;
    тогда можно будет цикл замутить.
    Лучше тогда сами memo задавать динамически например при создании формы..."
    вроде должно прокатить! Александр, добавлено 28.12.10, 13:42:41 
    Здравствуйте, имеется такой код:
      sl:= TStringList.Create; k:=1; n:=10;
      sl.Sorted:=true; sl.Duplicates:=dupError;
      for j:=1 to n do
      begin
      flag:=false;
      try
      sl.Add(IntToStr(delta(j));
      //delta(j)-это функция, возвращающая
      //целочисленные значения
      except on EStringListError do begin
      flag:=true; k:=k+1; //k – счетчик повторов
      end;
      end;
      if flag=True then Continue else
      begin
      k:=1;
     ...//выполняем определенные действия
      //над значениями delta(j) и их
      //количеством
      end
      end
    Например, по ходу цикла значения delta(j) равны 1500, 1500, 1500, 2800, 2800, 380, 1250 и т.д. В первом шаге цикла повтора нет, соответственно, выполняется код, но в нем присутствует неправильное количество значений delta(j), а именно k=1. Истинное значение повторов появляется только на третьем шаге цикла. Вопрос вот в чем: как можно отловить последнюю ошибку, чтобы количество k было истинным?
    Заранее спасибо за помощь. Автор, добавлено 28.12.10, 14:06:29
    То есть, вам нужно произвести определённые действия над значениями и количеством их повторов функции delta.
    Соответственно, это можно сделать только имея информацию о повторах заранее, не? Поэтому сначала нужно эти значения получить и подсчитать повторы. Соответственно, цикл, получающий значения повторов нужно вынести за код, выполняющий с ними действия. Ну, то есть, выполнять его перед ним.
    Для этого я предлагаю организовать массив, лучше динамический, куда эти значения будем записывать, элементы массива - записи, первое поле - значение функции, второе - количество повторов. Получив исключительную ситуацию, ищем в массиве такое значение delpta и прибавляем единичку в поле количества повторов. В противном случае просто добавляем ещё один элемент к массиву.
    Ну и вот, сначала проходим циклом по j, вычисляем функцию delta и подсчитываем количество её повторов. А затем уже выполняем нужные действия... По-моему, такую программу написать несложно, пока воздержусь, если не получится - пишите! ))) Александр, добавлено 28.12.10, 15:29:10 
    Автор, спасибо Вам за ответ, но у меня уже совсем мозги закипели и не могу понять ход дальнейшей реализации моего кода после того, как я получил массив со значениями delta(j) и их повторов. Проход цикла должен быть именно в интервале от j:=1 до n, и как все это связать с массивом... Автор, добавлено 28.12.10, 17:38:52 
    Может, возможно повторное выполнение действий, если встретилось повторное значения delta?
    Хотя, утро вечера мудренее, я уезжаю, утром посмотрю. Александр, добавлено 29.12.10, 01:04:57 
    Огромное Вам спасибо, вопрос решил, правда, исключительно с помощью TStringList, но самое главное - это то, что вначале надо было получить информацию о повторах, как Вы и посоветовали! оля, добавлено 7.03.11, 00:40:11 
    begin
    e:=strtoint(edit1.text);
    X:=1;
    sr:=1/x;
    s:=0;
    while sr>e do begin
    x:=x+0.5;
    S:=s+sr;
    sr:=1/x;
    memo1.lines.add()что нужно в скобках написать? Автор, добавлено 7.03.11, 09:53:38 
    Я не понял только, зачем весь предшествующий код... И не начат и не закончен!
    А вот если в скобках написать 'Hellow World', то эта фраза добавится в качестве последней строки в компонент memo1. Женя, добавлено 30.03.11, 18:59:56 
    Блин, люди... Подскажите оперецию? Вот я должен нажать на кнопку и чтоб в мемо1 прописался код!!!Только уже с новой строки и незаменяя тругие записи в мемо1??? Автор, добавлено 30.03.11, 19:22:15 
    Memo.Lines.Add('Нужный код'); Женя, добавлено 31.03.11, 13:27:26 
    Спасибо Автор!!! )))) Андрей, добавлено 15.04.11, 21:00:52 
    помогите дали задание. Выполнить форматирование строк списка - если в строке более N символов, то выполнить перенос на новую строку.
    в вожу в Edit число и все строки становятся размером = тому числу которое я ввел. Андрей, добавлено 15.04.11, 21:12:16 
    Как сделать в МЕМО чтоб нажимаю на кнопку происходила нумерация строк Админ, добавлено 16.04.11, 11:06:46 
    Насчёт нумерации.
    Memo1.Lines[i]:=IntToStr(i+1)+'. '+Memo1.Lines[i];
    Это сложно???
    Насчёт форматирования. Есть методы работы со строками. Копирование, удаление, вычисление длины строки. Ну и если строка длинее N, то первые N символов копируем на текущую строку, остальные методом Insert добавляем после неё. И так же проверяем на длину. Ну ничего сложного. Включаем мозги. Предлагаем свои варианты, что не получается - объясняю. А так, как говорится, папа у Васи силён в математике... Женька, добавлено 8.05.11, 16:28:57 
    имеется два поля memo. в первом вводится открытый текст во втором отображается зашифрованный....функция работает правильно а вот второе memo отображает только первые 5 символов....вот мой код....
    procedure TForm1.Button1Click(Sender: TObject);
    var key:Integer;
    begin
      key:=StrToInt(Edit1.Text);
    Memo3.Text:=Encryption_Cezar(Memo2.text,key);
    end;
    ...а как сделать чтоб отображалась вся информация
    Аня, добавлено 16.07.11, 12:27:05 
    а можно ли как-то в мемо вывести массив и посчитать максимальный элемент Автор, добавлено 16.07.11, 12:55:23 
    Да, можно. В чём сложность? Допустим, массив
    var X: array[1..100] of Integer;
    В обработчике нажатия кнопки пишем:
    for i:=1 to High(X) do
     Memo1.Lines.Add(IntToStr(X[i]));
    Вот и вывели массив. А подсчитать можно параллельно с выводом. Объявляем переменную M, в которой будем сохранять номер максимального элемента массива. Для начала записываем в неё 1. Ну и далее, записываем в мемо очередной элемент и сразу сравниваем:
    if X[i]>X[M] then M:=i;
    На выходе будет X[M] - максимальный элемент. А можно запоминать не индекс максимума, а сам максимум... Андрей, добавлено 10.08.11, 15:00:56 
    Добрый день. У меня такой вопрос. Как двумерный массив вывести в memo, при том, чтобы строки массива соответствовали строкам memo?
    Благодарю за ответ.
    Автор, добавлено 10.08.11, 16:46:36
    procedure TForm1.Button1Click(Sender: TObject);
    var i, j: Integer;
    X: array[1..10, 1..20] of String;
    S: String;
    begin
    for i:=1 to 20 do
     begin
      S:='';
      for j:=1 to 10 do
      S:=S+' '+X[j, i];
      Memo1.Lines.Add(IntToStr(i)+'. '+S);
     end;
    end; Ника, добавлено 12.08.11, 12:36:41 
    Подскажите пожайлуста,как в тексте(загруженом в Memo) найти предложения содержащие более 30 сим. и вывести в соседний компонент Memo? Автор, добавлено 12.08.11, 16:46:57 
    Нужно в цикле искать первый символ, который может быть концом предложения. Его позиция - кол. символов минус один если пробелы считаютсь символом. Если нет - подсчитать и вычесть. Если оставшийся результат устраивает, копируем. Затем рассматриваемое предложение вырезаем из текста. И опять также анализируем оставшийся текст. Ух ты, добавлено 31.08.11, 04:45:12 
    Здравствуйте. у меня такая проблема, нуно написать программу по нахождению минимального значения из множества полученных чисел. числа эти получаются следующим образом: Таблица "А" - первая строка(значения X,Y,Zb)... всего 19 строк, заголовок одинаковый(X,Y,Zb)а значения все разные.
    и таблица "Eleme" в которой больше 10000 значений и заголовок X,Y,Z.
    так вот.. необходимо по формуле расчитать корень для каждых строк таблицы "А" (т.е. сначала 1 строку, потом вторую...), и из множества значений полученных выбрать минимальное. и записать в файл напротив данных в таблице "А" в соответствующей строке(напротив X,Y,Zb...) помогите пожалуйста...может через memo получится сделать? Автор, добавлено 31.08.11, 08:23:51 
    Начнём "от печки". Где содержатся данные, вы пишете "в таблице". Таблица в Delphi это StringGrid, например. Причём Memo?
     Теперь объясните понятие "файл напротив данных". Файл это место на диске, где эти данные содержатся, и что там есть "напротив"?
    Зачем вы упомянули таблицу "Eleme", если с ней никаких условий нет?
    Далее. "Рассчитать корень по формуле". Я не знаю что такое корень (ну, у уравнения есть корень, но у вас про уравнения нет ни слова). Хорошо, допустим, есть формула (кстати, тоже мне неизвестная). Что, проблема рассчитать по ней значение? Проблема найти из них минимальное? Хорошо, это я вам подскажу:
    function MyFunc(S1, S2, S3: String): String;
    var X1, X2, X3: Real; //Ну или Integer, что там у вас
    begin
    //Перевод строк в числа:
    X1:=StrToFloat(S1); X2:=StrToFloat(S2); X3:=StrToFloat(S3);
    //Вычисление функции:
    Result:={я вставлю случайное число, а вы замените на свою функцию}FloatToStr(random(100));
    //Необходимо выровнять длины чисел, добавим спереди '0'
    if Length(Result)<2 then Result:='0'+Result;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
     Selector: TStringList;
     Func: String;
    begin
    //Создаём объект типа StringList:
    Selector:=TStringList.Create;
    //Вполне возможны дубликаты, их нужно разрешить добавлять в StringList:
    Selector.Duplicates:=dupAccept;
    with StringGrid1 do
    for i:=1 to RowCount-1 do
      begin
        Func:=MyFunc(Cells[1, i], Cells[2, i], Cells[3, i]);
        Cells[4, i]:=Func;
        Selector.Add(Func);
        Application.ProcessMessages;
      end;
    //Сортируем StringList:
    Selector.Sort;
    //StringList сортирует добавленные строки (пусть даже это и числа в виде строк), вверху - минимальное число
    //я его выведу в заголовок Формы, но сначала нужно удалить лишние '0'
    Caption:=FloatToStr(StrToFloat(Selector[0]));
    end;
    Скачайте, посмотрите проект данной программы.
    А на будущее - выражайтесь яснее, так как ещё античные философы поняли, что:
     "В правильно сформулированном вопросе содержится половина ответа" аноним, добавлено 7.09.11, 20:13:33 
    Memo1.Lines.Delete[i]; //Удаление строки с индексом i
    В этой строке синтаксис не верный. Правильнее заключать i в круглые скобки, а не квадратные. Во всяком случае в delphi2010. Автор, добавлено 7.09.11, 20:31:54 
    Спасибо, совершенно справедливо. Удивительно, как до сих пор никто не замечал. Исправил. Саша, добавлено 15.09.11, 19:56:32 
    Здраствуйте! У меня такая проблема: можно ли в поле MEMO писать в несколько столбцов? Если "да" то как? Автор, добавлено 15.09.11, 20:11:03 
    Думал-думал, ничего не придумал. Вариант, использовать равноширинные шрифты, и высчитывать ширину написанного текста, и корректировать написанный текст, чтобы столбцы не сдвигались. Это сложно. Другой вариант - использовать столько Memo, поставленных встык, сколько планируется столбцов. Можно сделать их с параметром BorderStyle:=bsNone, чтобы смотрелись как один. Внешнюю границу можно нарисовать по Форме, если нужна.Нужны только ещё промежутки между столбцами - поставьте например панели, тоже без границы, или типа того. Только при добавлении текста в одну из Memo нужно следить, чтобы количество строк было одинаково - если меняется, то добавлять к другим по пустой строке. Также нужно следить за покруткой, чтобы строки смещались одинаково. В общем, непросто. Саша, добавлено 15.09.11, 20:28:38 
    вот что у меня есть:
    procedure TForm1.Button1Click(Sender: TObject);
    var y1,y2,y3,y4,x1,x2,step:real; label l1;
    begin
      if (Length(Edit1.Text)=0) or (Length(Edit2.Text)=0) or (Length(Edit3.Text)=0)
      then begin ShowMessage('Некоректний ввід даних'); goto l1; end;
    x1:=StrToFloat(Edit1.Text); x2:=StrToFloat(Edit2.Text); step:=StrToFloat(Edit3.Text);
      if (x1=x2) or (step=0) or (x1>x2) or (step>(x2-x1)) then begin
      ShowMessage('Некоректний ввід даних'); goto l1;
      end;
    Memo1.Alignment:=taLeftJustify; Memo1.Text:='Результати Y1: Результати Y2: Результати Y3: Результати Y4:'+#13#10;
    while (x2>=x1) do begin
    y1:=sin(x1); y2:=((1-cos(2x1))/2); y3:=cos(x1); y4:=((1+cos(2x1))/2);
    Memo1.Text:=Memo1.Text+FloatToStr(y1)+' '+
    FloatToStr(y2)+' '+FloatToStr(y3)+' '+FloatToStr(y4)+#13#10;
    x1:=x1+step;
    end; Memo1.Lines.SaveToFile('log.txt');
    l1: end;
    тут вычисляется 4 функции (sin_x, cos_x, sin2_x,co2_x) и они идут через цыкл от меншего Х к большему с шагом step Автор, добавлено 15.09.11, 20:37:34 
    Ну если вы вручную ничего не пришете, то просто определите сколько пробелов вставлять между числами (опытным путём), и добавляйте. Я вижу, вы уже добавляете по одному, ну, добавьте побольше. Саша, добавлено 15.09.11, 20:50:36 
    Так дело в том, что не возможно угадать по символах, потому что длина выводимого Y иногда меняется... может лучше сделать так: выводить не всю длину, какую оно мне вычислит, а только округленную до определённого количества символов. но как это сделать - я не знаю... может что-то посоветуете? Автор, добавлено 15.09.11, 20:55:23 
    Ну конечно! Я думал они равные выходят. Если это допустимо - нужно отсекать лишние цифры. Можете сами написать функцию, или мою взять, на странице "работа со строками" внизу. Саша, добавлено 15.09.11, 21:04:52 
    Было бы хорошо как то описать это в этой же процедуре... а не создавать отдельную функцию "Copy(S: String; Index, Count: Integer): String".... Автор, добавлено 15.09.11, 21:09:31 
    Ну так посмотрите, как она реализована, и опишите. Хотя всё в одну процедуру пихать - каша будет. Потом сами не разберётесь. Лучше, наоборот, независимые куски кода разносить в разные процедуры, и просто вызывать из основной. Саша, добавлено 15.09.11, 21:12:04 
    Ладно, буду думать дальше... Спасибо! Антон, добавлено 18.09.11, 08:38:09 
    Здравствуйте!
    Прошу Вашей помощи, не могу справиться сам. Как в поле Memo вывести одномерный массив чисел в одну строчку, чтобы они записаны были так:
    а[1]=134 a[2]=250 a[3]=106 и так далее. Буду весьма признателен Вам. Автор, добавлено 18.09.11, 09:00:20 
    Начнём сначала. Допустим, цикл описан так:
    var a: array[1..100] of Integer;
    Сначала инициализируем то, что мы хотим получить:
    Memo1.Text:='';
     Есть такое понятие как цикл. Записываем цикл for (только нужно описать переменную цикла var i: Integer;):
    for i:=1 to 100 do
    Ну и прибавляем к результату по очередному элементу:
      Memo1.Text:=Memo1.Text+'a['+IntToStr(i)+']='+IntToStr(a[i])+' ';
    Всё. Пробел в конце нужен, чтобы всё не слилось. Лучше сделайте побольше - два, три. Антон, добавлено 18.09.11, 09:16:29 
    Огромное спасибо! Понимаете, первый раз делаю программу в Делфи. До этого никогда не работал в ней, перевелся в другой вуз и приходится догонять. И у меня завтра сдача курсового проекта - разаработать программу, выполняющую операции с римскими числами. Самое интересное, что я уже сделал с помощью Delphi интерфейс, добавил музыку, картинку на заглавную форму, сделал конвертор римских и арабских цифр, сделал калькулятор с римскими числами и застрял как раз вот на этом моменте, когда понадобилось вывести одномерный массив в компонент Delphi. Банально не знал при помощи какой процедуры это можно сделать.
    P.S. Вы меня, надо сказать, застыдили) Просто приходится изучать среду огромными скачками в бешенном тэмпе) Автор, добавлено 18.09.11, 09:22:43 
    Антон, беру свои слова назад - большую работу проделали. Потру первую фразу! Новичок, добавлено 20.10.11, 21:41:43 
    Здравствуйте!
    Такая проблема - есть файл config.cfg Для наглядности приведу фрагмент этого файла:
    ...
    MP3Volume "1"
    mp_decals "300.000000"
    name "NO PASARAN" //искомая строка
    net_graph "0"
    net_graphpos "1"
    ...
    Меня интересует строка - name "....." (name может быть разным), а именно та подстрока, что в кавычках.
    Как в Делфи организовать поиск в файле этой подстроки и вывести её в edit?
    Я хотел сделать это с помощью memo, но не понял как найти строку и то, что в кавычках.
    Заранее благодарен! Новичок, добавлено 20.10.11, 22:18:35 
    А, и еще, в этом файле слово "name" встречается несколько раз, мне нужна именно эта строка. Кстати именно в этом случае "name" встречается в начале строки. Автор, добавлено 20.10.11, 23:40:15 
    Если для файла слово под ником name известно, не вижу сложности выделить строку, в которой первые символы имеют это значение. Pos(name, memo.lines[i])=1 А затем выделить слово в кавычках. Новичок, добавлено 21.10.11, 03:39:37 
    Спасибо! Это сделал так:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      t,z: string;
      p,i: integer;
    begin
      Memo1.lines.LoadFromFile('cfg\config.cfg');
      for i := 0 to memo1.lines.count -1 do
      begin
      if Pos('name', memo1.lines[i])=1 then
      t:=memo1.lines[i];
      end;
      p:=pos('"', t)+1;
      z:=copy(t, p, 20);
      edit1.text:=z;
    end;
    Теперь name отображается в edit'е, но никак не получается новый, измененный name сохранить. При запуске программы снова старый появляется (в файле тоже остается старый).
    procedure TForm1.Button4Click(Sender: делфи TObject);
    var
      n:string;
    begin
      n:=edit1.Text;
      for i := 0 to memo1.lines.count -1 do
      begin
      if Pos('name', memo1.lines[i])=1 then
      memo1.lines.Delete(i);
      end;
      memo1.Lines.Add('name'+n);
    end;
    И еще по разному пробовал. Новичок, добавлено 21.10.11, 03:48:34 
    хотя в принципе строку можно и не удаляя заменить, но у меня не получалось. Автор, добавлено 21.10.11, 10:24:51 
    Ну вот, оказывается, у вас name и означает name! Написали, что name может быть разным...
    А у вас в файле всего одна строка с name? Вы проверяете все строки, ну нашли name, зачем остальные проверять? Есть оператор break - завершает цикл.
    Ну а заменить строку в Memo, чего может быть проще? Memo1.Lines[i]:='name '+''''+Edit1.Text+''''; - в обработчике OnChange. Или при нажатии кнопки, что хотите. Новичок, добавлено 21.10.11, 15:19:09 
    А как сделать, чтобы он сохранялся? Я сделал memo видимым и там видно, что name меняется, но не сохраняется. При повторном открытии (или открытии файла в блокноте) остается предыдущее значение.
    Если при помощи блокнота изменить и сохранить, то все норм. Новичок, добавлено 21.10.11, 15:19:57 
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      for i := 0 to memo1.lines.count -1 do
      begin
      if Pos('name', memo1.lines[i])=1 then
      Memo1.Lines[i]:='name '+'"'+Edit1.Text+'"';
      end;
    end; Автор, добавлено 21.10.11, 15:21:33 
    Ваще не понимаю - считать считали, а сохранить ленитесь?
    Memo1.Lines.SaveToFile... Новичок, добавлено 21.10.11, 15:31:10 
    да, да, да)) я уже сделал. Сразу не догадался. В этом и была проблема, со вчерашнего дня. А строку я таким способом и менял вчера но не сохранял.
    Простите за такое количество вопросов!
    Отличный сайт. Премного благодарен! Тимур, добавлено 22.10.11, 15:41:39 
    Здравия всем! народ, помогите кто знает, пишу программу, в ней нужен поиск в мемо, поиск есть и работает... только хотелось бы, чтоб он искал и дальше, а не только первое попавшиеся значение! А так же чтобы не учитывал регистр букв!
    код:
    var
     Find,s :string; // искомая строка
     FSelPos, StartPos, i:integer; // счетчик для цикла
    begin
     find:=Edit1.Text; // записывает в find текст из Edit
    For i:=0 to Memo1.Lines.Count-1 do // запускает цикл поиска строки
    If Pos(FIND, Memo1.Lines.Text)0
    Then
    Begin
     Memo1.SetFocus();
     Memo1.SelStart:=Pos(FIND,Memo1.Lines.Text)-1;
     Memo1.SelLength:=Length(FIND);
    end;
    end;
    Автор, добавлено 22.10.11, 15:54:36 
    Нужно, чтобы поиск запоминал место остановки, т.е.
    Memo1.SetFocus();
    Memo1.SelStart:=Pos(FIND,Memo1.Lines.Text)-1;
    Memo1.SelLength:=Length(FIND);
    N:=i+1;
    Причём N - глобальная переменная. И чтобы цикл запускался от N а не от нуля. А регистр букв - можно в функции Pos и FIND и Memo1.Lines.Text (здесь, по-моему, индекс строки пропущен - [i]) привести к одному регистру, например нижнему функцией AnsiLowerCase.
    Предусмотрите возможность обнуления N, например кнопку "Новый поиск". Тимур, добавлено 22.10.11, 17:10:27 
    есть следующий способ попытки реализовать последующий поиск, почему-то правда так и не работает, и еще мне кажется что тут есть что-то лишнее, но не могу найти где)
    var
    Find,s:string;
    i,j,r,k,len:integer;
    begin
    find:=AnsiUpperCase(Edit1.Text);
    For i:=k to Memo1.Lines.Count-1 do
    begin
    r:=Pos(FIND,AnsiUpperCase(Memo1.Lines[i]));
    If r>0 Then Begin s:='';
    len:=0;
    for j := 0 to i-1 do len:=len+Length(Memo1.Lines[j])+2;
    k:=i+1;
    Memo1.SetFocus();
    Memo1.SelStart:=len+r-1;
    Memo1.SelLength:=Length(FIND);
    Break;
    End;
    if i=Memo1.Lines.Count-1 then
    begin
    ShowMessage('поиск окончен');
    k:=0;
    end;
    end;
    end; Автор, добавлено 22.10.11, 18:17:09 
    Короче, смотри, как можно сделать. Делаем копию
     S:=Memo1.Text;
    Ищем в ней, находим первое вхождение нужного текста, а выделяем в Memo, в той же позиции и длине. Затем делаем замену в S текущей найденной последовательности на любые символы, хоть на пробелы. И при следующем поиске уже найдётся другая заданная последовательность. Замену просто делаем в цикле - заменяем символы S[j]:=' ';
    Ну и вот что получилось:
    var
    Form1: TForm1;
    NewSearch: Boolean=True;
    S: String;
    implementation
    {$R.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var i, j, n: Integer;
    begin
    if NewSearch then S:=Memo1.Text;
    for i:=1 to Length(S) do
      begin
        n:=pos(Edit1.Text, S);
        if n<>0 then
          begin
            Memo1.SetFocus;
            Memo1.SelStart:=n-1;
            Memo1.SelLength:=Length(Edit1.Text);
            for j:=n to n+Length(Edit1.Text) do
              S[j]:=' ';
              NewSearch:=False;
          end else ShowMessage('Поиск окончен');
          break;
      end;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      NewSearch:=True;
    end;
    Тимур, добавлено 22.10.11, 20:31:23 
    О, отлично, алгоритм работает хорошо! Благодарю! Я немного не так начинал делать... буду знать теперь) ;) В нете вообще нигде конкретных примеров не найти. Да кстати еще такой вопрос, возможно ли как-нибудь реализовать поиск не в одном мемо, а сразу же в нескольких?! Я думаю, просто этим методом не получиться такое реализовать, если вообще возможно подобное... Автор, добавлено 22.10.11, 22:10:28 
    Да ладно, всё мыслимое возможно!
    Просто для каждого Memo своё S... Тимур, добавлено 22.10.11, 23:11:13 
    Хорошо) :) А как это все реализовать через одну кнопку? С помощью подпрограмм возможно... тогда получается надо будет весь этот алгоритм вставлять внутрь этой процедуры и под каждое мемо в каждую функцию... Автор, добавлено 22.10.11, 23:17:20 
    Есть такая штука - называется массив. Делаем массив компонентов Memo и такой же массив типа String. Тогда каждому MassMemo[i] будет соответствовать свой MassString[i]. Тимур, добавлено 22.10.11, 23:25:32 
    Уу, да, помнится... изучали такие вещи))) =) Правда никому они не нравились. Ну ладно, буду пытаться сам пока создать нечто подобное. Автор, добавлено 22.10.11, 23:35:52 
    Да не, ничего особенного.
    var ArMemo[1..10] of TMemo;
      ArS[1..10] of String;
    begin
      ArMemo[1]:=Memo1;// и так далее, или можно динамически создавать.
    end;
    Ну и всё, в цикле запускаем процедуры поиска. Тимур, добавлено 23.10.11, 14:46:14 
    Ну, ничего особенного наверное для опытных программистов) ;) Я с массивами практически не работал... только по учебе прошли давно, и не пользовались. Если первые массивы еще вроде бы получаются, то со следующими я явно что-то забываю... не идет. =) думаю смысла код выкладывать особого нету... Новичок, добавлено 24.10.11, 04:05:52 
    Здравствуйте, все же с моей программой что-то не то. Создаю новый проект, пишу код, приведенный ниже, тестирую... Значение name(к примеру, ААА) отображется в edit'е, но стоит мне изменить цвет формы (сохранить и т.д.) и уже в edite'е появляется само слово "name". После этого хоть что ни делай, все равно - "name". Не могу понять в чем дело. Помогите, пожалуйста.
    var
      i,p:integer;
      z,t:string;
    begin
      Memo1.lines.LoadFromFile('cstrike\cfg\config.cfg');
      for i:=0 to memo1.lines.count -1 do
      begin
      if Pos('name', memo1.lines[i])=1 then
      t:=memo1.lines[i];
      end;
      p:=Pos('"', t);
      z:=Copy(t, p, 15);
      for i:=0 to length(z) do
      if Pos('"',z)>0 then
      delete(z,Pos('"',z),1);
      edit1.text:=z;
    end; Автор, добавлено 24.10.11, 07:56:41 
    1. вы проигнорировали моё замечание относительно break;
    2. используете лишние переменные. Зачем нужна z, можно сохранять в ту же t
    3. в одном случае вы вычисляете p:=Pos('"', t); в другом прямо используете delete(z, Pos('"',z), 1);. Значит и без p можно обойтись.
    4. что такое 15 в z:=Copy(t, p, 15); Видимо, вы берёте с запасом, чтобы перекрыть длину строки. Так не проще ли удалять первые символы, чем копировать последние? delete(t, 1, Pos('"', t)-1); это будет методически правильнее.
    5. вот это
    for i:=0 to length(z) do
      if Pos('"',z)>0 then
    заменить на
    while Pos('"',z)>0 do
    Всё вышеперечисленное усложняет код. Вот что получилось:
    var
      i: integer;
      t: string;
    begin
      Memo1.lines.LoadFromFile('cstrike\cfg\config.cfg');
      for i:=0 to memo1.lines.count -1 do
      if Pos('name', memo1.lines[i])=1 then
      begin
      t:=memo1.lines[i];
      break;
      end;
      delete(t, 1, Pos('"', t)-1);
      while Pos('"', t)>0 do
      delete(t, Pos('"', t), 1);
      edit1.text:=t;
    end;
     
    А теперь покажите мне в этом коде то место, на которое могут повлиять другие события. Тимур, добавлено 24.10.11, 16:13:59 
    var i, j, n: Integer;
      ArMemo:array[1..10] of TMemo;
      ArS:array[1..10] of String;
    begin
     Ars[1]:=S1;
     ArMemo[1]:=Memo1;
    if NewSearch then S1:=Memo1.Text;
    for i:=1 to Length(S1) do
      begin
      n:=pos(Edit1.Text, S1);
      if n0 then
      begin
      Memo1.SetFocus;
      Memo1.SelStart:=n-1;
      Memo1.SelLength:=Length(Edit1.Text);
      for j:=n to n+Length(Edit1.Text) do
      S1[j]:=' ';
      NewSearch:=false;
      break;
      end;
      end;
    end;
    и дальше не идут так... Автор, добавлено 24.10.11, 16:58:35 
    Не разобрались в массивах. Создав массив arS, не нужно уже присваивать ars[1]:=S1, arS[1] уже переменная типа String. Она будет работать с элементом массива ArMemo[1]. В цикле, естественно, будут работать arS[i] и arMemo[i].
    Вот с arMemo вышла засада. Нужно динамически создавать компоненты arMemo[1], arMemo[2] и так далее. Можно тоже в цикле, но нужно указать координаты каждого. Вот как:
    for i:=1 to 10 do
     begin
      arMemo[i]:=TMemo.Create(Form1);
      arMemo[i].Parent:=Form1;
      arMemo[i].Width:=100;
      arMemo[i].Height:=100;
      arMemo[i].Left:=XMemo[i];
      arMemo[i].Top:=YMemo[i];
     end;
    Естественно, массивы XMemo и YMemo с координатами создать заранее. Ну вот, теперь мы имеем массив с Memo и массив с соответствующими им S. Можно в цикле запускать обработку, как в приведённой мной программе, только вместо Memo1 - arMemo[i], и вместо S - arS[i]. Расписывать не буду, думайте. Тимур, добавлено 24.10.11, 17:42:24 
    А какой тип нужно задать для XMemo и YMemo? У меня снова ошибка выскакивает, если поиск начинать со значениями... если просто жать на поиск без значений, вообще глюки идут... создается область типа едита размером 100 на 100 как я понял, на той же панели, где и кнопка) =))) Автор, добавлено 24.10.11, 18:49:05 
    Да, рановато вам за эту тему браться... И какого же типа с нас параметр Left... Или просто думать не хотите. Наверное, вам проще ручками поставить эти мемо, и просто расписать поиск для каждого.
    Тимур, добавлено 24.10.11, 22:27:24 
    Да ничего не рано... :) прошли когда-то ж... другое дело, что не приходилось живо пользоваться! А тетрадки перерывать, знаете, вам тоже не хотелось бы из-за в принципе пустякового дельца) ;) И думать я обожаю... опять же другое дело, по этой теме знания путаются слегка... короче ладно, писать под каждое мемо в такой программе будет извратом, подробно помочь вы не хотите к сожалению. Автор, добавлено 24.10.11, 23:30:01 
    Либо вы будете учиться, и тогда я помогу, в противном случае помочь означает написать за вас. Вот возьмите новый проект, одну кнопку, и в её обработчике создайте массив из двух мемо, и чтобы не друг на друге лежали. Массив должен быть глобальным. Тогда станет яснее как с вашим проектом справиться. Будут непонятки - подскажу. Аноним, добавлено 25.10.11, 06:14:29 
    Не понимаю почему, но после изменения чего-либо в программе, то, как и раньше, в edite'е появляется само слово "name". Если я создаю новый проект, пишу код, изменяю цвет и т.д., потом сохраняю и компилирую, то все норм вроде. Начинаю добавлять компоненты и т.д., снова "name". Затем пытаюсь вернуть все назад и понять в чем дело. В конце концов удаляю все, кроме edit'a и memo, все равно не работает. Новичок, добавлено 25.10.11, 06:16:47 
    предыдущее сообщение было от меня) Новичок, добавлено 25.10.11, 06:31:00 
    Иногда вообще ничего в edit'e не было. И вдруг я случайно увеличил размер memo и все заработало! Вот уж не думал, что от размера memo(я его делал маленьким) может возникнуть такая проблема.
    Большое спасибо!
    Кстати, а как сделать так, чтобы при запуске приложения курсор был сфокусирован на label, если такое возможно? Хотя у меня и на кнопку что-то не вышло. Автор, добавлено 25.10.11, 14:31:20 
    У компонента Label нет фокуса ввода, и на Форме он никак не выделяется. Но можно чтобы курсор мышки при появлении Формы был на нём, и текст метки был выделен, либо шрифтом жирным, либо цветом... И впоследствии при наведении курсора чтобы так было. А фокус на кнопке просто: Button1.SetFocus; Новичок, добавлено 25.10.11, 16:40:50 
    Я так и делаю: Button1.SetFocus;, но при запуске при ложения сначала появляется сообщение:"Cannot focus a disabled or invisible window". Только после этого появляется форма приложения. Автор, добавлено 25.10.11, 17:39:31 
    Естественно, в момент OnCreate формы на экране ещё нет. Можно это сделать по событию OnActivate, но лучше подредактировать список TabOrder: по любому компоненту правой кнопкой - TabOrder... Аноним, добавлено 1.11.11, 20:42:01 
    помогите, пожалуйста! первый раз работаю с делфи и совсем потерялась. Дана кв. матрица, её некоторым образом преобразовываем. Как вывести новую полученную? Заранее спасибо. Аноним, добавлено 1.11.11, 21:25:48 
    А как сделать так, что бы в Memo1 он писал то, что написано в Edit1? заранее спасибо Автор, добавлено 1.11.11, 21:36:31 
    Так, Анонимы! Вы бы представлялись!!!
    Про матрицу. Можно вывести в компонент StringGrid (лично я предпочитаю - не нужно заботиться о сдвиге строк и столбцов), можно написать прямо на Форме, можно и в компонент Memo.
    Про Memo. И у Memo и у Edit есть свойство Text. Вот и приравнивайте. В обработчике события OnChange. Ваерий, добавлено 1.11.11, 21:57:38 
    А как писать в Memo1 символы записанные в N?
    Сергей, добавлено 5.01.12, 22:40:07 
    У меня программа прошивает микросхему файлом, написанным в Мемо.
    Как сделать так, чтоб при любом изменении в поле Мемо, например если я вручную редактирую файл, кнопка "Прожечь" в форме становилась неактивной?
    Ну или вообще, что изменить в свойствах Мемо, чтобы можно было использовать его и как кнопку? Извините, если вопрос покажется глупым, но я чего-то не нашел ответа в хелпе. Да и еще с английским не очень дружу. Автор, добавлено 6.01.12, 06:12:54 
    В обработчике OnChange компонента Memo пишем
    Button1.Enabled:=False; //Button1 это кнопка "Прожечь", мож у вас и по-другому называется.
    Ну и где-нибудь нужно предусмотреть соответственно и разблокировку кнопки. Сергей, добавлено 7.01.12, 20:53:24 
    Спасибо. Правда интересно получилось. А насчет разблокировки, все просто у меня. Есть кнопка "проверить Мемо", если все правильно, то и разблокируется, и сохраниться предлагает. А где можно почитать про все эти свойства кнопок, форм.... на русском? Автор, добавлено 7.01.12, 22:19:08 
    Насчёт описания свойств не могу что-то определённое посоветовать. Сам про свойства таблицы StringGrid стал делать сайт stringgrid-delphi.ru. Как раз с полным описанием свойств и т.д. Предполагаю и про другие компоненты, но это пока в проекте. Владимир, добавлено 9.01.12, 08:21:00 
    Всем привет, подскажите можно подгрузить в memo данные из бд Acces из текстового поля? в delphi новичок, так что если это просто, прошу не прикалывать. Павел, добавлено 31.01.12, 14:13:26 
    подскажите плиииз, как что не так в программе.Задумка следующая: на форме memo + кнопка BitBtn(служит для обновления текста в memo)+ кнопка BitBtn(открывает окно редактора текстового файла). Сам файл загружается в memo редактора по средством диалога, так же сохраняется. После этого по нажатии кнопки "Обновить" на основной форме мне выдаёт ошибку, что файл не найден(обмолвлюсь сразу, что по замыслу в memo основной формы идёт загрузка из файла сразу же при запуске приложения, а кнопочка "Обновить" должна обновлять содержимое memo основной формы.
    Загрузку в memo файла при запуске я реализовал так:
    procedure TOsnForm.FormActivate(Sender: TObject);
    begin
    Memo1.Lines.LoadFromFile('Отчеты12год.2012\Компрессор№1.jvr');
    end;
    Код сохранения так:
    procedure TDop2.Button1Click(Sender: TObject);
    var
    EditFile: String;
    begin
    if SaveDialog1.Execute then
      begin
      EditFile := SaveDialog1.FileName;
      Memo1.Lines.SaveToFile(EditFile);
      end;
    end;
    Код обновления анологичен коду загрузки при запуске:
    procedure TOsnForm.BitBtn8Click(Sender: TObject);
    begin
    Memo1.Lines.LoadFromFile('Отчеты12год.2012\Компрессор№1.jvr');
    end;
    Прошу, подскажите, как избавиться от ошибки(речь шла в начале).Т_Т Автор, добавлено 31.01.12, 16:55:28 
    Когда происходит первоначальная загрузка, каталог по умолчанию содержит указанный файл. Затем вы сохраняете посредством диалога, скорее всего в другой каталог. Тем самым каталог по умолчанию изменяется, и там нет нужного файла! Поэтому, в дальнейшем нужно указывать полный путь, а не относительный.
    Павел, добавлено 31.01.12, 16:58:54 
    В том то всё и дело,что по задумке программа должна запускаться с сервера, и путь я могу указать тока непосредственно в корневом каталоге Павел, добавлено 31.01.12, 17:00:02 
    Может есть способ изменить каталог по умолчанию на относительный?
    Павел, добавлено 31.01.12, 17:04:55 
    Самое интересное, что после перезапуска в memo выводится уже обновлённый файл Павел, добавлено 31.01.12, 17:11:00 
    Последне-это я ступил)) Павел, добавлено 31.01.12, 17:50:51 
    Придумал небольшое решение)):
    В место
    'Отчеты12год.2012\Компрессор№1.jvr'
    Написал
    '\Отчеты12год.2012\Компрессор№1.jvr'
    и всё заработало как надо)
    Спасибо за совет). Павел, добавлено 31.01.12, 17:53:53 
    Сори, поторопился.
    '\Проекты\Проект журнала\Отчеты12год.2012\Компрессор№1.jvr'
    плясал от диска. Павел, добавлено 3.02.12, 14:42:56 
    Здравствуйте ещё раз.У меня такой вопрос (не могу понять): как вывести на печать текст с актавного мемо?(их несколько и распологаются на закладках компонента
    PageControl).
    Заранее благодарен). Автор, добавлено 3.02.12, 15:07:17 
    Печать - это рисование. В самом Memo нет таких методов. Так что осваивайте работу с таким объектом как Canvas - канва. Вывод на печать, это рисование по канве принтера. По это есть у меня здесь. В частности, сама печать так выполняется:
    Printer.BeginDoc;
    with Printer.Canvas do
      begin
    ... Печать документа...
      end;
    Printer.EndDoc;
    Печать документа это вывод построчно текста из Memo:
    TextOut(X, Y, Memo1.Lines[i]);
    X - координата по горизонтали, от начала страницы, с небольшим сдвигом, подберите сами.
    Y - координата по вертикали, зависит от номера строки естественно, и высоты шрифта: H:=Canvas.TextHeight('A')+5; 5 - межстрочный интервал, подберите сами.
    Для работы всего этого нужно подключить в uses модуль Printers. И ещё учтите, ширина строки в Memo и на печати (W:=Canvas.TextWidth('Memo1.Lines[i]');) могут не совпадать, то что вылезет за границу не будет отображено - нужно переносить на другую строку. Павел, добавлено 3.02.12, 15:21:11 
    Спасибо большое за пример и обьяснение, но видимо я непрвильно поставил вопрос.
    У меня есть код:
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var
    Line : System.TextFile;
    i : integer;
    begin
    if PrintDialog1.Execute then
      begin
      AssignPrn(Line);
      Rewrite(Line);
      Printer.Canvas.Font := Memo1.Font;
      for I := 0 to Memo1.Lines.Count - 1 do Writeln(Line, Memo1.Lines[i]);
      System.CloseFile(Line);
      end;
    end;
    Он работает, но печать берётся с компанента Мемо1, а мне надо к премеру преключиться на другую вкладку и вывести на печать с другого Мемо(N)(N-номер Мемо).Я так понимаю надо по средством фокуса, но как ето написать в коде не представляю. Автор, добавлено 3.02.12, 15:46:17 
    Понятно. Вам нужно всё что в этой процедуре вынести в отдельную пользовательскую процедуру, где как параметр описать вместо Memo1 локальную переменную Memo типа TMemо. Как я понимаю, индекс вкладки это PageIndex. Проанализируйте номер в операторе case и подставляйте соответствующий Memo1, 2 и так далее. А правильнее создать эти Memo динамически, сделав их элементами массива, тогда и подставлять их можно по индексу PageIndex, без анализа. Павел, добавлено 3.02.12, 16:43:10 
    Извеняюсь за непроходимую тупость, но не могли бы вы привести пример на основе моего кода как он будет выглядеть через case?
    Ещё раз извените. Автор, добавлено 3.02.12, 16:59:06 
    Ну а без case, через if можете?
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var i: Integer;
    begin
    i:=PageControl1.PageIndex;
    case i of
     1: MemoPrint(Memo1);
     2: MemoPrint(Memo2);
     3: MemoPrint(Memo3);
     4: MemoPrint(Memo4);
    end;
    end;
    procedure Form1.MemoPrint(Memo: TMemo);
    var
    Line : System.TextFile;
    i : integer;
    begin
    if PrintDialog1.Execute then
      begin
      AssignPrn(Line);
      Rewrite(Line);
      Printer.Canvas.Font := Memo.Font;
      for I := 0 to Memo.Lines.Count - 1 do Writeln(Line, Memo.Lines[i]);
      System.CloseFile(Line);
      end;
    end;
    Принтера у меня нет, проверить не могу...
    Процедуру MemoPrint прописать не забудьте. Павел, добавлено 6.02.12, 11:11:35 
    Спасибо. Через if могу, но мне интересно что-то новое)) Автор, добавлено 6.02.12, 11:23:05 
    Тогда научитесь создавать Memo динамически, как элемент массива, и не надо будет таких "этажерок" с анализом. Павел, добавлено 6.02.12, 12:01:24 
    Обязательно последую вашему совету)
    Ну а пока у меня ругается на PrintMemo Автор, добавлено 6.02.12, 12:10:10 
    Я надеюсь, вы не забыли его прописать в списке процедур. И обратили внимание, что я перепутал (уже исправил) MemoPrint и PrintMemo. Павел, добавлено 6.02.12, 12:14:57 
    Не забыл, и обратил внимание))
    Однако пока ругается в этом участке кода:
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var i: Integer;
    begin
    i:=PageControl1.PageIndex;
    case i of
     1: MemoPrint(Memo1);
     2: MemoPrint(Memo2);
     3: MemoPrint(Memo3);
     4: MemoPrint(Memo4);
    end;
    end;
    Говорит что непрописана такая каманда(если я правильно перевёл с английского)
    [Ошибка] Unit1.pas(3935): Undeclared identifier: 'MemoPrint' Автор, добавлено 6.02.12, 12:29:18 
    Проверьте, чтобы была прописана в списке процедур процедура MemoPrint. Может, у вас PrintMemo осталась? Павел, добавлено 6.02.12, 12:41:37 
    Да, это моя ошибка, я её забиндил и забыл)) Павел, добавлено 6.02.12, 12:47:33 
    Одна топравка, у меня не PageIndex, а TabIndex.
    Павел, добавлено 6.02.12, 12:55:54 
    А значит и нумерация должна быть с нуля)) Павел, добавлено 6.02.12, 16:14:17 
    Всё работает но не до конца.
    Как и прежде печатает только с memo1.
    Павел, добавлено 7.02.12, 11:39:22 
    Всё, закипел, с общим ходом мысли разобрался, но под себя подладить никак.
    Пример, приведённый выше подходит только если задействован только один компонент
    PageControl. А что делать когда в PageControl вложен другой PageControl и так 4 раза, а уж на последнем висят Memo? Павел, добавлено 7.02.12, 11:45:22 
    Самый простой вариант- это понаставить кнопок на каждой вкладке PageControl и приписать их к определённому Memo,но мы то лёгких путей не ищем)) Павел, добавлено 7.02.12, 12:32:25 
    Может быть проанализировать через TabSheet? Автор, добавлено 7.02.12, 13:33:03 
    Главное, индекс открытой вкладки. Уж как вы его получите, неважно. Если TabSheet указывает на индекс вкладки, то подходит вместо PageIndex.
    У меня вот как получается:
    case PageControl1.TabIndex of
     0: Caption:=Memo1.Text;
     1: Caption:=Memo2.Text;
    end;
    Я думаю, неважно, сколько вы контролов друг в друга вложили. Анализируется тот, на котором Memo. Павел, добавлено 7.02.12, 13:59:18 
    Получается, что я не смогу чётко прописать какой индекс к какому Memo относится. ведь перейдя на другую вкладку я наткнусь на другой Memo(скажем 24). Павел, добавлено 7.02.12, 14:06:46 
    Скорее всего лучшее решение будет через TabSheet.Name.
    Они хоть не повторяются или через Memo.Name. Автор, добавлено 7.02.12, 14:07:02 
    У другой вкладки ведь другой TabIndex, или нет? У вас несколько PageConrol'ов, допустим, последний имеет имя PageControl4. На каждой его вкладке по одному Memo? Вот и анализируйте:
    case PageControl4.TabIndex of
    ну и так далее.
    Или я что-то не так понимаю. Павел, добавлено 7.02.12, 14:10:25 
    Вы всё верно понимаете, я просто не пойму как етот анализ связать с MemoPrint кнопки. Автор, добавлено 7.02.12, 14:18:10
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var i: Integer;
    begin
    i:=PageControl4.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end;
    end;
    procedure Form1.MemoPrint(Memo: TMemo);
    var
    Line : System.TextFile;
    i : integer;
    begin
    if PrintDialog1.Execute then
      begin
      AssignPrn(Line);
      Rewrite(Line);
      Printer.Canvas.Font := Memo.Font;
      for I := 0 to Memo.Lines.Count - 1 do Writeln(Line, Memo.Lines[i]);
      System.CloseFile(Line);
      end;
    end;
    А ещё лучше объявить MemoPrint с параметром var: procedure MemoPrint(var Memo: TMemo); Тогда если в Memo много текста, будет быстрее работать. Павел, добавлено 7.02.12, 14:23:17 
    Это было лишнее, я к этому и сам пришёл)). Меня затрудняет то, что кнопка одна, а
    таких участков как:
    begin
    i:=PageControl4.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end;
    end;
    Будет под сотну( Павел, добавлено 7.02.12, 14:25:37 
    может переменных понаставить? Павел, добавлено 7.02.12, 14:26:29 
    Тогда к каждой переменной будет свой анализ) Автор, добавлено 7.02.12, 14:28:03 
    Не, всё же вы не достаточно подробно прояснили задачу. Не понимаю. Какая сотня? Один PageControl4, на каждой вкладке по одному Memo. Какая сотня? Павел, добавлено 7.02.12, 14:36:14 
    Представьте PageControl1, у него 3 вкладки, на этих вкладках PageControl2,3,4 ;
    у них тоже скажем по 3 вкладки.На этих вкладках PageControl5,6,7,8,9,10,11,12,13 ; на них тоже PageControl со своими вкладками, а уж на тех вкладках и находятся Memo. Павел, добавлено 7.02.12, 14:39:57 
    Думаю картина ясна. Это всё богатство я хотел печатать по средством одной кнопки Принт но чтобы печаталось с активного в данный момент Memo. О, загнул))) Павел, добавлено 7.02.12, 14:41:01 
    Для меня такая задача стала непосильной. Автор, добавлено 7.02.12, 14:49:42 
    Да не вижу я проблемы. У PageControl'а на котором Memo есть номер? Путь он будет 100500.
    i:=PageControl100500.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end; Павел, добавлено 7.02.12, 14:53:04 
    Получится так:
    i:=PageControl1.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end;
    i:=PageControl2.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end;
    i:=PageControl3.TabIndex;
    case i of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
    end;
     и так далее до посинения. Павел, добавлено 7.02.12, 15:32:11 
    Точнее получится:
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var
    w,q,i: integer;
    begin
    i:=PageControl12.TabIndex;
    q:=PageControl132.TabIndex;
    w:=PageControl134.TabIndex;
    e:=PageControl134.TabIndex;
    case i of
     2: MemoPrint(Memo9);
     3: MemoPrint(Memo10);
    end;
    case q of
     0: MemoPrint(Memo1);
     1: MemoPrint(Memo2);
     2: MemoPrint(Memo3);
     3: MemoPrint(Memo4);
     4: MemoPrint(Memo5);
     5: MemoPrint(Memo6);
    end;
    case w of
     2: MemoPrint(Memo7);
     3: MemoPrint(Memo8);
    end;
    case e of
     0: MemoPrint(Memo11);
     1: MemoPrint(Memo12);
     2: MemoPrint(Memo13);
     3: MemoPrint(Memo14);
    end;
    end;
    Но и этот код неверен, потому как печать выводится всех Memo с одинаковыми индексами вкладок. Автор, добавлено 7.02.12, 16:47:41 
    Я понял.
    Есть свойство видимости Visible. Но оно не даёт окончательного вывода о том, виден ли на самом деле компонент. Если он закрыт другим, например вкладкой, то Visible не меняется. Есть свойство Showing. Экспериментировал и с ним. Тормозит.
    Вывод: всё это интересно, но реально нет времени добить. Занят своим... Пошукал в сети. Что-то здесь: programmersforum.ru/showthread.php?t=97526, но не совсем. Павел, добавлено 8.02.12, 11:42:12 
    Хорошо, пойдём другим путём)Можно ли ето:
    procedure TOsnForm.BitBtn5Click(Sender: TObject);
    var
    i: TTabSheet;
    begin
    i:=PageControl1.ActivePage;
    case i of
     TabSheet731: MemoPrint(Memo1);
     TabSheet732: MemoPrint(Memo2);
     TabSheet733: MemoPrint(Memo3);
    end;
    end;
    Как то правельнее выразить?А то не пойму, что компилятор ругается. дима, добавлено 8.03.12, 03:58:20 
    Помогите пожалуйста, как при написании цифр в memo найти максимальное значение? Автор, добавлено 8.03.12, 08:29:42 
    Так ЦИФР или ЧИСЕЛ?
    Если цифр, как вы написали, то цифру можно знать в момент печатания - это один символ. А числа сначала нужно все найти и поместить например в массив, а потом уже искать из них максимальное.
    Как искать максимальное значение. Вот псевдокод:
    1. Определяем переменную под результат. И присваиваем ей минимально возможное значение, например ноль - если поиск среди положительных чисел.
    2. Организуем цикл от первого до последнего числа.
    3. Сравниваем очередное число с нашей зарезервированной переменной.
    4. Если очередное число больше нашей переменной, то присваиваем переменной это значение.
    5. А иначе - ничего не делаем, переходим к очередному числу (к очередной итерации цикла).
    Как найти числа в Memo? А как они располагаться будут? Подряд:
    12 34 3454 2342
    или построчно:
    12
    34
    3454
    2342
    Будут ли кроме чисел слова? Во сколько неизвестных. Так что даже при желании готовую программу предложить не могу. Но - я не делаю домашних заданий (сами, сами!), только помогаю. Александр, добавлено 11.03.12, 13:54:35 
    Помогите пожалуйста.. Есть такое задание. Создать два потока, один из которых заполняет поле Memo случайными числами до остановки процесса пользователем, а второй осуществляет вычисление очередного числа Фибоначчи после нажатия пользователем кнопки. Автор, добавлено 11.03.12, 16:37:32 
    Ну и в чём, в чём, в чём проблема? Вы решили взять меня измором? Чуть выше написал, что не делаю заданий на заказ. И опять... Напишете, что именно не получается - буду помогать.
    Аноним, добавлено 14.03.12, 09:33:57 
    Здравствуйте!
    надо задать в любом виде матрицу 12х12 заполнить ее случайными числами от -80 до 20,вывести ее в Мемо. из элементов матр меньше нуля и кратных 7 построить одномерн.массив и вывести его с помощью Label Автор, добавлено 14.03.12, 10:14:23
    1. Задать матрицу - с этим проблема?
    2. Заполнить числами - с этим проблема?
    3. Определить какие числа меньше нуля (и т.д.) - с этим проблема?
    4. Вывести эти числа в Label - с этим проблема?
    Решу 4 ваши проблемы за 4х100=400 руб. Пишите на почту andrzejx(a)yandex.ru Артём, добавлено 16.03.12, 12:04:58 
    У меня такая задача, есть кнопка, поле Memo1, и SpinEdit. Нужно чтобы после нажатия кнопки в файл сохранялись строки которые содержат столько слов, сколько введено в SpinEdit.
    Как найти эти строки? Автор, добавлено 16.03.12, 12:55:56 
    А как найти количество слов в строке? Что такое слово? Слово это последовательность символов, ограниченная пробелами.
    Слово1 слово2 слово3 - подсчитайте количество слов и пробелов.
    Слово1 слово2 слово3 слово 4 слово5 слово6 слово7 слово8 - подсчитайте.
    Чуете разницу? Иными словами, нужно подсчитать количество пробелов. Записываете строку в переменную, ищете пробел и заменяете его на пустые кавычки. Сколько замен, столько пробелов.
    Но учтите, что пробел может быть сдвоенным, строенным и т.д. То есть сначала нужно искать сдвоенный пробел и заменять его на одиночный. Таким образом, сначала строенные пробелы станут сдвоенными, а потом и одиночными.
    Надеюсь, сохранить найденные строки в файл сможете. Артём, добавлено 16.03.12, 23:06:32 
    Написал вот такую вещь, ну и как это обычно и бывает, не работает.
    procedure TTextEditor.Button10Click(Sender: TObject);
    var f:textfile; prob,p,i,i2,t,n2,n1:integer; s:=string;
    begin
      prob:=0;
      if spinedit3.value>0 then
      begin
      with savedialog2 do
      if execute then
      begin
      memo1.Lines.SaveToFile(FileName);
      assignfile(f,filename);
      rewrite(f);
      for i:=1 to i:=Memo1.Lines.Count-1 do
      begin
      s:=Memo1.Lines[i];
      for i2:=1 to i2:=s.Length do
      begin
      p:=Pos(' ',s);
      Delete(s,p,3);
      p:=Pos(' ',s);
      Delete(s,p,2);
      p:=Pos(' ',s);
      if p>0 then
      begin
      prob:=prob+1;
      Delete(s,p,1);
      end;
      end;
      if prob-1=SpinEdit3.Value then
      writeln(f,Memo1.lines[t]);
      closefile(f);
      end;
      messagedlg('Операция выполнена успешно!!!',mtconfirmation,[mbok],0);
      end
      else messagedlg('Некорректно введёные значения!!!',mtconfirmation,[mbok],0);
    end;
    end; Андрей, добавлено 17.03.12, 10:02:06 
    Сама Delphi при компиляции показывает ошибки. Щёлкаешь по соообщению, и попадаешь в то место, где ошибка:
    for i:=1 to i:=Memo1.Lines.Count-1 do// это неправильно
    for i:=1 to Memo1.Lines.Count-1 do //так правильно
    for i2:=1 to s.Length //аналогично
    А теперь к алгоритму. На страничке "Работа со строками" описаны функции для работы со строками. И среди них функция StringReplace - функция для поиска и замены подстроки в строке. Не нужно вычислять позиции, просто даёшь ей команду, и всё. Вот как заменить сдвоенные пробелы:
    S:=Memo1.Lines[i];
    Flags:=[rfReplaceAll];//Заменяются все вхождения заданной подстроки
    while AnsiPos('  ', S)<>0 do S:=StringReplace(S, '  ', ' ', Flags);
    А для того чтобы подсчитать теперь количество одиночных пробелов, нужно Flags изменить на замену только первого вхождения:
    Flags:=[];//т.е. пустое множество (почитайте, почитайте про функцию)
    Также в цикле заменяем пробел, и прибавляем единичку к количеству, изначально равному нулю:
    N:=0;
    while AnsiPos(' ', S)<>0 do
      begin
        S:=StringReplace(' ', '', Flags);
        N:=N+1;
      end;
    Ну вот, теперь нужно сравнить N+1 и спинэдит и если равно, записать в файл. Правда, я записывал в StringList, а потом всё скопом сохранял с помощью StringList.SaveToFile.
    Полчаса работы, и вдвое короче чем у вас. Здесь дольше отписывался.
    Но то что вы попытались что-то сделать, уже очень хорошо. Постепенно научитесь. Попробуйте с помощью этих подсказок, не получится, буду помогать дальше. Ведь - готовых решений я не даю, это отучает думать. БорисЧ, добавлено 28.03.12, 14:15:37 
    Как сделать так,чтобы при запуске программы в Мемо сразу отображался определенный текст Автор, добавлено 28.03.12, 14:23:35 
    Поместить отображение текста в обработчик OnCreate Формы. БорисЧ, добавлено 28.03.12, 14:36:19 
    Спасибо Олег, добавлено 10.04.12, 14:41:37 
    нужно придумать какое то условие которое считает общую длину текстовой строки в компоненте RichEdit и если сделано переполнение то она перебрасывает слово или букву в новою строку. Автор, добавлено 10.04.12, 17:23:00 
    Во-первых, RichEdit и сам делает перенос.
    Каждая отдельно видимая строка содержится в RichEdit.Lines[i], i - номер строки.
    И если например нужно при копировании в более широкий редактор чтобы строки сохранялись, то и нужно вот так построчно переносить, в цикле.
    Александр, добавлено 1.05.12, 13:54:12 
    А почему для "Компоненты Delphi" нет отдельного урока? Автор, добавлено 1.05.12, 15:41:37 
    Об чём рассказать? Я планировал на этой странице просто дать краткое понятие о назначении компонентов и ссылки на более полное описание, что и сделал. К сожалению, даже всех компонентов не описал. Всё недосуг... Людок, добавлено 1.05.12, 22:29:12 
    Спасите!!!
    Как из текстового файла выбрать все слова,начинающиеся на заданную букву в editе, и перебросить их построчно в мемо??? Автор, добавлено 1.05.12, 22:39:23 
    Заняться программированием, освоить работу со строками - и всего делов. А кто этого не хочет или не может, тот обращается по ссылке "Решение задач". Алекссандр, добавлено 3.05.12, 17:50:43 
    Совершенно не понятно чайнику что за код, вами написано \ можите прокоментировать построчно?
    Количество строк в компоненте Memo содержится в свойстве Count:
      N:=Memo.Lines.Count;
      Пользуясь этим, например поиск фрагмента 'Нужный_Текст' в строках можно организовать так:
    var i: Integer;
    begin
      for i:=0 to Memo.Lines.Count-1 do
      begin
      if AnsiPos('Нужный_Текст', Memo.Lines[i])0 then
      begin
      Caption:='Найдено в строке №'+IntToStr(i);
      break;
      end;
      end;
    end; Автор, добавлено 3.05.12, 19:20:13 
    Если вы владеете циклами и условными операторами, то что непонятно? А если не владеете, то почитайте, у меня это есть. А завтра поговорим. Александр, добавлено 4.05.12, 04:17:10 
    Я читал про циклы и условные операторы но все же не понятно всёравно Автор, добавлено 4.05.12, 13:39:57 
    Ну, нам нужно найти некий текст в Memo. Делать это будем, например, при нажатии кнопки. Значит, для начала нужно создать обработчик нажатия, но эту операцию я опускаю - почитайте про события. Для поиска текста нужно перебрать все строки и искать в них этот текст. Значит, это будет цикл от первой до последней строки, так? Количество строк N:=Memo.Lines.Count; Записываем:
    for i:=0 to N-1 do //так как считаем от нуля, отнимаем единицу
      begin
      end;
    Теперь нужно наполнить цикл кодом поиска. Содержимое текущей строки равно Memo.Lines[i], в нём и нужно искать нужный текст. В самом начале данной строки я сразу сказал, что нужно знать методы работы со строками, и дал ссылку. Так вот, если нужный текст есть в строке, то его позиция, то есть положение от начала строки, будет не равна нулю, а именно равна количеству символов, на которое он отстоит от начала строки. Эту позицию и даёт функция pos. Но для кириллических символов она не подходит, а есть спец. функция AnsiPos (почитайте, пройдя по приведённой ссылке). Если вы точно уверены, что символы только латинские, то применяйте просто pos. Итак, вставляем внутрь нашего цикла оператор сравнения:
    if AnsiPos('Нужный_текст', Memo.Lines[i])0 then
    А вот что тогда? Если AnsiPos выдал ненулевой результат, то значит текст найден - выводим информацию о находке куда надо (у меня - просто в заголовок Формы), и поиск можно прекратить. Для этого служит оператор break. После его применения дальнейшая работа цикла прекращается, и программа переходит к следующему оператору. Получается, это два действия - вывод и прекращение цикла. Значит, нужно заключить их в begin/end:
    begin
      Caption:='Найдено в строке №'+IntToStr(i);
      break;
    end;
    Усё. Татьяна, добавлено 5.05.12, 07:02:30 
    Добрый день, Автор.
    Подскажите идею для разрешения следующей проблемы: В Memo нужно вывести картинку как фон (это я делаю с помощью bitmap), а на ней - разместить некоторый текст из файла. Текст у меня помещается под картинку, а не сверху. Работаю в Delphi 7. Заранее спасибо. Автор, добавлено 5.05.12, 07:10:00 
    Скопируйте сюда код фрагмента вывода картинки в Memo, пожалуйста... Татьяна, добавлено 5.05.12, 10:01:33 
    var
      Form1: TForm1;
      imag1:timage;{динамически создаваемый компонент}
    implementation
    {$R.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
     var bitm:TBitmap;
    begin
      bitm:=TBitmap.create;
      bitm.loadfromfile('lilia.bmp');
      imag1:=TImage.Create(self);
      imag1.Parent:=memo1;
     
      imag1.stretch:=false;
      imag1.canvas.Draw(imag1.Top, imag1.Left,bitm);
      memo1.Lines.LoadFromFile('text.txt');
    end;
    end.
    Текст прячется за картинкой. При нажатии на какую-либо клавишу, текст появляется, а часть картинки стирается. Автор, добавлено 5.05.12, 10:34:29 
    Всё ясно. Вы не назначили положение рисунка на родительском компоненте, поэтому он разместился по умолчанию: в точке (0, 0), и верхняя часть текста не видна. А если вы назначите таки смещение вниз, то появится очередная ошибка - bitmap тоже сместится в рисунке, так как вы ему назначили положение в рисунке от left и Top. Не думаю, что вы этого и хотите. Поэтому поставьте просто (0, 0, bitm). Татьяна, добавлено 8.05.12, 11:08:00 
    Спасибо. Попробую Тори, добавлено 13.05.12, 19:21:39
    Удаление дубликатов из мемо делается крайне просто :
    procedure DeleteDoubleFromMemo(var Memo: TMemo);
    var n, k: Integer;
    begin
    with Memo do
      for n:=0 to Lines.Count-1 do
      for k:=n+1 to Lines.Count-1 do
        if Lines[k]=Lines[n]
          then Lines.Delete(k);
    end; дайана, добавлено 17.05.12, 10:25:02 
    помогитее!!!!!!!! Напечатать все элементы типизированного файла, каждая запись которого – число. В существующем файле 10 чисел. Автор, добавлено 17.05.12, 10:41:25 
    На самом деле, вывод на печать это рисование! То есть, нужно освоить графические возможности Delphi. Цитирую оттуда:
    Для работы с принтером нужно подключить модуль Printers:
    unit Unit1;
    Interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Printers;
      При работе с принтером как с полотном для начала печати вызывается метод BeginDoc, затем производится вывод документа, завершается печать вызовом метода EndDoc:
    Printer.BeginDoc;
    with Printer.Canvas do
      begin
    ... Печать документа...
      end;
    Printer.EndDoc;
    Сама печать производится методами текущей Canvas:
    TextOut(X, Y, 'Нужный текст');
    Вот, это вывод одной строки. Переход на другую строку производится изменением в цикле значения Y:
    for i:=1 to Memo1.Lines.Count do
      TextOut(3, 3+(i-1)TextHeight('A'), Memo1.Lines[i-1]);
    Данный оператор напечатает все строки из Memo. Текст конечно нужно сначала туда загрузить. Для этого нужно освоить работу с файлами. Если же вам лень или некогда, обращайтесь по ссылке "Решение задач". Тори, добавлено 21.05.12, 18:16:10 
    Здравствуйте, а не подскажете, как программно узнать делители целого числа? Автор, добавлено 21.05.12, 20:30:38 
    Тори, "а причём здесь memo"?
    Ну да неважно. Всякий алгоритм программно работает точно также как и вручную! Число на делитель делится без остатка, так? Есть процедура div (или mod - вечно путаю), которая возвращает целый остаток от деления. Итак, нужно поделить число N на все числа от 2 до N-1. А на самом деле, не до N-1, а до корня из N. Если остаток равен нулю, то данное число - делитель. Автор, добавлено 21.05.12, 20:35:30 
    А если по вашему обыкновению, встроенный mod использовать нельзя, то нужно написать собственную процедуру, которая суммирует данное число, пока результат меньше N. И анализирует остаток. Тори, добавлено 21.05.12, 21:26:06 
    Вот знала же что ответ так прост! Я всё это знаю еще со школы, и div и mod тоже постоянно путаю)) Спасибо что прояснили ум)) (я уже решила всё по программированию своё, одногруппник попросил помочь с его задачей, а я вот как затормозила!)
    И да. memo тут ни при чём)) Просто эту страницу я во вкладки поместила, и решила не заморачиваться с поиском подходящей для вопроса страницы Вашего сайта))) кусака, добавлено 29.09.12, 19:17:29 
    как при перемещении scrolbara у memo1 вызвать соответствующее перемещение у scrolbara в memo2 Автор, добавлено 29.09.12, 19:37:34 
    Для управления прокруткой нужно работать с системными сообщениями VM_SCROLL, в них я плохо разбираюсь (. кусака, добавлено 1.10.12, 20:54:25 
    спасибо
    Сергей, добавлено 25.03.13, 14:31:19 
    Я создал калькулятор, и в поле Memo, где выводится результат есть возможность редактирования текста, т.е. можно в это поле писать и т.д. Как запретить это?
    — У меня в Delphi 7 нету такой строчки ( NumberOnly: True/False) - это на всякий случай) Автор, добавлено 25.03.13, 15:43:56 
    В обработчике события OnKeyPress есть параметр Key. Для запрета редактирования текста нужно присвоить ей значение "пустого" символа: #0. Сергей, добавлено 25.03.13, 19:15:15 
    Спасибо.. Но я по другому сделал. ReadOnly задал, как True! Женис, добавлено 31.03.13, 10:55:19 
    Добрый день!! помогите пожалуйста, пишу диплом, надо чтобы программа показывала список лекций в listbox и при выборе одной из лекций показывала его содержимое. Автор, добавлено 31.03.13, 11:07:37 
    ListBox может загружать список строк из текстового файла (лекции располагаются построчно):
    ListBox1.Items.LoadFromFile('СписокЛекций.txt');
    При выборе какой-нибудь строки (её выделении) в списке меняется его параметр ItemIndex. При этом нужно загрузить в Memo соответствующий файл. Это делается в обработчике события OnChange компонента ListBox:
    Memo1.Lines.LoadFromFile('Лекция'+IntToStr(ListBox1.ItemIndex)+'.txt');
    Соответственно, в данном примере лекции сохраняются в текстовых файлах с именами "Лекция1", "Лекция2" и так далее.Если они сохранены в файлы с оригинальными именами, то нужно анализировать номер выделенной строки и читать соответствующий файл, то есть это несколько сложнее. Автор, добавлено 31.03.13, 11:11:13 
    А хотя, можно же в ListBox записывать названия лекций, и читать файлы с этими именами:
    with ListBox1 do
      Memo1.Lines.LoadFromFile(Items[ItemIndex]+'.txt'); Женис, добавлено 31.03.13, 11:42:33 
    спасибо большое!! а можно ли открыть содержимое xml файла..?? лекции будут хранится в xml формате для безопасности от изменения их посторонними людьми..
    Автор, добавлено 31.03.13, 13:05:38 
    Можно и так. Но тогда содержимое xml-файла нужно перед загрузкой в Memo предварительно разобрать - распарсить.Для этого есть как штатный delphi-компонент, так и сторонние. Если обратитесь, могу сделать это для вас. Женис, добавлено 1.04.13, 11:43:34 
    спасибо но платные услуги мне пока не по карману.. если не трудно помогите с распариванием xml в memo Женис, добавлено 2.04.13, 22:10:24 
    помогите перевести документ из worda в xml пожалуйста.. Автор, добавлено 3.04.13, 05:31:15 
    Нет, не смогу помочь. Нина, добавлено 3.04.13, 15:42:54 
    Не подскажите как сделать разный шрифт мемо при сохранении в файл и на экране? Автор, добавлено 3.04.13, 16:33:02 
    Просто перед сохранением измените шрифт. Что именно не получается? Нина, добавлено 4.04.13, 13:58:13 
    Спасибо, хотела,чтобы на экране оставался 12 размер, а в файл 8, чтобы помешался. Ладно пусть меняется,раз сохранили не чего больше смотреть :-) новичек, добавлено 4.04.13, 22:11:51 
    Есть обработчик, который заполняет таблицу:
    procedure TForm1.Button6Click(Sender: TObject);
    var
      s:string;
      i : Integer;
      L : TStringList;
    begin
      s := '12-22-(4),3-22-(2),4-22-(2),6-22-(2),7-1-(2),7-2-(2),8-1-(2),8-2-(2),8-7-(2),9-22-(2),10-22-(2),11-12-(2),11-22-(2),12-3-(2),12-4-(2),12-5-(2),12-6-(2),12-9-(2),12-10-(2),12-13-(2),12-14-(2),12-15-(2),12-16-(2),12-17-(2),12-18-(2),12-19-(2)';
      L := TStringList.Create;
      try
      L.CommaText := StringReplace(s, '-', ',', [rfReplaceAll]);
      i := 0;
      repeat
      StringGrid1.Cells[StrToInt(L[i]), StrToInt(L[i + 1])] := MidStr(L[i + 2], 2, Length(L[i + 2]) - 2);
      Inc(i, 3);
      until i >= L.Count;
      finally
      L.Free;
      end;
    end;
    А как сделать, чтоб строку из которой он таблицу в stringgrid строит(12-22-(4),3-22-(2),4-22-(2)...) не вручную вводить а автоматом получать из memo??? олька), добавлено 17.04.13, 18:19:02 
    Здравствуйте))) Подскажите пожалуйста, нужно чтобы при нажатии на какую- либо строку из Memo активировалась одна из нескольких панелей,т.е. для каждой строки - своя панель
    Автор, добавлено 17.04.13, 19:01:03 
    Какое нажатие имеется в виду? Клавиатурой или мышкой? По одному из этих событий (или по обоим) нужно выполнять такой код:
    //предварительно заблокировать все панели, затем активировать одну из них
    case Memo1.CaretPos.Y of//это номер строки, начинается от нуля
     1: Panel1.Enabled:=True;
     2: Panel2.Enabled:=True;
    end; владимир, добавлено 26.05.13, 05:43:09 
    помогите пожалуйста подругому возможно ли использовать?
    search_and_replace(memo2, 'oldtext', 'newtext);
    пытаюсь делать что то вроде sear_and_replace(memo2, memo1.lines.strings[i]);
    не получаеться в дело втом что memo1 находиться список слов очень много если буду их писать в место oldtext и newtext это будет гемаройно...
    Заранее спасибо!!!
    Автор, добавлено 26.05.13, 06:32:20 
    У вас слова по одному в строке, или предложениями? владимир, добавлено 26.05.13, 07:44:41 
    построчные по одному владимир, добавлено 26.05.13, 07:49:49 
    типа:
    привет
    яблоко
    апельсин
    и.тд и.тп Автор, добавлено 26.05.13, 07:55:08 
    Что-то я не знаю такой функции search_and_replace. Есть StringReplace. И не случайно в начале данной статьи дана ссылка на статью "Работа со строками".
    И вопрос непонятно сформулирован. Вам нужно в Мемо заменить слова? На какие, есть список? Давайте развёрнутую формулировку. Если есть список слов, то всё делаем в цикле, нет проблем. Владимир, добавлено 26.05.13, 09:12:25 
    чуток затупил кажись это функция была на richedit
    пытаюсь сделать псевдо переводчика
    xmmm как бы обьяснить вообщем на форме есть memo1 memo2 memo3 memo4 и кнопка bitbitn на memo3 есть список слов под строчно а memo4 список ответов под строчно
    например набираю слово 'привет' на memo1 а результат выходит на memo2 слово 'hello'
    пишу дальше еше раз слово 'привет' а результата memo2 нет :((( использую такой код
    procedure tform1.bitbitnclick(sender:tobject);
    begin
    for i:=0 to memo3.lines.count-1 do
    if memo3.lines.strings[i]=memo1.text then
    memo2.text:=memo4.lines.strings[i]; end;
    извините если что написал не понятно... Автор, добавлено 26.05.13, 09:40:01 
    То есть слово вводится в Мемо1, ищется в Мемо3, его перевод в соответствующей строке Мемо4, и выводится в Мемо2...
    Не совсем понятно, зачем взят многострочный редактор Мемо1, может лучше тогда Edit? Но это я так...
    Вы ищете содержимое Memo1.Text, если там одно слово - всё находится. Если дописываете ещё, то что будет искаться? Наверное, нужно искать не Memo1.Text, а содержимое той строки, куда вписали только что новое слово:
    S:=Memo1.Lines[Memo1.CaretPos.Y]; Владимир, добавлено 26.05.13, 10:01:30 
    S:=Memo1.Lines[Memo1.CaretPos.Y]; xmmmm результата нет :( Владимир, добавлено 26.05.13, 10:05:47 
    интересно какую функцию использует программа promt? :)) Автор, добавлено 26.05.13, 10:20:00 
    Ну ё-маё...
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
     S: String;
    begin
    S:=Memo1.Lines[Memo1.CaretPos.Y];
    for i:=0 to Memo3.Lines.Count-1 do
      if S=Memo3.Lines[i] then
        begin
          Memo2.Lines.Add(Memo4.Lines[i]);
          break;
        end;
    end;
    Владимир, добавлено 26.05.13, 10:38:36 
    все работает нно не добовляет новое слово после пробела Автор, добавлено 26.05.13, 10:53:44 
    Какого пробела? А ещё, в школе были, там такую закорючку, запятая называется, видели? владимир, добавлено 26.05.13, 11:11:11 
    надо добавить каждое слово при воде а не подрят нажатием кнопки
     опять не понятно??? видимо я достал своими глупами вопросами? :)))) Аноним, добавлено 26.05.13, 11:23:33 
    а как memo выделить все строки и заменить первых букв Автор, добавлено 26.05.13, 11:33:56 
    Ну, это нужно Delphi изучить. Русский тоже не помешает. А если серьёзно, то сначала сами попытайтесь, прочтите статью - там всё есть. Напишите ваш вариант, что не получается - я помогу. А иначе ничему не научитесь. У меня нет цели делать всё за читателей. Автор, добавлено 26.05.13, 13:36:46 
    Владимир, да, непонятно! При вводе чего, куда? Слыхали выражение "казнить нельзя помиловать"? Так и у вас, без запятых смысл выражения неясен. Программирование требует недвусмысленного формулирования. Пока не научитесь, и в Delphi будут ошибки. Аноним, добавлено 30.05.13, 12:47:11 
    Народ помогите а как загрузить большой текстовый документ 200мб или 500мб
    загружаю текст с такими способоми
    кнопка буттон
    memo1.lines.loadfromfile.('c:\test.txt');
    или комбобокс
    if combobox1.itemindex=0 then memo1.loadfromfile('c:\test.txt');
    такими способоми загрузить та загружает а вот если пытаешся там изменить какое то слово? она ужасно тормозит или намертво остонавливается :((( даже пробовал так
    memo1.lines.beginupdate; memo1.lines.loadfromfile.('c:\test.txt'); memo1.lines.endupdate; есть ли еще другие способы???
    заранее спасибо!!!
    Автор, добавлено 30.05.13, 12:57:23 
    Ну это вы хватили... Поискал, почитал, все пишут, что стандартный Memo для таких объёмов не предназначен. Попробуйте RichEdit. Аноним, добавлено 30.05.13, 13:46:57 
    пробовал на richedit listbox listview treeview тоже самое
    а может быть есть какой нибудь другой способ типа faststring???
    Автор, добавлено 30.05.13, 13:54:19 
    Не в курсе... Вован, добавлено 3.06.13, 07:29:56 
    народ а как добавить копированный текст из memo1 в мемо2 где находится курсор? Автор, добавлено 3.06.13, 07:41:14 
    У вас есть выделенный фрагмент, нужно его переписать в Memo2? Выделенный текст содержится в свойстве SelText. Вован, добавлено 3.06.13, 08:38:14 
    Memo2.Lines.Add(Memo1.Lines[i]); как добавить текст где будет стоять курсор seltext?
    Вован, добавлено 3.06.13, 08:41:33 
    Memo2.Lines.Add(Memo1.Lines[i]); доболяет под строчно а нада добавить новый
    текст после курсора? Автор, добавлено 3.06.13, 08:45:03 
    Копированием.
    Memo2.Text:=copy(Memo2.Text, 1, Memo2.SetStart)+Memo1.Seltext+copy(Memo2.Text, Memo2.SelStart, Length(Memo2.Text)-Memo2.SelStart);
    Ну может, нужно подкорректировать, если что не совсем так. вован, добавлено 3.06.13, 08:51:39 
    то что надо спасибо автор :))) вован, добавлено 3.06.13, 08:57:10 
    хммм выдает ошибку после seltext+copy(memo2.text. вован, добавлено 3.06.13, 09:04:01 
    а все исправил кажись в место запятой поставил точку :))) Юлия, добавлено 4.06.13, 19:46:18 
    Здраствуйте. У меня такая проблема. Я делаю тестирующую программу. Вопросы подгружаются в Меmо. у меня есть 10 папок(одна папка- один вариант теста), в каждой из которых 10 файлов, в каждом файле находится один вопрос. мне нужно что бы при нажатии на кнопку, рандомно выбиралась папка и все вопросы которые находятся там считывались в Memo. Как подгружать вопросы в Меmo я знаю, а вот как сделать так что бы папка с файлами выбиралась рандомно. И возможно ли вообще это сделать? Автор, добавлено 4.06.13, 22:10:53 
    Каждый вопрос это адрес файла. Имя папки - 1-я часть адреса, имя файла в папке - 2-я часть адреса. Все эти имена известны. Вот и формируйте из них адрес конкретного вопроса. гость, добавлено 5.06.13, 07:17:01 
    помогите доделать массив на вывод двойных строк из таблицы dbgrid в другую временную таблицу stringgrid.
    код:
    table1.TableName := 'table1.dbf';
    stringgrid1.Visible := false;//true;//
    kolstrok := 10;//table1.RecordCount-1;
    for i :=0 to kolstrok do
    begin
    x:= //сложить текстовую переменную первой таблицы
      //создать массив
      //
      for j:=0 to kolstrok do
      begin
      y:= //сложить текстовую переменную второй таблицы
      if x=y then
      begin
     //заполнить массив
      end
      end;
      //вывод на форму значений массива, все кроме 1-й строки
      if kolichestvo > 1 then
      begin
      //stringgrid1.Cells[2,i+1]:=table1.Fields[0].AsString; //ñàìà ñòðîêà
      //stringgrid1.Cells[0,i+1]:=table1.Fields[1].AsString; //êîë-âî ñîâïàäåíèé
      end;
    //Table1.Next;
    end;
    end; Автор, добавлено 5.06.13, 07:40:11 
    УУУ... Что за народ, неужели и в самом деле стали появляться телепаты, им невдомёк, что читающий данный код телепатией не владеет и не понимает:
    1. Что такое текстовая переменная таблицы
    2. С чем её нужно сложить
    3. По каким правилам заполнить массив
    4. Причём тут вообще массив, когда идёт вывод из одной таблицы в другую... гость, добавлено 5.06.13, 08:00:53 
    извените,в общем я сама толком ничего не понимаю,мне нужно создать цикл проверки двойных строк в таблице методом перебора с базой данных.с циклом for,вот все что в коде написано это вроде как правильно,ну нужно доделать.текстовая переменная таблицы это наименование столбцов в таблице где содержаться двойные строки. Автор, добавлено 5.06.13, 08:33:10 
    Ясно одно, что ничего не ясно. Мне тоже. Аноним, добавлено 6.06.13, 14:26:56 
    помогите как заменить из всех строк только первую букву????
    дайте код пожалуйста Аноним, добавлено 6.06.13, 14:34:22 
    пример изменения
    привет
    мир
    как
    жизнь
    результат замены
    Привет
    Мир
    Как
    Жизнь
    просто надо заменить на большую букву? :))) Автор, добавлено 6.06.13, 16:38:40 
    В цикле проходим по всем строкам и меняем: Memo.Lines[i][1]:=AnsiUpperCase(Memo.Lines[i][1]); Аноним, добавлено 6.06.13, 18:52:54 
    выдает ошибку после := Автор, добавлено 6.06.13, 21:16:34 
    Да, неудобно без компа, проверить нельзя - писал с телефона. Дома проверил, вот как нужно:
    with Memo1 do
    for i:=0 to Lines.Count-1 do
      Lines[i]:=AnsiUpperCase(Lines[i][1])+copy(Lines[i], 2, Length(Lines[i])-1);
    Аноним, добавлено 6.06.13, 21:55:08 
    ух спасибки все работает :))) Аноним, добавлено 6.06.13, 22:47:04 
    Автор: еше один вопрос а как заменить вторую и третию букву таким же образом?
    пример
    ПРивет
    МИр
    КАк
    ЖИзнь Автор, добавлено 7.06.13, 06:17:21 
    Это делается по частям. Сначала копируем первый символ, потом копируем и добавляем второй с преобразованием в верхний регистр. Затем добавляем скопированное окончание. Добавление делается простым сложением - знак плюс ( + ).
    Функция копирования
    S:=copy(Text, n, k);
    где
      n - номер символа, с которого начинается копирование
      k - количество символов, которое нужно скопировать
    Используется также функция
    n:=Length(Text);
    которая определяет количество символов в тексте.
    Теперь сами. Пока сами тыркаться не станете, ничего не сможете никогда. Свой вариант - сюда. Ошибки помогу исправить.
      Евгений, добавлено 7.06.13, 09:44:36 
    Здравствуйте подскажите пожалуйста я хочу что бы
    Memo1.Lines.SaveToFile('test.txt');
    при нажатии на кнопку сохранялся как test 1,при следующем нажатии test 2 и т. д.
    подскажите как это сделать Аноним, добавлено 7.06.13, 10:23:18 
    чуток не понял почемуто первое буква нафик удаляется а второе заменяется
    ;))) Аноним, добавлено 7.06.13, 10:40:01 
    а все получился :)) Автор, добавлено 7.06.13, 10:49:28 
    Евгений, нужно ввести глобальную переменную - счётчик нажатий кнопки. При каждом нажатии увеличивать её на 1. И сформировать с её помощью адрес файла:
    var i: Integer=0;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      i:=i+1;
      adres:='test'+IntToStr(i)+'.txt';
    //Ну а здесь ваше сохранение
    end;
    карандаш, добавлено 7.06.13, 11:07:57 
    Помогите пожалуйста, как это сделать?)))
    Создать два потока, один из которых выводит в Memo 200 строк, заполняя их соответствующими номеру строки числами, а второй вычисляет значение
    функции в точке. Выбор функции реализовать с помощью ComboBox, а значение
    аргумента вводить в редакторе. Для заполнения Memo предусмотреть индикатор
    процесса. Автор, добавлено 7.06.13, 11:23:43 
    Ну, сначала нужно создать два потока... Берём, создаём потоки. Ну и в них прописываем то что вам нужно.
    Или, автор, выдай решение, и всё? Ни учиться ничему, ни даже в "школу" ходить не нужно. - Э нет.
    Давайте, почитайте про потоки. Ссылка есть в меню. Там даже есть готовый пример потока, можно скачать, внедрить в него некие действия, посмотреть что будет. карандаш, добавлено 7.06.13, 11:31:51 
    уже читаю Евгений, добавлено 7.06.13, 11:40:11 
    Спасибо большое! Аноним, добавлено 7.06.13, 11:44:01 
    я просто 2 день изучаю дэлфи, и не ничего не могу понять, что и куда, да и в задачке тут что то слишком много действий требуется вродь как О.о карандаш, добавлено 7.06.13, 11:45:17 
    это я написал выше, забыл упомянуть себя Евгений, добавлено 7.06.13, 12:02:23 
    Глобальная var
    i: Integer=0;
    var
    adres:String;
    begin
    i:=i+1;
    adres:='test'+IntToStr(i)+'.txt';
    Memo1.Lines.SaveToFile('test.txt');
    На adres выдавал ошибку я добавил переменную, но кроме изменения текста в файле ничего не происходит. Автор, добавлено 7.06.13, 12:07:33 
    Потому что переменная text это уже строка, дополнительно заключать в кавычки её не нужно! Автор, добавлено 7.06.13, 12:09:51 
    Карандаш! Если вы всего 2 день изучаете Delphi, то такого рода задачи рассматривать ещё рано. Может, конечно, вы уже знаете какой-нибудь язык программирования, но вообще-то нужно начинать с изучения описания переменных и конструкций типа условий, циклов и так далее. карандаш, добавлено 7.06.13, 12:15:07 
    то есть можете подробно описать с чего начать? буду очень благодарен, т.к препод у нас дибил и ничему нас не научил(то есть вообще не учил), а задание такое дал.. Евгений, добавлено 7.06.13, 12:21:39 
    без ковычек пишет
    [Ошибка] Unit1.pas(133): Undeclared identifier: 'test' Автор, добавлено 7.06.13, 12:31:17 
    Евгений, вы зачем ввели переменную adres??? При чём тогда test? Евгений, добавлено 7.06.13, 12:34:39 
    Глобальная var
    i: Integer=0;
    var
    adres:String;Без переменной выдаёт ошибку
    begin
    i:=i+1;
    adres:='test'+IntToStr(i)+'.txt';
    Memo1.Lines.SaveToFile('test.txt');
    Undeclared identifier:'adres' Автор, добавлено 7.06.13, 12:39:03 
    Карандаш, Вам нужно начать в меню с первой строчки,и постепенно продвигаться, обязательно всё пробуя в системе, читать недостаточно. А объяснить я могу то что не получается, повторять написанное не буду.
    Напишите мне на почту andrzejx( A )yandex.ru, буду консультировать, если что. Пока освойте циклы. Как задание, попробуйте в цикле сосчитать сумму чисел от 1 до 10. Пришлите код, далее посмотрим. Автор, добавлено 7.06.13, 12:43:23 
    Евгений:
    var i: Integer=0;
    procedure TForm1.Button1Click(Sender: TObject);
    var adres: String;
    begin
      i:=i+1;
      adres:='test'+IntToStr(i)+'.txt'
      Memo1.Lines.SaveToFile(adres);
    end; Евгений, добавлено 7.06.13, 12:45:30 
    Спасибо большое за помощь карандаш, добавлено 7.06.13, 12:56:47 
    хорошо, вечером напишу, как освобожусь от дел)) Евгений, добавлено 7.06.13, 15:04:04 
    Подскажите пожалуйста как сохранить в ini свойства ScrollBars
    ssNone
    ssBoth
    и т. д. Автор, добавлено 7.06.13, 15:13:01 
    Я не понимаю, что значит сохранить в ини. Для меня ини-файл это любой файл, предназначенный для инициализации чего-либо. Тот же Мемо может сохранить в ини, или комбобокс:
    ComboBox1.Items.SaveToFile('MyIniFile.ini');
    Это будет ини-файл, формат - текстовый... Так что запихните ваши ss в комбобокс и сохраняйте. Евгений, добавлено 7.06.13, 15:43:18 
    Я имел ввиду сохранить стиль Memo1.ScrollBars:=ssBoth;
    я пытался сохранить но компилятор пишет что
    [Ошибка] Unit1.pas(119): Incompatible types: 'Integer' and 'TScrollStyle'
    Memo1.ScrollBars:=IniFile.ReadInteger('Form1','Memo1ScrollBars',Memo1.ScrollBars);
    IniFile.WriteBool('Form1','Memo1.ScrollBars',Memo1.ScrollBars);
    просто я подразумеваю ini как файл конфигураций Аноним, добавлено 8.06.13, 13:34:35 
    уменя возник последний вопрос а как сделать двухсторонную замену текста из всех строк?
    пример
    привет
    мир
    как
    жизнь
    результат
    ПривеТ
    МиР
    КаК
    ЖизнЬ
    дайте код пожалуйста? Автор, добавлено 8.06.13, 15:50:11 
    Я уже всё описал. Функции показал. Дальше сами. Не будет получаться - помогу исправить ошибки. Вместо вас делать не буду уже. Сергей, добавлено 9.06.13, 22:14:32 
    Народ помогите а как добавить новый копированный текст из memo4 на memo2 после пробела? испольовал вот этот код
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
     S: String;
    begin
    S:=Memo1.Lines[Memo1.CaretPos.Y];
    for i:=0 to Memo3.Lines.Count-1 do
      if S=Memo3.Lines[i] then
      begin
      Memo2.Lines.Add(Memo4.Lines[i]);
      break;
      end;
    end;
    доболяет только один раз после пробела не добовляет :(((
    нужен еше какой нибудь код чтобы добавило где находиться курсор? Сергей, добавлено 10.06.13, 17:19:59 
    не ужели никто не знает???
    после пробела добавить новый текст memo2 после ввода memo1 Роман, добавлено 24.06.13, 18:41:00 
    Помогите пожалуйста, такая проблема, мне нужно чтобы в memo записывало текст из файлов рандомно не повторяясь, как это организовать, огромное спасибо, после завтра сдача курсового, очень нужно.. Спасибо Автор, добавлено 24.06.13, 18:51:34 
    Роман, если адреса файлов известны, то собираем их в массив (var FileAdres: Array[0..100] of String;), и загружаем рандомно:
    Memo1.Lines.LoadFromFile(FileAdres[random(High(FileAdres)+1)]); Автор, добавлено 24.06.13, 19:01:57 
    А, ещё нужно чтобы не повторялось! Для этого создаём StringList, он может определить наличие строки-дубликата:
    var S: String;
    List:=TStringList.Create;
    repeat
      S:=FileAdres[random(High(FileAdres)+1)];
    until List.IndexOf(S)=-1;
    Memo1.Lines.LoadFromFile(S);
    List.Add(S);
    Этот код выполняется каждый раз при необходимости загрузки файла.
    Аноним, добавлено 27.06.13, 10:28:42 
    помогите: форматированием строки?
    есть memo1 есть memo2 как добавить текст memo2?
    пример добавил первое слово из memo1 в memo2 после пробела хочу добавить другое слово
    нно не добовляеться как мне добавить еще раз? Автор, добавлено 27.06.13, 10:35:55 
    Ну чЁЁЁрт возьми, как это понять???
    Вот есть текст в Memo1: "Я хочу добавить слово". Задание: добавить первое слово. Смотрим: первое слово "Я". Переводим курсор в Memo2 и нажимаем клавишу с символом "Я". Ура! В Memo2 появилось "Я". Далее, добавить второе слово. Второе слово - "хочу". последовательно нажимаем в Memo2 символы "х", "о", "ч", "у". Итог: в Memo2 добавилось слово "хочу".
    Какие проблемы? Аноним, добавлено 27.06.13, 13:20:24 
    вообщем пытаюсь делать для себя маленкий переводчик есть memo1 memo2 memo3 memo4 и кнопка button memo1 пищу слово привет слово ищет memo3 результат выходит memo2 слово hello
    memo3 memo4
    привет hello
    здравствуй hi
    строка line
    перевести to translate
    memo1: привет
    memo2: hello
    переводит только один раз после слово привет пытаюсь добавить другое слово нно не выходит а результат должен быть memo2 типа hello hi ну посвоему усмотрению
    memo:1 привет здравствуй
    memo:2 результата нет :((((
    тоже не понятно??? ну или я просто дурак :( Автор, добавлено 27.06.13, 14:42:24 
    Значит так. Во втором и третьем Memo будут расположены слова - оригинал и перевод в соответствующих строках. Пишем в первом Memo слово и жмём кнопку "перевести". Процедура должна прочитать слово в той строке Memo1, где расположен курсор. Далее, ищем это слово во втором Memo, также определяем строку, на котором оно расположено, и читаем эту строку в Memo3. Перевод готов.
    Пишите код, если что не получится, помогу. Аноним, добавлено 27.06.13, 14:52:09 
    вот код:
    procedure tform1.button1click(sender: tobject);
    begin
    memo2.text:=memo1.text; s:memo1.lines[memo1.caretpos.Y];
    for i:=0 to memo3.lines.count-1 do if s=memo3.lines[i] then begin
    memo2.text:=memo4.lines.strings[i]; break;
    end; end;
    будьте добры помогите пожалуйста заранее СПАСИБО!!!!
    Автор, добавлено 27.06.13, 14:57:41 
    Откуда уже и Memo4 появилось? Автор, добавлено 27.06.13, 15:03:55 
    Ну да ладно. Зачем первый оператор? Потом всё равно переписываете Memo2.
     Memo2.Text:=Memo4.Lines[i];//strings - лишнее Автор, добавлено 27.06.13, 15:04:32 
    И что тут не работает? Автор, добавлено 27.06.13, 15:05:23 
    Похоже, вы и не пробовали, без описания i не заработало бы. Аноним, добавлено 27.06.13, 15:07:50 
    если напишу два раза слово привет привет результата нет типа hello hello Аноним, добавлено 27.06.13, 15:11:23 
    пример дайте мне код сижу из сотового :(( Автор, добавлено 27.06.13, 15:20:12 
    Код рассчитан на одно слово в строке. Иначе выделяйте из строки массив слов, и поочерёдно переводите. Копируете содержимое в служебную переменную. Находите пробел, копируете до пробела - это первое слово, далее удаляете из переменной часть до пробела включительно. И повторяете, пока есть пробелы. В заключение добавляете остаток - последнее слово. Вот, это массив слов. Ну и переводите в цикле, как выше написано. Аноним, добавлено 27.06.13, 15:31:50 
    напиши примерный код? :)))) Аноним, добавлено 27.06.13, 16:00:46 
    дай мне примерный код пожалуйста больше не потривожу? :))) Автор, добавлено 27.06.13, 16:10:17 
    S:=Memo1.Text;
    i:=0
    while AnsiPos(' ', S)0 do
    begin
      n:=AnsiPos(' ', S);
      Words[i]:=copy(S, 1, n-1);
      Delete(S, 1,n);
      i:=i+1;
    end;
    Words[i+1]:=S;
    Вот, есть массив слов. Как переводить, уже было описано. Аноним, добавлено 27.06.13, 16:35:07 
    выдает ошибку после i:=0 и после words[i]:=copy(s,1,n-1); и после delete(s,1,n);?
    var ннадо добавить? words Тина, добавлено 4.07.13, 14:19:56 
    Помогите мне нужно из Edit счтитать строку сосотоящую из последовательности чисел в Memo Автор, добавлено 4.07.13, 16:40:57 
    А какая разница, из чего состоит строка? Просто добавьте как новую строку: Memo.Lines.Add(Edit.Text); Ну или выражайтесь точнее. Владимир, добавлено 18.09.13, 15:53:08 
    Столкнулся с такой проблемой. Имеется двумерный массив чисел, но все разной длины, а нужно сделать из них текстовый файл и что бы все числа в нем были ровненькой табличкой. Примерно так, 7 символов с пробелами на каждое значение:
    16:42 5678 22 345 22.6
    16:43 23 156 -.5 5.7
    Как это можно сделать попроще?
    Владимир, добавлено 18.09.13, 15:57:27 
    Все форматирование сбилось.... Вместо _ должны быть пробелы)
    16:42___5678_____22____345____22.6
    16:43_____23____156____-.5_____5.7 Владимир, добавлено 18.09.13, 16:51:03 
    Вопрос снимается) сам допер, оказывается все элементарно делается с помощью
    insert(floattostr(что нужно вставить),Text,куда вставить-length(floattostr(что нужно вставить))); Аноним, добавлено 26.09.13, 15:21:20 
    Здрвствуйте. Вопрос очень простой. Нужно чтобы в мемо был счетчик и он начинался не с первой строки. Вот кусок программы, счетчик с первой строки:
    begin
     Memo1.Lines.Count;
     Str(Memo1.Lines.Count, S);
     Memo1.Lines.Add ( S +' '+ Edit1.Text +' '+ Edit2.Text +' '+ Edit3.Text) Автор, добавлено 27.09.13, 08:39:46 
    1. Memo1.Lines.Count - это не оператор, а значение, и оно ничему не присвоено.
    Далее, вообще мне непонятно, счётчик чего нужен? Что такое счётчик первой строки?? Вова, добавлено 13.10.13, 07:45:54 
    Вопрос глупый, но все же.. как в мемо найти 10 максимальных чисел? одно могу найти, а когда пробую 10 - либо пишет макисмальное число 10 раз поддряд, либо еще чего нибудь не правильное. Вова, добавлено 13.10.13, 07:49:29 
    если два раза или больше код вставить ниже, то будет считать столько раз сколько я этот код на поиск максимального числа повторю..но так не удобно...) Автор, добавлено 13.10.13, 07:59:24 
    А что у вас вообще в Мемо? Как текст располагается? Это обычный текст в котором числа встречаются или только числа, в столбик или в строчку?
    Вообще это задача на сортировку. Короче, нужен пример текста. Вова, добавлено 13.10.13, 09:13:08 
    Как вы, однако, быстро отвечаете. код я уже приводил, вы мне помогли с ним. сортировать здесь нельзя, просто 10 максимальных значений выбрать и в другое мемо вывести
    procedure TForm1.Button17Click(Sender: TObject);
      var RegExp : TRegExpr;
      s:String;
      max: real;
      i,y, n: word;
      ttt :Real;
      nik,level,bb, plas:string;
     begin
      if Memo36.Lines.Count = 0 then Exit;//если первое поле пусто -выходим из процедуры
      max:= StrToFloat(Memo36.Lines[0]);//максимальное значение - первая строка в списке мемо
      n:=0;
      for i:= 1 to Memo36.Lines.Count-1 do// от второй строки до последней строки
      if StrToFloat(Memo36.Lines[i]) > max then if StrToFloat(Memo36.Lines[i])
      begin
      max:= StrToFloat(Memo36.Lines[i]) ;//то максимальным значением делаем значение этой строки
      n:=i;//запоминаем индекс строки с текущим максимальным значением
      end;
      Memo41.Lines.Add( FloatToStr(max) +' '+ Memo34.Lines[n]);
    Вова, добавлено 13.10.13, 09:14:17 
    это обычный список чисел. в столбик. Автор, добавлено 13.10.13, 09:34:36 
    Ну что значит нельзя сортировать... Может, в Мемо и нельзя "сортировать", то есть переставлять строки местами, но ничто не мешает записать числа в массив и там отсортировать. Возможно, нужны также номера строк с этими числами. Тогда нужно задать массив записей типа (число, строка), и сортировать эти записи. Потом взять первые 10 элементов.
    В принципе, если чисел меньше 256 (максимальное количество элементов во множестве), то можно 10 раз искать максимальное число, сохраняя во множество номер строки уже ранее найденного числа, и пропускать эти строки (оператор continue):
    type TMySet = set of 0.. 255;
    var MySet: TMySet;//MySet - множество индексов строк ранее найденных чисел
    begin
    ....
    if (i in MySet)
      then continue;
    ....
    max:= StrToFloat(Memo36.Lines[i]) ;//то максимальным значением делаем значение этой строки
    n:=i;//запоминаем индекс строки с текущим максимальным значением
    MySet:=MySet+[i];//записываем во множество индекс очередного найденного числа
    ...
    end;
    Оператор in очень удобен в данном случае - не нужно длинного кода чтобы анализировать прежние результаты.
    Марина, добавлено 7.11.13, 12:13:50 
    Помогите открыть текстовый файл в поле Memo.
    Я пишу код:
    procedure TForm1.ButtonOpenClick(Sender:TObject);
    begin
    OpenDialog1.Execute;
    Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    end;
    Запускаю приложение, оно выдает мне ошибку
     Unable to open file...
    Press OK to ignore and risk data corruption.
    Press Cancel to kill the program.
    Что надо сделать, чтобы файл открылся? Тоже самое происходит, когда я хочу сохранить файл. Я знаю для вас это просто. Помогите, пожалуйста. Автор, добавлено 7.11.13, 12:54:34 
    Не совсем правильное использование диалога открытия. У вас после нажатия кнопки почему-то OpenDialog уже Execute... На самом деле, операция Execute происходит при выборе файла "ручками". Поэтому получается, что FileName у вас не определён. Правильно так:
    begin
    with OpenDialog1 do
      if Execute then
      Memo1.Lines.LoadFromFile(FileName);
    end; Марина, добавлено 7.11.13, 13:28:52 
    Исправила, как вы написали. Снова дает ошибку точно такую-же. А файл я действительно выбираю руками, т.е. открывается панель и я выбираю папку, выбираю файл и Открыть. Автор, добавлено 7.11.13, 13:33:27 
    Ну значит не совсем так как я написал. Скопируйте сюда, посмотрим. Марина, добавлено 7.11.13, 13:39:04 
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      with OpenDialog1 do
      if Execute then
      MemoOut.Lines.LoadFromFile(FileName);
    end; Марина, добавлено 7.11.13, 13:42:09 
    У меня вместо Memo1 - MemoOut Марина, добавлено 7.11.13, 13:47:19 
    Я не поняла ваш комментарий. Вы мне поможете? Автор, добавлено 7.11.13, 13:47:58 
    И что, это неправильно? Код правильный, значит проблема в чём-то другом. Давайте так, пришлите архив с папкой проекта на andrzejx(A)yandex ru. А то отсюда не видно. Марина, добавлено 7.11.13, 13:59:40 
    Я скопировала ваш адрес, отправляю:
    Недопустимый адрес
    Адрес andrzejx(A)yandex.ru не существует или заблокирован. Автор, добавлено 7.11.13, 14:15:50 
    Марина!!! Вот потому у вас и ошибки, что невнимательны. Я как написал (A) вместо "собаки", так вы и тиснули.
    А я так сделал потому что программы-сканеры понимают что если есть собака, то это электронный адрес, и пошёл спам... Евгений, добавлено 7.11.13, 19:54:53 
    Здравствуйте Подскажите пожалуйста как определить в каком мемо находится курсор? Я написал код но он не не работает! Код:
     If Memo1.SetFocus Then
     begin
      DateTimeToString(TD,'hh:nn:ss dd/mm/yy ddd',Now);
      Memo1.Lines.Add(TD);
     end
     else
     If DBMemo1.SetFocus Then
     begin
      DateTimeToString(TD,'hh:nn:ss dd/mm/yy ddd',Now);
      DBMemo1.Lines.Add(TD);
     end;
    Автор, добавлено 7.11.13, 20:06:03 
    Источник события в процедуре называется Sender. Вам бы полностью код скопировать... Так непонятно, как написать. Евгений, добавлено 7.11.13, 20:25:22 
    Это весь код Евгений, добавлено 7.11.13, 20:27:36 
    Извините (это в меню)
    procedure TBDZaryadki1.imeAndDateClick(Sender: TObject);
    begin
     If Memo1.SetFocus Then
     begin
      DateTimeToString(TD,'hh:nn:ss dd/mm/yy ddd',Now);
      Memo1.Lines.Add(TD);
     end
     else
     If DBMemo1.SetFocus Then
     begin
      DateTimeToString(TD,'hh:nn:ss dd/mm/yy ddd',Now);
      DBMemo1.Lines.Add(TD);
     end;
    end; Автор, добавлено 7.11.13, 20:35:54 
    Так, всё ясно, Sender в данном случае ни при чём - источник события это пункт меню. Тогда так. Свойство Tag каждого Memo нужно пронумеровать. При попадании фокуса в конкретный Memo нужно по событию OnEnter сохранить в некой переменной номер того Memo, куда попал фокус. А вот здесь уже используется Sender:
    NMemo:=(Sender as TMemo).Tag;
    Всё, теперь при NMemo=1 мы находимся в Memo1 и так далее.
    Автор, добавлено 7.11.13, 20:37:53 
    Да, этот обработчик OnEnter нужно назначить всем Memo. Евгений, добавлено 7.11.13, 20:43:31 
    А тип переменной какой? String? Автор, добавлено 7.11.13, 20:50:50 
    Учитесь сами разбираться. Поставьте любой. При компиляции Delphi вам сама скажет что не так. Аноним, добавлено 16.01.14, 14:12:16 
    Подскажите пожалуйста как сделать так чтобы из memo считал количество слов в edit Автор, добавлено 16.01.14, 16:38:15 
    Ну, это программу писать нужно. Могу написать за умеренное вознаграждение. саща, добавлено 19.01.14, 06:33:53 
    procedure TForm1.Button1Click(Sender: TObject);
    var
    dyn_a : array of integer;
    i,k: integer;
    begin
    randomize;
     k:= strtoint(edit1.Text);
     for i:= 0 to k do
     begin
     dyn_a[i]:=random(21);
      end;
      dyn_a[i]:= Memo1.lines ;
    end;
    end. саща, добавлено 19.01.14, 06:37:31 
    в чем ошибка, как вывести динамический массив в мемо Автор, добавлено 19.01.14, 07:09:09 
    1. Массив динамический, значит что? - нужно задать его размер ПЕРЕД тем как что-то записывать в его ячейки, у вас этого нет.
    2. Вот вы определили значения в ячейках:
      dyn_a[i]:=random(21);//Это присвоение значения ячейкам массива
    А это тогда что:
      dyn_a[i]:= Memo1.lines ;//Это опять присвоение, только цикла уже нет, откуда i?
    И как появится что-то в Memo, когда вы не в Memo записываете а как бы наоборот. Далее, Memo1.Lines - это массив строк в Memo. Его ничему присвоить нельзя. Имеет смысл Memo1.Lines[1] - это содержимое строки с индексом 1, тип String. Например,
     Memo1.Lines[0]:='Это самая верхняя строка';
     Memo1.Lines[1]:='21';
     Memo1.Lines[2]:=IntToStr(random(21));
    И то, 2 и 3 оператор не сработают, если Memo изначально будет пуст, так как строк с индексами 1 и 2 в этот момент ещё не существует - нужно пользоваться операторами добавления строк Memo1.Lines.Add('Текст'); Вася, добавлено 22.01.14, 11:48:57 
    var
      Form1: TForm1;
    dyn_a : array of integer;
    i,k,s:integer; dyn_b : array of integer;
    implementation
    {$R.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    randomize;
    k:= strtoint(edit1.Text);
    for i:= 0 to k do
    setlength(dyn_a,k);
    dyn_a[i]:=random(21);
    for i:= 0 to k do
     Memo1.Lines.Add(inttostr(i)) ;
     Memo1.lines[i]:= inttostr(dyn_a[i]);
     end;
    procedure TForm1.Button2Click(Sender: TObject);
     var buf : integer;
    begin
      for i:=0 to k do
      if dyn_a[i]
      begin
      buf:=dyn_a[i+1];
      dyn_a[i+1]:=dyn_a[i] ;
      dyn_a[i]:= buf;
      end;
     Memo1.lines[i]:= inttostr(dyn_a[i])
    end;
    Вася, добавлено 22.01.14, 11:49:39 
    автор в чем ошибка
    Автор, добавлено 22.01.14, 12:44:40 
    Все действия в цикле for должны быть внутри begin/end, а у вас только определение размера массива относится к циклу, и выполняется несколько раз, зачем? Его нужно поставить перед циклом.
    А вот присваивание не определено, ведь переменная цикла вне цикла уже не существует, и имеет случайное значение. То же относится и к следующему за ним циклу - в цикле выполняется только первый оператор: Memo1.Lines.Add(inttostr(i)); Следующее присваивание не определено. Последний оператор во второй процедуре также выполнен вне цикла - end перед ним, и цикл закрыт.
    Вася, добавлено 22.01.14, 12:51:31 
    Можно попросить код, у меня не фига не получается, пишет ошибку... Автор, добавлено 22.01.14, 13:08:53 
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    randomize;
    k:= strtoint(edit1.Text);
    setlength(dyn_a, k);
    for i:= 0 to k do
    dyn_a[i]:=random(21);
    for i:= 0 to k do
    begin
     Memo1.Lines.Add(inttostr(i)) ;
     Memo1.lines[i]:= inttostr(dyn_a[i]);
    end;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
     var buf : integer;
    begin
      for i:=0 to k do
      if dyn_a[i] //условный оператор не закончен, условия нет
      begin
      buf:=dyn_a[i+1];
      dyn_a[i+1]:=dyn_a[i] ;
      dyn_a[i]:= buf;
      Memo1.lines[i]:= inttostr(dyn_a[i]);
    end;
    end;
    Вот исправил, одна ошибка только где я отметил комментариями, нет условия. И ещё учтите, что если вдруг нажать кнопку Button2 перед нажатием Button1, то k будет не определено, и размеры массива тоже. В этом случае обязательно нужно заблокировать (в Инспекторе Оъектов) Button2 и завершающим оператором в первой процедуре разблокировать её, свойство Enabled.
    Источник: http://www.delphi-manual.ru/memo.php?com=yes



    Рекомендуем посмотреть ещё:


    Закрыть ... [X]

    Жидовская экспансия в России после 1991 года Как вязать узор кельтская коса

    Делфи связать формы Расширенный фильтр и немного магии
    Делфи связать формы Бюджетирование: самоучитель
    Делфи связать формы Здесь найдется все!
    Делфи связать формы 6 способов наклеивания салфеток. Декупаж. Часть-1. Обсуждение на
    Делфи связать формы Cached
    Делфи связать формы Выгляди стильно: жилетка
    Делфи связать формы Вяжем рисунки на
    Делфи связать формы Вязание для кукол - Страна Мам
    Делфи связать формы Вязание для новорожденных и малышей спицами и крючком, схемы
    Игры для девочек рисовалки - играть бесплатно в рисовалки онлайн Как нарисовать Маску карандашом поэтапно Как нарисовать комнату с мебелью Как нарисовать языки пламени нарисовать языки пламени карандашом Канзаши - мастер классы как делать, все техники канзаши Конспект ИЗО 1 класс «Мастер изображения учит видеть»

    Похожие новости