Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 11
1

Выделение новых и редактируемых строк в DbGrid

03.12.2011, 16:48. Показов 3688. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как выделить добавленную строку в DBGRID одним цветом, а отредактированную - другим. При этом выделение сохраняется до завершения программы.
Знаю, что были похожие темы, я их просмотрел. Сложность вся в условии, не знаю как описать. Помогите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2011, 16:48
Ответы с готовыми решениями:

DBGrid и выделение строк
Прочитал много тем у вас на форуме, про мою проблему, подходящего не нашел, у меня на форме есть...

Выделение строк DBGrid цветом
Помогите пожалуйста, как выделить строки DBGrid красным цветом с условием больше 30 дней?

Поиск и выделение строк в DBGrid
Идея такая, на форме размещены dblookupcombobox, dbgrid, AdoConnection, Datasourse, Adoquery....

Вопрос про выделение строк в DBGrid
Здравствуйте. Дано 2 таблицы Dbgrid.Находяться на разный хфорамх. Необходимо по двойному щелчку на...

12
44 / 19 / 2
Регистрация: 18.09.2011
Сообщений: 70
03.12.2011, 16:53 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TMyDBGrid = class(TCustomDBGrid);
 
 
procedure TFormBHACable.DBGridBHA1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
 
With TMyDBGrid(Sender) Do
    if (DataLink.ActiveRecord = Row - 1) then
      begin
    if Column.Field.Dataset.FieldByName('NameTool').AsString <> 'a'
  then  begin
        Canvas.Brush.Color := clPaleGreen;
        Canvas.Font.Color := clBlack;
        end;
       end;
        DBGridBHA1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
Попробуй так
2
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
03.12.2011, 17:05 3
Цитата Сообщение от HCK Посмотреть сообщение
Delphi
1
2
3
type
  TMyDBGrid = class(TCustomDBGrid);
...
Попробуй так
Маловато будет.
Он ведь хочет помнить добавленные и редактированные строки.
Это надо какой нибудь List городить и в него писать состояние строки Grid-a
0
44 / 19 / 2
Регистрация: 18.09.2011
Сообщений: 70
03.12.2011, 17:33 4
Скорее всего да. Это только часть задачи. Если на протяжении работы программы сохранять состояния то это класс нужно придумать отдельный
1
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
03.12.2011, 17:37 5
Цитата Сообщение от HCK Посмотреть сообщение
Скорее всего да. Это только часть задачи. Если на протяжении работы программы сохранять состояния то это класс нужно придумать отдельный
Ага. И не забыть, что строки в гриде иногда еще и удалять приходится.
0
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 11
03.12.2011, 17:42  [ТС] 6
Есть две кнопки - добавить и сохранить. Добавить - для добавления новой записи. Сохранить - для сохранения редактируемой.
Что если создать матрицу? В i-ую строку я записываю номер строки в DBGRID, а в j-ый столбец параметр - 1, 2 или 3. (добавить, редактировать, удалить). Ну а потом бежать по матрице и соответственно...
0
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
03.12.2011, 17:53 7
Цитата Сообщение от Supermaks Посмотреть сообщение
Есть две кнопки - добавить и сохранить. Добавить - для добавления новой записи. Сохранить - для сохранения редактируемой.
Что если создать матрицу? В i-ую строку я записываю номер строки в DBGRID, а в j-ый столбец параметр - 1, 2 или 3. (добавить, редактировать, удалить). Ну а потом бежать по матрице и соответственно...
В Дельфи есть прекрасный класс TList

С ним можно много полезного сделать.
Начнем с того что количество строк в гриде будет меняться.
Т.е. просто массив использовать неудобно.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  MyList : TList;
  RecordState: Longint; //0-обычная запись, 1-добавленная, 2-исправленная
begin  //in FormCreate
  MyList := TList.Create;
  RecordState :=0;
 
//добавить для каждой существующей записи
  MyList.Add(Pointer(RecordState)); //добавлять можно только указатели, но мы его будем как целое число использовать
 
//редактирование записи
  Longint(MyList.Items[RowNum]) := 2;
 
//новая добавленная запись
  MyList.Add(Pointer(1)); 
 
//не забыть в конце
MyList.Free
2
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 11
03.12.2011, 18:27  [ТС] 8
albor, Одно не понятно, когда выполнять MyList.Free ?
0
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
03.12.2011, 18:53 9
Цитата Сообщение от Supermaks Посмотреть сообщение
albor, Одно не понятно, когда выполнять MyList.Free ?
Поскольку у Вас это постоянно используемый список, то создать его лучше всего при создании формы, а уничтожить при освобождении..

Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.FormCreate(Sender: TObject);
begin
{...}
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyList.Free;
end;
0
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 11
05.12.2011, 00:11  [ТС] 10
albor,
Delphi
1
Left side cannot be assigned to...
При Longint(MainForm.MyList.Items[DataModule2.Table1.RecNo]) := 2;
0
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
05.12.2011, 00:18 11
Цитата Сообщение от Supermaks Посмотреть сообщение
albor,
Delphi
1
Left side cannot be assigned to...
При Longint(MainForm.MyList.Items[DataModule2.Table1.RecNo]) := 2;
А так:

Delphi
1
MainForm.MyList.Items[DataModule2.Table1.RecNo]:=Pointer(2);
это тоже самое только с другой стороны.
1
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 11
05.12.2011, 02:27  [ТС] 12
так, при добавлении сделал так:
Delphi
1
MainForm.MyList.Add(Pointer(1));
при редактировании
Delphi
1
MainForm.MyList.Items[DataModule2.Table1.RecNo-1]:=Pointer(2);
при удалении:
Delphi
1
MyList.Delete(DataModule2.Table1.RecNo-1);
Условие:
Delphi
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
if (DBGrid1.DataSource=DataModule2.DataSource1) then
for i:=0 to MyList.Count-1 do
if ((MyList.Items[i]=Pointer(1)) and (DataModule2.Table1.RecNo=i+1)) then
with DBGrid1.Canvas do
    begin
      Brush.Color := clGreen;
      Font.Color := clWhite;
      FillRect(Rect);
      TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
      prosrok:=true;
    end
else
if ((MyList.Items[i]=Pointer(2)) and (DataModule2.Table1.RecNo=i+1))  then
with DBGrid1.Canvas do
    begin
      Brush.Color := clBlue;
      Font.Color := clWhite;
      FillRect(Rect);
      TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
      prosrok:=true;
    end
else
with DBGrid1.Canvas do
    begin
      Brush.Color := clWhite;
      Font.Color := clBlack;
      FillRect(Rect);
      TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
      prosrok:=false;
    end;
Работает только на добавление. А при удалении записи - цвет меняет (предыдущая).
Как исправить? Гляньте пожалуйста, может где-то с индексацией намудрил?
0
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
05.12.2011, 19:18 13
Ход мысли правильный, но можно и проще. Воспользуемся свойствами точнее (Events) самого грида:

Delphi
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
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
               DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i,K: integer;
Begin
  If Sender is TDBGrid then   //Otche nash.. ;-)
  with Sender as TDBGrid do
  begin  
     i:=Datasource.Dataset.Recno-1; //от номера записи к индексу в листе
     K:=Longint(MyList.Items[i]);      //состояние записи 
 
     case k of                               //расставляем цвета по вариантам
     0:begin
      Canvas.Brush.Color:=clGreen;
      Canvas.Font.Color:=clWhite;
        end;
     1:begin
      Canvas.Brush.Color:=clBlack;
      Canvas.Font.Color:=clWhite;
        end;
     2:begin
      Canvas.Brush.Color:=clBlue;
      Canvas.Font.Color:=clWhite;
        end; 
     end; 
     // если строка была выделена, оставляем "подсвеченные" цвета  
     IF  gdSelected   IN State
     Then Begin
    Canvas.Brush.Color:= clHighLight;
    Canvas.Font.Color := clHighLightText;
     End;
    
     // А теперь пусть он рисует сам !
     DefaultDrawColumnCell(Rect,DataCol,Column,State);
   end;
End;
Успехов! См: источник
1
05.12.2011, 19:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2011, 19:18
Помогаю со студенческими работами здесь

Программное выделение всех строк в DBGrid
Добрый день! Как по нажатию кнопки на форме выделить все записи(строки) в DBGrid?

DBGrid добовление новых строк в таблицу через Edit1.text таблица Access
Добрый день! вот у меня возник вопрос как реализовать добавление строки в dbgrid через edit1.text в...

Создание редактируемых таблиц или редактируемых полей
Здравствуйте! С помощью каких инструментов можно создавать редактируемые таблицы как в jquery?...

DBGrid: выделение цветом строк через одну
Добрый день!!! Помогите, пожалуйста, как сделать так, чтобы поля в DBGrid строки через одну...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru