Басқа дүниелік қосылымдардың құпиясы немесе қайта бағытталатын қоңырауларды пайдалану

Новости мира

Алыс, қазір, 1994 жылы, OOP технологияларының барлық түрлерінің дамуы аясында, сол Turbo Vision-де мен де осы жаңалықтарды еске түсіретін болса да, Fox-та ұқсас нәрсені ойлап тапқым келді. Шын мәнінде, барлығы сыртқы, токқа қатысты, модульден функцияның нәтижесін алу мүмкіндігіне келді. Егер әзірлеушілер Module1 конструкцияларында DO Func1 функциясын пайдалануға мүмкіндік берсе

Содан кейін қандай да бір себептермен олар, ең болмағанда, Module1-дегі Do Func1-ді myVar-ға жасауға мүмкіндік бермеді.

Бұл дизайн маған сәйкес келмеді. Мен модульді құжаттың белгілі бір түрінің әрекетіне жауапты еткім келді, бірақ Set Procedure арқылы шамандық бұрмалаусыз осы немесе басқа модульден функцияның нәтижесін қалай алуға болады

Содан кейін бір ғана жалпы процедуралық модульге рұқсат етілген. Содан кейін бір модульден барлық кішігірім ортақ функцияларды шығарып, оларды бірнеше шағын функцияларға бөлу керек болды. Маған бұл да ұнамады. Бір ғана іс қалды: жоғалып кету.
Бұл функцияларды FoxPro шақыру стекінде сақтауға қандай да бір түрде мәжбүрлеу қажет болды, әйтпесе ол оларды тапқысы келмеді.
Осылайша, функция шақыруын модульге шақыру керек жерден қайта бағыттау керек деген шешім қабылданды, бірақ қалай? Иә, бәрі қарапайым болып шықты.
Біз MODULE1.PRG процедуралық модулін шағын «салмағы» жазамыз, оның қандай да бір функциясы бар делік P1 * MODULE1.PRG
m.__ параметрі
егер type(`m.__`)=`C`
қайтару бағасы (м.__)
эндиф

Р1 процедурасы
Қайтару 1

Әрі қарай, біз белгілі бір негізгі файлды жазамыз MAIN.PRG (Владимир Максимовке сәлем)
* MAIN.PRG
? МОДУЛЬ1([P1()])

Шығу кезінде біз P1 функциясымен қайтарылған қажетті 1 мәнін аламыз — Ура, біз алдық!
MAIN.PRG модулін осыған өзгертіңіз
* MAIN.PRG
? МОДУЛЬ1([P1()])

Р1 процедурасы
Қайтару 2

Біздің «шамандық» функциямыз бізге не қайтаратынын тексерейік? Нәтижесінде біз көреміз — 1. Сонымен MAIN.PRG-дегі функциямыз жұмыс істемеді! Және бұл дұрыс, өйткені функцияны шақыру MODULE1.PRG модулінде EVAL (m.__) жолында жүреді — fox ағымдағы модульдегі функцияны тауып, оны басқа жерден іздеуді тоқтатады және бізге қажет функцияның мәнін қайтарады. Жарайды, көріңіз, көріңіз. MAIN.PRG файлын қайта өзгертіңіз
* MAIN.PRG
? МОДУЛЬ1([P2()])

Р2 процедурасы
Қайтару 2

Назар аударыңыз, шляпада қоян жоқ, яғни MODULE1.PRG-де P2 функциясы жоқ. Функция нені қайтаратынын көрейік.
Ол мәнді қайтаратыны белгілі болды — 2. Біз әдеттегі FoxPro құралдарымен тырысамыз, жазамыз
МОДУЛЬ1-де P2 ЖАСАУ

Бізде қате пайда болады: «Р2» процедурасы табылмады — бұл шын мәнінде біз күткен нәрсе, бірақ біздің жағдайда мұндай қате жоқ және функция MODULE1 модулінен мәнді қайтарды, Fox бізді немен алдады? Әлде бізде әлі бар ма? .
MODULE1.PRG файлында P2 функциясының мәні қайдан шыққанын ойлап көрейік?
MODUL1.PRG модуліндегі Fox P2 функциясын табуға тырысады — ол оны таппайды және қоңыраулар стегі арқылы ерте қоңырауларға өтеді, және оны MAIN.PRG модулінде табады — сәйкесінше ол мәнді қайтарады. бұл функция бізге. Мәселе жеңіліп, сол 1994 жылы бір жарым аптада псевдообъективтілік арқылы тізе қоймасы жазылды. Көптеген жылдар рецептісіне байланысты бастапқы кодтарды жоғалтып алғаным өкінішті. Бірақ бұл керемет және жылдам болды.

Енді, шын мәнінде — Амбула.

Менде VFP6 бойынша белгілі бір жоба болды — орындалатын файлдың өлшемі 3,5 метр — барлығы бір. Мен бұл нәрсені бөліктерге бөлуді шештім. Жалпы процедуралық модульдер мен қосымша визуалды емес сыныптарды жеке COMMON.APP модуліне көшіру керек — деді — орындалды — орындалатын файл 1 метрге қысқарды, 2,5 қалды — оның ішінде шамамен 1,5 метр суреттер бар — барлығы үшін жағдайларда, былайша айтқанда. Неліктен оларды орындалатын файлдан шығарайық — оларды IMAGES.APP қолданбасының бір жеріне қойып, сол жерде жатуға рұқсат етіңіз, бәрібір, бұл модуль — жақсы, ол өте сирек өзгереді. Жарайды, біз барлық суреттерді жобадағы жаңа IMAGES.APP қолданбасына жинаймыз, оларға Excluded төлсипатын береміз — біз негізгі орындалатын файлды жинаймыз, алдымен оған IMAGES.APP модулін қосамыз. Ал суреттердің орнына кресттерді көреміз, енді суреттерге крест қою деген не? Жарайды, ойланайық. Егер суреттер осылай қосылмаса, ескі шамандық әдісті қолданайық — суреттердің қосылуын IMAGES.APP қолданбасына қайта бағыттаңыз.
Негізгі Image сыныбында Picture_Assing сипатына келесі кодты қосыңыз
LPARAMETERS vNewVal
*Орындау: Тағайындау әдісі үшін осы тәртіпті өзгертіңіз
THIS.Picture = m.vNewVal
бос болмаса(бұл.сурет)
* Егер файл орындалатын файлда немесе дискіде табылмаса, біз қоңырауды қайта бағыттаймыз
файл болмаса(осы.сурет)
if файлы («IMAGES.APP»)
«IMAGES.APP» ЖАСАУ (осы),`сурет`, this.picture
эндиф
эндиф
эндиф

Сәйкесінше, біз IMAGES жобасының негізгі файлын өзгертеміз, бірақ негізгі модульсіз ше? Тіпті бос — APP соқыр емес.
Процедура 3 параметрге дейін қабылдауы мүмкін
1 — суретті жабыстыратын нысанға сілтеме
2 — меншік атауы, біздің жағдайда СУРЕТ
3 — кескін файлының нақты атауы
4 — параметрді ListBox немесе ComboBox for Picture(N) сипаты үшін пайдалануға болады — N ретінде
lпараметр m.ObjRef, m.cProperty, m.xValue, m.nIndex
if pcount() MessageBox(«Бұл ресурс модулі»,64,_screen.caption)
Қайтару .F.
эндиф
if vartype(m.ObjRef)=`O` ;
және vartype(m.cProperty)=`C` ;
және PEMStatus(m.ObjRef,m.cProperty,5)

егер vartype(m.nIndex)=`N`
if m.cProperty=`СУРЕТ`
ObjRef.Picture[m.nIndex]=m.xValue
басқа
ObjRef.WriteExpression(m.cProperty+`) қайтару[m.nIndex]`,[m.xValue])
эндиф
басқа
ObjRef.WriteExpression(m.cProperty,) қайтару[m.xValue])
эндиф
Қайтару .T.
эндиф

Қайтару .F.

Енді біз суреттерге арналған қолданбаны және негізгі орындалатын файлды қалпына келтіреміз және барлық суреттерді орнында көреміз. Ақырында, біз негізгі орындалатын файлдың өлшемін тағы 1,5 метрге азайта алдық — «тірі» кодтың метрі болды — енді сіз оңай дем аласыз.

Қоңырауларды қайта бағыттау арқылы «басқа дүниелік қосылымдарды» пайдалану арқылы сіз Fox-та көп нәрсені ала аласыз.