Embedded-обновление данных

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

Сообщение Den_Is »

При перемещении по основному браузу во встроенном все равно не обновляет!

Заголовочный файл TestEmb.vip

Код: Выделить всё

#ifndef _TESTEMB_ 
#define _TESTEMB_ 

objinterface ITestEmb; 
end; 

vipinterface TestEmb implements ITestEmb 
#ifdef ATL51 
#end 
; 
#end 
Встроеный интерфейс testemb.vip

Код: Выделить всё

#include Galnet.inc
#include testemb.vih 
interface TestEmb 'Vstraivaemii interfeis' 
          (,,sci1Esc) EscClose, Blue; 
	show at (,,70,15); 

	create view 
		as select * 
		from 
			KatOrg, BaseDoc 
		where 
			(( 
				Word(101) == BaseDoc.VidDoc and 
				KatOrg.nRec == BaseDoc.cOrg 
			));                                                                      
	screen scr2 'scr2'
	show at(,,,1);
		buttons
			cmValue2;
	<< 
	<.ggg.> 
	>>
	end;
	handleevent
		cmValue2:{
		message('ffdtteto9');
		rescanpanel(tnkatorg);
		redrawpanel(tnkatorg);
		rereadrecord;
		}
	end;
	Browse KatOrg 'Nakladna9|'; 
		show at (,2,,); 
		table BaseDoc; 
			fields 
				BaseDoc.NoDoc 'Nomer' ('Nomer'): [15], Protect; 
				BaseDoc.dDoc 'Data' ('Data'): [15], Protect; 
				BaseDoc.Name 'Prime4anie' ('Prime4anie'): [40], Protect; 
	end; 
end. 
Главный фейс testit.vip

Код: Выделить всё

#include Galnet.inc
#include testemb.vih
#make "TestEmb.vip "
function Notify(word,longint): longint; external;
interface TESTIT 'Ispolzovanie vstroenngo feisa' 
          (,,sci1Esc) EscClose, Blue; 
Show at (,,,); 
	create view 
			var 
				TE: ITestEmb;
	as select * 
 		from 
			KatOrg, BaseDoc 
		where 
			(( 
				Word(101) == BaseDoc.VidDoc and 
				KatOrg.nRec == BaseDoc.cOrg 
			));                                                                      

	Browse brwOrg 'Organizacii'; 
	Show at (,,,6); 
		table KatOrg; 
			fields 
				KatOrg.Name 'Kotntragent' ('Kotntragent'): [50], Protect; 
	end; 
TabbedSheet TOP tshMain; 
Show at (,7,,); 

Screen scrMain 'Osnovna9'; 
Show at(,,,);
Buttons 
 cmMSG,,,''; 
<< 
      <. Polu4it' Zna4enie .> 
>> 
end; 

Embedded brwOrgBDoc 'Vstroenni feis' interface TE 
show (,,,) 
end; 
end; 
HandleEvent 
cmInit: { 
  LoadVipRef(TE, 'TestEmb'); 
} 
cmDone: 
{ 
  if not NullVipRef(TE) 
    FreeVipInterface(TE); 
} 
cmpositionchanged:{//message('gfgffg');
notify(cmValue2,0);}
end; 
end. 
в чем ошибка?
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Re: Embedded-обновление данных

Сообщение Senkrid »

Чем нибудь принципиально отличается внедрение окна в др. окно, описанных в том же интерфейсе? (т.е. без примудростей таких, как отдельный метод для позиционирования)

Если показать просто окно - данные обновляются. Во встроенном же - нет.
Во всех окнах используется одна и та же корневая таблица. Rescan|Redraw не помогают.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Embedded-обновление данных

Сообщение edward_K »

Конечно отличаются. Дело в том, что дочка ничего не знает о родителе и ей надо сообщать о событиях в родителе.
Как минимум ей нужно сообщить о текущей записи в родителе.
Как правило это делается через связывание процедур.
В objinterface дочки должно быть
event procedure OnDataChanged(переменные); - наименование не обязательно.
В главном фейсе и в дочке соответственно нужно прописать процедуры с таким же названием.
В главном соответственно в cmInit прописываете
GetVipRef(переменная дочки(тип = объект фейса дочки , 'название фейса дочки');
BindEvent(OnDataChanged, дочка.OnDataChanged);
Соотв. например в cmPositionChanged вызывается эта процедура.
Хуже, когда связь нужна двухсторонняя - тогда создается связующий объект и он связывается как в дочке, так и в родителе.
Можно наверное и без GetVipRef обойтись - но привычка.
Ну Notify тоже можно юзать - но возможностей меньше
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Re: Embedded-обновление данных

Сообщение Senkrid »

Хочу убедиться, что поняли друг друга:
При встраивании win1 в win2, описанных в одном интерфейсе int1, создается еще один экземпляр интерфейса int1? В этом случае да - речь идет о родителе и дочке и никакой разницы между внедрением интерфейса в окно другого интерфейса нет?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Embedded-обновление данных

Сообщение edward_K »

Вопрос а как вы его встраивали? Если завели переменную с типом интерфейс то скорей всего получили новый экземпляр. Можно в дочернем окне задать какую нибудь переменную и вычислить в родителе. Но сие зависит от способа задания. Можете попробовать делать rescan panel по табле дочки
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Re: Embedded-обновление данных

Сообщение Senkrid »

edward_K писал(а):Вопрос а как вы его встраивали? Если завели переменную с типом интерфейс то скорей всего получили новый экземпляр. Можно в дочернем окне задать какую нибудь переменную и вычислить в родителе. Но сие зависит от способа задания. Можете попробовать делать rescan panel по табле дочки
Встраивал так:

Код: Выделить всё

   int1 
   ...
   win1
    ...
   end; // win 1
   win2 
    ...
   embedded embTest 'Test' interface int1.win1;
   end; // win2
   end; // int1
Так вот, прямой rescan win2 ничего не дает. Пока с пом. notify (обработчик события находится в win2) удалось обновить, но разве нет более элегантного способа?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Embedded-обновление данных

Сообщение edward_K »

А вообще зачем так сложно? Почему просто не сделать скрин, а если вам уж так надо продублировать, то объявить его через declare?
Рескан нужно делать как RescanPanel(#таблица_скрина)
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Re: Embedded-обновление данных

Сообщение Senkrid »

edward_K писал(а):А вообще зачем так сложно? Почему просто не сделать скрин, а если вам уж так надо продублировать, то объявить его через declare?
Рескан нужно делать как RescanPanel(#таблица_скрина)
Это потребовалось из-за того, чтобы на одной вкладке был и Screen и Browse. Других способов, вроде, нет.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Embedded-обновление данных

Сообщение edward_K »

ну если tabbedsheet, то да.
Ответить