Виртуальная библиотека Delphi

Тут можно читать онлайн Виртуальная библиотека Delphi - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Виртуальная библиотека Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 60
    • 1
    • 2
    • 3
    • 4
    • 5

Виртуальная библиотека Delphi краткое содержание

Виртуальная библиотека Delphi - описание и краткое содержание, автор Неизвестный Автор, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Виртуальная библиотека Delphi - читать онлайн бесплатно полную версию (весь текст целиком)

Виртуальная библиотека Delphi - читать книгу онлайн бесплатно, автор Неизвестный Автор
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

end;

картинка 64

Если определено всплывающее (popup) меню для TMemo ,и заданы клавиши для операций Cut, Copy, Paste, то я могу обрабатывать эти события, вызывая методы CutToClipboard, CopyToClipboard, и т.д. Однако, если я поместили пункт Undo в меню (обычно Ctrl+Z), то как дать знать TMemo , что нужно выполнить Undo?

картинка 65

Если встроенного Undo достаточно, то это очень просто:

Memo1.Perform(EM_UNDO, 0, 0);

Для переключения свойства Enabled пункта меню Undo1 :

Undo1.Enabled := Memo1.Perform(EM_CANUNDO, 0, 0) <> 0;

картинка 66

Как можно определить, на какой строке в TMemo находится курсор?

картинка 67

Весь фокус в сообщении 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.

картинка 68

Я создаю событие на SpeedButton1.OnDblClick , но оно, похоже, вообще никогда не возникает. OnClick работает. Что делать?

картинка 69

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

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

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

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

procedureTForm1.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 }

whileGetTickCount < TargetTime do

ifPeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)

thenExit; { Double click }

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

end;

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

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

procedureTForm1.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. Как обрабатывать события от множества однотипных компонентов.

картинка 70

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

картинка 71

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

procedureMyForm.Button1Click(Sender: TObject);

begin

case(Sender asTComponent).Tag of

1: {...} ;

2: {...} ;

3: {...} ;

end;

end;

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

картинка 72

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

картинка 73

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Неизвестный Автор читать все книги автора по порядку

Неизвестный Автор - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Виртуальная библиотека Delphi отзывы


Отзывы читателей о книге Виртуальная библиотека Delphi, автор: Неизвестный Автор. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x