Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Точное позиционирование в DBGrid   Найти похожие ветки 

 
mr.IL ©   (2005-05-21 11:09) [40]

Локальную таблицу отдаем на редактирование гридом. Когда грид редактирует связанный с ним ДС напрямую, он не смещается после поста.


 
Bronco ©   (2005-05-21 13:02) [41]


> mr.IL ©   (21.05.05 11:09) [40]

Тогда нафига нужна локальная таблица, напрямую можно и серверную редактировать. Тот же самый Post и никакого смещения.
Речь то идет о другом: автору после редактирования нужно полностью обновить набор данных, т.е. close-open. Он строго придерживается сей идеологии и отходить от нее не хочет.


 
Alex_S   (2005-05-22 14:01) [42]

Этот вопрос здесь уже обсуждался (например, в начале января 2005 г. Msguns тогда много отдыхал, числа до 15, как водится в Украине, поэтому и пропустил). Кто-то был недоволен предлагаемым решением, но я его использую. Так что, если это кого-то ещё интересует, то пожалуйста. (С тех пор еще немного подчистил)
Суть задачи следующая. Например, DBGrid показывает записи нередактируемого набора TQuery, запись изменяется через TTable, надо вернуть её в DBGrid так, чтобы она попала в ту же строку после перечитки TQuery.
Предлагаемое решение.
Для удобного вида можно в DBGrid1.Options включить dgRowSelect, чтобы ведялалсь вся строка.
Здесь важно определить, в какой строке (начиная с номера 1) из видимого списка DBGrid находилась редактируемая запись. Для этого предлагается следующая процедура обработки события DBGrid1.OnDrawColumnCell:

        { --- Текущая строка в DBGrid1 ---- }

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if gdSelected in State then
   NRow:=(Rect.Top div 21);
{ при перерисовке ячеек DBGrid для выделенной ячейки определяем номер строки NReg - глобальная переменная типа integer;
 21 - высота строки. У себя проверьте эту величину.
 Для того, чтобы затем случайно она не изменилась в других    экранных режимах для формы Form1 задайте свойство Scaled:=false }
end;


А теперь воспользуемся вычисленным номером NRow при перечитке TQuery:
При этом указатель сначала стоит на редактируемой записи (которая вносится в набор данных  - Table1.Post)


procedure TForm1.RereadQuery(Sender: TObject);
var k,k0,n: integer;
begin
k:=Query1.Fields.Fields[0].AsInteger;
n:=(DBGrid1.Height div 21) div 2; { номер средней строки в DBgrid1 }
if Query1.RecordCount<n then n:=NRow; { Если записей мало }
DBGrid1.DataSource.DataSet.DisableControls;
Query1.Close; Query1.Open;
Query1.Locate("Code",k,[]);
Query1.MoveBy(n-NRow); { обращаемся к средней строке DBGrid"а }
k0:=Query1.Fields.Fields[0].AsInteger; { запоминаем значение Code этой записи -
  в задаче использовался набор данных с первым полем Code типа Autoinc }
Query1.Locate("Code",k0,[]); { устанавливаем указатель на среднюю в DBGrid запись }
Query1.MoveBy(NRow-n); { теперь DBGrid двигаться не будет, устанавливаем указатель на измененную запись }
DBGrid1.DataSource.DataSet.EnableControls; { оживляем DBGrid1 }
DBGrid1.SetFocus; { и передаем ей фокус, если надо }
end;

Здесь я также учёл, что в результате редактирования записи она может оказаться уже на новом месте в наборе данных - по условиям сортировки и проч.
Поле Code здесь уникальное, поэтому запись все равно будет однозначно определена. Если кому-то покажется, что где-то
действия Locate и MoveBy лишние, то попробуйте сократить - мне кажется, они несколько по-разному работают с DBGrid.

PS. Не говорю, что решение единственно верное, но ничего лучшего для поставленной цели я пока не придумал. Сделаете лучше, флаг вам в руки. Стрелять пианиста не надо, он играет, как умеет.

С уважением, Alex_S



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.06 c
14-1117214164
Alexander Panov
2005-05-27 21:16
2005.06.29
Слов нет. Кто-то глючит.


14-1117953775
lookin
2005-06-05 10:42
2005.06.29
Кто на фото?


1-1118214852
Zhachuk
2005-06-08 11:14
2005.06.29
UTF-8 to Windows-1251 (ANSI) --> библиотека DIConverters.pas


3-1116317238
Lord Zmiy
2005-05-17 12:07
2005.06.29
dbf - кодировка


1-1117624739
towik
2005-06-01 15:18
2005.06.29
Как можно вывести тип Множество на форму?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский