ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

25.11.2006, 11:53
|
|
Познавший АНТИЧАТ
Регистрация: 09.06.2006
Сообщений: 1,359
Провел на форуме: 5301021
Репутация:
1879
|
|
Tmemo. Вопрос.
Так, народ, вобщем в делфи я не силён, но очень понадобилась такая вещь(как бы смешно не звучало  ):
Вообщем есть это поле мемо. Нужно сделать так, чтобы в одной строке было не более 70 символов, а общее кол-во символов в мемо не превышало 1000. Вот так.
Подскажите.
|
|
|

25.11.2006, 12:46
|
|
Участник форума
Регистрация: 06.04.2006
Сообщений: 257
Провел на форуме: 367179
Репутация:
76
|
|
Свойство 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;
Последний раз редактировалось TaNkist; 25.11.2006 в 13:11..
|
|
|

25.11.2006, 13:01
|
|
Постоянный
Регистрация: 19.09.2005
Сообщений: 408
Провел на форуме: 3730496
Репутация:
519
|
|
Код:
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;
Должно работать
|
|
|

10.12.2006, 16:00
|
|
Познавший АНТИЧАТ
Регистрация: 09.06.2006
Сообщений: 1,359
Провел на форуме: 5301021
Репутация:
1879
|
|
Здравствуйте всем. 
Есть программа на подобие блокнота.
Возник вот такой вопрос:
1) Горячими клавишами поочередно выделять каждое слово.
2) Горячими клавишами поочередно выделять каждое предложение.
Как бы такое организовать?!
|
|
|

10.12.2006, 17:59
|
|
Участник форума
Регистрация: 16.12.2005
Сообщений: 146
Провел на форуме: 573934
Репутация:
114
|
|
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;
|
|
|

10.12.2006, 18:16
|
|
Участник форума
Регистрация: 16.12.2005
Сообщений: 146
Провел на форуме: 573934
Репутация:
114
|
|
Еще. Насколько я знаю средствами VCL нельзя вызвать выделение текста в классе TMemo (поправьте если не прав. Выход - WinAPI, я в нем не очень силен, но если что-нибудь придумаю, напишу.
Ой, извини дружище что-то я забыл совсем.
Элементарно.
У Memo1.HideSelection:=false;
А потом:
Memo1.SelStart:=0; // Начало выделения
Memo1.SelLength:=15; // Кол-во символов для выделения
И все выделяется 
|
|
|

10.12.2006, 18:44
|
|
Участник форума
Регистрация: 16.12.2005
Сообщений: 146
Провел на форуме: 573934
Репутация:
114
|
|
Собственно, вот такой кусок кода тебе нужен:
...
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;(конец процедуры)
Вот так вот.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|