Виртуальная библиотека Delphi - [52]

Шрифт
Интервал

. Естественно, что этим же способом можно обмениваться информацией с BLOB-полями произвольного типа.


16. Как показать содержимое Memo поля в TDBGrid?

Используйте следующий код для обработки события 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. Как обрабатывать события от множества однотипных компонентов.

На моей форме находится примерно 10 кнопок. Я хочу обрабатывать нажатие на любую из них одним событием, но как их отличить внутри обработчика события?

Для этого базовый класс VCL TComponent имеет поле Tag типа Longint. В момент разработки вы можете присвоить этому полю любое значение, а в момент исполнения использовать его (или переопределять). В вашей ситуации достаточно присвоить полю ButtonX.Tag значение от 1 до 10 (или от 0 до 9, как удобнее), а в обработчике написать примерно следующее:  

>procedure MyForm.Button1Click(Sender: TObject); 

>begin 

case (Sender as TComponent).Tag of 

>    1: {...}

>    2: {...}

>    3: {...}

end

>end;    


22. Использование TPanel в качестве "индикатора".

Я пытаюсь использовать TPanel как индикатор процесса обновления БД.  Однако надпись на панели не обновляется пока не закончится цикл обработки БД. В цикле вызывается Panel.Caption := ...

После присвоения Panel.Caption вызывайте Panel.Refresh или Application.ProcessMessages (второй вариант предпочтительней, так как позволяет перерисовать себя всем клмплнентам, которые в этом нуждаются).


23. Включение и выключение подсказок (Hints) для всех элементов на форме.

Если ваша форма содержит панель подсказки в нижней части формы, то вы можете определить подменю для этой панели, и выставлять Form.ShowHint в True или False в зависимости от состояния Checked элемента меню.

Например, в TMenuItem.OnClick напишите:

>ShowHint := not (Sender as TMenuItem).Checked;

В результате на локальном меню панели будет видно, включены подсказки для всех элементов или нет.


Еще от автора Неизвестный Автор
Галчонок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Призраки ночи

В книге собраны предания и поверья о призраках ночи — колдунах и ведьмах, оборотнях и вампирах, один вид которых вызывал неподдельный страх, леденивший даже мужественное сердце.


Закат  вечности

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


mmmavro.org | День 131, Победа

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Песнь о Нибелунгах

…«Песнь о Нибелунгах» принадлежит к числу наиболее известных эпических произведений человечества. Она находится в кругу таких творений, как поэмы Гомера и «Песнь о Роланде», «Слово о полку Игореве» и «Божественная комедия» Данте — если оставаться в пределе европейских литератур…В. Г. Адмони.


mmmavro.org | День 132, Поэт

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.



DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.