delphi4arab منتديات دلفي للعرب

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

اخى 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
ان استبعدنا استخدام مكون خارجي كونك لاتحبها
يمكن ان تقسم الملف الى اجزاء
حيث تعرض الجزء الأول فقط
عندما ينزل المستخدم الى اخره تحذفه وتعرض الجزء الموالي
وهكذا الى نهاية الملف
اي كانها صفحات تعرض واحدة تلو الاخرى حسب الطلب


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

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

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

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