Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 76 77 78 79 80 81 82 83 84 ... 123

SendMessage(Memo1.Handle, EM_EXLINEFROMCHAR, 0, ColNo)

Изменение поведения Delete в компоненте Memo

Delphi 1

Просто меняю обработчик Memo OnKeyDown следующим образом:

if Key = VK_DELETE then begin

 здесь делайте все, что вы хотите

end;

if Key = VK_BACK then begin

 аналогично

end;

Вероятно, лучшим решением было бы использование конструкции CASE, но я не уверен, что она поймет как нужно VK_??. Возможно, после обработки нужно вызвать унаследованный обработчик, т.е. дать поработать обработчику верхнего уровня, у которого мы стырили управление. Не хотите подумать над этим?

Чтобы понять, где мы сейчас находимся, используйте SelStart, например, так:

var

 Lpos, Cpos : Integer;

 Lpos := SendMessage(memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);

 Cpos := SendMessage(memo1.Handle, EM_LINEINDEX, Lpos, 0);

 CPos := Memo1.SelStart-CPos;

Ответ: поскольку vk_? имеет целочисленный тип, то это будет работать:

case Key of

VK_DELETE :

 begin

  Key := 0;  {этим мы не позволяем сообщению keydown передаваться дальше,

   например, форме или компонентам}

  выполняем нужный код;

 end;

VK_BACK:

 begin

  Key := 0;  {этим мы не позволяем сообщению keydown передаваться дальше,

   например, форме или компонентам}

  выполняем нужный код;

 end;

end;

Вставка текста в TMemo II

Delphi 1

Используйте сообщение Windows API EM_REPLACESEL:

EM_REPLACESEL

wParam = 0; /* не используется, должен быть ноль */

lParam = (LPARAM) (LPCSTR) lpszReplace; /* адрес новой строки */

Для замены текущего выбранного текста в поле редактирования, приложение должно послать сообщение EM_REPLACESEL, где параметр lpszReplace содержит новый текст.

Параметр Описание lpszReplace Значение lParam. Указатель на терминированную нулем строку, содержащую замещающий текст. { Указатель на строку }

Возвращаемое значение

Данное сообщение значение не возвращает.

Комментарии

Используйте сообщение EM_REPLACESEL, если вы хотите изменять только часть текста поля редактирования. Если вам нужно заменить весь текст, используйте сообщение WM_SETTEXT.

В случае отсутствия выбранного текста, замещающий текст вставляется в текущую позицию курсора.

(из справки по Windows API)

Сделайте список с вашими стандартными фразами, и используйте события "OnClick" или "OnMouseDown" в комбинации с "Alt", "Shift" или "Ctrl". Пример: Когда пользователь нажимает клавишу "Alt" в комбинации с правой кнопкой мыши, выводится список заранее подготовленных фраз и выбранная вставляется в ваш TMemo-компонент.

Для вставки строки в Memo:

procedure TForm1.Button1Click(Sender: TObject);

begin

 with Memo1 do begin

  SelStart:=10;

  SelLength:=0;

  SelText:='Эта строка включается в Memo, начиная с 10-й позиции ';

 end;

end;

Для вставки строки и замены некоторого существующего текста:

procedure TForm1.Button1Click(Sender: TObject);

begin

 with Memo1 do begin

  SelStart:=10;

  SelLength:=20;

  SelText:='Эта строка включается в Мемо, начиная с 10-й позиции и замещает собой 20 символов ';

 end;

end;

Поместите текст, который вы хотите вставить, в переменную PChar, затем вставьте текст в Memo, используя команду SetSelTextBuf, где SelStart устанавливается в позицию курсора TMemo. Это классно работает.

Другая полезность: вы можете обхойти предел TMemo в 32K в случае, если вы загружаете в него текст, пользуясь методом/командой Lines.LoadfromFile. Компонент имеет внутренний предел в 32K. Если вы загружаете нужный файл в указатель, и используете команду/метод SetTexBuf, то в этом случае в TMemo можно загрузить текста вплоть до 64K. 

NoteBook 

Включение/Выключение закладки Notebook II

Delphi 2 

В обработчике события OnChange вашего TTabbedNotebook разместите код примерно такого содержания:

if (NewTab = 0) and (IWantToDisableTab0) then AllowChange := False;

if (NewTab = 1) and (IWantToDisableTab1) then AllowChange := False;

Да, можно использовать конструкцию Case, но If в данном случае я посчитал удобнее.

OutLine 

Раскрытие пути к элементу TOutline по его индексу

Delphi 1 

Когда я писал этот код, у меня была цель по индексу TOutlineNode (который являлся результатом поиска) раскрыть его путь (т.е. раскрыть дочерние узлы, ведующие к нему), не затрагивая при это остальные узлы. 

Следующая процедура в качестве параметра принимает индекс, после чего раскрывает путь к элементу с этим индексом. 

Процедура подразумевает работу с объектом TOutline, имеющим имя Outline.

var Outline: TOutline;

procedure TSearchDlg.ExpandPathToFoundItem(const FoundItemIndex: Longint);

{------------------------------------------------------------------------------

 Открываем путь к данному элементу (элемент определяется номером индекса).

 До корневого элемента необходимо раскрывать только родителей.

 -----------------------------------------------------------------------------}

var

 ItemIndex: Longint;

 Found:     Boolean;

 LastCh:    Longint;

 Path:      String;

 ItemText:  String;

 SepPos:    Integer;

 OldSep:    String;

begin

 {Сохраняем старый ItemSpearator}

 OldSep:=Outline.ItemSeparator;

 {Устанавливаем новый ItemSeparator}

 Outline.ItemSeparator:='';

 {Получаем полный путь к TOutlineNode и добавляем ''. Это делается для упрощения последующего алгоритма}

 Path:=Outline.Items[FoundItemIndex].FullPath+'';

 {Зацикливаемся до тех пор, пока не будет достигнут конец пути}

 while Length(Path) > 0 do begin

  {Определяем в пути позицию первого ''}

  SepPos:=Pos('',Path);

  {Изолируем элемент TOutlineNode}

  ItemText:=Copy(Path,1,SepPos-1);

  {Определяем индекс TOutlineNode}

  ItemIndex:=Outline.GetTextItem(ItemText);

  {Раскрываем его}

  Outline.Items[ItemIndex].Expand;

  {Вырезаем из строки раскрытый TOutlineNode}

  Path:=Copy(Path,SepPos+1,Length(Path)-SepPos+1);

 end;

 {Восстанавливаем оригинальный ItemSeparator}

 Outline.ItemSeparator:=OldSep;

end;

Детали

Давайте присвоим элементу желаемый путь:

"My ComputerHardwareSoundCardBase Adress"

На первом шаге возвращается приведенный выше путь. Затем изолируется подстрока «My Computer». Затем с помощью метода «GetTextItem» определяется индекс TOutlineNode «My Computer». Метод «Expand» раскрывает это дерево. Впоследствие «My Computer» вырезается из пути, и новым путем становится «HardwareSoundCardBase Adress».

Затем определяется индекс «Hardware», раскрывается, и снова выразается. Данная процедура повторяется до тех пор, пока не останется пути, который можно раскрыть. После чего полностью раскрывается путь передаваемой TOutlineNode.

PageControl 

Динамические PageControl/TabSheet I

Delphi 2 

Динамическое создание Page Control'ов и Tab Sheet'ов:

var

 T : TTabSheet;

 P : TPageControl;

begin

 // Создаем PageControl

 // При создании получаем ссылку на PageControl, чтобы в дальнейшем на него ссылаться.

 P := TPageControl.Create(application);

 with P do begin

  Parent := Form1; // устанавливаем его как элемент управления формы.

  Top := 30;

  Left := 30;

  Width := 200;

  Height := 150;

 end; // with tpagecontrol

 // Создаем 3 страницы

 T := TTabSheet.Create(P);

 with T do begin

  Visible := True;  // Это необходимо, или форма не будет корректно перерисовываться

  Caption := 'Страница 1';

  PageControl := P; // Назначаем Tab в Page Control

 end; // with

 T := TTabSheet.Create(P);

 with T do begin

  Visible := True;  // Это необходимо, или форма не будет корректно перерисовываться

1 ... 76 77 78 79 80 81 82 83 84 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий