أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo
#1
السلام عليكم.
أبحث عن طريقة لمعرفة وتحديد النص الذي يظهر في مكون من النوع TMemo أو TRichEdit.
يعني أن النص الذي في المكون لا يظهر كله وإنما تظهر بعض الأسطر فقط إذا كان حجم النص أكبر من حجم المكون، فهل من طريقة ؟؟؟
شكرا مسبقا.
الرد
#2
السلام عليكم

اخى 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; 
التحديد الله اعلم .

Smile
الرد
#3
ان استبعدنا استخدام مكون خارجي كونك لاتحبها
يمكن ان تقسم الملف الى اجزاء
حيث تعرض الجزء الأول فقط
عندما ينزل المستخدم الى اخره تحذفه وتعرض الجزء الموالي
وهكذا الى نهاية الملف
اي كانها صفحات تعرض واحدة تلو الاخرى حسب الطلب


والسلام عليكم
الرد
#4
السلام عليكم
بارك الله فيك أخي 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 ونتيجة هذه الأخيرة أحسن.
بهذا يمكن معرفة عدد الأسطر الظاهرة، لكن تبقى كيفية الوصول إلى النص الظاهر، ولأجل ذلك تجب معرفة أول وآخر سطر يظهر وطريقة الوصول إليهما.
الرد
#5
شكرا كثيرا لك أخونا المشرف DeltaAziz على الاقتراح، تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال، لكنني سأحال فيها إن شاء الله.
ربما يمكن الاستفادة من الحدث OnResizeRequest لمكون TRichEdit الذي يتحسس حجم النص.
وبخصوص المكونات الخارجية، فمتى نتعلم إذا كنا كلما أردنا شيئا ما استعملنا لأجله مكون خارجي؟
أحاول ألا أستعمل أي مكون خارجي إلا إذا كان من تصميمي، وأفضل أن يكون استعمال المكونات الخارجية آخر حل.
شكرا كثيرا لكم.
الرد
#6
للفائدة:
وجدت دالة تعيد عدد الأسطر الظاهرة.
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)
تعيد قيمة موضع السطر الأول.
الرد
#7
kachwahed كتب :تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال

ليس دائما ممكن الاجابة بوضع كود خاصة ان كان يتطلب وقت

حسنا اليك طريقة اخرى لا تتطلب وقت وهي بتغيير سعة المكون ، الخاصية MaxLength
PHP كود :
RichEdit1.MaxLength := MaxInt-2; 
والسلام عليكم
الرد
#8
السلام عليكم
شكرا أخونا عبد العزيز لكنني لم أفهم قصدك ما علاقة 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; 
عموما شكرا كثيرا على التجاوب.
الرد
#9
إقتباس : لم أفهم قصدك ما علاقة maxlength بتحديد حجم النص الظاهر
ليس تحديد الظاهر وانما جعل حجم المكون يسع النص
وهو ماجاء في السؤال:

إقتباس :يعني أن النص الذي في المكون لا يظهر كله وإنما تظهر بعض الأسطر فقط إذا كان حجم النص أكبر من حجم المكون
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم