Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
ВнизКак получить данные из DataSet не меняя его активную запись. Найти похожие ветки
← →
Бездомный (2011-12-05 12:35) [0]Желательно с поиском по ключевому полю.
Пока сделал так, но, чувствую, можно сделать как-то быстрее, элегантнее, что ли:
IDField := List.DataController.KeyField;
IDValue := Node.KeyValue;
DL := TDataLink.Create;
try
DL.DataSource := List.DataController.DataSource;
DL.ReadOnly := True;
Row := DL.ActiveRecord;
try
for I := 0 to Pred(DL.RecordCount) do
begin
DL.ActiveRecord := I;
if DL.DataSet.FieldByName(IDField).Value = IDValue then
begin
Result := DL.DataSet.FieldByName(FieldName).Value;
Break;
end;
end;
finally
DL.ActiveRecord := Row;
end;
finally
DL.Free;
end;
← →
Медвежонок Пятачок © (2011-12-05 12:53) [1]если б было можно получить данные не меняя активную строку, то, я думаю, возможно было бы получить данные вообще не открывая датасета.
← →
Димка На (2011-12-05 12:54) [2]
> Медвежонок Пятачок © (05.12.11 12:53) [1]
Ну а как это TDBGrid делает?
← →
Jeer © (2011-12-05 12:56) [3]Ему открыть второй датасет религия не позволяет.
← →
Медвежонок Пятачок © (2011-12-05 12:56) [4]Ну а как это TDBGrid делает?
А он это делает?
← →
Jeer © (2011-12-05 12:57) [5]
> Ну а как это TDBGrid делает?
Он вообще ничего не делает, кроме отображения из датасета.
← →
Димка На (2011-12-05 12:57) [6]
> А он это делает?
А разве нет? Активная строка одна, а он при прорисовке показывает все.
← →
Димка На (2011-12-05 12:58) [7]
> Ему открыть второй датасет религия не позволяет.
Предлагаете открывать такой-же датасет и работать с ним?
← →
Медвежонок Пятачок © (2011-12-05 13:01) [8]А разве нет? Активная строка одна, а он при прорисовке показывает все.
Конечно нет.
← →
OW © (2011-12-05 13:03) [9]в ADO есть Clone, если это ADO
← →
Anatoly Podgoretsky © (2011-12-05 13:03) [10]
> А разве нет? Активная строка одна, а он при прорисовке показывает
> все.
Не может быть!
← →
Димка На (2011-12-05 13:04) [11]
> Конечно нет.
А как тогда?
> OW © (05.12.11 13:03) [9]
> в ADO есть Clone, если это ADO
ADO, ADO, при этом все данные в памяти будут скопированы?
← →
Медвежонок Пятачок © (2011-12-05 13:06) [12]А как тогда?
Любая видимая в гриде строка как минимум один раз была текущей в датасете после его открытия.
Или тебе удобнее думать, что грид обладает магией и телепатией?
← →
Плохиш © (2011-12-05 13:06) [13]
> Димка На (05.12.11 13:04) [11]
>
> > Конечно нет.
>
> А как тогда?
>
Создай событие OnDataChange, поставь в нëм точку останова и удивись.
← →
Ega23 © (2011-12-05 13:08) [14]
var
bm: TBookmark;
with DataSet do
begin
if IsEmpty then Exit;
DisableControls;
try
bm := GetBookmark;
try
First;
while not Eof do
begin
// Вот тута проверяем, чо за запись и подходит она нам или нет.
Next;
end;
GotoBookmark(bm);
finally
FreeBookmark(bm);
end;
finally
EnableControls;
end;
end;
← →
OW © (2011-12-05 13:08) [15]
> ADO, ADO, при этом все данные в памяти будут скопированы?
да
← →
Димка На (2011-12-05 13:12) [16]
> Или тебе удобнее думать, что грид обладает магией и телепатией?
Хотелось бы.
> Создай событие OnDataChange, поставь в нëм точку останова
> и удивись.
Интересно получается.
Например, взять не грид, а TcxDBTreeList, который в данном случае - то же самое. Ставлю на OnDataChange его DataSource точку останова, запускаю. Останов 2 раза, а строк, которые отображает контрол несколько сотен. Какой отсюда вывод?
← →
Димка На (2011-12-05 13:13) [17]
> Ega23 © (05.12.11 13:08) [14]
Спасибо. Я так понимаю это "православный" вариант?
← →
Медвежонок Пятачок © (2011-12-05 13:13) [18]Какой отсюда вывод?
вывод простой: ты наивный и неискушенный человек.
← →
OW © (2011-12-05 13:16) [19]давно бы написал
ADODS2.Clone(ADODS1); да посмотрел.
не знаю как реализовано, но внешне как ты описал
дергается вот это
Recordset20 = interface(Recordset15)
function Clone(LockType: LockTypeEnum): _Recordset; safecall;
← →
Димка На (2011-12-05 13:20) [20]
> OW © (05.12.11 13:16) [19]
> давно бы написал
> ADODS2.Clone(ADODS1); да посмотрел.
> не знаю как реализовано, но внешне как ты описал
>
Я уже попробовал - работает, но совесть мучает факт копирования данных. Хотя, может они и не копируются, а просто ссылка на них добавляется. Почитаю еще.
← →
Ega23 © (2011-12-05 13:21) [21]
> Спасибо. Я так понимаю это "православный" вариант?
Я антихристианин, посему мне обидны ваши слова.
← →
Димка На (2011-12-05 13:25) [22]
> Я уже попробовал - работает, но совесть мучает факт копирования
> данных. Хотя, может они и не копируются, а просто ссылка
> на них добавляется. Почитаю еще.
Нашел по первым трем ссылкам с гугла:
You do not actually make another physical copy which would require memory, but rather, you create a second (or third, etc.) pointer to the same Recordset.
То что нужно.
> Ega23 © (05.12.11 13:21) [21]
Ну это слово я с иронией употребил, потому и в кавычках. Извини в любом случае и спасибо за помощь!
← →
OW © (2011-12-05 13:28) [23]
> Хотя, может они и не копируются, а просто ссылка на них
> добавляется.
По моему, ссылка. Но!
Можно пустить 2 курсора, независимо. Один из - закрыть, открыть и т.п.
Я так делаю, когда доп.поток пускаю на выбранные данные(отчет формировать, печатать). А юзер новые может выбирать в это время.
← →
Плохиш © (2011-12-05 14:24) [24]
> Димка На (05.12.11 13:12) [16]
Теперь тоже самое для OnBeforeScroll
← →
Ega23 © (2011-12-05 14:46) [25]
> Например, взять не грид, а TcxDBTreeList, который в данном
> случае - то же самое. Ставлю на OnDataChange его DataSource
> точку останова, запускаю. Останов 2 раза, а строк, которые
> отображает контрол несколько сотен. Какой отсюда вывод?
Отсюда вывод такой, что TDataSource.OnDataChange дёргается при:
1. Изменении содержимого набора данных.
2. TDataSet.EnableControls
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c