Tmemo. Вопрос.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ch3ck, 25 Nov 2006.

  1. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Так, народ, вобщем в делфи я не силён, но очень понадобилась такая вещь(как бы смешно не звучало;)):
    Вообщем есть это поле мемо. Нужно сделать так, чтобы в одной строке было не более 70 символов, а общее кол-во символов в мемо не превышало 1000. Вот так.
    Подскажите.
     
  2. TaNkist

    TaNkist Elder - Старейшина

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Свойство MaxLength - общее количество символов(сюда кстати входят и символы перехода на новую строку).
    Code:
    procedure TForm1.Memo1Change(Sender: TObject);
    var i:integer;
    s:string;
    begin
    for i:=0 to memo1.Lines.Count do
      begin
      s:=memo1.Lines.Strings[i];
      if length(s)>70 then begin
      delete(s,71,length(s)-70);
      memo1.Lines.Strings[i]:=s;
      end;
      end;
    
    end;
     
    #2 TaNkist, 25 Nov 2006
    Last edited: 25 Nov 2006
  3. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Code:
    procedure TForm1.ButtonMdaClick(Sender: TObject);
    var
      Buffer: array [0..70] of char;
      i: integer;
    begin
      for i := 0 to Memo1.Lines.Count do
      begin
        StrLCopy(Buffer, PChar(Memo1.Lines[i]), 70);
        Memo1.Lines[i] := Buffer;
      end;
    
      while (StrLen(PChar(Memo1.Text)) > 1000) do
         Memo1.Lines.Delete(Memo1.Lines.Count - 1);
    end;
    Должно работать
     
    1 person likes this.
  4. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Здравствуйте всем. :)
    Есть программа на подобие блокнота.
    Возник вот такой вопрос:
    1) Горячими клавишами поочередно выделять каждое слово.
    2) Горячими клавишами поочередно выделять каждое предложение.
    Как бы такое организовать?!
     
  5. a1nt

    a1nt Elder - Старейшина

    Joined:
    16 Dec 2005
    Messages:
    131
    Likes Received:
    39
    Reputations:
    25
    Вот тебе константы с кодаме некоторых горячих клавиш, которые передаются в varKey при событии OnKeyPress в Delphi.

    Еще. Насколько я знаю средствами VCL нельзя вызвать выделение текста в классе TMemo (поправьте если не прав. Выход - WinAPI, я в нем не очень силен, но если что-нибудь придумаю, напишу.

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

    Code:
    var i:integer;
    h,buf:String;
    begin
    For i:= 0 to Memo1.Lines.Count-1 do begin //Цикл перебора строк
    h:=Memo1.Lines[i];
    while(not (h='')) do begin //Цикл перебор слов (пока строка не закончится)
    //Здесь можно сделать счетчик, чтобы выделять определенное слово
    if pos(' ',h)>0 then begin  
    buf:=copy(h,1,pos(' ',h)); 
    delete(buf,length(buf),1); //Пробел перед след. словом нам тут точно не нужен
    end else buf:=h; //Ну а ежели в строке только одно слово, то так и выделяем
    delete(h,1,length(buf)+1); //Удаляем найденное слово из оставшейся строки, чтобы второе стало первым.
    ListBox1.Items.Add(buf); //Здесь находится обработка найденного слова, в моем коде оно добавляется в ListBox1, ты конечно можешь выделять, как хочешь.
    end;
    end;
     
    1 person likes this.
  6. a1nt

    a1nt Elder - Старейшина

    Joined:
    16 Dec 2005
    Messages:
    131
    Likes Received:
    39
    Reputations:
    25
    Ой, извини дружище что-то я забыл совсем.
    Элементарно.
    У Memo1.HideSelection:=false;
    А потом:
    Memo1.SelStart:=0; // Начало выделения
    Memo1.SelLength:=15; // Кол-во символов для выделения
    И все выделяется ;)
     
  7. a1nt

    a1nt Elder - Старейшина

    Joined:
    16 Dec 2005
    Messages:
    131
    Likes Received:
    39
    Reputations:
    25
    Собственно, вот такой кусок кода тебе нужен:

    Нужно еще реализовать подсчет слов, так как каждый запуск нашей процедуры должен перебирать все варианты, но выделять ЛИШЬ один раз и тогда необходимсоть последней строки кода из этого поста отпадет. Для это каждое сохранения должно добавлять 1 к какой-нибудь переменной, и если значение этой переменной совпадет с номером необходимого слова, то... в- общем так
    Code:
    ...
    delete(h,1,length(buf)+1);
    If wordnum=needword then begin
    Memo1.SelStart:=pos(buf,Memo1.Lines[i])-1;
    Memo1.SelLength:=length(buf);
    needword:=needword+1; (нам ведь при следующем запуске нужно следующее слово, не так ли?)
    end;
    end;(конец процедуры)
    
    Вот так вот.