Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пару вопросов

14K
07 февраля 2006 года
Cleric
15 / / 07.02.2006
Сори, я полный нуб в дельфях, пару проблем, как заставить пахать скрол в формах, всмысле скрол на мышке. Кроме того в мемо проблемы с кирилицей, точнее когда копируешь в тот же блокнот косячит русская кодировка, но, самое интересное, что если копировать с включенной русской раскладкой то все гуд, оч.странно. Заранее благодарю =)
7.7K
09 февраля 2006 года
realcoding
52 / / 09.02.2006
Скрул в мемо включается свойством ScrollBars. А насчет копирования кириллицы, то у меня такая же фигня. Причем берешь че нить кроме блокнота или два блокнота происходит то же. Наверное это удел мастдая
5
09 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by realcoding
Скрул в мемо включается свойством ScrollBars. А насчет копирования кириллицы, то у меня такая же фигня. Причем берешь че нить кроме блокнота или два блокнота происходит то же. Наверное это удел мастдая


Эх вы. У свойства Font есть свойство Charset. Его меняете на RUSSIAN_CHARSET. У меня работает.

14K
11 февраля 2006 года
Cleric
15 / / 07.02.2006
Во превых не нашел где это в ScrollBars мышастый скрол врубается, во вторых Charset и так стоял RUSSIAN_CHARSET =о/
5
11 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Во превых не нашел где это в ScrollBars мышастый скрол врубается, во вторых Charset и так стоял RUSSIAN_CHARSET =о/


На мышке не скрол - а колёсико.
Оно автоматически должно обрабатываться.
А если нетерпится обработать его самому, то милости просим - OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown.

А про чарсеты.... блин, не помню как от такой фигни избавится. Используй RichEdit - у него вроде проблем таких нету.

14K
12 февраля 2006 года
Cleric
15 / / 07.02.2006
О! Супер =) Млин, почему я такой нубик, с колесиком разобрался, пасибо =) Ну ричь едит мну тож понравился, у него таких проблем как у мемо нет, но все же если например в блокноте написать че-нить русской, потом врубить английскую раскладку, выделить и откопировать в буфер, потом с той же раскладкой вставить в рич едит (чарсет - русский) то откопируется вопросиками "?????" Ну да пофих, главное что из рич едита копируется все на ура, огромное человеческое спасибо =)

ЗЫ: А чем рич едит от мемо отличается, я его ни когда не использовал... :)
5
12 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
ЗЫ: А чем рич едит от мемо отличается, я его ни когда не использовал... :)


Он использует другую виндусовскую бибилиотеку - RICHEDT32.DLL, кажется, в отличие от Memo, который по сути является темже Edit контролом, только с возможностю многострочного редактирования. Кроме того, рич эдит отображает текст в формате RTF (Rich Text Format) - это текст с форматированием.

14K
12 февраля 2006 года
Cleric
15 / / 07.02.2006
Ух ты, т.е. я смогу не просто добовлять строчки с одним и тем же формотированием, но и менять у каждой строчки цвет, жирность и т.д. ???
5
13 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Ух ты, т.е. я смогу не просто добовлять строчки с одним и тем же формотированием, но и менять у каждой строчки цвет, жирность и т.д. ???


Кочечноже: для начала надо "выделить" текст, укоторого хочешь изменить формат
SelStart:= первый символ в тексте
SelLength:= длина выделения
SelAttributes - позволяет изменять параметры шрифта - цвет, жирность, начертание и т.п.

В стандартной поставке Delphi есть пример на использование RichEdit, он лежит в %DELPHI%\Demos\RichEdit

14K
13 февраля 2006 года
Cleric
15 / / 07.02.2006
Гы =) супер =) Правда не совсем понял, там же лайнсы, а как выбрать нужный лайнс для форматирования?
5
13 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Гы =) супер =) Правда не совсем понял, там же лайнсы, а как выбрать нужный лайнс для форматирования?


Смотри MSDN для EM_LINEINDEX, EM_CHARFROMPOS... их там много. Это сообщения для RichEdit ов. их надо посылать через метод Perform

14K
15 февраля 2006 года
Cleric
15 / / 07.02.2006
Ужос, мну такое не переварить =))) Ладно, как нить разберусь, собсна уже не до этого, ОГРОМНОЕ СПАСИБО, скоро загляну %)
14K
21 февраля 2006 года
Cleric
15 / / 07.02.2006
А, терь частично понял, а вот например в ричедите уже есть определенный текст, естественно в разных строчках, а как организовать поиск определенных слов, т.е. узнать индекс этого слова... и т.д. ?
5
21 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
А, терь частично понял, а вот например в ричедите уже есть определенный текст, естественно в разных строчках, а как организовать поиск определенных слов, т.е. узнать индекс этого слова... и т.д. ?


код выделит жирным первое вхождение слова word в тексте ричэдита

Код:
procedure TForm1.Button1Click(Sender: TObject);
  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.
14K
21 февраля 2006 года
Cleric
15 / / 07.02.2006
Спасибо! )) Значить

RichEdit1.Lines.Count - определяет скока всего строк?
А почему -1 ? Я так думаю потому что мемо и ричедит последнюю строчку пустой оставляет?

p:=Pos(SOME_WORD,Str) - я как понимаю в строке переменной Str ищет слово переменной SOME_WORD и переменной P присваивает номер символа?

Цитата:
lineindex:=RichEdit1.Perform(EM_LINEINDEX,i,0);
charindex:=lineindex + p - 1;


Енто я не понял =(

А все что после все понятно, спасибо =)

5
21 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Спасибо! )) Значить

RichEdit1.Lines.Count - определяет скока всего строк?
А почему -1 ? Я так думаю потому что мемо и ричедит последнюю строчку пустой оставляет?

Нет - потому как строки с индексом RichEdit1.Lines.Count нету.

Цитата:
Originally posted by Cleric

p:=Pos(SOME_WORD,Str) - я как понимаю в строке переменной Str ищет слово переменной SOME_WORD и переменной P присваивает номер символа?

Да. по остальному - смотри справку по сообщениям для окон редактирования.

вот тебе также пример для поиска всё тогоже слова, но на сообщениях.

Код:
uses
  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;
14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
Чтож, спасибо огромное, фиг бы я еще где такую информацию полезную узнал, еще один маленький вопросик, можно сделать, что нажав на батон какой нить и открывается браузер, ну с заранее введеным линком??

Вот еще назрел вопрос, он словосочетание не ищет, т.е. придется отдельно каждое слово "искать"?

Кроме того он ищет слово максимум из 10-ти символов =о/
5
22 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
открывается браузер, ну с заранее введеным линком??

Можно использовать функцию ShellExecute (модуль ShellApi.pas)

 
Код:
procedure TForm1.Button1Click(Sender: TObject);
  begin
    ShellExecute(Handle, 'open', 'http://forum.codenet.ru/', '', '', SW_SHOWNORMAL);
  end;


Он ищет подстроку Ft.lpstrText - это может быть всё что угодно, хоть пол-текста контроле
14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
Здорово, работает =) А с ограничениями в символах как разобраться??? см.выше =/
5
22 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Здорово, работает =) А с ограничениями в символах как разобраться??? см.выше =/


Нет там ограничения в символах. Проверял.

14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
хм, а у меня в 7-х дельфях сей лаг, больше 10 символов в слове не выделяет, а если слово меньше чем примерно 3-4 символа, он лишнии выделяет =о/ Странно (
5
22 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
хм, а у меня в 7-х дельфях сей лаг, больше 10 символов в слове не выделяет, а если слово меньше чем примерно 3-4 символа, он лишнии выделяет =о/ Странно (

В делфи есть лаги, но они совсем другой природы (многопоточность и т.п.). У тебя в коде ошибка, проверь.

14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
Код:
For J:= 1 to 7 do
  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 - это и есть ричедит, мне просто удобней так.
5
22 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Код:
For J:= 1 to 7 do
  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;


ты уверен что тебе нкжно только первое вхождение слова? Обычно надо все вхождения..

14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
Эмм, ну я 99% уверен что это слово повторяться не будет, а что, если сделать для неоднократного то траблы пройдут?

О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )
5
22 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Cleric
Эмм, ну я 99% уверен что это слово повторяться не будет, а что, если сделать для неоднократного то траблы пройдут?

О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )


Вот те код, чтоб не мучался. Надоело уже просто.

Код:
uses
  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, прочитай в хэлпах про неё
14K
22 февраля 2006 года
Cleric
15 / / 07.02.2006
Большое человеческое спасибо, почитаю, простите за мою надоедливость)) по поводу экрана не могли бы посоветовать)
6.2K
23 февраля 2006 года
thenilman
44 / / 28.05.2005
Цитата:
Originally posted by Cleric

О! )) Еще один вопросик назрел, как определить текущее разрешение экрана чтоб центровать окошко по центру экрана? )


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);

14K
23 февраля 2006 года
Cleric
15 / / 07.02.2006
А, ну мну тока Screen.Width и Screen.Height не знал)) Пасиб большое, вопросов больше не имею...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог