Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 177

/ вопрос открыт /

Как прочитать все данные из таблици dbgrid,
в переменные
дайте подробное объяснение, а то у меня получается читать только текущую строку
Заранее всем благодарен

Губкин Александр Александрович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Губкин Александр Александрович (статус: Посетитель)
Вопрос отправлен: 27 ноября 2006, 08:05
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, Губкин Александр Александрович!
Для того чтобы переместится к следующей записи в наборе данных исользуй метод next.
Пример сохранения данных в переменные (если честно я в не вижу в нем логики, но вопрошающему виднее)
procedure data2vars
begin
DBGrid.DataSource.DataSet.First; <- Встанем на начало набора данных
while not(DBGrid.DataSource.DataSet.Eof) do <- Будем просматривать набор данных до конца
begin
//тут ты присваеваешь своим переменным данные полек
DBGrid.DataSource.DataSet.Next; // <- переход к следующей записи
end;
end;

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Время отправки: 27 ноября 2006, 08:38

Ответ #2. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Губкин Александр Александрович!
Как я говорил ранее TDBGrid всего лишь отображает данные хранимые в табличной форме. Сами же данные хранятся в TDataSet. В настоящий момент времени вы работаете с активной записью TDataSet.
Для навигации по записям существуют методы First, Next, Prior, Last, MoveBy(n) - где n количество строк в таблице на которые сдвигается курсор, положительное значение вниз, отрицательное вверх.
Теперь привожу пример.
В новом проекте кидаешь на форму TDBGrid - именуем его Grd, TTable - имя Tbl, TDataSource - DS и кнопку TButton - Btn.
DEMO база у Borland при установленной BDE имеет alias DBDEMOS
В Object Inspector устанавливаем property для TTable Name-Tbl; DatabaseName-DBDEMOS; TableName-country.db. Проверим подключение установив свойство Active:=true; Если ничего не выскочило особенного то всё нормально установим обратно значение в false;
Далее для TDataSource Name-DS; DataSet-Tbl
Теперь TDBGrid Name-Grd; DataSource-DS
Теперь кинем на форму TMemo Name-Mm куда будем переносить данные из таблицы.
Осталось при вызове приложения подключиться к таблице, т.е. на OnCreate формы вставляем Tbl.Active:=true;
Далее смотри пример

Приложение:
  1. unit Unit2
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;
  7.  
  8. type
  9. TForm1 = class(TForm)
  10. Grd: TDBGrid;
  11. Tbl: TTable;
  12. DS: TDataSource;
  13. Mm: TMemo;
  14. Btn: TButton;
  15. procedure BtnClick(Sender: TObject);
  16. procedure FormCreate(Sender: TObject);
  17. end;
  18.  
  19. var
  20. Form1: TForm1;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. procedure TForm1.BtnClick(Sender: TObject);
  27. var
  28. perem1, perem2: String;
  29. nomrec: integer;
  30. begin
  31. Mm.Clear;
  32. //&#1047;&#1072;&#1087;&#1086;&#1084;&#1085;&#1080;&#1083;&#1080; &#1079;&#1072;&#1087;&#1080;&#1089;&#1100; &#1075;&#1076;&#1077; &#1073;&#1099;&#1083;&#1080; &#1074; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;&#1077;
  33. nomrec:=Tbl.RecNo;
  34. //&#1050; &#1085;&#1072;&#1095;&#1072;&#1083;&#1091; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;&#1099;
  35. Tbl.First
  36. //&#1055;&#1086;&#1082;&#1072; &#1085;&#1077; &#1076;&#1086;&#1081;&#1076;&#1105;&#1084; &#1076;&#1086; &#1082;&#1086;&#1085;&#1094;&#1072;
  37. while not Tbl.Eof do
  38. begin
  39. //&#1055;&#1088;&#1080;&#1089;&#1074;&#1086;&#1080;&#1084; &#1079;&#1085;&#1072;&#1095;&#1077;&#1085;&#1080;&#1103; &#1087;&#1077;&#1088;&#1077;&#1084;&#1077;&#1085;&#1085;&#1099;&#1084;
  40. //&#1055;&#1080;&#1096;&#1091; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1075;&#1083;&#1103;&#1076;&#1085;&#1086;&#1089;&#1090;&#1080;
  41. perem1:=Tbl.Fields[0].AsString;
  42. perem2:=Tbl.Fields[1].AsString;
  43. //&#1040; &#1090;&#1077;&#1087;&#1077;&#1088;&#1100; &#1079;&#1072;&#1085;&#1086;&#1089;&#1080;&#1084; &#1079;&#1085;&#1072;&#1095;&#1077;&#1085;&#1080;&#1103; &#1074; Mm
  44. Mm.Lines.Add(Tbl.Fields[0].AsString;
  45. +' - '+Tbl.Fields[1].AsString;);
  46. //&#1048;&#1076;&#1105;&#1084; &#1082; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1077;&#1081; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;
  47. Tbl.Next;
  48. end;
  49. //&#1042;&#1086;&#1079;&#1074;&#1088;&#1072;&#1097;&#1072;&#1077;&#1084; &#1082;&#1091;&#1088;&#1089;&#1086;&#1088; &#1082; &#1079;&#1072;&#1087;&#1086;&#1084;&#1085;&#1077;&#1085;&#1085;&#1086;&#1081; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;
  50. Tbl.RecNo:=nomrec;
  51. end;
  52.  
  53. procedure Form1.FormCreate(Sender: TObject);
  54. begin
  55. Tbl.Active:=true;
  56. end;
  57.  
  58. end.
  59.  
  60. &#1059;&#1076;&#1072;&#1095;&#1080;!!!
  61.  


Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 27 ноября 2006, 13:18

Ответ #3. Отвечает эксперт: Denisss

Здравствуйте, Губкин Александр Александрович!

Конечно, Вам уже дали ответ, но я не считаю его до конца корректным. Потому привожу Вам мою модификацию предыдущего ответа, в которой исправлены некоторые ошибки и ускорена работа. Комментарии к примеру остаются прежними (см. выше).
С большими БД всегда хочется хоть немного ускорить работу программы.

Удачи!

Приложение:
  1. procedure TForm1.BtnClick(Sender: TObject);
  2. var
  3. perem1, perem2: String;
  4. Bookmark: TBookmark;
  5. begin
  6. Mm.Clear;
  7.  
  8.  
  9.  
  10. Bookmark:= Tbl.GetBookmark;
  11.  
  12.  
  13.  
  14.  
  15.  
  16. Tbl.DisableControls;
  17.  
  18. Mm.Lines.BeginUpdate;
  19.  
  20.  
  21. Tbl.First;
  22.  
  23. while not Tbl.Eof do
  24. begin
  25.  
  26.  
  27. perem1:= Tbl.Fields[0].AsString;
  28. perem2:= Tbl.Fields[1].AsString;
  29.  
  30.  
  31. Mm.Lines.Add(perem1 + ' - ' + perem2);
  32.  
  33. Tbl.Next;
  34. end;
  35.  
  36.  
  37. Tbl.GotoBookmark(Bookmark);
  38.  
  39. Tbl.FreeBookmark(Bookmark);
  40.  
  41. Tbl.EnableControls;
  42.  
  43. Mm.Lines.EndUpdate;
  44. end;


Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 27 ноября 2006, 22:48


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 27 ноября 2006, 13:05; участников в обсуждении: 2.
Александр-446

Александр-446 (статус: Посетитель), 27 ноября 2006, 12:44 [#1]:

Зачем себе жизнь то усложнять, а?
Можно сделать проще:
for i:=1 to stringgrid1.rowcount do begin
m[i]:=stringgrid1.cells[1,i];
m[i]:=stringgrid1.cells[2,i];
m[i]:=stringgrid1.cells[3,i];
...
m[i]:=stringgrid1.cells[n,i];
end;
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 27 ноября 2006, 12:47 [#2]:

Интересно, и что это даст?
Александр-446

Александр-446 (статус: Посетитель), 27 ноября 2006, 12:54 [#3]:

Как "что даст"?
Александр-446

Александр-446 (статус: Посетитель), 27 ноября 2006, 12:54 [#4]:

Результат
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 27 ноября 2006, 13:01 [#5]:

Вопрос был в том как сместится на следующую запись в наборе данных (в частном случае это таблица БД), StringGrid к базам данных никакого отношения не имеет.
Александр-446

Александр-446 (статус: Посетитель), 27 ноября 2006, 13:05 [#6]:

согласен... ошибся...
У меня просто сразу на ум пришла эта stringgrid (c бд знаком)...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 20 августа 2017, 04:55
Выполнено за 0.16 сек.
Рейтинг@Mail.ru