نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

چکیده: استفاده از رابط های باز محیط برنامه نویسی دلفی. توصیه هایی برای ایجاد رابط کاربری در توضیحات رابط دلفی دلفی

من با استفاده از کلاس دلفی از کد ++C مشکل دارم. نسخه ی نمایشی delphi dll، که تابعی را صادر می کند که یک شی را برمی گرداند.
کد دلفی Dll من به شکل زیر است:

کتابخانه دلفی تست; // از قسمت استفاده می کند.... نوع IMyObject = رویه رابط DoThis(n: Integer); تابع DoThat: PWideChar; پایان؛ رویه TMyObject = class(TInterfacedObject,IMyObject) DoThis(n: Integer); تابع DoThat: PChar; پایان؛ // اجرای TMyObject به اینجا بروید ... رویه TMyObject.DoThis(n: Integer); start showmessage("شما در حال فراخوانی متد DoThis با "+intToStr(n) +"پارامتر هستید"); پایان؛ تابع TMyObject.DoThat: PChar; start showmessage ("شما در حال فراخوانی تابع DoThat هستید"); نتیجه:= Pchar("Hello im Dothat"); پایان؛

// صادرات تابع DLL:

تابع CreateMyObject: IMyObject; stdcall;export; var txt: TextFile; شروع AssignFile (txt"C:\log.log")؛ بازنشانی (txt)؛ Writeln(txt"Hello"); نتیجه:= TMyObject.Create; پایان؛ صادرات CreateMyObject;

در پروژه ++C خود، رابط IMyObject را به این صورت اعلام کردم:

کلاس IMyObject ( public: IMyObject(); virtual ~IMyObject(); virtual void DoThis(int n) = 0; virtual char* DoThat() = 0; );

و عملکرد اصلی من به این صورت است:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() (HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll")؛ assert(hLib != NULL); // pass !! CreateFn pfnCreate؛ pfnCreate = (CreateFn)GetProcAddress((HINSTANATE,Object) ")؛ if (pfnCreate == NULL) (DWORD erc = GetLastError(); printf("%u\n", erc); // خطای 127 دریافت می کند) else( printf("بارگیری موفقیت آمیز\n")؛ ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5)؛ FreeLibrary(hLib); int in; scanf_s ("%i"، &in); بازگشت 0; )

در این مثال هنگام تلاش برای دسترسی به تابع صادراتی با خطای زمان اجرا مواجه شدم. خطاهای خط:
IMyObject* objptr = pfnCreate();

میشه بگید چه اشکالی با مثال من داره
و در صورت امکان، هر نمونه کاری برای دسترسی به کلاس دلفی (در یک DLL) از کد ++C.

راه حل

اولین مشکل فراخوانی قرارداد متد است. رابط دلفی از ثبات استفاده می کند که یک قرارداد فراخوانی خاص دلفی است. استفاده از stdcall به عنوان مثال، برای روش های رابط.

مشکل بعدی در C++ است. رابط C++ شما باید از IUnknown مشتق شده باشد، علاوه بر این، نباید سازنده یا تخریب کننده را اعلام کند.

به غیر از این، کد دلفی شما توسط PWideChar صادر می شود که به char * نگاشت نمی شود، به wchar_t* نگاشت می شود.

با نگاهی بیشتر، برگرداندن PChar در اینجا به خوبی کار می کند زیرا پیاده سازی شما یک کلمه واقعی را برمی گرداند. اما کد جدی‌تر احتمالاً می‌خواهد از یک رشته تخصیصی پویا استفاده کند، در این مرحله طراحی شما ناقص است.

لطفاً توجه داشته باشید که برای ایجاد یک فایل در ریشه درایو سیستم، باید یک مدیر ارشد باشید. بنابراین این یکی دیگر از نقاط بالقوه شکست است.

من انتظار دارم باگ های دیگری نیز وجود داشته باشد، اما این تنها چیزی است که تا به حال پیدا کرده ام.

مقاله بر اساس نتایج تجزیه و تحلیل برنامه های نوشته شده توسط توسعه دهندگان جوان گروه ما نوشته شده است.

دنباله تعویض اجزا را به درستی مرتب می کنیم

بسیاری از کاربران، به ویژه آنهایی که قبلاً در DOS کار می کردند، عادت دارند بین فیلدهای ورودی سوئیچ شوند نه با ماوس، بلکه با استفاده از صفحه کلید با کلید Tab. به علاوه، این بسیار سریعتر از انتخاب هر فیلد با ماوس است. بنابراین، ترتیب سوئیچینگ اجزا باید به درستی تنظیم شود. این هم برای اجزای داخل همه اجزای کانتینر (پانل ها، جعبه های گروه و موارد مشابه)، و هم برای خود اجزای ظرف، در صورتی که چندین مورد از آنها در فرم وجود داشته باشد، صدق می کند.

ترتیب سوئیچینگ اجزا در داخل کانتینر توسط ویژگی TabOrder مشخص می شود. اولین مؤلفه ای که فعال می شود مولفه ای است که TabOrder برابر با 0 دارد، دومی با 1 و غیره تا زمانی که همه مؤلفه ها شمارش شوند. علاوه بر این، کامپوننت دارای ویژگی TabStop است که نشان می‌دهد وقتی با کلید Tab جابجا می‌شوید آیا کامپوننت فوکوس دریافت می‌کند یا خیر. اگر نیاز به ممنوعیت تعویض به هر جزء دارید، TabStop آن را = false تنظیم کنید. در این حالت فقط با استفاده از ماوس می توانید به این کامپوننت سوئیچ کنید.

مواردی وجود دارد که کاربرانی که عادت به جابجایی با کلید خاصی در یک برنامه دارند، از روی عادت، به استفاده از آن در برنامه های دیگر ادامه می دهند. این اغلب برای کاربران 1C اتفاق می افتد، جایی که از کلید Enter می توان برای پیمایش در فیلدهای ورودی استفاده کرد. خوب اگر بخواهند در برنامه هایمان چنین فرصتی را به آنها می دهیم. ویژگی KeyPreview فرم را روی true تنظیم کنید و یک کنترل کننده رویداد OnKeyPress بنویسید:

روش TForm1.FormKeyPress(فرستنده: TObject; var Key: Char);
شروع
if ord(key)=vk_Return سپس
Form1.SelectNext(PriemForm.ActiveControl، true، true);
پایان؛

این کنترلر هنگام فشردن کلید Enter، مسیریابی را از طریق عناصر فرم فراهم می کند. لازم به ذکر است که این روش با دکمه ها جواب نمی دهد، زیرا... فشار دادن Enter بر روی یک دکمه باعث کلیک روی آن می شود، در حالی که با فشار دادن Tab، فوکوس ورودی را به مؤلفه بعدی در دنباله تغییر می دهد.

دکمه های پیش فرض

همه همان کاربران به سرعت به این واقعیت عادت می کنند که در جعبه های گفتگوی برنامه، به عنوان یک قاعده، می توانید انتخاب خود را با کلید Enter تأیید کنید و با کلید Esc لغو کنید. بیایید آنها را در برنامه های خود ناامید نکنیم، به خصوص که انجام آن بسیار آسان است. برای دکمه ای که به Enter پاسخ می دهد، ویژگی Default را روی true تنظیم کنید. برای دکمه ای که به Esc پاسخ می دهد، ویژگی Cancel را روی true تنظیم کنید. همین.

آره یا نه

تمام کادرهای محاوره‌ای که اعمال کاربر را درخواست می‌کنند باید حداقل دو دکمه داشته باشند: تأیید عملکرد و رد کردن عمل (بله/خیر، ذخیره/لغو و غیره). این عمل را می توان با بستن پنجره با دکمه [X] در عنوان پنجره لغو کرد. اگر فقط یک دکمه برای تایید عمل وجود داشته باشد، غیرقابل قبول است و برای رد کردن، قرار است پنجره با دکمه [X] در عنوان بسته شود یا اصلاً امکان رد وجود ندارد. این باعث سردرگمی کاربر می شود و یک سوال منطقی ایجاد می کند: چگونه امتناع کنیم؟

همچنین، آنچه در بالا در پاراگراف "دکمه های پیش فرض" گفته شد را فراموش نکنید.

تمام کادرهای محاوره ای باید در مرکز صفحه باز شوند

در مرکز، نه در جایی که در حالت طراحی ایجاد شده اند. اولاً بصری تر است و ثانیاً به طور خودکار مشکل رزولوشن های مختلف صفحه نمایش را برای کاربران مختلف برطرف می کند.

اگر کادر محاوره ای حالت مودال نباشد و در نتیجه کار کاربر در این پنجره، بلافاصله تغییرات در پنجره اصلی (مثلا فیلتر کردن مجموعه داده ها، ترسیم مجدد نمودارها و غیره) ایجاد شود، یک استثنا ایجاد می شود.

اندازه پنجره ها نباید بیشتر از اندازه صفحه نمایش باشد

در هیچ موردی. وقتی بخشی از پنجره فراتر از صفحه نمایش باشد، مایه شرمساری است. این نیاز به وضوح صفحه نمایش کاربر بستگی ندارد، یعنی. بهانه هایی مانند "اجازه دهید وضوح بالاتری تعیین کنند" کار نمی کند.

تغییر اندازه صحیح عناصر پنجره

هنگامی که اندازه پنجره تغییر می کند، زمانی که پنجره به حداکثر می رسد، و زمانی که پنجره پس از حداکثر سازی بازیابی می شود، عناصر پنجره باید تغییر اندازه داده یا به درستی حرکت کنند.

همه چیز همیشه قابل مشاهده است

کاهش اندازه پنجره نباید منجر به ناپدید شدن عناصر پنجره شود و ترجیحاً نباید منجر به ظاهر شدن نوارهای اسکرول (پیمایان) خود پنجره شود. می توانید حداقل اندازه های پنجره را محدود کنید تا همه عناصر قابل مشاهده و در دسترس باشند. اگر امکان قرار دادن مؤلفه ها به گونه ای وجود ندارد که همه آنها در پنجره قابل مشاهده باشند، می توانید از نشانک ها (مانند PageControl) برای تقسیم اجزا به گروه ها استفاده کنید. ما همچنین بهانه‌های مربوط به وضوح صفحه را نادیده نمی‌گیریم.

نکات همه جا، نکات همیشه

برای دکمه ها، به ویژه در نوار ابزار (مانند نوار ابزار)، نکات باید مشخص شود تا همیشه مشخص شود که چرا این یا آن دکمه نیاز است.

طیف رنگ

شما نباید اجزای روی فرم را به تمام رنگ های رنگین کمان رنگ کنید. این کار چشم ها را خسته می کند و توجه کاربر را منحرف می کند. به نظر "باحال" نیست. برجسته سازی زمانی استفاده می شود که لازم باشد توجه کاربر به یک عنصر خاص یا قسمت خاصی از پنجره جلب شود. به عنوان مثال، رکوردهای رنگی که حاوی خطاهایی با رنگ قرمز روشن هستند یا برعکس، رکوردهایی را که با رنگ سبز روشن با موفقیت بررسی شده اند، ثبت می کنند.

نتیجه

روش بسیار خوبی وجود دارد که به شما امکان می دهد نقص های برنامه را به طور کلی و رابط کاربری را به طور خاص پیدا کنید. ساده است: خود را به جای کاربر تصور کنید و به مدت نیم ساعت سعی کنید همانطور که او کار می کند کار کنید. اگر کاربر شما در محدوده باشد (مثلاً در همان سازمان کار می کند) حتی بهتر است. در این صورت به جای او در کنار او یا بهتر است بگویم بنشینید و سعی کنید کار او را انجام دهید. داده ها را وارد کنید، آن ها را تغییر دهید، گزارش ها را نمایش دهید و غیره. اگر نمی دانید چگونه این کار را به درستی انجام دهید، از کاربر خود بپرسید. فقط یک یا دو عملیات از یک نوع را مانند حالت اشکال زدایی انجام ندهید، بلکه 20-30 یا حتی بیشتر از عملیات متفاوت را با ترتیب های مختلف انجام دهید. فراموش کنید چیزی را وارد کنید یا آن را اشتباه وارد کنید و ببینید برنامه چه واکنشی به آن نشان می دهد. به سرعت نقاط ضعف برنامه خود را خواهید دید.

نویسنده مقاله کار کمیته پذیرش در دانشگاه را خودکار کرد و در سال اول معرفی برنامه روزانه 3 تا 4 ساعت در کمیته پذیرش، ثبت نام متقاضیان، تکمیل اطلاعات شخصی و صدور آنها را سپری کرد. گزارش در مورد قبولی در امتحانات و در ساعات کار باقیمانده خطاها و کاستی ها را اصلاح کرد. باور کنید سال آینده عملاً هیچ مشکلی باقی نخواهد ماند. در هنگام معرفی ماژول پرسنل نیز همین اتفاق افتاد.

بنابراین، تجربه کاربری را در ذهن داشته باشید. کار کردن با برنامه های خود را برای آنها آسان و دلپذیر کنید.

برنامه نویسی شی گرا (OOP)، علاوه بر مفهوم کلاس، مفهوم اساسی یک رابط را نیز ارائه می دهد.

رابط چیست و کار با آن در زبان برنامه نویسی دلفی چه ویژگی هایی دارد؟

رابط یک ساختار معنایی و نحوی در کد برنامه است که برای مشخص کردن خدمات ارائه شده توسط یک کلاس یا مؤلفه (ویکی‌پدیا) استفاده می‌شود.

اساساً، یک واسط فهرستی از ویژگی ها و متدهایی را تعریف می کند که باید هنگام کار با کلاسی که این رابط پیاده سازی می کند، و همچنین امضای آنها (نام، نوع داده، پارامترهای پذیرفته شده (برای رویه ها و توابع)، و غیره) استفاده شود. بنابراین، کلاسی که یک رابط خاص را پیاده سازی می کند، باید تمام اجزای آن را پیاده سازی کند. علاوه بر این، مطابق با نحوه توصیف آنها در آن.

رابط ها اغلب با کلاس های انتزاعی مقایسه می شوند، اما با وجود تمام شباهت ها، این مقایسه کاملاً صحیح نیست. حداقل، کلاس های انتزاعی به شما این امکان را می دهند که دید اعضا را کنترل کنید. در عین حال، دامنه برای رابط ها تعریف نشده است.

رابط‌ها به شما امکان می‌دهند معماری را انعطاف‌پذیرتر کنید، زیرا دسترسی به این یا آن عملکرد را یکپارچه می‌کنند و همچنین به شما امکان می‌دهند از تعدادی از مشکلات مرتبط با وراثت کلاس جلوگیری کنید (اینترفیس‌ها همچنین می‌توانند از یکدیگر به ارث برده شوند).

برای اعلام یک رابط در دلفی، از کلمه کلیدی رابط استفاده کنید. این همان کلمه کلیدی است که بخشی از ماژول را تعریف می کند که می توان از خارج به آن دسترسی داشت (بین کلمات کلیدی رابط و پیاده سازی). با این حال، هنگام اعلان یک رابط، از نحو متفاوتی استفاده می شود، شبیه به اعلان کلاس ها.

دلفی/پاسکال

IMyNewInterface = رویه رابط InterfaceProc. پایان؛

IMyNewInterface =رابط

رویه InterfaceProc ;

پایان ؛

بنابراین، خود نحو اعلان رابط اساساً با سایر زبان های برنامه نویسی متفاوت نیست (ویژگی های نحو مبتنی بر پاسکال به حساب نمی آیند). در عین حال، پیاده سازی رابط ها دارای تعدادی ویژگی مشخصه است.

واقعیت این است که رابط های دلفی در ابتدا برای پشتیبانی از فناوری COM معرفی شدند. بنابراین، رابط IInterface، که در دلفی جد تمام رابط‌های دیگر (نوعی آنالوگ TObject) است، از قبل شامل سه روش اساسی برای کار با این فناوری است: QueryInterface، _AddRef، _Release. در نتیجه، اگر کلاسی هر رابطی را پیاده‌سازی کند، باید این متدها را نیز پیاده‌سازی کند. حتی اگر این کلاس برای کار COM در نظر گرفته نشده باشد.

با توجه به این ویژگی رابط IInterface، در دلفی استفاده از اینترفیس ها، در بیشتر موارد، منجر به اضافه شدن قابلیت های آشکارا استفاده نشده به کلاس می شود.

یک کلاس کتابخانه ای TInterfaceObject وجود دارد که قبلاً شامل اجرای این متدها است و در هنگام ارث بردن از آن، نیازی به پیاده سازی آنها توسط خودتان نیست. اما از آنجایی که دلفی از وراثت چند کلاسه پشتیبانی نمی کند، استفاده از آن اغلب تنها باعث ایجاد مشکلات اضافی در طراحی و اجرای عملکردهای مورد نیاز از قبل می شود.

همه اینها به این واقعیت منجر شد که با وجود همه امکانات ارائه شده توسط رابط ها، استفاده عملی آنها در دلفی تقریباً فراتر از کار با COM نبود.

بهینه‌سازی شده برای کار عمدتاً با این فناوری، رابط‌ها، یا بهتر است بگوییم عملکرد و محدودیت‌های معماری که لزوماً اضافه می‌کنند، خود را در حل مشکلات دیگر توجیه نمی‌کنند.

بنابراین، بسیاری از برنامه نویسان دلفی هنوز در واقع از ابزاری قدرتمند و انعطاف پذیر برای توسعه معماری اپلیکیشن محروم هستند.

فقط برای نتیجه

رعایت دقیق مهلت ها

شفافیت

اجرای پروژه

پشتیبانی فنی به عنوان هدیه

برنامه نویسی، اصلاحات، مشاوره در 1C

چگونه کار می کنیم

1. مشکل را تلفنی در میان می گذاریم. اگر دسترسی از راه دور دارید، آن را روی صفحه رایانه خود نمایش دهید.

2. اگر پروژه بزرگ باشد، کار را به روبل تخمین می زنیم، اگر نه، تعداد تقریبی ساعت.

3. ما کار را انجام می دهیم.

4. شما کار را در برنامه خود می پذیرید، اگر کاستی وجود داشته باشد اصلاح می کنیم.

5. ما یک فاکتور صادر می کنیم، شما پرداخت کنید.

هزینه کار

1. همه کارها به 3 دسته تقسیم می شوند: مشاوره، به روز رسانی یک پیکربندی استاندارد، توسعه یا برنامه نویسی یک گزارش جدید، پردازش، دکمه ها و غیره.

3. برای کارهای بیشتر از 10 ساعت باید مشخصات فنی با شرح و هزینه کار از قبل تهیه شود. کار پس از توافق با مشخصات فنی شروع می شود.

پشتیبانی فنی

1. اگر در مدت 3 ماه در کارهایی که قبلاً پذیرفته شده‌اند، خطایی پیدا کردید، ما آنها را رایگان تصحیح می‌کنیم.

2. برای مشتریان دائمی، هر گونه کاستی در کار خود را به صورت رایگان ظرف یک سال اصلاح می کنیم.

نرم افزاری برای مدیریت کسب و کار شما

خرید 1C: Enterprise

ما یک فروشنده رسمی 1C هستیم، شما می توانید محصولات نرم افزاری و مجوزهای مختلف را از ما خریداری کنید. ما علاوه بر خرید جعبه، به شما در راه اندازی برنامه، ارائه مشاوره و انجام تنظیمات اولیه کمک خواهیم کرد.

  • حسابداری
  • اتوماسیون فروشگاه
  • عمده فروشی
  • نصب و راه اندازی اولیه کمک در بسته گنجانده شده است!
  • تنظیم دقیق تنظیمات بر اساس نیازهای مشتری، توسعه ماژول های جدید در غیاب عملکردهای لازم در پیکربندی استاندارد.
حسابداری 1c 1C: مدیریت تجارت 1C: خرده فروشی 1C: حقوق و دستمزد و مدیریت پرسنل
از 3300 روبل. از 6700 روبل. از 3300 روبل. از 7400 روبل.

تامین سرور

راه اندازی فوری سرور + 1C.

سرور نداره؟ مشکلی نیست، ما سروری را در فضای ابری انتخاب کرده و به سرعت راه اندازی می کنیم. با هزینه اندک راه حلی بسیار قابل اعتماد دریافت می کنید.

  • در دسترس بودن 24\7
  • نیازی به داشتن مدیر سیستم خود نیست (صرفه جویی هزینه سرور شما را پوشش می دهد).
  • راه اندازی و نصب سریع 1C بر روی سرور، در عرض 3 روز شما یک سیستم کاملاً کارآمد خواهید داشت.
  • اگر از راه حل راضی نیستید، می توانید در هر زمان به یک سرور محلی منتقل شوید.

پیامک از 1C شما

آیا می خواهید مشتریان شما از تبلیغات و تخفیف ها مطلع شوند؟ آیا مشتریان برنمی گردند؟ ارسال پیامک مستقیم از 1C را تنظیم کنید!

شرکت ما می تواند به سرعت ارسال پیامک به مشتریان شما را مستقیماً از 1C تنظیم کند. نمونه هایی از رویدادهایی که می توانند خودکار شوند:

  • با تشکر از خرید و پاداش بلافاصله پس از خرید بعدی تعلق می گیرد.
  • انباشت پاداش به کارت به عنوان هدیه برای تولد یا تعطیلات مهم دیگر.
  • اطلاع از ورود کالا به انبار.
  • انقضای پاداش هدیه.
  • اطلاعیه دریافت پیش پرداخت و رزرو کالا.
  • آدرس با مسیرهای فروشگاه/دفتر، شماره تلفن.
  • و غیره.

راه اندازی در 1C می تواند توسط متخصصان ما یا کارمندان شما انجام شود. تعرفه ها را می توانید در صفحه تعرفه پیامک مشاهده کنید.

  • ارسال پیامک تضمینی فقط بابت پیامک تحویلی هزینه دریافت می شود.
  • قیمت جداگانه برای هر پیامک
  • موجودی خود را به روش های مختلف پر کنید.
  • تاریخچه همه پیامک های ارسالی را در هر زمان مشاهده کنید.
  • نام فرستنده به جای شماره دیجیتال در تلفن گیرنده پیام.
این مقاله بر اساس سؤالات موجود در انجمن ها است: "چگونه می توانم یک رشته را از یک DLL برگردانم؟" ، "چگونه یک آرایه از رکوردها را ارسال و برگردانم؟" ، "چگونه یک فرم را به یک DLL ارسال کنیم؟".

برای اینکه نیمی از عمر خود را صرف فهمیدن آن نکنید، در این مقاله همه چیز را در یک بشقاب خواهم آورد.

موضوعات این مقاله بیش از یک بار در این وبلاگ به درجات مختلف پرداخته شده است، اما در این مقاله با هم جمع آوری شده و توجیه شده است. به طور خلاصه، می‌توانید لینک این مقاله را برای کسانی که DLL توسعه می‌دهند قرار دهید.

یادداشت مهم: مقاله باید خوانده شود به صورت متوالی. نمونه کد فقط به عنوان ارائه شده است مثال ها، در هر مرحله (نقطه) مقاله، کد نمونه با جزئیات جدید اضافه می شود. به عنوان مثال، در همان ابتدای مقاله مدیریت خطا وجود ندارد؛ روش‌های «کلاسیک» نشان داده شده‌اند (مانند استفاده از GetLastError، قرارداد sdtcall و غیره)، که با پیشرفت مقاله با روش‌های مناسب‌تر جایگزین می‌شوند. این کار به این دلیل انجام شد که طرح‌های "جدید" ("غیر معمول") سوالی ایجاد نکنند. در غیر این صورت، لازم است برای هر مثال یک یادداشت درج شود مانند: "این در آن پاراگراف زیر بحث شده است، اما در این پاراگراف مورد بحث قرار گرفته است." در هر صورت، در انتهای مقاله یک لینک به کد آماده وجود دارد که با در نظر گرفتن تمام موارد گفته شده در مقاله نوشته شده است. شما فقط می توانید آن را بگیرید و از آن استفاده کنید. و مقاله توضیح می دهد که چرا و چرا. اگر به «چرا و چرا» علاقه ای ندارید، به انتهای نتیجه بروید و لینک دانلود مثال را ببینید.

بهترین مقالات در این زمینه