PDA

Просмотр полной версии : Tmemo. Вопрос.


Ch3ck
25.11.2006, 11:53
Так, народ, вобщем в делфи я не силён, но очень понадобилась такая вещь(как бы смешно не звучало;)):
Вообщем есть это поле мемо. Нужно сделать так, чтобы в одной строке было не более 70 символов, а общее кол-во символов в мемо не превышало 1000. Вот так.
Подскажите.

TaNkist
25.11.2006, 12:46
Свойство MaxLength - общее количество символов(сюда кстати входят и символы перехода на новую строку).
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;

Deem3n®
25.11.2006, 13:01
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;
Должно работать

Ch3ck
10.12.2006, 16:00
Здравствуйте всем. :)
Есть программа на подобие блокнота.
Возник вот такой вопрос:
1) Горячими клавишами поочередно выделять каждое слово.
2) Горячими клавишами поочередно выделять каждое предложение.
Как бы такое организовать?!

a1nt
10.12.2006, 17:59
const
KEY_CTRL_B = 02;
KEY_CTRL_I = 9;
KEY_CTRL_S = 19;
KEY_CTRL_U = 21;

Вот тебе константы с кодаме некоторых горячих клавиш, которые передаются в varKey при событии OnKeyPress в Delphi.

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

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

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;

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

Ой, извини дружище что-то я забыл совсем.
Элементарно.
У Memo1.HideSelection:=false;
А потом:
Memo1.SelStart:=0; // Начало выделения
Memo1.SelLength:=15; // Кол-во символов для выделения
И все выделяется ;)

a1nt
10.12.2006, 18:44
Собственно, вот такой кусок кода тебе нужен:

...
delete(h,1,length(buf)+1);
Memo1.SelStart:=pos(buf,Memo1.Lines[i])-1; {раньше было про ListBox1 здесь}
Memo1.SelLength:=length(buf);
ShowMessage(buf); //А это только чтобы ты мог увидеть как выбегает выделение, как довести до ума - ниже.
...

Нужно еще реализовать подсчет слов, так как каждый запуск нашей процедуры должен перебирать все варианты, но выделять ЛИШЬ один раз и тогда необходимсоть последней строки кода из этого поста отпадет. Для это каждое сохранения должно добавлять 1 к какой-нибудь переменной, и если значение этой переменной совпадет с номером необходимого слова, то... в- общем так

...
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;(конец процедуры)


Вот так вот.