Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Tmemo. Вопрос. (https://forum.antichat.xyz/showthread.php?t=27918)

Ch3ck 25.11.2006 11:53

Tmemo. Вопрос.
 
Так, народ, вобщем в делфи я не силён, но очень понадобилась такая вещь(как бы смешно не звучало;)):
Вообщем есть это поле мемо. Нужно сделать так, чтобы в одной строке было не более 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;(конец процедуры)

Вот так вот.


Время: 11:35