powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. DBGrid экспорт данных
23 сообщений из 23, страница 1 из 1
Delphi 7. DBGrid экспорт данных
    #39569137
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.
Делаю вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
procedure TForm1.sBitBtn21Click(Sender: TObject);
var F:textfile;
headers,lines:string;
i:integer;
begin
AssignFile (f, Form1.spath+'\export\' + 'export.txt');
Rewrite (f);
        for i:=0 to GRegisration.Columns.Count-1 do
            begin
               headers:=headers+GRegisration.Columns[i].Title.Caption+#9;
            end;
         writeln (f,headers);

QRegistration.First;
while not QRegistration.Eof do
        begin
           lines:='';
        for i:=0 to GRegisration.Columns.Count-1 do
           lines:=lines+GRegisration.Columns[i].Field.Text+#9;

        writeln (f,lines);
        QRegistration.Next;
        end;

CloseFile(f);
messageDlg('Экспорт завершен. Файл: '+Form1.spath+'\export\' + 'export.txt', mtInformation, [mbOK], 0);
ShellExecute(0,'Open',pchar(Form1.spath+'\export\' + 'export.txt'),nil,nil,1);



Может есть другой способ?
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569148
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666...выгрузить данные из DBGrida без визуализации перехода по строкам...

Схема:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569149
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.
Можно: DisableControls, EnableControls. Либо отвязать datasource.dataset и затем вернуть.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569151
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666,

DataSource.enabled:=false;
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569156
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДВалерий666...выгрузить данные из DBGrida без визуализации перехода по строкам...

Схема:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;


Access violation....

Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569158
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWindВалерий666,

DataSource.enabled:=false;Спасибо, помогло! К вечеру уже мозг не соображает...
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569159
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
Не очевидно.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569162
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВалерий666Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569173
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666wadmanпропущено...

Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
Очевидно идёт обращение к не тому участку памяти или к не инициализированному объекту.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569177
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666wadmanпропущено...

Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
Не вылазит.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569200
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обращаться в методе класса к экземпляру класса - моветонВалерий666
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.sBitBtn21Click(Sender: TObject);
var F:textfile;
headers,lines:string;
i:integer;
begin
AssignFile (f, Form1.spath+'\export\' + 'export.txt');
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569243
VDSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Почему тогда именно на этом моменте вылазит критическая ошибка?
Пока переделанный указанным образом код не приведешь, гадать представляется бессмысленным.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569288
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий666,
Я так делаю:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure Export(Grid: tDBGrid);
var
  SaveBeforeScroll: TDataSetNotifyEvent;
  SaveAfterScroll: TDataSetNotifyEvent;
  SaveAutoCalcFields: Boolean;
begin
  with Grid.Datasource.DataSet do
    begin
      DisableControls;
      SaveBeforeScroll := BeforeScroll;
      SaveAfterScroll := AfterScroll;
      SaveAutoCalcFields := AutoCalcFields;
      BeforeScroll := nil;
      AfterScroll := nil;
      AutoCalcFields := False;

      //Экспортируем куда нужно
      First;
      while not(eof) do
        begin
          next;
        end;

      EnableControls;
      BeforeScroll := SaveBeforeScroll;
      AfterScroll := SaveAfterScroll;
      AutoCalcFields := SaveAutoCalcFields;
    end;
end;


Ничего не мигает.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569335
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, забыл про BookMark:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure Export(Grid: tDBGrid);
var
  SaveAutoCalcFields: Boolean;
  BM: TBookmark;
begin
  with Grid.Datasource.DataSet do
    begin
      BM := GetBookmark;
      DisableControls;     
      SaveAutoCalcFields := AutoCalcFields;
      BeforeScroll := nil;
      AfterScroll := nil;
      AutoCalcFields := False;

      //Экспортируем куда нужно
      First;
      while not(eof) do
        begin
          next;
        end;

      GotoBookmark(BM);
      EnableControls; 
      AutoCalcFields := SaveAutoCalcFields;
    end;
end;



Единственное что после GotoBookmark, выделенная строка встает посередине таблицы.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569424
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное что после GotoBookmark, выделенная строка встает посередине таблицы.[/quot]

А оно тебе надо?

DBGridRowPos:=TGridCracker(DBGrid1).Row;
...
if DBGridRowPos>0
then ScrollActiveToRow(DBGrid1,DBGridRowPos);
...

procedure TForm.ScrollActiveToRow(Grid : TDBGrid; ARow : Integer);
var FTitleOffset, SDistance : Integer;
NewRect : TRect;
RowHeight : Integer;
NewRow : Integer;
begin
with TGridCracker(Grid) do begin
NewRow:= Row;
FTitleOffset:= 0;
if dgTitles in Options then inc(FTitleOffset);
if ARow = NewRow then Exit;
with DataLink, DataSet do
try
BeginUpdate;
Scroll(NewRow - ARow);
if (NewRow - ARow) < 0 then ActiveRecord:= 0
else ActiveRecord:= VisibleRowCount - 1;
SDistance:= MoveBy(NewRow - ARow);
NewRow:= NewRow - SDistance;
MoveBy(ARow - ActiveRecord - FTitleOffset);
RowHeight:= DefaultRowHeight;
NewRect:= BoxRect(0, FTitleOffset, ColCount - 1, 1000);
ScrollWindowEx(Handle, 0, - RowHeight * SDistance, @NewRect, @NewRect, 0, nil, SW_Invalidate);
MoveColRow(Col, NewRow, False, False);
finally
EndUpdate;
end;
end;
end;


У меня по одному проекту тоже так хотели, а потом пришли у выводу, что стандартное поведение лучше... Это проявляется при появлении в наборе новых записей, которые остаются вне отображаемой части таблицы....
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569475
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот из-за таких выеживаний с датасетом, на ровном месте, забил на идеологию DB-Aware полностью.
Сделал себе некий аналог датасета, который больше напоминает динамический массив записей. Поначалу вообще так и было, но оказалось неудобным подгонять методы по разные имена полей. В итоге поля создаются динамически.

Для визуализации данных использую VirtualTreeView в режиме грида.
Связывает грид и мой датасет некое подобие DS, но понятие "текущей записи" есть только для самого грида. Все что ниже никакой такой ограниченности не имеет. Соответственно бегать по этому "датасету" легко и просто.

В данном случае вместо

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
QRegistration.First;
while not QRegistration.Eof do
        begin
           lines:='';
        for i:=0 to GRegisration.Columns.Count-1 do
           lines:=lines+GRegisration.Columns[i].Field.Text+#9;

        writeln (f,lines);
        QRegistration.Next;
        end;



Было бы нечто вроде

Код: pascal
1.
2.
3.
4.
5.
6.
for i := 0 to CDS_Reg.Count-1 do begin
  s := '';
  for j := 0 to CDS_Reg.FieldsWorl.Count-1 do begin
    s := s + CDS_Reg.ReadString(i, j) + #9;
  end;{for j}
end;{for i}



Заполняется данными этот буфер вот таким кодом:

Код: pascal
1.
2.
3.
4.
5.
6.
  
  CDV.RowSavePosition;
  QSel1.ParamByName('id').AsInteger  := Fid;
  CDS.ExecSelect(QSel1);
  CDV.Sync;
  CDV.RowRestorePositionID;



QSel - это компонент выполняющий запрос но имеющий буфер только на одну запись.
В FibPlus это TpFIBQuery

CDV.Sync в частности синхронизирует поля грида с датасетом, приводит количество записей в дереве к количеству записей в CDS и дергает перерисовку у дерева. После чего дерево, если ему нужно отрисовать ячейку, просто запрашивает ее значение в CDS.
Так же через CDV привязан StatusBar - после выполнения запроса в него автоматом пишется количество записей в CDS и время выполнения запроса.

Из удобных моментов - эти компоненты по сути не имеют никакой прривязки к базам.
Есть например такой метод

CDS.DirList('c:\DATA\*.txt');

Получит список файлов по маске и создаст на каждый файл по записи в CDS.
Какую информацию при этом он запишет - зависит от наличия в CDS полей.
Предопределенные имена
FILE_NAME
FILE_SIZE
FILE_DATE
есть поле - соответственная инфа запишется. Нет поля - не запишется.

Или, создаем поле CHECK_BOX - в первой колонке появляется галка чекбокса. Установка\снятие меняет значение в поле CHECK_BOX которое Integer. Потом легко пробегаемся по буферу выбирая записи с чеком или без.

Поле ROW_FONTSTYLE отвечает за стиль шрифта в соответствующей строке.
Поле ROW_FONTSTYLE - цвет шрифта в строке. Пишем туда например "RED" - и строка красная.

В контекстное меню грида автоматически привязываются пункты меню "поиск по подстроке" и "сохранить в файл", сделано несколько форматов сохранения - XLS, CSV, TXT, INI, DBF - и они автоматические есть в любом гриде который прицеплен к этой системе.

Ну и т.д.

Конечно, это один из колхозных велосипедов, и он не допилен в должной степени что бы его можно было без стестения показывать другим :) но вот уже более 10 лет я радуюсь что теперь не связан с парадигмой DB-Aware, в том виде какой заложен в Delphi.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569520
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

Так в гриде тоже можно определенные строки выбрать.
У меня приблизительно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
TDatasetDisable = class(tObject)
      fSaveBeforeScroll: TDataSetNotifyEvent;
      fSaveAfterScroll: TDataSetNotifyEvent;
      fSaveAutoCalcFields: Boolean;
      fdataset: tDataset;
      fBookMark: tBookMark;
    public
      constructor Create(aDataset: tDataset);
      destructor destroy; override;
  end;

constructor TDatasetDisable.Create(aDataset: tDataset);
begin
  inherited Create();
  fDataset := aDataset;
  if assigned(fDataset) then
    begin
      fSaveBeforeScroll := fDataSet.BeforeScroll;
      fSaveAfterScroll  := fDataSet.AfterScroll;
      fSaveAutoCalcFields := false;
      fBookMark := fDataSet.BookMark;
      fDataSet.DisableControls;
      fDataSet.BeforeScroll := nil;
      fDataSet.AfterScroll := nil;
      fDataSet.AutoCalcFields := False;

    end;
end;

destructor TDatasetDisable.Destroy;
begin
  if assigned(fDataset) then
    begin
      fDataSet.EnableControls;
      fDataSet.BeforeScroll := fSaveBeforeScroll;
      fDataSet.AfterScroll := fSaveAfterScroll;
      fDataSet.AutoCalcFields := fSaveAutoCalcFields;
      fDataSet.GotoBookMark(fBookmark);
    end;
  inherited;
end;

procedure Export(Grid: tDBGrid);
var
  SetDatasetDisable := TDatasetDisable;	
begin
 SetDatasetDisable := TDatasetDisable.create(Grid.DataSource.DataSet);
 if (Grid.SelectedRows <> nil) and (Grid.SelectedRows.Count > 0)  then
 for i := 0 to Grid.SelectedRows.Count - 1 do
   begin
     //экспортируем строку               
   end
 else
   begin
     Grid.DataSource.DataSet.First;
     while not Grid.DataSource.DataSet.Eof do
       begin
         //экспортируем строку               
         Grid.DataSource.DataSet.Next;
       end;
    end;
 SetDatasetDisable.free;
end;



Правда грид "слегка" подпилен.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569525
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BaliТак в гриде тоже можно определенные строки выбрать.

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569651
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraksДа я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.

Никакого писца, сколько лет, никаких проблем. От контролов ничего не отвязывается, или Disablecontrols не фэншую.
Что теперь, если нужно выбранные строки, в excel или в csv выгрузить еще один Dataset для экспорта создавать - вот это да, писец.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39569670
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksBaliТак в гриде тоже можно определенные строки выбрать.

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.

Если в наше время буфер превышает размеры доступной памяти, то только последовательно. И печально.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39579181
almswiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxобращаться в методе класса к экземпляру класса - моветон
Так, да, согласен, но есть же Self.
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39579488
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schifraksпропущено...

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.

Если в наше время буфер превышает размеры доступной памяти, то только последовательно. И печально.

Если запрос, даже случайно, может вернуть массив данных превышающий "размеры доступной памяти" - то конечно, это повод работать с результатами построчно, последовательно. И тут нужно вообще забыть про какие-то датасеты и буферизацию. И для этого есть соответствующие компоненты, правда не во всех библиотеках доступа.

Но при чем тут рассматриваемая ситуация когда у нас это дело прицеплено к гриду? У нас что там забуферизировано данных больше чем есть памяти?
...
Рейтинг: 0 / 0
Delphi 7. DBGrid экспорт данных
    #39579509
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

авторНо при чем тут рассматриваемая ситуация когда у нас это дело прицеплено к гриду? У нас что там забуферизировано данных больше чем есть памяти?

Почему это так удивляет? Обычное состояние на больших наборах.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. DBGrid экспорт данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]