14-16 StringGrid.
Компонент StringGrid находится на странице Additionalпалитры компонентов. Там находятся «дополнительные» компоненты, но StringGrid Delphi, на мой взгляд, достоин большего уважения, лично я разместил бы его на странице Standart! StringGrid — компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.

Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows — зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options. Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i — номер столбца, j — номер строки, имеет вид StringGrid1.Cells[i, j] и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0. Выделенная ячейка таблицы имеет
StringGrid1.Col
StringGrid1.Row
поэтому содержимое выделенной ячейки будет адресоваться так: S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; Не правда ли, написание такой строки — утомительный процесс. Поэтому пользуйтесь оператором присоединения with: with StringGrid1 do S:=Cells[Col, Row]; А лучше сразу задать в свойстве Name имя покороче, например SG. За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options — это раскрывающийся список, представляющий собой элементы данногомножества. Если значение элемента равно True, то он присутствует в множестве, если False — то нет.

goFixedVertLine
Наличие вертикальных разделительных линий между «фиксированными» ячейками
goFixedHorzLine
Наличие горизонтальных разделительных линий между «фиксированными» ячейками
Наличие вертикальных разделительных линий между «обычными» ячейками
Наличие горизонтальных разделительных линий между «обычными» ячейками
goRangeSelect
Возможность выделить диапазон ячеек
goDrawFocusSelected
Закрашивание ячейки с фокусом ввода
goRowSizing
Возможность менять высоту строк мышкой
goColSizing
Возможность менять ширину столбцов мышкой
goRowMoving
Возможность менять номер строки, то есть перемещать её, мышкой
goColMoving
Возможность менять номер столбца, то есть перемещать его, мышкой
Возможность редактировать содержимое ячейки с клавиатуры
При значении True фокус смещается на следующую ячейку в таблице,False — на следующий компонент
goRowSelect
Выделяется вся строка с «фокусированной» ячейкой
goAlwaysShowEditor
При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False — сначала необходимо щёлкнуть по ней мышкой, либо нажать Enter или F2 (прим.: не действует приgoRowSelect=True)
goThumbTracking
При значении True перемещение «бегунка» прокрутки мышкой вызывает немедленное перемещение ячеек,False — ячейки перемещаются только при отпускании «бегунка»
Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение вTrue. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент: StringGrid1.Options:=StringGrid1.Options+[goEditing]; //Включаем редактирование, другие элементы не трогаем StringGrid1.Options:=StringGrid1.Options-[goEditing]; //Выключаем редактирование, другие элементы не трогаем StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect]; //Задаём список необходимых элементов Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным — False. Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. В программе доступна информация как об общем количестве строк и столбцов, так и номерах и количестве строк и столбцов, видимых в рамках таблицы. Количество строк в Delphi StringGrid равно StringGrid1.RowCount. Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount. Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании
StringGrid1.LeftCol
Номер столбца, видимого самым левым
StringGrid1.TopRow
Номер строки, видимой самой верхней
StringGrid1.VisibleColCount
Количество столбцов, видимых в рамках таблицы
StringGrid1.VisibleRowCount
Количество строк, видимых в рамках таблицы
У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек
DefaultRowHeight — высота строк по умолчанию
DefaultColWidth — ширина столбцов по умолчанию
Эти значения ширины и высоты принимают все новые ячейки. При необходимости индивидуально установить ширину и высоту столбцов и строк соответственно, пользуемся свойствами
RowHeights[i] — массив, содержащий высоты строк с номером i
ColWidths[i] — массив, содержащий ширины столбцов с номером i
Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах «фиксированной» зоны таблицы. В результате таблица появляется уже в «настроенном» виде! Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблицаStringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам: var i, j: Integer; begin with StringGRid1 do for i:=1 to RowCount-1 do //Заголовки строк не трогаем for j:=1 to ColCount-1 do //Заголовки столбцов не трогаем Cells[j, i]:=»; end; Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки: StringGrid1.Cols[i].Clear; //Очищается столбец с номером i StringGrid1.Rows[i].Clear; //Очищается строка с номером i Очевидно, очищение этими методами гораздо быстрее. Однако будут очищены и ячейки фиксированной зоны, содержащие, например, названия строк и столбцов, которые удалять не нужно. Их после очистки нужно просто «написать» заново, на глаз эта манипуляция совершенно незаметна. Для очистки всей таблицы достаточно последовательно очистить только строки или только столбцы: var i, j: Integer; begin with StringGRid1 do for i:=1 to RowCount-1 do //Заголовки столбцов не трогаем — цикл от 1 begin Rows[i].Clear; Cells[0, i]:=»Заголовок строки i»; end; end; Казалось бы, можно поступить и по-другому, просто обнулить количество строк или столбцов! Однако так делать неправильно, так как при их последующем добавлении может оказаться, что каждая ячейка содержит прежние данные. А в Delphi4 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.
Emptying string grid in Delphi
In Delphi, is there a fast way of emptying a TStringgrid (containing in excess of 5000 rows) that will also free the memory?
Setting the rowcount to 1, empties the grid but does not free the memory.
Thanks in advance,
5 Answers 5
This should uninitialize the allocated strings (from the string list where the row texts are stored). Cleaning is done by columns since you have a lot of rows.
By «does not free the memory», do you mean that if you set RowCount := 1 , and then set the RowCount := 10′ you can still see the old content of the Cells`?
If so, this is an old issue and has nothing to do with the memory not being freed; it’s simply because you just happen to see the previous content of the memory when it’s allocated again, because memory isn’t zero’d out.
I have a pretty standard routine in a utility unit that deals with this visual glitch, and unless the grid is huge works fast enough. Just pass the TStringGrid before you change the RowCount or ColCount to a lower value.
Как очистить stringgrid паскаль
Загрузка. Пожалуйста,
подождите.
Доброго дня или вечера!
У меня такая проблемка. (Delphi 7)
Подскажите пожалуйста как очистить все ячейки StringGrid от данных не сохраняя их
для внесения новых не выходя из проги.
Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград
Репутация: 109
Всего: 459
Скорее всего так
| Код |
| for i:=1 to StringGrid1.RowCount-1 do StringGrid1.Rows[i].Text := ''; |
Обсуждение действий администрации форума производятся только в этом форуме
гениальность идеи состоит в том, что ее невозможно придумать
Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер
Репутация: 192
Всего: 484
Или так:
| Код |
| StringGrid1.RowCount:=2; StringGrid1.Rows[1]:=''; |
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по Дельфи обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
[ Время генерации скрипта: 0.1298 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Работа с таблицами в Delphi
Редактирование таблиц в среде программирования. Свойство StringGrid и его применение. Классификация и особенности событий. Приёмы программирования: очистка таблиц, сохранение их в файл, закрашивание ячеек и помещение в них изображения, удаление строк.
| Рубрика | Программирование, компьютеры и кибернетика |
| Вид | курсовая работа |
| Язык | русский |
| Дата добавления | 23.12.2013 |
| Размер файла | 65,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Уральский финансово-экономический колледж
На тему: «Работа с таблицами в Delphi»
учащегося III курса
Руководитель: Арсенова А.А
Содержание
таблица программирование stringgrid сохранение удаление
1. История Delphi. Работа с таблицами в среде программирования
2. StringGrid и его применение
2.1 Таблица StringGrid, основные сведения
2.2 Свойство StringGrid
3. Приёмы программирования
3.1 Как сохранить таблицу StringGrid в файл
3.2 Как полностью очистить таблицу StringGrid
3.3 Как закрасить ячейку StringGrid
3.4 Как поместить изображение в ячейку таблицы StringGrid
3.5 Как выделить несколько ячеек таблицы StringGrid
3.6 Как удалить нужную строку в таблице StringGrid
Список использованной литературы
В данной курсовой работе рассматриваются основные принципы использовании базы данных в современном мире.
Благодаря таблицам, человек научился систематизировать информацию и приводить ее в некий порядок. Именно в таблицах можно увидеть Прогресс или Регресс того или иного предприятия, рассматривая в ней его экономические показатели. Именно в таблицах составляются все необходимые отчетные документы, связанные также с финансовой отчетностью, поскольку в таблицах легко проследить за тем, кто и сотрудников организации, сколько получает, когда у него отпуск, как долго он работает в данном направлении с тем или иным коллективом, и многие другие данные.
Еще, таблицы помогают при написании Контрольных, курсовых и дипломных работ, поскольку так структурировать информацию, как это могут таблицы, не может никто.
Только в таблицах отмечаются показатели спортсменов, их успех в том или ином виде спорта, только в таблицах работают сотрудники статистических учреждений и организаций, поскольку только благодаря ним, в этом мире возможен порядок и определенная организация имеющейся информации.
Цель курсового проекта является умение создать
Задачи курсового проекта
В самом деле, зачем нужны таблицы? Казалось бы, у них достаточно узкое назначение: представлять большие объемы числовой и текстовой информации на ограниченном пространстве. Что это нам даст?
Полистайте книгу с начала до конца и наоборот. Что вы видите? Сплошной текст, «льющийся» по страницам. Абзацы текста, рисунки, таблицы находятся в этом «потоке» последовательно, один за другим. Они не могут «вырваться» из этого «потока». Невозможно поместить на одном и том же месте одновременно и рисунок, и таблицу — элементы страницы могут быть расположены только последовательно, один за другим.
«Поток» текста хорош для художественных произведений и руководств, последовательно описывающих какие-либо действия, необходимые для достижения результата. В этом случае текст читается с начала и до конца без резких «скачков» туда-сюда. «Поток» текста очень плох для технических статей, нуждающихся в многочисленных пояснениях, дополнениях и иллюстрациях; в этом случае нужно иметь перед глазами и первое, и второе, и третье, и четвертое. Также «поток» текста абсолютно не подходит для газет: читатель не хочет листать газету взад-вперед в поисках нужной статьи, а хочет видеть все главные новости на ее первой странице. Вот поэтому большинство число людей ищут пути «вырваться» из жестких рамок «потока» текста. Ищут с разным успехом.
1. История Delphi. Работа с таблицами в средах программирования
В 1993 году Microsoft выпустила первую визуальную среду программирования Visual Basic, и программирование для Windows стало даже проще, чем программирование для MS-DOS. В ответ на это Borland в 1995 году выпустила первую версию Delphi (процедурный объектно-ориентированный язык высокого уровня фирмы Borland International, базирующийся на объектно-ориентированной версии языка Turbo Pascal и одноименная визуальная среда разработки), а затем, с интервалом в 1 год, — еще 4 версии: 2, 3, 4 и 5. В середине 2001 г. выпускается версия 6, а в 2002 была выпущена версия 7. Недавно вышла Delphi 8 весомо отличающаяся от предыдущих версий.
Не секрет, что лучшим языком для изучения и освоения программирования является Паскаль, а лучшей в мире системой программирования для MS-DOS — Turbo Pascal. Delphi продолжила серию Паскаль-ориентированных средств программирования и, по моему глубокому убеждению, является наиболее удобным инструментом для Windows-программирования.
Работа с таблицами с таблицами в средах программирования
Существует множество задач требующих работы с таблицами. Есть и множество табличных пакетов с разнообразными методами решения, например, матричных задач — от простых матриц до задач линейного (и не только) программирования. В зависимости от знаний и возможностей исполнителя используют Excel, Origin, Statgraph, Statistica, математические пакеты Mathematica, MatCad или другие. Однако в процессе обучения программированию эти пакеты не лучшие помощники и обычно при работе в Visual-средах Delphi, MS Visual Studio используются компоненты для создания и работы с таблицами. Если до появления MS Visual Studio. Net (MS VS) 2003 лидером считалась среда Delphi, то новая разработка одного из авторов Delphi А.Хейлсберга казалось бы должна была сменить лидера. Попробуем разобраться так ли это.
Начиная с Delphi 3 и до Delphi 8 создание и обращение к элементам таблицы производится по схожим правилам — программист указывает адрес ячейки по индексам столбца и строки следующей записью — StringGrid1.Cells[i,j]:= …; (если это первый объект StringGrid). Просто и удобно. Надо только помнить о методах перевода строковой переменной в один из числовых форматов (например, StrToInt () и т.п.). Индексация начинается с позиции 0,0.
Разрабатывая Visual Studio 2003 и последующие 2005 и 2008 MicroSoft, по-видимому, ориентировалась на работу по созданию интерфейса управления базами данных. Иначе трудно объяснить сложности создания таблиц для решения именно математических задач. В MS VS 2003 таблица формируется программно, в окне Properties для объекта DataGrid нет явной возможности прописать количество столбцов и строк. В Delphi эта возможность есть в инспекторе объектов (Object Inspector), можно задать количество столбцов и строк и в дальнейшем, при необходимости, программно изменять. Обращение к таблице в Visual Studio 2003 длиннее и требует большей квалификации программиста, надо например, знать правила образования объекта таблица и методы обращения к ячейкам таблицы. Причем, таких возможностей несколько. Студенты на младших курсах еще недостаточно подготовлены для работы в визуальных средах и им трудно привыкать к мысли, что есть разные варианты правильного решения одной и той же задачи. В версиях Visual Studio 2005 и старше разработчики сменили правила образования таблицы. Можно используя контекстное меню объекта DataGridView прописать количество озаглавленных столбцов, добавляя строки программно по мере их необходимости. Это уже удобнее и вполне соответствует технологии быстрой разработки приложений. Но все же только программное определение количества строк не совсем соответствует принципу RAD. В обеих средах имеются системы интеллектуальных подсказчиков помогающих в выборе свойств и методов объектов. В Visual Studio эта система более развита, а совместно с документацией MSDN AA предоставляется полная информация по всем используемым языкамn программирования и самой среде.
Из опыта преподавания студентам визуальных сред программирования можно сделать следующий вывод — для обучения, особенно для математических вычислений, работ с табличными данными удобнее использовать Delphi. Для работ с подключением баз данных проще и быстрее использовать MS Visual Studio начиная с версии 2005.
2. StringGrid и его применение
Таблица StringGrid предоставляет все основные возможности для размещения текстовых, а также графических данных в табличной форме. А так как данные имеют «странное» свойство группироваться по строкам и столбцам, то таблица StringGrid имеет важное значение в программировании в системе Delphi. Конечно, для работы с таблицами баз данных в Delphi существует специализированные компоненты. Но в обычных приложениях для работы с табличными данными в Delphi применяется именно компонент StringGrid.
Таблица StringGrid имеет гибкие возможности по настройке своего вида — ширины и высоты отдельных строк и столбцов, как и их количество на этапе проектирования и программно, размера фиксированной области и области редактирования, выделения как отдельной ячейки, так и зоны из нескольких ячеек, и т.д. Доступ к содержимому каждой отдельной ячейки предоставляется по индексу — номеру столбца и строки, в которых она находится.
Если ячейки не помещаются в размеры таблицы, автоматически добавляются как вертикальная, так и горизонтальная полосы прокрутки. Причём в каждый момент известны номера видимых строк и столбцов, и эта область доступна для управления. Таким образом, мы можем программно перемещать в область видимости те ячейки, где содержатся нужные нам данные.
События, на которые может реагировать таблица StringGrid, также разнообразны и предоставляют программисту широкие возможности по созданию программ, использующих таблицы, наполненные необходимой функциональностью. Всегда можно отследить нажатие и отпускание как кнопок клавиатуры так и мышки, выделение и перемещение ячеек, их редактирование.
2.1 Таблица StringGrid, основные сведения
Компонент StringGrid это таблица, содержащая данные, такие как строки типа TString, а также изображения. Таблица может быть только для чтения или редактируемой. Таблица имеет возможность прокрутки, однако некоторое число первых столбцов и строк можно сделать фиксированным — без прокрутки. Этим способом задаются заголовки столбцов и строк, которые должны постоянно отображаться в окне компонента.
Основные свойства компонента, определяющие отображаемый текст:
Строка, содержащаяся в ячейке с адресом (ACol, ARow)
Cells[ACol, ARow: Integer]: String;
Набор строк, содержащийся в столбце с индексом Index
Cols[Index: Integer]: TStrings;
Набор строк, содержащийся в строке с индексом Index
Rows[Index: Integer]: TStrings;
Объект, связанный со строкой, содержащейся в ячейке с адресом (ACol, ARow)
Objects [ACol, ARow: Integer]: TObject;
Все эти свойства отсутствуют в Инспектре Объектов, но доступны во время выполнения. Задавать содержимое ячеек программно можно как по отдельным ячейкам, так и сразу по столбцам и строкам с помощью методов класса TStrings.
Свойства таблицы StringGrid
* ColCount и RowCount — количество строк и столбцов соответственно;
* FixedCols и FixedRows — количество первых, не прокручиваемых столбцов и строк;
* FixedColor — цвет фона фиксированных ячеек;
* LeftCol и TopRow — индексы самого левого и самого верхнего видимых в настоящий момент столбца и строки при прокрутке.
Свойство ScrollBars отвечает за полосы прокрутки. При ScrollBars<>sbNone полосы прокрутки появляются автоматически , если таблица не помещается в заданный размер.
Содержимое свойства Options определяет такие свойства таблицы как:
* goFixedVertLine и goFixedHorzLine — наличие разделительных линий между фиксированными ячейками;
* goVertLine и goHorzLine — наличие разделительных линий между обычными ячейками;
* goColSizing и goRowSizing — возможность менять мышкой ширину столбцов и высоту строк;
* goColMoving и goRowMoving — возможность перемещать столбцы и строки целиком;
* goEditing — возможность редактировать содержимое таблицы,
и многие другие.
Компонент StringGrid используется в программе для выбора значений, содержащихся в ячейках. Свойства Col и Row показывают индексы столбца и строки выделенной (имеющей фокус) в настоящий момент ячейки. Также возможно выделение региона ячеек, как объекта.
Среди событий компонента StringGrid есть важное событие OnSelectСell, возникающее при выборе той или иной ячейки, но ещё до фактического перемещения в неё фокуса. В обработчик этого события передаются параметры ACol и ARow — столбец и строка выбранной ячейки, и CanSelect — допустимость выбора.
Значение параметра CanSelect=False используется для запрета перемещения в выбранную ячейку. А параметры ACol и ARow могут использоваться для опережающей реакции программы на выбор той или иной ячейки.
2.2 Свойство StringGrid
Свойства таблицы StringGrid включают в себя как свойства компонента StringGrid определяющие как её «внешний вид» и положение на Форме по отношению к другим элементам интерфейса, так и свойства компонента StringGrid по размещению и хранению информации.
Свойства всех объектов на Форме отображаются в окне Инспектора объектов, который для таблицы StringGrid выглядит так, как на рисунке слева.
Таблица StringGrid также обладает очень важным и полезным свойством, характерным для компонентов с графическими возможностями — Canvas (канва). Это свойство позволяет как произвольно рисовать в пределах таблицы, так и размещать в ячейках рисунки и другие графические данные. А также именно это свойство позволяет управлять расположением строк в ячейках. Дело в том, что сама таблица StringGrid размещает содержимое своих ячеек у их левого края. Программист, работая с канвой таблицы, может разместить данные как по центру, так и у правого края ячеек, в зависимости от потребностей.
Тем самым, таблица StringGrid обладает широким спектром свойств, помогающим программисту придать нужный стиль, соответствующий дизайн и информационную наполненность приложениям, использующим табличное представление и обработку рабочих данных.
2.3 События
События StringGrid позволяют разрабатывать на её основе таблицы данных, реагирующие на широкий спектр событий, происходящих вследствие действий пользователя. Правильно запрограммированная таблица StringGrid может реагировать на такие события как одиночный и двойной щелчки мышки, изменение и перемещение строк и столбцов, выбор той иной ячейки, на действия пользователя во время редактирования содержимого ячеек, и множество других событий. Щелчок левой кнопкой мышки (событие OnClick) вызывает перемещение фокуса выделения к выбранной ячейке. Перемещение по щелчку правой кнопкой нужно прописывать в обработчике события OnMouseDown. Это нужно, например, когда необходимо вызвать контекстное меню таблицы, реагирующее на номер столбца или строки выбранной ячейки.
Событие OnSelectCell происходит непосредственно перед перемещением фокуса выделения в выбранную ячейку. Имеющиеся в обработчике параметры позволяют проанализировать строку и столбец и запретить перемещение.
События OnGetEditText и OnSetEditText позволяют получать содержимое ячейки перед началом редактирования и после редактирования содержимого выбранной ячейки. Манипулируя параметром Value обработчиком этих событий, можно как угодно изменять результат редактирования.
Событие OnClick
Событие OnClick компонента StringGrid происходит в момент щелчка по компоненту StringGrid. Обработчик события щелчка мыши по компоненту может содержать реакцию программы на щелчок пользователем по таблице.
Событие OnClick относится ко всему компоненту StringGrid, безотносительно к ячейке таблицы, по которой происходит щелчок. Однако, поскольку при щелчке по компоненту StringGrid происходит перемещение фокуса ввода на выбранную ячейку, то в обработчике этого события можно запрограммировать соответствующую реакцию таблицы на выбор той или иной ячейки.
Событие OnDblClick
Событие OnDblClick компонента StringGrid может содержать обработчик события двойного щелчка мыши по компоненту. Событие OnDblClick относится ко всему компоненту StringGrid, безотносительно к ячейке таблицы, по которой происходит двойной щелчок.
Единственный параметр обработчика события OnDblClick — Sender, позволяет назначить нескольким компонентам StringGrid один и тот же обработчик этого события. Пример работы с параметром Sender — на странице OnClick.
Событие OnColumnMoved
Событие OnColumnMoved компонента StringGrid происходит в момент перемещения пользователем с помощью мыши столбца таблицы с места, где он расположен, в новое местоположение.
Для перемещения столбца нужно навести указатель мыши на заголовок столбца (одну из ячеек фиксированной зоны в этом столбце), нажать левую кнопку мышки и, удерживая её в нажатом положении, переместить указатель к новому местоположению столбца.
Событие OnEnter
Событие OnEnter компонента StringGrid происходит в момент получения компонентом StringGrid фокуса ввода. Происходить это может как вручную, кликом мышки или нажатием клавиши Tab, так и программно, с помощью оператора
Событие OnExit
Событие OnExit компонента StringGrid происходит в момент перехода фокуса ввода с таблицы на другой компонент Delphi. При переходе фокуса ввода из одной ячейки в другую ячейку таблицы событие OnExit не происходит, так как фокус ввода остаётся в пределах этого компонента.
Событие OnExit происходит при выборе другого компонента либо щелчком мышкой, либо нажатием клавиши Tab, либо программно — применением метода SetFocus какого-либо другого компонента. Однако, этот компонент должен быть в состоянии принять фокус ввода. Если компонент не может обладать фокусом ввода, либо принять его в данный момент, то событие OnExit не произойдёт.
Событие OnRowMoved
Событие OnRowMoved компонента StringGrid происходит в момент перемещения пользователем с помощью мыши строки таблицы с места, где она расположена, в новое местоположение.
Для перемещения строки нужно навести указатель мыши на заголовок строки (одну из ячеек фиксированной зоны в этой строке), нажать левую кнопку мышки и, удерживая её в нажатом положении, переместить указатель к новому местоположению строки.
Непосредственно событие OnRowMoved происходит в момент отпускания кнопки мышки.
Для того, чтобы событие OnRowMoved могло вообще наступить, необходимо установить в True параметр goRowMoving в свойстве Options компонента. Сделать это можно как в Инспекторе Объектов на этапе проектирования, так и программно.
Событие OnDrawCell
Событие OnDrawCell компонента StringGrid управляет обрисовкой таблицы. Размещая в обработчике события OnDrawCell программный код, можно раскрашивать ячейки, выводить рисунки, и делать текстовые надписи, занимающие в ячейке не только одну, но и несколько строк.
Пожалуй, событие OnDrawCell одно из самых непонятных для новичков. По сравнению с другими событиями в Delphi, вызывает непонимание то, каким способом событие OnDrawCell можно вызвать.
Событие OnSelectCell
Событие OnSelectCell компонента StringGrid происходит в момент перехода фокуса ввода в одну из ячеек таблицы StringGrid, однако ещё до непосредственного перехода. Причём неважно, как это сделано, пользователем вручную или программно.
Событие OnKeyDown
Событие OnKeyDown компонента StringGrid происходит при нажатии клавиши на клавиатуре, в момент когда клавиша находится в нижнем положении. Параметр, Shift, имеющий тип TShiftState, поможет определить, какие управляющие клавиши были нажаты совместно с нажатием нашей клавиши. Тип TShiftState это множество, состоящее из одного или нескольких следующих значений:
TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
Событие OnKeyPress
Событие OnKeyPress компонента StringGrid происходит при нажатии клавиши на клавиатуре. Событие OnKeyPress происходит после события OnKeyDown, но перед событием OnKeyUp. Обработчик события OnKeyPress имеет следующий вид:
Переменная Key, содержащая код нажатой клавиши, имеет тип Char, то есть символ, поэтому, в отличие от событий OnKeyDown и OnKeyUp событие OnKeyPress происходит при нажатии не любых, а только символьных клавиш.
Кроме того, переменная Key используется с ключевым словом var, которое означает что значение переменной Key может быть переопределено с передачей значения вовне процедуры. Эффект такого переопределения таков, как будто вместо действительно нажатой была нажата другая клавиша, имеющая значение соответствующего символа.
Событие OnKeyUp
Событие OnKeyUp компонента StringGrid происходит при нажатии клавиши на клавиатуре, в момент когда клавиша находится в верхнем положении, то есть уже отпущена. Видим, что переменная Key, содержащая код нажатой клавиши, имеет тип Word, то есть число в диапазоне 0 .. +65535. Это означает, что событие OnKeyUp наступает при нажатии не только символьных, но также и управляющих, то есть любых клавиш на клавиатуре. Кроме того, переменная Key используется с ключевым словом var, которое означает что значение переменной Key может быть переопределено с передачей значения вовне процедуры. Эффект такого переопределения таков, как будто вместо действительно нажатой была нажата другая клавиша, имеющая соответствующий код.
Событие OnMouseDown
Событие OnMouseDown компонента StringGrid происходит при нажатии клавиши мыши. Причём событие OnMouseDown вызывается при нажатии любой клавиши, левой, правой или средней. Событие OnMouseDown происходит в нижнем положении клавиши, непосредственно в момент нажатия.
Определить, какая именно клавиша была нажата и параметры нажатия, помогут встроенные переменные обработчика события. Обработчик события OnMouseDown имеет следующий вид:
Событие OnMouseMove
Событие OnMouseMove компонента StringGrid происходит при перемещении мыши в границах компонента StringGrid. Видим, что в отличие от обработчиков событий OnMouseDown и OnMouseUp в обработчике события OnMouseMove отсутствует параметр Button, а коды зажатых при перемещении клавиш содержатся в параметре Shift.
Событие OnMouseUp
Событие OnMouseUp компонента StringGrid происходит при нажатии клавиши мыши. Причём событие OnMouseUp вызывается при нажатии любой клавиши, левой, правой или средней. Событие OnMouseUp происходит в момент отпускания клавиши.
Определить, какая именно клавиша была нажата и параметры нажатия, помогут встроенные переменные обработчика события.
3. Приёмы программирования
Приёмы программирования таблицы StringGrid позволяют использовать таблицу StringGrid не просто как статичный объект для отображения данных в табличной форме, а придать таблице возможности динамически менять своё содержимое в зависимости от нужд и поведения пользователя.
Использование таблицы StringGrid предполагает такие приёмы её программирования как:
* автоматическое заполнение таблицы;
* сохранение содержимого ячеек таблицы;
* очистка всех ячеек таблицы;
* выравнивание содержимого в ячейках;
* изменение количества строк и столбцов;
* рисование в ячейках;
и многие другие.
StringGrid — компонент, обладающий как текстовыми, так и графическими свойствами. Поэтому приёмы программирования таблицы StringGrid предполагают использование практически всех имеющихся свойств и методов Delphi. Таким образом, изучение возможностей таблицы StringGrid приводит к тому, что программист всё лучше узнаёт систему Delphi, что расширяет его возможности в создании программ, использующих и другие компоненты.
3.1 Как сохранить таблицу StringGrid в файл
Сохранить таблицу StringGrid в файл необходимо, чтобы не потерять внесённые в процессе работы данные. Сохранить таблицу StringGrid в файл можно несколькими способами. Например:
Сохранение с помощью объекта StringList
Для сохранения информации в таблице можно воспользоваться объектом StringList, имеющим в своём арсенале метод для сохранения в файл своих строк. Запишем в StringList ячейки построчно, а затем воспользуемся методом SaveToFile:
3.2 Как полностью очистить таблицу StringGrid
Необходимость очистить таблицу StringGrid часто возникает в процессе работы программы. Но, к сожалению, среди методов компонента StringGrid отсутствует метод полной очистки таблицы StringGrid от ранее размещённого в ячейках содержимого.
Следовательно, необходимо использовать последовательную программную очистку ячеек одну за другой, либо воспользоваться встроенными в компонент StringGrid методами очистки отдельных строк либо столбцов.
Компонент StringGrid состоит из таких объектов как столбцы:
StringGrid1.Cols[Index: Integer]: TStrings;
StringGrid1.Rows[Index: Integer]: TStrings;
Эти объекты, в отличие от целой таблицы, имеют методы своей полной очистки:
//Очистка столбца с индексом i
//Очистка строки с индексом j
Используя эти методы, вот как производится полная очистка таблицы StringGrid:
3.3 Как закрасить ячейку StringGrid
Закрасить одну ячейку таблицы StringGrid поможет метод FillRect такого свойства компонента StringGrid, как Canvas (холст), отвечающего за все графические возможности компонента. Для закрашивания ячейки StringGrid этот метод следует вызвать в обработчике события DrawCell.
3.4 Как поместить изображение в ячейку таблицы StringGrid
Компонент StringGrid может размещать в своих ячейках не только текст, но и графику. Поместить рисунок или другое изображение в ячейку таблицы StringGrid позволяет свойство Canvas компонента StringGrid.
Свойство Canvas имеет метод для вывода графики в заданный своими координатами прямоугольник:
Canvas.StretchDrav(const Rect: TRect; Graphic: TGraphic);
Этот метод «подгоняет» размеры рисунка под размеры прямоугольника, растягивает или сжимает его и по горизонтали и по вертикали, причём не обязательно пропорционально. Если размеры прямоугольника и размеры изображения не подобны, то рисунок будет искажён.
Значит, для вывода изображения в ячейку, предварительно нужно:
1. сделать размеры ячейки-адресата ячейки равными или пропорциональными размерам изображения;
2. определить прямоугольник вывода, то есть задать его координаты.
В компоненте StringGrid определено событие, обработчик которого специально приспособлен как раз для этих целей.
Определяя адрес ячейки (ACol, ARow) таблицы, мы тем самым задаём определённый в обработчике OnDrawCell прямоугольник Rect вывода изображения. А узнать размеры изображения, чтобы подстроить под него размеры ячейки, можно загрузив изображение вначале в специально созданный контейнер — объект типа TPicture:
Если для загрузки предполагается изображение формата JPEG, то в список uses нужно подключить модуль JPEG.
3.5 Как выделить несколько ячеек таблицы StringGrid
Прежде всего нужно сказать, что выделить несколько ячеек таблицы StringGrid возможно лишь в пределах одного прямоугольного региона. Выделить несколько ячеек таблицы StringGrid в ходе работы программы можно как мышкой, так и программно.
Для того, чтобы операция выделения нескольких ячеек стала возможной, её нужно разрешить с помощью специального свойства таблицы StringGrid — Options.
В Инспекторе Объектов свойство Options — это раскрывающийся список, содержащий набор опций с указанием их значений — True или False.
Программно свойство Options — это множество, содержащее те опции, значения которых равны True.
Таким образом, свойство Options можно настраивать как в процессе проектирования таблицы StringGrid, так и программно.
Итак, для возможности выделения нескольких ячеек мышкой опция goRangeSelect свойства Options должна быть равна True. Это можно сделать как в Инспекторе Объектов, так и программно:
Теперь, чтобы выделить несколько ячеек таблицы StringGrid, нужно левой кнопкой мышки нажать на одну из ячеек и, удерживая кнопку мыши нажатой, обвести регион выделения. Выделенный регион поменяет цвет своих ячеек, за исключением той ячейки, которая окажется в фокусе — то есть первой нажатой.
При этом, указанная операция выделения нескольких ячеек мышкой окажется невозможной, если опция goEditing (отвечающая за возможность ввода в ячейку с клавиатуры) будет равна True. Это значит, что для того чтобы иметь возможность и выделять несколько ячеек, и делать ввод с клавиатуры в ячейку, нужно поочерёдно, в нужные моменты подключать или удалять из множества Optons опцию goEditing.
Теперь нужно выяснить, как можно программно выделить несколько ячеек таблицы StringGrid. Чтобы сделать выделение нескольких ячеек программно, нужно определить свойство Selection таблицы StringGrid:
3.6 Как удалить нужную строку в таблице StringGrid
Мы можем легко добавить или удалить последнею строку в компоненте StringGrid, но не так легко удалить строку в компоненте StringGrid, не являющуюся последней. Тем самым, чтобы удалить нужную строку в таблице StringGrid, необходимо писать собственную процедуру.
Процедура, удаляющая нужную строку компонента StringGrid, должна сначала переписать все строки ниже удаляемой на одну строку вверх, затем очистить последнюю строку, затем уменьшить количество строк в таблице на одну. Очистка последней строки нужна, так как при последующем добавлении строки новая строка может иметь прежнее содержимое.
Теперь, чтобы удалить нужную строку в таблице StringGrid, нужно указать индекс нужной строки и в какой именно таблице. Вот так удаляем, например, текущую строку: