Пару вопросов
Скрул в мемо включается свойством ScrollBars. А насчет копирования кириллицы, то у меня такая же фигня. Причем берешь че нить кроме блокнота или два блокнота происходит то же. Наверное это удел мастдая
Эх вы. У свойства Font есть свойство Charset. Его меняете на RUSSIAN_CHARSET. У меня работает.
Во превых не нашел где это в ScrollBars мышастый скрол врубается, во вторых Charset и так стоял RUSSIAN_CHARSET =о/
На мышке не скрол - а колёсико.
Оно автоматически должно обрабатываться.
А если нетерпится обработать его самому, то милости просим - OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown.
А про чарсеты.... блин, не помню как от такой фигни избавится. Используй RichEdit - у него вроде проблем таких нету.
ЗЫ: А чем рич едит от мемо отличается, я его ни когда не использовал... :)
ЗЫ: А чем рич едит от мемо отличается, я его ни когда не использовал... :)
Он использует другую виндусовскую бибилиотеку - RICHEDT32.DLL, кажется, в отличие от Memo, который по сути является темже Edit контролом, только с возможностю многострочного редактирования. Кроме того, рич эдит отображает текст в формате RTF (Rich Text Format) - это текст с форматированием.
Ух ты, т.е. я смогу не просто добовлять строчки с одним и тем же формотированием, но и менять у каждой строчки цвет, жирность и т.д. ???
Кочечноже: для начала надо "выделить" текст, укоторого хочешь изменить формат
SelStart:= первый символ в тексте
SelLength:= длина выделения
SelAttributes - позволяет изменять параметры шрифта - цвет, жирность, начертание и т.п.
В стандартной поставке Delphi есть пример на использование RichEdit, он лежит в %DELPHI%\Demos\RichEdit
Гы =) супер =) Правда не совсем понял, там же лайнсы, а как выбрать нужный лайнс для форматирования?
Смотри MSDN для EM_LINEINDEX, EM_CHARFROMPOS... их там много. Это сообщения для RichEdit ов. их надо посылать через метод Perform
А, терь частично понял, а вот например в ричедите уже есть определенный текст, естественно в разных строчках, а как организовать поиск определенных слов, т.е. узнать индекс этого слова... и т.д. ?
код выделит жирным первое вхождение слова word в тексте ричэдита
const SOME_WORD: string = 'word';
var i: integer;
Str: string;
p: integer;
lineindex: integer;
charindex: integer;
begin
charindex:=-1;
for i:=0 to RichEdit1.Lines.Count-1 do begin
Str:=RichEdit1.Lines;
p:=Pos(SOME_WORD,Str);
if P > 0 then begin
lineindex:=RichEdit1.Perform(EM_LINEINDEX,i,0);
charindex:=lineindex + p - 1;
Break;
end;
end;
if charindex <> -1 then begin
RichEdit1.SelStart:=charindex;
RichEdit1.SelLength:=Length(SOME_WORD);
RichEdit1.SelAttributes.Style:=[fsBold];
end;
end;
Если надо все такие слова, то вместо Pos используешь PosEx (определена в модуле, кажется, StrUtils) и проходишь по всем строкам.
Кроме того ричэдит сам может найти нуждые подстроки - это зашито на уровне API.
RichEdit1.Lines.Count - определяет скока всего строк?
А почему -1 ? Я так думаю потому что мемо и ричедит последнюю строчку пустой оставляет?
p:=Pos(SOME_WORD,Str) - я как понимаю в строке переменной Str ищет слово переменной SOME_WORD и переменной P присваивает номер символа?
charindex:=lineindex + p - 1;
Енто я не понял =(
А все что после все понятно, спасибо =)
Спасибо! )) Значить
RichEdit1.Lines.Count - определяет скока всего строк?
А почему -1 ? Я так думаю потому что мемо и ричедит последнюю строчку пустой оставляет?
Нет - потому как строки с индексом RichEdit1.Lines.Count нету.
p:=Pos(SOME_WORD,Str) - я как понимаю в строке переменной Str ищет слово переменной SOME_WORD и переменной P присваивает номер символа?
Да. по остальному - смотри справку по сообщениям для окон редактирования.
вот тебе также пример для поиска всё тогоже слова, но на сообщениях.
RichEdit;
<...>
procedure TForm1.Button1Click(Sender: TObject);
const SOME_WORD: string = 'word';
var LastStr: integer;
ChLastStr: integer;
Ft: FINDTEXT;
charindex: integer;
begin
// получаем количество строк
LastStr:=RichEdit1.Perform(EM_GETLINECOUNT,0,0) - 1;
// получаем индекс последней строки
ChLastStr:=RichEdit1.Perform(EM_LINEINDEX,LastStr,0);
// формируем промежуток, в котором будем искать
// от начала
Ft.chrg.cpMin:=0;
// и до конца текста
Ft.chrg.cpMax:=ChLastStr + RichEdit1.Perform(EM_LINELENGTH,ChLastStr,0);
// и ЧТО мы будем искать
Ft.lpstrText:=Pchar(SOME_WORD);
// ищем первое вхождение слова в тексте
charindex:=RichEdit1.Perform(EM_FINDTEXT,0,integer(@Ft));
if charindex <> -1 then begin
RichEdit1.SelStart:=charindex;
RichEdit1.SelLength:=Length(SOME_WORD);
RichEdit1.SelAttributes.Style:=[fsBold];
end;
end;
Вот еще назрел вопрос, он словосочетание не ищет, т.е. придется отдельно каждое слово "искать"?
Кроме того он ищет слово максимум из 10-ти символов =о/
открывается браузер, ну с заранее введеным линком??
Можно использовать функцию ShellExecute (модуль ShellApi.pas)
begin
ShellExecute(Handle, 'open', 'http://forum.codenet.ru/', '', '', SW_SHOWNORMAL);
end;
Он ищет подстроку Ft.lpstrText - это может быть всё что угодно, хоть пол-текста контроле
Здорово, работает =) А с ограничениями в символах как разобраться??? см.выше =/
Нет там ограничения в символах. Проверял.
хм, а у меня в 7-х дельфях сей лаг, больше 10 символов в слове не выделяет, а если слово меньше чем примерно 3-4 символа, он лишнии выделяет =о/ Странно (
В делфи есть лаги, но они совсем другой природы (многопоточность и т.п.). У тебя в коде ошибка, проверь.
begin
charindex:=-1;
for i:=0 to Memo_01.Lines.Count-1 do begin
Str:=Memo_01.Lines;
p:=Pos(SW[J],Str);
if P > 0 then begin
lineindex:=Memo_01.Perform(EM_LINEINDEX,i,0);
charindex:=lineindex + p - 1;
Break;
end;
end;
if charindex <> -1 then begin
Memo_01.SelStart:=charindex;
Memo_01.SelLength:=Length(SW);
Memo_01.SelAttributes.Style:=[fsBold];
end;
end;
В SW[J] - нужное словечко, Memo_01 - это и есть ричедит, мне просто удобней так.
begin
charindex:=-1;
for i:=0 to Memo_01.Lines.Count-1 do begin
Str:=Memo_01.Lines;
p:=Pos(SW[J],Str);
if P > 0 then begin
lineindex:=Memo_01.Perform(EM_LINEINDEX,i,0);
charindex:=lineindex + p - 1;
Break;
end;
end;
if charindex <> -1 then begin
Memo_01.SelStart:=charindex;
Memo_01.SelLength:=Length(SW[J]); // <-- вот здесь была ошибка
Memo_01.SelAttributes.Style:=[fsBold];
end;
end;
ты уверен что тебе нкжно только первое вхождение слова? Обычно надо все вхождения..
О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )
Эмм, ну я 99% уверен что это слово повторяться не будет, а что, если сделать для неоднократного то траблы пройдут?
О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )
Вот те код, чтоб не мучался. Надоело уже просто.
RichEdit;
procedure FindAllMatches(EditControl: TRichEdit; const SubStr: string;
MatchCase: boolean = false; WholeWord: boolean = false);
var Ft: FINDTEXT;
SubStrIndex: integer;
SubStrLen: integer;
FindParam: integer;
begin
SubStrLen:=Length(SubStr);
SubStrIndex:=-1;
Ft.chrg.cpMin:=0;
Ft.chrg.cpMax:=MaxInt;
Ft.lpstrText:=PChar(SubStr);
FindParam:=0;
if MatchCase then FindParam:=FT_MATCHCASE;
if WholeWord then FindParam:=FindParam or FT_WHOLEWORD;
while true do begin
SubStrIndex:=EditControl.Perform(EM_FINDTEXT,FindParam,integer(@Ft));
if SubStrIndex > -1 then begin
EditControl.SelStart:=SubStrIndex;
EditControl.SelLength:=SubStrLen;
EditControl.SelAttributes.Style:=[fsBold];
end else Break;
Inc(Ft.chrg.cpMin,SubStrLen);
end;
end;
Ищет все подстроки SubStr в ричэдит контроле EditControl. Если надо, чтоб было соответствие регистром, то MatchCase должна стоять true если надо искать только целые слова - WholeWord должна быть в истине.
Кроме того, есть замечательная функция в рич эдите - FindText, прочитай в хэлпах про неё
О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )
Screen.Width и Screen.Height.
Например:
Если расширение 1280 на 960, то
Screen.Width будет 1280, а Screen.Height - 960
Как центрировать форму:
Form.top:=(Screen.height div 2)-(Form.Height div 2);
Form.left:=(Screen.width div 2)-(Form.width div 2);