PDA

View Full Version : سوال: RichEdit بدون اسکرول



choghok
شنبه 29 آبان 1389, 11:18 صبح
به نام خدا

سلام دوستان ، من میخوام یک ریچ ادیت داشته باشم که مثل TextBox ورد و کلا مجموعه ی آفیس پس از این که ظرفیتش پر شد یک پیغام خطا نشون بده و یا به یک ریچ ادیت دیگه پاس داده بشه. در واقع اسکرول نشه نه اینکه فقط اسکرول بارش رو برداریم. در واقع هدف اینه که در همون حدی که قابل نمایش هست در اون تایپ بشه و هیچ بخشی از متن مخفی نمونه.
در ضمن کاربر می تونه سایز و نوع فونت رو هم تغییر بده. راهی به ذهن دوستان می رسه ؟

امیدوارم تونسته باشم مقصود رو برسونم.
مرسی

Mahmood_M
شنبه 29 آبان 1389, 17:33 عصر
RichEdit خاصیتی به نام ScrollBars داره ، اگه اون خاصیت رو روی ssNone تنظیم کنید ، Scroll ها نمایش داده نمیشن ، برای مشخص کردن حداکثر تعداد حروف هم می تونید خاصیت MaxLength رو مقداردهی کنید و برای اینکه بعد از پر شدن ! به کاربر اطلاع بدید می تونید در رویداد OnChange مربوط به RichEdit طول متن فعلی رو با مقدار MaxLength مقایسه کنید :

if Length(RichEdit1.Text) = RichEdit1.MaxLength then
ShowMessage('Stop !');

موفق باشید ...

choghok
شنبه 29 آبان 1389, 18:20 عصر
به نام خدا
مرسی از پاسخ دادنتون ، درسته اما اینطوری maxlenght برای فونت ها وسایز های مختلف فرق داره مثلا با یاقوت 20 من در اون محیط می تونم 700 کاراکتر تایپ کنم اما با فونت 12 950 تا.
راه دیگه ای به نظرتون می یاد ؟

gogolo
دوشنبه 01 آذر 1389, 18:24 عصر
من دراوردی اما کارت را رامیاندازه

procedure TForm1.RichEdit1Change(Sender: TObject);
var
ScrollLine : Integer;
begin
ScrollLine :=RichEdit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0 );
if ScrollLine<>0 then
keybd_event(VK_BACK,0,0,0);
end;
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
RichEdit1.SelStart:=length(RichEdit1.Text);
end;

choghok
یک شنبه 07 آذر 1389, 15:53 عصر
به نام خدا ...

مرسی از کد خوبتون ، کار رو راه می اندازه

اما من یک چیز دیگه پیدا کردم و اون هم کدی که می تونه ببینه اسکرول بار ریچ ادیت قابل رویته یا نه و با استفاده از اون میشه محدودیت ایجاد کرد :


var
SBI: TSCrollbarinfo;
begin
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(RichEdit1.Handle, OBJID_HSCROLL, SBI));
if (SBI.rgstate[0] and
(STATE_SYSTEM_UNAVAILABLE or STATE_SYSTEM_INVISIBLE))
= STATE_SYSTEM_INVISIBLE
then
ShowMessage('Scrollbar invisible.');

همچنین نهایتا تونستم کدی رو بنویسم که یه جورایی مثل پاور پوینت با توجه به حجم متن سایز فونت رو تغییر بده مثلا اگر مقدار متن زیاد شد فونت سایزش کاهش پیدا کنه و در صورتی که حجم متن کم بود سایزش افزایش پیدا کنه. برای اینکار یک ریچ ادیت دیگه ( rchTEMP )در کنارش ایجاد کردم و visible اون رو false کردم.

در رویداد change اون نوشتم :


var ScrollLine : Integer;
SBI: TSCrollbarinfo;
begin
if Trim(TRichEdit(sender).Lines.Text) = '' then begin
TRichEdit(sender).Font.Size := rchTEMP.Font.Size ;
end;

CopyRichText(TRichEdit(sender) , rchTEMP);
if blblbl = False then begin
rchTEMP.Font := TRichEdit(sender).Font ;
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
while not((SBI.rgstate[0] and (STATE_SYSTEM_UNAVAILABLE or STATE_SYSTEM_INVISIBLE))
= STATE_SYSTEM_INVISIBLE ) do begin
rchTEMP.Font.Size := rchTEMP.Font.Size -1 ;
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
end ;
CopyRichText(rchTEMP , TRichEdit(sender) );
TRichEdit(sender).SelStart:=length(TRichEdit(sende r).Text);
end ;

و در رویداد keyPress اون این کد رو قرار دادم :


var ScrollLine,i : Integer;
SBI: TSCrollbarinfo;
begin
blblbl := False ;
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
if (ord(key) = 8) then blblbl := True ;
if (ord(key) = 8) and ((SBI.rgstate[0] and (STATE_SYSTEM_UNAVAILABLE or STATE_SYSTEM_INVISIBLE))
= STATE_SYSTEM_INVISIBLE ) then begin
rchTEMP.Font.Size := rchTEMP.Font.Size +1 ;
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
if not((SBI.rgstate[0] and (STATE_SYSTEM_UNAVAILABLE or STATE_SYSTEM_INVISIBLE))
= STATE_SYSTEM_INVISIBLE ) then begin
TRichEdit(Sender).Font.Size := TRichEdit(Sender).Font.Size +1 ;
end else begin
CopyRichText(TRichEdit(sender) , rchTEMP ) ;
end;
end;

FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
while not((SBI.rgstate[0] and (STATE_SYSTEM_UNAVAILABLE or STATE_SYSTEM_INVISIBLE))
= STATE_SYSTEM_INVISIBLE ) do begin
rchTEMP.Font.Size := rchTEMP.Font.Size -1 ;
FillChar(SBI, Sizeof(SBI), 0 );
SBI.cbSize := Sizeof(SBI);
Win32Check(GetScrollBarInfo(rchTEMP.Handle, OBJID_VSCROLL, SBI));
blblbl2 := True ;
end ;
if blblbl2 then begin
CopyRichText(rchTEMP , TRichEdit(sender) );
end ;
TRichEdit(sender).SelStart:=length(TRichEdit(sende r).Text);

خوشحال میشم ایرادات کار منو بهم بگین.
مرسی