delphi4arab منتديات دلفي للعرب
أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo (/showthread.php?tid=516)



أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - kachwahed - 02-02-2009

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


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - hanipino - 03-02-2009

السلام عليكم

اخى 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


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - محمد عبد العزيز - 03-02-2009

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


والسلام عليكم



أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - kachwahed - 03-02-2009

السلام عليكم
بارك الله فيك أخي 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 ونتيجة هذه الأخيرة أحسن.
بهذا يمكن معرفة عدد الأسطر الظاهرة، لكن تبقى كيفية الوصول إلى النص الظاهر، ولأجل ذلك تجب معرفة أول وآخر سطر يظهر وطريقة الوصول إليهما.


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - kachwahed - 03-02-2009

شكرا كثيرا لك أخونا المشرف DeltaAziz على الاقتراح، تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال، لكنني سأحال فيها إن شاء الله.
ربما يمكن الاستفادة من الحدث OnResizeRequest لمكون TRichEdit الذي يتحسس حجم النص.
وبخصوص المكونات الخارجية، فمتى نتعلم إذا كنا كلما أردنا شيئا ما استعملنا لأجله مكون خارجي؟
أحاول ألا أستعمل أي مكون خارجي إلا إذا كان من تصميمي، وأفضل أن يكون استعمال المكونات الخارجية آخر حل.
شكرا كثيرا لكم.


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - kachwahed - 03-02-2009

للفائدة:
وجدت دالة تعيد عدد الأسطر الظاهرة.
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)
تعيد قيمة موضع السطر الأول.


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - محمد عبد العزيز - 04-02-2009

kachwahed كتب :تبقى فكرتك غامضة نوعا ما تحتاج الى مثال، وبالمثال يتضح المقال

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

حسنا اليك طريقة اخرى لا تتطلب وقت وهي بتغيير سعة المكون ، الخاصية MaxLength
PHP كود :
RichEdit1.MaxLength := MaxInt-2; 
والسلام عليكم



أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - kachwahed - 10-02-2009

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


أبحث عن طريقة لتحديد النص الذي الظاهر في TMemo - محمد عبد العزيز - 10-02-2009

إقتباس : لم أفهم قصدك ما علاقة maxlength بتحديد حجم النص الظاهر
ليس تحديد الظاهر وانما جعل حجم المكون يسع النص
وهو ماجاء في السؤال:

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