Button1ID: SomeProcedure;
Button2ID: AnotherProcedure;
end;
Таким образом вы можете обрабатывать события как от однотипных компонент, так и от компонент разного типа.
21. Как обрабатывать события от множества однотипных компонентов.
На моей форме находится примерно 10 кнопок. Я хочу обрабатывать нажатие на любую из них одним событием, но как их отличить внутри обработчика события?
Для этого базовый класс VCL TComponent имеет поле Tag типа Longint. В момент разработки вы можете присвоить этому полю любое значение, а в момент исполнения использовать его (или переопределять). В вашей ситуации достаточно присвоить полю ButtonX.Tag значение от 1 до 10 (или от 0 до 9, как удобнее), а в обработчике написать примерно следующее:
procedure MyForm.Button1Click(Sender: TObject);
begin
case (Sender as TComponent).Tag of
1: {...};
2: {...};
3: {...};
end;
end;
22. Использование TPanel в качестве "индикатора".
Я пытаюсь использовать TPanel как индикатор процесса обновления БД. Однако надпись на панели не обновляется пока не закончится цикл обработки БД. В цикле вызывается Panel.Caption := ...
После присвоения Panel.Caption вызывайте Panel.Refresh или Application.ProcessMessages (второй вариант предпочтительней, так как позволяет перерисовать себя всем клмплнентам, которые в этом нуждаются).
23. Включение и выключение подсказок (Hints) для всех элементов на форме.
Если ваша форма содержит панель подсказки в нижней части формы, то вы можете определить подменю для этой панели, и выставлять Form.ShowHint в True или False в зависимости от состояния Checked элемента меню.
Например, в TMenuItem.OnClick напишите:
ShowHint := not (Sender as TMenuItem).Checked;
В результате на локальном меню панели будет видно, включены подсказки для всех элементов или нет.
24. Как в меню поместить bitmap?
Можно поступить таким образом:
var
Bmp1: TBitmap;
begin
Bmp1 := TBitmap.Create;
Bmp1.LoadFromFile('C:\WHERE\B1.BMP');
SetMenuItemBitmaps(MenuItemTest.Handle, 0, MF_BYPOSITION, Bmp1.Handle, Bmp1.Handle);
end;
Параметры:
• MenuItemTest — имя пункта меню (горизонтальная строка)
• 0,1 ... — позиция пункта меню, в который надо вставить BMP
• первый Handle — для показа невыбранного пункта меню (Unchecked)
• второй Handle — для выбранного (Checked). Они могут быть разные
Код можно вставить в обработчик OnCreate для формы. При уничтожении меню TBitmap не уничтожается, это надо делать отдельно.
25. Каким образом можно поместить двумерный массив в TImage?
Представим, что данные находятся в массиве:
TestArray: array [0..127, 0..127] of Byte;
Картинка будет иметь размер 128×128 точек:
Image1.Picture.Bitmap.Width := 128;
Image1.Picture.Bitmap.Height := 128;
Вызываем функцию Windows API для формирования bitmap:
SetBitmapBits(Image1.Picture.Bitmap.Handle, SizeOf(TestArray), @TestArray);
Image1.Refresh; { для того, чтобы изменения отобразились }
Однако, если вы используете свою палитру, то ее нужно создавать специально.
26. Как из программы 'открыть' TComboBox?
У TComboBox есть run-time свойство, не упомянутое в on-line help — DroppedDown.
Для открытия ComboBox напишите:
ComboBox1.DroppedDown := True;
Естественно, False закроет его.
27. Как заменить надпись 'Read only' в компонентах TSaveDialog и TOpenDialog?
Попробуйте посмотреть в Windows API Help разделы, связанные с lpTemplateName. Вообще говоря, вы можете заменить стандартный Open Dialog Box своим собственным шаблоном.
28. Проблема в использовании компонента TCustomGrid.
Делаю так:
1. Создаю новый компонент при помощи Эксперта Компонент
2. Имя класса TSampleCalendar
3. Имя родителя TCustomGrid
4. Использую страницу 'Samples'
5. Сохраняю модуль с именем CALSAMP.PAS
6. Подключаю к Палитре компонент
7. Создаю форму, помещаю новый компонент на форму и получаю Runtime Error 210 В чем дело?
Проблема в том, что TCustomGrid имеет метод DrawCell, который является абстрактным. То, что его безусловно надо переписывать у любого наследника TCustomGrid, к сожалению, не отражено в документации. Создайте этот метод (пусть даже пустой) и ваша проблема исчезнет.
29. Как установить формат для поля таблицы?
В Fields Editor выберите поле для форматирования. Используя свойства DisplayFormat и EditFormat сделайте то, что нужно. DisplayFormat работает для поля, на которое не установлен фокус. EditFormat работает для поля, на которое фокус установлен. Форматирование аналогично первому параметру в функции FormatFloat, но без скобок.
30. Можно ли использовать клавишу ENTER при вводе данных для перехода от поля к полю?
Используйте данный код для события OnKeyPress компонента TEdit.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
SelectNext(Sender as TWinControl, True, True);
Key := #0;
end;
end;
Теперь Enter ведет себя как Tab. Затем, выберите все объекты, которые должны вести себя как Edit1 (за исключением кнопок) и в Object Inspector установите обработчик OnKeyPress в Edit1KeyPress. Каждый выбранный вами объект воспринимает Enter как Tab. Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress — обработчик OnKeyPress для формы: