- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Советы по 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; // Это необходимо, или форма не будет корректно перерисовываться