Можно ли программно установить произвольную строку в первую позицию TListBox?
Для установки любой строки в произвольную позицию в окне TListBox можно послать сообщение:
SendMessage(ListBox1.Handle, lb_SetTopIndex, SpinEdit1.Value-1, 0);
где первым параметром передается указатель на компонент, вторым - сообщение, третьим - номер устанавливаемой строки и позиция в окне на которую перемещается указанная строка.
Строки нумеруются с нуля.
Пример:
procedure TForm1.SpinEdit1Change(Sender: TObject); begin TRY SendMessage(ListBox1.Handle, lb_SetTopIndex, SpinEdit1.Value-1,0); FINALLY END; end;
Как изменить цвет ячейки TDBGrid в зависимости от текущего значения?
Для изменения цвета некоторых ячеек таблицы TDBGrid необходимо определить реакцию на событие DBGrid1DrawDataCell и проверив необходимые условия, перерисовать ячейку вручную (если в этом есть необходимость).
Все необходимые данные для отрисовки передаются в параметрах процедуры.
Пример:
Отрисовка белых букв на красном фоне если, перерисовывается поле 'First_I', ячейка не в фокусе и значение поля меньше нуля.
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin WITH DBGrid1.Canvas DO IF (Field.FieldName = 'First_I') AND (NOT (gdFocused in State)) AND (Field.AsInteger < 0) THEN BEGIN Brush.Color := clRed; Font.Color := clWhite; DBGrid1.DefaultDrawDataCell(Rect, Field, State); END; end;
Как получить позицию курсора в компоненте TMemo?
В компоненте TMemo предусмотрено получение позиции курсора через механизм сообщений. Для получения позиции необходимо послать два сообщения. Первое -
LineNum := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
для получения номера строки в которой находится курсор. И второе -
CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0);
для получения позиции курсора в заданной строке. Будте внимательны, так как номер строки и позиция в строке отсчитываются от нуля.
Пример:
{Получаем позицию курсора при щелчке мыши на компоненте} procedure TForm1.Memo1Click(Sender: TObject); VAR LineNum : LongInt; CharNum : LongInt; begin {Получаем номер строки} LineNum := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); {Получаем позицию в строке} CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0); {Выводим позицию на экран} Label1.Caption := IntToStr(LineNum+1)+' : '+ IntToStr((Memo1.SelStart-CharNum)+1); end; ............ {Получаем позицию курсора при отпускании клавиши на клавиатуре} procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Memo1Click(Self); end;
В каких случаях и для чего нужно поле Tag?
Поле Tag введено разработчиками во все компоненты специально и исключительно для нужд программиста и может быть использовано в любое время и для любых целей. Компоненты никогда сами не используют это поле.
Можно ли получить горизонтальную полосу прокрутки в компоненте ListBox?
Можно. Для этого компоненте ListBox в нужный момент посылается сообщение LB_SetHorizontalextent, указывающее на необходимость отобразить горизонтальную полосу прокрутки.
Пример:
ListBox1.Perform(LB_SetHorizontalextent, 400, Longint(0));
где:
400 - размер области прокручивания в пикселах,
Longint(0) - параметр не используется.