12. Как получить горизонтальный ScrollBar на ListBox?
Пошлите сообщение LB_SETHORIZONTALEXTENT в ListBox . Например, сообщение может быть отослано в момент создания формы:
procedureTForm1.FormCreate(Sender: TObject);
begin
SendMessage(Listbox1.Handle, LB_SETHORIZONTALEXTENT, 1000, Longint(0));
end;
13. Как определить текущую колонку и строку каретки в компоненте TMemo?
Вы можете использовать сообщения Windows API EM_LINEFROMCHAR и EM_LINEINDEX для определения положения.
var
LineNum: Longint;
CharsBeforeLine: Longint;
begin
LineNum := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);
CharsBeforeLine := SendMessage(Memo1.Handle, EM_LINEINDEX, LineNum, 0);
Label1.Caption := 'Line '+ IntToStr(LineNum + 1)
Lebel2.Caption := 'Position '+ IntToStr(Memo1.SelStart - CharsBeforeLine + 1);
end;
14. Постранична прокрутка TMemo, реализация Undo и определение строки курсора.
Как прокрутить содержимое компонента TMemo ?
Приведенная ниже процедура предполагает, что фокус находится на Edit1 и осуществляет прокрутку в соответствии с нажатыми клавишами.
procedureTForm1.Edit1KeyDown(Sender: TObject; varKey: Word; Shift: TShiftState);
begin
ifKey = VK_F8 then
SendMessage(Memo1.Handle, { HWND для Memo }
WM_VSCROLL, { сообщение Windows }
SB_PAGEDOWN, { на страницу вниз }
0) { не используется }
else ifKey = VK_F7 thenSendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEUP, 0);
end;
Если определено всплывающее (popup) меню для TMemo ,и заданы клавиши для операций Cut, Copy, Paste, то я могу обрабатывать эти события, вызывая методы CutToClipboard, CopyToClipboard, и т.д. Однако, если я поместили пункт Undo в меню (обычно Ctrl+Z), то как дать знать TMemo , что нужно выполнить Undo?
Если встроенного Undo достаточно, то это очень просто:
Memo1.Perform(EM_UNDO, 0, 0);
Для переключения свойства Enabled пункта меню Undo1 :
Undo1.Enabled := Memo1.Perform(EM_CANUNDO, 0, 0) <> 0;
Как можно определить, на какой строке в TMemo находится курсор?
Весь фокус в сообщении EM_LINEFROMCHAR . Попробуйте:
procedureTMyForm.BitBtn1Click(Sender: TObject);
var
ILine: Integer;
begin
ILine := Memo1.Perform(EM_LINEFROMCHAR, $FFFF, 0);
{ Внимание: номера строк начинаются с нуля }
MessageDlg( 'Line Number: '+ IntToStr(ILine), mtInformation, [mbOK], 0);
end;
15. Как поместить BLOB Memo в компонент TMemo?
Попробуйте так:
procedureTForm1.Button1Click(Sender: TObject);
var
S: TBlobStream;
begin
S := TBlobStream.Create(Table1BBBMemo, bmRead);
Memo1.Lines.LoadFromStream(S);
S.Free;
end;
где:
1. Table1BBBMemo — имя поля BLOB Memo ( TMemoField ).
2. Memo1 — имя компонента TMemo . Естественно, что этим же способом можно обмениваться информацией с BLOB-полями произвольного типа.
16. Как показать содержимое Memo поля в TDBGrid?
Используйте следующий код для обработки события OnDrawDataCell у TDBGrid . (Перед запуском программы создайте объект TMemoField для memo поля в Fields Editor).
procedureTForm1.DBGrid1DrawDataCell(Sender: TObject; constRect: TRect; Field: TField; State: TGridDrawState);
var
P: array[0..1023] ofChar; { MemoField buffer }
BS: TBlobStream;
S: string;
begin
ifField isTMemoField then
with(Sender asTDBGrid).Canvas do
begin
{ Table1Notes is the TMemoField }
BS := TBlobStream.Create(Table1Notes, bmRead);
FillChar(P, SizeOf(P), #0);
BS.Read(P, SizeOf(P));
BS.Free;
S := StrPas(P);
{ remove carriage returns & line feeds }
whilePos( #13, S) > 0 doS[Pos( #13, S)] := ' ';
whilePos( #10, S) > 0 doS[Pos( #10, S)] := ' ';
{ clear the cell }
FillRect(Rect);
{ fill cell with memo data }
TextOut(Rect.Left, Rect.Top, S);
end;
end;
17. Не возникает событие TSpeedButton.OnDblClick.
Я создаю событие на SpeedButton1.OnDblClick , но оно, похоже, вообще никогда не возникает. OnClick работает. Что делать?
Читать дальше