Так, народ, вобщем в делфи я не силён, но очень понадобилась такая вещь(как бы смешно не звучало): Вообщем есть это поле мемо. Нужно сделать так, чтобы в одной строке было не более 70 символов, а общее кол-во символов в мемо не превышало 1000. Вот так. Подскажите.
Свойство 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;
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) Горячими клавишами поочередно выделять каждое слово. 2) Горячими клавишами поочередно выделять каждое предложение. Как бы такое организовать?!
Вот тебе константы с кодаме некоторых горячих клавиш, которые передаются в 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;
Ой, извини дружище что-то я забыл совсем. Элементарно. У Memo1.HideSelection:=false; А потом: Memo1.SelStart:=0; // Начало выделения Memo1.SelLength:=15; // Кол-во символов для выделения И все выделяется
Собственно, вот такой кусок кода тебе нужен: Нужно еще реализовать подсчет слов, так как каждый запуск нашей процедуры должен перебирать все варианты, но выделять ЛИШЬ один раз и тогда необходимсоть последней строки кода из этого поста отпадет. Для это каждое сохранения должно добавлять 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;(конец процедуры) Вот так вот.