المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
السلام عليكم.
أبحث عن طريقة لمعرفة وتحديد النص الذي يظهر في مكون من النوع TMemo أو TRichEdit.
يعني أن النص الذي في المكون لا يظهر كله وإنما تظهر بعض الأسطر فقط إذا كان حجم النص أكبر من حجم المكون، فهل من طريقة ؟؟؟
شكرا مسبقا.
المشاركات : 378
المواضيع 44
:
: 6
الإنتساب : Feb 2008
السلام عليكم
اخى kachwahed ربما يفى هذا ب
الغرض :
PHP كود :
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Memo1.Hint:=Memo1.Text;
Memo1.ShowHint:=True;
Application.HintPause:=0;
Application.HintHidePause:=10000;
(* Application.HintColor *)
end;
التحديد الله اعلم .
المشاركات : 3,703
المواضيع 101
:
: 579
الإنتساب : Feb 2008
ان استبعدنا استخدام مكون خارجي كونك لاتحبها
يمكن ان تقسم الملف الى اجزاء
حيث تعرض الجزء الأول فقط
عندما ينزل المستخدم الى اخره تحذفه وتعرض الجزء الموالي
وهكذا الى نهاية الملف
اي كانها صفحات تعرض واحدة تلو الاخرى حسب الطلب
والسلام عليكم
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
السلام عليكم
بارك الله فيك أخي hanipino
وشكرا على الرد.
محاولتك جيدة، يمكنه كتابته باختصار
PHP كود :
with Memo1 do begin
ShowHint := True;
Hint:= Text;
end;
يمكن معرفة عدد الأسطر الظاهرة من النص، إذا علمنا ارتفاع المكون وارتفاع كل سطر.
ارتفاع المكون ما فيه مشكل (Height)، أما ارتفاع النص فهناك خدعة صغيرة لإيجاده:
PHP كود :
var i: Integer;
LineHeight: Integer;
begin
LineHeight := Canvas.TextHeight(RichEdit1.Text);
Caption := 'Number Of Visible Line :'+ IntToStr(Height div LineHeight);
أو يمكن تحديد LineHeight باستعمال قيمة ثابتة (تقريبا 17 Pixels)
وأسهل من ذلك استعمال RichEdit1.Font.Height- بدلا عن LineHeight ونتيجة هذه الأخيرة أحسن.
بهذا يمكن معرفة عدد الأسطر الظاهرة، لكن تبقى كيفية الوصول إلى النص الظاهر، ولأجل ذلك تجب معرفة أول وآخر سطر يظهر وطريقة الوصول إليهما.
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
شكرا كثيرا لك أخونا المشرف DeltaAziz على الاقتراح، تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال، لكنني سأحال فيها إن شاء الله.
ربما يمكن الاستفادة من الحدث OnResizeRequest لمكون TRichEdit الذي يتحسس حجم النص.
وبخصوص المكونات الخارجية، فمتى نتعلم إذا كنا كلما أردنا شيئا ما استعملنا لأجله مكون خارجي؟
أحاول ألا أستعمل أي مكون خارجي إلا إذا كان من تصميمي، وأفضل أن يكون استعمال المكونات الخارجية آخر حل.
شكرا كثيرا لكم.
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
للفائدة:
وجدت دالة تعيد عدد الأسطر الظاهرة.
PHP كود :
function GetMaxVisible(Re: TRichEdit): integer;
var
richDC: HDC; // temporary device context
tm: TTextMetric;
begin
with Re do begin
// get the maximum number of visible lines
richDC := GetDC(Handle);
SelectObject(richDC, Font.Handle);
GetTextMetrics(richDC, tm);
ReleaseDC(Handle, richDC);
result := ClientHeight div tm.tmHeight;
end;
end;
والدالة
كود :
Perform(EM_GETFIRSTVISIBLELINE, 0, 0)
تعيد قيمة موضع السطر الأول.
المشاركات : 3,703
المواضيع 101
:
: 579
الإنتساب : Feb 2008
kachwahed كتب :تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال
ليس دائما ممكن الاجابة بوضع كود خاصة ان كان يتطلب وقت
حسنا اليك طريقة اخرى لا تتطلب وقت وهي بتغيير سعة المكون ، الخاصية MaxLength
PHP كود :
RichEdit1.MaxLength := MaxInt-2;
والسلام عليكم
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
السلام عليكم
شكرا أخونا عبد العزيز لكنني لم أفهم قصدك ما علاقة MaxLength بتحديد حجم النص الظاهر.
لقد وجدت الحل واستخدمت متغيرات رقمية:
PHP كود :
var
IndexCurrentLine, PosCurrentLine,
CountVisibleLine, IndexFirstVisible,
IndexLastVisible, PosFirstVisible,
PosLastVisibleLine: Integer;
with RichEdit1 do begin
IndexCurrentLine := GetCaretPos.Y;//or Perform(EM_LINEFROMCHAR, SelStart, 0);
PosCurrentLine := Perform(EM_LINEINDEX, IndexCurrentLine,0);
IndexFirstVisible := Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
PosFirstVisible := Perform(EM_LINEINDEX, IndexFirstVisible,0);
CountVisibleLine := (Height div Abs(Font.Height))-1;
IndexLastVisible := RE_GetLastVisibleLine(RichEdit1);
PosLastVisibleLine:= GetLinesLength(IndexFirstVisible, IndexLastVisible);
end;
وهذه دالة تعيد عدد الأسطر الظاهرة:
PHP كود :
function RE_GetLastVisibleLine(RichEdit: TRichEdit): Integer;
const
EM_EXLINEFROMCHAR = WM_USER + 54;
var
r: TRect;
i: Integer;
begin
{
The EM_GETRECT message retrieves the formatting rectangle
of an edit control.
}
RichEdit.Perform(EM_GETRECT, 0, Longint(@r));
r.Left := r.Left + 1;
r.Top := r.Bottom - 2;
{
The EM_CHARFROMPOS message retrieves information about the character
closest to a specified point in the client area of an edit control
}
i := RichEdit.Perform(EM_CHARFROMPOS, 0, Integer(@r.TopLeft));
{
The EM_EXLINEFROMCHAR message determines which
line contains the specified character in a rich edit control
}
Result := RichEdit.Perform(EM_EXLINEFROMCHAR, 0, i);
end;
عموما شكرا كثيرا على التجاوب.
المشاركات : 3,703
المواضيع 101
:
: 579
الإنتساب : Feb 2008
إقتباس : لم أفهم قصدك ما علاقة maxlength بتحديد حجم النص الظاهر
ليس تحديد الظاهر وانما جعل حجم المكون يسع النص
وهو ماجاء في السؤال:
إقتباس :يعني أن النص الذي في المكون لا يظهر كله وإنما تظهر بعض الأسطر فقط إذا كان حجم النص أكبر من حجم المكون