Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.043 c
15-1210843226
User1
2008-05-15 13:20
2008.06.29
Приложения написанные на Delphi


2-1212327471
Ceil
2008-06-01 17:37
2008.06.29
Панель задач


6-1189576836
ient
2007-09-12 10:00
2008.06.29
Принудительный вызов Recv в чужом приложении


15-1211179167
data
2008-05-19 10:39
2008.06.29
Подскажите форумы/сайты по дачному строительству и мелиорации?


2-1212319062
Kiril
2008-06-01 15:17
2008.06.29
Сколько пользователей "потянет" Delphi (ADO) + Access?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский