Как программно перескакивать на нужное поле(колонку) ?
» DBGrid?
Specifies the field component for the currently selected cell in the grid.
Delphi syntax:
property SelectedField: TField;
C++ syntax:
__property Db::TField* SelectedField = {read=GetSelectedField, write=SetSelectedField};
Description
Set SelectedField to move focus to a particular field in the grid. Read SelectedField to obtain access to the field component for the currently selected cell. If there is not currently selected cell, SelectedField is nil (Delphi) or NULL (C++). For example, when an entire row is selected, SelectedField is nil or NULL.
Пойдет?
Delphi syntax:
property SelectedField: TField;
C++ syntax:
__property Db::TField* SelectedField = {read=GetSelectedField, write=SetSelectedField};
Description
Set SelectedField to move focus to a particular field in the grid. Read SelectedField to obtain access to the field component for the currently selected cell. If there is not currently selected cell, SelectedField is nil (Delphi) or NULL (C++). For example, when an entire row is selected, SelectedField is nil or NULL.
Пойдет?
Пойдёт.
DBGrid1->SelectedField = DataModule2->ADOTableSalesDetail->FieldByName("");
DBGrid1->SelectedField = DataModule2->ADOTableSalesDetail->FieldByName("");
BigBoBo1
На Delphi можно так
MyDBGrid.SelectedIndex := MyDBGrid.SelectedIndex + 1;
Колонки DBGrid индексируются с 0, поэтому SelectedIndex := 0 даст вам первую колонку. Свойство FieldCount вернет вам количество колонок
Сразу же вопрос:
Волюю судеб в базе в текущей записи поменялись данные. Мне нужно их увидить в Grid -e. Запрос такой что RefreshRecord применить невозможно (Можно но нужное поле он не обновляет) поэтому делаем Refresh? но при этом текущей становится первая запись. Даже если я сохраню позицию, всюрявно произойдёт скачок в Grid - e. Если RecNo использовать то текущая запись становится первой, а если Locate то точно посередине.
Кто-нибудь знает как избавиться от таких скачков.
Нужно очень.
На Delphi можно так
MyDBGrid.SelectedIndex := MyDBGrid.SelectedIndex + 1;
Колонки DBGrid индексируются с 0, поэтому SelectedIndex := 0 даст вам первую колонку. Свойство FieldCount вернет вам количество колонок
Сразу же вопрос:
Волюю судеб в базе в текущей записи поменялись данные. Мне нужно их увидить в Grid -e. Запрос такой что RefreshRecord применить невозможно (Можно но нужное поле он не обновляет) поэтому делаем Refresh? но при этом текущей становится первая запись. Даже если я сохраню позицию, всюрявно произойдёт скачок в Grid - e. Если RecNo использовать то текущая запись становится первой, а если Locate то точно посередине.
Кто-нибудь знает как избавиться от таких скачков.
Нужно очень.
RWSergey
ты на время какой то работы с записями - отвязывай от dbgrid его. На нем ничего не будет видно конечно, зато не будет и скачков(да и обрабатывать будет быстрее).
ты на время какой то работы с записями - отвязывай от dbgrid его. На нем ничего не будет видно конечно, зато не будет и скачков(да и обрабатывать будет быстрее).
Нет ты меня непонял. Grid нельзя отвязывать, он всегда действующий. У меня Grid с галочками пользователь снимает эту галочку или устанавливает заново. И в этот момент происходит скачок потому что приходится проводить обноление.
RWSergey
давай код, что она делает после галочки. Может это можно как то обойти?
давай код, что она делает после галочки. Может это можно как то обойти?
RWSergey
Цитата:
у грида есть функции типа DisableControl и EnableControl, может чуть нетак называется
Которые отключают и включают видимость перемещения по гриду.
Попробуй!
Цитата:
Кто-нибудь знает как избавиться от таких скачков.
Нужно очень.
у грида есть функции типа DisableControl и EnableControl, может чуть нетак называется
Которые отключают и включают видимость перемещения по гриду.
Попробуй!
MaximSG
Пробовал непроходит. После EnableControl всё равно происходит тот-же скачок.
ironwit
Уточняю
Существуют две таблицы:
Например (показываю только значимые поля)
Таблица 1 (Tab1)
kod number pk
name varchar2
В таблице хранится полный список объектов.
Таблица 2 (Tab2)
kod_t number pk
В таблице хранися выбранные данные.
Выборка:
SELECT ROWID, KOD, name, 0 ab
FROM tab1 d
where kod not in (select kod_t from tab2)
Union all
SELECT ROWID, KOD, name, 1 ab
FROM tab1 d
where kod in (select kod_t from tab2)
order by kod
Dataset связывается с гридом 3 поле (ab) представлено в виде CHECKED.
При щелчке мыши если ab=0 то происходит вставка строки в tab2 если ab=1 то удаление из неё.
Типа вот так.
Пробовал непроходит. После EnableControl всё равно происходит тот-же скачок.
ironwit
Уточняю
Существуют две таблицы:
Например (показываю только значимые поля)
Таблица 1 (Tab1)
kod number pk
name varchar2
В таблице хранится полный список объектов.
Таблица 2 (Tab2)
kod_t number pk
В таблице хранися выбранные данные.
Выборка:
SELECT ROWID, KOD, name, 0 ab
FROM tab1 d
where kod not in (select kod_t from tab2)
Union all
SELECT ROWID, KOD, name, 1 ab
FROM tab1 d
where kod in (select kod_t from tab2)
order by kod
Dataset связывается с гридом 3 поле (ab) представлено в виде CHECKED.
При щелчке мыши если ab=0 то происходит вставка строки в tab2 если ab=1 то удаление из неё.
Типа вот так.
а если отключить грид от запроса, спозиционировать его и включить? По идее скачка быть не должно. Хотя конечно будет мигание.
Или, извратный способ. Данные хранить во временной таблице, после изменения делать update в основной таблице и ручками править временную. Тогда скачков точно не будет.
Или, извратный способ. Данные хранить во временной таблице, после изменения делать update в основной таблице и ручками править временную. Тогда скачков точно не будет.
ironwit
Да спозициировать запрос без проблем, но при "включении" grid текущюю запись делает первой в списке.
Как запомнить положение этой записи в самом grid-e до refresh, и вернуть это положение после refresh ???????????????????????????????????????????????????????????????????????????????????????????????
Как узнать какая по счёту сверху в grid-e была текущая запись????????????????????????
Да спозициировать запрос без проблем, но при "включении" grid текущюю запись делает первой в списке.
Как запомнить положение этой записи в самом grid-e до refresh, и вернуть это положение после refresh ???????????????????????????????????????????????????????????????????????????????????????????????
Как узнать какая по счёту сверху в grid-e была текущая запись????????????????????????
Цитата:
Как узнать какая по счёту сверху в grid-e была текущая запись
Подожди, тебе нужно чтобы указатель стал на ту запись которая была до обновления или чтобы он стал и на запись и на тоже место - которое было до обновления?
Я по этому поводу пользуюсь BookMark. Да вроде ничего так работает.
ironwit
Цитата:
Да без проблем.
Мне нужно чтобы визуально Grid неизменился (чтобы под указателем мыши осталась таже запись что и была до обновления).
BigBoBo1
По моему BookMark можно применить к DataSet с которым связан Grid, а не к ниму самому.
Цитата:
Подожди, тебе нужно чтобы указатель стал на ту запись которая была до обновления
Да без проблем.
Мне нужно чтобы визуально Grid неизменился (чтобы под указателем мыши осталась таже запись что и была до обновления).
BigBoBo1
По моему BookMark можно применить к DataSet с которым связан Grid, а не к ниму самому.
тогда тебе только заводить временную базу для данных и ее вручную синхронизировать с запросами, не допуская ее открытия закрытия. В Ehlib я это делаю так. Пример из процедурки - там в зависимости от введенной суммы, автоматом ставится НДС
procedure TForm12.DBGridEh1Columns7UpdateData(Sender: TObject;
var Text: String; var Value: Variant; var UseText, Handled: Boolean);
begin
if (form12<>nil)and(dbgrideh1.fieldcount>10) then
begin
if (length(text)>0) then
begin
if value>dbgrideh1.Columns[7].Field.value then value:=dbgrideh1.Columns[7].Field.value;
dbgrideh1.Columns[10].Field.Value:=roundto(value/100*form1.nds,-2);
end else
begin
value:=0;
text:='0';
if value>dbgrideh1.Columns[7].Field.value then value:=dbgrideh1.Columns[7].Field.value;
dbgrideh1.Columns[10].Field.Value:=roundto(value/100*form1.nds,-2);
end;
end;
end;
Ничего и нигде не скачет и все нормально отображается. Пробуй.
procedure TForm12.DBGridEh1Columns7UpdateData(Sender: TObject;
var Text: String; var Value: Variant; var UseText, Handled: Boolean);
begin
if (form12<>nil)and(dbgrideh1.fieldcount>10) then
begin
if (length(text)>0) then
begin
if value>dbgrideh1.Columns[7].Field.value then value:=dbgrideh1.Columns[7].Field.value;
dbgrideh1.Columns[10].Field.Value:=roundto(value/100*form1.nds,-2);
end else
begin
value:=0;
text:='0';
if value>dbgrideh1.Columns[7].Field.value then value:=dbgrideh1.Columns[7].Field.value;
dbgrideh1.Columns[10].Field.Value:=roundto(value/100*form1.nds,-2);
end;
end;
end;
Ничего и нигде не скачет и все нормально отображается. Пробуй.
Страницы: 1
Предыдущая тема: алгоритм перестановки чисел без повторов
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.