الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يمكنني أن أشعر برمجياً بإدخال قرص أو ديسك او سي دي أو فلاش كارد

مغلق
بدأه kingbode في 24 أبريل 2007 · 6 رد · 1,039 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

كنت قد طرحت منذ شهور موضوع مشابه على المنتدى ولكني لا اعلم أين ذهب ...ربما ضاع في التحديث...على أي حال..

أود أن اناقش معكم كيفية الشعور بإدخال قرص مرن أو مدمج أو فلاش كارد او قرص ذاكرة برمجياً بواسطة الدلفي.

[Floppy disk , CD , DVD , or MMC , SD , flash Card ,Usb flash disk ]

وكانت مشكلتي في باديء الأمر كيف يمكنني أن أشعر بتركيب فلاش ديسك مثلا أو نزعه من جهازي ولكني قمت بحل هذه المشكلة والحمد لله وقمت أيضاً باستعراض جميع المسوقات ( Drives ) الثابت منها والمتحرك ولا زالت المشكلة الآن كيف أشعر بإدخال الاقراص فيها على اختلاف أنواعها مثل الــ :

1- القرص المرن ( Floppy disk ) في مسوق القرص المرن ( Floppy Drive ).

2- القرص المدمج ( CD ) في مسوق الاقراص المدمجة ( CD Drive ).

3- قرص الذاكرة (Ram Disk ) في مسوق أقراص الذاكرة ( Memory Reader ).

وسأرفق البرنامج الذي قمت بكتابته حتى الآن وارجو المساعدة لمن لديه خبرة....لكي يتم تحقيق البرنامج بالكلية...

( تمت برمجته على الـ Borlan Developer studio ).

...يعتمد البرنامج على استخدام الرسائل التي ترسلها الـ Windows وتنبيء فيها عن تركيب قرص متحرك وعن نوعه

وهي WM_DeviceChange

ولكن ما هي الرسالة التي تنبيء عندما يتم إدخال قرص ( بمختلف الأنواع )؟؟؟؟ وما هي خصائص تلك الرسالة أو عواملها

( Parameters ) ؟؟؟

قد يقول البعض أنه من الممكن مراقبة كل الاقراص باستمرار ( Polling ) ولكني لا اراه اسلوباً مجديا برمجياً أو انه منزوع منه الاحتراف..

والسؤال الآخر عن الرسائل المرسلة من الويندوز بصفة عامة ..هل يوجد لها شرح مفصل في الــ Help ؟؟؟ وأين أجدها وأجد خصائصها..

وبارك الله لكم

Disk_Utility_only_Optimized.zip

تم تعديل هذه المشاركة بواسطة kingbode في 24 أبريل 2007 في 11:25

#2

ممتاز اخي

الله يقويك انا كنت ابحث عن هيك موضوع من زمان

يمكن نقدر نتساعد

بس عطيني وقت لقراءة الكود

وشكراً

#3

لاحظ اخي هذا كان نص الـ Procedure الخاص بتغيير حالى أي جهاز في باديء الأمر قبل التعديل

procedure TMain.WMDeviceChange(var Msg: TMessage);
var
   Drive: string;
   bv: PDevBroadcastVolume;   
   lpdbhHeader:   PDevBroadcastHeader;
   lpdbvData:	 PDevBroadcastVolume;
   dwIndex:	   Integer;
   lpszDrive,lpszDrives: String;

begin

   case Msg.wParam of
	 DBT_CONFIGCHANGECANCELED:begin Memo1.Lines.Add('DBT_CONFIGCHANGECANCELED');end;
	 DBT_CONFIGCHANGED:begin  Memo1.Lines.Add('DBT_CONFIGCHANGED');end;
	 DBT_CUSTOMEVENT:begin  Memo1.Lines.Add('DBT_CUSTOMEVENT');end;
	 DBT_DEVICEARRIVAL:begin  Memo1.Lines.Add('DBT_DEVICEARRIVAL'+' the Storage Device is plugged');Check_Disks.Click;end;
	 DBT_DEVICEQUERYREMOVE:begin  Memo1.Lines.Add('DBT_DEVICEQUERYREMOVE');end;
	 DBT_DEVICEQUERYREMOVEFAILED:begin  Memo1.Lines.Add('DBT_DEVICEQUERYREMOVEFAILED');end;
	 DBT_DEVICEREMOVECOMPLETE:begin  Memo1.Lines.Add('DBT_DEVICEREMOVECOMPLETE'+' the Storage Device is Safe to be Unplugged');Check_Disks.Click;end;
	 DBT_DEVICEREMOVEPENDING:begin  Memo1.Lines.Add('DBT_DEVICEREMOVEPENDING');end;
	 DBT_DEVICETYPESPECIFIC:begin  Memo1.Lines.Add('DBT_DEVICETYPESPECIFIC');end;
	 DBT_DEVNODES_CHANGED:begin  Memo1.Lines.Add('DBT_DEVNODES_CHANGED'+' the Storage Device is under Change');end;
	 DBT_QUERYCHANGECONFIG: begin Memo1.Lines.Add('DBT_QUERYCHANGECONFIG');end;
	 DBT_USERDEFINED: begin Memo1.Lines.Add('DBT_USERDEFINED');end;
   else
	 Memo1.Lines.Add('NOT VALID');
	 end;

end;

لاحظ المتغيرات الموجودة في قسم التعريف...أنا لم أستخدمها البته...ولاحظ أيضاً الآتي:

 #include <windows.h>
   #include <dbt.h>

   char FirstDriveFromMask (ULONG unitmask);  //prototype


   /*----------------------------------------------------------------------
   Main_OnDeviceChange (hwnd, wParam, lParam)

   Description
	  Handles WM_DEVICECHANGE messages sent to the application's
	  top-level window.
   ----------------------------------------------------------------------*/ 

   void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
   {

	  PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
	  char szMsg[80];


	  switch(wParam)
	  {
	  case DBT_DEVICEARRIVAL:
		 // See if a CD-ROM or DVD was inserted into a drive.
		 if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
		 {
			PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

			if (lpdbv -> dbcv_flags & DBTF_MEDIA)
			{
			   wsprintf (szMsg, "Drive %c: arrived\n",
						 FirstDriveFromMask(lpdbv ->dbcv_unitmask));

			   MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
			}
		 }
		break;


	 case DBT_DEVICEREMOVECOMPLETE:
		// See if a CD-ROM was removed from a drive.
		if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
		{
		   PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

		   if (lpdbv -> dbcv_flags & DBTF_MEDIA)
		   {
			  wsprintf (szMsg, "Drive %c: was removed\n",
						FirstDriveFromMask(lpdbv ->dbcv_unitmask));

			  MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
		   }
		}
		break;

	 default:
		/*
		   Other WM_DEVICECHANGE notifications get sent for other devices
		   or reasons; we don't care about them here.  If they were
		   important, we would check for them and act accordingly.
		*/ 
		;
	  }
   }


   /*----------------------------------------------------------------------
   FirstDriveFromMask (unitmask)

	  Finds the first valid drive letter from a mask of drive letters. The
	  mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C, etc.

	  A valid drive letter is defined when the corresponding bit is set to
	  1.

	  Returns the drive letter that was first found.
   ----------------------------------------------------------------------*/ 
   char FirstDriveFromMask (ULONG unitmask)
   {
	  char i;

	  for (i = 0; i < 26; ++i)
	  {
		 if (unitmask & 0x1)
			break;
		 unitmask = unitmask >> 1;
	  }

	  return (i + 'A');
   }

هذا كود من على موقع Microsoft

ولكنه بالسي شارب والمهم انه استخدم المتغيرات التي لم استخدمها ولكن انا بنيت حدث على نفس الرسالة المنبعثة من النظام وهي :

WM_DeviceChange وعاملها DBT_DEVICEARRIVAL

ومع هذا برنامجي لايشعر عند إدخال أي قرص أو كارد ذاكرة ( Multimedia Card ) وهذا ما أريد أن ابني التطبيق من اجله...

#4

كود الدلفي كان مأخوذاً من النقاش هنا

http://groups.google.com/group/borland.pub...e1ef2829df36470

قمت بتجربته على CD و تمت العملية بنجاح .. تأكد من خاصية الـ Autorun في جهازك ..

بالنسبة لـ Memory Card فتعتمد على القارئ ..

راجع هذا المقال خصوصاً الرد على "Please help me!" ...

تم تعديل هذه المشاركة بواسطة cipher في 3 مايو 2007 في 09:48

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#5

السلام عليكم ورحمة اله وبركاته

بارك الله لكم

فعلا الكود أصله من الانترنت ولقد أضفت هذا الموضوع على المنتدى منذ 9 أشهر أو يزيد...ولكنه اختفى

والقاعدة تقول لا تبدأ من الصفر بينما يمكنك أن تبدأ على عمل الآخرين وذلك كي تختصر الوقت فنحن لن نعيد تصنيع العجلة...

بالنسبة للقارىء فلا تعتمد عليه تلك العمليه!!!

ولقد حاولت بكل الوسائل المذكورة والتي جدتها حتى الآن ولعلك لاحظت أخي يفر أنه لمك تتم حل المشكلة بالنسبة للميموري ريدر في ذلك الموضوع

ويوجد برنامج اسمه Memory card copier به نفس الوظيفة ويعمل بنجاح..

أتمنى في القريب العاجل من حل تلك المشكلة...رغم أني مشغول ولست متفرغا...كما أني سألت عن تطبيق يستخدم خاصية الـ Messaging وذلك لتعم الفائدة حيث أن الهدف الواحد قد يساعد في تعلم الكثير...

تم تعديل هذه المشاركة بواسطة kingbode في 3 يونيو 2007 في 15:11

#6

السلام عليكم ورحمة الله.

لقد رأيت عدة أكواد مبرمجة بدلفي لها علاقة بموضوعك.

وستجد واحدا منها في المرفقات إن شاء الله.

delphifr_USB_201_TECTER_CONNEC_201_CONNECTION_201_RIPH_29140.zip

غــــــــــــــــــــــــــــفرانك ربنا وإليك المصــــير

#7

بارك الله فيك يا أخي العزيز ولقد وجدت كود يعمل بنجاح ولكنه بلغة الـ سي ++ فهل من هناك من يمكنه من تحويله الي الدلفي؟؟؟؟

الكود مرفق ...قم بتشغيل ملف الــ apdiag.exe

وبارك الله لكم..

Autoplay.rar

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…