Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2012, 16:56   #1
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию DBGridEh + StringGrid

Здравствуйте. Возникла проблема необходимо в DBGridEh выделить несколько строк и вывести их в StringGrid1 (ну или посоветуйте получше решение). То есть мы выбираем в DBGridEh нужные строки (Ctrl + click мыши) и нажав кнопку они появляются в StringGrid1, а потом суммируется столбик в StringGrid1 и результат появляется в Edit'e. Как можно реализовать...буду благодарен за совет.!
lutdan вне форума Ответить с цитированием
Старый 01.10.2012, 20:07   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

С помощью Bookmark перемещать указатель в DataSet по отмеченным в гриде строкам и суммировать.
Код:
    for I := 0 to DBGridEh1.SelectedRows.Count-1 do begin     
      DBGridEh1.DataSource.DataSet.GotoBookmark(pointer(DBGridEh1.SelectedRows.Items[i]));
      //суммирование;
      S := S + DBGridEh1.DataSource.DataSet.FieldValues['Field'];
    end;
Скандербег вне форума Ответить с цитированием
Старый 02.10.2012, 08:45   #3
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Не выделяются строки и не выводится результат.
Цитата:
procedure TForm4.Button1Click(Sender: TObject);
var
i:integer;
s:integer;
begin
for I := 0 to DBGridEh1.SelectedRows.Count-1 do begin
DBGridEh1.DataSource.DataSet.GotoBo okmark(pointer(DBGridEh1.SelectedRo ws.Items[i]));
//суммирование;
S := S + DBGridEh1.DataSource.DataSet.FieldV alues['norm'];
edit3.Text:=inttostr(s);
end;
end;
lutdan вне форума Ответить с цитированием
Старый 02.10.2012, 09:01   #4
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию Научился выделять строки)

Цитата:
procedure TForm4.DBGridEh1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin

Case Key of
VK_UP, VK_PRIOR, VK_LEFT : datamodule2.WorkQ.Prior;
VK_DOWN, VK_NEXT, VK_RIGHT : datamodule2.WorkQ.Next;
VK_HOME : datamodule2.WorkQ.First;
VK_END : datamodule2.WorkQ.Last;

32: //пробел
begin
if ssShift in Shift then
begin
datamodule2.WorkQ.DisableControls;
datamodule2.WorkQ.First;
while not datamodule2.WorkQ.Eof do
begin
DBGridEh1.SelectedRows.CurrentRowSe lected:=False;
datamodule2.WorkQ.Next;
end;
datamodule2.WorkQ.EnableControls;
end
else
if ssCtrl in Shift then
begin
datamodule2.WorkQ.DisableControls;
datamodule2.WorkQ.First;
while not datamodule2.WorkQ.Eof do
begin
DBGridEh1.SelectedRows.CurrentRowSe lected:=True;
datamodule2.WorkQ.Next;
end;
datamodule2.WorkQ.EnableControls;
end
else if Shift=[] then
begin
if DBGridEh1.SelectedRows.CurrentRowSe lected then
begin
DBGridEh1.SelectedRows.CurrentRowSe lected:=false;
datamodule2.WorkQ.Next;
end
else if not DBGridEh1.SelectedRows.CurrentRowSe lected then
begin
DBGridEh1.SelectedRows.CurrentRowSe lected:=true;
datamodule2.WorkQ.Next;
end;

end;
end;
end;
IF Key<>VK_TAB then Key:=0;

end;
Проблема в том что нельзя нажатием кнопки мышки выбирать, а только пробелом. Осталось решить проблему эту и добавить их в стрингрид(или что-то похожее) и просуммировать.
lutdan вне форума Ответить с цитированием
Старый 02.10.2012, 09:15   #5
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

У DBGrid и, само-собой в DBGridEh есть вполне адекватный механизм множественного выделения строк. Как раз кликами мыши и прижатыми клавишами Shift или Ctrl.
Для этого в опциях надо установить флаги dgRowSelect и dgMultiSelect в True.

Последний раз редактировалось Скандербег; 02.10.2012 в 09:17.
Скандербег вне форума Ответить с цитированием
Старый 02.10.2012, 09:51   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

А для чего между DBGridEh и Edit пихать промежуточный StringGrid я так и не понял.
_SERGEYX_ вне форума Ответить с цитированием
Старый 02.10.2012, 10:39   #7
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Скандербег Спасибо. Действительно выделяет строки.
_SERGEYX_ Это я пробовал вывести сумму в Edit. StringGrid нужен для того что бы выделить нужные строки в DBGridEh и вывести их в StringGrid.
В StringGrid есть столбик количество. Получается пользователь вводит в строке количество, которое умножается на столбик " Норма" и потом все это суммируется.
Научился выводить все строчки в StringGrid, но как выделенные строчки в него вывести.
Цитата:
procedure TForm4.SpeedButton1Click(Sender: TObject);
var

iRows, i, k: integer;

begin
with Datamodule2.WorkQ do
iRows:=RecordCount;
k:=1;
for i:=1 to iRows do
begin
// DBGridEh1.DataSource.DataSet.First;
GridResult.Cells[0,k]:=IntToStr(k);
GridResult.Cells[1,k]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('work_norm.name').AsString;
//idResult.Cells[2,k]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('razr').AsString;
GridResult.Cells[3,k]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('norm').AsString;

DBGridEh1.DataSource.DataSet.Next;

GridResult.RowCount:=GridResult.Row Count+1;
k:=k+1;
end;
end;
end.
Вообщем придумал такой вариант: мы нажимаем пробел выделяется строка (красным цветом) и она автоматом появляется StringGrid. Нажимаем еще одну и она добавляется в StringGrid. Может добавить CheckBox в DBGridEh? Получается мы нажимаем на строку ставиться галочка . Нажимаем еще разок на эту же строчку и галочка убирается(автоматом она удаляется из StringGrid). Вот это бы было удобно. Но как это реализовать?

Последний раз редактировалось artemavd; 03.10.2012 в 08:20.
lutdan вне форума Ответить с цитированием
Старый 03.10.2012, 16:43   #8
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Походу только я и сюда пишу, но может кому-то поможет и так сделал перенос строки из DBGridEh в Stringgrid двойном щелчком мыши.
Цитата:
procedure TForm4.DBGridEh1DblClick(Sender: TObject);

var
iRows: integer;

begin

// дабавление из дбгрида в стрингрид
if (GridResult.Cells[0,1] <> '')
then GridResult.RowCount := GridResult.RowCount + 1;
iRows := GridResult.RowCount;
GridResult.Cells[0,iRows - 1]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('id').AsString;
GridResult.Cells[1,iRows - 1]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('work_norm.name').AsString;
GridResult.Cells[3,iRows - 1]:=DBGridEh1.DataSource.DataSet.Fiel dbyName('norm').AsString;
end;
1) Теперь необходимо сделать выделение выбранных строк, но как? вот есть обработчик красит отобранные строки грида, но не получается эти обработчики совместить (обработчик добавления+обработчик покраски). Сам обработчик:
Цитата:
procedure TForm4.DBGridEh1DrawColumnCell(Send er: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
begin
begin with DBGridEh1.Canvas do begin
if DBGridEh1.SelectedRows.CurrentRowSe lected then begin
Font.Style := [fsBold];
Font.Color := clWhite;
Brush.Color := clGreen; ;
end;
FillRect(Rect);
TextOut(Rect.left+2, Rect.top+2, ' '+Column.Field.AsString);
end; end; end;
2)Теперь математика. Необходимо одну колонку умножить на другую (в стрингриде) вывести в отдельную колонку результаты . И потом суммировать эту колонку. Как это сделать?

3) Скачал TMS Grids для простоты использования .. Может кто-то знает как в TAdvColumnGrid и в DBGridEh вывести полностью в строку поле Memo, а то он обрезает..а лучше если бы при наведении на запись появлялось окошко где виден был весь текст.

Заранее спасибо. Может кому-то и помог =)
lutdan вне форума Ответить с цитированием
Старый 03.10.2012, 23:30   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Теперь математика
Это не математика, а арифметика за первый класс.
Всего то нужно получить сумму выделенных записей...
Неужели для этого необходимы TAdvColumnGrid, StringGrid, раскраска ячеек, вывод данных в Memo (Blob-поля добавлять что-ли?) и т.п.?

Во втором посте Скандербег написал идеальный код для подсчета суммы выделенных записей.

Пишу его с комментариями:
Код:
procedure TForm1.RzBitBtn3Click(Sender: TObject);
var i: Integer;
  d: Double;
  Norma: Double; // Это твоя норма, ради
  // которой так необходим StringGrid
  b: TBookmark;
begin
  { Norma := StrToFloat(Edit1.Text); }
  Norma := 1; //Берется из того, что ввел пользователь, например, в Едит

  with DBGridEh1.DataSource.DataSet do
  begin
    b := GetBookmark; //Запомнили позицию курсора
    DisableControls; //Запретили ёрзанье по гриду для ускорения работы,
                    //... и для красоты тоже

//Поехали циклом во выделенным записям
    for i := 0 to DBGridEh1.SelectedRows.Count - 1 do
    begin
      GotoBookmark(pointer(DBGridEh1.SelectedRows.Items[i]));
      d := d + FieldValues['sum'];
    end;
    d := d * Norma; //Умножили всё на злочастную Норму

    GotoBookmark(b); //Вернулись на свою закладку
    FreeBookmark(b); // И освободили ее
    EnableControls; //Разрешили работу с Гридом     
  end;
  ShowMessage(FloatToStr(d));
end;
Смысл кода понятен?

Последний раз редактировалось _SERGEYX_; 03.10.2012 в 23:40.
_SERGEYX_ вне форума Ответить с цитированием
Старый 04.10.2012, 14:47   #10
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию Финишная прямая

Вы наверно не поняли суть. Нужно было из справочника НОРМЫ вытащить данные. потом пользователь ввел свое количество напротив определенной нормы.
Для этого я использовал Стрингрид. Т.е. я из справочника в сетку стрингрида выводил необходимые пользователю нормы. И в столбике КОЛИЧЕСТВО он выставляет количество. Потом НОРМА умножается на КОЛИЧЕСТВО и результат вычислений заноситься в отдельный столбик по которому я суммирую.
Код:
procedure TForm4.Button1Click(Sender: TObject);
// суммирование в стрингрид
 var
a, b, y, s: array [1..9999] of Double;
summ,proizv: Double;
j: Integer;

begin

for j:= 1 to Gridresult.RowCount-1 do
if not TryStrToFloat(Gridresult.Cells [2,j],A[j]) then
A[j]:=0;

for j:=1 to Gridresult.RowCount-1 do
if not TryStrToFloat(Gridresult.Cells [3,j],B[j]) then
B[j]:=0;
for j:=1 to Gridresult.RowCount-1 do
begin
proizv:=A[j]*B[j];
Y[j]:=proizv;
Gridresult.Cells[4, j]:=FloatToStr(Y[j]);
end;
 summ:=0;
for j:=1 to Gridresult.RowCount-1 do begin
summ:=summ+StrToFloat(Gridresult.Cells[4,j])
end;
ShowMessage(FloatToStr(summ));
end;
Мне осталось разобраться с раскраской выбранных строк. Мне необходимо красить те строчки в DBGridEh1, которые присутствуют в StringGrid. Это я делаю по id сравнение:
Код:
procedure TForm4.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
  var Rows: integer;

begin

  Rows := GridResult.RowCount;
  with DBGridEh1.Canvas do
  begin
   if GridResult.Cells[0,Rows-1]=DBGridEh1.DataSource.DataSet.FieldByName('id').asstring  then  
    begin
      // Font.Style := [fsBold];
      Font.Color := clWhite;
      Brush.Color := clGreen;
    end;

    FillRect(Rect);
    TextOut(Rect.left+2, Rect.top+2, ' '+Column.Field.AsString);
  end;

    end;
ОН красит все красиво , но при скроллинге или прокручивании записей в DBGridEh...выделение строк убирается, а мне необходимо чтобы именно те строки что есть в стрингриде, красились в DBGridEh.

Последний раз редактировалось lutdan; 04.10.2012 в 14:49.
lutdan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGridEh вопросик Spyhunter1983 БД в Delphi 1 09.10.2011 05:19
stringgrid+колесо мыши=>stringgrid.onclick aalleexxaa Общие вопросы Delphi 5 16.02.2011 16:58
DBGridEh Багдат87 Компоненты Delphi 1 02.10.2010 18:37
DBGridEh vdalest БД в Delphi 0 08.07.2010 23:05
Сортировка в DbGridEh Alexeyss БД в Delphi 4 21.11.2009 11:25