PDA

View Full Version : هایلات نمودن کلمات



khoshblagh
یک شنبه 11 مهر 1389, 09:02 صبح
با سلام خدمت دوستان
میخواهم کلمات خاصی را در یک ممو به صورت هایلات نمایش دهم. در سایت گشتم ولی نمونه ای نیافتم . در صورت امکان نمونه کد ارائه نمایید. متشکرم

alinikaein
یک شنبه 11 مهر 1389, 09:14 صبح
فكر مي‌كنم بايد از TRichEdit استفاده كنيد.

البته چند وقت پيش دوستان در مورد اچ‌تي‌ام‌ال هم صحبت مي‌كردند، مي‌تونيد از اين روش هم استفاده كنيد.

يا علي... موفق باشيد...

devil00x
یک شنبه 11 مهر 1389, 09:52 صبح
با TRichEdit کلمات خاصی را نمایش

const maxword=3;
MyWords:array[1..maxword]=('word1','word2','word3');

function PosNext(subS,S: string; index:Integer): Integer;
var str1:string;
begin
str1:=Copy(S,index,Length(S)-(index-1));
if Pos(subS,str1)=0 then PosIndex:=0
else PosIndex:=Pos(subS,str1)+(index-1);
end;

procedure Form1.SelectAllKeywords;
var i:integer;
pos1,pos2:integer;
begin
for i:=1 to maxword do begin
pos2:=1;
pos1:=PosNext(MyWords[i],RichEdit1.Text,pos2);
while pos1<>0 do
begin
RichEdit1.SelStart:=pos1;
RichEdit1.SelLength:=Length(MyWords[i]);
RichEdit1.SelAttributes.Style:=[fsBold];
pos2:=pos1+1;
pos1:=PosNext(MyWords[i],RichEdit1.Text,pos2);
end;
end;
end;

vcldeveloper
یک شنبه 11 مهر 1389, 10:57 صبح
می تونید از RichEdit استفاده کنید. اگر منظور از Highlight این هست که پس زمینه بخشی از متن رنگش عوض بشه، باید کدی مثل این بنویسید:


uses RichEdit;

procedure SetSelectedTextHighlight(RichEdit: TRichEdit; Color: TColor);
var
ChrFormat : CHARFORMAT2;
begin
FillChar(ChrFormat,SizeOf(ChrFormat),0);
ChrFormat.dwMask := CFM_BACKCOLOR;
ChrFormat.crBackColor := Color;
ChrFormat.cbSize := SizeOf(chrFormat);
RichEdit.Perform(EM_SETCHARFORMAT,SCF_SELECTION,@C hrFormat);
end;

مثال:


SetSelectedTextHighlight(RichEdit1, clYellow);
این کد، پس زمینه متن انتخاب شده در RichEdit1 را زرد میکنه.

khoshblagh
یک شنبه 11 مهر 1389, 11:24 صبح
با تشکر
منظور من این است که در یک متن فرضا تمام کلمات مشتری به یک رنگ دیگر فرضا فرمز نمایش داده شود.متشکرم

tdkhakpur
یک شنبه 11 مهر 1389, 13:22 عصر
تقریبا یه چیزی مثل این میشه


procedure SetColor(ritchEdit:TRichEdit; text:AnsiString);
var
TotalLenght, counter, c, i : integer;
tmp : AnsiString;
begin
TotalLenght := 0;
counter := 0;
for i:=0 to ritchEdit.Lines.Count-1 do
begin
tmp := ritchEdit.Lines[i];
while Length(tmp)<>0 do
begin
c := Pos(text, tmp)-1;
if c<>-1 then
begin
ritchEdit.SelStart := counter+c;
ritchEdit.SelLength := Length(text);
ritchEdit.SelAttributes.Color := clRed;
ritchEdit.SelAttributes.Style := [fsBold];
ritchEdit.SelLength := 0;
counter := counter+c+Length(text);
delete(tmp, 1, c+Length(text));
end
else
break;
end;
TotalLenght := TotalLenght+Length(ritchEdit.Lines[i]);
counter := TotalLenght + (i+1)*2;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetColor(RichEdit1, 'مشتري');
end;

khoshblagh
یک شنبه 11 مهر 1389, 14:07 عصر
جناب خاکپور
با تشکر از کد ارسالی . من از dbrichEdit رایز استفاده میکنم. کد شما مناسب برای آن نیست . آیا راهی هست که بتوان از آن کد در کامپوننت رایز استفاده نمود؟ متشکرم

tdkhakpur
یک شنبه 11 مهر 1389, 17:13 عصر
من از dbrichEdit رایز استفاده میکنم
آیا راهی هست که بتوان از آن کد در کامپوننت رایز استفاده نمود؟

کامپوننتی به این اسم که اشاره کردید استفاده نکردم ولی استاندارد دلفی این کامپوننت را داره میتونید فقط داخل کد بالا اسم کلاس رو تغییر بدید.به نظرم کنترل db تفاوتی با کنترل عادی در نمایش نداشته باشه.


procedure SetColor(ritchEdit:TdbRichEdit; text:AnsiString);

alinikaein
یک شنبه 11 مهر 1389, 17:57 عصر
براي اين كار همچنين مي‌تونيد از كامپوننت‌هاي Syntax Highlighter هم استفاده كنيد.

احتمالاً اگه داخل سايت و حتي گوگل به دنبال عبارت Syntax Highlight بگرديد، نتايج خوبي به دست مياريد.

يا علي... موفق باشيد...

MOJTABAATEFEH
یک شنبه 11 مهر 1389, 19:46 عصر
می تونید از RichEdit استفاده کنید. اگر منظور از Highlight این هست که پس زمینه بخشی از متن رنگش عوض بشه، باید کدی مثل این بنویسید:


uses RichEdit;

procedure SetSelectedTextHighlight(RichEdit: TRichEdit; Color: TColor);
var
ChrFormat : CHARFORMAT2;
begin
FillChar(ChrFormat,SizeOf(ChrFormat),0);
ChrFormat.dwMask := CFM_BACKCOLOR;
ChrFormat.crBackColor := Color;
ChrFormat.cbSize := SizeOf(chrFormat);
RichEdit.Perform(EM_SETCHARFORMAT,SCF_SELECTION,@C hrFormat);
end;مثال:


SetSelectedTextHighlight(RichEdit1, clYellow);این کد، پس زمینه متن انتخاب شده در RichEdit1 را زرد میکنه.

جناب کشاورز این کد خطای کامپایل زیر رو برای آخر می گیره:

Incompatible types : integer and pointer


با تشکر

Felony
یک شنبه 11 مهر 1389, 19:57 عصر
جناب کشاورز این کد خطای کامپایل زیر رو برای آخر می گیره:

Incompatible types : integer and pointer


با تشکر



کد مشکلی نداره ، و درست کار میکنه .

کد زیر رو هم من قبلا نوشته بودم که قابلیت تعیین رنگ و استایل فونت متن مورد نظر رو داره :

Procedure SetColor(Const Richedit: TRichEdit; Const Text: string; Const Color: TColor; Const Style: TFontStyles);
var
FromPos,Siz: Integer;
begin
Siz := Length(Richedit.Text);
FromPos := 0;
while (FromPos>=0) do
begin
FromPos:= Richedit.FindText(Text, FromPos, Siz, []);
if FromPos>=0 then
begin
Richedit.SelStart:= FromPos;
Richedit.SelLength:= Length(Text);
Richedit.SelAttributes.Color := Color;
Richedit.SelAttributes.Style:= Style;
Richedit.SelLength:= 0;
Inc(FromPos);
end;
end;
// Normalize rich edit style & set cursor pos to current pos
Richedit.SelStart:= Length(Richedit.Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
end;

استفاده :
SetColor(Richedit1, 'Sample Text', clRed, [fsBold]);

tdkhakpur
یک شنبه 11 مهر 1389, 20:17 عصر
این کد خطای کامپایل زیر رو برای آخر می گیره:


احتمالا خط آخر باشه - به شکل زیر رفع کنید.


RichEdit.Perform(EM_SETCHARFORMAT,SCF_SELECTION,in teger(@ChrFormat));

khoshblagh
سه شنبه 13 مهر 1389, 09:15 صبح
با تشکر از دوستان
با راهنمای دوستان مسئله تا حدودی حل شد . مشکل فعلی این است که بعضی وقتها کلمات مورد نظر درست هایلات میشوند ولی بعضی وقتها قستمی از کلمات بعدی که مورد نظر نیست هایلات میشوند. کسی علت آنرا میداند؟ متشکرم

Felony
سه شنبه 13 مهر 1389, 09:25 صبح
با تشکر از دوستان
با راهنمای دوستان مسئله تا حدودی حل شد . مشکل فعلی این است که بعضی وقتها کلمات مورد نظر درست هایلات میشوند ولی بعضی وقتها قستمی از کلمات بعدی که مورد نظر نیست هایلات میشوند. کسی علت آنرا میداند؟ متشکرم

با کدوم کد ؟
یه نمونه برنامه بزارید که همین مشکل رو داشته باشه .

khoshblagh
سه شنبه 13 مهر 1389, 10:05 صبح
با کدوم کد ؟
یه نمونه برنامه بزارید که همین مشکل رو داشته باشه .
با تشکر
از پست شماره 6 استفاده کردم.

Felony
سه شنبه 13 مهر 1389, 10:45 صبح
از کدی که تو پست 11 قرار دادم استفاده کنید .

khoshblagh
سه شنبه 13 مهر 1389, 11:28 صبح
از کدی که تو پست 11 قرار دادم استفاده کنید .
با تشکر از جناب تاجیک
مشکل کاملا حل شد.
حالا اگر به خواهم هایلات کلمه قبلی خنثی و کلمه جدیدی را هایلات نمایم چه تغییری در کد مورد نیاز میباشد؟ متشکرم

Felony
سه شنبه 13 مهر 1389, 15:34 عصر
با تشکر از جناب تاجیک
مشکل کاملا حل شد.
حالا اگر به خواهم هایلات کلمه قبلی خنثی و کلمه جدیدی را هایلات نمایم چه تغییری در کد مورد نیاز میباشد؟ متشکرم

این که همش سوال شد ، یکم هم خودتون وقت بزارید ، کافی بود 2 تا تغییر کوچیک تو همون کد قبلی که گزاشته بودم بدید :

Procedure CancelAll(RichEdit: TRichEdit; Const Text: String);
var
FromPos,Siz: Integer;
begin
Siz := Length(Richedit.Text);
FromPos := 0;
while (FromPos>=0) do
begin
FromPos:= Richedit.FindText(Text, FromPos, Siz, []);
if FromPos>=0 then
begin
Richedit.SelStart:= FromPos;
Richedit.SelLength:= Length(Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
Richedit.SelLength:= 0;
Inc(FromPos);
end;
end;
// Normalize rich edit style & set cursor pos to current pos
Richedit.SelStart:= Length(Richedit.Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
end;