Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI и базы [D5]


Alek Aaz ©   (2003-08-25 15:35:00) 

Плиз, поскажите как лучше сделать?
Скажем есть таблица
Клиент
номер
физ/юр лицо

Юзер выбирает клиента, жмет ентер - открывается MDI форма с подробными данными по клиенту. Выбирает другого - новая форма.
Формы разные, для юр и физ лиц.
Как "правильно" плодить MDI формы?

Вопрос как передать данные в MDI форму? Как лучше это сделать?


asp   (2003-08-26 12:09:00) [1]

Alek Aaz © (26.08.03 11:25) [14] > Шарше ля форм.
MainForm.MDIChildren & MainForm.MDIChildCount


Alek Aaz   (2003-08-26 11:29:00) [2]

2roottim
ВЕЩЬ!...


Alek Aaz   (2003-08-26 11:25:00) [3]

2Sergey13
>Странная точка зрения. А ты его спрашивал?
Угу. То-есть юЗверь то как раз и бунтует. Меня устраивает старый вариант :)
>форма<->датасет на этой форме.
К этому все и идет. :(
2roottim
>ну надеюсь идея понятна !
А.. э... пока не очень, но я разберусь. Спасибо!
2Hawk2 ©
>потом переделает, зато опыт накапливается :-)
Мне больше нравится девиз -"Опыт пропорционален стоимости испорченного оборудования" :)
>В данном случае работа с MDI-формой ничем не отличается от обычной.
Ну не совсем. Sergey13 про подводные камушки верно сказал.

2asp ©
>Так и делать.
Как? по закладкам?

Если я сделаю так:
Form3.DataSet1:=DataModule.Table1.DataSet;
Будет пахать?

Опять же ежели зверь обновил данные как послать их назад? Во попал... мля...


asp   (2003-08-26 11:03:00) [4]

Так и делать.
MDI-форма со свойством IDClient. При выборе клиента сперва перебираешь MDI-формы с клиентами и ищешь нужный IDClient. Нашел - активизируй. Не нашел - делай новую и передавай ей IDClient.


VAleksey   (2003-08-26 10:58:00) [5]


> MsGuns © (25.08.03 17:16)

Ну вот :-((, а я всю жизнь использов закладки.

Не такая уж плохая вещь я скажу. Надо только правильно группировать информацию.


Hawk2   (2003-08-26 10:40:00) [6]

Sergey13 © (26.08.03 10:15) [9] > Можно получить удивление. 8-)
Ну вот захотелось человеку именно так сделать, потом переделает, зато опыт накапливается :-)

Alek Aaz © (26.08.03 10:01) [8]> Нет не запарюсь.
В данном случае работа с MDI-формой ничем не отличается от обычной. По ЕНТЕРу определяеш на какой записи ты находишся и присваиваешь значения полей текущей записи, тем компонентам в которых будет отображаться информация. Естественно в разделе uses нужно указать модуль з компонентами доступа к базе данных, ну там DataModule или главная форма, смотря как там у тебя.


roottim   (2003-08-26 10:36:00) [7]


> Плиз, поскажите как лучше сделать?
> Скажем есть таблица
> Клиент
> номер
> физ/юр лицо
> Юзер выбирает клиента, жмет ентер - открывается MDI форма
> с подробными данными по клиенту. Выбирает другого - новая
> форма.
> Формы разные, для юр и физ лиц.
> Как "правильно" плодить MDI формы?
>
> Вопрос как передать данные в MDI форму? Как лучше это сделать?


форму, по возможности, необходимо сделать автономной
данная форма зависит только от параметров передаваемых ей

для решения твоего вопроса, необходим "MDIQuery"(или сколько требутся) на форме с входными параметрами по ключу клиента
все контролы формы работают с этим "MDIQuery"... т.о. твоя форма независимо от позиционного НД "редактирует клиента"
вызов формы - стандартным образом с передачей соответствующих параметров

type
TMDIForm1 = class(TForm)
MDIQuery: TQuery;
***
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
property ClientID: Integer read GetClientID write SetClientID;
***
procedure ShowClient(AClientID: Integer);
***
end;

var
Form1: TMDIForm1;

implementation
{ TMDIForm1 }

function TMDIForm1.GetClientID: Integer;
begin
Result := MDIQuery.ParamByName("CLIENT_ID").AsInteger;
end;

procedure TMDIForm1.SetClientID(const Value: Integer);
begin
MDIQuery.ParamByName("CLIENT_ID").AsInteger := Value;
end;

procedure TMDIForm1.ShowClient(AClientID: Integer);
begin
ClientID := AClientID;
***
MDIQuery.Open;
end;

procedure TMDIForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
***
ACtion := caFree;
end;
--------------------------------------------------------

процедура вызова

var vForm: TMDIForm1;
begin
vForm := TMDIForm1.Create(Self);
vForm.ShowClient(q1.FieldByName("CLIENT_ID").AsInteger);
end;

--------------------------------------------------------


сроду столько не писал :)...
ну надеюсь идея понятна !
> Приятно что Вам весело, но мне не очень.
и может и тебе повеселеет :)


Sergey13   (2003-08-26 10:15:00) [8]

2Alek Aaz © (26.08.03 10:01) [8]
> Проще конечно, но не лучше. С точки зрения юзера.
Странная точка зрения. А ты его спрашивал? Или это твоя точка зрения на его точку зрения? 8-)
Тут еще такой камушек подводный. Если все твои детские формы ссылаются на один датасет (как у тебя описано), то при переходе на другую запись данные на всех формах сменятся и будут одинаковыми (если используются DB-компоненты). Тут поможет только жесткая связка форма<->датасет на этой форме. А это уже неудобно. Там поредактировал - бросил пошел другую редактировать. Можно получить удивление. 8-)


Alek Aaz   (2003-08-26 10:01:00) [9]

2All
Да нет, не исчез, далеко от компа был.
>А не запаришся ты бегать по этим формам?
Нет не запарюсь.
Делал я и с боку и с табсшитами - не то. Проще конечно, но не лучше. С точки зрения юзера.

Приятно что Вам весело, но мне не очень.


TohaNik   (2003-08-25 17:47:00) [10]

MsGuns © (25.08.03 17:16) [5]
>TohaNik © (25.08.03 17:07) [4]

????

Обед:
- Первое на плите в кухне
- Второе - в кафе за углом
- Компот у тети в Ташкенте в погребе

;))

Это точно - вредно на работу из отпуска;) приходить:)


Hawk2   (2003-08-25 17:27:00) [11]

MsGuns © (25.08.03 17:16) [5]
Смеялся долго.


MsGuns   (2003-08-25 17:16:00) [12]

>TohaNik © (25.08.03 17:07) [4]

????

Обед:
- Первое на плите в кухне
- Второе - в кафе за углом
- Компот у тети в Ташкенте в погребе

;))


TohaNik   (2003-08-25 17:07:00) [13]

ИМХО в этом случае удобно PageControl использовать.


Hawk2   (2003-08-25 16:50:00) [14]

Согласен, так будет даже красивее. Похоже автор и этого вопроса исчез. :-)


MsGuns   (2003-08-25 16:26:00) [15]

А зачем 2 грида-то ? В первом правильно, список клиентов с коротким перечнем основных полей. Внизу (вверху, сбоку) панель с обычными или DB-Aware компонентами типа Edit/Memo и т.д., отображающими не уместившуюся в гриде подробную инфу о текщем (в гриде) клиенте. Эту панель можно отключать (для ускоренного листания или поиска в гриде) или включать (для редактирования, поиска по второстепенным филдам etc).
Если компоненты DB-Aware, то источник должен быть тот же самый, что и для НД в гриде. Если контролы панели - простые Edit, то заполнение их по событию AfterScroll НД из текущей записи этого НД.


Hawk2   (2003-08-25 16:01:00) [16]

А не запаришся ты бегать по этим формам?

Зделай проще, на форме два грида, в одном будет выводится таблица с клиентами, в другом - инфа по этому клиенту. В обеих таблицах должно быть уникальное поле для их связи меджу собой. Это подготовка.

Потом в первом Гриде открываешь таблицу с клиентами, в DataSource, ну который связан с этим НД по событию OnDataChange делаешь запрос ко второй таблице, где выбираешь запись соответствующую номеру клиента из первой, а данные выводишь во второй грид.


Наверх

Титульная страница Поиск, карта сайта Написать письмо