في كتابة التطبيقات، عادةً ما تُستخدم المكونات الشائعة مثل ComboBox وListBox ليس فقط لعرض النص، ولكن أيضًا لعرض الرموز المتعلقة بالنص. في تطبيقات Windows العامة، سيتغير عرض هذه الرموز مع تغير نص العرض المدرج. على سبيل المثال، عندما يتم إدراج كافة الملفات الموجودة في الدليل الحالي في مربع التحرير والسرد، يكون العرض الموجود على الجانب الأيسر من مربع التحرير والسرد مرتبطًا بـ. اسم الملف. تسمى الرموز المتصلة بالرموز الديناميكية. خطوات استخدام الأيقونات الديناميكية في دلفي هي كما يلي: 1. الحصول على الأيقونات
لاستخدام الرموز الديناميكية، أول شيء يجب حله هو كيفية الحصول على نص العرض ومقبض الرمز المرتبط به. يتم تحديد الرمز بواسطة سجل النظام من خلال اقتران الملف، وفي برمجة Windows، قد يكون للملف نفسه (أو الدليل الفرعي أو المجلد) أيضًا نتيجتان للعرض على سطح المكتب، وهما اسم ملف DOS واسم العرض (اسم العرض) . إذا لم يكن تطبيقنا بحاجة إلى أن يكون له نفس تأثير متصفح موارد Windows، فيمكننا استخدام وظائف FindFirst() وFindNext() وعملية FindClose() للحصول على اسم ملف DOS. وإلا، فيجب علينا استخدام Windows API للحصول على اسم العرض. أثناء الحصول على اسم الملف، يمكنك الحصول على مؤشر الرمز الخاص به HICON باستخدام الدالة SHGetFileInfo() في ShellAPI.pas الإرشادات كما يلي:
وظيفة SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
معلمة pszPath: اسم الملف المحدد. عندما لا تحتوي قيمة uFlags على SHGFI_PIDL، يمكن تحديدها مباشرة؛ وإلا، يجب الحصول على pszPath من خلال الحساب ولا يمكن تحديدها مباشرة؛
معلمة dwFileAttributes: سمات الملف، صالحة فقط عندما تحتوي قيمة uFlags على SHGFI_USEFILEATTRIBUTES، ولا يتم استخدام هذه المعلمة بشكل عام؛
معلمة psfi: تقوم بإرجاع معلومات الملف التي تم الحصول عليها، وهو نوع سجل يحتوي على الحقول التالية:
hIcon: HICON; // مقبض رمز الملف
iIcon: عدد صحيح؛ // رقم فهرس النظام الخاص بالرمز
dwAttributes: DWORD; // قيم السمات للملف
szDisplayName: مصفوفة [0..MAX_PATH-1] من AnsiChar; // اسم العرض للملف
szTypeName: array [0..79] of AnsiChar; // اسم نوع الملف
معلمة cbFileInfo: قيمة البت لـ psfi؛
معلمة uFlags: تشير إلى معرف معلومات الملف الذي يجب إرجاعه، والثوابت شائعة الاستخدام هي التالية:
SHGFI_ICON; // احصل على الرمز
SHGFI_DISPLAYNAME; // احصل على اسم العرض
SHGFI_TYPENAME; // احصل على اسم النوع
SHGFI_ATTRIBUTES;//احصل على السمات
SHGFI_LARGEICON; // احصل على أيقونة كبيرة
SHGFI_SMALLICON; // احصل على الأيقونة الصغيرة
SHGFI_PIDL; // pszPath هو معرف
تختلف قيمة الإرجاع للدالة SHGetFileInfo() أيضًا مع قيمة uFlags. من خلال استدعاء SHGetFileInfo()، يمكنك الحصول على مقبض رمز الملف من المعلمة psfi، ولكن يرجى ملاحظة أنه عند عدم استخدام SHGFI_PIDL في المعلمة uFlags، لا يمكن لـ SHGetFileInfo() الحصول على معلومات حول المجلدات الافتراضية مثل "جهاز الكمبيوتر". 2. تحميل الرموز
استخدم مكون TImageList الذي توفره دلفي لتحميل الأيقونة التي تم الحصول عليها عن طريق استدعاء الدالة ImageList_AddIcon() في CommCtrl.pas، وتأكد من أن رقم الفهرس الخاص بها يتوافق مع النص المعروض. التعليمات هي كما يلي:
وظيفة ImageList_AddIcon(ImageList: HIMAGELIST; // قم بتحميل مقبض ImageList الخاص بالرمز
الأيقونة: Hicon // مقبض الأيقونة المحملة): عدد صحيح // إرجاع رقم فهرس الأيقونة في ImageList
يمكن استخدام القيمة المرجعة لـ ImageList_AddIcon() عندما تحتاج إلى تحديد رقم فهرس الرمز. 3. الإخراج الرسومي للأيقونات والنص
بالنسبة للمكونات مثل مربعات التحرير والسرد ومربعات القائمة التي لا يمكنها عرض الرموز مباشرة، لأنها مطلوبة لعرض الرموز والنص في نفس الوقت، يمكن تحقيق ذلك عن طريق تعيين خصائص النمط المقابلة لها، وفيما يلي الأمثلة:
مربع التحرير والسرد: ComboBox1.Style:=csOwnerDrawVariable. وفقًا لتجربة الاستخدام الفعلية، من الأفضل عدم تعيينه مباشرةً في نموذج ObjectInspector، بدلاً من ذلك، يجب إضافة التعليمات البرمجية إلى الموقع المناسب في البرنامج، وإلا سيتم إجراء تغييرات غير منتظمة في الارتفاع من منطقة الرسم قد تحدث.
مربع القائمة: ListBox1.Style:=lbOwnerDrawVariable
شريط الحالة: StatusBar1.Panels[i].Style:= لا يمكن لـ psOwnerDraw استخدام شريط حالة بسيط. i هو رقم الفهرس لجزء معين في شريط الحالة حيث سيتم رسم الرمز. يمكن استخدام ImageList1.Draw () لطريقة TImageList، ويمكن لإخراج النص استخدام طريقة TextOut () لـ TCanvas، والتي تم توريثها من خاصية Canvas للمكون. من الواضح أن المكونات التي لا تحتوي على خصائص Canvas لا يمكنها استخدام هذه الطريقة لعرض الرموز.
بالنسبة للمكونات التي يمكنها عرض الرموز مباشرة، حدد خصائص الأيقونة المطلوبة مباشرة مثل Images وStateImages كاسم مكون TimageList المطابق، ويمكن عرض الأيقونة عن طريق تحديد رقم فهرس الأيقونة. تجدر الإشارة إلى أنه عند استخدام أيقونات كبيرة، يجب عليك أولاً استدعاء طريقة CreateSize() الخاصة بـ TImageList لتحديد حجم الرمز القابل للتحميل، واستدعاء CreateSize() مرة أخرى بعد كل استدعاء للطريقة Clear الخاصة بـ TImageList.
استخدم أسلوب ImageList1.Clear الخاص بـ TImageList لمسح الرموز المحملة، والتي تُستخدم غالبًا عند الحاجة إلى التحديث.