Delphi arayüzler ne içindir. Delphi'de kullanıcı arabirimleri oluşturmak için öneriler. Her şey her zaman görünür

Bu makale, forumlardaki sorulara dayanmaktadır: "Bir DLL'den bir dize nasıl döndürülebilir?", "Bir dizi kayıt nasıl aktarılır ve döndürülür?", "Bir form bir DLL'ye nasıl aktarılır?"

Hayatınızın yarısını çözmeye çalışarak harcamamanız için bu yazıda her şeyi gümüş tepside sunacağım.

Bu makalenin konularına bu blogda çeşitli derecelerde zaten değinildi, ancak bu makalede bunlar bir demet halinde toplandı, gerekçesi verildi. Kısacası DLL geliştirenlere bu yazının linki atılabilir.

Önemli Not: makale okunmalı sürekli... Kod örnekleri yalnızca şu şekilde sağlanır: örnekler, makalenin her adımında (paragrafında) yeni ayrıntılarla birlikte örneklerin kodu eklenir. Örneğin, makalenin en başında hata işleme yoktur, makale boyunca daha yeterli olanlarla değiştirilen "klasik" yöntemler (GetLastError, sdtcall kuralları vb. kullanmak gibi) belirtilir. Bu, "yeni" ("sıradışı") yapıların soru sormaması nedeniyle yapılır. Aksi takdirde, her örnek için forma bir not eklemeniz gerekir: "Bu, aşağıdaki paragrafta tartışılmıştır, ancak bu, bu paragraftadır." Her durumda, makalenin sonunda, makalede söylenen her şey dikkate alınarak yazılmış hazır koda bir bağlantı vardır. Sadece alıp kullanabilirsiniz. Ve makale nedenini ve nedenini açıklıyor. "Neden ve neden" ile ilgilenmiyorsanız - sonuca ve örneği indirmek için bağlantıya gidin.

oluşturma arayüz kullanıcı, programın çalışması için gerekli Delphi bileşenlerini bileşen paletinden seçmeye indirgenir, arayüz yönetim de arayüz bilgilerin görüntülenmesi ve sonraki düzen ile Form'a aktarılması.

Oluşturduğunuz kullanıcı arayüzü, kullanıcıların aşina olduğu standart öğeleri kullanmalı ve maksimum kolaylık sağlamalıdır. Bütün bunlar nihayetinde arayüzün etkinliği gibi bir kriter tarafından belirlenir - minimum çabayla maksimum sonuç.
Kullanıcı dostu bir arayüz oluşturma ilkeleri iyi bilinmektedir. Kullanıcı arayüzleri oluşturulurken en genel prensipler olarak üç ana nokta düşünülebilir:

  1. Program, görevi tamamlamaya yardımcı olmalı, o görev haline gelmemelidir.
  2. Programla çalışırken kullanıcı kendini aptal gibi hissetmemelidir.
  3. Program, kullanıcının bilgisayarın bir aptal olduğunu düşünmeyeceği şekilde çalışmalıdır.
İlk ilke- bu, arayüzün sözde "şeffaflığı"dır. Kullanıcı arayüzü sezgisel, öğrenmesi kolay olmalı ve kullanıcı için bu süreçte üstesinden gelmek zorunda kalacağı sorunlar yaratmamalıdır. Gereksiz dekorasyon bileşenleri olmadan standart kullanın, benzer programların kullandığı olağan kontrol yöntemlerini uygulayın ve performans kriterlerine ulaşacaksınız. ilk prensip.

İkinci ilke kullanıcıların entelektüel yeteneklerinin ihmal edilmesinde yatmaktadır. Kendi deneyimlerime göre, kullanıcıların genellikle yalnızca bilgisayarda nasıl çalışacaklarını bilmediklerini, aynı zamanda kendi başlarına bir şeyler yapmaktan korktuklarını biliyorum. Bu nedenle, kullanıcı arayüzü mümkün olduğunca kolay olmalıdır.
Ayrıca, kullanıcıların korkuları genellikle haklıdır, çünkü programın maliyeti ve bilgisayarın kendisi, örneğin, uzun yıllar süren çabalarla oluşturulan bir veritabanının maliyeti ile karşılaştırılamaz. Bu nedenle, programcı, kullanıcı arayüzünü oluştururken, her zaman "aptaldan koruma" programında - yanlış eylemlerden ve yanlış verilerin kullanıcı girişinden - oluşturmalıdır. Ancak bazı programcılar böyle bir korumaya çok fazla kapılırlar, onu fazla müdahaleci yaparlar ve sonuç olarak programın çalışması ünlü "sola adım, sağa adım bir kaçış olarak kabul edilir"e benzer! Ve bir programcının bir probleme çözüm olarak yarattığı şey, kendi başına problem yaratmaya başlar.
uymak ikinci ilke Programın kullanıcının eylemlerini "düzeltmesine" ve tam olarak ne yapması gerektiğini belirtmesine ve onu dar bir çerçeveye sürmesine gerek yoktur. Ayrıca, bilgi istemlerinin, özellikle diyalog mesajlarının görüntülenmesine fazla kapılmamalısınız, bu, kullanıcının dikkatini dağıtır. Daha da iyisi, istemleri devre dışı bırakma yeteneği sağlayın.

üçüncü ilke mümkün olan en yüksek "zihinsel" kapasiteye sahip bir program oluşturmaktır. Bilgisayar teknolojisinin hızlı gelişimine rağmen, yaygın programlar bile ancak şartlı olarak yapay zekaya sahip olarak adlandırılabilir. En basit durumlarda bile kafa karışıklığına neden olan aptal sorular içeren iletişim kutuları görüntüleyerek kullanıcının çalışmasına müdahale ederler. Sonuç olarak, kullanıcılar yüreklerinde haykırıyorlar: "Eh, bu makine aptal!"
Neredeyse herkesin sürekli sorduğu sorulardan şahsen rahatsız oluyorum. metin editörleri Orijinal ve mevcut metin herhangi bir sembolde farklılık göstermese de, değiştirilen metnin saklanıp saklanmayacağı hakkında. Evet, bir şeyler yazıyordum ama sonra her şeyi geri verdim, gerçekten anlayamıyorsunuz! Bir şeyleri karıştırıp karıştırmadığımı kontrol etmeliyim.

Aşağıdaki kurallara uymaya çalışın:

Standart arayüz elemanları
Bu arabirim öğesi için bileşenler standardını kullanın. Programınızla tanıştıktan sonra, kullanıcı birbirini tanımak için zaman kaybetmeyecek, hemen çalışmaya başlayacak - bu, profesyonelce yapılmış bir programın işaretlerinden biridir.
Küçük araç paleti
Çok fazla farklı bileşen kullanmamaya çalışın. Ve elbette, bir yerde bir yerde standart bir bileşen kullanmış olmak, benzer bir durumda onu da kullanın.
Kontroller arasında eşit boşluk
Arayüz öğelerini birbirinden aynı mesafede yerleştirin. Etrafa saçılmış bileşenler profesyonellikten uzak bir ürün izlenimi veriyor. Tersine, Form üzerinde arayüzü oluşturan butonların, radyo butonlarının, onay kutularının ve diğer bileşenlerin dikkatli bir şekilde yerleştirilmesi kaliteli çalışmanın bir işaretidir.
Sekme emri. "Doğru sipariş
Sekme emri bir tuşa basıldığında ekran imlecinin kontroller arasında hareket ettiği sıradır Sekme... Doğru yazılmış bir programda, imleç, kullanıcının programla çalışmasının mantığını izleyerek hareket eder. Bir program oluştururken, programcı genellikle bileşenleri değiştirir, bazılarını kaldırır ve gerektiğinde diğerlerini ekler. Sonuç olarak, bitmiş program imleç Şekil boyunca rastgele atlar. Programı tamamladıktan sonra yapılandırmayı unutmayın Sekme emri.
Yazı tipi seçimi
Yazı tiplerini rahat bırakın. Delphi'nin kendi varsayılan yazı tipleri, programınızın üzerinde çalışabileceği herhangi bir sistem için uygundur. Yalnızca önemli öğeleri vurgulamak için kalın kullanın. Aynı uygulama italik ve özellikle altını çizmek kullanıcının bir köprü için hata yapabileceği hatalı biçimdir.
renk seçimi
Arayüz öğelerinin renklerine gelince, tıpkı yazı tiplerinde olduğu gibi, bunları varsayılan olarak standart olarak bırakmak daha iyidir. Delphi, Windows sistem paletini kullanır ve kullanıcı bunu değiştirerek renkleri kolayca özelleştirebilir.
alternatif kontrol
Profesyonelce hazırlanmış bir program sadece fare ile değil klavye ile de kontrol edilebilmelidir. Yalnızca fare ile yürütülebilecek hiçbir işlev bulunmamalıdır (grafik düzenleyicilerde çizim yapmak sayılmaz!). En çok kullanılan işlevler için, hızlı erişimleri için "kısayol tuşları" sağlamalısınız.
Arayüz Tuğlaları
Kullanıcı arayüzünün belirli öğelerine gelince, programla kullanıcı etkileşiminin kalitesi şunlara bağlıdır:
  • kontrol elemanının gerçekleştirdiği göreve uygunluğu;
  • kontrol elemanının çalıştığı kurallar.
    Bu sayfada, bazı arabirim öğelerinin oluşturulmasına ilişkin kurallar tartışılmaktadır.
Ve şimdi, bir Formdaki bileşenleri yönetmek için Delphi'nin hangi araçları sunduğunu, bunların göreceli konumlarını ve bir tuşa basıldığında imlecin davranışını göstermek istiyorum. Sekme.

Bileşenleri birbirine göre doğru sırada düzenlemek için önce onları vurgulamak gerekiyor... Fareyi, seçilen bileşenleri içeren Form üzerindeki alanın etrafında sürüklemeniz yeterlidir. Ya da tutarak" Vardiya", seçilecek her bileşene aynı fare ile gelin. Seçilen bileşen üzerinde fare ile tekrar tekrar tıklama (basıldığında) Vardiya") seçimini kaldırır.

Seçilen bileşenler bir bütün olarak manipüle edilebilir - Form içinde hareket ettirilebilir, aynı özelliklere değerler atanabilir, kopyalanabilir (örneğin başka bir Form'a kurulum için), hatta silinebilir.

Şimdi bileşenlerden birine sağ tıklayın ve "açılır" menüden Konum -> Hizala ... Gruptaki bileşenlerin yatay ve dikey konumunu ayarlamanıza olanak tanıyan bir iletişim kutusu görüntülenir. Örneğin dört butonumuzu sola hizalamamız ve aralarında aynı dikey mesafe olmasına dikkat etmemiz gerektiğini varsayalım. Bunu yapmak için radyo düğmelerini seçin Yatay: Sol taraflar ve Dikey: Eşit boşluk.

Öğeyi seçerek merkez, bileşenleri, merkezleri yatay veya dikey olarak aynı çizgide olacak şekilde düzenleyeceğiz ve nokta Pencerede ortala bileşenleri yatay veya dikey olarak pencerenin merkezine taşır.

Aynı menüde, satır Sekme Ö sipariş ... bir tuşa basıldığında arayüz öğeleri üzerinde imlecin hareketini kontrol eden bir iletişim kutusunun görünümüne neden olur Sekme... Form ekranda göründüğünde, imleç doğal olarak iletişim kutusunun ilk satırında bulunan bileşenin üzerinde olacaktır. Ve sonra listede aşağı hareket edecek. İletişim kutusunda, iki mavi yukarı ve aşağı ok, seçili bileşenin konumunu kontrol eder. Gerekli bileşeni seçin, listede gerekli satıra gitmek için okları kullanın, vb.

Bir menü öğesi seçerken Kontrol -> iki öğeden oluşan bir alt menü belirir:

  • Öne getirmek
  • Geri gönder
Bunlar, programlı olarak da kullanılabilen bileşen yöntemleridir. Button1.SendToBack düğmeyi "arka plana" taşır ve Button1.Front'a Getir- öne getirmek". Yani, bir bileşen diğerinin üzerine yerleştirilmişse, bu yöntemler onları değiştirir. Bunun uygulanabileceği durumlar oldukça açıktır.

Delphi programlama ortamının en güçlü yönlerinden biri, Delphi'nin "programlama ortamını programlamanıza" izin veren bir tür metaprogramlamaya izin verdiği açık mimarisidir. Bu yaklaşım, Delphi'yi uygulama geliştirme sistemlerinde niteliksel olarak yeni bir düzeye taşır ve ek yerleştirmenize olanak tanır. aletler uygulama sistemleri oluşturmanın neredeyse tüm aşamalarını destekleyen. IDE (Entegre Geliştirme Ortamı) ve harici araçlar arasındaki bağlantı olan Delphi'de uygulanan açık arabirimler kavramı sayesinde böylesine geniş bir olasılık yelpazesi açılır.

Bu makale Delphi açık arayüzlerine odaklanır ve temsil ettikleri yeteneklere genel bir bakış sağlar. Delphi altı açık arayüz tanımlar: Araç Arayüzü, Tasarım Arayüzü, Uzman Arayüzü, Dosya Arayüzü, Düzenleme Arayüzü ve Sürüm Kontrol Arayüzü. Bu makale çerçevesinde, her birinin yeteneklerini ayrıntılı olarak aydınlatabilmemiz ve gösterebilmemiz olası değildir. Delphi kaynak kodları, geliştiriciler onlara ayrıntılı yorumlar sağladığından, incelenen sorunları daha iyi anlamanıza yardımcı olacaktır. Genel arabirimleri temsil eden sınıfların bildirimleri ... \ Delphi \ Source \ ToolsAPI dizinindeki ilgili modüllerde bulunur. Tasarım Arayüzü (DsgnIntf.pas modülü), özellik düzenleyicileri ve bileşen düzenleyicileri oluşturmak için araçlar sağlar.

Özelliklerin ve bileşenlerin editörleri ayrı bir tartışmaya değer bir konudur, bu nedenle, karşılık gelen özelliğin değerini değiştirmeye çalıştığınızda, özellik editörünün Nesne Denetçisinin davranışını kontrol ettiğini ve bileşen editörünün, siz forma yerleştirilen bileşenin görüntüsü üzerinde farenin sol tuşuna çift tıklayın. Sürüm Kontrol Arayüzü (VCSIntf.pas modülü), sürüm kontrol sistemleri oluşturmak için tasarlanmıştır. Sürüm 2.0'dan bu yana Delphi, entegre sürüm kontrol sistemi Intersolv PVCS'yi desteklemektedir, bu nedenle çoğu durumda kendi sisteminizi geliştirmenize gerek yoktur. Bu nedenle Sürüm Kontrol Arayüzünü de atlayacağız. Dosya Arayüzü (FileIntf.pas modülü), IDE'nin çalışan dosya sistemini geçersiz kılmanıza izin verir, bu da kendi dosya depolama yönteminizi seçmenizi mümkün kılar (örneğin, veritabanı sunucusundaki Not alanlarında). Düzenleme Arayüzü (EditIntf.pas modülü), kodu analiz etmenize ve oluşturmanıza, kod düzenleyici penceresinde imleç konumunu belirlemenize ve değiştirmenize ve kaynak metnin sözdizimi vurgulamasını kontrol etmenize olanak tanıyan kaynak kod arabelleğine erişim sağlar.

Özel sınıflar, forma yerleştirilen bileşenlere (bileşen tipini tanımlama, üst ve alt bileşenlere referans alma, özelliklere erişme, odağı geçirme, silme vb.), formun kendisine ve proje kaynak dosyasına arabirimler sağlar. Ayrıca Düzenleme Arayüzü, bir modülün kaynak metnini değiştirme, bir formu değiştirme, bir bileşeni yeniden adlandırma, bir modülü kaydetme, yeniden adlandırma veya silme, bir proje kaynağını değiştirme gibi olaylara tepkiyi belirleyen modüler bildirimleri tanımlamanıza olanak tanır. dosya, vb. Araç Arayüzü (ToolIntf. pas), geliştiricilere IDE durumu hakkında genel bilgi edinme ve projeleri ve bireysel dosyaları açma, kaydetme ve kapatma, modül oluşturma, mevcut proje hakkında bilgi alma gibi eylemleri gerçekleştirme araçlarını sağlar ( modül ve formların sayısı, adları vb.), kayıt dosya sistemi, bireysel modüllere arayüzlerin organizasyonu, vb. Modüler bildirimlere ek olarak Araç Arayüzü, dosya ve projelerin açılması/kapatılması, bir masaüstü proje dosyasının yüklenmesi ve kaydedilmesi, proje modüllerinin eklenmesi/hariç tutulması, paketlerin yüklenmesi/kaldırılması, bir projenin derlenmesi gibi olaylar hakkında bildirimde bulunan eklenti bildirimlerini tanımlar. ve Modüler bildirimlerden farklı olarak, eklenti bildirimleri bazı olayların yürütülmesini iptal etmenize izin verir.

Ek olarak Araç Arayüzü, Delphi IDE'nin ana menüsüne erişmenin bir yolunu sağlayarak, içine ek öğeler oluşturmanıza olanak tanır. Uzman Arabirimi (ExptIntf.pas modülü), Uzman Danışmanlar oluşturmanın temelidir - işlevselliğini genişletmek için IDE'ye gömülü yazılım modülleri. Bir uzman örneği, bir veritabanı tablosunun içeriğini görüntülemek ve değiştirmek için bir form oluşturan Delphi Veritabanı Form Sihirbazı'dır. Uzman sınıfını tanımladıktan sonra, Delphi'nin uzmanımız hakkında “bildiğinden” emin olmanız gerekir. Bunu yapmak için, RegisterLibraryExpert prosedürü çağrılarak, uzman sınıfının bir örneğini parametre olarak geçirerek kaydedilmelidir. Örnek olarak, ilgili Delphi menü öğesi seçildiğinde, çalıştığını bildiren bir mesaj görüntüleyen basit bir esStandard stili Uzman Danışman oluşturalım. Yukarıdaki tablodan da görebileceğiniz gibi, esStandard stilinin geçersiz kılınması için altı yöntemin kullanılması gerekir:

Uzmanın "harekete geçirilmesi" için, Bileşen / Bileşen Yükle ... menü öğesini seçin, Gözat iletişim kutusunda uzmanı içeren modülü seçin (bizim durumumuzda, exmpl_01.pas), Tamam'ı tıklayın ve sonra dclusr30.dpk paketini Delphi ana menüsünde derlerken, Yardım bölümünde Basit Uzman 1 maddesi görünmelidir, seçildiğinde “Standart Uzman başladı!” bilgi mesajı görünür. Delphi'nin neden uzman menü öğesini Yardım bölümüne koyduğu bir sır olarak kalıyor. Menü öğesinin istediğiniz yerde değil de Delphi'nin herhangi bir yerinde görünmesinden hoşlanmıyorsanız, aşağıdaki seçenek mümkündür: menü öğesinin otomatik olarak oluşturulmasını hariç tutan eklenti tarzında bir uzman oluşturun ve Araç Arayüzünü kullanarak "manuel" menü öğesi. Bu, ana menüdeki yeni öğenin konumunu herhangi bir şekilde ayarlamanıza olanak tanır.

Bir menü öğesi eklemek için, Araç Arabiriminin temeli olan TIToolServices sınıfı ve IDE'nin ana menüsüne ve öğelerine arabirimler uygulayan TIMainMenuIntf, TIMenuItemIntf sınıfları kullanılır. TIToolServices sınıfı ToolServices, başlatıldığında IDE'nin kendisi tarafından başlatılır. Arayüzlerin Delphi ana menüsüne ve öğelerine bırakılmasından yalnızca geliştiricinin sorumlu olduğunu unutmayın. Bu arada, uzmanın işlevsel yükünü biraz karmaşıklaştıralım: menü öğesi etkinleştirildiğinde, ortamda açık olan projenin adı hakkında bilgi görüntüler: Bu örnekte, merkezi yer AddIDEMenuItem işlevi tarafından işgal edilmiştir. Delphi IDE'nin ana menüsüne bir menü öğesi ekleyen . Parametre olarak, yeni menü öğesinin metnini, tanımlayıcısını, önüne yeni öğenin eklendiği öğenin tanımlayıcısını, anahtarın sembolik temsilini alır. Ctrl tuşu ile için kullanılabilir hızlı erişim yeni öğeye ve yeni bir öğenin seçimine karşılık gelen bir olay işleyicisine. Saatler öğesinden önce Görünüm bölümüne yeni bir menü öğesi ekledik.

Şimdi notifier'ları tanıyalım. Projelerin kapanış / açılış anlarını izleyen ve buna göre aktif projenin adını saklayan alanı ayarlayan bir eklenti bildirimi tanımlayalım (önceki örneğe kıyasla değişiklik geçirmemiş yöntemlerin uygulanmasını atlayacağız): notifier'ı uyguladığımızda, alt TIaddInNotifier olan TAddInNotifier sınıfını tanımladık ve FileNotification ile örtüştük. IDE, eklenti bildiricisinin yanıt verebildiği bir olay meydana geldiği her seferinde bu yöntemi çağırır (bu tür her olay, TFileNotification türünde karşılık gelen bir sabitle gösterilir). TAddInNotifier sınıfındaki Expert alanı, geri bildirim bir uzmanla (yöntem TAddInNotifier.FileNotification). Bilirkişinin yıkıcısında, bildiricinin kaydı kaldırılır ve bildirici imha edilir. Şimdi modüler bildirimlerin kullanımını gösterelim. Proje dosyasını kaydetmenin her eylemi hakkında mesajlar yayınlayan bir eklenti uzmanı oluşturalım (bize zaten aşina olduğumuz yöntemlerin uygulamasını kısaca sunmayacağız): Bu örnekte, eklenti uzmanı, aşağıdakilere karşılık gelen olayları izler. projelerin açılması/kapanması.

Her proje açıldığında, proje dosyasına karşılık gelen modüler bir bildirim kaydedilir. Uygulama açısından, modüler bildirimler eklenti bildirimlerine benzer: TIModuleNotifier'ın soyundan gelen bir TModuleNotifier sınıfı tanımlarız ve Notify ve ComponentRenamed yöntemlerini geçersiz kılarız. IDE, bu modülle ilgili belirli olaylar ortaya çıktığında Notify yöntemini çağırır; bu yöntem içinde şu veya bu olaya verilen tepki tanımlanır. Modül formundaki bir bileşenin adı değiştiğinde ComponentRenamed yöntemi çağrılır. Lütfen bu yöntemi kullanmadığımızı, ancak geçersiz kılmamız gerektiğini unutmayın, aksi takdirde bileşenin adı değiştiğinde, temel sınıfın soyut yöntemi çağrılacak ve bu da öngörülemeyen sonuçlara yol açacaktır.

Modüler bir bildirimi kaydetmek, bir eklenti bildirimini kaydetmekten biraz daha karmaşıktır: önce modül arayüzünü (TIModuleInterface) alırız ve sonra modül arayüzünü kullanarak bildirimi kaydederiz. Proje kapatıldığında, modüler bildiricinin kaydı kaydedilmez (yine TIModuleInterface kullanılarak) ve bildirim imha edilir. Son olarak, kod düzenleyici penceresinde imlecin konumunu nasıl belirleyebileceğinizi göstereceğiz. Uygun menü öğesini seçtikten sonra, etkin dosyanın adını ve imlecin içindeki konumunu içeren bir mesaj görüntüleyecek bir Uzman Danışman oluşturalım (yalnızca aşağıdakiler için gerekli olanların uygulanması). bu örnek yöntemler): İmlecin konumunu belirlemek için aşağıdaki arayüz dizisini almalıyız: modüler arayüz (TIModuleInterface); kod düzenleyici arayüzü (TIEditorInterface); düzenleyici penceresindeki modül görünümünün arayüzü (TIEditView).

Uzman menü öğesi seçildiğinde kaynak metin (* .pas) içeren dosya etkinse, etkin dosyanın adını ve imlecin içindeki mevcut konumunu içeren bir mesaj görüntülenir. Pas olmayan bir dosya etkinse, mesaj görüntülenmez. Etkin dosyanın adını almak için TIToolServices sınıfının GetCurrentFile yöntemi kullanılır. Bu, açık arayüzleri kullanma yollarının gözden geçirilmesini tamamlar. CD-ROM, sağlanan tüm örneklerin kaynak kodunu içerir. CD-ROM ayrıca, kullanıcının Delphi modüllerinin kaynak kodunu işaretlemesine izin veren bir eklenti uzmanı içeren daha karmaşık ve ayrıntılı bir örnek içerir. Bookmark Expert'i kurmak ve kullanmak için hızlı bir kılavuz bkmrks97.htm dosyasında bulunur. Bu nedenle, bu makale açık arayüzleri özetlemekte ve kullanımlarına ilişkin örnekler sunmaktadır. Bir kez daha tekrarlayacağız: Açık arayüzlerin kaynak kodunun mevcudiyeti sayesinde, ilginizi çeken detayları kolayca öğrenebilirsiniz. Açık arayüzlerin sağladığı çeşitli olasılıkların size birden fazla cesur ve kullanışlı fikir vereceğini umuyoruz.

C ++ kodundan Delphi sınıfını kullanırken bir sorunum var. bir nesne döndüren bir işlevi dışa aktaran delphi dll demosu.
Delphi Dll kodum şöyle görünüyor:

Kütüphane DelphiTest; // parçayı kullanır .... type IMyObject = arayüz prosedürü DoThis (n: Tamsayı); işlev DoThat: PWideChar; son; TMyObject = sınıf (TInterfacedObject, IMyObject) prosedürü DoThis (n: Tamsayı); işlev DoThat: PChar; son; // TMyObject uygulaması buraya gidin ... prosedür TMyObject.DoThis (n: Integer); start showmessage ("DoThis yöntemini" + intToStr (n) + "parametre" ile çağırıyorsunuz); son; işlev TMyObject.DoThat: PChar; showmessage ("DoThat işlevini çağırıyorsunuz"); Sonuç: = Pchar ("Merhaba im Dothat"); son;

// DLL işlevini dışa aktar:

İşlev CreateMyObject: IMyObject; stdcall; dışa aktarma; var txt: TextFile; AssignFile'ı başlatın (txt, "C: \ log.log"); Sıfırla (txt); Writeln (txt, "merhaba"); Sonuç: = TMyObject.Create; son; CreateMyObject dışa aktarır;

C++ projemde IMyObject arayüzünü şu şekilde ilan ettim:

Sınıf IMyObject (genel: IMyObject (); sanal ~ IMyObject (); sanal geçersiz DoThis (int n) = 0; sanal karakter * DoThat () = 0;);

ve ana işlevim şöyle:

Typedef IMyObject * (__stdcall * CreateFn) (); int main () (HMODULE hLib; hLib = LoadLibrary (L "DelphiTest.dll"); assert (hLib! = NULL); // pass !! CreateFn pfnCreate; pfnCreate = (CreateFn) GetProcAddress ((HINSTANCE) hLib, "CreateMyObject "); if (pfnCreate == NULL) (DWORD errc = GetLastError (); printf ("% u \ n ", errc); // 127 hatası alır else (printf ("başarılı yükleme \ n ");) IMyObject * objptr = pfnCreate (); objptr-> DoThis (5); FreeLibrary (hLib); int in; scanf_s ("% i", & in); 0 döndür;)

bu örnekte, dışa aktarılan işleve erişmeye çalıştığımda bir çalışma zamanı hatası aldım. satırdaki hatalar:
IMyObject * objptr = pfnCreate();

Örneğimde neyin yanlış olduğunu söyleyebilir misiniz?
ve mümkünse C++ kodundan bir Delphi sınıfına (DLL'de) erişmek için çalışan herhangi bir örnek.

Çözüm

İlk sorun, yöntemlerin konvansiyonunu çağırmaktır. Delphi arabirimi, Delphi'ye özgü bir çağrı kuralı olan kaydı kullanır. stdcall kullanma Örneğin, arayüz yöntemleri için.

Bir sonraki sorun C++'da. C++ arayüzünüz IUnknown'dan türetilmelidir.Ayrıca bir kurucu veya yıkıcı bildirmemelidir.

Bunun dışında Delphi kodunuz char * ile eşleşmeyen PWideChar tarafından dışa aktarılır, wchar_t * ile eşlenir.

Daha ileriye bakıldığında, PChar'ı döndürmek burada harika çalışıyor çünkü uygulamanız değişmez bir değer döndürüyor. Ancak daha ciddi kod muhtemelen dinamik olarak ayrılmış bir dize kullanmak isteyecektir, bu noktada tasarımınız kusurludur.

Kökte bir dosya oluşturmak için unutmayın sistem diski yükseltilmiş bir yönetici olmalısınız. Yani bu başka bir potansiyel başarısızlık noktasıdır.

Başka hatalar olduğunu umuyorum, ancak şu ana kadar bulduğum tek şey bu.

Makale, grubumuzun genç geliştiricileri tarafından yazılan programların analiz sonuçlarına dayanarak yazılmıştır.

Anahtarlama bileşenlerinin sırasını doğru şekilde düzenleyin

Birçok kullanıcı, özellikle daha önce DOS'ta çalışmış olanlar, giriş alanları arasında fare ile değil, klavye yardımıyla geçiş yapma alışkanlığına sahiptir. Sekme tuşu ile... Ayrıca, her alanı fare ile seçmekten çok daha hızlıdır. Bu nedenle, anahtarlama bileşenlerinin sırası doğru ayarlanmalıdır. Bu, hem tüm kap bileşenlerinin (paneller, Grup Kutuları ve benzerleri) içindeki bileşenler için hem de formda birkaç tane varsa kap bileşenlerinin kendileri için geçerlidir.

Kapsayıcı içindeki bileşenleri değiştirme sırası TabOrder özelliği tarafından belirlenir. İlki, TabOrder'ın 0, ikincisi 1 ile vb., tüm bileşenler numaralandırılıncaya kadar aktif bileşen olur. Ayrıca bileşen, Tab tuşuyla değiştirildiğinde bileşenin odak alıp almayacağını gösteren bir TabStop özelliğine sahiptir. Herhangi bir bileşene geçişi yasaklamanız gerekiyorsa, TabStop = false olarak ayarlayın. Bu durumda, yalnızca fareyi kullanarak bu bileşene geçebilirsiniz.

Bir programda belirli bir anahtarı değiştirmeye alışmış olan kullanıcıların, alışkanlıktan dolayı, geri kalanında kullanmaya devam ettiği zamanlar vardır. Bu genellikle, giriş alanlarında gezinmek için Enter tuşunun kullanılabileceği 1C kullanıcıları ile olur. Peki, isterlerse programlarımızda onlara bu fırsatı verelim. Formun KeyPreview özelliğini true olarak ayarlayın ve OnKeyPress olayı için bir olay işleyicisi yazın:

Prosedür TForm1.FormKeyPress (Gönderen: TObject; var Anahtar: Karakter);
başlamak
ord (anahtar) = vk_Return ise
Form1.SelectNext (PriemForm.ActiveControl, true, true);
son;

Böyle bir işleyici, Enter tuşuna basıldığında form öğeleri arasında gezinme sağlar. Bu yöntemin düğmelerle çalışmayacağını belirtmek gerekir, çünkü bir düğme üzerinde Enter'a basmak, basılmasına neden olurken, Sekme'ye basmak, giriş odağını geçiş sırasındaki bir sonraki bileşene aktarır.

Varsayılan düğmeler

Aynı kullanıcılar, uygulama iletişim kutularında, kural olarak, seçiminizi Enter tuşuyla onaylayabileceğiniz ve Esc tuşuyla iptal edebileceğiniz gerçeğine hızla alışır. Özellikle bunu yapmak çok kolay olduğu için programlarımızda onları hayal kırıklığına uğratmayalım. Enter'a yanıt veren bir düğme için Default özelliğini true olarak ayarlayın. Esc'ye yanıt veren bir düğme için Cancel özelliğini true olarak ayarlayın. Ve hepsi bu.

Evet veya Hayır

Kullanıcı eylemleri talep eden tüm iletişim kutularında en az iki düğme bulunmalıdır: eylemi onaylayın ve eylemi iptal edin (Evet / Hayır, Kaydet / İptal vb.). Pencere başlığındaki [X] düğmesi ile pencere kapatılarak bir işlem iptal edilebilir. Eylemi onaylamak için tek bir düğme varsa ve reddetmek için başlıktaki [X] düğmesiyle pencereyi kapatması gerekiyorsa veya hiç reddetme olasılığı yoksa kabul edilemez. Bu, kullanıcının kafasını karıştırır ve mantıklı bir soru ortaya çıkarır: nasıl reddedilir?

Ayrıca, yukarıda "Varsayılan düğmeler" bölümünde söylenenleri de unutmayın.

Tüm iletişim kutuları ekranın ortasında açılmalıdır

Tasarım modunda oluşturuldukları yerde değil, ortalanır. Birincisi, daha nettir ve ikincisi, farklı kullanıcılar için farklı ekran çözünürlükleri sorununu otomatik olarak ortadan kaldırır.

İletişim kutusu kalıcı değilse bir istisna yapılır ve kullanıcının çalışmasının bir sonucu olarak, ana penceredeki değişiklikler hemen bu pencerede gerçekleşir (örneğin, veri kümesini filtrelemek, grafikleri yeniden çizmek vb.).

Windows ekrandan daha büyük olmamalıdır

Hiçbir koşulda. Pencerenin bir kısmının ekrandan dışarı çıkması bir rezalettir. Bu gereklilik kullanıcının ekran çözünürlüğüne bağlı değildir, yani. "Daha fazla izin alsınlar" gibi bahaneler işe yaramaz.

Pencere öğelerinin doğru yeniden boyutlandırılması

Pencere yeniden boyutlandırıldığında, pencere büyütüldüğünde ve büyütüldükten sonra pencere geri yüklendiğinde, pencere öğeleri yeniden boyutlandırılmalı veya doğru şekilde hareket etmelidir.

Her şey her zaman görünür

Pencerenin boyutunu küçültmek, pencere öğelerinin kaybolmasına yol açmamalı ve tercihen pencerenin kendi kaydırma çubuklarının (kaydırma çubuklarının) görünmesine yol açmamalıdır. Tüm öğelerin görünür ve erişilebilir olması için pencerenin minimum boyutunu sınırlayabilirsiniz. Bileşenleri, tümü pencerede görünecek şekilde yerleştirmek mümkün değilse, bileşenleri gruplara ayırmak için sekmeleri (PageControl gibi) kullanabilirsiniz. Ayrıca ekran çözünürlüğü ile ilgili bahaneleri de kaçırmıyoruz.

Her yerde ipuçları, her zaman ipuçları

Özellikle araç çubuklarındaki (Araç Çubuğu gibi) düğmeler için, bu veya bu düğmenin neden gerekli olduğu her zaman açık olacak şekilde ipuçları ayarlanmalıdır.

renk tayfı

Formdaki bileşenleri gökkuşağının tüm renklerine boyamayın. Bu, gözleri yorar ve kullanıcının dikkatini dağıtır. Havalı görünmüyor. Vurgulama, kullanıcının dikkatini belirli bir öğeye veya pencerenin belirli bir bölümüne çekmek gerektiğinde kullanılır. Örneğin, hatalar içeren açık kırmızı renkli kayıtlar veya tersine başarıyla kontrol edilen kayıtlar için açık yeşil renk.

Çözüm

Genel olarak programın ve özel olarak arayüzün eksikliklerini bulmanızı sağlayan çok iyi bir yöntem var. Çok basit: Kendinizi kullanıcının yerinde hayal edin ve yarım saat boyunca olduğu gibi çalışmayı deneyin. Kullanıcınızın yakınınızda olması (örneğin, aynı kuruluşta çalışıyorsa) daha da iyidir. Bu durumda yanına, daha doğrusu onun yerine oturun ve işini yapmaya çalışın. Verileri girin, değiştirin, raporları görüntüleyin, vb. Nasıl doğru yapacağınızı bilmiyorsanız, kullanıcınıza sorun. Hata ayıklama modunda olduğu gibi aynı türden bir veya iki işlem yapmayın, ancak 20-30 veya daha fazla çeşitli operasyonlar, farklı bir sırayla. Bir şey girmeyi unutun veya yanlış girin ve programın buna nasıl tepki verdiğini görün. Programınızın zayıf yönlerini hızla göreceksiniz.

Makalenin yazarı, üniversitedeki kabul ofisinin çalışmalarını otomatikleştirdi ve programın tanıtımının ilk yılında, kabul ofisinde günde 3-4 saat geçirdi, başvuru sahiplerini kaydettirdi, kişisel verilerini doldurdu ve onlara sınav raporlarını vermek. Kalan çalışma saatlerinde de hataları ve eksiklikleri düzeltti. İnanın bana, gelecek yıl neredeyse hiç sorun kalmadı. Personel modülünün tanıtımı ile aynıydı.

Bu nedenle, kullanıcı deneyimini aklınızda bulundurun. Programlarınızla çalışmalarını onlar için kolay ve keyifli hale getirin.