السلام عليكم
الغاية من هذا الموضوع هو شرح إستعمالات النوع CString الذي يعتبر من أبرز مميزات البرمجة من نوع MFC. هناك عدة إستعمالات لهذا النوع سأحاول تفسيرها كي يسهل على المبرمجين بلغة السي إتقانها.
ربط الكلمات
إحدى أبرز إيجابيات هذا النوع هي إمكانية ربط كلمات ببعضها. والمقصود بالربط هنا ليس وفق علاقة منطقية معينة إنما تركيب الكلمات من هذا النوع لتشكل سلسلة كلمات سوى ذات معنى أم لا.
#include "stdafx.h"
#include <atlstr.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{ CString gray("Gray"); //1
CString cat("Cat");
CString graycat = gray + cat;
return 0;
}السطر المرمز ب// 1 يبين كيفية تعريف متغير من نوع CString وإسناد قيمة له. وما نلاحظه هنا أن إسناد قيمة ما لمتغير من هذا النوع تختلف عن الطريقة التقليدية بإستعمال الرمز "=". هناك طرق أخرى مماثلة للنموذج التقليدي من بينها الطريقة التالية:
CString gray="Gray";
أو
CString gray=L"Gray";
أو
CString gray=_T("Gray");النوع CStringهو من أبرز مميزات البرمجة من نوع MFC .هذا لا يعني أنه ممنوع إستعماله في الأنواع الأخرى من المشاريع, والمثال السابق من أبرز البراهين على إمكانية إدراج هذا النوع في المشاريع من نوعWIN32 يكفي إدراج المكتبةatlstr.h في المشروع. أما إذا كان المشروع من نوعdll فينبغي إضافة المكتبةatlsd.lib بالشكل التالي
#pragma comment(lib,"atlsd.lib")
أو إضافتها في خصائص المشروع بالكيفية التالية
بهذه الكيفية نتخلص من التعقيد عند الرغبة في ربط كلمات ببعضها وتجنب تعليمات كهذه:
char gray[] = "Gray"; char cat[] = "Cat"; char * graycat = malloc(strlen(gray) + strlen(cat) + 1); strcpy(graycat, gray); strcat(graycat, cat);
التشكيل
المقصود هنا بالتشكيل هو تكوين جمل تحتوي مخرجات متغيرات ذات أنواع متعددة مثل الأعداد , الحروف وغيرها. يكون هذا التشكيل بإعتماد الدالةFormat التابعة للقسم CStringوبذلك نتجنب إستعمال دوال مثلsprintf و wsprintf
int total =10;
CString s;
s.Format(_T("The total is %d"), total);ما نلاحظه هنا أننا أولا تمكنا من إدراج قيمة متغير من نوع عدد طبيعي في النص وثانيا لسنا بحاجة للتفكير في المساحة التي يجب حجزها في الذاكرة. ونتجنب مثل هاته التعليمات:
char StrEnd[560]; int iCount=10; memset(StrEnd , TEXT( ' ' ) , 128 * sizeof(TCHAR)); sprintf(StrEnd , "this is a test Nbr %d", iCount);
علما أنني إعتمدت على هذا الموضوع في بعض الإضافات.
يتبع...