KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

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;  // Это необходимо, или форма не будет корректно перерисовываться

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*