Ако разработвате приложения за база данни с таблици, съдържащи полета MEMO, ще забележите, че по подразбиране компонентът TDBGrid не показва съдържанието на поле MEMO в клетка на DBGrid.
Тази статия предоставя идея как да решите проблема с TMemoField (с още няколко трика) ...
TMemoField
Полетата за бележки се използват за представяне на дълъг текст или комбинации от текст и числа. Когато изграждате приложения за бази данни с помощта на Delphi, обектът TMemoField се използва за представяне на поле за запомняне в набор от данни. TMemoField капсулира основното поведение, общо с полетата, които съдържат текстови данни или произволна дължина. В повечето бази данни размерът на полето Memo е ограничен от размера на базата данни.
Докато можете да показвате съдържанието на поле MEMO в компонент TDBMemo, като проектирате TDBGrid ще показва само (Memo) "за съдържанието на такива полета.
За да покажете действително някакъв текст (от полето MEMO) в съответната клетка DBGrid, ще трябва само да добавите прост ред код ...
За целта на следващата дискусия, нека да кажем, че имате таблица с база данни, наречена "TestTable" с поне едно поле MEMO, наречено "Данни".
OnGetText
За да покажете съдържанието на поле MEMO в DBGrid, трябва да прикачите прост ред код в полето на полето OnGetText събитие. Най-лесният начин да създадете манипулатора на събитията OnGetText е да използвате редактора на полета по време на проектиране, за да създадете постоянен полев компонент за полето на бележката:
- Свържете вашия TDataset низходящ компонент (TTable, TQuery, TADOTable, TADOQuery ...) към таблицата с база данни "TestTable".
- Щракнете двукратно върху компонента на базата данни, за да отворите редактора на полета
- Добавете полето MEMO към списъка на постоянните полета
- Изберете полето MEMO в редактора на полета
- Активирайте раздела Събития в Object Inspector
- Щракнете двукратно върху събитието OnGetText, за да създадете манипулатора на събитията
Добавете следващия ред код (курсив по-долу):
процедура TForm1.DBTableDataGetText (
Подател: TField;
var Text: String;
DisplayText: Boolean);
започвам
Текст: = Копиране (DBTableData. AsString, 1, 50);
Забележка: обектът на базата данни се нарича "DBTable", полето MEMO се нарича "DATA" и следователно по подразбиране TMemoField, свързано към полето на база данни MEMO, се нарича "DBTableData". Чрез възлагане DBTableData. AsString към Текст параметър на събитието OnGetText, казваме на Delphi да покаже ВСЕКИ текст от полето MEMO в клетка DBGrid.
Можете също адаптирайте Ширината на дисплея на полето за запомняне до по-подходяща стойност.
Забележка: тъй като полетата MEMO могат да бъдат доста ГОЛЯМИ, е добра идея да се покаже само част от него. В горния код се показват само първите 50 знака.
Редактиране в отделна форма
По подразбиране TDBGrid не позволява редактиране на MEMO полета. Ако искате да активирате редактирането „на място“, можете да добавите код, който да реагира на потребителско действие, което показва отделен прозорец, който позволява редактиране с помощта на компонент TMemo.
За простота ще отворим прозорец за редактиране, когато ENTER бъде натиснат "на" поле MEMO в DBGrid.
Нека използваме KeyDown събитие на компонент DBGrid:
процедура TForm1.DBGrid1KeyDown (
Подател: TObject;
var Key: Word;
Shift: TShiftState);
започвам
ако Key = VK_RETURN тогава
започвам
ако DBGrid1.SelectedField = DBTableData тогава
с TMemoEditorForm. Създайте (нула) направете
опитвам
DBMemoEditor. Текст: = DBTableData. AsString;
ShowModal;
DBTable. Редактиране;
DBTableData. AsString: = DBMemoEditor. Текст;
накрая
Безплатно;
край;
край;
край;
Забележка 1: „TMemoEditorForm“ е вторична форма, съдържаща само един компонент: „DBMemoEditor“ (TMemo).
Забележка 2: „TMemoEditorForm“ бе премахнат от списъка „Автоматично създаване на формуляри“ в диалоговия прозорец Опции на проекта.
Нека да видим какво се случва в DBGrid1 на манипулатора на събитията KeyDown:
- Когато потребителят натисне клавиша ENTER (сравняваме параметъра Key с VK_RETURN код на виртуален ключ) [Ключ = VK_RETURN],
- Ако избраното в момента поле в DBGrid е нашето поле MEMO (DBGrid1.SelectedField = DBTableData),
- Ние създаваме TMemoEditorForm [TMemoEditorForm. Създаване (нула)],
- Изпратете стойността на полето MEMO на компонента TMemo [DBMemoEditor. Текст: = DBTableData. AsString],
- Показване на формата модално [ShowModal],
- Когато потребителят приключи с редактирането и затвори формата, трябва да поставим dataste в режим на редактиране [DBTable. Редактиране],
- За да можете да присвоите редактираната стойност обратно на нашето поле MEMO [DBTableData. AsString: = DBMemoEditor. Текст].
Забележка: Ако търсите още статии и съвети за употреба, свързани с TDBGrid, не забравяйте да посетите: „TDBGrid към MAX"колекция от съвети.