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

كيف اجعل listview من اليمن الى اليسار

بدأه undertaker_2 في 31 يناير 2010 · 3 رد · 958 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ارجو المساعدة كيف اجعل ال listview من اليمين الى اليسار

#2

نرجو من الأخ الكريم التفضل بمشاهدة مشاركة السيد عروة في هذا المجال فله باع طويل في هذا النوع وسوف اقتبسه عنه

على كل حال راج الملف المرفق

ولكن على فرض أنك استطعت تغيير الاتجاه فإنك ستفقد بالمقابل العديد من الميزات المهمة الأساسية لهذا العنصر

مثل فقد القوائم وعدم القدرة على قراءة صور الأيقونات وبعض الأحداث بسبب التغير index لترتيب هذه العناصر

حكمت سراج الدين

procedure MirrorControl(AControl: TWinControl; ARightToLeft: Boolean);

var

OldLong: Longword;

begin

OldLong := GetWindowLong(AControl.Handle, GWL_EXSTYLE);

if ARightToLeft then

begin

AControl.BiDiMode := bdLeftToRight;

SetWindowLong(AControl.Handle, GWL_EXSTYLE, OldLong or $00400000);

end

else

SetWindowLong(AControl.Handle, GWL_EXSTYLE, OldLong and not $00400000);

AControl.Repaint;

end;

حكمت سراج الدين

rl.rar

#3

السلام عليكم...

بعد إذن الأخ hikmat و استكمالاً لإجابته....

الكود التالي عبارة عن إجراء بصيغتين (Overloaded) نحتاج كليهما لتغيير اتجاه الـ ListView

procedure ChangeControlLayout(Control: TWinControl; ArabicLayout: Boolean); overload;
var
    OldLong: LongWord;
begin
    OldLong := GetWindowLong(Control.Handle, GWL_EXSTYLE);
    if ArabicLayout then begin
        Control.BiDiMode := bdLeftToRight;
        SetWindowLong(Control.Handle, GWL_EXSTYLE, OldLong or WS_EX_LAYOUTRTL);
        end
    else
        SetWindowLong(Control.Handle, GWL_EXSTYLE, OldLong and not WS_EX_LAYOUTRTL);
    Control.Repaint;
end;


procedure ChangeControlLayout(ControlHandle: LongWord; ArabicLayout: Boolean); overload;
var
    OldLong: LongWord;
begin
    OldLong := GetWindowLong(ControlHandle, GWL_EXSTYLE);
    if ArabicLayout then
        SetWindowLong(ControlHandle, GWL_EXSTYLE, OldLong or WS_EX_LAYOUTRTL)
    else
        SetWindowLong(ControlHandle, GWL_EXSTYLE, OldLong and not WS_EX_LAYOUTRTL);
    UpdateWindow(ControlHandle);
end;

نستعمل الصيغة الأولى لتغيير اتجاه الـ ListView ككل، لكن تبقى مشكلة أن رؤوس الأعمدة تظل من اليسار إلى اليمين، و لهذا نستدعي الإجراء الثاني بعد الأول:

ChangeControlLayout(ListView1, True);
ChangeControlLayout(FindWindowEx(ListView1.Handle, 0, nil, nil), True);

و مع ذلك تبقى العقبات التي ذكرها أخونا hikmat مثل فقدان القوائم و استكمال النص المبتور و غيرها. و لكن ربما لا تهمك تلك الأمور.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#4

على الرحب والسعة

شكرا على استكمال الإجابة

حكمت سراج الدين

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