Поиск StringGrid
На форме имеется компонент StringGrid со значениями (данные вбиваются прямо в компоненте, никакой БД нету). Имеется поле Edit и кнопка. Необходимо осуществить поиск по первой колонке. Т.е. найти в первой колонке все значения соответствующие значению в Edit . Может кто подсказать, как это реализовать? В PHP я это сделал а вот Delphi давно не занимался, подзабыл как это делать.
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 3 июл 2012 в 17:07
new_russian_man new_russian_man
849 1 1 золотой знак 28 28 серебряных знаков 69 69 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
у стринг грида есть свойства Cells ,Col, Row, aCol, aRow, ColMax и RowMax, ими и нужно оперировать в данном случае.
Делаете простой цикл for i:= 0 to RowMax — 1 do, и в теле цикла пробегаете каждую строчку и сравниваете ее со значением в Едит: if StringGrid1.Cells[MyCol, i] = Edit1.text then.
Отслеживать
ответ дан 3 июл 2012 в 20:32
4,685 2 2 золотых знака 30 30 серебряных знаков 46 46 бронзовых знаков
Если искать нужно только в первой колонке, то используйте
i:=StringGrid1.Cols[0].IndexOf(Edit1.Text);
Это вернет либо номер строки, где совпало, либо -1
Delphi как вычислить toprow stringgrid
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 |
поэтому содержимое выделенной ячейки будет адресоваться так:
Не правда ли, написание такой строки — утомительный процесс. Поэтому пользуйтесь оператором присоединения with:
with StringGrid1 do
S:=Cells[Col, Row];
А лучше сразу задать в свойстве Name имя покороче, например SG.
За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options — это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False — то нет.
| Свойство | Значение |
| goFixedVertLine | Наличие вертикальных разделительных линий между «фиксированными» ячейками |
| goFixedHorzLine | Наличие горизонтальных разделительных линий между «фиксированными» ячейками |
| goVertLine | Наличие вертикальных разделительных линий между «обычными» ячейками |
| goHorzLine | Наличие горизонтальных разделительных линий между «обычными» ячейками |
| goRangeSelect | Возможность выделить диапазон ячеек |
| goDrawFocusSelected | Закрашивание ячейки с фокусом ввода |
| goRowSizing | Возможность менять высоту строк мышкой |
| goColSizing | Возможность менять ширину столбцов мышкой |
| goRowMoving | Возможность менять номер строки, то есть перемещать её, мышкой |
| goColMoving | Возможность менять номер столбца, то есть перемещать его, мышкой |
| goEditing | Возможность редактировать содержимое ячейки с клавиатуры |
| goTabs | При значении 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 — массив, содержащий высоты строк. То есть, например, RowHeights[5] — высота строки с индексом 5 |
| ColWidths — массив, содержащий ширины столбцов. То есть, например, ColWidths[5] — ширина строки с номером 5 |
Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах «фиксированной» зоны таблицы. В результате таблица появляется уже в «настроенном» виде!
Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода Edit, то возникает вопрос, можно ли программно установить курсор в заданную позицию в содержимом ячейки? Оказывается, есть такая возможность. Для этого требуются дополнительный тип данных на основе таблицы и вспомогательная процедура:
type TGridCracker = class(TStringGrid);
procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
Grid.Col := Col;
Grid.Row := Row;
with TGridCracker(Grid) do
InplaceEditor.SelStart := x_pos;
end;
Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;
Правда, ещё один момент! Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:
Отдельно требуется осветить вопрос очистки содержимого таблицы 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 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.
Как узнать координаты ячейки при щелчке мышкой
Методы таблицы позволяют получить индексы ячейки, по которой производится щелчок мышкой. Индексы ячейки бывают необходимы, например, при использовании контекстного меню таблицы. Когда меню появляется при щелчке правой кнопкой мышки по таблице, во первых, нужно перенести фокус в эту ячейку(сам он туда не пойдёт, проверьте!), и во вторых, обработчику нужно получить содержимое ячейки, а тут без координат данной ячейки не обойтись.
Возможность получить координаты ячейки доступна в обработчиках событий OnMouseDown и OnMouseUp. Параметры этих событий содержат пиксельные координаты щелчка. Более естественно использовать OnMouseDown, так как это событие наступает раньше. Получив координаты в пикселах, их нужно пересчитать в индексы ячейки. Этим занимается метод таблицы StringGrid — MouseToCell:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Integer;
begin
StringGrid1.MouseToCell(X, Y, ACol, ARow); //Получаем индексы ячейки ACol и ARow
//Перемещаем фокус в ячейку с этими индексами:
StringGrid1.Col:=ACol;
StringGrid1.Row:=ARow;
end;
Графические возможности компонента StringGrid
Таблица StringGrid Delphi обладает также и графическими возможностями. Ячейки таблицы можно раскрашивать в произвольные цвета, выводить рисунки, размещать не только однострочный, но и многострочный текст. Графические возможности StringGrid определяются наличием у таблицы свойства Canvas — холста, на котором можно воспроизводить любую графику стандартными методами Delphi. Кроме того, компонент StringGrid имеет дополнительные методы, помогающие выводу графики в ячейки компонента. читать далее.
Совместная работа StringGrid и Excel
Очень многие документы создаются и хранятся в формате электронных таблиц Microsoft Excel. Несмотря на то, что эти таблицы обладают возможностями для автоматической обработки документа, нам, дельфистам, гораздо приятнее работать в привычной среде, что которая и обладает к тому же гораздо более развитыми возможностями. Давайте посмотрим, как получать данные из Excel. Естественно, табличные данные будем размещать в привычную нам таблицу StringGrid. А уж в ней мы горы своротим!
Delphi как вычислить toprow stringgrid
← →
PZ ( 2006-11-08 18:44 ) [0]
Здравствуйте.
У меня простейшая база данных из одной таблицы, объемом порядка 2500 записей. Набор данных создается компонентом TClientDataSet и отображается компонентом DBRxGrid.
Мне хотелось бы, чтобы некая запись моей базы по заданному условию отображалась в верхней строчке DBRxGrid (какбы аналог свойства StringGrid.TopRow). Прошу дать практический совет, как реализовать эту задачу, желательно с примером. (Delphi 7)
С уважением, PZ
← →
Jeer © ( 2006-11-08 18:48 ) [1]
Ввести поле «ONTOP» boolean, присваивать нужной записи значение True и новый select, но это извращение.
← →
PZ ( 2006-11-08 19:01 ) [2]
А как без извращения? Возможно ли сделать?
← →
Desdechado © ( 2006-11-08 19:05 ) [3]
отсортируй по этому условию
← →
PZ ( 2006-11-08 19:22 ) [4]
Нет, немного не так. У меня база отсортирована по алфавиту. Нарушать порядок не желательно. Надо только чтобы заданная строка оказалась в верхней строке. А те, что ниже — остались внизу, те, что выше — остались вверху. После чего мышкой можно было бы сдвигать все строки вверх-вниз без нарушения порядка. То есть, именно, как в SringGrid делается.
← →
evvcom © ( 2006-11-08 19:31 ) [5]
select
*,
case when then 0 else 1 end as ord
from .
order by ord, fam
← →
rar © ( 2006-11-08 19:37 ) [6]
может создать два запроса и объединить их по Union
← →
evvcom © ( 2006-11-08 19:39 ) [7]
> [6] rar © (08.11.06 19:37)
зачем 2 запроса, если можно одним?
← →
PZ ( 2006-11-08 19:41 ) [8]
Чувствую, что не совсем то, что мне надо. Видимо простого решения не существует. Тем не менее спасибо всем за участие.
← →
evvcom © ( 2006-11-08 19:46 ) [9]
> [8] PZ (08.11.06 19:41)
> Чувствую, что не совсем то, что мне надо
Так ты объяснить толком не можешь, чего же тебе надо!
← →
V-A-V © ( 2006-11-08 22:32 ) [10]
> Ввести поле «ONTOP» boolean, присваивать нужной записи значение True и новый select, но это извращение.
ну почему-же если нельзя и очень хочется, то можно.
создаем поле «isOnTop» и для нухной записи в нухный момент присваеваем ему True, а остальным записям False
> Нет, немного не так. У меня база отсортирована по алфавиту. Нарушать порядок не желательно.
ну и естественно должен быть соответствующий индекс типа «isOnTop;Name»
← →
ЮЮ © ( 2006-11-09 03:36 ) [11]
Насколько я понял, человек просто хочет спозиционировать датасет в гриде так, чтобы определенная запись оказалось первой в этом гриде.
А текущая какая? В DBgrid-e её присутствие на экране обязательно.
Поэтому, сделав её текущей, она обязательно попадет в Грид. Но, скорей всего, в его середину.
Теперь, обратившись к DBGrid.DataLink (protected), можно узнать на какой строке находится эта запись, и какая запись последняя. Теперь надо сделать текущнй последнюю, сделать MoveBy, вызвав скроллинг НД в гриде, и опять сделать текущей нашу запись, которая будет к этому времени верхней в гриде.
← →
PZ ( 2006-11-09 10:24 ) [12]
> [11] ЮЮ © (09.11.06 03:36)
> Насколько я понял, человек просто хочет спозиционировать датасет в гриде так, чтобы определенная запись оказалось первой в этом гриде.
Вы действительно правильно поняли меня. Как бы теперь практически реализовать Ваше предложение? Может быть покажите на примере?
С уважением PZ
← →
ЮЮ © ( 2006-11-09 10:28 ) [13]
> Как бы теперь практически реализовать Ваше предложение?
По тексту в [11] код. С проблемами вернуться сюда.
Кстати, текущая запись НД отличается от той, что должна быть первой в гриде?
← →
PZ ( 2006-11-09 10:41 ) [14]
[13] ЮЮ © (09.11.06 10:28)
Я вывожу всю свою талицу в DBGrid. Высвечиваются первые 15 записей. Текущая — первая.
Та запись, которая должна быть первой находится где-нибудь на сотом или 321-м месте.
(Что такое НД — я не понимаю).
> Та запись, которая должна быть первой находится где-нибудь
> на сотом или 321-м месте.
Шаг 1.
Сделать так, чтобы нужная запись оказалась на экране:
Появилась в гриде?
← →
PZ ( 2006-11-09 11:08 ) [16]
Нет. Остаются первые 15 строчек вверху.
← →
ЮЮ © ( 2006-11-09 11:10 ) [17]
> Нет. Остаются первые 15 строчек вверху.
А никто этого на Шаг 1. и не обещал.
Вопрос был: Появилась в гриде?
← →
PZ ( 2006-11-09 11:16 ) [18]
Нет. Я же сказал, остаются первые 15 строчек вверху, а искомая запись где-то далеко внизу.
← →
ЮЮ © ( 2006-11-09 11:19 ) [19]
Тогда код приведи и в каком обработчике написано
← →
ЮЮ © ( 2006-11-09 11:32 ) [20]
Ушел за кодом и не вернулся 🙂
← →
PZ ( 2006-11-09 11:41 ) [21]
Код очень большой. Даю две характерные, на мой взгляд, процедуры:
procedure TTV_ViewerFrm.FormCreate(Sender: TObject);
begin
Try
ReadIniFile(); // Здесь получаю имя файла FileName
ClientDataSet1.LoadFromFile(ClientDataSet1.FileName);
ClientDataSet1.Open;
// DBGrid.DataSource.DataSet.Locate(Nachalo, «12:00», []); // Сюда вставлял
Except
MessageDlg(. );
End;
Init; // Здесь некоторые начальные условия
end;
procedure TTV_ViewerFrm.PnButClick(Sender: TObject);
Var
S : String;
begin
If (Sender is TLbSpeedButton) then
begin
S := GetPoDate; // Здесь выборка по дате
ClientDataSet1.Filter := S;
ClientDataSet1.Filtered := True;
// Сортировать по номеру и началу
ClientDataSet1.IndexFieldNames := «Nomer; Nachalo»;
DBGrid.DataSource.DataSet.Locate(Nachalo, «12:00», []); // Сюда вставил
DBGrid.Refresh;
end;
end;
← →
PZ ( 2006-11-09 11:51 ) [22]
Delphi 7, Win XP.
На форме DBRxGrid, DataSource, ClientDataSet
← →
ЮЮ © ( 2006-11-09 12:16 ) [23]
// Сюда вставлял
Для начала напиши как обработчик на нажатие кнопки. После отладки вставляй этот метод куда хочешь.
Тип поля Nachalo?
Вот код, который делает то, что надо:
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TForm1.Button1Click(Sender: TObject);
var
code: integer;
delta: integer;
locateRow: integer;
totalRow: integer;
begin
code := StrToIntDef(Edit1.Text, -1);
Query1.Locate(«Code», code, []);
locateRow := TDBGridAccess(DBGrid1).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid1).DataLink.RecordCount;
delta := totalRow — 1;
Query1.MoveBy(delta); // «текущая» запись станет первой в гриде
if not Query1.EOF then
Query1.MoveBy(-delta) // делаем её текущей
else
Query1.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
end;
← →
ЮЮ © ( 2006-11-09 12:27 ) [24]
Побочный эффект: если запись не найдена, то текущая запись становится верхней в гриде.
Для избежания надо
if Query1.Locate(«Code», code, []) then begin
.
end;
← →
PZ ( 2006-11-09 12:29 ) [25]
Тип поля Nachalo? — String
ЮЮ, спасибо за помощь. Буду разбираться с Вашим кодом. Сожалею, что Вам пришлось потратить столько времени на меня.
С уважением PZ
← →
evvcom © ( 2006-11-09 14:35 ) [26]
> [11] ЮЮ © (09.11.06 03:36)
Телепат?
> [12] PZ (09.11.06 10:24)
> Вы действительно правильно поняли меня.
Телепат!
:-))))))))
← →
PZ ( 2006-11-09 15:51 ) [27]
Моя база данных содержится в файле типа .cds. Компонент Query ее не понимает.
Я записал обработчик с использованием ClientDataSet.
После запуска моей программы при нажатии на Button1 возникает ошибка со следующим сообщением:
Project TV_Viewer.exe raised exception class EAccessViolation with message «Access Violation at address 00407816 in module «TV_Viewer.exe». Read address 00000030″. Process stoped.
Не могу понять в чем причина. Что делать?
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TTV_ViewerFrm.Button1Click(Sender: TObject);
var
MyCode : String[5];
code : integer;
delta : integer;
locateRow : integer;
totalRow : integer;
begin
MyCode := «15:45»;
ClientDataSet1.DataSource.DataSet.Locate(«Nachalo», MyCode, []); // Здесь ошибка
// Поле «Nachalo» типа String, Size = 5
locateRow := TDBGridAccess(DBGrid).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid).DataLink.RecordCount;
delta := totalRow — 1;
ClientDataSet1.DataSource.DataSet.MoveBy(Delta);
if not ClientDataSet1.EOF then
ClientDataSet1.DataSource.DataSet.MoveBy(-Delta) // делаем её текущей
else
ClientDataSet1.DataSource.DataSet.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TForm1.Button1Click(Sender: TObject);
var
code: integer;
delta: integer;
locateRow: integer;
totalRow: integer;
begin
code := StrToIntDef(Edit1.Text, -1);
Query1.Locate(«Code», code, []);
locateRow := TDBGridAccess(DBGrid1).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid1).DataLink.RecordCount;
delta := totalRow — 1;
Query1.MoveBy(delta); // «текущая» запись станет первой в гриде
if not Query1.EOF then
Query1.MoveBy(-delta) // делаем её текущей
else
Query1.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
end;
>
end;
← →
Anatoly Podgoretsky © ( 2006-11-09 16:05 ) [28]
> cds сокращение от ClientDataSet.
По ошибке, что то не создано.
← →
PZ ( 2006-11-09 16:20 ) [29]
> [28] Anatoly Podgoretsky © (09.11.06 16:05)
Что может быть не создано? Все же остальное работает, если не нажимать эту кнопку.
← →
Anatoly Podgoretsky © ( 2006-11-09 16:31 ) [30]
> PZ (09.11.2006 16:20:29) [29]
А кто его знает, тут есть неизвестные переменные.
Но сообщение точно говорит, что, что-то не создано.
У тебя отладчик есть? Воспользуйся. Укажи строку где возникает ошибка.
← →
PZ ( 2006-11-09 16:34 ) [31]
Вот именно в отладчике это сообщение и возникает
← →
Anatoly Podgoretsky © ( 2006-11-09 16:44 ) [32]
> PZ (09.11.2006 16:34:31) [31]
Скриншот в студию, что бы был виден номер строки.
← →
PZ ( 2006-11-09 16:56 ) [33]
Наконец я сообразил, в чем дело.
Надо не ClientDataSet1 задействовать, а DBGrid, т. е. должно быть
ClientDataSet1.DataSource.DataSet.Locate(«Nachalo», MyCode, []); // Здесь ошибка
DBGrid.DataSource.DataSet.Locate(«Nachalo», MyCode, []); // Здесь и далее нет ошибки
Спасибо Anatoly Podgoretsky
Еще раз спасибо ЮЮ
Спасибо всем, принимавшим участникам обсуждения моего вопроса
Delphi как вычислить toprow stringgrid
Профиль
Группа: Участник
Сообщений: 71
Регистрация: 25.7.2007
Репутация: нет
Всего: нет
спасибо, но мне бы хотелось прокрутку колесиком мыши =)
хм нашел такой вариант, все работает с одной фиксированной строкой как положено, может пригодится кому:
| Код |
| procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); const delta = 5; begin if TStringGrid(Sender).TopRow + delta + TStringGrid(Sender).VisibleRowCount < TStringGrid(Sender).RowCount then TStringGrid(Sender).TopRow := TStringGrid(Sender).TopRow + delta else TStringGrid(Sender).TopRow := TStringGrid(Sender).RowCount — TStringGrid(Sender).VisibleRowCount; |
procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
const
delta = 5;
begin
if TStringGrid(Sender).TopRow > 1 then
if TStringGrid(Sender).TopRow > delta then
TStringGrid(Sender).TopRow := TStringGrid(Sender).TopRow — delta
else
TStringGrid(Sender).TopRow := 1;
только еще пришлось вручную устанавливать форус на MouseEnter и «терять» его на MouseLeave
Это сообщение отредактировал(а) CODeRUS — 11.3.2011, 09:54