Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

begin

 GetPosition(RichEdit);

end;

procedure TForm1.RichEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

 GetPosition(RichEdit);

end;
 

RadioGroup 

Группа

радиокнопок и ActiveControl

На форме я имею группу радиокнопок. Я хотел бы вызывать контекстно-зависимую подсказку, если пользователь нажал F1. Для данной конкретной группы радиокнопок я установил HelpContext равным 22, но при любом вызове ActiveControl.HelpContext это возвращает (0). Все другие элементы управления работают как положено. Что я делаю неправильно?

Нет. Проблема в том, что ActiveControl – RadioButton, а не RadioButtonGroup. Поместите следующий код в обработчик события формы OnShow, он должен решить вашу проблему:

procedure TForm1.FormShow(Sender: TObject);

var c: integer;

begin

 with RadioGroup1 do begin

for c := 0 to ControlCount – 1 do TRadioButton(Controls[c]).HelpContext := HelpContext;

 end;

end;

– Ralph Friedman 

ScrollBar 

Мерцание ScrollBar

TScrollBar в Delphi мигает при получении фокуса. Как избежать этого мерцания?

Такая же проблема и при перемещении стандартного бегунка полосы прокрутки. Лечится одинаково: установкой свойства TabStop в False.

– Rick Rogers 

SpeedButton 

Speedbutton и Glyph

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

Например, если в вашем проекте используется TDBGrid, то иконки кнопок компонента DBNavigator могут линковаться вашей программой, и их можно загрузить для использования в ваших speedbutton следующим образом:

SpeedButton.Caption := '';

SpeedButton1.Glyph.LoadFromResourcename(HInstance,'DBN_REFRESH');

SpeedButton1.NumGlyphs := 2;

Другие зарезервированные имена:

DBN_PRIOR, DBN_DELETE, DBN_CANCEL, DBN_EDIT, DBN_FIRST, DBN_INSERT, DBN_LAST, DBN_NEXT, DBN_POST

Все имена должны использовать верхний регистр.

– Dennis Passmore 

StringGrid 

Обновление картинки в ячейке StringGrid

SottNick советует:

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

значения в двумерном массиве, и вам надо, чтобы после изменения значения в массиве обновилось изображение (Refresh не подходит, т.к. будет мелькать), то измените значение у ячейки (DrawGrid не годится):

StringGrid1.Cells[i,j]:='';

или

StringGrid1.Cells[i,j]:=StringGrid1.Cells[i,j];

если там что-то хранится.

Многострочность в заголовках колонок StringGrid

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

Индекс Фондовой Биржи

показывалось бы как

 Индекс

 Фондовой

 Биржи

было бы классно, если можно было этот заголовок размещать еще и по центру.

Рисовать сами ячейки вы можете в обработчике события OnDrawCell. Для определения ячейки (заголовок?), обрабатываемой в текущий момент, используйте параметр GridState.

Я выводил тест с помощью обычных методов рисования (которые хорошо "приживаются" в данном компоненте), с поддержкой вертикального выравнивания, полей и переноса слов. Вот сам код:

TFTVerticalAlignment = (vaTop, vaMiddle, vaBottom);

procedure DrawTextAligned(const Text: string; Canvas: TCanvas; var Rect: TRect; Alignment: TAlignment; VerticalAlignment: TFTVerticalAlignment; WordWrap: Boolean);

var

 P : array[0..255] of Char;

 H : Integer;

 T : TRect;

 F : Word;

begin

 StrPCopy(P, Text);

 T := Rect;

 with Canvas, Rect do begin

F := DT_CALCRECT or DT_EXPANDTABS or DT_VCENTER or TextAlignments[Alignment];

if WordWrap then F := F or DT_WORDBREAK;

H := DrawText(Handle, P, -1, T, F);

H := MinInt(H,Rect.Bottom - Rect.Top);

if VerticalAlignment = vaMiddle then begin

Top := ((Bottom+Top) - H) div 2;

Bottom := Top + H;

end else if VerticalAlignment = vaBottom then Top := Bottom - H - 1;

F := DT_EXPANDTABS or DT_VCENTER or TextAlignments[Alignment];

Поделиться с друзьями: