Читаем Виртуальная библиотека Delphi полностью

Используйте следующий код для обработки события OnDrawDataCell у TDBGrid. (Перед запуском программы создайте объект TMemoField для memo поля в Fields Editor).  

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); 

var 

  P: array [0..1023] of Char; { MemoField buffer } 

  BS: TBlobStream; 

  S: string

begin 

  if Field is TMemoField then 

  with (Sender as TDBGrid).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 } 

    while Pos(#13, S) > 0 do S[Pos(#13, S)] := ' '

    while Pos(#10, S) > 0 do S[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 работает. Что делать?

На самом деле работает, только в определенных ситуациях. Если вы помещаете на панель несколько кнопок, то по умолчанию они независимы и соответственно не фиксируются в нажатом состоянии. Поскольку одиночное нажатие мыши на кнопку отрабатывается немедленно, двойной щелчок мыши воспринимается как два нажатия и отпускания. Поэтому OnDblClick и не срабатывает.

Если  же кнопки связаны в группу (GroupIndex <> 0), то они могут фиксироваться, и соответственно могут воспринимать двойной щелчок мыши.

18. Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick.

Именно так и происходит в Windows — посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:  

procedure TForm1.ListBox1Click(Sender: TObject); 

var 

  Msg: TMsg; 

  TargetTime: Longint; 

begin 

{ get the maximum time to wait for a double-click message } 

  TargetTime := GetTickCount + GetDoubleClickTime; 

{ cycle until DblClick received or wait time run out } 

  while GetTickCount < TargetTime do 

  if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE) 

  then Exit; { Double click } 

  MessageDlg('Single clicked', mtInformation, [mbOK], 0); 

end;    

19. Как определить из обработчика события OnClick в Popup.MenuItem, для какого объекта это произошло?

Используйте свойство PopupComponent компонента TPopupMenu для определения, где была нажата правая кнопка.  

procedure TForm1.PopupItem1Click(Sender: TObject); 

begin 

  Label1.Caption := PopupMenu1.PopupComponent.Name; 

end

Свойство ActiveControl для формы тоже можно использовать, однако, ActiveControl не обязательно является тем элементом, для которого произошло событие.

20. Как использовать case, чтобы определить, какой объект вызвал процедуру?

Используйте свойство Tag. Установите значение Tag свое у каждого объекта для опознания. (Использование констант, которые описывают объект — идеально подходит).  

case (Sender as TComponent).Tag of 

  Button1ID: SomeProcedure; 

  Button2ID: AnotherProcedure; 

end

Таким образом вы можете обрабатывать события как от однотипных компонент, так и от компонент разного типа.

21. Как обрабатывать события от множества однотипных компонентов.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных