Delphi VCL FAQ, Delphi, Програмування, статті

Добірку, переклад та адаптацію матеріалу підготував Aziz(JINX)
спеціально для Королівства Дельфі

Прозора напис на TBitmap.
Доступ до колонки-рядку grid'а по заголовку.
Використання клавіші-акселератора в TTabsheets.
Доступ до HKEY_LOCAL_MACHINE під NT без прав адміністратора.
Зміна числа колонок і їх ширини в TFileListBox.
Налаштування табуляції в компоненті TMemo.
Перехоплення натискання функціональних клавіш і стрілок.
Мерехтіння на DrawCell.
Bitmap і текст на TBitBtn.
Зміна виду текстового курсора.
Помилка компіляції при виклику методу abort.
Колір букв у стандартних елементах управління Windows.
Напис на компоненті TBitBtn з переносом слів.
Зміна стилів шрифту RichEdit натисканнями комбінацій клавіш.
Зміна кореневого ключа (root key) реєстру.
Динамічне зміни властивості owner компонента в 'runtime'.
Очищення вмісту Canvas'а.
Динамічне оновлено головної форми програми в 'runtime'.
Програмний 'Click' по 'speed button'.
Доступ до елементів компонента TRadioGroup.
Чому функції малювання Delphi малюють на один піксел коротше.
Як показати підказки (hints) для елементів меню.
Як з'ясувати стан списку Combobox.
Як видалити каталог разом з вмістом.
Програмне відключення системного меню форми.
Виділення RGB компонентів кольору.
Номер поточного рядка в TMemo.
Як програвати MPEG файл.
Використання анімованого курсора.
Як дізнатися про натискання клавіші в момент коли показано меню.
Як визначити наявність співпроцесора.
Серійний номер аудіо CD.
Амперсанд в Windows.
Як помістити bitmap в Metafile.
Як дізнатися, що курсор миші над моєю формою.
Запущено чи додаток під Windows NT.
Як створити bitmap з піктогрмми (icon).
Отедельний hint для кожного осередку StringGrid'а.
Як внести зміни в код VCL.
Еквівалент TwipsPerPixel з VB.
Вміст файлу в поточну позицію курсору в TMemo.
Перехоплення натискання Ctrl-V в TMemo.
TEdit з виравніваеніем тексту по правій стороні.
Undo в Edit.
Перевизначення конструктора форми.
Кольоровий текст в TStatusBar.
Переробляємо TTrackBar.
Створення тимчасового canvas'а.
Проблема з прозраним glyph'ом.
Створення PolyPolygon використовуючи масив точок.
Створення невізуальних компонентів без ікон.
Нестандартний редактор (наприклад combobox) в осередку StringGrid.
Чи є в CD-ROM Audio CD.
Чи є у миші коліщатко.
Визначення натискання клавіші tab.
Відмінність між Create (Self) і Create (Application).
Визначення чи підтримує обьект заданий властивість.
Показуємо секунди і хвилини Audio CD.
Малюємо на рамці.
Працюємо коли додаток ледарює.
Radiogroup і фокус вводу.
Картинки в TPopUpMenu.
Як дізнатися число кадрів AVI файлу.
Фіксовані колонки в TDbGrid.
Показ dbgrid в режимі disabled.
Як дізнатися натиснуті чи клавіші Shift, Ctrl, Alt.
Як змінити шрифт підказки (hint'а).
Еквівалент функції SendKeys Visual Basic'а.
Динамічне малювання прозорих картинок TImageList.
Нескінченна музика з TMediaPlayer.
Помилка 'There are no fonts installed'.
Зміна дисковода, звідки MediaPlayer програє аудіо CD.
Як прибрати кнопку з назвою моєї програми з Панелі Задач.
Перетворення кольору в рядок - назва кольору VCL.
Вирівнювання максимізована форми.
Як змусити TEdit не 'піку'.
Отримання списку всіх компонентів, розташованих на TNoteBook.
Еквівалент escape codes з С.
Як показати перший кадр AVI-файла.
Переключити TListView в режим редагування натисканням клавіш.
Знищення об'єкта, збереженого у списку TStrings.
Using Resident Font.
Шлях до каталогу звідки була встановлена ​​Windows.
Рядок повідомлення про помилку Windows.
Ще більш сувора перевірка типів.
VK_Key для A-Z і 0-9.
Зміна віконної процедури TForm.
Розміри TComboBox з показаним випадним списком.
Меню в стилі Delphi 4.
Режим вставка-заміна в TMemo і TEdit.
Повідомлення відразу всіх елементів керування форми.
Властивість selected ListBox'а.
Обмеження довжини тексту, що вводиться в TEdit.
Збереження об'єкта TFont в реєстрі.
Переміщати компонент мишкою в 'runtime'.
Помилка при створенні об'єкта класу TPrinter.
Перехоплення подій в неклієнтську області форми.
Як намалювати піктограму (icon) з збільшенням.
Автоматична ширина колонок в StringGrid.
TTimer працює не досить точно.
Як помістити JPEG-зображення в exe-файл.
Перехоплення повідомлень прокрутки в TScrollBox.
Прямокутник для виділення частини малюнка.
Використання піктограми (Icon) як картинки на TSpeedButton.
Прозора фонова каринку на компоненті CoolBar.
Відключення мигання повзунок компонента TScrollBar.
Встановити курсор в потрібну позицію осередку DBGrid.
Як помістити курсор в певну позицію edit'а.
Реагуємо на мінімізацію-максимізацію форми.
Показ форми без передачі їй фокусу вводу.
Видалення дисків зі списку TDriveComboBox.
Повідомлення всім формам додатка про глобальні зміни.
Оновити список дисків компонента TDriveComboBox.
Як програмно змусити випасти меню.
Клавіша-акселератор для компонета у якого немає заголовка.
Зменшення мерехтіння при перемальовуванні компонента.
Як заборонити зміну розміру мого компонента в design-time.
Зменшення ресурсів споживаних TNotebook і TTabbedNotebook.
Емуляція натиснення клавіші з кодом # 255.
Як програмно емулювати рух миші.
Як зареєструвати новий тип файлу за своїм додатком.



Питання:
 Як розмістити прозору напис на TBitmap?
Приклад:
procedure TForm1.Button1Click(Sender: TObject);
var
	OldBkMode : integer;
begin
	Image1.Picture.Bitmap.Canvas.Font.Color := clBlue;
	OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT);
	Image1.Picture.Bitmap.Canvas.TextOut(10, 10, 'Hello');
	SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode);
end;
Наверх до змісту

Питання: Чи можна звернутися до колонки або рядку grid'а по заголовку? Відповідь:

У наступному прикладі наведено дві функції: GetGridColumnByName () і GetGridRowByName (), які повертають колонку або рядок, що має заданий заголовок (caption).

Приклад:
procedure TForm1.FormCreate(Sender: TObject);
begin
	StringGrid1.Rows[1].Strings[0] := 'This Row';
	StringGrid1.Cols[1].Strings[0] := 'This Column';
end;
function GetGridColumnByName(Grid : TStringGrid; ColName : string): integer;
var
	i : integer;
begin
	for i := 0 to Grid.ColCount - 1 do
		if Grid.Rows[0].Strings[i] = ColName then 
			begin
		Result := i;
				exit;
			end;
	Result := -1;
end;
function GetGridRowByName(Grid : TStringGrid; RowName : string): integer;
var
	i : integer;
begin
	for i := 0 to Grid.RowCount - 1 do
		if Grid.Cols[0].Strings[i] = RowName then
			begin
				Result := i;
				exit;
			end;
	Result := -1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
	Column : integer;
	Row : integer;
begin
	Column := GetGridColumnByName(StringGrid1, 'This Column');
	if Column = -1 then
		ShowMessage('Column not found')
	else
		ShowMessage('Column found at ' + IntToStr(Column));
	Row := GetGridRowByName(StringGrid1, 'This Row');
	if Row = -1 then
		ShowMessage('Row not found')
	else
		ShowMessage('Row found at ' + IntToStr(Row));
end;
Наверх до змісту

Питання:

Як використовувати клавішу-акселератор в TTabsheets? Я додаю клавішу-акселератор в заголовок кожного Tabsheet мого PageControl, але при спробі перемикати сторінки цієї клавішею програма пікає і нічого не відбувається.

Відповідь: Можна перехопити повідомлення CM_DIALOGCHAR.
Приклад:
type
	TForm1 = class(TForm)
		PageControl1: TPageControl;
		TabSheet1: TTabSheet;
		TabSheet2: TTabSheet;
		TabSheet3: TTabSheet;
	private
		{Private declarations}
		procedure CMDialogChar(var Msg:TCMDialogChar);
		message CM_DIALOGCHAR;
	public
		{Public declarations}
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CMDialogChar(var Msg:TCMDialogChar);
var
	i : integer;
begin
	with PageControl1 do
	begin
		if Enabled then
			for i := 0 to PageControl1.PageCount - 1 do
				if ((IsAccel(Msg.CharCode, Pages[i].Caption)) and
					(Pages[i].TabVisible)) then 
				begin
					Msg.Result:=1;
					ActivePage := Pages[i];
					exit;
				end;
	end;
	inherited;
end;
Наверх до змісту

Питання:

Якщо природні компоненти TRegistry під NT користувач з права доступу нижче ніж “адміністратор” не може отримати доступу до інформації реєстру в ключі HKEY_LOCAL_MACHINE. Як це обійти?

Відповідь:

Проблема викликана тим, що TRegistry завжди відкриває реєстр з параметром KEY_ALL_ACCESS (повний доступ), навіть якщо необхідний доступ KEY_READ (тільки читання). Уникнути цього можна використовуючи функції API для роботи з реєстром (RegOpenKey і т.п.), або створити новий клас з компонента TRegestry, і змінити його так щоб можна було ставити режим відкриття реєстру.

Наверх до змісту

Питання: Чи можна змінити число колонок і їх ширину в компоненті TFileListBox? Відповідь:

У наведеному прикладі FileListBox приводиться до типу TDirectoryListBox – таким чином можна додати додаткові колонки.

Приклад:
with TDirectoryListBox(FileListBox1) do 
begin
	Columns := 2;
	SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth('WWWWWWWW.WWW'),0);
end;
Наверх до змісту

Питання: Як налаштувати табуляцію в компоненті TMemo? Відповідь:

Пошліть в Memo повідомлення EM_SETTABSTOPS. Наприклад встановимо першу позицію табуляції на 20-й піксель.

Приклад:
procedure TForm1.FormCreate(Sender: TObject);
var
	DialogUnitsX : LongInt;
	PixelsX : LongInt;
	i : integer;
	TabArray : array[0..4] of integer;
begin
	Memo1.WantTabs := true;
	DialogUnitsX := LoWord(GetDialogBaseUnits);
	PixelsX := 20;
	for i := 1 to 5 do
	begin
		TabArray[i - 1] :=((PixelsX * i ) * 4) div DialogUnitsX;
	end;
	SendMessage(Memo1.Handle,
	EM_SETTABSTOPS,5,LongInt(@TabArray));
	Memo1.Refresh;
end;
Наверх до змісту

Питання: Як перехопити натискання функціональних клавіш і стрілок? Відповідь:

Перевіряйте значення змінної key на рівність VK_RIGHT, VK_LEFT, VK_F1 і т.д. на подію KeyDown форми.

Приклад:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
	if Key = VK_RIGHT then
		Form1.Caption := 'Right';
	if Key = VK_F1 then
		Form1.Caption := 'F1';
end;
Наверх до змісту

Питання:

При обробці події DrawCell компонента DrawGrid я пишу Font.Color: = clRed; і отримую нескінченний цикл мерехтінь. Чому?

Відповідь: Правильно вкажіть кордону використовуваного кинувся.
Приклад:
If (Row = 0) then
	begin
		DrawGrid1.Canvas.Font.Color := clRed;
		DrawGrid1.Canvas.TextOut(Rect.Left,Rect.Top, IntToStr(Col));
	end;
Наверх до змісту

Питання: При використанні BitBtn Caption (текст) і картинка (bitmap) з файлу не видно одночасно. Чому? Відповідь:

Це може відбуватися якщо картинка занадто велика. Клас TBitBtn спочатку малює картинку, а потім виводить текст над, під, ліворуч або праворуч від картинки (в завівімості від властивості Layout). Якщо розмір картинки такий же як у всієї кнопки для виведення тексту просто не залишається місця. Якщо Вам потрібно отримати кнопку такого ж розміру як Ваша картинка і бачити при цьому напис на кнопці Вам доведеться виводити текст напису безпосередньо на канву картинки.

Приклад:
var
	bm : TBitmap;
	OldBkMode : integer;
begin
	bm := TBitmap.Create;
	bm.Width := BitBtn1.Glyph.Width;
	bm.Height := BitBtn1.Glyph.Height;
	bm.Canvas.Draw(0, 0, BitBtn1.Glyph);
	OldBkMode := SetBkMode(bm.Canvas.Handle, Transparent);
	bm.Canvas.TextOut(0, 0, 'The Caption');
	SetBkMode(bm.Canvas.Handle, OldBkMode);
	BitBtn1.Glyph.Assign(bm);
end;
Наверх до змісту

Питання: Чи можна змінити вид текстового курсора (каретки) edit'а або іншого елемента управління Windows? Відповідь:

Можна! У прикладі показано як створити два кольорових “bitmap’а”: “усміхнений” і “похмурий” і привласнити їх курсору edit’а. Для цього потрібно перехопити віконну процедуру edit’а. Щоб зробити це замінимо адресу віконної процедури Edit’а нашим власним, а стару віконну процедуру будемо викликати по необхідності. Приклад показує “усміхнений” курсор при наборі тексту і “похмурий” при забої клавішею backspace.

Приклад:
unit caret1;
interface
{$IFDEF WIN32}
uses
	Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
{$ELSE}
uses
	WinTypes, WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
	StdCtrls;
{$ENDIF}
type
	TForm1 = class(TForm)
		Edit1: TEdit;
		procedure FormCreate(Sender: TObject);
		procedure FormDestroy(Sender: TObject);
	private
		{Private declarations}
	public
		{Public declarations}
		CaretBm : TBitmap;
		CaretBmBk : TBitmap;
		OldEditsWindowProc : Pointer;
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
type
{$IFDEF WIN32}
	WParameter = LongInt;
{$ELSE}
	WParameter = Word;
{$ENDIF}
	LParameter = LongInt;
{New windows procedure for the edit control}
function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter;
			ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
begin
{Call the old edit controls windows procedure}
	NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle,
			TheMessage, ParamW, ParamL);
	if TheMessage = WM_SETFOCUS then
	begin
		CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);
		ShowCaret(WindowHandle);
	end;
	if TheMessage = WM_KILLFOCUS then
	begin
		HideCaret(WindowHandle);
		DestroyCaret;
	end;
	if TheMessage = WM_KEYDOWN then
	begin
		if ParamW = VK_BACK then
			CreateCaret(WindowHandle, Form1.CaretBmBk.Handle, 0, 0)
		else
			CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);
		ShowCaret(WindowHandle);
	end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Create a smiling bitmap using the wingdings font}
	CaretBm := TBitmap.Create;
	CaretBm.Canvas.Font.Name := 'WingDings';
	CaretBm.Canvas.Font.Height := Edit1.Font.Height;
	CaretBm.Canvas.Font.Color := clWhite;
	CaretBm.Width := CaretBm.Canvas.TextWidth('J') + 2;
	CaretBm.Height := CaretBm.Canvas.TextHeight('J') + 2;
	CaretBm.Canvas.Brush.Color := clBlue;
	CaretBm.Canvas.FillRect(Rect(0, 0, CaretBm.Width, CaretBm.Height));
	CaretBm.Canvas.TextOut(1, 1, 'J');
{Create a frowming bitmap using the wingdings font}
	CaretBmBk := TBitmap.Create;
	CaretBmBk.Canvas.Font.Name := 'WingDings';
	CaretBmBk.Canvas.Font.Height := Edit1.Font.Height;
	CaretBmBk.Canvas.Font.Color := clWhite;
	CaretBmBk.Width := CaretBmBk.Canvas.TextWidth('L') + 2;
	CaretBmBk.Height := CaretBmBk.Canvas.TextHeight('L') + 2;
	CaretBmBk.Canvas.Brush.Color := clBlue;
	CaretBmBk.Canvas.FillRect(Rect(0,0, CaretBmBk.Width, CaretBmBk.Height));
	CaretBmBk.Canvas.TextOut(1, 1, 'L');
{Hook the edit controls window procedure}
	OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC, 
								LongInt(@NewWindowProc)));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Unhook the edit controls window procedure and clean up}
	SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(OldEditsWindowProc));
	CaretBm.Free;
	CaretBmBk.Free;
end;
Наверх до змісту

Питання:

При використанні модулів доступу до BDE (DbiTypes, DbiProcs, DbiErrs), будь-яка спроба викликати процедуру abort видає помилку при компіляції при виклику методу abort “Statement expected, but expression of type ‘Integer’ found “. Я намагався знайти DbiTypes.pas, DbiProcs.pas і DbiErrs.pas щоб розібратися але не знайшов цих файлів. Де розташовані ці файли і як обійти помилку?

Відповідь:

Модулі DbiTypes, DbiProcs, DbiErrs це псевдоніми модуля “BDE”, оголошені в Projects-> Options-> Directories/Conditionals-> Unit Aliases. Ісходник модуля DBE знаходиться в каталозі “doc” і називається “BDE.INT”. У цьому файлі оголошень константа ABORT зі значенням -2. Так як Ви хочете використовувати процедуру Abort (), яка обьявлена ​​в модулі SysUtils, Вам потрібно додати префікс SysUtils перед викликом процедури Abort.

Приклад:
SysUtils.Abort;
Наверх до змісту

Питання: Чому при зміні кольору букв StatusBar'а нічого не відбувається? Відповідь:

Status bar – стандартний елемент керування Windows, і відповідно колір його букв – Значення clBtnText яке змінюється за допомогою налаштувань в Control Panel. Цей колір чорний за замовчуванням і може змінюватися в залежності від обраної колірної схеми. Інші стандартні елемент управління Windows, наприклад кнопки, також мають колір букв, настроюється з ControlPanel. StatusBar і його панелі мають властивість “owner-draw”, дозволяє Вам використовувати будь-який колір букв.

Приклад:
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;
Наверх до змісту

Питання: Як зробити багаторядкових напис на TBitBtn? Відповідь: Виводьте текст напису безпосередньо на "glyph" TBitBtn'а. Див приклад. Приклад: procedure TForm1.FormCreate(Sender: TObject); var R : TRect; N : Integer; Buff : array[0..255] of Char; begin with BitBtn1 do begin Caption := 'A really really long caption'; Glyph.Canvas.Font := Self.Font; Glyph.Width := Width - 6; Glyph.Height := Height - 6; R := Bounds(0, 0, Glyph.Width, 0); StrPCopy(Buff, Caption); Caption := ''; DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK or DT_CALCRECT); OffsetRect(R,(Glyph.Width - R.Right) div 2, (Glyph.Height - R.Bottom) div 2); DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK); end; end; Наверх до змісту
Питання:

Як змінити стиль шрифту RichEdit натисканнями відповідних комбінацій клавіш? (Наприклад включити курсив після натискання Ctrl + I)

Відповідь: У прикладі стилі шрифту міняються після натискання слід. комбінацій клавіш Ctrl + B - вкл / викл жирного шрифту Ctrl + I - вкл / викл похилого шрифту Ctrl + S - вкл / викл закресленого шрифта Ctrl + U - вкл / викл підкресленого шрифта
Приклад:
const
	KEY_CTRL_B = 02;
	KEY_CTRL_I =  9;
	KEY_CTRL_S = 19;
	KEY_CTRL_U = 21;
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
	case Ord(Key) of
	KEY_CTRL_B: 
		begin
			Key := #0;
				if fsBold in (Sender as TRichEdit).SelAttributes.Style then
					(Sender as TRichEdit).SelAttributes.Style :=
					(Sender as TRichEdit).SelAttributes.Style - [fsBold]
				else
					(Sender as TRichEdit).SelAttributes.Style :=
					(Sender as TRichEdit).SelAttributes.Style + [fsBold];
		end;
	KEY_CTRL_I:
		begin
			Key := #0;
				if fsItalic in (Sender as TRichEdit).SelAttributes.Style then
					(Sender as TRichEdit).SelAttributes.Style :=
					(Sender as TRichEdit).SelAttributes.Style - [fsItalic]
				else
					(Sender as TRichEdit).SelAttributes.Style :=
					(Sender as TRichEdit).SelAttributes.Style + [fsItalic];
		end;
	KEY_CTRL_S:
		begin
			Key := #0;
			if fsStrikeout in (Sender as TRichEdit).SelAttributes.Style then
				(Sender as TRichEdit).SelAttributes.Style :=
				(Sender as TRichEdit).SelAttributes.Style-[fsStrikeout]
			else
				(Sender as TRichEdit).SelAttributes.Style :=
				(Sender as TRichEdit).SelAttributes.Style+[fsStrikeout];
		end;
	KEY_CTRL_U:
		begin
			Key := #0;
			if fsUnderline in (Sender as TRichEdit).SelAttributes.Style then
				(Sender as TRichEdit).SelAttributes.Style :=
				(Sender as TRichEdit).SelAttributes.Style-[fsUnderline]
			else
				(Sender as TRichEdit).SelAttributes.Style :=
				(Sender as TRichEdit).SelAttributes.Style+[fsUnderline];
		end;
	end;
end;
Наверх до змісту

Питання:

У документації компонента TRegIniFile кажуть, що можна змінювати кореневої ключ (Root key). Я намагаюся це зробити але нічого не виходить.

Відповідь: Див приклад.
Приклад:
uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var
	WinIni : TRegIniFile;
begin
	WinIni := TRegIniFile.Create('');
	WinIni.RootKey := HKEY_LOCAL_MACHINE;
	WinIni.WriteString('Frank','Borland','Writes Fast Code!');
	WinIni.Free;
end;
Наверх до змісту

Питання: Чи можна динамічно змінювати властивість "owner" компонента під час виконання програми? Відповідь:

Ви можете змінювати властивість “owner” і після створення компонента за допомогою методів InsertComponent () і RemoveComponent ().

Наверх до змісту

Питання: Як очистити вміст Canvas'а? Відповідь: Просто намалюйте прямокутник будь-якого кольору. Приклад: Canvas.Brush.Color := ClWhite; Canvas.FillRect(Canvas.ClipRect); Наверх до змісту
Питання:

Чи можна динамічно змінювати яка форма вважається головною в додатку під час роботи програми?

Відповідь:

Можна, але тільки під час завантаження програми. Щоб зробити це, виберіть “View-> Project Source” і змініть код ініціалізації додатки, так що порядок створення форм залежав від якогось умови.

 Примітка: Вам доведеться редагувати цей код, якщо Ви додасте в додаток нові форми.
begin
	Application.Initialize;
	if <Якесь умова> then 
		begin
			Application.CreateForm(TForm1, Form1);
			Application.CreateForm(TForm2, Form2);
		end 
	else 
		begin
			Application.CreateForm(TForm2, Form2);
			Application.CreateForm(TForm1, Form1);
		end;
end.
Application.Run;
Наверх до змісту

Питання:

Як програмно “клацнути” по компоненту speed button? Я намагався використовувати SendMessage але у Speedbuttons немає “handle”.

Наверх до змісту

Питання: Чи можна відключити певний елемент в RadioGroup? Відповідь: У прикладі показано як отримати доступ до окремих елементів компонента TRadioGroup. Приклад: procedure TForm1.Button1Click(Sender: TObject); begin TRadioButton(RadioGroup1.Controls[1]). Enabled := False; end; Наверх до змісту
Питання: Чому методи малювання Delphi (наприклад MoveTo і LineTo) малюють на один піксел коротше? Відповідь:

Так працює більшість графічних систем, включаючи Windows. Бібліотека VCL просто передає виклики у функції GDI. Якщо Ви хочете намалювати лінію з останнім пикселом включно просто додайте одиницю до координат.

Наверх до змісту

Питання: Як показати підказки "hints" для елементів меню? Відповідь: У прикладі створюється обробник події Application.Hint - підказки меню зображуються на status panel. Приклад: type TForm1 = class(TForm) Panel1: TPanel; MainMenu1: TMainMenu; MenuItemFile: TMenuItem; MenuItemOpen: TMenuItem; MenuItemClose: TMenuItem; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); procedure MenuItemCloseClick(Sender: TObject); procedure MenuItemOpenClick(Sender: TObject); private {Private declarations} procedure HintHandler(Sender: TObject); public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Panel1.Align := alBottom; MenuItemFile.Hint := 'File Menu'; MenuItemOpen.Hint := 'Opens A File'; MenuItemClose.Hint := 'Closes the Application'; Application.OnHint := HintHandler; end; procedure TForm1.HintHandler(Sender: TObject); begin Panel1.Caption := Application.Hint; end; procedure TForm1.MenuItemCloseClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.MenuItemOpenClick(Sender: TObject); begin if OpenDialog1.Execute then Form1.Caption := OpenDialog1.FileName; end; Наверх до змісту
Питання: Як опеделіть стан списку ComboBox, випав / прихований? Відповідь: Пошліть ComboBox повідомлення CB_GETDROPPEDSTATE. Приклад: if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE,0,0) = 1 then begin {список ComboBox випав} end; Наверх до змісту
Питання: Як видалити каталог разом з усіма містяться в ньому файлами? Відповідь:

У прикладі стираються всі файли в каталозі і сам каталог. Щоб видалити файл, позначайте тільки для читання (read only) і зайняті іншими програмами в момент видалення – напишіть додаткову процедуру.

procedure TForm1.Button1Click(Sender: TObject);
var
	DirInfo: TSearchRec;
	r: integer;
begin
	r := FindFirst('C:\Download\*.*', FaAnyfile, DirInfo);
	while r = 0 do
	begin
		if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
			(DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
		if DeleteFile(pChar('C:\Download\' + DirInfo.Name))= false then
			ShowMessage('Unable to delete: C:\Download\'+DirInfo.Name);
		r := FindNext(DirInfo);
	end;
	SysUtils.FindClose(DirInfo);
	if RemoveDirectory('C:\Download\') = false then
		ShowMessage('Unable to delete directory: C:\Download\');
end;
Наверх до змісту

Питання:

Як відключити системне меню форми і кнопки Minimize, Maximize, and Close під час виконання (Runtime)?

Відповідь: У наведеному прикладі показано як це зробити
Приклад:
procedure TForm1.Button1Click(Sender: TObject);
begin
	{Disable}
	Form1.BorderIcons := Form1.BorderIcons - [biSystemMenu, biMinimize, biMaximize];
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
	{Enable}
	Form1.BorderIcons := Form1.BorderIcons + [biSystemMenu, biMinimize, biMaximize];
end;
Наверх до змісту

Питання: Як витягти Red, Green, і Blue компонент з певного кольору? Відповідь: Використовуйте функції Window API Get RValue (), GetGValue (), і GetBValue (). Приклад: procedure TForm1.Button1Click(Sender: TObject); begin Form1.Canvas.Pen.Color := clRed; Memo1.Lines.Add('Red := ' + IntToStr(GetRValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add('Red := ' + IntToStr(GetGValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add('Blue:= ' + IntToStr(GetBValue(Form1.Canvas.Pen.Color))); end; Наверх до змісту
Питання: Як визначити номер поточного рядка в TMemo? Відповідь:

Щоб визначити номер поточного рядка будь-якого об’єкта управління edit – надішліть їй повідомлення EM_LINEFROMCHAR

Приклад:
procedure TForm1.Button1Click(Sender: TObject);
var
	LineNumber : integer;
begin
	LineNumber := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, word(-1), 0);
	ShowMessage(IntToStr(LineNumber));
end;
Наверх до змісту

Питання: Як проігриваеть MPEG файл в Delphi-програмі? Відповідь: Якщо в системі Windows MMSystem встановлений декодер MPEG - використовуючи компонент TMediaPlayer Приклад: procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.Filename := 'C:\DownLoad\rsgrow.mpg'; MediaPlayer1.Open; MediaPlayer1.Display := Panel1; MediaPlayer1.DisplayRect := Panel1.ClientRect; MediaPlayer1.Play; end; Наверх до змісту
Питання: Як використовувати анімований курсор? Відповідь:

По перше необхідно отримає handle курсора, а потім визначити його в масиві курсорів компонента TScreen. Індекси зумовлених курсорів системи негативні, користувач може визначити курсор, індекс якого позитивний.

Приклад:
procedure TForm1.Button1Click(Sender: TObject);
var
	h : THandle;
begin
	h := LoadImage(0, 'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or
			LR_LOADFROMFILE);
	if h = 0 then
		ShowMessage('Cursor not loaded')
	else
		begin
			Screen.Cursors[1] := h;
			Form1.Cursor := 1;
		end;
end;
Наверх до змісту

Питання: Як дізнатися про натискання "non-menu" клавіші в момент коли меню показано? Відповідь: Створіть обробник повідомлення WM_MENUCHAR. Приклад: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; One1: TMenuItem; Two1: TMenuItem; THree1: TMenuItem; private {Private declarations} procedure WmMenuChar(var m : TMessage); message WM_MENUCHAR; public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WmMenuChar(var m : TMessage); begin Form1.Caption := 'Non standard menu key pressed'; m.Result := 1; end; end. Наверх до змісту
Питання: Як визначити наявність співпроцесора? Відповідь:

На відміну від загальноприйнятого думки не всее клони 486/586/686 / і Pentium мають співпроцесор для обчислень з плаваючою комою. У прикладі визначається наявність співпроцесора і під Win16 і під Win32.

Приклад:
{$IFDEF WIN32}
uses Registry;
{$ENDIF}
function HasCoProcesser : bool;
{$IFDEF WIN32}
var
	TheKey : hKey;
{$ENDIF}
begin
	Result := true;
	{$IFNDEF WIN32}
	if GetWinFlags and Wf_80x87 = 0 then
	Result := false;
	{$ELSE}
	if RegOpenKeyEx(HKEY_LOCAL_MACHINE,
	'HARDWARE\DESCRIPTION\System\FloatingPointProcessor',0,
	KEY_EXECUTE, TheKey) <> ERROR_SUCCESS then result := false;
	RegCloseKey(TheKey);
{$ENDIF}
	end;
procedure TForm1.Button1Click(Sender: TObject);
begin
	if HasCoProcesser then
		ShowMessage('Has CoProcessor') 
	else
		ShowMessage('No CoProcessor - Windows Emulation Mode');
end;
Наверх до змісту

Питання: Як дізнатися серійний номер аудіо CD? Відповідь:

CD може мати або не мати серійний номер та / або універсальний код продукту (Universal Product Code). MCI-розширення Windows надає цю інформації за допомогою команди MCI_INFO_MEDIA_IDENTITY command. Ця команда повертає унікальну ID-рядок.

Приклад:
uses MMSystem, MPlayer;
procedure TForm1.Button1Click(Sender: TObject);
var
	mp : TMediaPlayer;
	msp : TMCI_INFO_PARMS;
	MediaString : array[0..255] of char;
	ret : longint;
begin
	mp := TMediaPlayer.Create(nil);
	mp.Visible := false;
	mp.Parent := Application.MainForm;
	mp.Shareable := true;
	mp.DeviceType := dtCDAudio;
	mp.FileName := 'D:';
	mp.Open;
	Application.ProcessMessages;
	FillChar(MediaString, sizeof(MediaString), #0);
	FillChar(msp, sizeof(msp), #0);
	msp.lpstrReturn := @MediaString;
	msp.dwRetSize := 255;
	ret := mciSendCommand(Mp.DeviceId, MCI_INFO, MCI_INFO_MEDIA_IDENTITY,
			longint(@msp));
	if Ret <> 0 then
		begin
			MciGetErrorString(ret, @MediaString, sizeof(MediaString));
			Memo1.Lines.Add(StrPas(MediaString));
		end
	else
		Memo1.Lines.Add(StrPas(MediaString));
	mp.Close;
	Application.ProcessMessages;
	mp.free;
end;
end.
Наверх до змісту

Питання: Як вивести на елемент керування (Window control) текст, що містить амперсанд - &? Відповідь:

Використовуючи два амперсанда поспіль. Windows інтерпрітірует одиночний амперсанд як вказівка ​​на те, що наступний символ – гаряча клавіша (і поддчерківает наступний символ замість ізлбраженія аперсанда).

Приклад:
 Button1.Caption: = 'Чорне && Біле';
Наверх до змісту

Питання: Як помістити bitmap в Metafile? Відповідь: див. приклад Приклад: procedure TForm1.Button1Click(Sender: TObject); var m : TmetaFile; mc : TmetaFileCanvas; b : tbitmap; begin m := TMetaFile.Create; b := TBitmap.create; b.LoadFromFile('C:\SomePath\SomeBitmap.BMP'); m.Height := b.Height; m.Width := b.Width; mc := TMetafileCanvas.Create(m, 0); mc.Draw(0, 0, b); mc.Free; b.Free; m.SaveToFile('C:\SomePath\Test.emf'); m.Free; Image1.Picture.LoadFromFile('C:\SomePath\Test.emf'); end; Наверх до змісту
Питання: Як дізнатися, що курсор миші над моєю формою? Відповідь: Можна використовувати функцію GetCapture () з Windows API. Примітка: Cм. документацію Windows для інформації про обмеження функції GetCapture. Приклад: procedure TForm1.FormDeactivate(Sender: TObject); begin ReleaseCapture; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If GetCapture = 0 then SetCapture(Form1.Handle); if PtInRect(Rect(Form1.Left,Form1.Top,Form1.Left + Form1.Width, Form1.Top + Form1.Height), ClientToScreen(Point(x, y))) then Form1.Caption: = 'Мишка над формою!' else Form1.Caption: = 'Мишка поза формою ...'; end; Наверх до змісту
Питання: Як програмно визначити, що додаток працює під Windows NT? Відповідь:див. приклад Приклад: function IsNT : bool; var osv : TOSVERSIONINFO; begin result := true; GetVersionEx(osv); if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then exit; result := false; end; procedure TForm1.Button1Click(Sender: TObject); begin if IsNt then ShowMessage('Running on NT') else ShowMessage('Not Running on NT'); end; Наверх до змісту
Питання: Як створити bitmap з піктогрмми (icon)? Відповідь: Використовуючи Bitmap.Canvas.Draw намалюйте піктограму на Bitmap'е. Приклад: procedure TForm1.Button1Click(Sender: TObject); var TheIcon : TIcon; TheBitmap : TBitmap; begin TheIcon := TIcon.Create; TheIcon.LoadFromFile('C:\Program Files\Borland\IcoCur32\EARTH.ICO'); TheBitmap := TBitmap.Create; TheBitmap.Height := TheIcon.Height; TheBitmap.Width := TheIcon.Width; TheBitmap.Canvas.Draw(0, 0, TheIcon); Form1.Canvas.Draw(10, 10, TheBitmap); TheBitmap.Free; TheIcon.Free; end; Наверх до змісту
Питання: Як створити окрему підказку (hint) для кожного осередку StringGrid? Відповідь:

У наведеному прикладі відслідковується рух курсору миші – при переміщенні між осередками StringGrid’а – з’являється вікно підказки (hint), показиваеющее номер поточної рядка і колонки.

Приклад:
type
	TForm1 = class(TForm)
		StringGrid1: TStringGrid;
		procedure StringGrid1MouseMove(Sender: TObject;
		Shift: TShiftState; X, Y: Integer);
		procedure FormCreate(Sender: TObject);
	private
	{Private declarations}
		Col : integer;
		Row : integer;
	public
	{Public declarations}
   end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
	StringGrid1.Hint := '0 0';
	StringGrid1.ShowHint := True;
end;
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
	r : integer;
	c : integer;
begin
	StringGrid1.MouseToCell(X, Y, C, R);
	with StringGrid1 do
		begin
			if ((Row <> r) or(Col <> c)) then
				begin
					Row := r;
					Col := c;
					Application.CancelHint;
					StringGrid1.Hint :=IntToStr(r)+#32+IntToStr(c);
				end;
		end;
end;
Наверх до змісту

Питання: Як внести зміни в код VCL? Відповідь:

Примітка: внесення змін до VCL не підтримується Borland або Borland
Developer Support.
-Але якщо Ви вирішили зробити це …
Изменеия в код VCL ніколи не повинні вноситься в секцію “interface” модуля – тільки в секцію “implimentation”. Найбільш безпечний спосіб внести зміни в VCL – створити новий каталог названий “виправлений VCL”. Скопіюйте файл VCL який Ви хочете змінити в цей каталог. Внесіть зміни (Краще прокоментувати їх) в цей файл. Потім додайте шлях до Вашого каталогу “Виправлений VCL” в самий початок “library path”. Перезапустіть Delphi / C + + Builder і Перекомпілюйте Ваш проект. “Library path” можна змінити в меню:

Delphi 1 : Options | Environment | Library
Delphi 2 : Tools | Options | Library
Delphi 3 :  Tools | Environment Options | Library
Delphi 4 :  Tools | Environment Options | Library
C++ Builder : Options | Environment | Library
Наверх до змісту

Питання: Як в Delphi реалізувати функцію - еквівалент TwipsPerPixel з VisualBasic? Відповідь: Функції TwipsPerPixelX і TwipsPerPixelY, наведені в прикладі реалізують ту ж функціональність в Delphi. Приклад: function TwipsPerPixelX(Canvas : TCanvas) : Extended; begin result := 1440 / GetDeviceCaps(Canvas.Handle, LOGPIXELSX); end; function TwipsPerPixelY(Canvas : TCanvas) : Extended; begin result := 1440 / GetDeviceCaps(Canvas.Handle, LOGPIXELSY); end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(FloatToStr(TwipsPerPixelX(Form1.Canvas))); ShowMessage(FloatToStr(TwipsPerPixelY(Form1.Canvas))); end; Наверх до змісту
Питання: Як вставити вміст файлу в поточну позицію курсору в компонет 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 {Undo is possible} end; Для виконання "Redo" виконайте "Undo" ще раз. Наверх до змісту
Питання: Чи можна створити форму, яка отримує додаткові параметри в методі Сreate? Відповідь: Просто замініть конструктор Create класу Вашої форми. Приклад: unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) private {Private declarations} public constructor CreateWithCaption(aOwner: TComponent; aCaption: string); {Public declarations} end; var Form2: TForm2; implementation {$R *.DFM} 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.Width := 150;
	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.Width := 100;
	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.Width := Bm1.Width;
	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'а!}
	StringGrid1.DefaultRowHeight := ComboBox1.Height; {Сховати 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,
	StringGrid1.Row] :=ComboBox1.Items[ComboBox1.ItemIndex];
	ComboBox1.Visible := False;
	StringGrid1.SetFocus;
end;
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin {Перекинувши вибраного в значення з ComboBox в grid}
	StringGrid1.Cells[StringGrid1.Col,
	StringGrid1.Row] :=ComboBox1.Items[ComboBox1.ItemIndex];
	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.Width := (R.Right + 1) - R.Left;
			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;
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.ClassInfo, Prop); end; procedure TForm1.Button1Click(Sender: TObject); var p : pointer; begin p := HasProperty(Button1, 'Color'); 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 піксель. Приклад: type TForm1 = class(TForm) private {Private declarations} procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPAINT; public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCPaint(var Msg: TWMNCPaint); var dc : hDc; Pen : hPen; OldPen : hPen; OldBrush : hBrush; begin inherited; dc := GetWindowDC(Handle); msg.Result := 1; Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); OldPen := SelectObject(dc, Pen); OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH)); Rectangle(dc, 0,0, Form1.Width, Form1.Height); SelectObject(dc, OldBrush); SelectObject(dc, OldPen); DeleteObject(Pen); ReleaseDC(Handle, Canvas.Handle); end; Наверх до змісту
Питання: Як виконати якийсь процес тоді, коли користувач не працює з моїм додатком? Відповідь: Створіть процедуру, яка буде викликатися при подію Application.OnIdle. Оголосив процедуру: {Private declarations} procedure IdleEventHandler(Sender: TObject; var Done: Boolean); У розділі implementation опишемо поцедуру: procedure TForm1.IdleEventHandler(Sender: TObject; var Done: Boolean); begin {Do a small bit of work here} Done := false; end; У методі Form'и OnCreate - вкажемо що наша процедура викликається на подію Application.OnIdle. Application.OnIdle := IdleEventHandler;

Подія 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 = class(TForm)
		PopupMenu1: TPopupMenu;
		Pop11: TMenuItem;
		Pop21: TMenuItem;
		Pop31: TMenuItem;
		procedure FormCreate(Sender: TObject);
		procedure FormDestroy(Sender: TObject);
		procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
							Shift: TShiftState; X, Y: Integer);
	private
		{Private declarations}
		bmUnChecked : TBitmap;
		bmChecked : TBitmap;
	public
		{Public declarations}
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
	bmUnChecked := TBitmap.Create;
	bmUnChecked.LoadFromFile('C:\Program Files\Borland\BitBtns\ALARMRNG.BMP');
	bmChecked := TBitmap.Create;
	bmChecked.LoadFromFile('C:\Program Files\Borland\BitBtns\CHECK.BMP');
	{Add the bitmaps to the item at index 1 in PopUpMenu}
	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 TStringGrid(DbGrid1).FixedCols := 2; end; Наверх до змісту
Питання:

Деякі компоненти баз даних (і серед них TDBGrid) ніяк не змінюють візуальних властивостей, коли до них відключений доступ (disabled). Як це змінити програмно?

Відповідь:

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

procedure TForm1.Button1Click(Sender: TObject);
begin
	DbGrid1.Enabled := false;
	DbGrid1.Font.Color := clGray;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
	DbGrid1.Enabled := true;
	DbGrid1.Font.Color := clBlack;
end;
Наверх до змісту

Питання: Як визначити натиснуті чи клавіші 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 = class(TForm) procedure FormCreate(Sender: TObject); private {Private declarations} public procedure MyShowHint(var HintStr: string; var CanShow: Boolean;var HintInfo: THintInfo); {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.MyShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo); var i : integer; begin for i := 0 to Application.ComponentCount - 1 do if Application.Components[i] is THintWindow then with THintWindow(Application.Components[i]).Canvas do begin Font.Name:= 'Arial'; 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
	{Get the state of the caps lock key}
	flag := not GetKeyState(VK_CAPITAL) and 1 = 0;
	{If the caps lock key is on then turn it off}
	if flag then
		SimulateKeystroke(VK_CAPITAL, 0);
	for i := 1 to Length(s) do
		begin
			w := VkKeyScan(s[i]);
			{If there is not an error in the key translation}
			if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF)) then
				begin
					{If the key requires the shift key down - hold it down}
					if HiByte(w) and 1 = 1 then
						SimulateKeyDown(VK_SHIFT);
						{Send the VK_KEY}
					SimulateKeystroke(LoByte(w), 0);
					{If the key required the shift key down - release it}
					if HiByte(w) and 1 = 1 then
						SimulateKeyUp(VK_SHIFT);
				end;
		end;
{if the caps lock key was on at start, turn it back on}
if flag then
	SimulateKeystroke(VK_CAPITAL, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
	{Toggle the cap lock}
	SimulateKeystroke(VK_CAPITAL, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
	{Capture the entire screen to the clipboard}
	{by simulating pressing the PrintScreen key}
	SimulateKeystroke(VK_SNAPSHOT, 0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
	{Capture the active window to the clipboard}
	{by simulating pressing the PrintScreen key}
	SimulateKeystroke(VK_SNAPSHOT, 1);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
	{Set the focus to a window (edit control) and send it a string}
	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.Width,bm.Height); il.DrawingStyle := dsTransparent; il.Masked := true; il.AddMasked(bm, clRed); il.Draw(Form1.Canvas, 0, 0, 0); bm.Free; il.Free; end; Наверх до змісту
Питання: Як змусити 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? Відповідь: Див приклад. Приклад: MediaPlayer1.FileName := 'E:'; Наверх до змісту
Питання: Як прибрати кнопку з назвою моєї програми з Панелі Задач (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' {Form1},
	Unit2 in 'Unit2.pas' {Form2};
{$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) < 'A') or (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)? Відповідь: Перехопите F2 на подію keydown. Приклад: procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Ord(Key) = VK_F2 then ListView1.Selected.EditCaption; end; Наверх до змісту
Питання: Коли я додаю обьект в список TStrings як мені його потім знищити? Відповідь: Просто викличте метод free цього об'єкта. Приклад: procedure TForm1.FormCreate(Sender: TObject); var Icon: TIcon; begin Icon := TIcon.Create; Icon.LoadFromFile('C:\Program Files\BorlandImages\CONSTRUC.ICO'); ListBox1.Items.AddObject('Item 0', Icon); end; procedure TForm1.FormDestroy(Sender: TObject); begin ListBox1.Items.Objects[0].Free; end; Наверх до змісту
Питання: Замість друку графіки я хочу використовувати резидентний шрифт принтера. Як? Відповідь:

Іспользутся функцію Windows API – GetStockObject () щоб отримати дескриптор (handle) шрифта пристрої (DEVICE_DEFAULT_FONT) і передайте його
Printer.Font.Handle.

Приклад:
uses Printers;
procedure TForm1.Button1Click(Sender: TObject);
var
	tm : TTextMetric;
	i : integer;
begin
	if PrintDialog1.Execute then
	begin
		Printer.BeginDoc;
		Printer.Canvas.Font.Handle := GetStockObject(DEVICE_DEFAULT_FONT);
		GetTextMetrics(Printer.Canvas.Handle, tm);
		for i := 1 to 10 do
		begin
			Printer.Canvas.TextOut(100,i * tm.tmHeight +
				tm.tmExternalLeading,'Test');
		end;
		Printer.EndDoc;
	end;
end;
Наверх до змісту

Питання:

Мені потрібно програмно встановити деякі файли з установочного диска Windows. На багатьох комп’ютерах CAB-файли установки Windows знаходяться в якомусь каталозі на жорсткому диску, на інших – Windows був встановлений з CD. Як дізнатися звідки була встановлена ​​Windows?

Відповідь: Цю інформацію можна отримати з реєстру.
Приклад:
uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var
	reg: TRegistry;
begin
	reg := TRegistry.Create;
	reg.RootKey := HKEY_LOCAL_MACHINE;
	reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\SETUP',false);
	ShowMessage(reg.ReadString('SourcePath'));
	reg.CloseKey;
	reg.free;
end;
Наверх до змісту

Питання: Як отримати рядок повідомлення про помилку Windows код якої отримано функцією GetLastError? Відповідь: Функція RTL SysErrorMessage (GetLastError). Приклад: procedure TForm1.Button1Click(Sender: TObject); begin {Cause a Windows system error message to be logged} ShowMessage(IntToStr(lStrLen(nil))); ShowMessage(SysErrorMessage(GetLastError)); end; Наверх до змісту
Питання:

Як змусити Delphi виконувати ще більш сувору перевірка типів? Напрмер – я створюю користувальницький тип, успадкований від double і можу передавати його будь-яким функцій, приймаючим параметр типу double. Як змусити компілятор проводити більш сувору перевірку типів і видавати попередження в таких випадках?

Відповідь: Див відповідь. 
Приклад:
type TStrongType = type Double;
type TWeakType = Double;
procedure AddWeakType(var d : TWeakType);
begin
	d := d + 1;
end;
procedure AddStrongType(var d : TStrongType);
begin
	d := d + 1;
end;
procedure AddDoubleType(var d : Double);
begin
	d := d + 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
	d : Double;
	s : TStrongType;
	w : TWeakType;
begin
	AddDoubleType(d); {compiles fine}
	AddDoubleType(w); {compiles fine}
	AddDoubleType(s); {<- compile error}
	AddDoubleType(double(s)); {compiles fine}
	AddWeakType(d); {compiles fine}
	AddWeakType(w); {compiles fine}
	AddWeakType(s); {<- compile error}
	AddWeakType(TWeakType(s)); {compiles fine}
	AddStrongType(d); {<- compile error}
	AddStrongType(TStrongType(d)); {compiles fine}
	AddStrongType(w); {<- compile error}
	AddStrongType(TStrongType(w)); {compiles fine}
	AddStrongType(s); {compiles fine}
end;
Наверх до змісту

Питання: Де в Delphi оголошень VK_Key для AZ і 0-9? Відповідь: Вони не оголошені в Delphi оскільки вони просто могуть бути замінені буквами. VK_0 до VK_9 те ж що і ASCII 0 "до '9 '($ 30 - $ 39), VK_A до VK_Z те ж що і ASCII 'A' до 'Z' ($ 41 - $ 5A). Наверх до змісту
Питання: Як змінити віконну процедуру для TForm? Відповідь:

Перевизначите в підкласі TForm віконну процедуру WinProc класу. У прикладі віконна процедура перевизначається для того щоб реагувати на повідомлення WM_CANCELMODE, що показує, що виконується messagebox або який-небудь ще діалог.

Приклад:
type
	TForm1 = class(TForm)
		Button1: TButton;
		procedure WndProc (var Message: TMessage); override;
		procedure Button1Click(Sender: TObject);
	private
		{Private declarations}
	public
		{Public declarations}
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WndProc (var Message: TMessage);
begin
	if Message.Msg = WM_CANCELMODE then
		begin
			Form1.Caption := 'A dialog or message box has popped up';
		end
	else
		inherited  // <- Інше зробить батьківська процедура
end;
procedure TForm1.Button1Click (Sender: TObject);
begin
ShowMessage ('Test Message');
end;
Наверх до змісту

Питання: Як дізнатися розміри TComboBox з показаним випадним списком до показу списку? Відповідь:

На подію FormShow пошліть повідомлення CB_SHOWDROPDOWN в ComboBox двічі – один раз щоб змусити список випасти, другий – щоб прибрати його. Потім пошліть повідомлення CB_GETDROPPEDCONTROLRECT, передавши як параметр адресу TRect. TRect буде містити екранні кордінати прямокутника описує ComboBox разом з випав списком. Потім Ви можете викликати ScreenToClient щоб перетворити екранні кордінати в координати клієнтської області вікна.

Приклад:
var
	R : TRect;
procedure TForm1.FormShow(Sender: TObject);
var
	T : TPoint;
begin
	SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);
	SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 0, 0);
	SendMessage(ComboBox1.Handle, CB_GETDROPPEDCONTROLRECT, 0, LongInt(@r));
	t := ScreenToClient(Point(r.Left, r.Top));
	r.Left := t.x;
	r.Top := t.y;
	t := ScreenToClient(Point(r.Right, r.Bottom));
	r.Right := t.x;
	r.Bottom := t.y;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
	Form1.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom );
end;
Наверх до змісту

Питання: Я хочу створити в своїй програмі меню "а ля Дельфі 4". Як це зробити? Відповідь: 1. Додайте на формі TControlBar. (Закладка Additional) Встановіть Align = Client. 2. Додайте TToolBar (закладка Win32) всередині TControlBar. 3. Встановіть у True властивості Flat і ShowCaptions цього TToolBar. 4. Створіть на TToolBar стільки TToolButtons скільки Вам потрібно. (Клацнувши по TToolBar правою кнопкою і вибравши NewButton) 5. Встановіть властивість Grouped = True для всіх TToolButtons. Це дозволить меню випадати при переміщенні курсора між головними пунктами меню (якщо меню вже показано). 6. Додайте на Хомі TMainMenu і переконайтеся, що воно * НЕ прісоденено * як меню головної форми. (Подивіться властивість Menu форми). 7. Створіть всі пункти меню (клацнувши по TMainMenu кнопкою і вибравши Menu Designer) 8. Для кожної TToolButton встановіть її MenuItem рівним відповідному пункту TMainMenu. Наверх до змісту
Питання: Як добится того щоб TMemo і TEdit мали працювали не тільки в режимі вставки символів, але і в режимі заміни? Відповідь:

Елементи управління Windows TEdit і TMemo не мають режиму заміни. Однак цей режим можна емулювати встановивши властивість SelLength edit’а або memo в 1 при обробці події KeyPress. Це змусить його перезаписувати символ в поточній позиції курсора. У прикладі цей спосіб використовується для TMemo. Режим вставка / заміна перемикається клавішею “Insert”.

Приклад:
type
	TForm1 = class(TForm)
		Memo1: TMemo;
		procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
		procedure Memo1KeyPress(Sender: TObject; var Key: Char);
private
	{Private declarations}
		InsertOn : bool;
public
	{Public declarations}
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
	if (Key = VK_INSERT) and (Shift = []) then
		InsertOn := not InsertOn;
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
	if ((Memo1.SelLength = 0) and (not InsertOn)) then
		Memo1.SelLength := 1;
end;
Наверх до змісту

Питання: Як відправити повідомлення відразу всіх елементів управління форми? Відповідь:

Можна використовувати Screen.Forms [i]. BroadCast (msg); де [i] – індекс тієї форми, якої Ви хочете переслати повідомлення. BroadCast працює з усіма компонентами, нащадками TWinControls і відправляє повідомлення всім дочірнім компонентів з масиву Controls. Якщо один з дочірніх компонентів обробляє це повідомлення і встановлює Msg.Result в ненульове значення – подальша розсилка повідомлення зупиняється.

Наверх до змісту

Питання: При спробі привласнити значення властивості "selected" ListBox'а виробляється exception "Index is out of bounds". У чому тут справа і як привласнити значення властивості selected? Відповідь: Властивість "selected" компонента ТListBox може бути використано тільки якщо властивість MultiSelect установленно в True. Якщо Ви працюєте з ListBox'ом у якого MultiSelect = false то використовуйте властивість ItemIndex. Приклад: procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add('1'); ListBox1.Items.Add('2'); {This will fail on a single selection ListBox} // ListBox1.Selected[1] := true; ListBox1.ItemIndex := 1; {This is ok} end; Наверх до змісту
Питання: Як обмежити довжину тексту, що вводиться в TEdit, так щоб ширина тексту не перевищувала ширину TEdit'а? Відповідь:

У прикладі наведено два способи обмежити довжину тексту в TEdit так щоб вона не перевищувала ширину клієнтської області вікна TEdit’а і не з’являлася прокрутка тексту. Перший спосіб встановлює властивість TEdit’а MaxLength дорівнює кількості букв “W”, які помістяться в TEdit. “W” обрана тому, що є, напевно, самої широкої буквою в будь-якому шрифт. Цей метод непогано працює для шрифтів з фіксованою шириною букв, але для шрифтів зі змінною шириною літер навряд чи згодиться. Другий спосіб перхвативает подія KeyPress TEdit’а і вимірює ширину вже введеного тексту і ширину нового символу. Якщо ширина більше ніж клієнтська область TEdit’а новий символ відкидається і викликається MessageBeep.

Приклад:
procedure TForm1.FormCreate(Sender: TObject);
var
	cRect : TRect;
	bm : TBitmap;
	s : string;
begin
	Windows.GetClientRect(Edit1.Handle, cRect);
	bm := TBitmap.Create;
	bm.Width := cRect.Right;
	bm.Height := cRect.Bottom;
	bm.Canvas.Font := Edit1.Font;
	s := 'W';
	while bm.Canvas.TextWidth(s) < CRect.Right do
	s := s + 'W';
	if length(s) > 1 then
	begin
		Delete(s, 1, 1);
		Edit1.MaxLength := Length(s);
	end;
end;
 {Інший варіант}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
	cRect : TRect;
	bm : TBitmap;
begin
	if ((Ord(Key) <> VK_TAB) and (Ord(Key) <> VK_RETURN) and
		(Ord(Key) <> VK_LEFT) and (Ord(Key) <> VK_BACK)) then
	begin
		Windows.GetClientRect(Edit1.Handle, cRect);
		bm := TBitmap.Create;
		bm.Width := cRect.Right;
		bm.Height := cRect.Bottom;
		bm.Canvas.Font := Edit1.Font;
		if bm.Canvas.TextWidth(Edit1.Text + Key) > CRect.Right then
		begin
			Key := #0;
			MessageBeep(-1);
		end;
		bm.Free;
	end;
end;
Наверх до змісту

Питання: Як зберегти об'єкт TFont в реєстрі / ini / фото / таблиці бази даних? Відповідь:

Потрібно зберігати атрибути шрифту (ім’я, розмір тощо) а не сам об’єкт TFont. Після зчитування цієї інформації слід перевірити чи існує такий шрифт, перш ніж його використовувати. Щоб не здатися голослівним доповню відповідь Borland’а своїм прикладом збереження / читання шрифту в / з реєстру

Uses    ... Registry;
procedure SaveFontToRegistry(Font : TFont; SubKey : String);
Var
	R : TRegistry;
	FontStyleInt : byte;
	FS : TFontStyles;
begin
	R:=TRegistry.Create;
	try
		FS:=Font.Style;
		Move(FS,FontStyleInt,1);
		R.OpenKey(SubKey,True);
		R.WriteString('Font Name',Font.Name);
		R.WriteInteger('Color',Font.Color);
		R.WriteInteger('CharSet',Font.Charset);
		R.WriteInteger('Size',Font.Size);
		R.WriteInteger('Style',FontStyleInt);
	finally
		R.Free;
	end;
end;
function ReadFontFromRegistry(Font : TFont; SubKey : String) : boolean;
Var
	R : TRegistry;
	FontStyleInt : byte;
	FS : TFontStyles;
begin
	R:=TRegistry.Create;
	try
		result:=R.OpenKey(SubKey,false); if not result then exit;
		Font.Name:=R.ReadString('Font Name');
		Font.Color:=R.ReadInteger('Color');
		Font.Charset:=R.ReadInteger('CharSet');
		Font.Size:=R.ReadInteger('Size');
		FontStyleInt:=R.ReadInteger('Style');
		Move(FontStyleInt,FS,1);
		Font.Style:=FS;
	finally
		R.Free;
	end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
	If FontDialog1.Execute then
	begin
		SaveFontToRegistry(FontDialog1.Font,'Delphi Kingdom\Fonts');
	end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
	NFont : TFont;
begin
	NFont:=TFont.Create;
	if ReadFontFromRegistry(NFont,'Delphi Kingdom\Fonts') then begin / / тут додати перевірку - чи існує шрифт
		Label1.Font.Assign(NFont);
		NFont.Free;
	end;
end;
Наверх до змісту

Питання: Як переміщати компонент мишкою під час роботи програми "runtime"? Відповідь:

Перехопити подія OnMouseDown, запам’ятати x і y коордінти курсора миші. Відстежувати рух миші за подією OnMouseMove і переміщати компонент слідом за курсором миші до тих пір поки не відбудеться подія OnMouseUp. У прикладі показано переміщення компонента TButton. Переміщення починається, коли користувач “бере” TButton мишею, утримуючи клавішу “Сontrol”.

Приклад:
type
	TForm1 = class(TForm)
		Button1: TButton;
		procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
				Shift: TShiftState; X, Y: Integer);
		procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
				Y: Integer);
		procedure Button1MouseUp(Sender: TObject; Button: 
				TMouseButton; Shift: TShiftState; X, Y: Integer);
	private
		{Private declarations}
	public
		{Public declarations}
		MouseDownSpot : TPoint;
		Capturing : bool;
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
					Shift: TShiftState; X, Y: Integer);
begin
	if ssCtrl in Shift then
	begin 
		SetCapture(Button1.Handle);
		Capturing := true;
		MouseDownSpot.X := x;
		MouseDownSpot.Y := Y;
	end;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
	if Capturing then
	begin
		Button1.Left := Button1.Left - (MouseDownSpot.x - x);
		Button1.Top := Button1.Top - (MouseDownSpot.y - y);
	end;
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button:
			TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
	if Capturing then
	begin
		ReleaseCapture;
		Capturing := false;
		Button1.Left := Button1.Left - (MouseDownSpot.x - x);
		Button1.Top := Button1.Top - (MouseDownSpot.y - y);
	end;
end;
Наверх до змісту

Питання: При спробі створити об'єкт класу TPrinter (TPrinter.Create) я отримую exception. Чому? Відповідь: У створенні об'єкта класу TPrinter з використанням TPrinter.Create немає необхідності, так як об'єкт класу TPrinter (званий Printer) автоматично створюється при використанні модуля Printers. Приклад: uses Printers; procedure TForm1.Button1Click(Sender: TObject); begin Printer.BeginDoc; Printer.Canvas.TextOut(100, 100, 'Hello World!'); Printer.EndDoc; end; Наверх до змісту
Питання: Як перехопити події в неклієнтську області форми, в заголовку вікна, наприклад? Відповідь: Створіть обробник одного з повідомлень WM_NC (non client - не клієнтських) (подивіться WM_NC в Windows API help). Приклад показує як перехопити ДОРОЗІ миші у всій некліенстской області вікна (рамка і заголовок). Приклад: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) private {Private declarations} procedure WMNCMOUSEMOVE(var Message: TMessage); message WM_NCMOUSEMOVE; public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCMOUSEMOVE(var Message: TMessage); var s : string; begin case Message.wParam of HTERROR: s:= 'HTERROR'; HTTRANSPARENT: s:= 'HTTRANSPARENT'; HTNOWHERE: s:= 'HTNOWHERE'; HTCLIENT: s:= 'HTCLIENT'; HTCAPTION: s:= 'HTCAPTION'; HTSYSMENU: s:= 'HTSYSMENU'; HTSIZE: s:= 'HTSIZE'; HTMENU: s:= 'HTMENU'; HTHSCROLL: s:= 'HTHSCROLL'; HTVSCROLL: s:= 'HTVSCROLL'; HTMINBUTTON: s:= 'HTMINBUTTON'; HTMAXBUTTON: s:= 'HTMAXBUTTON'; HTLEFT: s:= 'HTLEFT'; HTRIGHT: s:= 'HTRIGHT'; HTTOP: s := 'HTTOP'; HTTOPLEFT: s:= 'HTTOPLEFT'; HTTOPRIGHT: s:= 'HTTOPRIGHT'; HTBOTTOM: s:= 'HTBOTTOM'; HTBOTTOMLEFT: s:= 'HTBOTTOMLEFT'; HTBOTTOMRIGHT: s:= 'HTBOTTOMRIGHT'; HTBORDER: s:= 'HTBORDER'; HTOBJECT: s:= 'HTOBJECT'; HTCLOSE: s:= 'HTCLOSE'; HTHELP: s:= 'HTHELP'; else s:= ''; end; Form1.Caption := s; Message.Result := 0; end; end. Наверх до змісту
Питання: При спробі використовувати метод TCanvas.StretchDraw щоб намалювати іконку збільшеною її розмір не змінюється. Що робити? Відповідь: Іконки завжди малюються розміром прийнятим в системі. Щоб показати збільшений вигляд іконки скопріуйте її на bitmap, а потім на внутрішню використовуйте метод TCanvas.StretchDraw. Приклад: procedure TForm1.Button1Click(Sender: TObject); var TheBitmap : TBitmap; begin TheBitmap := TBitmap.Create; TheBitmap.Width := Application.Icon.Width; TheBitmap.Height := Application.Icon.Height; TheBitmap.Canvas.Draw(0, 0, Application.Icon); Form1.Canvas.StretchDraw(Rect(0,0,TheBitmap.Width * 3,TheBitmap.Height * 3), TheBitmap); TheBitmap.Free; end; Наверх до змісту
Питання: Чи можна зробити так щоб TStringGrid автоматично змінював ширину колонок, щоб вмістити найдовшу рядок у колонці? Відповідь: Див приклад. Приклад: procedure AutoSizeGridColumn(Grid : TStringGrid; column : integer); var i : integer; temp : integer; max : integer; begin max := 0; for i := 0 to (Grid.RowCount - 1) do begin temp := Grid.Canvas.TextWidth(grid.cells[column, i]); if temp > max then max := temp; end; Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3; end; procedure TForm1.Button1Click(Sender: TObject); begin AutoSizeGridColumn(StringGrid1, 1); end; Наверх до змісту
Питання: TTimer працює не досить точно. Як отримати більш високу точність? Відповідь:

Таймер Windows не був створений з метою отримання надточного хронометра. 🙁 Іншими словами, коли Ви встановлюєте таймер на спрацювання кожні 1000 мілісекунд, він може спрацьовувати через інтервал трохи більший ніж 1000 мілісекунд. Значення менше 55 мілісекунд ніколи не будуть спрацьовувати вчасно в Windows, оскільки це мінімальна точність таймера. Можна перевіряти системний час і порівнювати його з часом попереднього події таймера щоб підвищити точність.

Наверх до змісту

Питання: Як помістити JPEG-зображення в exe-файл і потім завантажити її? Відповідь: 1) Створіть текстовий файл з розширенням ". Rc". Ім'я цього файлу повинна відрізнятися від імені файлу-пректу або будь-якого модуля проекту. Файл повинен містити рядок на кшталт: MYJPEG JPEG C: \ DownLoad \ MY.JPG де: "MYJPEG" ім'я ресурсу "JPEG" користувальницький тип ресурсу "C: \ DownLoad \ MY.JPG" Руть до JPEG файлу. Нехай наприклад rc-файл називається "foo.rc" Запустіть BRCC32.exe (Borland Resource CommandLine Compiler) - програма знаходиться в каталозі Bin Delphi / C + + Builder'а - передавши їй як параметр повний шлях до rc-файлу. У нашому прикладі: C:\DelphiPath\BIN\BRCC32.EXE C:\ProjectPath\FOO.RC Ви отримаєте відкомпільований ресурс - файл з розширенням ". Res". (В нашому випадку foo.res). Далі додайте ресурс до свого додатком. {Вантажимо ресурс} {$R FOO.RES} uses Jpeg; procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture); var ResHandle : THandle; MemHandle : THandle; MemStream : TMemoryStream; ResPtr : PByte; ResSize : Longint; JPEGImage : TJPEGImage; begin ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG'); MemHandle := LoadResource(hInstance, ResHandle); ResPtr := LockResource(MemHandle); MemStream := TMemoryStream.Create; JPEGImage := TJPEGImage.Create; ResSize := SizeOfResource(hInstance, ResHandle); MemStream.SetSize(ResSize); MemStream.Write(ResPtr^, ResSize); FreeResource(MemHandle); MemStream.Seek(0, 0); JPEGImage.LoadFromStream(MemStream); ThePicture.Assign(JPEGImage); JPEGImage.Free; MemStream.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin LoadJPEGFromRes('MYJPEG', Image1.Picture); end; Наверх до змісту
Питання: Як перехопити повідомлення прокрутки в TScrollBox? Відповідь: Наступний приклад перехоплює повідомлення про прокрутку компонента TScrollBox і синхронізує обидві лінійки прокрутки. Повідомлення прокрутки перехоплюються за допомогою перевизначення окнной процедури (WinProc) ScrollBox'а. Приклад: type {$IFDEF WIN32} WParameter = LongInt; {$ELSE} WParameter = Word; {$ENDIF} LParameter = LongInt; {Declare a variable to hold the window procedure we are replacing} var OldWindowProc : Pointer; function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter; ParamL : LParameter) : LongInt {$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF} var TheRangeMin : integer; TheRangeMax : integer; TheRange : integer; begin if TheMessage = WM_VSCROLL then begin {Get the min and max range of the horizontal scroll box} GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax); {Get the vertical scroll box position} TheRange := GetScrollPos(WindowHandle, SB_VERT); {Make sure we wont exceed the range} if TheRange < TheRangeMin then TheRange := TheRangeMin else if TheRange > TheRangeMax then TheRange := TheRangeMax; {Set the horizontal scroll bar} SetScrollPos(WindowHandle, SB_HORZ, TheRange, true); end; if TheMessage = WM_HSCROLL then begin {Get the min and max range of the horizontal scroll box} GetScrollRange(WindowHandle, SB_VERT, heRangeMin, TheRangeMax); {Get the horizontal scroll box position} TheRange := GetScrollPos(WindowHandle, SB_HORZ); {Make sure we wont exceed the range} if TheRange < TheRangeMin then TheRange := TheRangeMin else if TheRange > TheRangeMax then TheRange := TheRangeMax; {Set the vertical scroll bar} SetScrollPos(WindowHandle, SB_VERT, TheRange, true); end; {Call the old Window procedure to allow processing of the message.} NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL); end; procedure TForm1.FormCreate(Sender: TObject); begin {Set the new window procedure for the control and remember the old window procedure.} OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(@NewWindowProc))); end; procedure TForm1.FormDestroy(Sender: TObject); begin {Set the window procedure back to the old window procedure.} SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc)); end; Наверх до змісту
Питання: Як зробити прямокутник для виділення частини картинки для редагування? Відповідь:

Найпростіший спосіб – скористатися функцією Windows API DrawFocusRect. Функція DrawFocusRect використовує операцію XOR при малюванні – таким чином висновок прямокутника двічі з одними і тими ж координатами стирає прямокутник, і прямокутник завжди буде видно, на тлі якого б кольору він не виводився.

Приклад:
type
	TForm1 = class(TForm)
		procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
				Shift: TShiftState; X, Y: Integer);
		procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
				Y: Integer);
		procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
				Shift: TShiftState; X, Y: Integer);
	private
		{Private declarations}
		Capturing : bool;
		Captured : bool;
		StartPlace : TPoint;
		EndPlace : TPoint;
	public
		{Public declarations}
end;
var
	Form1: TForm1;
implementation
{$R *.DFM}
function MakeRect(Pt1 : TPoint; Pt2 : TPoint) : TRect;
begin
	if pt1.x < pt2.x then
		begin
			Result.Left := pt1.x;
			Result.Right := pt2.x;
		end
	else
		begin
			Result.Left := pt2.x;
			Result.Right := pt1.x;
		end;
	if pt1.y < pt2.y then
		begin
			Result.Top := pt1.y;
			Result.Bottom := pt2.y;
		end
	else
	begin
		Result.Top := pt2.y;
		Result.Bottom := pt1.y;
	end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
		Shift: TShiftState; X, Y: Integer);
begin
	if Captured then
		DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));
	StartPlace.x := X;
	StartPlace.y := Y;
	EndPlace.x := X;
	EndPlace.y := Y;
	DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));
	Capturing := true;
	Captured := true;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
		Y: Integer);
begin
	if Capturing then
	begin
		DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));
		EndPlace.x := X;
		EndPlace.y := Y;
		DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));
	end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
		Shift: TShiftState; X, Y: Integer);
begin
	Capturing := false;
end;
Наверх до змісту

Питання: Чи можна використовувати іконку як картинку на кнопці TSpeedButton? Відповідь: Можна. Див приклад. Приклад: uses ShellApi; procedure TForm1.FormShow(Sender: TObject); var Icon: TIcon; begin Icon := TIcon.Create; Icon.Handle := ExtractIcon(0,'C:\WINDOWS\NOTEPAD.EXE',1); SpeedButton1.Glyph.Width := Icon.Width; SpeedButton1.Glyph.Height := Icon.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, Icon); Icon.Free; end; Наверх до змісту
Питання: Як помістити прозору фонову каринку на компонент CoolBar? Відповідь: procedure TForm1.Button1Click(Sender: TObject); var Bm1 : TBitmap; Bm2 : TBitmap; begin Bm1 := TBitmap.Create; Bm2 := TBitmap.Create; Bm1.LoadFromFile('c:\download\test.bmp'); Bm2.Width := Bm1.Width; Bm2.Height := Bm1.Height; bm2.Canvas.Brush.Color := CoolBar1.Color; bm2.Canvas.BrushCopy(Rect(0, 0, bm2.Width, bm2.Height), Bm1, Rect(0, 0, Bm1.width, Bm1.Height), ClWhite); bm1.Free; CoolBar1.Bitmap.Assign(bm2); bm2.Free; end; Наверх до змісту
Питання: Повзунок компонента TScrollBar весь час блимає. Як це відключити? Відповідь: Встановіть свойтсва ScrollBar.TabStop в False. Наверх до змісту
Питання: Як програмно перевести DBgrid в Реім редагування і встановити курсор в віконці редагування в необхідну позицію? Відповідь:

Переведіть таблицю в режим редагування, потім отримаєте дескриптор (handle) вікна редагування і перешліть їй повідомлення EM_SETSEL. Як параметри ви повинні переслати початкову позицію курсора, і кінцеву позицію, визначальну кінець виділення тексту кольором. У наведеному прикладі курсор поміщається в другу позицію, текст усередині осередку не виділяється.

Приклад:
procedure TForm1.Button1Click(Sender: TObject);
var
	h : THandle;
begin
	Application.ProcessMessages;
	DbGrid1.SetFocus;
	DbGrid1.EditorMode := true;
	Application.ProcessMessages;
	h:= Windows.GetFocus;
	SendMessage(h, EM_SETSEL, 2, 2);
end;
Наверх до змісту

Питання: Як помістити курсор в певну позицію edit'а і подібних йому елементів управління? Відповідь: Можна використовувати методи Delphi SelStart () і SelectLength (). Приклад: procedure TForm1.Button1Click(Sender: TObject); begin Edit1.SetFocus; {Переводимо курсор в другу позицію} Edit1.SelStart := 2; {Не виділяємо ніякого тексту} Edit1.SelLength := 0; end; Наверх до змісту
Питання: Як зреагувати на мінімізацію-максимізацію форми перед тим як відбудеться зміна розміру форми? Відповідь: У прикладі перехоплюється повідомлення WM_SYSCOMMAND. Якщо це повідомлення говорить про мінімізації або максимізації форми - пищить динамік. Приклад: type TForm1 = class(TForm) private {Private declarations} procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMSysCommand; begin if (Msg.CmdType = SC_MINIMIZE) or (Msg.CmdType = SC_MAXIMIZE) then MessageBeep(0) else inherited; end; Наверх до змісту
Питання: Чи можна зробити так - одна форма показує іншу і залишається позаду неї, але фокус введення не переходить до нової форми, а залишається у старої? Відповідь: У прикладі показується не автосоздаваемая (non auto-created) форма, але фокус введення їй не передається. Приклад: uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin Form2 := TForm2.Create(Application); Form2.Visible := FALSE; ShowWindow(Form2.Handle, SW_SHOWNA); end; Наверх до змісту
Питання: На деяких laptop комп'ютерах може не бути флоппі дисковода. Чи можна видаляти зі списку TDriveComboBox диски які відключені? Відповідь: У прикладі TDriveComboBox не показує дисководи, які не готові. (Not ready). Врахуйте що на багатьох комп'ютерах буде відчутна затримка при повірці plug & play флоппі дисковода. Приклад: procedure TForm1.FormCreate(Sender: TObject); var i : integer; OldErrorMode : Word; OldDirectory : string; begin OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); GetDir(0, OldDirectory); i := 0; while i <= DriveComboBox1.Items.Count - 1 do begin {$I-} ChDir(DriveComboBox1.Items[i][1] + ':\'); {$I+} if IoResult <> 0 then DriveComboBox1.Items.Delete(i) else inc(i); end; ChDir(OldDirectory); SetErrorMode(OldErrorMode); end; Наверх до змісту
Питання: Як повідомити всім формам мого додатки (у тому числі і не видимим в даний момент) про ізміненій якихось глобальних значень? Відповідь: Один із способів - створити користувальницьке повідомлення і використовувати метод preform щоб розіслати його всім формам з масиву Screen.Forms. Приклад: {Code for Unit1} const UM_MyGlobalMessage = WM_USER + 1; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private {Private declarations} procedure UMMyGlobalMessage(var AMessage: TMessage); message UM_MyGlobalMessage; public {Public declarations} end; var Form1: TForm1; implementation {$R *.DFM} uses Unit2; procedure TForm1.FormShow(Sender: TObject); begin Form2.Show; end; procedure TForm1.UMMyGlobalMessage(var AMessage: TMessage); begin Label1.Left := AMessage.WParam; Label1.Top := AMessage.LParam; Form1.Caption := 'Got It!'; end; procedure TForm1.Button1Click(Sender: TObject); var f: integer; begin for f := 0 to Screen.FormCount - 1 do Screen.Forms[f].Perform(UM_MyGlobalMessage, 42, 42); end; {Code for Unit2} const UM_MyGlobalMessage = WM_USER + 1; type TForm2 = class(TForm) Label1: TLabel; private {Private declarations} procedure UMMyGlobalMessage(var AMessage: TMessage); message UM_MyGlobalMessage; public {Public declarations} end; var Form2: TForm2; implementation {$R *.DFM} procedure TForm2.UMMyGlobalMessage(var AMessage: TMessage); begin Label1.Left := AMessage.WParam; Label1.Top := AMessage.LParam; Form2.Caption := 'Got It!'; end; Наверх до змісту
Питання: Як оновити список дисків компонента TDriveComboBox, враховуючи, що могуд бути підключені / відключені мережеві диски і проведена "гаряча заміна" plug & 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; Наверх до змісту
Питання: Як програмно змусити випасти меню? Відповідь:

У прикладі показано як показати меню і вибрати в ньому якийсь пункт, емулюючи натискання “швидкої кдавіші” пункту меню. Якщо у Вашого пункту меню немає “швидкої клавіші “Ви можете посилати комбінації VK_MENU, VK_LEFT, VK_DOWN, і VK_RETURN, щоб програмно “подорожувати” по меню.

Приклад:
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;
Наверх до змісту

Питання: Як зробити клавішу-акселератор (keyboard shortcut) компонент у якого немає заголовка? Відповідь:

Можливий варіант – привласнити посилання на цей компонент властивості FocusControl TLabel’а. У прикладі використовується невидимий Label для створення “швидкої” клавіші (Alt + M) компонента Memo. Щоб використовувати приклад, розмістіть на формі компонент TMemo, Label і кілька інших компонентів, які можуть приймати фокус вводу. Запустіть програму, перевід фокус введення кудись поза Memo і натисніть Alt + M – фокус введення повернеться в Memo.

Приклад:
procedure TForm1.FormCreate(Sender: TObject);
begin
	Label1.Visible := false;
	Label1.Caption := '&M';
	Label1.FocusControl := Memo1;
end;
Наверх до змісту

Питання: Чи можна якось зменшити мерехтіння при перемальовуванні компонента? Відповідь: Якщо додати прапор csOpaque (непрозорий) до властивості ControlStyle компонента - То фон компонента перемальовувати не буде. Приклад: constructor TMyControl.Create; begin inherited; ControlStyle := ControlStyle + [csOpaque]; end; Наверх до змісту
Питання: Як заборонити зміну розміру мого компонента в design-time? Відповідь: Помістіть в конструктор компонента код, який встановлює розміри за умовчанням. Перевизначите метод SetBounds і перевіряйте в ньому "componentstate". Якщо компонет знаходиться режимі "design-time" (csDesigning in ComponentState) просто передавайте значення ширини і висоти (width і heights) компонента за замовчуванням (в нашому прикладі 50) методу класу-предка. Приклад: 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; Наверх до змісту
Питання: Чи можна зменшити споживані компонентами 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: TObject; NewTab: Integer; var AllowChange: Boolean); begin with Notebook1 do / / викликаємо захищений метод батьківського класу TMyNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle; NoteBook1.PageIndex := NewTab; AllowChange := true end; Наверх до змісту
Питання: Функція keybd_event () приймає значення до 244 - як мені відправити натискання клавіші з кодом # 255 в елемент управління Windows? Відповідь: Це може знадобиться для іноземних мов або для спеціальних символів. (Наприклад, в російських шрифтах символ з кодом # 255 - я прописне). Наведений у прикладі метод, не варто використовувати в разі якщо символ може бути переданий звичайним способом (Функцією keybd_event ()). 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; Наверх до змісту
Питання: Деякі компоненти не міняють курсор миші до тих пір поки користувач не зрушить миша. Як емулювати рух миші? Відповідь: У прикладі мишка злегка "підштовхується" без участі користувача. 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; Наверх до змісту
Питання: Як зареєструвати розширення файлу за своїм додатком і контекстне меню, пов'язане з цим типом? Відповідь: Приклад реєструє розширення файлу (. Myext) - файли цього типу будуть відкриватися додатком MyApp.Exe. Також регнстріруется одну дію (action) за замовчуванням для файлів цього типу і два додаткових пункти контекстного меню, пов'язаного з цим типом файлів. Можливо, буде потрібно перезайти в систему щоб зміни вступили в силу. Приклад: 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; Наверх до змісту

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*