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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2012, 16:42   #1
Voldemort93
Пользователь
 
Аватар для Voldemort93
 
Регистрация: 27.08.2009
Сообщений: 40
По умолчанию DBGrid и *.ini файл

Доброго времени суток.
Подскажите, пожалуйста, имеется таблица с данными. при выборе строки необходимо менять ее цвет.
сделал так:
Код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if CheckBox1.Checked=true then begin
with  DBGrid1.Canvas do begin
Brush.Color:=clGreen;
Font.Color:=clWhite;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
end;
end;
end;
теперь нужно, чтобы при повторном запуске цвет строк оставался.
Думал через FormStorage, но немного не понимаю как настроить его.
Спасибо.
Читаю и перевожу со словарем с Фортрана, Алгола, Кобола и др.

Последний раз редактировалось Voldemort93; 15.08.2012 в 16:55. Причина: рано
Voldemort93 вне форума Ответить с цитированием
Старый 15.08.2012, 18:43   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Непонятно, при чем тут ini-файл... Если сохранять цвета строка - тогда для работы с ini используется тип TIniFiles модуля IniFiles. Объявляете Переменную типа

IFile: TIniFiles;

далее создаете экземпляр

IFile:=TIniFiles.Create(<имя ini-файла, можно с полным путем>);

В этой структуре: <имя ini-файла, можно с полным путем> я обычно делаю так:

ExtractFileDir(Application.ExeName) +'\config.ini' - если файл лежит в той же папке, где exe-шник программы.

А далее можете читать и писать в файл секциями, например логическое значение:

b:=IFile.ReadBool(<ИмяСекции>, <Имя Переменной>, <Значение по дефолту, если переменная неопределена>);

IFile.WriteBool(<Имя секции>,<имя переменной>, b);


ну и так далее... Там не очень много функций, в этом типе
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 15.08.2012, 21:20   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Сорри, недочитал исходный пост - абзац про FormStorage прошел мимо глаз

Если через FS делать - там есть StoredProps, попробуйте в него вписать свойство DBGrid.Columns. В IniFileName указываете имя ini-файла, а в IniSection - секцию в нем. Чтобы сохранение происходило при закрытии - Active:=true.

Да, чуть не забыл - сохранятся только те свойства, которые Published. Ваши Columns от ДБГрида в них как-раз входят.

Вот так как-то, если теоретически. Практически я им пользовался в более простых случаях, чем сохранение цветов отдельных строк, поэтому не скажу, сработает или нет - проверяйте.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 16.08.2012, 01:07   #4
Voldemort93
Пользователь
 
Аватар для Voldemort93
 
Регистрация: 27.08.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Сорри, недочитал исходный пост - абзац про FormStorage прошел мимо глаз

Если через FS делать - там есть StoredProps, попробуйте в него вписать свойство DBGrid.Columns. В IniFileName указываете имя ini-файла, а в IniSection - секцию в нем. Чтобы сохранение происходило при закрытии - Active:=true.

Да, чуть не забыл - сохранятся только те свойства, которые Published. Ваши Columns от ДБГрида в них как-раз входят.

Вот так как-то, если теоретически. Практически я им пользовался в более простых случаях, чем сохранение цветов отдельных строк, поэтому не скажу, сработает или нет - проверяйте.
Этот способ не сработал... свойства Columns сохраняются, но назад не восстанавливаются...

Цитата:
Непонятно, при чем тут ini-файл... Если сохранять цвета строка - тогда для работы с ini используется тип TIniFiles модуля IniFiles. Объявляете Переменную типа

IFile: TIniFiles;

далее создаете экземпляр

IFile:=TIniFiles.Create(<имя ini-файла, можно с полным путем>);

В этой структуре: <имя ini-файла, можно с полным путем> я обычно делаю так:

ExtractFileDir(Application.ExeName) +'\config.ini' - если файл лежит в той же папке, где exe-шник программы.

А далее можете читать и писать в файл секциями, например логическое значение:

b:=IFile.ReadBool(<ИмяСекции>, <Имя Переменной>, <Значение по дефолту, если переменная неопределена>);

IFile.WriteBool(<Имя секции>,<имя переменной>, b);


ну и так далее... Там не очень много функций, в этом типе
касательно этого способа - если фиксировать цвет строки ДБГрида должно получится что-то типа такого:
Код:
procedure TForm1.SaveIni;
 var
 Options: TIniFile;
 begin
 Options:= TIniFile.create('D:\MyIni.ini');
 Options.WriteInteger('Colors','DBGrid1', Integer(DBGrid1.Canvas.Brush.Color));
 Options.free;
 end;

procedure TForm1.LoadIni;
 var
 Options: TIniFile;
 begin
 Options:= TIniFile.create('D:\MyIni.ini');
 I:=Options.ReadInteger('Colors','DBGrid1', Integer(DBGrid1.Canvas.Brush.Color));
 Options.free;
 end;
если да, то тоже не получается.
Может еще какие-то варианты?
Читаю и перевожу со словарем с Фортрана, Алгола, Кобола и др.

Последний раз редактировалось Voldemort93; 16.08.2012 в 01:29.
Voldemort93 вне форума Ответить с цитированием
Старый 16.08.2012, 20:43   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Для того, чтоб получилось, нужно DBGrid построчно перебирать. В цикле если строка выделена, записывать в ини (как раз как у Вас). А так - она только из первой строчки канвас берет. Чтоб пройти по строкам DBGrid, есть три варианта:

1. Пройти не по ДБГриду, а по DataSource; поскольку Грид с ним связан - строки в нем будут меняться;
2. Написать свой класс - наследник от ДБГрида для доступа к protected-свойству Row;
3. Использовать стороннюю библиотек компонент (например, EhLib), где уже есть доступ к свойству Row (и еще куча нужных фишек).

НО! чем больше база, тем дольше будет сохранение ini-файла (пока по всей таблице пройдет и найдет выделенные строки).

Поэтому не думаю, что данный вариант приемлем.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 16.08.2012, 20:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если база одно пользовательская - прямо в одном из полей записи таблицы можно держать признак для раскраски. Если многопользовательская - сделать отдельную таблицу и хранить в ней идентификаторы нужных записей и пользователей. Оптимальней не придумать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2012, 20:50   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
Хорошо

В общем, единственный вариант (имеется в виду исходя из исходной задачи, потому что способ Аватара действительно оптимальней и мне нравится больше), приходящий на ум - это отслеживать процесс выделения строк в реальном времени. Например:

Объявляем переменную sel: string, в ней (через разделитель, например, ';', будем хранить номера выделенных строк). Инициализируем где-нибудь в начале программы

sel:=options.ReadString('COLOR','GR EEN',';'); //Секция COLOR, параметр GREEN содержит номера строк зеленого цвета, по умолчанию равен ';'


При выделении в процедуру обработки добавляем:

if СТРОКА_ВЫДЕЛЕНА then //СТРОКА_ВЫДЕЛЕНА - логическая переменная, определяющая состояние строки
sel:=sel+intToStr(номер строки)+';'
else begin
p:=pos(';'+IntToStr(НомерСтроки)+'; ',sel); //p - целое для определения позиции подстроки в строке
if p<>0 then Delete(sel,p,length(IntToStr(НомерС троки))+1);
end;

При выходе из программы сохраняем строку в ини:

options.WriteString('COLOR','GREEN' ,sel);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 16.08.2012 в 20:55.
Sciv вне форума Ответить с цитированием
Старый 16.08.2012, 20:54   #8
Voldemort93
Пользователь
 
Аватар для Voldemort93
 
Регистрация: 27.08.2009
Сообщений: 40
По умолчанию

Цитата:
Для того, чтоб получилось, нужно DBGrid построчно перебирать. В цикле если строка выделена, записывать в ини (как раз как у Вас). А так - она только из первой строчки канвас берет. Чтоб пройти по строкам DBGrid, есть три варианта: ...
Буду пробовать, Спасибо.
Читаю и перевожу со словарем с Фортрана, Алгола, Кобола и др.
Voldemort93 вне форума Ответить с цитированием
Старый 16.08.2012, 20:56   #9
Voldemort93
Пользователь
 
Аватар для Voldemort93
 
Регистрация: 27.08.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
В общем, единственный вариант, приходящий на ум - это отслеживать процесс выделения строк в реальном времени. Например:

Объявляем переменную sel: string, в ней (через разделитель, например, ';', будем хранить номера выделенных строк). Инициализируем где-нибудь в начале программы

sel:=options.ReadString('COLOR','GR EEN',';'); //Секция COLOR, параметр GREEN содержит номера строк зеленого цвета, по умолчанию равен ';'


При выделении в процедуру обработки добавляем:

if СТРОКА_ВЫДЕЛЕНА then //СТРОКА_ВЫДЕЛЕНА - логическая переменная, определяющая состояние строки
sel:=sel+intToStr(номер строки)+';'
else begin
p:=pos(';'+IntToStr(НомерСтроки)+'; ',sel); //p - целое для определения позиции подстроки в строке
if p<>0 then Delete(sel,p,length(IntToStr(НомерС троки))+1);
end;

При выходе из программы сохраняем строку в ини:

options.WriteString('COLOR','GREEN' ,sel);
Спасибо, сейчас попробую использовать данный способ)
Читаю и перевожу со словарем с Фортрана, Алгола, Кобола и др.
Voldemort93 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ini-файл Афанасий[vedma] Общие вопросы Delphi 2 09.07.2012 07:58
*.ini файл foxes Общие вопросы Delphi 9 24.10.2010 12:02
Перевод данных из DBGrid в Listbox через Ini Val Rubis БД в Delphi 3 05.01.2010 05:29
ini Файл Volkogriz Общие вопросы Delphi 1 12.11.2008 13:44
ini файл Simply-Art Общие вопросы Delphi 3 17.06.2007 14:43