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

كيفية مسح سطر محدد بدون التأثير على بقية الأسطر

بدأه khaled_prg في 2 أكتوبر 2010 · 7 رد · 577 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

السؤال الأول :

كيف يمكنني أن أمسح أسطر معينة سبق و أن تم إظهارها ؟

للتوضيح, انظر الكود التالي :

#include<iostream>
using namespace std;
int main()
{
    cout<<"www.arabteam2000.com"<<endl;
    cout<<"khaled_prg"<<endl;
    system("pause");
    return 0;										
}

كيف أمسح السطر khaled_prg بدون أن يتم مسح السطر www.arabteam2000.com !؟

السؤال الثاني :

نفس السؤال السابق ولكن هذه المرة من أجل تلوين الأسطر.

تحياتي.

#2

من خلال المكتبه القياسيه لا يمكنك فعل ذلك، و لكن إذا كنت تعمل على نظام تشغيل ويندوز يمكنك ذلك بإستخدام الداله FillConsoleOutputCharacterA

#include <iostream>
using namespace std;

#include <Windows.h>

int main()
{
        cout << "line 1\ndebug and watch this line cause it's going to be cleared.\nline 3\n";

        HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD  dwLoc = {0,1};
        DWORD  dwFillCount = 0;

        FillConsoleOutputCharacterA( hOutput, ' ', 0x40, dwLoc, &dwFillCount );
}

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 2 أكتوبر 2010 في 20:53

مدونتي: C++ Tips and Tricks

#3

السلام عليكم

أشكرك على المساعدة.

قمتُ بتجربة الكود ولكن لم يظهر أي تأثير للدالة !!!, مع العلم أن المترجم الذي أعمل عليه حاليا هو dev

ماذا تفعل الدالة FillConsoleOutputCharacterA !؟, هل تمسح الأسطر أم تقوم بتلوينها !؟

تحياتي

#4

الكود السابق يقوم بكتابة 3 اسطر بهذا الشكل:

line 1

debug and watch this line cause it's going to be cleared.

line 3

بعدها يقوم بحذف محتويات السطر الثانى و ذلك بإبدال كل الحروف داخل هذا السطر بمسافه خاليه.

المعامل الأول للداله FillConsoleOutputCharacterA يحتوى على الـ Handle الخاص بالكاتبه داخل الـ Console و المعامل الثانى يحتوى على الحرف (من نوع char) و الذى سيتم كتابته داخل الكونسول و المعامل الثالث يحتوى على عدد المرات الذى سيتم تكرار كتابة الحرف الموجود بالمعامل الثانى و المعامل الرابع يحتوى على موقع بداية الكتابة (Two Short Integers) حيث العنصر X هو رقم العمود و المعامل Y هو رقم الصف و الترقيم يبدأ من صفر، المعامل الأخير يعود لك بعدد الحروف التى تم كتابتها فعليا.

أقصى عدد من الرحوف للسطر الواحد داخل الكونسول الخاص بويندوز هو 80 حرف.

الكود يعمل لدى بشكل سليم، من الممكن أن يجربه لك أحد الأعضاء و يخبرك بالنتيجه.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 4 أكتوبر 2010 في 22:36

1

مدونتي: C++ Tips and Tricks

#5

الحمد لله, تم حل المشكلة والفضل يعود إليك, الدالة أصبحت تعمل عندي بشكل كامل, جزاك الله ألف خير

حسب ما فهمت من كلامك فإن الدالة FillConsoleOutputCharacterA تتولى مهمة حذف الأسطر حسب المعاملات التي نمررها لها, ولكن ماذا عن دالة تلوين الأسطر !؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 5 أكتوبر 2010 في 15:20

#6

إضافة إلى السؤال السابق :

بشكل عام فإن الدالة FillConsoleOutputCharacterA تُمكننا من استبدال سطر معين بسطر آخر مكون من حرف, هذا الحرف سيكون مُكرر عدة مرات , ولكن ماذا لو أردنا مسح الفراغ الناجم عن كتابة الفراغات في المثال السابق بحيث يكون لا يوجد سطر ما بين line 1 و line 3 !؟

#7

بما أنك تريد هذا الشئ على الـ windows فهناك شئ إسمه SDK خاص بما يتعلق بالنظام من دوال API تجده في موقع الـMSDN

الجزء الذي تريده تجده هنا Console Functions

الدوال الموجودة هناك هي ما تريده.

راجع المواضيع القديمة ستجد من كتب عن بعض من تلك الدوال خصوصاً الخاصة بمسح الشاشة , تلوين الخط , تلوين الشاشة , تغيير موقع المؤشر cursor ... هناك كلاس في أحد المواضيع بإمكانك تطويرة ليشمل أشياء أخرى ...

للتلوين SetConsoleTextAttribute

بالنسبة لحذف سطر فيمكن إستخدام ScrollConsoleScreenBuffer

جرب هذا الكود

void DeleteLine(int row)
{
 SMALL_RECT ScrollRectangle, ClipRectangle;
 COORD crDest = {0, row - 1};
 CHAR_INFO chFill;
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOutput, &bInfo );
 ScrollRectangle.Left = 0;
 ScrollRectangle.Top = row;
 ScrollRectangle.Right = bInfo.dwSize.X - 1;
 ScrollRectangle.Bottom = bInfo.dwSize.Y - 1;
 ClipRectangle = ScrollRectangle;
 chFill.Attributes = bInfo.wAttributes;
 chFill.Char.AsciiChar = "";
 ScrollConsoleScreenBuffer(hOutput, &ScrollRectangle, &ClipRectangle, crDest, &chFill);
}
#8

هذا ما كنت أريده :wink: ,جزاك الله خيرا يا اخي الفاضل, أفدتني كثيرا .. جزاك الله ألف خير :)

لو ممكن تساعدني في الأسئلة التي طرحتها في هذا الموضوع و أكون شاكر لك :

التحقق المتقدم من صحة الإدخال !

دمت في حفظ الرحمن.

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