<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Мой DELPHI - Программирование</title>
	<atom:link href="http://www.mydelphi.info/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mydelphi.info</link>
	<description>Всё для программера</description>
	<lastBuildDate>Mon, 09 Jun 2008 16:55:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TObject</title>
		<link>http://www.mydelphi.info/code/190</link>
		<comments>http://www.mydelphi.info/code/190#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:44:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[Caption]]></category>
		<category><![CDATA[ClassInfo]]></category>
		<category><![CDATA[ClassParent]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[InheritsFroin]]></category>
		<category><![CDATA[MyParent]]></category>
		<category><![CDATA[Object]]></category>
		<category><![CDATA[TCIass]]></category>
		<category><![CDATA[TForm]]></category>
		<category><![CDATA[TObject]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=190</guid>
		<description><![CDATA[
TObject
TObject является общим предком всех классов в Delphi, корнем
иерархии Visual Component Library. Tobject представляет собой абстрактный
класс, реализующий только наиболее общие механизмы, универсально разделяемые
всеми объектами VCL.
TObject автоматически используется как порождающий тип при создании
нового класса Delphi. Следовательно, следующие фрагменты кода имеют одно
и то же значение:
        type
     [...]]]></description>
			<content:encoded><![CDATA[<p><!-- Start text --></p>
<p style="text-align: center;"><strong><span style="font-size: medium;">TObject</span></strong></p>
<p><strong>TObject</strong> является общим предком всех классов в Delphi, корнем<br />
иерархии Visual Component Library. Tobject представляет собой абстрактный<br />
класс, реализующий только наиболее общие механизмы, универсально разделяемые<br />
всеми объектами VCL.</p>
<p><strong>TObject</strong> автоматически используется как порождающий тип при создании<br />
нового класса Delphi. Следовательно, следующие фрагменты кода имеют одно<br />
и то же значение:</p>
<pre>        type
          TNewObject = class
        end;

        type
          TNewObject = class (TObject)
        end;</pre>
<p><strong>Object</strong> объявляет конструктор и деструктор (специальные методы, которые<br />
создают и разрушают объекты)и реализует информацию о типе и методах обработки<br />
сообщений. Поскольку <strong>TObject</strong> является абстрактным классом, большинство<br />
его методов перекрывается в его потомках в рамках VCL. Обычно у вас будет<br />
доступ к порожденной реализации <strong>Create</strong>, конструктору и <strong>Free</strong>,<br />
безопасно вызывающему деструктор <strong>Destroy</strong>.</p>
<p>Таблица 1 отображает методы общецелевого назначения, реализуемые <strong>TObject</strong>.<br />
В общем случае из этих методов разработчикам приложений интересны только<br />
три: <strong>Create</strong>, <strong>Destroy</strong> и <strong>Free</strong>.<br />
<span id="more-190"></span></p>
<p><strong>Таблица 1 Методы, реализуемые Tobject</strong></p>
<table style="height: 208px;" border="1" width="516">
<tbody>
<tr>
<td width="30%" valign="top"><strong>Использовать или установить это&#8230;</strong></td>
<td width="70%" valign="top"><strong>Чтобы сделать это&#8230;</strong></td>
</tr>
<tr>
<td width="30%">ClassName</td>
<td width="70%">Получить имя класса объекта.</td>
</tr>
<tr>
<td width="30%">ClassParent</td>
<td width="70%">Получить родительский класс объекта.</td>
</tr>
<tr>
<td width="30%">ClassType</td>
<td width="70%">Получить действительный тип объекта.</td>
</tr>
<tr>
<td width="30%">Create</td>
<td width="70%">Сконструировать новый объект.</td>
</tr>
<tr>
<td width="30%">DefaultHandler</td>
<td width="70%">Данная виртуальная функция не имеет реализации &#8211; на уровне<br />
T0bject она ничего не делает.</td>
</tr>
<tr>
<td width="30%">Destroy</td>
<td width="70%">Разрушить объект</td>
</tr>
<tr>
<td width="30%">Free</td>
<td width="70%">Разрушить объект, сконструированный Create.</td>
</tr>
<tr>
<td width="30%">InheritsFroin</td>
<td width="70%">Определить, порожден ли объект от определенного класса.</td>
</tr>
<tr>
<td width="30%">InstanceSize</td>
<td width="70%">Определить количество памяти, отведенное объекту.</td>
</tr>
</tbody>
</table>
<p>Метод ClassName</p>
<table style="height: 296px;" border="0" width="514">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>ClassName</strong> возвращает имя объекта или класса.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>class function ClassName: string;</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>
<pre>// Создать (Create) форму с простой командной кнопкой.
// Когда кнопка нажимается, заголовок Form1 изменяется
// на "TButton"
procedure TForm1.Button1Click(Sender: TObject);
  begin
    Form1.Caption := Button1.ClassName;
  end;</pre>
</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>ClassName</strong> возвращает строку, содержащую название реального типа<br />
текущего объекта. В приведенном примере <strong>Button1</strong> имеет тип <strong>TButton</strong><br />
и таково название, возвращаемое <strong>ClassName</strong>. Если вы порождаете новый<br />
тип от другого типа и затем используете <strong>ClassName</strong>, функция вернет<br />
название нового типа. Необходимость в знании названия класса объекта возникает<br />
редко. Для определения типа объекта (в отличие от названия его типа) используйте<br />
оператор <strong>is</strong>.</td>
</tr>
</tbody>
</table>
<p>Метод ClassParent</p>
<table style="height: 590px;" border="0" width="511">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>ClassParent</strong> возвращает родительский класс объекта или<br />
класса.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>class function ClassParent: TClass;</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>
<pre>procedure TForm1.Button1Click(Sender: TObject);
var
 // Создать переменную типа TCIass
  MyParent: TClass;
begin
 // Сначала присвоить тип класса Buttoni
 // переменной MyParent
  MyParent := Button1.ClassType;
 // Затем использовать ClassParent для определения
 // родительского класса MyParent
  MyParent := MyParent.ClassParent;
 // Наконец, вывести строку с ClassName
  Form1.Caption := MyParent.ClassName;
end;</pre>
</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>ClassParent</strong> возвращает непосредственный предок текущего класса.<br />
Возвращаемый тип <strong>ClassParent</strong> является <strong>TCIass</strong>, который представляет<br />
собой прямого потомка <strong>TObject</strong> и в основном является тем же, что<br />
и <strong>TObject</strong>, поскольку не добавляет никакой функциональности к базовому<br />
классу. Обычно <strong>ClassParent</strong> используется для определения того, можно<br />
ли текущий объект законно присвоить другому объекту. <strong>TObject.ClassParent</strong><br />
возвратит <strong>Nil</strong> ввиду того, что поскольку <strong>TObject</strong> не имеет<br />
родительского класса. Программисту приложений или компонентов редко приходится<br />
вызывать <strong>ClassParent</strong>, хотя внутренне <strong>ClassParent</strong> и используется<br />
операторами <strong>is</strong> и <strong>as</strong>, и методом <strong>InheritsFrom</strong> (описанным<br />
ниже).</td>
</tr>
</tbody>
</table>
<p>Метод ClassType</p>
<table style="height: 314px;" border="0" width="507">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>ClassType</strong> возвращает тип класса объекта.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>function ClassType: TCIass;</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>
<pre>// Когда нажимается кнопка, заголовок
// TForm1 изменяется на "TButton"
procedure TForm1.Button1.Click(Sender: TObject);
begin
  Form1.Caption := Button1.ClassType.ClassName;
end;</pre>
</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>ClassType</strong> возвращает действительный тип объекта, а не просто<br />
его имя, как это делает <strong>ClassName</strong>. В отличие от <strong>ClassInfo</strong>,<br />
<strong>ClassName</strong><br />
и <strong>ClassParent</strong>, <strong>ClassType</strong> оперирует объектами (экземплярами<br />
класса), а не классами (типами объектов). <strong>ClassType</strong> возвращает информацию,<br />
подобную возвращаемой оператором <strong>is</strong>. Фактически операторы <strong>is</strong><br />
и <strong>as</strong> сами вызывают <strong>ClassType</strong>.</td>
</tr>
</tbody>
</table>
<p>Метод Create</p>
<table style="height: 442px;" border="0" width="505">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>Create</strong> является конструктором в Object Pascal.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>constructor Create;</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>
<pre>// При создании формы динамически соадаег новый
// объект и печатает в заголовке
// формы тип класса нового объекта, TObject.
procedure TFonnI.FonnCreate (Sender: TObject);
var
  MyObject: TObject;
begin
  MyObject := TObject.Create;
  Form1.Caption := MyObject.ClassType.ClassName;
end;</pre>
</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>Create</strong> применяется для конструирования объекта посредством распределения<br />
для него памяти и инициализации всех данных объекта <strong>Create</strong> распределяет<br />
и инициализирует память, необходимую конструируемому объекту.</p>
<p>Каждый класс в VCL перекрывает или повторно реализует <strong>Create</strong><br />
тем или иным образом. Объекты, экземпляры которых получены <strong>Create</strong>,<br />
должны разрушаться посредством <strong>Free</strong>.</td>
</tr>
</tbody>
</table>
<p>Метод Destroy</p>
<table style="height: 112px;" border="0" width="508">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>Destroy</strong> используется для разрушения объекта,</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>destructor Destroy;</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td>Destroy является деструктором Delphi. Он используется для разрушения<br />
объекта и освобождения памяти, которая была распределена объекту. Destroy<br />
вызывается методом Free, представляющим собой функцию, которую следует<br />
вызывать для разрушения объектов, сконструированных Create</td>
</tr>
</tbody>
</table>
<p>Метод Free</p>
<table style="height: 186px;" border="0" width="508">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>Free</strong> используется для разрушения объекта.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>procedure Free;</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>// разрушить объект Anobject</p>
<p>Anobject. Free;</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td>Если вы создали объект, то для разрушения объекта и освобождения распределенной<br />
памяти следует использовать <strong>Free</strong>. <strong>Free</strong> гарантирует успешную<br />
работу даже тогда, когда объект является <strong>NIL</strong>, поэтому <strong>Free</strong><br />
следует всегда применять вместо <strong>Destroy</strong>. На самом деле <strong>Free</strong><br />
вызывает <strong>Destroy</strong>, если разрушаемый объект отличный от <strong>NIL</strong>.</td>
</tr>
</tbody>
</table>
<p>Метод InheritsFrom</p>
<table style="height: 402px;" border="0" width="524">
<tbody>
<tr valign="top">
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr>
<td><strong>Назначение</strong></td>
<td>Метод <strong>InheritsFrom</strong> определяет, порожден ли объект от объекта<br />
другого типа.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>class function lnheritsFrom(ACIass: TCIass): Boolean;</td>
</tr>
<tr>
<td><strong>Параметры</strong></td>
<td></td>
</tr>
<tr>
<td><strong><em>AClass</em></strong></td>
<td>Параметр может быть любым классовым типом.</td>
</tr>
<tr valign="top">
<td><strong>Пример синтаксиса</strong></td>
<td>
<pre>// Поскольку TButton является потомком TWinControl,
// данный обработчик события изменит заголовок
// формы
procedure TFonnl.ButtonlClick(Sender: TObject);
  begin
    if (Sender. lnheritsFrom(TWinControl)) then
    Form1.Caption:='TButton descends from TWinControl';
  end;</pre>
</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>InheritsFrom</strong> возвращает <strong>True</strong>, если тип объекта, указанный<br />
параметром <strong><em>AClass</em></strong>,</p>
<p>является предком объекта. Если объект не происходит от типа, указанного<br />
<strong><em>AClass</em></strong>,</p>
<p>метод возвращает <strong>False</strong>.</p>
<p>Операторы <strong>is</strong> и <strong>as</strong> внутренне используют <strong>InheritsFrom</strong></td>
</tr>
</tbody>
</table>
<p>Метод InstanceSize</p>
<table style="height: 190px;" border="0" width="523">
<tbody>
<tr>
<td><strong>Затрагиваемые объекты</strong></td>
<td>Все объекты.</td>
</tr>
<tr valign="top">
<td><strong>Назначение</strong></td>
<td>Метод <strong>InstanceSize</strong> возвращает количество памяти, распределенное<br />
каждому экземпляру объекта заданного типа.</td>
</tr>
<tr>
<td><strong>Объявление</strong></td>
<td>class function InstanceSize: Word;</td>
</tr>
<tr valign="top">
<td><strong>Описание</strong></td>
<td><strong>InstanceSize</strong> возвращает количество байт, требуемое для размещения<br />
каждого экземпляра объекта, который вызывает метод <strong>InstanceSize</strong>.<br />
Это внутренняя функция и обычно разработчиками не применяется. Вместо нее<br />
используйте функцию <strong>sizeof</strong>;</p>
<p>ButtonSize := sizeof (Buttoni);</p>
<p><strong>InstanceSize</strong> не является виртуальной, поэтому ее нельзя перекрыть.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/190/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как зарегистрировать расширение файла за своим приложением и контекстное меню</title>
		<link>http://www.mydelphi.info/code/189</link>
		<comments>http://www.mydelphi.info/code/189#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:39:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[Click]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[DefaultIcon]]></category>
		<category><![CDATA[description]]></category>
		<category><![CDATA[LotsOfParamaters]]></category>
		<category><![CDATA[MyApp]]></category>
		<category><![CDATA[myext]]></category>
		<category><![CDATA[Sender]]></category>
		<category><![CDATA[TForm]]></category>
		<category><![CDATA[TObject]]></category>
		<category><![CDATA[TonsOfParameters]]></category>
		<category><![CDATA[TRegIniFile]]></category>
		<category><![CDATA[WriteString]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=189</guid>
		<description><![CDATA[Вопрос:
Как зарегистрировать расширение файла за своим приложением и контекстное меню,
связанное с этим типом?
Ответ:
Пример регистрирует расширение файла(.myext) - файлы этого типа будут открываться
приложением MyApp.Exe. Также регнстрируется одно действие (action) по умолчанию
для файлов этого типа и два дополнительных пункта контекстного меню, связанного с
этим типом файлов. Возможно, потребуется перезайти в систему чтобы изменения

вступили в силу.

Пример:

uses
	Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
	R : [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Как зарегистрировать расширение файла за своим приложением и контекстное меню,
связанное с этим типом?
<span style="color: darkblue;">Ответ:</span>
Пример регистрирует расширение файла(.myext) - файлы этого типа будут открываться
приложением MyApp.Exe. Также регнстрируется одно действие (action) по умолчанию
для файлов этого типа и два дополнительных пункта контекстного меню, связанного с
этим типом файлов. Возможно, потребуется перезайти в систему чтобы изменения

вступили в силу.<span id="more-189"></span>

<span style="color: darkblue;">Пример:</span>

uses
	Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
	R : TRegIniFile;
begin
	R := TRegIniFile.Create('');
	with R do
		begin
			RootKey := HKEY_CLASSES_ROOT;
			WriteString('.myext','','MyExt');
			WriteString('MyExt','','Some description of MyExt files');
			WriteString('MyExt\DefaultIcon','','C:\MyApp.Exe,0');
			WriteString('MyExt\Shell','','This_Is_Our_Default_Action');
			WriteString('MyExt\Shell\First_Action',
						'','This is our first action');
			WriteString('MyExt\Shell\First_Action\command','',
						'C:\MyApp.Exe /LotsOfParamaters %1');
			WriteString('MyExt\Shell\This_Is_Our_Default_Action','',
						'This is our default action');
			WriteString('MyExt\Shell\This_Is_Our_Default_Action\command',
						'','C:\MyApp.Exe %1');
			WriteString('MyExt\Shell\Second_Action',
						'','This is our second action');
			WriteString('MyExt\Shell\Second_Action\command',
						'','C:\MyApp.Exe /TonsOfParameters %1');
			Free;
		end;
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/189/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Некоторые компоненты не меняют курсор мыши</title>
		<link>http://www.mydelphi.info/code/188</link>
		<comments>http://www.mydelphi.info/code/188#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:38:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[CrHourglass]]></category>
		<category><![CDATA[Cursor]]></category>
		<category><![CDATA[GetCursorPos]]></category>
		<category><![CDATA[ProcessMessages]]></category>
		<category><![CDATA[Screen]]></category>
		<category><![CDATA[SetCursorPos]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=188</guid>
		<description><![CDATA[Вопрос:
Некоторые компоненты не меняют курсор мыши до тех пор пока пользователь не
сдвинет мышь. Как эмулировать движение мыши?
Ответ:
В примере мышка слегка "подталкивается" без участия пользователя.

procedure TForm1.Button1Click(Sender: TObject);
var
	pt : TPoint;
begin
	Application.ProcessMessages;
	Screen.Cursor := CrHourglass;
	GetCursorPos(pt);
	SetCursorPos(pt.x + 1, pt.y + 1);
	Application.ProcessMessages;
	SetCursorPos(pt.x - 1, pt.y - 1);
end;

]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Некоторые компоненты не меняют курсор мыши до тех пор пока пользователь не
сдвинет мышь. Как эмулировать движение мыши?
<span style="color: darkblue;">Ответ:</span>
В примере мышка слегка "подталкивается" без участия пользователя.

procedure TForm1.Button1Click(Sender: TObject);<span id="more-188"></span>
var
	pt : TPoint;
begin
	Application.ProcessMessages;
	Screen.Cursor := CrHourglass;
	GetCursorPos(pt);
	SetCursorPos(pt.x + 1, pt.y + 1);
	Application.ProcessMessages;
	SetCursorPos(pt.x - 1, pt.y - 1);
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/188/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функция keybd_event() принимает значения до 244</title>
		<link>http://www.mydelphi.info/code/187</link>
		<comments>http://www.mydelphi.info/code/187#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:38:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[FillChar]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[KEYUP]]></category>
		<category><![CDATA[ProcessMessages]]></category>
		<category><![CDATA[RIGHT]]></category>
		<category><![CDATA[ScanCode]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=187</guid>
		<description><![CDATA[Вопрос:
Функция keybd_event() принимает значения до 244 - как мне отправить нажатие
клавиши с кодом #255 в элемент управления Windows?
Ответ:
Это может понадобится для иностранных языков или для специальных символов. (например,
в русских шрифтах символ с кодом #255 - я прописное). Приведенный в примере метод,
не стоит использовать в случае если символ может быть передан обычным способом
(функцией keybd_event()).

procedure TForm1.Button1Click(Sender: TObject);
var
	KeyData [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Функция keybd_event() принимает значения до 244 - как мне отправить нажатие
клавиши с кодом #255 в элемент управления Windows?
<span style="color: darkblue;">Ответ:</span>
Это может понадобится для иностранных языков или для специальных символов. (например,
в русских шрифтах символ с кодом #255 - я прописное). Приведенный в примере метод,
не стоит использовать в случае если символ может быть передан обычным способом
(функцией keybd_event()).<span id="more-187"></span>

procedure TForm1.Button1Click(Sender: TObject);
var
	KeyData : packed record
		RepeatCount : word;
		ScanCode : byte;
		Bits : byte;
	end;
begin
	{Let the button repaint}
	Application.ProcessMessages;
	{Set the focus to the window}
	Edit1.SetFocus;
	{Send a right so the char is added to the end of the line}
	//  SimulateKeyStroke(VK_RIGHT, 0);
	keybd_event(VK_RIGHT, 0,0,0);
	{Let the app get the message}
	Application.ProcessMessages;
	FillChar(KeyData, sizeof(KeyData), #0);
	KeyData.ScanCode := 255;
	KeyData.RepeatCount := 1;
	SendMessage(Edit1.Handle, WM_KEYDOWN, 255,LongInt(KeyData));
	KeyData.Bits := KeyData.Bits or (1 shl 30);
	KeyData.Bits := KeyData.Bits or (1 shl 31);
	SendMessage(Edit1.Handle, WM_KEYUP, 255, LongInt(KeyData));
	KeyData.Bits := KeyData.Bits and not (1 shl 30);
	KeyData.Bits := KeyData.Bits and not (1 shl 31);
	SendMessage(Edit1.Handle, WM_CHAR, 255, LongInt(KeyData));
	Application.ProcessMessages;
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/187/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?</title>
		<link>http://www.mydelphi.info/code/186</link>
		<comments>http://www.mydelphi.info/code/186#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:37:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[DestroyHandle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[PROTECTED]]></category>
		<category><![CDATA[TMyTabbedNotebook]]></category>
		<category><![CDATA[TNotebook]]></category>
		<category><![CDATA[TTabbedNotebook]]></category>
		<category><![CDATA[TWinControl]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=186</guid>
		<description><![CDATA[Вопрос:
Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?
Ответ:
Да. Можно уничтожать обьекты, расположенные не на текущей странице TNotebook или
TTabbedNotebook. В примере вызывается защищенный (Protected) метод путем создания
так называемый "class cracer'ов".

type TMyTabbedNotebook = class(TTabbedNotebook); //это наш "class cracer"
type TMyNotebook = class(TNotebook);

procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer;
			var AllowChange: Boolean);
begin
	with TabbedNotebook1 do  //вызываем защищенный метод родительского класса
		TMyTabbedNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;
end;

procedure TForm1.TabSet1Change(Sender: [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?
<span style="color: darkblue;">Ответ:</span>
Да. Можно уничтожать обьекты, расположенные не на текущей странице TNotebook или
TTabbedNotebook. В примере вызывается защищенный (Protected) метод путем создания
так называемый "class cracer'ов".<span id="more-186"></span>

type TMyTabbedNotebook = class(TTabbedNotebook); //это наш "class cracer"
type TMyNotebook = class(TNotebook);

procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer;
			var AllowChange: Boolean);
begin
	with TabbedNotebook1 do  //вызываем защищенный метод родительского класса
		TMyTabbedNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;
end;

procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer;
			var AllowChange: Boolean);
begin
	with Notebook1 do //вызываем защищенный метод родительского класса
		TMyNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;
		NoteBook1.PageIndex := NewTab;
		AllowChange := true
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/186/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как запретить изменение размера моего компонента в design-time?</title>
		<link>http://www.mydelphi.info/code/185</link>
		<comments>http://www.mydelphi.info/code/185#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:36:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[ALeft]]></category>
		<category><![CDATA[ATop]]></category>
		<category><![CDATA[AWidth]]></category>
		<category><![CDATA[componentstate]]></category>
		<category><![CDATA[Integer]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[SetBounds]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=185</guid>
		<description><![CDATA[Вопрос:
Как запретить изменение размера моего компонента в design-time?
Ответ:
Поместите в конструктор компонента код, устанавливающий размеры по умолчанию.
Переопределите метод SetBounds и проверяйте в нем "componentstate". Если компонет
находится режиме "design-time" (csDesigning in ComponentState) просто передавайте
значения ширины и высоты (width и heights) компонента по умолчанию (в нашем
примере 50) методу класса-предка

Пример:

procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer;
			AHeight [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Как запретить изменение размера моего компонента в design-time?
<span style="color: darkblue;">Ответ:</span>
Поместите в конструктор компонента код, устанавливающий размеры по умолчанию.
Переопределите метод SetBounds и проверяйте в нем "componentstate". Если компонет
находится режиме "design-time" (csDesigning in ComponentState) просто передавайте
значения ширины и высоты (width и heights) компонента по умолчанию (в нашем
примере 50) методу класса-предка<span id="more-185"></span>

<span style="color: darkblue;">Пример:</span>

procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer;
			AHeight : integer);
begin
	if csdesigning in componentstate then
	begin
		AWidth := 50;
		AHeight := 50;
		inherited;  //вызываем унаследованный от предка метод
	end;
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/185/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Можно ли как-то уменьшить мерцание при перерисовке компонента?</title>
		<link>http://www.mydelphi.info/code/184</link>
		<comments>http://www.mydelphi.info/code/184#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:35:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[ControlStyle]]></category>
		<category><![CDATA[csOpaque]]></category>
		<category><![CDATA[TMyControl]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=184</guid>
		<description><![CDATA[Вопрос:
Можно ли как-то уменьшить мерцание при перерисовке компонента?
Ответ:
Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента
- то фон компонента перерисовываться не будет.

Пример:

constructor TMyControl.Create;
begin
	inherited;
	ControlStyle := ControlStyle + [csOpaque];
end;

]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Можно ли как-то уменьшить мерцание при перерисовке компонента?
<span style="color: darkblue;">Ответ:</span>
Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента
- то фон компонента перерисовываться не будет.

<span style="color: darkblue;">Пример:</span>

constructor TMyControl.Create;
begin
	inherited;
	ControlStyle := ControlStyle + [csOpaque];
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/184/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как сделать клавишу-акселератор (keyboard shortcut)</title>
		<link>http://www.mydelphi.info/code/183</link>
		<comments>http://www.mydelphi.info/code/183#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:34:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[begin]]></category>
		<category><![CDATA[FocusControl]]></category>
		<category><![CDATA[FormCreate]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[shortcut]]></category>
		<category><![CDATA[TForm]]></category>
		<category><![CDATA[TMemo]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=183</guid>
		<description><![CDATA[Вопрос:
Как сделать клавишу-акселератор (keyboard shortcut) компонету у которого нет заголовка?

Ответ:
Возможный вариант &#8211; присвоить
ссылку на этот компонент свойству FocusControl TLabel&#8217;а. В примере используется
невидимый Label для создания &#8220;быстрой&#8221; клавиши (Alt+M) компонента Memo. Чтобы
использовать пример, разместите на форме компонет TMemo, Label и несколько других
компонентов, которые могут принимать фокус ввода. Запустите программу, перевидите
фокус ввода куда-нибудь вне Memo и нажмите [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Как сделать клавишу-акселератор (keyboard shortcut) компонету у которого нет заголовка?

<span style="color: darkblue;">Ответ:</span></pre>
<p>Возможный вариант &#8211; присвоить<br />
ссылку на этот компонент свойству FocusControl TLabel&#8217;а. В примере используется<br />
невидимый Label для создания &#8220;быстрой&#8221; клавиши (Alt+M) компонента Memo. Чтобы<br />
использовать пример, разместите на форме компонет TMemo, Label и несколько других<br />
компонентов, которые могут принимать фокус ввода. Запустите программу, перевидите<br />
фокус ввода куда-нибудь вне Memo и нажмите Alt+M &#8211; фокус ввода вернется в Memo.<span id="more-183"></span></p>
<pre><span style="color: darkblue;">Пример:</span>
procedure TForm1.FormCreate(Sender: TObject);
begin
	Label1.Visible := false;
	Label1.Caption := '&amp;M';
	Label1.FocusControl := Memo1;
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/183/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как программно заставить выпасть меню?</title>
		<link>http://www.mydelphi.info/code/182</link>
		<comments>http://www.mydelphi.info/code/182#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:34:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[Alt]]></category>
		<category><![CDATA[DOWN]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[KEYUP]]></category>
		<category><![CDATA[painting]]></category>
		<category><![CDATA[ProcessMessages]]></category>
		<category><![CDATA[Sender]]></category>
		<category><![CDATA[TForm]]></category>
		<category><![CDATA[TObject]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=182</guid>
		<description><![CDATA[Вопрос:
Как программно заставить выпасть меню?

Ответ:
В примере показано как
показать меню и выбрать в нем какой-то пункт, эмулируя нажатие &#8220;быстрой кдавиши&#8221;
пункта меню. Если у Вашего пункта меню нет &#8220;быстрой клавиши&#8221; Вы можете посылать
комбинации VK_MENU, VK_LEFT, VK_DOWN, и VK_RETURN, чтобы программно &#8220;путешествовать&#8221;
по меню.
Пример:
procedure TForm1.Button1Click(Sender: TObject);
begin
	//Allow button to finish painting in response to the click
	Application.ProcessMessages;
	{Alt Key Down}
	keybd_Event(VK_MENU, 0, 0, [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Как программно заставить выпасть меню?

<span style="color: darkblue;">Ответ:</span></pre>
<p>В примере показано как<br />
показать меню и выбрать в нем какой-то пункт, эмулируя нажатие &#8220;быстрой кдавиши&#8221;<br />
пункта меню. Если у Вашего пункта меню нет &#8220;быстрой клавиши&#8221; Вы можете посылать<br />
комбинации VK_MENU, VK_LEFT, VK_DOWN, и VK_RETURN, чтобы программно &#8220;путешествовать&#8221;<br />
по меню.<span id="more-182"></span></p>
<pre><span style="color: darkblue;">Пример:</span>
procedure TForm1.Button1Click(Sender: TObject);
begin
	//Allow button to finish painting in response to the click
	Application.ProcessMessages;
	{Alt Key Down}
	keybd_Event(VK_MENU, 0, 0, 0);
	{F Key Down - Drops the menu down}
	keybd_Event(ord('F'), 0, 0, 0);
	{F Key Up}
	keybd_Event(ord('F'), 0, KEYEVENTF_KEYUP, 0);
	{Alt Key Up}
	keybd_Event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
	{F Key Down}
	keybd_Event(ord('S'), 0, 0, 0);
	{F Key Up}
	keybd_Event(ord('S'), 0, KEYEVENTF_KEYUP, 0);
end;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/182/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как обновить список дисков компонента TDriveComboBox</title>
		<link>http://www.mydelphi.info/code/181</link>
		<comments>http://www.mydelphi.info/code/181#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:33:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi FAQ]]></category>
		<category><![CDATA[BuildList]]></category>
		<category><![CDATA[char]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[Sender]]></category>
		<category><![CDATA[TDriveComboBox]]></category>
		<category><![CDATA[TForm]]></category>
		<category><![CDATA[TNewDriveComboBox]]></category>
		<category><![CDATA[var]]></category>

		<guid isPermaLink="false">http://www.mydelphi.info/?p=181</guid>
		<description><![CDATA[Вопрос:
Как обновить список дисков компонента TDriveComboBox, учитывая, что могуд быть
подключены/отключены сетевые диски и произведена "горячая замена" plug&#38;play дисков?
Ответ:
Следующий пример вызывает защищенный (protected) метод класса TDriveComboBox
BuildList() для регеирации списка дисков. (использовая так наз. "class cracer")

Пример:

type
	TNewDriveComboBox = class(TDriveComboBox)  //это наш "class cracer"
end;

procedure TForm1.Button1Click(Sender: TObject);
var
	Drive : char;
begin
	Drive := DriveComboBox1.Drive;
	TNewDriveComboBox(DriveComboBox1).BuildList;
			//вызываем защищенный метод родительского класса
	DriveComboBox1.Drive := Drive;
end;

]]></description>
			<content:encoded><![CDATA[<pre><span style="color: darkblue;">Вопрос:</span>
Как обновить список дисков компонента TDriveComboBox, учитывая, что могуд быть
подключены/отключены сетевые диски и произведена "горячая замена" plug&amp;play дисков?
<span style="color: darkblue;">Ответ:</span>
Следующий пример вызывает защищенный (protected) метод класса TDriveComboBox
BuildList() для регеирации списка дисков. (использовая так наз. "class cracer")<span id="more-181"></span>

<span style="color: darkblue;">Пример:</span>

type
	TNewDriveComboBox = class(TDriveComboBox)  //это наш "class cracer"
end;

procedure TForm1.Button1Click(Sender: TObject);
var
	Drive : char;
begin
	Drive := DriveComboBox1.Drive;
	TNewDriveComboBox(DriveComboBox1).BuildList;
			//вызываем защищенный метод родительского класса
	DriveComboBox1.Drive := Drive;
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mydelphi.info/code/181/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
