Başqa dünya əlaqələrinin sirri və ya yönləndirilmiş zənglərin istifadəsi

Новости мира

Uzaq, indi, 1994-cü ildə, bütün növ OOP texnologiyalarının inkişafı fonunda, eyni Turbo Vision-da, mən də bu yenilikləri xatırlatsa da, Fox-da oxşar bir şey ortaya qoymaq istədim. Əslində, hər şey xarici, cərəyanla əlaqəli moduldan bir funksiyanın nəticəsini əldə edə bilməyə başladı. Əgər tərtibatçılar Module1 konstruksiyalarında DO Func1-dən istifadə etməyə icazə verərsə

Və sonra nədənsə Module1-də ən azı Do Func1-ə myVar-a icazə vermədilər.

Bu dizayn mənə yaraşmadı. Müəyyən bir növ sənədin davranışına cavabdeh bir modul etmək istədim, lakin Set Proseduru ilə şamanist manipulyasiya olmadan bu və ya digər moduldan funksiyanın nəticəsini necə əldə edə bilərəm?

Sonra yalnız bir ümumi prosedur moduluna icazə verilir. Sonra bir moduldan bütün kiçik ümumi funksiyaları çıxarmaq və onları bir neçə kiçik funksiyaya bölmək lazım idi. Bunu da bəyənmədim. Ediləcək tək bir şey qaldı: yox olmaq.
FoxPro hansısa yolla bu funksiyaları zəng yığınında saxlamağa məcbur etməli idi, əks halda onları tapmaq istəmirdi.
Beləliklə, qərar verildi ki, funksiya çağırışı çağırılmalı olduğu yerdən modula yönləndirilməlidir, bəs necə? Bəli, hər şey sadə oldu.
Biz MODULE1.PRG kiçik «çəki» prosedur modulu yazırıq, tutaq ki, onun hansısa funksiyası var P1 * MODULE1.PRG
m.__ parametr
əgər type(`m.__`)=`C`
qaytarılma qiyməti (m.__)
endif

P1 proseduru
Qayıdış 1

Sonra, müəyyən bir əsas faylı yazacağıq MAIN.PRG (Vladimir Maksimova salamlar)
* MAIN.PRG
? MODUL 1 ([P1()])

Çıxışda biz P1 funksiyasının qaytardığı istənilən dəyəri 1 alırıq — Yay, əldə etdik!
MAIN.PRG modulunu buna dəyişin
* MAIN.PRG
? MODUL 1 ([P1()])

P1 proseduru
Qayıdış 2

Gəlin yoxlayaq «şaman» funksiyamız bizə nə qaytarır? Nəticədə biz görürük — 1. Beləliklə, MAIN.PRG-dəki funksiyamız işləmədi! Və bu doğrudur, çünki funksiya çağırışı MODULE1.PRG modulunda EVAL (m.__) xəttində baş verir — fox funksiyanı cari modulda tapır, onu başqa yerdə axtarmağı dayandırır və bizə lazım olan funksiyanın qiymətini qaytarır. Yaxşı, cəhd edin, cəhd edin. MAIN.PRG faylını yenidən redaktə edin
* MAIN.PRG
? MODUL 1 ([P2()])

Prosedur P2
Qayıdış 2

Qeyd edək ki, papaqda dovşan yoxdur, yəni MODULE1.PRG-nin P2 funksiyası yoxdur. Gəlin görək funksiya nə qaytarır.
Belə çıxır ki, o, dəyəri qaytarır — 2. Biz çalışırıq, adi FoxPro alətləri ilə yazırıq
MODUL1-də P2 YARADIN

Səhv alırıq: «P2» proseduru tapılmadı — əslində gözlədiyimiz budur, amma bizim vəziyyətimizdə belə bir xəta yoxdur və funksiya MODULE1 modulundan dəyər qaytardı, Fox bizi nə ilə aldatdı? Yoxsa bizdə hələ də var? .
Təxmin edək ki, MODULE1.PRG faylında P2 funksiyasının qiyməti haradan gəlir?
MODUL1.PRG modulunda Fox P2 funksiyasını tapmağa çalışır — o, onu tapmır və çağırış yığını vasitəsilə erkən zənglərə keçir və MAIN.PRG modulunda tapır — müvafiq olaraq dəyəri qaytarır. bu funksiya bizim üçündür. Problem məğlub oldu və 1994-cü ildə, bir yarım həftə ərzində, diz eklemi yalançı obyektivliklə sağaldı. Təəssüf ki, uzun illər reseptə görə mənbə kodları itirdim. Amma əla və sürətli idi.

İndi, əslində — Ambula.

VFP6-da xüsusi bir layihəm var idi — icra olunan faylın ölçüsü 3,5 metrdir — hamısı bir yerdə. Bu şeyi hissələrə bölmək qərarına gəldim. Ümumi prosessual modullar və əlavə qeyri-vizual siniflər ayrıca COMMON.APP moduluna köçürülməlidir — dedi — yerinə yetirildi — icra edilə bilən 1 metr azaldıldı, 2,5 qaldı — təxminən 1,5 metr şəkillər daxil olmaqla — bütün hallarda, belə demək olar. Nə üçün onları icra olunan proqramdan çıxarın — onları IMAGES.APP-də bir yerə qoyun və orada yatsınlar, hər halda, bu modul — yaxşı, nadir hallarda dəyişir. OK, biz bütün şəkilləri layihədə yeni IMAGES.APP-da birləşdirəcəyik, onlara İstisna olunmuş atributunu verəcəyik — biz əsas icra olunanı paketləyəcəyik, əvvəlcə ona IMAGES.APP modulunu əlavə edəcəyik. Və şəkillərin əvəzinə xaçlar görürük, şəkillərə xaç qoymağın mənası nədir? Yaxşı, bu barədə düşünək. Şəkillər bu şəkildə birləşmirsə, gəlin köhnə şaman metodundan istifadə edək — şəkillərin əlaqəsini IMAGES.APP-a yönləndirək.
Əsas Image sinifində Picture_Assing xüsusiyyətinə aşağıdakı kodu əlavə edin
LPARAMETERS vNewVal
*Et: Tapşırıq metodu üçün bu sıranı dəyişdirin
THIS.Picture = m.vNewVal
boş deyilsə (bu.şəkil)
* Əgər fayl icra olunan proqramda və ya diskdə tapılmazsa, zəngi yönləndiririk
heç bir fayl yoxdursa (this.image)
əgər fayllar(«IMAGES.APP»)
«IMAGES.APP» (bu), ‘şəkil’, bu.şəkil YARADIN
endif
endif
endif

Müvafiq olaraq, IMAGES layihəsinin əsas faylını dəyişdiririk, bəs əsas modul olmadan necə? Hətta boş — APP kor deyil.
Bir prosedur 3 parametrə qədər qəbul edə bilər
1 şəkil yapışdıran obyektə keçiddir
2 — əmlakın adı, bizim halda ŞƏKİL
3 şəkil faylının dəqiq adıdır
4 — parametr ListBox və ya ComboBox for Picture(N) üçün istifadə edilə bilər — N kimi
lparametr m.ObjRef, m.cProperty, m.xValue, m.nIndex
if pcount() MessageBox(«Bu, resurs moduludur»,64,_screen.caption)
Qayıdın .F.
endif
əgər vartype(m.ObjRef)=`O` ;
və vartype(m.cProperty)=`C` ;
və PEMStatus(m.ObjRef,m.cProperty,5)

əgər vartype(m.nIndex)=`N`
əgər m.cProperty=`SURET`
ObjRef.Şəkil[m.nIndex]=m.xDəyər
digər
qaytarın ObjRef.WriteExpression(m.cProperty+`).[m.nIndex]`,[m.xValue])
endif
digər
qaytarın ObjRef.WriteExpression(m.cProperty,).[m.xValue])
endif
Qayıdın .T.
endif

Qayıdın .F.

İndi şəkillər tətbiqini və əsas icra olunanı bərpa edirik və bütün şəkilləri yerində görürük. Nəhayət, biz əsas icra olunanın ölçüsünü daha 1,5 metr — «canlı» kodun metri — azalta bildik və indi rahat nəfəs ala bilərsiniz.

Zəng yönləndirmə ilə «başqa dünya əlaqələri»ndən istifadə etməklə Fox-da çox şey əldə edə bilərsiniz.