Faq функция undo в tmemo


Содержание

Уроки Delphi

понедельник, 28 июля 2008 г.

Компонент TMemo

Он находится на палитре компонентов Standart. Как мы уже успели понять, он представляет собой поле для отображения и редактирования неформатированного текста. Текст можно загрузить из файла, набрать на клавиатуре, вставить из буфера обмена. Т.е. он имеет многие доступные свойства для редактирования текста, что способствует его применению в простейших текстовых редакторах для просмотра (редактирования) текста, наподобие того примера, который мы с вами периодически дописываем вот уже несколько уроков.

В этом компоненте текст всегда имеет одинаковый шрифт, задающийся через свойство Font.

Программно для компонента Memo1, расположенного на форме это делается следующим образом. Допустим, на форме расположено три компонента: поле редактирования текста Memo1 (страница Standart), диалог выбора шрифта FontDialog1 (страница Dialogs) и кнопка Button1 (страница Standart). Реакция на событие нажатия на кнопку Button1

procedure TForm1.Button1Click(Sender: TObject);

if FontDialog1.Execute then // если пользователь выбрал шрифт

Memo1.Font:=FontDialog1.Font; // установить выбранный шрифт

Если необходимо, чтобы в диалоге выбора шрифта изначально был выбран текущий шрифт, установленный компоненте Memo1, то перед вызовом диалога Execite устанавливаем в диалоге нужный шрифт.

procedure TForm1.Button1Click(Sender: TObject);

FontDialog1.Font:=Memo1.Font; // установить шрифт в диалоге

if FontDialog1.Execute then

Можно изменять шрифт для компонента TMemo (и не только для него) программно. Для этого в свойстве Font устанавливаются необходимые свойства во время работы приложения.

Memo1.Font.Name:=’Arial’; // установка имени шрифта

Memo1.Font.Size:=14; // установка размера шрифта

Memo1.Font.Color:=clRed; // цвет шрифта

Memo1.Font.Style:=[fsBold]; // установить жирный стиль

Style представляет собой массив свойств стиля шрифта. Необходимо в квадратных скобках указывать через запятую необходимые стили. Пустые кавычки будут означать установку шрифта без стиля. Список доступный свойств стиля шрифта:

Свойство WordWrap устанавливает, может или нет текст автопереносится на следующую строчку, если он достиг левого края компонента. Автоперенос работает и когда пользователь во время работы приложения изменяет размеры компонента.

Текст в компоненте доступен через свойство Lines. Он содержит массив строк, находящихся в компоненте. Можно получить доступ как к отдельной строке, так и к всему тексту. Это свойство можно редактировать и во время работы приложения, и во время разработки в инспекторе объектов.

Загрузка строк из файла через процедуру

где «c:\1.txt» – загружаемый файл в компонент. Следует при этом помнить, что компонент TMemo ограничен в размерах текста.

Сохранение строк в файл.

Количество строк в компоненте можно узнать через свойство Memo1.Lines.Count, а доступ к отдельной строчке через функцию Strings. Например:

ShowMessage(Memo1.Lines.Strings[0]); // Показывает в окошке первую строчку текста.

Strings – это массив строк, начинающихся с нулевого знака, заканчивающиеся Count-1. Об этом следует помнить при написании подобных процедур доступа, иначе произойдет выход за доступный предел массива, что вызовет ошибку в программе.

Можно для примера организовать цикл поочередного отображения строк из компонента Memo1. Для реакции на нажатия на кнопку Button1 это выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

Var i:Integer; // объявление целочисленной переменной

if Memo1.Lines.Count<>0 then // проверка ненулевого количества строк

for i:=0 to Memo1.Lines.Count-1 do // задается цикл, равный кол-ву строк

ShowMessage(Memo1.Lines.Strings[i]); // вывод строк в сообщение

Очистить Strings можно одной процедурой Memo1.Lines.Clear.

Вставить строчку в заданное место –

Последний пример вставляет текстовую строку в первую строку (первая строка -1 = 0).

Memo1.Lines.Delete(0); // удаляет первую строку

При применении процедуры удаления строк Delete помните, что сначала нужно проверять компонент TMemo на наличие таковых вообще. Проверка через функцию Count, которая возвращает их целочисленное значение.

Работа с выделенным текстом программно аналогична работе пользователя вручную. Если пользователь выберет процедуру вырезания выделенного текста в буфер или его удаление, то он пропадет. Выделение текста производится с помощью двух процедур.

Memo1.SelStart:=0; // установить начальное положение выделения


Memo1.SelLength:=15; // установить длину выделенного текста

Если необходимо всегда видит выделенный текст, даже при переходе управления на другой элемент управления, то установите свойство HideSelection в false.

Работа с выделенным фрагментом текста

Memo1.ClearSelection; // удалить выделенный текст

Memo1.CutToClipboard; // вырезать в буфер обмена

Memo1.CopyToClipboard; // скопировать в буфер обмена

Memo1.PasteFromClipboard; // вставить из буфера обмена

Memo1.SelText; // эта функция возвращает текстовую строку выделенного текста

Отмена последнего изменения – процедура Memo1.Undo.

Компонент TMemo является оконным визуальным компонентом, т.е. у него имеются свойства, характерные множеству компонентов,
таких как Border, Color, Align, Enabled, Visible.

Faq функция undo в tmemo

Профиль
Группа: Участник
Сообщений: 57
Регистрация: 14.6.2002

Репутация: нет
Всего: нет

Как в TMemo увеличить буфер undo?

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Vit
Дата 5.3.2003, 03:25 (ссылка) | (нет голосов) Загрузка .
++-Vex
Дата 5.3.2003, 03:57 (ссылка) | (голосов: ) Загрузка .
Цитата
Скорее всего где-то в настройках BDE

Сорри, а при чем тут BDE ? ? ?

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Vit
Дата 5.3.2003, 06:10 (ссылка) | (нет голосов) Загрузка .
Google
Дата 12.11.2020, 15:42 (ссылка)

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

Советы по программированию на DELPHI (ч.2)

Как реализовать undo и redo в tmemo.

В текстовых редакторах, как правило, необходимо реализовать функции undo и redo. Ведь без них раьота с программой становится просто неудобной, а порой и опасной (можно случайно потерять какие-нибудь данные. ). Поэтому в этот раз мы поговорим с вами о том как же это сделать.

Для начала нам надо узнать, можно ли выполнить undo. Для этого напишите:

if memo1.per form (em_canundo, 0, 0) <> 0 then

Теперь реализуем функцию undo:

memo1.per form (em_undo, 0, 0);

Вставьте эту конструкцию между begin и end предыдущего примера.

Для того, чтобы реализовать функцию redo, вам необходимо еще раз вызвать функцию undo


Обработка исключительных ситуаций.



Чтобы программа производила хорошее впечатление, она должна иметь не только удобный интерфейс, справочную систему и прочее, она должна еще и работать, работать в любом случае, независимо от действий пользователя.

Для начала вам надо продумать те места, программы, которые могут вызвать ошибку и попытаться проконтролировать этот участок кода. Например, при вводе числа в текстовое поле необходимо делать проверку вводимых символов. Это можно осуществить с помощью оператора case. В обработчик события onkeypress для edit’a напишите:

Есть и еще два блока операторов, которые помогут вам в обработке исключительных ситуаций.

Синтаксис первого блока:

Реализация интерфейса Плавающих окон (drag & dock)

В первую очередь для этого нам понадобится Дельфи, начиная с 4-ой версии. Кстати примером такого интерфейса является редактор кода в Дельфи. Попробуем сделать подобный.

Поместите на форму четыре панели (tpanel). Первая будет приемником остальных. Для этого установите свойство docksite первой панели в true. А у трех других панелей установите свойство dragmode в dmautomatic, а свойство dragkind в dock. Вот и все, запустите ваше приложение. При щелчке по какой-нибудь из трех панелей (не по первой) у нее появятся атрибуты плавающего окна, и ее спокойно можно будет перемещать по экрану, а можно поместить внутрь первой панели.

Вот так мы реализовали интерфейс drag & dock, не написав ни одной строчки кода.

Список всех запущенных приложений.

Для того, чтобы получить список всех запущенных приложений, поместите на форму listbox и button, обработчик события которой должен иметь примерно такой вид.

procedure t form 1.button1click(s end er: tobject);
var
wnd : hwnd;
buff: array [0..127] of char;
begin
listbox1.clear;
wnd := getwindow(handle, gw_hwndfirst);
while wnd <> 0 do begin
if (wnd <> application.handle) and <-Собственное окно>
iswindowvisible(wnd) and <-hевидимые окна>
(getwindow(wnd, gw_owner) = 0) and <-Дочернии окна>
(getwindowtext(wnd, buff, sizeof(buff)) <> 0)
then begin
getwindowtext(wnd, buff, sizeof(buff));
listbox1.items.add(strpas(buff));
end ;
wnd := getwindow(wnd, gw_hwndnext);
end ;
listbox1.itemindex := 0;
end ;

При нажатии на кнопку listbox заполнится списком запущенных в данный момент приложений!

Преобразование bmp в jpg.

Для того, чтобы преобразовать картиеку в bmp-формате в jpg-формат вам необходимо подключить к программе (в uses) модуль jpeg.

Затем вам надо объявить переменную типа tjpegimage. Ну а затем проделать следующие действия:

Например, при нажатии кнопки создадим jpeg-файл из bmp-файла. Обработчик события onclick может иметь такой вид:

Ну вот и все. Посмотрите, у класса tjpegimage есть еще много интересных свойств и методов. Обязательно поэкспериментируйте.

Перезагрузка компьютера.

Для того, чтобы перезагрузить windows вам необходимо где-нибудь написать этот код:

А для того, чтобы выключить компьютер вам необходимо поместить в программе такой код:

а затем протянуться ручками к кнопке power.

Извлечение иконок из exe и dll. (api)

Решить эту задачу нам поможет функция function extracticon(hinstance, filename, iconindex):integer

где hinstance — глобальная переменная приложения, ее изменять не надо. Тип integer.

filename — имя программы или dll из которой надо извлекать иконки. Тип pchar.

iconindex — порядковый номер иконки в файле (начинается с 0). В одном файле может находится несколько иконок. Тип integer.

Функция находится в модуле shellapi, так что не забудьте подключить его в uses. Если эта функция возвратит ноль, значит иконок в файле нет.

Данная функция возвращает handle иконки, поэтому применять ее нужно так:

image1.picture.icon.handle:=extracticon(hinstance, pchar(paramstr(0)), 0);

данное объявление нарисует в image’e картинку вашего приложения.

Директория вашей программы.

Начнем с того, как можно узнать полное имя вашей программы. Здесь есть два решения.

Первое решение: воспользоваться таким объявлением application.exename:string;

Второе решение: я чаще им пользуюсь paramstr(0); так же возвратит полный путь к вашей программе. Ну а чтобы узнать директорию вашей программы воспользуемся функцией extractfilepath(filename:string):string;

То есть узнать директорию можно так: extractfilepath(paramstr(0));

Удаление директории, содержащей файлы.

Предлагаю вашему вниманию одну интересную функцию, автора ее я не знаю, но функция работает! Привожу ее исходный код.

function myremovedir(sdir : string) : boolean;
var
iindex : integer;
searchrec : tsearchrec;
sfilename : string;
begin
result := false;
sdir := sdir + ‘\*.*’;
iindex := findfirst(sdir, faanyfile, searchrec);

while iindex = 0 do begin
sfilename := extractfiledir(sdir)+’\’+searchrec.name;
if searchrec.attr = fadirectory then begin
if (searchrec.name <> » ) and
(searchrec.name <> ‘.’) and
(searchrec.name <> ‘..’) then
myremovedir(sfilename);
end else begin
if searchrec.attr <> faarchive then
filesetattr(sfilename, faarchive);
if not deletefile(sfilename) then
showmessage(‘could not delete ‘ + sfilename);
end ;
iindex := findnext(searchrec);
end ;

removedir(extractfiledir(sdir));
result := true;
end ;


Для тех кто не очень дружит с функциями приведу пример ее использования. Например, в обработчике нажатия на кнопку напишите (где-нибудь повыше конечно же должна быть написана сама функция):

if not myremovedir(‘c:\mydir’) then
showmessage(‘can not delete dir’);

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

Манипуляции с кнопкой ПУСК.

— Нажать пуск
var
htaskbar, hbutton: hwnd;
o:boolean;
begin
htaskbar:= findwindow(‘shell_traywnd’, nil);
hbutton:= getwindow(htaskbar, gw_child);
s end message(hbutton, wm_lbuttondown,
mk_lbutton,loword(5)+hiword(screen.height-20));

Добавляем программу в авторан.

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

Функция Undo Send от компании Google

Хорошо забытое старое

Иногда старые идеи оказываются самыми удачными. В случае с почтовым ресурсом Gmail сотрудники отдела маркетинга компании Google «стряхнули паутину» с решения шестилетней давности и запустили его в ничего не подозревающий мир. Многие восприняли эту новость с энтузиазмом, но, несмотря на то что новая (и она же старая) функция Undo Send использует собственный подход, некоторые известные проблемы, характерные для механизмов отзыва сообщений, по-прежнему сохраняются.

Компания Google повысила статус экспериментальной функции Undo Send системы Gmail c бета-версии до полноценного решения, доступного для всех. Функция существует с 2009 года, когда она впервые была представлена миру компанией Google Labs. Остается загадкой, почему такой полезной функции потребовалось шесть лет, чтобы перейти в новое качество.

Принцип работы Undo Send достаточно прост. Измените настройки системы Gmail, чтобы активировать эту функцию и установить в качестве задержки интервал от 5 до 30 секунд. После этого при отправке сообщения в течение времени задержки будет доступна ссылка Undo Send. Нажатие на ссылку приводит к тому, что система Gmail извлекает сообщение из очереди отправки и помещает его в папку Drafts, где сообщение можно отредактировать, удалив любой кусок текста, из-за которого вы решили отменить отправку сообщения.

Задача такой функции, как Undo Send, проста: спасти пользователя от последствий отправки сообщения кому-то, для кого оно не было предназначено.

Мне нравится решение, предложенное компанией Google, оно кажется мне полезным, но у такого подхода есть ряд недостатков. Около четырех лет назад я писал о бесперспективности попыток отозвать отправленное сообщение, используя функцию Recall This Message в клиенте Outlook (эта функция присутствует и в версии Outlook 2020). Я отметил, что современные системы электронной почты так быстро обрабатывают сообщения, что любая попытка вернуть отправленное сообщение ни к чему не приведет, поскольку искомое сообщение, скорее всего, будет отправлено задолго до того, как пользователь решит его отозвать. В этом отношении решение от компании Google является продуманным, поскольку вы можете выбрать, на какое время задерживать сообщения (до 30 секунд), прежде чем сервер начнет обрабатывать их. Однако недостаток его состоит в том, что все сообщения задерживаются на выбранный временной интервал, и этот факт сводит на нет часть преимуществ.

Другие проблемы являются общими для современных механизмов отзыва. Прежде всего, у этих команд есть области действия, которые ограничены рамками почтовой системы. Ресурс Gmail представляет собой почтовую систему, и он может управлять обработкой любого сообщения в своих пределах. То же самое можно сказать и о других потребительских системах, таких как Outlook.com. Но в коммерческих системах электронной почты все по-другому. Возьмем локальный сервер Exchange. Сообщение, отправленное из почтового ящика, может иметь возможность отзыва, но может и не иметь, особенно если оно адресовано внешнему получателю. То же самое происходит внутри системы Exchange Online, где даже пользователи из других подписок Office 365 считаются внешними получателями и, следовательно, находятся за пределами границ, внутри которых предусмотрена возможность отзыва.

Обратите внимание, что система Gmail только пытается задержать отправку сообщения. Она не пытается извлечь копии сообщений, отправленных и доставленных в почтовые ящики получателей. После того как сообщение начнет свой путь, система Gmail отправит его по назначению. Я думаю, что это разумный и практичный подход, потому что есть только одна точка, в которой вы можете гарантированно блокировать исходящее сообщение, и эту точку сообщение проходит до того, как начнет обрабатываться транспортными механизмами. Помимо проблемы, связанной с внешними получателями, предлагаемая клиентом Outlook попытка достать и извлечь копии отзываемых сообщений из почтовых ящиков пользователей, скорее всего, вызовет негативную реакцию даже в пределах одной организации, так как некоторые пользователи, возможно, уже успеют увидеть нежелательное содержимое.

Но отдельной большой проблемой, продолжающей препятствовать тому, чтобы отзыв сообщений работал так, как хотелось бы, по-прежнему является распространение мобильных клиентов. Undo Send функционирует, если вы используете браузер для работы с системой Gmail. Но перейдите на почтовый клиент для системы iOS от компании Apple или на любой из бесчисленных почтовых клиентов, которые работают на устройствах с системой Android (включая Outlook for Android), и вы будете разочарованы, потому что в этих клиентах нет пользовательского интерфейса для выполнения отзыва сообщений. Это утверждение верно и в случаях, когда мобильные клиенты подключаются к системе Exchange.

В защиту разработчиков мобильных клиентов электронной почты отмечу, что они, вероятно, вряд ли могут повлиять на проблему, поскольку протоколы, на которые они опираются при подключении своих клиентов к системам Gmail или Exchange, не поддерживают понятий «отзыва сообщений» или «отмены отправки». Большинство мобильных клиентов подключаются к системе Gmail, используя протокол IMAP4, а протокол ActiveSync (EAS) является инструментом, применяемым при работе с системой Exchange, — ни один из них не поддерживает возможность отзыва сообщений. Протоколы знают лишь о том, что клиенты предоставляют сообщения для отправки, и сообщения считаются отправленными, как только они переданы на сервер.

Возможно, необходимо добавить «железобетонное» средство отзыва сообщений в серверные механизмы. Это необходимо не для того, чтобы свести на нет значение возможности создания пользователями задержек перед отправкой сообщений. Мне нравится идея с задержками, но я предпочел бы, чтобы механизм лучше контролировался, например так, чтобы можно было применять задержку к сообщениям, адресованным конкретным лицам. Но реальное решение может лежать в области работающего на сервере искусственного интеллекта, который рассматривает исходящую почту, выявляя скрытые ошибки. Возможно, искомое решение будет подобно функции Clutter, изучающей наши привычки при работе с электронной почтой.

И тогда мы могли бы вернуть помощника Clippy, чтобы он информировал пользователей о том, что им, возможно, стоит пересмотреть свое решение: «Прошу прощения. Я заметил, что вы назвали получателя письма идиотом. Вы хотите, чтобы я доставил сообщение?» Было бы замечательно!

Поделитесь материалом с коллегами и друзьями

Delphi

Наши проекты

С кнопкой мы уже разобрались во втором уроке.

TEdit

Этот компонент представляет из себя текстовое поле ввода. У него есть такие же свойства как и у TButton.

Основные cвойсва:
Text — это текст который введен;
ReadOnly — разрешенн ли ввод;
MaxLength — максимальная длинна текста. Измеряется в колличестве символов;
HideSelection — будет ли сниматься выделение с текста при потере компонентом фокуса;
PasswordChar — символ отображаемый вполе вместо всех других символов — используется для скрытия пароля;

Основные события:
onChange — происходит при любом изменении отображаемого текста;
onClick — происходит при клике по компоненту;

Все остальные свойства аналогичны свойствам формы. Свойства формы рассмотренны в третьем уроке

Научимся программно извлекать введенные данные, а также записывать в поле. Для этого выложиv на форму 2 Button и 1 Edit.

Создаем событие по клику на первую кнопку и пишем следующий код:

Текст «В Edit1 написан текст: » будет выводиться всегда во всех сообщениях. К нему мы прибавляем Edit1.Text, т.е. строчку содержащую текст введенный в Edit.

А по нажатию на вторую кнопку будем в поле Edit1 присваивать что-нибудь свое.

В итоге у Вас должно получиться 2 процедуры:

Запускаем программу и пробуем.

TMemo

Основные свойства:
Lines — содержит все строки введенные в компонент;
ReadOnly — разрешенн ли ввод;
MaxLength — максимальная длинна текста. Измеряется в колличестве символов;
HideSelection — будет ли сниматься выделение с текста при потере компонентом фокуса;
ScrollBars — какие полосы прокрутки будут отображаться;
WantReturns — разрешено ли использовать клавишу Enter;
WantTabs — разрешено ли использовать клавишу Tab;
WordWrap — будет ли переноситься текст на новую строчку если не входит;

События аналогичны компоненту TEdit.

Теперь научимся работать с TMemo. Создайте новый проект (File –> New –> Application). Выложите на форму 1 TMemo и 1 TButton. Выделите Memo1 и найдите свойство Lines в инспекторе объектов. Щелкните по этому свойству, а затем по кнопке . Появится окно с текстом «Memo1» — это текст который будет в Memo при запуске программы. Его можно убрать, что и нужно сделать. Теперь создаем событие по нажатию на кнопку:

Теперь после нажатия на кнопку в Memo1 добавится новая строчка.


Выложите еще одну кнопку и в событии onClick пишем:

Теперь после нажатия на вторую кнопку удалится самая первая строчка. «0» и означает что будет удалена нулевая строчка (нумерование ведется начиная с 0)

А если нам нужно взять i-тую строчку и вывести ее на экран мы пишем следующий код:

В данном случае мы извлекаем нулевую строчку.

Колличество написанных строк хранится тут:

Обратите внимание, что тут нумерация идет с 1. А следовательно если будем прогонять все строки в цикле то будем писать так:

Чтобы сохранить весь текст в файл просто пишем:

А чтобы загрузить из файла пишем:

Чтобы очистить Memo:

TListBox

Основные cвойсва:
Items — коллекция строк;
MultiSelect — разрешено ли выделение нескольких строк;
Columns — колличество колонок;
Color — цвет фона;
Sorted — сортировка по алфавиту;

Остальные свойства были объяснены у других компонентов.

Добавление строчки делается так:

А теперь разберемся как же добавить текст из Edit. Выложим на форму TListBox, TEdit и TButton. Создайте событие у кнопки onCreate:

А если мы будем жать кнопку ничего не вводив в Edit, то будут добавляться пустые строки. Для того чтобы такого небыло просто перед добавлением сравним: пустое ли поле Edit. Если не пустое добавим. Сейчас разберем как это можно реализовать. Изменим ту же самую процедуру Button1Click. Вот как все должно выглядеть:

То же самое действие можно сделать немного по другому:

Exit означает завершение процедуры и прекращение ее выполнения дальше. Сначала проверяем написано ли что-нибудь в Edit1 и если там ничего не написанно то завершаем выполнение процедуры, тем самым строчка ListBox1.Items.Add(Edit1.Text); не будет выполненна, а значит и ничего не добавится.

Для того чтобы узнать номер выделенной строчки пишем:

Если ничего не выделенно то ItemIndex=-1. Так как в процедуре ShowMessage входной параметр строкового типа, а ItemIndex целочисленного, то необходимо перевести из целочисленного типа в строковый. Проще говоря нужно перевести из Integer в String.

IntToStr — это и есть функция перевода из целочисленного типа в строковый, а StrToInt — обратно.

Можно не только получить выделенную строку, но и программно выделить нужную строку. Допустим нужно выделить 2 стрку:

Так как нумерация ведется начиная с 0 то присваиваем не 2 а 1.

Чтобы удалить какую-либо строку:

В данном случае удаляем строку под номером 0 — самую первую в списке.

А как удалить выделенную строку? Очень просто:

Чтобы очистить ListBox не совсем обязательно удалять каждую строчку можно просто вызвать функцию:

Урок 5 — Изучаем компоненты TLabel, TPanel, TMainMenu

500+ FAQ по Delphi

Правила форума «Delphi: Общие вопросы»

Перейти на: Главную | Индексную | Предыдущую | Следующую страницу

Как в компоненте TMemo перехватить нажатие Ctrl-V и вставить специальный текст не из буфера обмена (clipboard)?

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if ((Key = ord(‘V’)) and (ssCtrl in Shift)) then
begin
if Clipboard.HasFormat(CF_TEXT) then
ClipBoard.Clear;
Memo1.SelText := ‘Delphi is RAD!’;
key := 0;
end;
end;
Как создать эквивалент TEdit но только с выравниваением вводимого текста по центру или по правой стороне?

TEdit не поддерживает выравниваение текста по центру и по правой стороне — лучше использовать компонент TMemo.
Вам понадобится запретить пользователю нажимать Enter, Ctrl-Enter и всевозможные комбинации клавиш со стрелками,
чтобы избежать появления нескольких сторк в Memo. Этого можно добиться и просматривая содержимое текста в
TMemo в поисках кода возврата каретки (13) и перевода строки(10) на событиях TMemo Change и KeyPress.
Можно также заменять код возврата каретки на пробел — для того чтобы позволять вставку из буфера обмена
многострочного текста в виде одной строки.
Пример:

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Alignment := taRightJustify;
Memo1.MaxLength := 24;
Memo1.WantReturns := false;
Memo1.WordWrap := false;
end;

procedure MultiLineMemoToSingleLine(Memo : TMemo);
var
t : string;
begin
t := Memo.Text;
if Pos(#13, t) > 0 then
begin
while Pos(#13, t) > 0 do
delete(t, Pos(#13, t), 1);
while Pos(#10, t) > 0 do
delete(t, Pos(#10, t), 1);
Memo.Text := t;
end;
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
MultiLineMemoToSingleLine(Memo1);
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
MultiLineMemoToSingleLine(Memo1);
end;
Как запрограммировать undo?

Memo1.Perform(EM_UNDO, 0, 0);

Если Вы хотите узнать, возможно ли выполнить операцию «Undo», проверьте «Undo status»:

If Memo1.Perform(EM_CANUNDO, 0, 0) <> 0 then
begin

end;

Для выполнения «Redo» выполните «Undo» еще раз.
Можно ли создать форму, которая получает дополнительные параметры в методе Сreate?


Просто замените конструктор Create класса Вашей формы.
Пример:
unit Unit2;

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm2 = class(TForm)
private

public
constructor CreateWithCaption(aOwner: TComponent; aCaption: string);

end;

var
Form2: TForm2;

constructor TForm2.CreateWithCaption(aOwner: TComponent; aCaption: string);
begin
Create(aOwner);
Caption := aCaption;
end;

uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
Unit2.Form2 :=Unit2.TForm2.CreateWithCaption(Application, ‘My Caption’);
Unit2.Form2.Show;
end;
Почему при изменении цвета шрифта в StatusBar’s он (шрифт) не меняется?

Status bar (строка состояния) — стандартный элемент управления Windows и цвет его шрифта задается через Control Panel (константа clBtnText). Этот цвет по умолчанию черный и может меняться при выборе пользователем той или иной цветовой схемы. У компонента ТStatusBar и его панелей есть возможность «owner-draw» — программной перерисовки, которая позволяет выводить на панель текст любого цвета. Измените свойство Style компонента TStatusBar.Panels на OwnerDraw.
Пример:

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
const Rect: TRect);
begin
if Panel = StatusBar.Panels[0] then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 0’)
end
else
begin
StatusBar.Canvas.Font.Color := clGreen;
StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 1’);
end;
end;
Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия?

В примере создается компонент, унаследованный от TTrackbar который переопределяет метод CreateParams и убират флаг TBS_ENABLESELRANGE из Style. Константа TBS_ENABLESELRANGE обьявленна в модуле CommCtrl.
Пример:

uses CommCtrl, ComCtrls;

type TMyTrackBar = class(TTrackBar)
procedure CreateParams(var Params: TCreateParams); override;
end;

procedure TMyTrackBar.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style and not TBS_ENABLESELRANGE;
end;

var
MyTrackbar : TMyTrackbar;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyTrackBar := TMyTrackbar.Create(Form1);
MyTrackbar.Parent := Form1;
MyTrackbar.Left := 100;
MyTrackbar.Top := 100;
MyTrackbar.W > MyTrackbar.Height := 45;
MyTrackBar.Visible := true;
end;
Мне нужен временный canvas, но когда я пытаюсь его создать получаю сообщения об ошибках. Как создать TCanvas? Создайте Bitmap и используйте свойство canvas класса TBitmap. Пример создает Bitmap, рисует на его canvas’е, выводит этот canvas на форму и освобождает bitmap.

procedure TForm1.Button1Click(Sender: TObject);
var
bm : TBitmap;
begin
bm := TBitmap.Create;
bm.W > bm.Height := 100;
bm.Canvas.Brush.Color := clRed;
bm.Canvas.FillRect(Rect(0, 0, 100, 100));
bm.Canvas.MoveTo(0, 0);
bm.Canvas.LineTo(100, 100);
Form1.Canvas.StretchDraw(Form1.ClientRect,Bm);
bm.Free;
end;
В некоторых видео режимах прозрачная часть glyph’а стандартного TBitBtn становится видной. Как этого избежать?

В примере используется техника закраски прозрачной части glyph’а цветом кнопки на которой он находится — таким образом glyph кажется прозрачным.
Пример:

function InitStdBitBtn(BitBtn : TBitBtn; kind : TBitBtnKind) : bool;
var
Bm1 : TBitmap;
Bm2 : TBitmap;
begin
Result := false;
if Kind = bkCustom then exit;
Bm1 := TBitmap.Create;
case Kind of
bkOK : Bm1.Handle := LoadBitmap(hInstance, ‘BBOK’);
bkCancel : Bm1.Handle := LoadBitmap(hInstance, ‘BBCANCEL’);
bkHelp : Bm1.Handle := LoadBitmap(hInstance, ‘BBHELP’);
bkYes : Bm1.Handle := LoadBitmap(hInstance, ‘BBYES’);
bkNo : Bm1.Handle := LoadBitmap(hInstance, ‘BBNO’);
bkClose : Bm1.Handle := LoadBitmap(hInstance, ‘BBCLOSE’);
bkAbort : Bm1.Handle := LoadBitmap(hInstance, ‘BBABORT’);
bkRetry : Bm1.Handle := LoadBitmap(hInstance, ‘BBRETRY’);
bkIgnore : Bm1.Handle := LoadBitmap(hInstance, ‘BBIGNORE’);
bkAll : Bm1.Handle := LoadBitmap(hInstance, ‘BBALL’);
end;
Bm2 := TBitmap.Create;
Bm2.W > Bm2.Height := Bm1.Height;
Bm2.Canvas.Brush.Color := ClBtnFace;
Bm2.Canvas.BrushCopy(Rect(0, 0, bm2.Width, bm2.Height), Bm1,
Rect(0, 0, Bm1.width, Bm1.Height),
Bm1.canvas.pixels[0,0]);
Bm1.Free;
LockWindowUpdate(BitBtn.Parent.Handle);
BitBtn.Kind := kind;
BitBtn.Glyph.Assign(bm2);
LockWindowUpdate(0);
Bm2.Free;
Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
InitStdBitBtn(BitBtn1, bkOk);
end;
Создание PolyPolygon используя массив точек?

Polygon — метод компонента TCanvas получает в качестве параметра динамический массив точек. Функция PolyPolygon() из Windows GDI получает указатель на массив точек.
Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
ptArray : array[0..9] of TPOINT;
PtCounts : array[0..1] of integer;
begin
PtArray[0] := Point(0, 0);
PtArray[1] := Point(0, 100);
PtArray[2] := Point(100, 100);
PtArray[3] := Point(100, 0);
PtArray[4] := Point(0, 0);
PtCounts[0] := 5;
PtArray[5] := Point(25, 25);
PtArray[6] := Point(25, 75);
PtArray[7] := Point(75, 75);
PtArray[8] := Point(75, 25);
PtArray[9] := Point(25, 25);
PtCounts[1] := 5;
PolyPolygon(Form1.Canvas.Handle,
PtArray,PtCounts,2);
end;
Как создать невизуальный компонент без иконки, которая изображается в палитре компонентов в «design-time» (вроде TField)?

Невизуальные компоненты без иконки удобны для субкомпонентов, связанных с какими-то другими компонентами. Создайте компонент как обычно, но используйте RegisterNoIcon вместо RegisterComponent. Как показывать нестандартный встроенный редактор (inplace editor) в ячейке stringgrid (например combobox).
procedure TForm1.FormCreate(Sender: TObject);
begin
<Высоту combobox'а не изменишь, так что вместо combobox'а
будем изменять высоту строки grid’а !>
StringGr > <Спрятать combobox>
ComboBox1.Visible := False;
ComboBox1.Items.Add(‘Delphi Kingdom’);
ComboBox1.Items.Add(‘Королевство Дельфи’);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
<Перебросим выбранное в значение из ComboBox в grid>
StringGrid1.Cells[StringGrid1.Col,
StringGr > ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
<Перебросим выбранное в значение из ComboBox в grid>
StringGrid1.Cells[StringGrid1.Col,
StringGr > ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if ((ACol = 3) AND (ARow <> 0)) then
begin
<Ширина и положение ComboBox должно соответствовать
ячейке StringGrid>
R := StringGrid1.CellRect(ACol, ARow);
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.W > ComboBox1.Height := (R.Bottom + 1) — R.Top;
<Покажем combobox>
ComboBox1.Visible := True;
ComboBox1.SetFocus;
end;
CanSelect := True;
end;
Как узнать есть ли в заданном CD-ROM’е Audio CD?

Можно использовать функцию Windows API GetDriveType() чтобы определить является ли дисковод CD-ROM’мом. И функцию API GetVolumeInformation() чтобы проверить VolumeName на равенство ‘Audio CD’.
Пример:

function IsAudioCD(Drive : char) : bool;
var
DrivePath : string;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
VolumeName : string;
Begin
sult := false;
DrivePath := Drive + ‘:\’;
if GetDriveType(PChar(DrivePath)) <> DRIVE_CDROM then
exit;
SetLength(VolumeName, 64);
GetVolumeInformation(PChar(DrivePath),PChar(VolumeName),
Length(VolumeName),nil,MaximumComponentLength,FileSystemFlags,nil,0);
if lStrCmp(PChar(VolumeName),’Audio CD’) = 0 then
result := true;
end;

function PlayAudioCD(Drive : char) : bool;
var
mp : TMediaPlayer;
begin
result := false;
Application.ProcessMessages;
if not IsAudioCD(Drive) then
exit;
mp := TMediaPlayer.Create(nil);
mp.Visible := false;
mp.Parent := Application.MainForm;
mp.Shareable := true;
mp.DeviceType := dtCDAudio;
mp.FileName := Drive + ‘:’;
mp.Shareable := true;
mp.Open;
Application.ProcessMessages;
mp.Play;
Application.ProcessMessages;
mp.Close;
Application.ProcessMessages;
mp.free;
result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not PlayAudioCD(‘D’) then
ShowMessage(‘Not an Audio CD’);
end;
Как узнать есть ли у мыши колесико?

Свойство «WheelPresent» глобального обьекта «mouse».
События KeyPress и KeyDown не вызываются для клавиши Tab — как определить, что она была нажата?

На уровне формы клавиша tab обычно обрабатывается Windows. В примере создается обработчик события CM_Dialog для перехвата Dialog keys.
type
TForm1 = class(TForm)
private
procedure CMDialogKey( Var msg: TCMDialogKey );
message CM_DIALOGKEY;
end;

var
Form1: TForm1;

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
if msg.Charcode <> VK_TAB then
inherited;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_TAB then
Form1.Caption := ‘Tab Key Down!’;
end;
В чем отличие между Create(Self) и Create(Application)?

Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса.
Таким образом «Self» в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании
компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или
компонента автоматически уничтожаются и все компоненты владельцем которого она является.
Таким образом если при создании формы передать в качестве владельца Application эта форма будет
автоматически уничтожена при уничтожении Application. Если же при создании формы передать в
качестве владельца другую форму, вновь созданная форма будет автоматически уничтоженна при
уничтожении формы-владельца.
Как во время выполнения определить поддерживает ли обьект заданное свойство?

Свойства компонента TMemo

Font Определяет формат текста (шрифт, его атрибуты, выравнивание), одинаков для всего текста компонента .
Lines Содержащее текст окна в виде списка строк и имеющее тип TStrings.Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Linesв окне Инспектора Объектов.
Text Весь текст, представленный одной строкой типа String,внутри которой используются разделители типа символов возврата каретки и перевода строки.
Count Указывает число строк в тексте, используется только для чтения
Aligment Выравнивание теста внутри Memo. Если равно taLeftJustify, то слева, taRightJustify — справа, taCenter — по центру.
MaxLength Максимальная длина количества вводимых символов, по умолчанию равно 0, то есть не ограничено.
ReadOnly Если установлено true, то запрещает изменение текста пользователем, но возможно выделение и копирование.
ScrollBars Определяет полосу прокрутки, ssNone — отсутствует, ssHorizontal — горизонтальная, ssVertical — вертикальная, ssBoth — присутствует и горизонтальная и вертикальная.
WordWrap Авто перенос текста по словам при достижении границы, если установлено в true.

Доступ к отдельной строке текста вы можете получить с помощью свойства

AnsiString Strings[int Index].

Индексы, как и везде в C++Builder, начинаются с 0.


Так что Memol—>Lines—>Strings[0] — это текст первой строки.

Методы компонента TMemo

Clear Используется для очистки текста в окне.
Add или Append Для занесения новой строки в конец текста окна редактирования. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в файле осуществляется методом SaveToFile.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студента самое главное не сдать экзамен, а вовремя вспомнить про него. 10035 — | 7499 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Faq функция undo в tmemo

Как вставить содержимое файла в текущую позицию курсора в компонете TMemo?

Считайте файл в TMemoryStream, затем ипользуйте метод TMemo SetSelTextBuf() для вставки текста;

var TheMStream : TMemoryStream; Zero : char; begin TheMStream := TMemoryStream.Create; TheMStream.LoadFromFile(‘C:\AUTOEXEC.BAT’); TheMStream.Seek(0, soFromEnd); //Null terminate the buffer! Zero := #0; TheMStream.Write(Zero, 1); TheMStream.Seek(0, soFromBeginning); Memo1.SetSelTextBuf(TheMStream.Memory); TheMStream.Free; end;

Вопрос:

Как в компоненте TMemo перехватить нажатие Ctrl-V и вставить специальный текст не из буфера обмена (clipboard)?

uses ClipBrd; procedure TForm1.Memo1KeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((Key = ord(‘V’)) and (ssCtrl in Shift)) then begin if Clipboard.HasFormat(CF_TEXT) then ClipBoard.Clear; Memo1.SelText := ‘Delphi is RAD!’; key := 0; end; end;

Вопрос:

Как создать эквивалент TEdit но только с выравниваением вводимого текста по центру или по правой стороне?

TEdit не поддерживает выравниваение текста по центру и по правой стороне — лучше использовать компонент TMemo. Вам понадобится запретить пользователю нажимать Enter, Ctrl-Enter и всевозможные комбинации клавиш со стрелками, чтобы избежать появления нескольких сторк в Memo. Этого можно добиться и просматривая содержимое текста в TMemo в поисках кода возврата каретки (13) и перевода строки(10) на событиях TMemo Change и KeyPress. Можно также заменять код возврата каретки на пробел — для того чтобы позволять вставку из буфера обмена многострочного текста в виде одной строки.

procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Alignment := taRightJustify; Memo1.MaxLength := 24; Memo1.WantReturns := false; Memo1.WordWrap := false; end; procedure MultiLineMemoToSingleLine(Memo : TMemo); var t : string; begin t := Memo.Text; if Pos(#13, t) > 0 then begin while Pos(#13, t) > 0 do delete(t, Pos(#13, t), 1); while Pos(#10, t) > 0 do delete(t, Pos(#10, t), 1); Memo.Text := t; end; end; procedure TForm1.Memo1Change(Sender: TObject); begin MultiLineMemoToSingleLine(Memo1); end; procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); begin MultiLineMemoToSingleLine(Memo1); end;

Вопрос:

Как запрограммировать undo?

Memo1.Perform(EM_UNDO, 0, 0);
Если Вы хотите узнать, возможно ли выполнить операцию «Undo», проверьте «Undo status»:

If Memo1.Perform(EM_CANUNDO, 0, 0) <> 0 then begin end;
Для выполнения «Redo» выполните «Undo» еще раз.

Вопрос:

Можно ли создать форму, которая получает дополнительные параметры в методе Сreate?

Просто замените конструктор Create класса Вашей формы.

unit Unit2; interface uses Windows, Messages, SysUtils, ); Unit2.Form2.Show; end;

Вопрос:

Почему при изменении цвета шрифта в StatusBar’s он (шрифт) не меняется?

Status bar (строка состояния) — стандартный элемент управления Windows и цвет его шрифта задается через Control Panel (константа clBtnText). Этот цвет по умолчанию черный и может меняться при выборе пользователем той или иной цветовой схемы. У компонента ТStatusBar и его панелей есть возможность «owner-draw» — программной перерисовки, которая позволяет выводить на панель текст любого цвета. Измените свойство Style компонента TStatusBar.Panels на OwnerDraw.

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin if Panel = StatusBar.Panels[0] then begin StatusBar.Canvas.Font.Color := clRed; StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 0’) end else begin StatusBar.Canvas.Font.Color := clGreen; StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 1’); end; end;

Вопрос:

Как бы мне создать эдакий trackbar в котором вместо широкой белой полоски с ползунком была бы тонкая линия?

В примере создается компонент, унаследованный от TTrackbar который переопределяет метод CreateParams и убират флаг TBS_ENABLESELRANGE из Style. Константа TBS_ENABLESELRANGE обьявленна в модуле CommCtrl.

uses CommCtrl, ComCtrls; type TMyTrackBar = >

Вопрос:

Мне нужен временный canvas, но когда я пытаюсь его создать получаю сообщения об ошибках. Как создать TCanvas?

Создайте Bitmap и используйте свойство canvas класса TBitmap. Пример создает Bitmap, рисует на его canvas’е, выводит этот canvas на форму и освобождает bitmap.

procedure TForm1.Button1Click(Sender: TObject); var bm : TBitmap; begin bm := TBitmap.Create; bm.W >

Вопрос:

В некоторых видео режимах прозрачная часть glyph’а стандартного TBitBtn становится видной. Как этого избежать?


В примере используется техника закраски прозрачной части glyph’а цветом кнопки на которой он находится — таким образом glyph кажется прозрачным.

function InitStdBitBtn(BitBtn : TBitBtn; kind : TBitBtnKind) : bool; var Bm1 : TBitmap; Bm2 : TBitmap; begin Result := false; if Kind = bkCustom then exit; Bm1 := TBitmap.Create; case Kind of bkOK : Bm1.Handle := LoadBitmap(hInstance, ‘BBOK’); bkCancel : Bm1.Handle := LoadBitmap(hInstance, ‘BBCANCEL’); bkHelp : Bm1.Handle := LoadBitmap(hInstance, ‘BBHELP’); bkYes : Bm1.Handle := LoadBitmap(hInstance, ‘BBYES’); bkNo : Bm1.Handle := LoadBitmap(hInstance, ‘BBNO’); bkClose : Bm1.Handle := LoadBitmap(hInstance, ‘BBCLOSE’); bkAbort : Bm1.Handle := LoadBitmap(hInstance, ‘BBABORT’); bkRetry : Bm1.Handle := LoadBitmap(hInstance, ‘BBRETRY’); bkIgnore : Bm1.Handle := LoadBitmap(hInstance, ‘BBIGNORE’); bkAll : Bm1.Handle := LoadBitmap(hInstance, ‘BBALL’); end; Bm2 := TBitmap.Create; Bm2.W >

Вопрос:

Создание PolyPolygon используя массив точек?

Polygon — метод компонента TCanvas получает в качестве параметра динамический массив точек. Функция PolyPolygon() из Windows GDI получает указатель на массив точек.

procedure TForm1.Button1Click(Sender: TObject); var ptArray : array[0..9] of TPOINT; PtCounts : array[0..1] of integer; begin PtArray[0] := Point(0, 0); PtArray[1] := Point(0, 100); PtArray[2] := Point(100, 100); PtArray[3] := Point(100, 0); PtArray[4] := Point(0, 0); PtCounts[0] := 5; PtArray[5] := Point(25, 25); PtArray[6] := Point(25, 75); PtArray[7] := Point(75, 75); PtArray[8] := Point(75, 25); PtArray[9] := Point(25, 25); PtCounts[1] := 5; PolyPolygon(Form1.Canvas.Handle, PtArray,PtCounts,2); end;

Вопрос:

Как создать невизуальный компонент без иконоки, которая изображается в палитре компонентов в «design-time» (вроде TField)?

Невизуальные компоненты без иконоки удобны для субкомпонентов, связанных с какими-то другими компонентами. Создайте компонент как обычно, но используйте RegisterNoIcon вместо RegisterComponent.

Вопрос:

Как показывать нестандартный встроенный редактор (inplace editor) в ячейке stringgrid (например combobox).

Вопрос:

Как узнать есть ли в заданном CD-ROM’е Audio CD?

Можно использовать функцию Windows API GetDriveType() чтобы определить является ли дисковод CD-ROM’мом. И функцию API GetVolumeInformation() чтобы проверить VolumeName на равенство ‘Audio CD’.

function IsAudioCD(Drive : char) : bool; var DrivePath : string; MaximumComponentLength : DWORD; FileSystemFlags : DWORD; VolumeName : string; Begin sult := false; DrivePath := Drive + ‘:\’; if GetDriveType(PChar(DrivePath)) <> DRIVE_CDROM then exit; SetLength(VolumeName, 64); GetVolumeInformation(PChar(DrivePath),PChar(VolumeName), Length(VolumeName),nil,MaximumComponentLength,FileSystemFlags,nil,0); if lStrCmp(PChar(VolumeName),’Audio CD’) = 0 then result := true; end; function PlayAudioCD(Drive : char) : bool; var mp : TMediaPlayer; begin result := false; Application.ProcessMessages; if not IsAudioCD(Drive) then exit; mp := TMediaPlayer.Create(nil); mp.Visible := false; mp.Parent := Application.MainForm; mp.Shareable := true; mp.DeviceType := dtCDAudio; mp.FileName := Drive + ‘:’; mp.Shareable := true; mp.Open; Application.ProcessMessages; mp.Play; Application.ProcessMessages; mp.Close; Application.ProcessMessages; mp.free; result := true; end; procedure TForm1.Button1Click(Sender: TObject); begin if not PlayAudioCD(‘D’) then ShowMessage(‘Not an Audio CD’); end;

Вопрос:

Как узнать есть ли у мыши колесико?

Свойство «WheelPresent» глобального обьекта «mouse».

Вопрос:

События KeyPress и KeyDown не вызываются для клавиши Tab — как определить, что она была нажата?

На уровне формы клавиша tab обычно обрабатывается Windows. В примере создается обработчик события CM_Dialog для перехвата Dialog keys.

type TForm1 = class(TForm) private procedure CMDialogKey( Var msg: TCMDialogKey ); message CM_DIALOGKEY; end; var Form1: TForm1; implementation <$R *.DFM>procedure TForm1.CMDialogKey(var msg: TCMDialogKey); begin if msg.Charcode <> VK_TAB then inherited; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_TAB then Form1.Caption := ‘Tab Key Down!’; end;

Вопрос:

В чем отличие между Create(Self) и Create(Application)?

Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса. Таким образом «Self» в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или компонента автоматически уничтожаются и все компоненты владельцем которого она является. Таким образом если при создании формы передать в качестве владельца Application эта форма будет автоматически уничтожена при уничтожении Application. Если же при создании формы передать в качестве владельца другую форму, вновь созданная форма будет автоматически уничтоженна при уничтожении формы-владельца.

Вопрос:

Как во время выполнения определить поддерживает ли обьект заданное свойство?

Ответ:
function HasProperty(Obj : TObject; Prop : string) : PPropInfo; begin Result := GetPropInfo(Obj. ); if p <> nil then SetOrdProp(Button1, p, clRed) else ShowMessage(‘Button has no color property’); p := HasProperty(Label1, ‘Color’); if p <> nil then SetOrdProp(Label1, p, clRed) else ShowMessage(‘Label has no color property’); p := HasProperty(Label1.Font, ‘Color’); if p <> nil then SetOrdProp(Label1.Font.Color, p, clBlue) else ShowMessage(‘Label.Font has no color property’); end;

Вопрос:

Как при проигрывании музыки с Audio CD показывать сколько прошло минут и секунд?

В примере время выводится по таймеру.

uses MMSystem; procedure TForm1.Timer1Timer(Sender: TObject); var Trk : Word; Min : Word; Sec : Word; begin with MediaPlayer1 do begin Trk := MCI_TMSF_TRACK(Position); Min := MCI_TMSF_MINUTE(Position); Sec := MCI_TMSF_SECOND(Position); Label1.Caption := Format(‘%.2d’,[Trk]); Label2.Caption := Format(‘%.2d:%.2d’,[Min,Sec]); end; end;

Вопрос:

Можно ли рисовать на рамке формы?

Обрабатывайте событие WM_NCPAINT. В примере рамка обводится красной линией толщиной в 1 пиксел.

Вопрос:

Как выполнить какой-то процесс тогда, когда пользователь не работает с моим приложением?

Создайте процедуру, которая будет вызываться при событии Application.OnIdle.
Обьявим процедуру:
procedure IdleEventHandler(Sender: TObject; var Done: Boolean);
В разделе implementation опишем поцедуру:
procedure TForm1. >
В методе Form’ы OnCreate — укажем что наша процедура вызывается на событии Application.OnIdle.
Application.On >
Событие OnIdle возникает один раз — когда приложение переходит в режим «безделья» (idle). Если в обработчике переменной Done присвоить False событие будет вызываться вновь и вновь, до тех пор пока приложение «бездельничает» и переменной Done не присвоенно значение True.

Вопрос:

При перемещении фокуса ввода клавишей Tab чтобы переместить его в RadioGroup нужно нажать клавишу Tab дважды если какой нибудь пункт RadioGroup уже выбран, но только один раз если не выбран. Можно ли сделать поведение RadioGroup логичным?


Установка свойства RadioGroup’ы TabStop в false должна решить эту проблему — поскольку клавиша tab будет продолжать работать — перемещаясь сразу на выделенный пункт RadioGroup.

Вопрос:

Как разместить маленькие картинки в компоненте TPopUpMenu?

В приведенном примере показано как это сделать с использованием функции Windows API SetMenuItemBitmaps(). Эта функция получает handle popup menu, позицию строчки меню куда будет помещена картинка, и два дескриптора(handles) на две картинки (одна из них — картинка которая будет показана когда строка меню доступна, вторая — когда строка меню недоступна).

type TForm1 = ); SetMenuItemBitmaps(PopUpMenu1.Handle,1,MF_BYPOSITION,BmUnChecked.Handle, BmChecked.Handle); end; procedure TForm1.FormDestroy(Sender: TObject); begin bmUnChecked.Free; bmChecked.Free; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var pt : TPoint; begin pt := ClientToScreen(Point(x, y)); PopUpMenu1.Popup(pt.x, pt.y); end;

Вопрос:

Как узнать число кадров AVI файла, и выяснить как долго будет проигрывться этот файл?

В приведенном примере указано как получить эту информацию.

procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.TimeFormat := tfFrames; ShowMessage(‘Number of frames = ‘ + IntToStr(MediaPlayer1.Length)); MediaPlayer1.TimeFormat := tfMilliseconds; ShowMessage(‘Number of milliseconds = ‘ + IntToStr(MediaPlayer1.Length)); end;

Вопрос:

Как изменить число фиксированных колонок в TDbGrid?

procedure TForm1.Button1Click(Sender: TObject); begin TStringGr >

Вопрос:

Некоторые компоненты баз данных (и среди них TDBGrid) никак не меняют визуальных свойств, когда к ним отключен доступ (disabled). Как это изменить програмно?

Ниже приведен пример, меняющий цвет шрифта на clGray, когда доступ к элементу управления (в данном случае TDBGrid) запрещен (disabled).

procedure TForm1.Button1Click(Sender: TObject); begin DbGr >

Вопрос:

Как определить нажаты ли клавиши Shift, Alt, or Ctrl в какой-либо момент времени?

В приведенном примере показано как определить нажата ли клавиша Shift при выборе строчки меню. Пример также содержит функции проверки состояния клавиш Alt, Ctrl.

function CtrlDown : Boolean; var State : TKeyboardState; begin GetKeyboardState(State); Result := ((State[vk_Control] And 128) <> 0); end; function ShiftDown : Boolean; var State : TKeyboardState; begin GetKeyboardState(State); Result := ((State[vk_Shift] and 128) <> 0); end; function AltDown : Boolean; var State : TKeyboardState; begin GetKeyboardState(State); Result := ((State[vk_Menu] and 128) <> 0); end; procedure TForm1.MenuItem12Click(Sender: TObject); begin if ShiftDown then Form1.Caption := ‘Shift’ else Form1.Caption := »; end;

Вопрос:

Как изменить шрифта hint’а?

В примере перехватывается событие Application.OnShowHint и изменяется шрифт Hint’а.

type TForm1 = ; Font.Size:= 18; Font.Style:= [fsBold]; HintInfo.HintColor:= clWhite; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnShowHint := MyShowHint; end;

Вопрос:

Есть ли в Delphi эквивалент функции SendKeys Visual Basic’а?

Ниже приведена процедура, позволяющаю отправлять нажатия в любой элемент управления (window control), способный принимать ввод с клавиатуры. Вы можете использовать эту технику чтобы включать клавиши NumLock, CapsLock и ScrollLock под Windows NT. Та же техника работает и под Windows 95 для CapsLock и ScrollLock но не работает для клавиши NumLock.
Обратите внимание, что приведены четыре поцедуры: SimulateKeyDown() — эмулировать нажатие клавиши (без отпускания) SimulateKeyUp() — эмулировать отпускание клавиши SimulateKeystroke() — эмулировать удар по клавише (нажатие и отпускание) и SendKeys(), позволяющие Вам гибко контролировать посылаемые сообщения клавиатуры.
SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke() получают коды виртуальных клавиш (virtural key) (вроде VK_F1). Процедура SimulateKeystroke() получает дополнительный параметр, полезный при эмуляции нажатия PrintScreen. Когда этот параметр равен нулю весь экран будет скопирован в буфер обмена (clipboard). Если дополнительный параметр равен 1 будет скопированно только активное окно.
Четыре метода «button click» демонстрируют использование: ButtonClick1 — включает capslock ButtonClick2 — перехватывает весь экран в буфер обмена (clipboard). ButtonClick3 — перехватывает активное окно в буфер обмена (clipboard). ButtonClick4 — устанавливает фокус в Edit и отправляет в него строку.

procedure SimulateKeyDown(Key : byte); begin keybd_event(Key, 0, 0, 0); end; procedure SimulateKeyUp(Key : byte); begin keybd_event(Key, 0, KEYEVENTF_KEYUP, 0); end; procedure SimulateKeystroke(Key : byte; extra : DWORD); begin keybd_event(Key,extra,0,0); keybd_event(Key,extra,KEYEVENTF_KEYUP,0); end; procedure SendKeys(s : string); var i : integer; flag : bool; w : word; begin flag := not GetKeyState(VK_CAPITAL) and 1 = 0; if flag then SimulateKeystroke(VK_CAPITAL, 0); for i := 1 to Length(s) do begin w := VkKeyScan(s[i]); if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF)) then begin if HiByte(w) and 1 = 1 then SimulateKeyDown(VK_SHIFT); SimulateKeystroke(LoByte(w), 0); if HiByte(w) and 1 = 1 then SimulateKeyUp(VK_SHIFT); end; end; if flag then SimulateKeystroke(VK_CAPITAL, 0); end; procedure TForm1.Button1Click(Sender: TObject); begin SimulateKeystroke(VK_CAPITAL, 0); end; procedure TForm1.Button2Click(Sender: TObject); begin SimulateKeystroke(VK_SNAPSHOT, 0); end; procedure TForm1.Button3Click(Sender: TObject); begin SimulateKeystroke(VK_SNAPSHOT, 1); end; procedure TForm1.Button4Click(Sender: TObject); begin Application.ProcessMessages; Edit1.SetFocus; SendKeys(‘Delphi Is RAD!’); end;

Вопрос:

Я загружаю TImageList динамически. Как сделать картинки из TImageList прозрачными?

procedure TForm1.Button1Click(Sender: TObject); var bm : TBitmap; il : TImageList; begin bm := TBitmap.Create; bm.LoadFromFile(‘C:\DownLoad\TEST.BMP’); il := TImageList.CreateSize(bm.W >

Вопрос:

Как заставить TMediaPlayer проигрывать одно и тоже бесконечно? AVI например?

В примере AVI файл проигрывается снова и снова — используем событие MediaPlayer’а Notify

procedure TForm1.MediaPlayer1Notify(Sender: TObject); begin with MediaPlayer1 do if NotifyValue = nvSuccessful then begin Notify := True; Play; end; end;

Вопрос:

При выполнении диалога FontDialog со свойством Device равным fdBoth or fdPrinter, появляется ошибка «There are no fonts installed».

Эти установки должны показать шрифты совместимые либо с принтером либо с экраном. В примере диалог Windows ChooseFont вызывается напрямую чтобы показать список шрифтов, совместимых одновременно и с экраном и с принтером.

uses Printers, CommDlg; procedure TForm1.Button1Click(Sender: TObject); var cf : TChooseFont; lf : TLogFont; tf : TFont; begin if PrintDialog1.Execute then begin GetObject(Form1.Canvas.Font.Handle, sizeof(lf),@lf); FillChar(cf, sizeof(cf), #0); cf.lStructSize := sizeof(cf); cf.hWndOwner := Form1.Handle; cf.hdc := Printer.Handle; cf.lpLogFont := @lf; cf.iPointSize := Form1.Canvas.Font.Size * 10; cf.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT or CF_EFFECTS or CF_SCALABLEONLY or CF_WYSIWYG; cf.rgbColors := Form1.Canvas.Font.Color; if ChooseFont(cf) <> false then begin tf := TFont.Create; tf.Handle := CreateFontIndirect(lf); tf.COlor := cf.RgbColors; Form1.Canvas.Font.Assign(tf); tf.Free; Form1.Canvas.TextOut(10, 10, ‘Test’); end; end; end;

Вопрос:


Как сменить дисковод, откуда MediaPlayer проигрывает аудио CD?

Вопрос:

Как убрать кнопку с названием моей программы из Панели Задач(Taskbar)?

Отредактируйте файл-проекта (View -> Project Source) Добавьте модуль Windows в раздел uses. Application.ShowMainForm := False; в строку после «Application.Initialize;». Добавьте ShowWindow(Application.Handle, SW_HIDE); в строку перед «Application.Run;» Ваш файл проекта должен выглядеть приблизительно так:

program Project1; uses Windows, Forms, Unit1 in ‘Unit1.pas’ , Unit2 in ‘Unit2.pas’ ; <$R *.RES>begin Application.Initialize; Application.ShowMainForm := False; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); ShowWindow(Application.Handle, SW_HIDE); Application.Run; end. В разделе «initialization» (в самом низу) каждого unit’а добавьте begin ShowWindow(Application.Handle, SW_HIDE); end.

Вопрос:

Как преобразовать цвета в строку — название цвета VCL?

Модуль graphics.pas содержит функцию ColorToString() которое преобразует допустимое значение TColor в его строковое представление используя либо константу-название цвета (по возможности) либо шестнадцатиричную строку. Обратная функция — StringToColor()

procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(ColorToString(clRed)); Memo1.Lines.Add(IntToStr(StringToColor(‘clRed’))); end;

Вопрос:

При показе максимизированное формы она перекрывает task bar и не выравнивается по верху экрана. В чем тут дело?

Это может произойти когда свойство position формы установленно в poScreenCenter. Установите position = poDefault.

Вопрос:

Как заставить TEdit не ‘пикать’ при нажатии недопустимых клавиш?

Перехватите событие KeyPress и установите key = #0 для недопустимых клавиш.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if ((UpCase(Key) ‘Z’)) then Key := #0; end;

Вопрос:

Как получить число и список всех компонентов, расположенных на TNoteBook?

В примере список выводится на Listbox.

procedure TForm1.Button1Click(Sender: TObject); var n: integer; p: integer; begin ListBox1.Clear; with Notebook1 do begin for n := 0 to ControlCount — 1 do begin with TPage(Controls[n]) do begin ListBox1.Items.Add(‘Notebook Page: ‘ + TPage(Notebook1.Controls[n]).Caption); for p := 0 to ControlCount — 1 do ListBox1.Items.Add(Controls[p].Name); ListBox1.Items.Add(EmptyStr); end; end; end; end;

Вопрос:

Я хочу вставить escape code в строку при использовании функции Format(). Например, я хочу создать строку, содержащую символ табуляции. В «C» я бы написал что-то вроде sprintf(buffer, «%s\t%s», str);. А как это будет на Pascal’e?

Функция Format Pascal’я не использует escape codes. Вместо этого нужно вставить в строку действительное значение символа в кодировке ASCII.

Buffer := Format(‘%s’#9’%s’, [Str1, Str2]); ShowMessage(Format(‘%s’#9’%s’, [‘Column1’, ‘Column2’]));

Вопрос:

Как показать первый кадр AVI-файла?

procedure TForm1.Button1Click(Sender: TObject); begin Application.ProcessMessages; MediaPlayer1.Open; Application.ProcessMessages; MediaPlayer1.Step; Application.ProcessMessages; MediaPlayer1.Previous; end;

Вопрос:

Когда пользователь щелкает по listview, он переходит в режим редактирования. Как перевисти его в редим редактирования по нажатию клавиши (например F2)?

Where is undo function?

I am trying Meshlab, but immediately hit an issue with the apparent lack of an ‘Undo» command after trying a cleanup transformation that had undesired results.

As a (less than ideal) workaround I tried the ‘reload’ function, which simply displayed the object again in its transformed state, even though at no time had I saved the object in that state.

If I restart Meshlab then load the object again, only then does it show in its original state. Not sure if this is a single issue or two issues (one of which being a bug) — but either way, how can I achieve effective ‘Undo’ functionality? that would allow me to try a transformation without having to quit and restart Meshlab after every unsuccessful result?

TMemo — запрет ввода

31.07.2013, 11:33

Как заблокировать поле TMemo для ввода?
Знаю что строчку текста можно было бы ввести в Tlabel, но увы по заданию надо в memo написать текст.

Задача способы ввода одномерных массивов с компонентами: TEdit, TMemo
Здравствуйте. СПасибо за те решения. Помоги и с этой задачей. Вообще не получается. Дан массив из N.

Запрет ввода StringGrid
Доброго времени суток. Не понимаю почему не работает следующая конструкция: procedure.

Запрет ввода в StringGrid
у меня транспортная задача, необходимо запретить ввод цифр в крайнюю нижнюю ячейку. размерность.

запрет ввода в едите
здрасьте! видел много тем за запрет ввода в едите но почему то не работает ни один из способов.

Илон Маск рекомендует:  Currency - Тип Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL