Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизОбновление данных на форме Найти похожие ветки
← →
chargos © (2008-05-30 15:25) [0]Здравствуйте!
Подскажите, пожалуйста, в чем может быть проблема.
У меня есть 2 программы, которые работают с одной таблицей ADOTable одновременно.В первой программе по кнопке(в бесконечном цикле) проверяются нажатия клавиш и вносятся в таблицу в определенную строчку.
ADOTable.Edit;
......
ADOTable.Post;
ADOTable.Edit;
Во второй программе (тоже в бесконечном цикле) происходит чтение из этой же таблицы(с задержкой в секунду) и данные заносятся в соответствующие метки(TLabel), причем каждый раз таблица открывается и закрывается. Но данные на форме в метках не изменяются. Сначала подумал на Post(в первой программе). Добавил после него Close/ Open. Но это не помогло. Подскажите, в чем может быть дело?
← →
Reindeer Moss Eater © (2008-05-30 15:33) [1]У меня есть 2 программы, которые работают с одной таблицей ADOTable одновременно.
Врешь ты все
← →
Плохиш © (2008-05-30 15:38) [2]
> и вносятся в таблицу в определенную строчку
и здесь врёшь, т.к. нет в ADOTable никаких строк...
← →
Плохиш © (2008-05-30 15:40) [3]
> причем каждый раз таблица открывается и закрывается
Что ж он, ADOTable, дурной что ли постоянно миллиарды записей на клиента тягать?
← →
Reindeer Moss Eater © (2008-05-30 15:41) [4]> и вносятся в таблицу в определенную строчку
причем каждый раз таблица открывается и закрывается.
А кто ее позиционирует после открытия на "определенную строчку" ?
← →
Stas © (2008-05-30 15:42) [5]chargos © (30.05.08 15:25)
Ого намудрил! а ты что делаешь?
← →
Reindeer Moss Eater © (2008-05-30 15:42) [6]программный продукт создает
← →
Reindeer Moss Eater © (2008-05-30 15:45) [7]замени свои дурацкие лэйблы на грид.
по крайней мере будет хоть что-то видно что там реально происходит.
← →
Барсик (2008-05-30 15:46) [8]
> программный продукт создает
манифест партии программистов?
← →
stud © (2008-05-30 15:48) [9]вроде все просто.
либо не туда вносятся, либо не оттуда читаются
← →
Azize © (2008-05-30 15:51) [10]А мне кажеться что вся проблемма в бесконечном цикле)))
← →
chargos © (2008-05-30 15:57) [11]Приношу свои извинения, если не так написал(например вместо "запись" - "строка").
To Плохиш :
>Что ж он, ADOTable, дурной что ли постоянно миллиарды записей на клиента тягать?
Миллиардов записей там нету. Их всего несколько.
To Reindeer Moss Eater :
> замени свои дурацкие лэйблы на грид.
по крайней мере будет хоть что-то видно что там реально происходит.
Грид мне не нужен. Нужны именно лэйблы.
>А кто ее позиционирует после открытия на "определенную строчку" ?
Никто, т.к. данные из нее только Читаются.
← →
Stas © (2008-05-30 15:57) [12]Для чего это нужно? вобще Close/Open там ненадо.
← →
chargos © (2008-05-30 15:58) [13]И обновляются все лэйблы
← →
Reindeer Moss Eater © (2008-05-30 15:59) [14]Грид мне не нужен. Нужны именно лэйблы.
Сначала тебе надо проблему локализовать, а уже потом именно лэйблы.
← →
chargos © (2008-05-30 16:00) [15]Если в первой программе делать через Грид, то все работает. Но мне нужно во второй и именно через лэйблы
← →
Stas © (2008-05-30 16:01) [16]chargos © (30.05.08 15:57) [11]
1. у тебя после open таблица позиционируется на 1-ю запись
2. в бесконечном цикле нужно написать в конце Application.processmessages
или хотябы заменить на таймер
3.Так и непонял смысла этой программы.
← →
Reindeer Moss Eater © (2008-05-30 16:01) [17]Но мне нужно во второй и именно через лэйблы
Через лейблы у тебя уже сделано.
Поздравляю.
← →
chargos © (2008-05-30 16:02) [18]Stas ©
Application.processmessages есть.
← →
chargos © (2008-05-30 16:03) [19]Reindeer Moss Eater ©
>Через лейблы у тебя уже сделано.Поздравляю
Спасибо :) Но при запуске данные показываются один раз и больше не обновляются, хотя есть и цикл, и Application.processmessages
← →
stud © (2008-05-30 16:05) [20]
> Грид мне не нужен. Нужны именно лэйблы.
> >А кто ее позиционирует после открытия на "определенную
> строчку" ?
> Никто, т.к. данные из нее только Читаются.
это сильно!! т.е. если данные читаются то позиционировать их не надо? особенно при таком отображении
← →
MsGuns © (2008-05-30 16:05) [21]Чтобы датасет обновился (а именно это и требуется в сабже, как я понял), нужно его переоткрыть (именно переоткрыть, а не отрефрешить видимую часть (если речь идет о DB-Aware контролах), т.к. он понятия не имеет какая именно запись изменена на сервере.
Другими словами, чтобы на форме 1 "увидеть" изменения, сделанные в форме 2, надо датасет формы 1 переоткрыть. Перед этим, естественно, нужно завершить транзакцию в форме 2. Как часто это делать (подтверждать изменения и переоткрывать "читающий" датасет, зависит о концепции построения интерфейса.
← →
Reindeer Moss Eater © (2008-05-30 16:07) [22]у него два процесса а не две формы.
а про транзакции ему никто еще не рассказал, чтобы он их умудрился не коммитить в первом прцессе
:)
← →
Reindeer Moss Eater © (2008-05-30 16:10) [23]> Никто, т.к. данные из нее только Читаются.
Ты пушкина попроси спозиционировать перед чтением. Он добрый.
← →
chargos © (2008-05-30 16:36) [24]Насчет Пушкина спасибо, конечно, только врядли пригодится :)
Я не очень силен в программировании, но может, кроме шуток, будет и дельный совет?
Насчет позиционирования: Для чего это нужно, если в каждом цикле база вначале открывается и данные в метках на форме должны обновляться с первой записи по последнюю?
MsGuns ©
Это 2 программы, использующие одну базу.
Можно поподробнее насчет транзакций? :)
← →
Stas © (2008-05-30 16:37) [25]вы подробнее опишите что делаете с приведением кода, а то мы тут гадаем что где меняется...
← →
Reindeer Moss Eater © (2008-05-30 16:42) [26]Я не очень силен в программировании, но может, кроме шуток, будет и дельный совет?
ПОЛОЖИ ГРИД НА ФОРМУ. На пять минут.
← →
chargos © (2008-05-30 16:47) [27]Первая программа при нажатии на кнопку постоянно фиксирует изменения нажатия клавиш и заносит данные в базу .mdb. Если поставить Грид на форме, то видно, что данные в записях меняются. Вторая использует эту же базу. В ней в цикле формируются лэйблы, в которые каждый раз вносятся данные из этой базы.С первой записи по последнюю. Согласен, не очень удачно, но тем не менее... Так вот, во второй программе в цикле идет открытие базы, изменение данных в метках, потом закрытие. Application.ProcessMessages после каждого цикла есть, но данные на форме в метках не обновляются, а остаются такими же, как при запуске.
← →
Stas © (2008-05-30 16:52) [28]ОК, А во второй программе в начале цикла делаете Close/Open ?
← →
Reindeer Moss Eater © (2008-05-30 16:52) [29]молодец.
теперь положи второй грид на вторую форму в читающем приложении.
← →
chargos © (2008-05-30 16:53) [30]Stas ©
Да
← →
Stas © (2008-05-30 16:57) [31]А если 2-е закрыть, и открыть данные будут последние?
← →
chargos © (2008-05-30 17:02) [32]Stas ©
То есть?
← →
Stas © (2008-05-30 17:04) [33]ну 2-е приложение закрываешь. Потом опять открываешь его что оно отображает в лабелах? обновленные данные или старые?
← →
chargos © (2008-05-30 17:04) [34]Reindeer Moss Eater ©
>теперь положи второй грид на вторую форму в читающем приложении.
Положил - данные не обновляются.... Подумаю в этом направлении :)
Если есть желание, предлагаю перенести обсуждение на понедельник, а то пора уже с работы :)
Всем спасибо!
← →
Stas © (2008-05-30 17:05) [35]И я непойму ты для каждой записи создаешь лабел, а когда цикл прошел и ты его повторяешь ты удаляешь все созданные лабелы?
← →
chargos © (2008-05-30 17:05) [36]Stas ©
Если закрыть второе приложение и открыть, тогда данные обновляются
← →
Stas © (2008-05-30 17:07) [37]ок! покажи код второго, и иди домой :))
← →
chargos © (2008-05-30 17:08) [38]Stas ©
Нет, создаются они один раз, а потом в цикле меняются только Caption, Font, Left, Top и т.п.
← →
chargos © (2008-05-30 17:14) [39]Если что будет по-чайниковски - звиняйте :)
procedure TStaticForm.FormShow(Sender: TObject);
var
lab,lab1,lab2:TLabel;
begin
Ctrlc:=1;
LabFIO:=TStringList.Create;
LabYES:=TStringList.Create;
LabNO:=TStringList.Create;
ADOTable2.Open;
j:=ADOTable2.RecordCount;
ADOTable2.Close;
for i:=1 to j+1 do
begin
lab:=TLabel.Create(StaticForm);
Lab.Parent:=StaticForm;
lab1:=TLabel.Create(StaticForm);
Lab1.Parent:=StaticForm;
lab2:=TLabel.Create(StaticForm);
Lab2.Parent:=StaticForm;
LabFIO.AddObject("Label#"+IntToStr(i),Lab);
LabYES.AddObject("Label#"+IntToStr(i),Lab1);
LabNO.AddObject("Label#"+IntToStr(i),Lab2);
end;
While Ctrlc>0 do
begin
i:=0;
ADOTable2.Open;
ADOTable2.First;
While not ADOTable2.Eof do
begin
i:=i+1;
TLabel(LabFIO.Objects[i]).Caption:=ADOTable2Name.AsString;
TLabel(LabFIO.Objects[i]).Font.Size:=20;
TLabel(LabFIO.Objects[i]).Font.Style:=[fsBold];
TLabel(LabFIO.Objects[i]).Visible:=true;
TLabel(LabFIO.Objects[i]).Height:=30;
TLabel(LabFIO.Objects[i]).Left:=24;
TLabel(LabFIO.Objects[i]).Top:=70*i;
TLabel(LabFIO.Objects[i]).Width:=150;
//
TLabel(LabYES.Objects[i]).Caption:=IntToStr(ADOTable2Yes.AsInteger);
TLabel(LabYES.Objects[i]).Font.Size:=20;
TLabel(LabYES.Objects[i]).Font.Style:=[fsBold];
TLabel(LabYES.Objects[i]).Visible:=true;
TLabel(LabYES.Objects[i]).Height:=30;
TLabel(LabYES.Objects[i]).Left:=275;
TLabel(LabYES.Objects[i]).Top:=70*i;
TLabel(LabYES.Objects[i]).Width:=150;
//
TLabel(LabNO.Objects[i]).Caption:=IntToStr(ADOTable2No.AsInteger);
TLabel(LabNO.Objects[i]).Font.Size:=20;
TLabel(LabNO.Objects[i]).Font.Style:=[fsBold];
TLabel(LabNO.Objects[i]).Visible:=true;
TLabel(LabNO.Objects[i]).Height:=30;
TLabel(LabNO.Objects[i]).Left:=504;
TLabel(LabNO.Objects[i]).Top:=70*i;
TLabel(LabNO.Objects[i]).Width:=150;
Application.ProcessMessages;
ADOTable2.Next;
end;
Ctrlc:=0;
Application.ProcessMessages;
ADOTable2.Close;
end;
end;
procedure TStaticForm.Timer1Timer(Sender: TObject);
begin
if Ctrlc=0 then
Ctrlc:=1;
end;
← →
Stas © (2008-05-30 17:23) [40]>Ctrlc:=0; убрать на время.
← →
Reindeer Moss Eater © (2008-05-30 17:25) [41]>Ctrlc:=0; убрать на время.
>теперь положи второй грид на вторую форму в читающем приложении.
Положил - данные не обновляются....
← →
Stas © (2008-05-30 17:32) [42]Reindeer Moss Eater © (30.05.08 17:25) [41]
скорее всего у него цикл 1 раз прошел и запрос не переоткрылся
← →
Reindeer Moss Eater © (2008-05-30 17:48) [43]в грид тоже из-за цикла нет новых данных?
← →
ANB (2008-05-30 18:45) [44]
> procedure TStaticForm.Timer1Timer(Sender: TObject);
> begin
> if Ctrlc=0 then
> Ctrlc:=1;
> end;
У тебя опрос таблицы делается один раз при показе формы. Перенеси код :
открыть таблицу
прочитать данные
обновить инфу на форме
закрыть таблицу
в отдельный метод. И вызывай его из таймера.
ЗЫ. Зря посоветовал. Руки надо отрывать за такие решения.
← →
chargos © (2008-06-02 09:18) [45]Изменил немного код: Повесил весь этот код на кнопку(Button), вместо ADOTable2.Close написал ADOTable2.Requery(после Application.ProcessMessages;), убрал Таймер. Теперь обновляется нормально, но почему-то раз в три секунды. В первой проге стоит Грид, там обновляется нормально при нажатии. Не подскажете, в чем может быть причина такой задержки?
← →
MsGuns © (2008-06-02 10:38) [46]Убрать к тетушке ProcessMessages, обновление контролов сразу после перечитки (Requery), собственно перечитку после выполнения изменений. "Уведомление" показывающей формы о выполненный изменениях с помощью SendMessage из "изменяющей" формы.
← →
Stas © (2008-06-02 14:30) [47]MsGuns © (02.06.08 10:38) [46]
>SendMessage
Я думаю предпологается на разных машинах их использовать.
← →
chargos © (2008-06-02 15:44) [48]Если убрать ProcessMessages, то прога виснет. А программы предполагается использовать на разных компьютерах.
← →
Stas © (2008-06-02 16:10) [49]chargos © (02.06.08 09:18) [45]
т.е. если в 1-й программе изменили данные, во 2-й нажали на кнопку данные не изменились, через 3 сек, нжимаем на кнопку изменились?
← →
Stas © (2008-06-02 16:13) [50]chargos © (02.06.08 15:44) [48]
Давай так:
3-е приложение в котором лежит грид подключенный к таблице, и таймер 500 м.с.
на событие таймера делаем ADOTable1.Close; ADOTable1.Open;
Что происходит?
← →
chargos © (2008-06-03 08:36) [51]Stas ©
Первая программа изменяет данные в базе, вторая отображает их постоянно(вне зависимости от изменения базы). Данные обновляются в метки во второй программе. Т.е. во второй программе кнопку нажимаешь один раз и после этого данные постоянно обновляются.
← →
chargos © (2008-06-03 08:37) [52]Stas ©
> Давай так:
>3-е приложение в котором лежит грид подключенный к таблице, и таймер >500 м.с.на событие таймера делаем ADOTable1.Close; ADOTable1.Open;
>Что происходит?
То же самое, то есть данные в гриде обновляются спустя 3-4 секунды.
← →
Anatoly Podgoretsky © (2008-06-03 09:00) [53]> chargos (03.06.2008 8:37:52) [52]
4 секунды это задержка сброса кеша на диск.
← →
chargos © (2008-06-03 09:21) [54]Anatoly Podgoretsky ©
А можно как-нибудь время этой задержки уменьшить?
← →
Anatoly Podgoretsky © (2008-06-03 11:59) [55]> chargos (03.06.2008 9:21:54) [54]
Так это не единственная задержка, еще есть кеш винчестера.
Но тебе уже сказали отключи кеширование записи, но потом не матюгайся.
Для баз это обычное поведение, но как правило для промышленных и полу просмысленных SQL серверов и с выделением отдельного диска под базу, а то и множества дисков.
← →
ANB (2008-06-03 14:59) [56]
> но как правило для промышленных и полу просмысленных SQL
> серверов
Эти выдают все честно и сразу после коммита. Независимо от кэширования.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.05 c