PDA

View Full Version : بعضی از کلمات یک متن رنگی شود و شماره خط نیز زده شود



mahdy.asia
دوشنبه 16 مرداد 1391, 17:34 عصر
من می خواهم بدون استفاده از کامپوننت (با استفاده از کامپوننت های دلفی) کدهای دلفی رو مثل ویرایشگر دلفی به کاربر نمایش بدهم از چه کامپوننت استفاده کنم و چه کدی رو بنویسم (جهت تولید نرم افزار بانک کد)
مطابق تصویر پیوست شده
تذکر : نمی خواهم از کامپوننت های غیر استفاده نمایم

Felony
دوشنبه 16 مرداد 1391, 19:19 عصر
پروژه ضمیمه حاوی روالی هست که چند سال پیش برای پروژه ای نوشتم ، یادم نیست که مشکلی داره یا نه ولی تا جایی که یادمه درست بود .

me.enik
سه شنبه 17 مرداد 1391, 11:03 صبح
پروژه ضمیمه حاوی روالی هست که چند سال پیش برای پروژه ای نوشتم ، یادم نیست که مشکلی داره یا نه ولی تا جایی که یادمه درست بود .
میشه یه توضیح کوتاهی هم درباره نحوه استفاده از این برنامه رو بگید؟
من تست کردم, ولی نشد.
احتمالا من اشتباه کار کردم, برای همین هم نحوه استفاده را خواستم.
ممنون میشوم.

Felony
سه شنبه 17 مرداد 1391, 11:29 صبح
در حال حاظر کلمات Procedure , refresh , test , count رزرو شده هستند ، با وارد کردن این کلمات هر کدوم به استایل تعیین شده تو کد در میان :

SetColor(RichEdit1,'procedure',clBlue,[fsBold, fsItalic]);
SetColor(RichEdit1,'refresh',clRed,[fsBold]);
SetColor(RichEdit1,'test',clGreen);
SetColor(RichEdit1,'count',clPurple);

پارامتر اول نام Richedit مورد نظر ، پارامتر دوم کلمه مورد نظر ، پارامتر سوم رنگ مورد نظر و پارامتر چهارم استایل مورد نظر هست .

mahdy.asia
سه شنبه 17 مرداد 1391, 13:14 عصر
برنامه شما رو با دلفی 2010 باز کردم یونیت AdvMemo در آن Use شده بود حذف کردم برنامه بدون مشکل اجرا شد
متشکرم در مورد شماره خط چه نظری دارید؟
من می خواهم شماره خط هم داشته باشه

Felony
سه شنبه 17 مرداد 1391, 13:40 عصر
متشکرم در مورد شماره خط چه نظری دارید؟
برای اون هم میتونید از یک شیئی که Canvas داره در کنار شئ Richedit استفاده کنید و به تعداد خطوط Richedit روش شماره خط رو ترسیم کنید و برای اینکه اندازه های یکسانی داشته باشید سایز فونت مورد استفاده برای ترسیم رو با فونت مورد استفاده Richedit یکی کنید و ... ؛ کارهای مختلفی میشه برای این مورد انجام داد .

کمی محاسبات نیاز داره و من وقتش رو ندارم براتون نمونه بنویسم .

mbshareat
سه شنبه 17 مرداد 1391, 14:01 عصر
سلام
من فکر کنم دو ساعتی وقت گذاشتم.به یه جایی رسوندمش(ما فوق تصور!)
البته شماره خط رو کاری نکردم و احتمالا می تونین از یه edit کنار RichEdit استفاده کنین و توش عدد بریزین و یه اسکرول بار کنارشون بذارین و به روشی که آقا ماهان قبلا کد گذاشته بودن با اسکرول بار، ادیت و RichEdit رو با هم پیمایش کنین.کد ایشون در مورد دوتا Memo بود که براتون مکیذارم.
بریم سر بحث اصلی.من کد رنگی کردن متن رو قبلا برداشته بودم و فکر کنم کار خود استاد ماهان عزیز بوده.
کاری که شما می تونین انجام بدین که برنامه تکمیل بشه نوشتن کد برای تنظیم تو رفتگی متن هست که البته به نظر من وقتتون رو برای شماره خط و تورفتگی حروم نکنین. من زیادی بیکار بودم و عاشق رنگ پردازی!
این هم دو تا برنامه که صحبتشو کردم:
(یه سوتی دادم: این جمله تو کد برنامه درست نیست و طبق روش نادرست قدیمم بوده!:

//باشد تا حرف بزرگ درست باشد For بايد قبل از Or)

fahimi
سه شنبه 17 مرداد 1391, 22:03 عصر
با سلام
امکان این وجود دارد خروجی فیلتر یا جستجو در تیبل بصورت های لایت در دبی گیرید نمایش داده شود .
مانند کاری جناب mbsharea در نمونه SmallSearchQuran انجام داده است

mahdy.asia
سه شنبه 17 مرداد 1391, 23:44 عصر
امکان این وجود دارد خروجی فیلتر یا جستجو در تیبل بصورت های لایت در دبی گیرید نمایش داده شود .
مانند کاری جناب mbsharea در نمونه SmallSearchQuran انجام داده است
لینک مورد اشاره را بگذارید یا بیشتر توضیح دهید من که نفهمیدم منظورتون چیه

mbshareat
چهارشنبه 18 مرداد 1391, 04:45 صبح
سلام
فعلا حوصلشو ندارم یه برنامه رو از صفر شروع کنم.
به ذهنم رسید که ایده کلی رو توضیح بدم یک کم پیش رفتم دیدم هم توضیحش سخته هم فهمش(مثل راهنمای برنامه کاریم که بعضی وقتها خودم در درکش میمونم!!)
اگه همین روش کار برنامه فوق رو یه نگاه بندازین یه چیزهایی گیرتون میاد. در حال عادی برای به عهده گرفتن ترسیم در دی بی گرید باید از DrawCell مربوط به این کامپوننت استفاده کرد. اما در این مورد میتونین دو حلقه تو در تو داشته باشین که شماره سطر و ستون تک تک سلولها رو در اون به یه پرو سیجر بدین که در Canvas دی بی گرید در ناحیه CellRect مربوطه رشته رو ترسیم کنه.
می تونین توی رشته کارکتر ثابتی (مثلا '^') رو برای مشخص کردن ابتدا و انتهای عبارت رنگی به دو طرفش اضافه کنین (اگه عبارت رنگی کاملا مجزا از طرفین باشه با StringReplace) و با PosEx تکه تکه بخشهای رنگی و غیر های لایت رو مشخص کنین و بدون او کارکتر زائد(با اعمال Delete روی تکه رشته بدست اومده) با TextOut در Canvas ترسیم کنین.
این ایده کلی کار بود. اگه تازه کار هستین و متوجه نشدین هم اشکالی نداره. فقط خواستم یه کمک ساده کرده باشم که از هیچی بهتر باشه.

fahimi
چهارشنبه 18 مرداد 1391, 14:33 عصر
لینک مورد اشاره را بگذارید یا بیشتر توضیح دهید من که نفهمیدم منظورتون چیه
برای مثال کوئری زیر تمام رکوردهی فیلد name را که نام آن علی است را برمی گرداند
1-علی حسنی
2-حسین محمدی
3-علی جمالی
5-محمد محسنی
%'علی '% select * from Person where Name like
1-علی حسنی
2-علی جمالی
من میخواهم رنگ فونت علی در تمام رکورد ها عوض شود

mahdy.asia
پنج شنبه 19 مرداد 1391, 08:37 صبح
مطلب مطرح شده از طرف شما به این تاپیک مربوط نمی شود در صورت نیاز به ادامه بحث در این مورد یک تاپیک ایجاد نمایید

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataSource1.DataSet.RecNo > 0 then
begin
if DataSource1.DataSet.FindField('name') <> nil then
if pos('علی',MTBI_DataSource1.DataSet.FieldValues['name']) > 0 then
DBGrid1.Canvas.Brush.Color:=clInactiveBorder ;
end;

DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column, State);
end;

fahimi
پنج شنبه 19 مرداد 1391, 17:19 عصر
با سلام چون عنوان تاپیک[/U]بعضی از کلمات یک متن رنگی شود و شماره خط نیز زده شود[U] بود بحث رنگی کردن کلمات بود بخاطر جلوگیری از پراکندگی مطالب به نظرم رسید که بحث رنگی dbgrid را هم در این جا ادامه پیدا کند هر چند که در ظاهر در بخش بانک های اطلاعاتی در Delphi می باید بود


اما در مورد کد جنابعالی ردیفی که کلمه در آن است رنگ میشود. در حالیکه منظور من فقط خود کلمه بود --مانند محمد علی حسینی
در ضمن نمونه کار جناب آقای mbshareat در مورد جستجو در متن قرآن
http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A/page8

mbshareat
پنج شنبه 19 مرداد 1391, 22:44 عصر
سلام
مثل اینکه خیلی جدی هستین.
من باز هم روش کار کردم یه برنامه براتون میذارم که در صورتیکه تمام متن شما فارسی باشه و بخواید قسمتی از اون رو رنگی کنین این کار رو انجام میده.
اگه ترکیبی از فارسی و عدد و نقطه و لاتین دارین میتونین کلمات رو توی آرایه بریزین و کلمات رو بررسی کنین که وقتی یک یا چند کلمه بعد همون عبارت شما بود رنگی کنین و الا با رنگ معمولی بنویسین.(سر بسته گفتم. من عادت ندارم مفصل توضیح بدم)
برای اینکه محل نوشته شدن متن رو بدست بیارین از CellRect[].Right , CellRect[].Top استفاده کنین و BidiMode رو روی راست چین تنظیم کنین.
کدی که براتون گذاشتم هم روی فرم امتحان کردم هم توی StringGrid نوشتم. تاحالا هیچوقت با DB کار نکردم ؛ خودتون امتحان کنین.

fahimi
جمعه 20 مرداد 1391, 12:50 عصر
من دلفی 2010 استفاده میکنم -pchar را تبدیل PAnsiChar یا PWideChar کردم ولی موفق به رفع خطا نشد

بهروز عباسی
یک شنبه 22 مرداد 1391, 14:22 عصر
در حال حاظر کلمات Procedure , refresh , test , count رزرو شده هستند ، با وارد کردن این کلمات هر کدوم به استایل تعیین شده تو کد در میان :

SetColor(RichEdit1,'procedure',clBlue,[fsBold, fsItalic]);
SetColor(RichEdit1,'refresh',clRed,[fsBold]);
SetColor(RichEdit1,'test',clGreen);
SetColor(RichEdit1,'count',clPurple);

پارامتر اول نام Richedit مورد نظر ، پارامتر دوم کلمه مورد نظر ، پارامتر سوم رنگ مورد نظر و پارامتر چهارم استایل مورد نظر هست .

درود به همه
در این روش که جناب Mahan گفتن به نظر من کمی حجم کد نویسی زیاد میشه (برای هر کلمه ...)
من کمی کد نوشته بودم که تابع اصلی برنامه رو هم فکر کنم آقا Mahan نوشته باشه(یادم نیست) امید وارم مفید باشه
unit Unit2;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
TForm2 = class(TForm)
RichEdit1: TRichEdit;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
uses
RichEdit;
{$R *.dfm}
type
TArrayKey = array [0 .. 23] of string;
var
arrKey: TArrayKey = ('begin', 'type', 'string', 'of', 'array', 'var',
'Procedure', 'Const', 'while', 'do', 'if', 'then', 'end;', ';', 'end.',
'implementation', 'uses', '(', ')', 'class', 'private', 'public', 'unit',
'interface');
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;
RichEdit.SelStart := Length(RichEdit.Text);
RichEdit.SelAttributes.Color := clBlack;
RichEdit.SelAttributes.Style := [];
end;

procedure TForm2.Button2Click(Sender: TObject);
var
I, j: Integer;
begin

for I := 0 to High(arrKey) do
begin
SetColor(RichEdit1, arrKey[I], clBlue, [fsBold]);
end;

end;

end.

بهروز عباسی
یک شنبه 22 مرداد 1391, 15:40 عصر
یه نگاه به ایــــــــــــن (http://www.delphisources.ru/pages/sources/raznoe/2006_year/pascal_editor.html)هم بنداز جالبه و البته کاربردی (سورسش هم موجوده)

موفق باشید.

Felony
یک شنبه 22 مرداد 1391, 17:50 عصر
در این روش که جناب Mahan گفتن به نظر من کمی حجم کد نویسی زیاد میشه (برای هر کلمه ...)
اگر قرار باشه کلمات مختلف رو رنگ مختلف یا استایل متفاوتی بدیم چی ؟ ادیتور مگه یک استایل و یک رنگ ثابت برای همه کلمات کلیدی در نظر میگیره ؟

mahdy.asia
یک شنبه 22 مرداد 1391, 18:56 عصر
یه نگاه به ایــــــــــــن (http://www.delphisources.ru/pages/sources/raznoe/2006_year/pascal_editor.html)هم بنداز جالبه و البته کاربردی (سورسش هم موجوده)
سورس خوبی بود اما دوست داشتم Comment انگلیسی داشت که می تونستم از کد هاش بیشتر سر در بیارم و یک کم ساده تر هم باشه که من بتونم خودم امکانات اونو افزایش بدم و یا تغییرات مورد نظرم رو روش اعمال کنم مثلا اگه ویرایشگر اسکیوال هم لازم داشتم بتونم از اون استفاده کنم

بهروز عباسی
دوشنبه 23 مرداد 1391, 09:06 صبح
درود به همه

اگر قرار باشه کلمات مختلف رو رنگ مختلف یا استایل متفاوتی بدیم چی ؟ ادیتور مگه یک استایل و یک رنگ ثابت برای همه کلمات کلیدی در نظر میگیره ؟
حق با شماست.

سورس خوبی بود اما دوست داشتم Comment انگلیسی داشت که می تونستم از کد هاش بیشتر سر در بیارم و یک کم ساده تر هم باشه که من بتونم خودم امکانات اونو افزایش بدم و یا تغییرات مورد نظرم رو روش اعمال کنم مثلا اگه ویرایشگر اسکیوال هم لازم داشتم بتونم از اون استفاده کنم
توی همون سایت کلمه Syntax رو جستجو کنید یک مثال ساده ولی خوب هستش.
http://www.delphisources.ru/pages/sources/raznoe/2011-year/syntax-highlighting-delphi.html

پیشنهاد:اگه قراره فقط کد رو با سبک و رنگ خاصی نشون بدید می تونید از نسخه مخصوص وب syntaxhighlighter (که از CSS استفاده می کنه) درون یک کنترل وب بروزر استفاده کنید.
موفق باشید

mahdy.asia
دوشنبه 23 مرداد 1391, 17:33 عصر
الان با کمک دوستان کد درخواست شده کامل شد تنها زدن شماره خط کنار کد مونده که نیاز است طوری این شماره خط ها زده شود که مثل همین سایت وقتی کد ها را در تگ کد می نویسیم کنار کدها شماره خط می زند و از قسمت کد نیز جدا شده است طوری که اگر کدها را کپی کنیم شماره خط کپی نمی شود و باعث تخریب کد نمی گردد

mbshareat
دوشنبه 23 مرداد 1391, 20:57 عصر
سلام
این برنامه شماره کد هم گزارش میکنه. فقط یه سوال دارم: چرا وقتی Enabled مربوط به RichEdit شماره سطر رو که False می کنم رنگ پس زمینش خاکستری میشه؟
91222

mahdy.asia
سه شنبه 24 مرداد 1391, 16:08 عصر
چرا وقتی Enabled مربوط به RichEdit شماره سطر رو که False می کنم رنگ پس زمینش خاکستری میشه؟ اینکه رنگ اون خاکستری می شه یک امکان برای تشخیص کامپوننت های غیر فعال از کامپوننت های فعال می باشد و شما می توانید بجای False کردن Enable خاصیت Read-only را True نمایید تا هم رنگ آن خاکستری نشود هم اینکه به
اهداف خود برسید.
اگر خواسته باشیم CodeRichEdit خاصیت Enable آن True شود و با کلید PageDown یا Scroll ماوس بتوانیم آن را اسکرول کنیم و همزمان با آن RichEdit شماره خط ها هم اسکرول شود طوری که تصور شود این دو به هم متصل می باشند چه باید بکنیم ؟
پیشنهاد می کنم جهت لیست کردن کلمات کلیدی از فایل استفاده کنید تا بتونید بدون تغییر در برنامه اجرایی کلمات کلیدی را افزایش یا کاهش بدهید و شماره خط ها رو هم وسط چین کنید

mbshareat
چهارشنبه 25 مرداد 1391, 16:18 عصر
من یه بار LineNoRichEdit رو حذف کردم و یک RichEdit جدید با همین نام روی فرم گذاشتم مشکل رنگ LineNoRichEdit حل شد!!؟
اما دکمه برای Enabled کردن CodeRichEdit گذاشتم وقتی Enabled رو false می کنم خاکستری میشه!
کار با ReadOnly هم مشکل عدم هماهنگی کد با شماره سطر رو به همراه داره
اگر خواسته باشیم CodeRichEdit خاصیت Enable آن True شود و با کلید PageDown یا Scroll ماوس بتوانیم آن را اسکرول کنیم و همزمان با آن RichEdit شماره خط ها هم اسکرول شود طوری که تصور شود این دو به هم متصل می باشند چه باید بکنیم ؟
این مساله کمی پیچیده است. من راهش رو بلد نیستم.نمی دونم چطور باید برنامه متوجه بشه که مکان نما به سطر دیگه ای رفته.
پیشنهاد می کنم جهت لیست کردن کلمات کلیدی از فایل استفاده کنید تا بتونید بدون تغییر در برنامه اجرایی کلمات کلیدی را افزایش یا کاهش بدهید و شماره خط ها رو هم وسط چین کنید
این کار رو انجام دادم. اگه کنار برنامه فایل Words.txt باشه رشته های تعریف شده در کد رو نادیده میگیره و از فایل میخونه.

mbshareat
چهارشنبه 25 مرداد 1391, 16:20 عصر
من یه بار LineNoRichEdit رو حذف کردم و یک RichEdit جدید با همین نام روی فرم گذاشتم مشکل رنگ LineNoRichEdit حل شد!!؟
اما دکمه برای Enabled کردن CodeRichEdit گذاشتم وقتی Enabled رو false می کنم خاکستری میشه!
کار با ReadOnly هم مشکل عدم هماهنگی کد با شماره سطر رو به همراه داره

اگر خواسته باشیم CodeRichEdit خاصیت Enable آن True شود و با کلید PageDown یا Scroll ماوس بتوانیم آن را اسکرول کنیم و همزمان با آن RichEdit شماره خط ها هم اسکرول شود طوری که تصور شود این دو به هم متصل می باشند چه باید بکنیم ؟
این مساله کمی پیچیده است. من راهش رو بلد نیستم.نمی دونم چطور باید برنامه متوجه بشه که مکان نما به سطر دیگه ای رفته.

پیشنهاد می کنم جهت لیست کردن کلمات کلیدی از فایل استفاده کنید تا بتونید بدون تغییر در برنامه اجرایی کلمات کلیدی را افزایش یا کاهش بدهید و شماره خط ها رو هم وسط چین کنید
این کار رو انجام دادم. اگه کنار برنامه فایل Words.txt باشه رشته های تعریف شده در کد رو نادیده میگیره و از فایل میخونه.
متاسفانه من همونطور که جناب تاجیک فرمودند شبه برنامه نویس هستم!

mbshareat
چهارشنبه 25 مرداد 1391, 16:42 عصر
با این کد فقط میشه نوار لغزنده رو تنظیم کرد:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
CodeScrollBar.Position:=CodeRichEdit.Perform(EM_GE TFIRSTVISIBLELINE,0,0);
end;

mahdy.asia
پنج شنبه 26 مرداد 1391, 18:37 عصر
با این کد فقط میشه نوار لغزنده رو تنظیم کرد:

CodeScrollBar.Position:=CodeRichEdit.Perform(EM_GE TFIRSTVISIBLELINE,0,0);
این کد رو چرا توی تایمر بزاری توی KeyPress کامپوننت rich edit نمی تونی بزاری ؟

mbshareat
پنج شنبه 26 مرداد 1391, 22:20 عصر
سلام بر رفقای عزیز

این کد رو چرا توی تایمر بزاری توی KeyPress کامپوننت rich edit نمی تونی بزاری ؟
با کشیدن ماوس و بدون کلید هم میشه متن رو انتخاب کرد.
این کد تکمیل شده هستش. امیدوارم ایرادی نداشته باشه و تمام نیازها رو برآورده کنه.
من یه سری کد نمونه هم دارم که بیشترسو از همین سایت بدست اوردم. اونها رو هم میذارم؛ شاید به درد کسی خورد:

mahdy.asia
جمعه 27 مرداد 1391, 05:50 صبح
خیلی زحمت کشیدید با این نیت که بتونید برنامه تون رو کامل تر کنیدچند تا پیشنهاد داشتم


اسکرول ماوس توی برنامه تون کار نمی کنه
قسمتی که شماره خط رو نشون می ده بهتره gradient color داشته باشه تا فرم زیباتر بشه
rich edit قابلیت ویرایش داشته باشه اما بتونیم با دابل کلیک روی کلمه یا خط اون خط یا کلمه رو انتخاب کنیم
امکان جسجو و replace هم داشته باشه

mbshareat
جمعه 27 مرداد 1391, 09:40 صبح
سلام
همونطور که گفتم من هم چیز زیادی بلد نیستم.
با این حال یک کم روش کار کردم.
اگه دوست داشتین خودتون هم روش کار کنین.مثلا رنگ پردازی شماره سطر رو با توجه به کد رنگی کردن متن RichEdit پیاده سازی کنین.
یه مشکل هم دارم که دلیلشو نمی دونم. نمی دونم چرا وقتی ماوس روی شماره سطرهاست کار نمی کنه.
یعنی هندل پنجره زیر ماوس با هندل LineNoRichEdit یکی نیست!!!!؟؟؟؟
امیدوارم حرفه ایها هم به این تاپیک توجه کنن؛ کم کم دارم به این نتیجه می رسم که بحث فقط بین من و شماست!
لطفا شما هم توی کد دست ببرید و باهاش بازی کنید تا یه چیزایی دستتون بیاد.
این هم برنامه یک کم! اصلاح شده:

mahdy.asia
چهارشنبه 01 شهریور 1391, 09:47 صبح
این تاپیک شاید کسی وقت جهت مشارکت نداشته اما بازدید کننده زیاد داشته و به نظر من تاپیک کاملی راجب موضوع مورد بحث می باشد از شما خواهش می کنم اگر در کامل شدن این تاپیک می تونید نقش بیشتری ایفا نمایید دریغ نکنید بهر حال شما توانمندی اینکار رو دارید اما من بیشتر توانستم مستمع باشم