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] ofByte;
Картинка будет иметь размер 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 .
procedureTForm1.Edit1KeyPress(Sender: TObject; varKey: Char);
begin
ifKey = #13 then
begin
SelectNext(Sender asTWinControl, True, True);
Key := #0;
end;
end;
Теперь Enter ведет себя как Tab. Затем, выберите все объекты, которые должны вести себя как Edit1 (за исключением кнопок) и в Object Inspector установите обработчик OnKeyPress в Edit1KeyPress . Каждый выбранный вами объект воспринимает Enter как Tab. Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress — обработчик OnKeyPress для формы:
procedureTForm1.FormKeyPress(Sender: TObject; varKey: Char);
begin
ifKey = #13 then
begin
SelectNext(Sender asTWinControl, True, True);
Key := #0;
end;
end;
Все объекты на форме будут воспринимать Enter как Tab.
Общие вопросы по Delphi и данному FAQ (часть 3)
Object Pascal и Windows API
1. Как работает информация времени выполнения (RTTI)?
Имеются два новых оператора: asи is. as — оператор защищенного преобразования типов (typecasting). Вы можете использовать его, чтобы заставить компилятор преобразовать объект из одного типа в другой, но, если в во время выполнения эти типы окажутся несовместимыми, то вы получите ошибку. Hапример, если вы имеете класс TSport , с потомоками TBasketball и TFootball , вам может потребоваться переменная типа TSport ; далее может так случиться, что в программе эта переменная будет фактически содержать экземпляр типа TFootball . Тогда вы можете обратиться к этой переменной
Читать дальше