Здравствуйте!!
Я хочу немного модифицировать компонент DBEdit таким образом чтобы при изменении DataSource.State на dsEdit или dsInsert область вводв становилась белой, а при изменении на dsBrowse область ввода становилась серой. Как это сделать?
Зарание спасибо.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
31-01-2006 07:58 | Сообщение от автора вопроса
GEO а не могли бы вы помочь написать потомок от компонента TMemoField в котором бы происходило сдлеующее:
перед редактированием значение МЕМО поля записывалось бы в отдельное свойство, а перед отменой изменений это значение считывалось бы из этого свойства. Я пытался как-то использовать тот текст что вы написали, но что-то ничего не выходит.
Огромное вам человеческое спасибо!!
Действительно мне необходимо разработать несколько компонент с подобоными свойствами, просто если организовывать это все как обычно, появляется куча всяких процедур(т.к. много наборов данных) где нужно перечислять кучу объектов чтобы менять их свойства, а так мне кажется удобней и наглядней
Спасибо, Geo, а то у меня плохо со временем
По-моему придется еще сделать то же самое и для DataSetChanged проверку dsInsert
Ну а теперь, когда на конкретный вопрос есть ответ, я начну Вас отговаривать :)
Как правило компоненты со своим внешним видом - головная боль программиста
1 Geo грамотно указал цвета, т.к. в случае другой цветовой палитры явные цвета clWhite,clGray могут выглядеть странно. Но вот вряд ли планируется полное слияние с формой (clBtnFace)
2 Задав правила игры в компоненте, обрекаете себя на постоянное следование им. Значит придется реализовать подобное для целого пакета компонент, либо будите вынуждены пользоваться вариантом Сергея. А скорее всего и первое и второе. Т.к. рано или поздно первоначального пакета станет не хватать :(
Блин! Лишний раз убеждаюсь, что Борланд возможности модификации компонентов из VCL засунул настолько далеко, что дешевле иногда взять файл с исходниками и переписать целиком под себя ;-)
Но в данном случае задача решается. Вот примерная схема:
uses
DBCtrls;
type
TDBEdit = class(DBCtrls.TDBEdit)
private
FOldNotify : TNotifyEvent;
procedure EditingChangeNotify(Sender : TObject);
public
constructor Create(AOwner : TComponent); override;
end;
implementation
constructor TDBEdit.Create(AOwner : TComponent);
var
DL : TFieldDataLink;
begin
inherited Create(AOwner);
DL:=TFieldDataLink(Perform(CM_GETDATALINK,0,0));
FOldNotify:=DL.OnEditingChange;
DL.OnEditingChange:=EditingChangeNotify;
end;
procedure TDBEdit.EditingChangeNotify(Sender : TObject);
begin
FOldNotify(Sender);
if DataSource.State = dsEdit
then
Color:=clWindow
else
Color:=clBtnFace;
end;
В принципе, работает как часы. Но для надежности лучше все же подразобраться и вставить где нужно проверки. Либо вставить проверки где только возможно и не разбираться ;-)
Инна А вы не могли бы помоч мне в данном конкретном случае? Так как я даже не знаю что такое TFieldDataLink и разбираться с этим у меня к сожалению нет времени, нужно сделать это срочно. Только не надо говорить, что мне лень смотри документацию и все такое, я начинающий и все охватить разом сложно, я считаю все надо делать постепенно.Зарание спасибо за помощь.
Не Сергей вы меня не поянли я хочу создать компонент компонент, у которого цвет будет менять ся сам в зависимости от состояния того набора данных на который он ссылается и не нужно будет писать каждому набору данных процедуру в которой нужно былобы перечислять все подобные объекты.
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
if DataSource1.State=dsEdit then DBEdit1.Color:=clWhite
else DBEdit1.Color:=clGray;
end;
---
в первом ответе недоглядел :( Конечно, onStateChange
Я так уже пробовал, не получается выдается ошибка.
ведь у компонента DBEdit свойство dataSource ссылка на компонент DataSource, т.е врде как у DataSource должн быть метод OnChange. Тут мне немного не понятно.Как обеспечить взаимодействие этих двух компонентов. С виду задачка простая, всего-то написать пару строчек, а оказывается не очень. Может есть у кого еще идеии?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.