Текущий архив: 2004.01.16;
Скачать: CL | DM;
Вниз
Сохранение свойств колонок DBGrida при открытии/закрытии датасета Найти похожие ветки
← →
alexEagle (2003-12-18 12:09) [0]Где нужно написать свой код для сохранения свойств колонок DBGrida при открытии/закрытии датасета?
← →
stone © (2003-12-18 12:13) [1]Dataset.AfterOpen/Dataset.BeforeClose
← →
Johnmen © (2003-12-18 12:13) [2]Ничего не нужно писать. Если, конечно, свойства сам прописывал...
← →
Sandman25 © (2003-12-18 12:15) [3]alexEagle (18.12.03 12:09)
Лучше делать это при создании/уничтожении грида.
← →
alexEagle (2003-12-18 12:35) [4]при создании грида датасет ещё не открыт, при уничтожении он может быть уже закрыт!
Если я поменял ширину колонки - делфи это не сохранить нигде - я должен сделать это сам.
Датасет вообще не причем - откуда мне знать он используется с гридом или без!
← →
Sandman25 © (2003-12-18 12:42) [5][4] alexEagle (18.12.03 12:35)
1) Если Вы делаете поля в Design-time, при выходе из программы грид себя запишет. При следующем запуске при создании грид считает эти старые параметры - пользователю очень удобно.
2) Если Вы делаете поля в run-time, то сразу после создания полей считываете сохраненные параметры. В остальном аналогично 1.
3) Если у Вас нет явных (persistent) полей, то нужно их сделать.
← →
Vlad © (2003-12-18 12:50) [6]Ты сам себе противоречишь:
> для сохранения свойств колонок DBGrida при открытии/закрытии
> датасета?
и
> Датасет вообще не причем
Для начала разберись что тебе вобще нужно.
Если свойства грида должны сохраняться при закрытии датасета, то датасет не может быть не причем.
> откуда мне знать он используется с гридом или без!
DBGrid.DataSource.DataSet - отсюда и узнать.
← →
Sandman25 © (2003-12-18 12:52) [7][6] Vlad © (18.12.03 12:50)
Он имеет ввиду, что неизвестно, отображается ли данный DataSet каким-нибудь DBGrid. Соответственно при открытии DataSet не получается найти и считать DBGrid, который его показывает.
← →
MV (2003-12-18 12:58) [8]Юзай TDBGridEh - он халявный, умеет то, что ты хочешь, и еще оооо-чень многое другое
← →
Vlad © (2003-12-18 13:02) [9]
> отображается ли данный DataSet каким-нибудь DBGrid.
Ну насколько я понял из постов автора речь идет как раз о конкретном гриде. А если грид известен, то узнать, подключен к нему данный датасет или не подключен проблем не составит :)
← →
Sandman25 © (2003-12-18 13:05) [10][9] Vlad © (18.12.03 13:02)
Согласен :)
← →
alexEagle (2003-12-18 13:11) [11]Насчет TDBGridEh - там конечно много всего, но нужного мне я не нашел.
Насчет остальных предложений - видимо я недостаточно объяснил задачу. Ситуация вот какая. Я кладу на форму три компоненты - датасурс, тейбл и грид. В ран-тайме открываю тайбл. После чего вызываю функцию считывания информации по колонкам этого грида (ширина, название, видимость) из ини-файла. При закрытии формы я делаю сохранение. Хотелось бы встроить эту функцию в сам грид, но не знаю как.
По поводу встраивания в датасет могу сказать только то, что не каждый датасет используется гридом.
← →
Vlad © (2003-12-18 13:15) [12]
> alexEagle (18.12.03 13:11) [11]
Делай класс-наследник TDBGrid, где переопределяй конструктор и деструктор, и пиши туда свои процедуры сохранения/считывания
← →
MV (2003-12-18 13:27) [13]По поводу DBGridEh. Пример кода (здесь dbGrid - это как раз тот самый грид):
// Глобальная (в пределах модуля) переменная
Var
ItWasActivated : boolean;// Здесь хранится, была ли форма (фрейм) активизирована ранее
...
Var
RegIniFile : TRegIniFile;
SelfComplexName : String; // Ну, типа како-то уникальный идентификатор текущего фрейма (или формы)
...
// Активизиция формы (фрейма)
if not ItWasActivated then begin // При первой активизации пишем в реестр
RegIniFile := TRegIniFile.Create("\SOFTWARE\" // конфигурацию "по умолчанию"
+ LeftStr(ExtractFileName(Application.ExeName),
Pos(".",ExtractFileName(Application.ExeName))-1)
+"\GRIDS\DEFAULT\"+SelfComplexName, KEY_WRITE);
try
dbGrid.SaveGridLayout(RegIniFile);
finally
RegIniFile.Free;
end;
ItWasActivated := True
end;
RegIniFile := TRegIniFile.Create("\SOFTWARE\" // При любой активизации
+ LeftStr(ExtractFileName(Application.ExeName), // загружаем сохраненную
Pos(".",ExtractFileName(Application.ExeName))-1) // ранее конфигурацию
+"\GRIDS\LAST_WORKED\"+SelfComplexName, KEY_READ);
try
dbGrid.RestoreGridLayout(RegIniFile,[grpColIndexEh, grpColWidthsEh,
{ grpSortMarkerEh,} grpColVisibleEh,
grpRowHeightEh, grpDropDownRowsEh, grpDropDownWidthEh]);
finally
RegIniFile.Free;
end;
// Все. Это по поводу активизации формы (фрейма) с гридом.
// По поводу сохранения при дезактивации:
var
RegIniFile : TRegIniFile;
begin
...
RegIniFile := TRegIniFile.Create("\SOFTWARE\" // При дезактивации
+ LeftStr(ExtractFileName(Application.ExeName), // сохраняем конфигурацию
Pos(".",ExtractFileName(Application.ExeName))-1)
+"\GRIDS\LAST_WORKED\"+SelfComplexName, KEY_WRITE);
try
dbGrid.SaveGridLayout(RegIniFile)
finally
RegIniFile.Free;
end;
// И это все.
// Далее - для любителей (восстановление значений "по умолчанию"):
procedure Tfrb_GridFrame.actRestoreGridDefaultsExecute(Sender: TObject);
var
RegIniFile : TRegIniFile;
begin
inherited; // Восстановление конфигурации по умолчанию
RegIniFile := TRegIniFile.Create("\SOFTWARE\"
+ LeftStr(ExtractFileName(Application.ExeName),
Pos(".",ExtractFileName(Application.ExeName))-1)
+"\GRIDS\DEFAULT\"+SelfComplexName, KEY_READ);
try
dbGrid.RestoreGridLayout(RegIniFile,[grpColIndexEh, grpColWidthsEh,
{ grpSortMarkerEh,} grpColVisibleEh,
grpRowHeightEh, grpDropDownRowsEh, grpDropDownWidthEh]);
finally
RegIniFile.Free;
end;
end;
//////////////////
// Теперь - все.
P.S. Весь код - рабочий
← →
Sandman25 © (2003-12-18 13:28) [14]Насчет TDBGridEh - там конечно много всего, но нужного мне я не нашел.
SaveGridLayoutIni, RestoreGridLayoutIni смотрели?
← →
alexEagle (2003-12-18 14:00) [15]Vlad > читай внимательно задачу - " ран-тайме открываю тайбл". Какой конструктор? Да он вообще не знает не о каком датасете!
← →
Плохиш_ (2003-12-18 14:09) [16]>alexEagle (18.12.03 14:00) [15]
Ты, это, успокойся-ка.
Тебе в [1] уже ответили, а если не понял, то иди займись изучением основ.
← →
alexEagle (2003-12-18 14:10) [17]Я хочу сделать акцент на том что мне АБСОЛЮТНО НЕ ИНТЕРЕСЕН метод сохранения информации по колонкам. Мне интересно знать ГДЕ ИМЕННО В КЛАССЕ TDBGrid прописать загрузку/восстановление информации. Причем конструкторы/деструкторы тут тоже не причем, поскольку саму таблицу я открываю в момент времени отличный от 1) активации формы 2) создания грида и т.д. Вобщем когда хочу - тогда и открываю. И хочу знать, в каком методе грид реагирует на открытие/закрытие формы.
С уважением, Александр.
← →
Vlad © (2003-12-18 14:13) [18]
> alexEagle (18.12.03 14:00) [15]
Я конечно извиняюсь, но все-таки, параметры грида нужно считывать/записывать только в момент открытия/закрытия DataSet (тогда непонятна твоя фраза - Датасет вообще не причем) ?
Если так, то кто сделай проще
Есть форма, на которой твой грид находится. На FormCreate напиши следующие строчки:
DBGrid.DataSource.DateSet.BeforeOpen: = MyProc1;
DBGrid.DataSource.DateSet.AfterClose: = MyProc2;
В процедурах MyProc1, MyProc2 и делай считывание/запись параметров.
Тогда при активации/деактивации любого набораданных, подключенного к твоему гриду у тебя будет считывание/сохранение свойств.
← →
alexEagle (2003-12-18 14:16) [19]В последней своей фразе я случайно написал слово форма вместо таблица. Прошу простить. Случайно.
← →
MV (2003-12-18 14:18) [20]Что, длинный пример, что ли? Или просто тема очень горячая?
← →
alexEagle (2003-12-18 14:21) [21]MV -> Сохранять я и без тебя знаю как, но вот не знаю где. Смотри [17]
← →
YuRock (2003-12-18 14:23) [22]Плохиш_ (18.12.03 14:09) -
"Ты, это," вначале пойми, что спрашивают (если сможешь), а затем пытайся кого-то учить.
← →
MV (2003-12-18 14:27) [23]Сохранять в самом гриде - дело неблагодарное. Лучше создай рабочий фрейм (как в примере), куда размести и грид, и дата сет. Сохряняй свойства при инициализации/деинициализации фрейма.
← →
alexEagle (2003-12-18 14:37) [24]MV -> Как раз очень благодарное.
Я создаю компонент унаследованный от ДБГрида, добавляю свойство - имя файла для сохранения/восстановления и потом просто ракладываю его по формам. И все работает само. Пожалуй единственное, что надо сделать - это указать имя файла.
Вот так это должно работать, и единственное, что я не знаю - где в моем классе, унаследованном от ДБГрида вставить код сохранения/восстановления.
Код восстановления должен идти непосредственно после реакции грида на изменение свойства тэйбл коненктед на TRUE, а сохранения - при изменении на FALSE. Но ни в коем случае не в самом датасете. Поскольку датасет вообще не должен знать какой компонент его юзает.
← →
Silver Alex © (2003-12-18 14:42) [25]вроде вот это , но проверь еще внимательнее
TMainDBGrid=class(TDBGrid)
protected
procedure LinkActive(Value: Boolean);override;
public
published
end;
procedure TMainDBGrid.LinkActive(Value: Boolean);
begin
inherited;
if Value then
ShowMessage("Open")
else
ShowMessage("Close");
end;
← →
MV (2003-12-18 14:45) [26]И что, будешь каждый раз при ре-коннекшн дергать грид?
"Ну, за искусство!"
← →
nik222 (2003-12-18 14:46) [27]По моему автор вопроса чрезмерно лениив.
Тебе же уже ответили в GridEH есть свойста сохранения и восстановления
параметров.
Ну если тебе так хочется сделай наследника из GridEH со своим
свойством - ИМЯ ФАЙЛА, и каждый раз при открытии/закрытии
DataLink DBGria сохраняй или восстанавливай значения
← →
MV (2003-12-18 14:49) [28]Кстати, о воробушках - GridEh сам ничего не сохраняет, он только дает Вам эту возможность. Потому как умные люди делали.
← →
Vlad © (2003-12-18 14:51) [29]Насчет LinkActive не лучший вариант.
При каждом рефреше у него будет сохранение/восстановление параметров :)
← →
YuRock (2003-12-18 14:54) [30]MV [28] -
Из-за таких "умных людей" прийдется при каждом использовании грида (создании новой табличной панели с формой) самому что-то указывать (как минимум) GridEh.
А если таких гридов 100? Это как экзешник разростется? И сколько работы?
← →
Плохиш_ (2003-12-18 14:56) [31]
> Vlad © (18.12.03 14:51) [29]
> Насчет LinkActive не лучший вариант.
> При каждом рефреше у него будет сохранение/восстановление
> параметров :)
Так, тут ему все карты в руки ;-)
Проверяй, не изменилась ли структура данньх, при открытии, хотя при закрытии придётся всё время сохранять.
← →
Silver Alex © (2003-12-18 15:01) [32]
> Vlad © (18.12.03 14:51) [29]
я просто ответил на вопрос, "Код восстановления должен идти непосредственно после реакции грида на изменение свойства тэйбл коненктед на TRUE, а сохранения - при изменении на FALSE. " а как и чего там будет реализовано, на совести автора.А какой вариант лучше? Ах да , использовать GridEh. НУ хочет человек сам написать.Похвально
← →
MV (2003-12-18 15:05) [33]2 Йурок. YuRock (18.12.03 14:54) [30]
У меня таких гридов в последнем проекте - штук 150 на сегодняшней день.
Насчет работы. Про ООП слышал? Создаешь базовый фрейм (форму), вгоняешь туда всю общую функциональность, и наследуешь от него для реализации нужных интимный подробностей.
Насчет объема - то же. У меня экзешник - чуть больше 4МБ, и не из-за усиленной работы с реестром.
← →
Vlad © (2003-12-18 15:06) [34]Одно все-таки непонятно, зачем все это делать при открытии/закрытии набора данных и какой в этом глубокий смысл? Почему нельзя сохранять/восстанавливать параметры при создании/уничтожении грида ?
← →
alexEagle (2003-12-18 15:06) [35]Огромное спасибо Silver Alex ©, который (единственный) не только понял суть вопроса, но и дал правильный ответ. Остальным досвидания.
Страницы: 1 вся ветка
Текущий архив: 2004.01.16;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.02 c