powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / организация программы
14 сообщений из 14, страница 1 из 1
организация программы
    #32578619
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть проблемы такая есть программа которая будет использовать MDI интерфейс, хочу для вывода результов различных запросов использовать одну форму в которой будет грид, соответственно, и приблуды для печати, соответственно создавать их по мере необходимости, но вопрос собственно в том как и гланое сколько мне придется использовать компонентов таких как датасет, транзакция... потому что например есть такой случай что в зависимости от значения определенного поля перекрасить всю строку и соответственно у меня такая ерунда получилась запускаю два окошка с разными запросами, а они используют один и тот же датасет, и получается ерунда, поля прописаны динамически ессно не совпадают и полный крах
Поделитесь соображениями
...
Рейтинг: 0 / 0
организация программы
    #32578630
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждое окно должно иметь "свой" кошелёк,
то-бишь датасет и показывать его "содержимое".
Это вообще касается всех окон.
Датасет - это локальный класс, который хранит _один_
набор данных в ед. времени, со своим bookmark-ми, набором
правил представления данных, со своим курсосром на сервере и т.д.
в то время как другие mdi-child окна _могут_возжелать_
показывать этот-же набор с другими bookmark-ми,
правилами представления данных,
с другим уровнем изоляции транзакций и т.д.

Короче, даёшь каждому окну свой Датасет! :))

Имхо, лучше всего создавать датасеты динамически и не полениться
написать для этого класс-обёртку TCommonDataset ...
хотя для ленивых, можно иметь статические датасеты (в data module) типа
DS1, DS2, DS3 ... которые инкапсулируют одно и то-же для
нескольких одновременно открытых окон .... , это нормально,
но не оптимально ...

mapnn
...
Рейтинг: 0 / 0
организация программы
    #32578640
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брр
Сори, но или я ничего не понял или одно из двух
На форме этого окна у меня есть датасет, транзакция, и датасорце.
Датабей используесться с главного окна, что я должен сделать чтобы все заработало как надо
...
Рейтинг: 0 / 0
организация программы
    #32578642
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опа забыл про существенный момент, глюк происходит
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
void __fastcall Tvo_spis::DBGridEh1GetCellParams(TObject *Sender,
      TColumnEh *Column, TFont *AFont, TColor &Background,
      TGridDrawState State)
{
if(DBGridEh1->DataSource->DataSet->Active)
                if(DBGridEh1->DataSource->DataSet->RecordCount > 0 )
                {
                Tvo_spis* vo = dynamic_cast<Tvo_spis*>(Main->ActiveMDIChild);
                if(!vo) return;
                switch (vo->doc_type)
                {
                case  0 : //?????? ??????????
                        {
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 9 ]->AsInteger ==  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                case  1 : //????????? ????????
                        {
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 3 ]->AsInteger <  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }

                }
        }

}
т.е. происходит перерисовывание окошка когда я начинаю двигать одно окно над другим прога находит АКТИВНОЕ окно и пытатся перерисовать НЕАКТИВНОЕ
И соответственно ругается index out of bounds предложите пути решения
...
Рейтинг: 0 / 0
организация программы
    #32578646
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex777Опа забыл про существенный момент, глюк происходит
Tvo_spis* vo = dynamic_cast<Tvo_spis*>(Main->ActiveMDIChild);
if(!vo) return;
switch (vo->doc_type)
{
case 0: //?????? ??????????
т.е. происходит перерисовывание окошка когда я начинаю двигать одно окно над другим прога находит АКТИВНОЕ окно и пытатся перерисовать НЕАКТИВНОЕ
И соответственно ругается index out of bounds предложите пути решения


Напиши
if(!vo || vo != this) return;

а то получишь всегда !vo ))

mapnn
...
Рейтинг: 0 / 0
организация программы
    #32578648
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не в этом фишка
Код: plaintext
if(!vo)
отраьбатывается правильно, дело в том что первое окно находится над вторым виндос перерисовывает НЕАКТИНОЕ окно когда я двигаю АКТИВНОЕ и соответственно находит
Код: plaintext
vo->doc_type
для активного окна, а перерисовать пытаетсся неактивное, пока я использую try catch, но это же неправильно
как мне определить какое окно пытается перерисовать виндос, загвоздка здесь в
Код: plaintext
switch (vo->doc_type)
что мне использовать вместо этого чтобы знать что сейчас перерисовывается окно такое
Код: plaintext
case
должен быть такой
...
Рейтинг: 0 / 0
организация программы
    #32578658
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex777Да не в этом фишка
Код: plaintext
if(!vo)
отраьбатывается правильно, дело в том что первое окно находится над вторым виндос перерисовывает НЕАКТИНОЕ окно когда я двигаю АКТИВНОЕ и соответственно находит
Код: plaintext
vo->doc_type
для активного окна, а перерисовать пытаетсся неактивное, пока я использую try catch, но это же неправильно
как мне определить какое окно пытается перерисовать виндос, загвоздка здесь в
Код: plaintext
switch (vo->doc_type)
что мне использовать вместо этого чтобы знать что сейчас перерисовывается окно такое
Код: plaintext
case
должен быть такой

>виндос перерисовывает НЕАКТИНОЕ окно когда я двигаю АКТИВНОЕ и >соответственно находит vo->doc_type

Я может, не совсем понял, что ты хочешь, но
Windows, имхо всегда перерисовывает background окна при данной операции,
и в этом случае посылает всем нижележащим окнам (согласно z-порядку)
сообщение на перерисовку, в ответ на которое, твои нижележащие гриды (в нижележащих окнах) тоже пытаются перерисоваться в каждой форме, где существует указанный тобой код, и в этом случае для них происходит указанное тобой событие, а так как ты _игнорируешь_ проверку, что _именно_ данный_ грид является "активным", то и все твои гриды "пытаются" делать проверку vo->doc_type, что вполне может привести к исключению.
Активное окно всегда _одно_ а у тебя в коде проверяется "есть - ли вообще
активные окна" ... они есть!!! и отрабатывается код _во_всех_ "нижележащих окнах" ... что неправильно

mapnn
...
Рейтинг: 0 / 0
организация программы
    #32578776
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь я тебя не понял, вот вчера я сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
void __fastcall Tvo_spis::DBGridEh1GetCellParams(TObject *Sender,
      TColumnEh *Column, TFont *AFont, TColor &Background,
      TGridDrawState State)
{
if(DBGridEh1->DataSource->DataSet->Active)
                if(DBGridEh1->DataSource->DataSet->RecordCount > 0 )
                {
                Tvo_spis* vo = dynamic_cast<Tvo_spis*>(Main->ActiveMDIChild);
                if(!vo) return;
                switch (vo->doc_type)
                {
                case  0 : //?????? ??????????
                        {
                        try{
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 9 ]->AsInteger ==  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                        catch(...){;}
                        }
                case  1 : //????????? ????????
                        {
                        try{
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 3 ]->AsInteger <  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                        catch(...){;}
                        }

                }
        }

}

т.е. здесь я просто отлавливаю исключения и вставляю для них пустой обработчик, а как мне сделать так (о чем я уже спрашивал) чтобы знать какое окно в данный момент перерисовывается, т.е. как я уже говорил ранее делать проверку не
Код: plaintext
1.
2.
3.
                Tvo_spis* vo = dynamic_cast<Tvo_spis*>(Main->ActiveMDIChild);
                if(!vo) return;
                switch (vo->doc_type)

а другую, а какую именно я как раз и спрашиваю
...
Рейтинг: 0 / 0
организация программы
    #32578794
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex777
т.е. здесь я просто отлавливаю исключения и вставляю для них пустой обработчик, а как мне сделать так (о чем я уже спрашивал) чтобы знать какое окно в данный момент перерисовывается, т.е. как я уже говорил ранее делать проверку не
Код: plaintext
1.
2.
3.
                Tvo_spis* vo = dynamic_cast<Tvo_spis*>(Main->ActiveMDIChild);
                if(!vo) return;
                switch (vo->doc_type)

а другую, а какую именно я как раз и спрашиваю

может это тебе надо:

Код: plaintext
1.
2.
3.
4.
  for(int i = MDIChildCount- 1 ; I >=  0 ; i --)
 
    if(MDIChildren == this)
     [i]/* сейчас отрисовывается MDIChildren[i] */ 

mapnn
...
Рейтинг: 0 / 0
организация программы
    #32578989
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет не то здесь идет перебор всех чилдов, мне необходимо перед case точно знать что событие ON_PAINT возникло для этого окна, а не перебирать в цикле всех чилодов, это будет очень тормозить, и требуемого результата я все равно не добьюсь.
...
Рейтинг: 0 / 0
организация программы
    #32579097
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все разобрался,
оказалось проще чем я думал, проблема была в том что мне не надо было выбирать окно, при событии перерисовки, я УЖЕ нахожусь в том окне которое перерисовывается, окончательный вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
void __fastcall Tvo_spis::DBGridEh1GetCellParams(TObject *Sender,
      TColumnEh *Column, TFont *AFont, TColor &Background,
      TGridDrawState State)
{
if(DBGridEh1->DataSource->DataSet->Active)
                if(DBGridEh1->DataSource->DataSet->RecordCount > 0 )
                {
                switch (doc_type)
                {
                case  0 : //?????? ??????????
                        {
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 9 ]->AsInteger ==  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                case  1 : //????????? ????????
                        {
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 3 ]->AsInteger <  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                case  2 : //?????? ?? ??????? ??????
                        {
                        if(DBGridEh1->DataSource->DataSet->Fields->Fields[ 3 ]->AsInteger <  0 )
                        AFont->Color = clRed; else
                        DBGridEh1->Font->Color = clBlack;
                        break;
                        }
                }
        }

}

т.е просто убран dynamic_cast, оказывается он был некчему
...
Рейтинг: 0 / 0
организация программы
    #32580036
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
счас я, наконец, понял, что ты хотел ...

Меня извиняет то, то в "пивном состоянии" в выходные трудно
разглядеть смысл .... задачки ... сразу ... :>)

Просто хотелось помочь земляку ... :>)

С уважением, Игорь Ильинский
e-mail: mapnn@sinn.ru
http
: www.sinn.ru/~mapnn
...
Рейтинг: 0 / 0
организация программы
    #32590168
CruelGenius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[
Просто хотелось помочь земляку ... :>)

С уважением, Игорь Ильинский
e-mail: mapnn@sinn.ru
http
: www.sinn.ru/~mapnn[/quot]<===================
Все это классно но как получить бы программу и поюзать ее?
Есть просто справочник предприятий, без карты но зато с товарами и ценами и где его взять по Нижнему Новгороду?
ЗЫ проезжал я как то ваш город ночью год назад на комтек 2003 ехали.
...
Рейтинг: 0 / 0
организация программы
    #32592378
mapnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чём речь коллега? :)
Что поюзать? Речь о ГИС или просто о справочнике пердприятий?
Если просто о справочнике - ищи на www.nn.ru

PS. с гис я завязал (тошнит уже) - денег это не приносит в принципе,
работаешь 2 года как вол - пользуются все но ... даже спасибо никто не скажет ... РОССИЯ ...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / организация программы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]