Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

DBEdit в фокусе 


Oleg_K   (2001-12-17 21:03) [0]

1) В форме имеется несколько DBEdit’ов из которых посредством PopupMenu вызываются определенные DBGrid’ы. После чего нужная инфа из грида сбрасывается в DBEdit. Как можно определить в каком DBEdit’е находится фокус, т.е. какой DBEdit активный, чтобы инфа передавалась именно туда, а не определенный DBEdit?
Сейчас - FaceWork.EditPrisposobl.text := Table1.FieldByName("SHTAN").AsVariant;
Мне нужно передавать значения из грида не DBEdit: EditPrisposobl, а в тот, где фокус.

2) Почему при переводе БД в режим редактирования (Table.Edit) очищаются поля заполненные ранее? Как этого можно избежать, оставив возможность вставки?



Ю.Ю.(первый и единственный)   (2001-12-18 03:10) [1]

1) "из грида сбрасывается в DBEdit" как из NxM ячеек сбрасывать в одну,
не теряя при этом фокуса? Если он всё же теряется (переход в Grid), то запоминать нужный Edit в OnEnter Edit-ов bkb в onPopup PopupMenu.

Более того, почему бы не модифицировать непосредственно DataSet, к которому относятя DBEdit-ы. DBEdit всё-таки предназначен для "ручной" корректировки.

2) ??? "очищаются поля" - это как? Совсем пустые становятся? "оставив возможность вставки" - причем здесь Table.Edit ?



Oleg_K   (2001-12-18 08:49) [2]

1) Нет, данные сбрасываются из одной ячейки грида в ячейку DBEdit"а. Фокус конечно же теряется при переходе в грид (это я не правильно в прошлый раз выразился).
После запуска формы, я выбираю один из десятка DBEdito"ов и через попуповкий ShortCut вызываю из него грид, а затем выбираю нужную запись и по даблклику передаю из грида в DBEdit значение одной ячейки. Проблема в том, чтобы не явно указыть в гриде в какой DBEdit писать, а передавать именно в тот DBEdit из которого вызван грид. Утрируя: у меня десяток DBEdit"ов и все они по очереди заполняются из одного грида.

"запоминать нужный Edit в OnEnter Edit-ов bkb в onPopup PopupMenu."
Это как?

2)Да. Без Table.Edit выдает ошибку - "DataSet not in edit or insert mode".





Ю.Ю.(первый и единственный)   (2001-12-18 09:57) [3]

var
Form1: TForm1;
SelectedEdit:TDBEdit;
implementation

{$R *.DFM}

procedure TForm1.DBEditEnter(Sender: TObject);
// установить в качестве обработкика onEnter для всех DBEdit-ов
begin
SelectedEdit:=TDBEdit(SEnser);
end;

procedure TForm1.DBGridDblClick(Sender: TObject);
begin
if (SelectedEdit<>nil) and (TDBDBGrid(Sender).SelectedField<>nil)
then begin
if SelectedEdit.DataSource.DataSet=dsBrowse
then SelectedEdit.DataSource.Edit;
SelectedEdit.Field.Value:=TDBDBGrid(Sender).SelectedField.Value
end;
end;



panov   (2001-12-18 10:11) [4]

В public-секцию формы введи
public
...
tmpDS: TDataSet;
...

В OnPopupMenu устанавливай
if (PopupMenu.PopupComponent is TDBEdit)
then
tmpDS := TDBEdit(PopupMenu.PopupComponent).DataSource.Dataset
else
tmpDS := nil;

После выбора значения в другом окне c TDBGrid
выполни:
...
tmpDS.Edit;
tmpDS.FieldByName(поле1).As... :=
DBGrid.DataSource.DataSet.FieldByName("поле2").As...;
tmpDS.Post;

Примерно такой порядок действий



Ю Ю   (2001-12-20 04:19) [5]

поле1, "поле2", As...
А в моем примере обошлось без этого



Oleg_K   (2001-12-23 00:22) [6]

To Ю.Ю. :

В строке then SelectedEdit.DataSource.Edit;
при компиляции выдает ошибку
"[Error] shtang.pas(46): Incompatible types"
В чем может быть проблема?



panov   (2001-12-24 22:56) [7]

>Oleg_K (23.12.01 00:22)
SelectedEdit.DataSource.Edit;
заменить на
SelectedEdit.DataSource.DataSet.Edit;

К сожалению, при таком способе не удастся избежать побочных эффектов("Почему при переводе БД в режим редактирования (Table.Edit) очищаются поля заполненные ранее? Как этого можно избежать, оставив возможность вставки?").

Я бы не стал пользоваться TDBEdit, так как необходимо изменения в таблицу вносить только после выбора всех полей.

Мне кажется, лучше TEdit использовать.
Удобно присвоить для TEdit Name=имя соответствующего поля. При создании формы, на которой лежат эти TEdit заполнять все TEdit. А после окончания редактирования вносить изменения в таблицу. Причем не обязательно даже проверять, изменилось ли поле - просто заменять все поля в таблице.

В форме, на которой лежат TEdit вводим
var
tmpEdit:

Каждому TEdit назначаем наше единственное PopupMenu.

В этой же форме для PopupMenu в обработке OnPopup пишем:

procedure TForm.PopupMenu1Popup(Sender: TObject);
begin
tmpEdit := TEdit(PopupMenu1.PopupComponent);
end;

В последнем DBGrid(в котором выбираются данные для TEdit), пусть этот DBGrid называется DBGrid25 пишем:

tmpEdit.Text := DBGrid25.DataSource.DataSet.FieldByName("поле").AsString;
"поле" - имя поля, в котором находится значение для выбора.
-----------------------------
Если по этому коду возникнут вопросы, то пиши опять по почте, постараюсь быстро отреагировать...




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.014 c
1-90319           Tor                   2002-01-08 22:42  2002.01.28  
Массивы объектов


1-90249           Елена                 2002-01-07 14:00  2002.01.28  
ShellExecute


14-90370          limon                 2001-12-04 17:28  2002.01.28  
Тонкости Perl (> Merlin & Co)


7-90403           Ph.D.Kot              2001-10-11 08:56  2002.01.28  
Отправка факса через модем. Хелп.


7-90396           Nikolay               2001-10-18 21:50  2002.01.28  
Tic-tac-свежесть всего в двух калориях?