Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Delphi - DBGrid

Автор: vovanzp
Дата сообщения: 07.05.2006 10:08
Здравствуйте! НЕобходимо сделать сортировку в DBGrid по алфавиту или по возрастанию (по номеру если). Именно сортировка а не фильтровка. Нужно очень. Кто знает, подскажите как сделать.. Можно прямо по нажатию на заголовок стобца или в событии OnClick отдельной кнопки.

Добавлено:
если это невозможно сделать в DBGrid'e тогда может на уровне данных в DataSet или Table'e
Автор: AlxMonster
Дата сообщения: 07.05.2006 13:32
vovanzp
Почитай это
_http://delphiworld.narod.ru/base/dbgrid_sort.html
Автор: vovanzp
Дата сообщения: 07.05.2006 18:36
AlxMonster
Это немного не то. Ну во первых оно не работает , а можно сделать так что бы сортировка была просто по нажатию кнопки?
Автор: AlxMonster
Дата сообщения: 07.05.2006 19:23
vovanzp
А что конкретно не работает? Я сделал все аккуратно как там написано и все заработало.
Попробуй сделать точно так как там сказано.
Выслать проект почтой?
Автор: vovanzp
Дата сообщения: 07.05.2006 19:24
Выдает ошибку в строке Application.Initializate при попытке скомпилировать. Если можно то да. Заранее спасибо
Автор: DroN_S
Дата сообщения: 07.05.2006 19:41
vovanzp
какая у тебя БД?
какой доступ к базе?
на счёт сетки, используй EhLib
Автор: vovanzp
Дата сообщения: 07.05.2006 19:43
DroN_S
БД у меня Paradox 7 (*.db)
Доступ через DataSource и Table
Автор: AlxMonster
Дата сообщения: 07.05.2006 20:26
vovanzp
Пример отправил.

Цитата:
Выдает ошибку в строке Application.Initializate при попытке скомпилировать.

Это вряд ли. Ошибка возникает если перед выполнением кусочка кода, добавленного в FormCreate, таблица открыта. Перед этим ее надо закрывать.
Автор: DroN_S
Дата сообщения: 07.05.2006 20:29
vovanzp
мой тебе совет, переходи как минимум на Access и используй TQuery !!!!!!
и ещё, если ты собираешься работать с БД в дальнейшем, то без знания языка SQL даже не пытайся что то делать...
Автор: vovanzp
Дата сообщения: 08.05.2006 12:35
Во все примерах используется HeaderControl а можно это сделать не используя его? просто указывая например в Edit'e столбец и по нажатию на Button выполнять сортировку?
Автор: AlxMonster
Дата сообщения: 08.05.2006 16:50
vovanzp
На самом деле используй тогда TQuery с запросом типа "select * from mytable order by myfield" или поищи компонент с готовой сортировкой.
Автор: DroN_S
Дата сообщения: 08.05.2006 19:44

Цитата:
поищи компонент с готовой сортировкой

EhLib
Автор: vovanzp
Дата сообщения: 08.05.2006 20:49
Скачал пакет BvComp (т.е. EhLib) - уда входит bvDbGrid. Но при компиляции выдает ошибку в файле bvDBGrid.pas в строке OldCOL:=Cell.X, ошибка - [Error] bvDBGrid.pas(1680): Left side cannot be assigned to в чем дело?
Автор: AlxMonster
Дата сообщения: 08.05.2006 21:00
vovanzp
Версия EhLib, Delphi ?

Навскидку могу посоветовать поставить опцию {$J+} или что то же самое {$WRITEABLECONST ON}
Автор: vovanzp
Дата сообщения: 09.05.2006 06:37
Delphi 7, EhLib (bvComp - версия не написана нигде)
Автор: DroN_S
Дата сообщения: 09.05.2006 07:44
vovanzp
EhLib он и в африке EhLib!!!!
сходи в варезник и найди нормальную версию библиотеки....
либо скачай с официалке, там до 4-й версии есть бесплатный пакет.... на семёрку подойдёт
Автор: vovanzp
Дата сообщения: 10.05.2006 14:02
Может кто знает, где можно почитать про экспорт данных из DBgrid'a в Excel или в Word, если возможно. Заранее спасибо
Автор: AlxMonster
Дата сообщения: 10.05.2006 16:26
vovanzp
Если по-простому (по крайней мере, для меня) юзай сам Excel через Ole.
Можно еще использовать какой-нибудь компонент для отчетов с возможностью экспорта в Excel. Хоть тот же Fast Report (поищи в варезнике)
Автор: fixer84
Дата сообщения: 10.05.2006 18:05
vovanzp
Как экспортировать содержимое DBGrid в Excel или ClipBoard.
Автор: vovanzp
Дата сообщения: 10.05.2006 20:23
fixer84
Взял с сайта который ты дал код, переделал его под себя (чтобы сразу в Excel экспорт был). Вот, что получилось. При нажатии на кнопку вылетает сообщение типа "Access vioalation at address ....... in module 'Project 1'. Read of address ....", и одновременно с этим открывается Excel и туда вставляется все из буфера обмена =-0. В чем дело? Может ошибка в коде. Хелп плиз

procedure TForm1.Button1Click(Sender: TObject);
var
bm: TBookmark;
col, row: Integer;
sline: string;
mem: TMemo;
ExcelApp: Variant;
begin
DBGrid1.DataSource.DataSet.DisableControls;
bm := DBGrid1.DataSource.DataSet.GetBookmark;
DBGrid1.DataSource.DataSet.First;

ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Тест';

// Сперва отправляем данные в memo
// работает быстрее, чем отправлять их напрямую в Excel
mem := TMemo.Create(Self);
mem.Visible := false;
mem.Parent := Form1;
mem.Clear;
sline := '';

// добавляем информацию для имён колонок
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);

// получаем данные из memo
for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
DBGrid1.DataSource.DataSet.Next;
end;

ExcelApp.Workbooks[1].WorkSheets['Тест'].Paste;
ExcelApp.Visible := true;

FreeAndNil(ExcelApp);
DBGrid1.DataSource.DataSet.GotoBookmark(bm);
DBGrid1.DataSource.DataSet.FreeBookmark(bm);
DBGrid1.DataSource.DataSet.EnableControls;
end;
Автор: DroN_S
Дата сообщения: 10.05.2006 21:57
vovanzp

Код:
Procedure SendtoExcel(ShFile: String; Querys: TQuery);
Var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
BeginCol, BeginRow, j: integer;
RowCount, ColCount: Integer;
Begin
BeginCol := 1;
BeginRow := 3;

RowCount := Querys.RecordCount;
ColCount := Querys.FieldDefs.Count;

ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Application.EnableEvents := false;

Workbook := ExcelApp.WorkBooks.Add(ShFile);
ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

Querys.DisableControls;
Querys.First;
While Not Querys.eof Do
Begin
For J := 1 To Querys.FieldDefs.Count Do
Begin
ArrayData[Querys.RecNo, J] :=
Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
End;
Querys.Next;
End;

Querys.EnableControls;
Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1,
BeginCol + ColCount - 1];
Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
Range.Value := ArrayData;
ExcelApp.Visible := True;
End;
Автор: fixer84
Дата сообщения: 11.05.2006 07:19
vovanzp
Переписал процедуру, без memo и буфера обмена.


Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,index: Integer;
ExcelApp,sheet: Variant;

begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := true;
ExcelApp.WorkBooks.Add(-4167);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Тест';
sheet:=ExcelApp.WorkBooks[1].WorkSheets['Тест'];
index:=3; //c какой строки вставлять в excel'e
DBGrid1.DataSource.DataSet.First;
for i:=1 to DBGrid1.DataSource.DataSet.RecordCount do
begin
for j:=1 to DBGrid1.FieldCount do
sheet.cells[index,j]:=DBGrid1.fields[j-1].asstring;
inc(index);
DBGrid1.DataSource.DataSet.Next;
end;
end;
Автор: vovanzp
Дата сообщения: 11.05.2006 12:50
fixer84

При попытке скомпилировать, вылетает ошибка:
[Error] Unit1.pas(47): '[' expected but '.' found



Добавлено:
DroN_S

а что передается в качестве второго параметра процедуре?
Автор: dyr farot
Дата сообщения: 11.05.2006 13:03
ну и привел бы эту строку...
потому как тут совершенно не понятно какая из них 47-я
Автор: vovanzp
Дата сообщения: 11.05.2006 13:04
dyr farot

sheet.cells:=DBGrid1.fields.AsString;
Автор: fixer84
Дата сообщения: 11.05.2006 15:18
vovanzp
Ты хотя бы код правильно скопировал, что ли.
Потому что нет такой строчки
Цитата:
sheet.cells:=DBGrid1.fields.AsString;

Кстати, в раздел uses не забыл ComObj добавить?
Код, который я привел выше, 100% рабочий.


Автор: DroN_S
Дата сообщения: 11.05.2006 18:10
vovanzp

Цитата:
а что передается в качестве второго параметра процедуре?

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

Код:
SendtoExcel('c:\Sample.xls',DM.TQuery);
Автор: vovanzp
Дата сообщения: 11.05.2006 18:49
DroN_S
теперь понял. спасибо.

Такой вопрос: как возможно ли сделать экспорт из DBGrid в готовый шаблон (Excel файл)?

Автор: DroN_S
Дата сообщения: 11.05.2006 19:51
vovanzp
а чем тебя вышеприведённый пример не устраивает?
Автор: vovanzp
Дата сообщения: 11.05.2006 19:59
DroN_S
дело в том, что мне необходимо сделать шапку в документе. поэтому я хотел сделать шаблон, и просто потом туда все экспортировать

Страницы: 12

Предыдущая тема: Написать тетрис на Turbo Pascal 7.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.