View Full Version : سوال: راست به چپ کردن هینت کنترلها
Mask
دوشنبه 01 خرداد 1391, 20:08 عصر
با سلام.
کنترلهام دارای هینت فارسیند.
میخاستم ببینم چطوری باید از راست به چپ بشوند.
حتی constructor کلاس THintWindow رو هم override کردم و bidmode هینت رو هم راست به چپ گزاشتم بازم نشد.
ممنون از پاسختون.
mbshareat
سه شنبه 02 خرداد 1391, 09:58 صبح
سلام
اگه دوست داشتین از هینت نوشته بنده استفاده کنین.
می تونین ظاهرش رو خودتون تغییر بدین .آدرس : این پست (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&p=1485828&viewfull=1#post1485828)
Mask
سه شنبه 02 خرداد 1391, 20:20 عصر
سلام دوست من.
هر چی ور رفتم به ابن یونیتت نتونستم هینت باتنم رو راست به چپ کنم.
اگه میشه یه نمونه بزاریدوپ.
ممنون.
mbshareat
سه شنبه 02 خرداد 1391, 20:43 عصر
سلام
هر چی ور رفتم به ابن یونیتت نتونستم هینت باتنم رو راست به چپ کنم.
منظورتون رو نمی فهمم. چون ColorHint در یونیتم اصالتا برای زبان فارسی طراحی شده.میگید نه این کد رو امتحان کنین:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
colorhint('طلا',200,clred);
end;
اگه خواستین هم می تونین از چنین کدی استفاده کنین:
Var
R:TRect;
begin
R:=Rect(10,10,100,100);
drawtext(Canvas.Handle,Pchar('ØáÇ'),-1,R,DT_RIGHT);
end;
فکر نمی کنم شما این کد رو بلد نباشین. فقط چون گفتین نتونستین راست به چپش کنین کدشو گذاشتم.در مجموع نفهمیدم مشکل کجاست چون DrawTextX یونیت MSGs نوشته من حتی انگلیسی رو هم از راست به چپ می نویسه!
این هم یونیت MSGs.pas که البته یک کم بهتر هم شده چون می تونین از تگ برای رنگ کردن پیغامهاتون هم استفاده کنین ( <R>: قرمز - <G>: سبز - <B>: آبی - <->: سیاه)
به لیست Uses استفاده کنین و با کد بالا امتحانش کنین:
saeed7007
سه شنبه 02 خرداد 1391, 20:45 عصر
THintWindow has its own BidiMode property, so it may be all you need is to create a TRightHintWindow class which sets BidiMode in the constructor and assign that class as Peter said, avoiding the paint stuff
Mask
سه شنبه 02 خرداد 1391, 21:12 عصر
سلام
منظورتون رو نمی فهمم. چون ColorHint در یونیتم اصالتا برای زبان فارسی طراحی شده.میگید نه این کد رو امتحان کنین:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
colorhint('طلا',200,clred);
end;
اگه خواستین هم می تونین از چنین کدی استفاده کنین:
Var
R:TRect;
begin
R:=Rect(10,10,100,100);
drawtext(Canvas.Handle,Pchar('ØáÇ'),-1,R,DT_RIGHT);
end;
فکر نمی کنم شما این کد رو بلد نباشین. فقط چون گفتین نتونستین راست به چپش کنین کدشو گذاشتم.در مجموع نفهمیدم مشکل کجاست چون DrawTextX یونیت MSGs نوشته من حتی انگلیسی رو هم از راست به چپ می نویسه!
این هم یونیت MSGs.pas که البته یک کم بهتر هم شده چون می تونین از تگ برای رنگ کردن پیغامهاتون هم استفاده کنین ( <R>: قرمز - <G>: سبز - <B>: آبی - <->: سیاه)
به لیست Uses استفاده کنین و با کد بالا امتحانش کنین:
ببینید دوست من.
من میخام وقتی موس رفت روی یه کنترل ،یه هینت که متنش فارسی و از راست به چپ هست از محل قرار گیری موس بر روی کنترل مورد نظر ، نمایش پیدا کنه.
اما این کد شما واسه خودش هر جا که شد یه هینت نمایش میده.
من میخام هینتم دقیقا زیر موسم نمایش پیدا کنه.
ببین دوست من کد من اینه :
procedure TForm1.FormCreate(Sender: TObject);
var sl:TStringList;
begin
sl:=TStringList.Create;
sl.Add('شماره فنی :');
sl.Add('ساعت ورود :');
sl.Add('نام مرکز تولید کننده و انشعاب دهنده ');
sl.Add('مرکز شماره :');
Button1.ShowHint:=True;
Button1.Hint:=sl.Text;
sl.Free;
end;
من میخام وقتی کاربر رفت رو باتن این متن از راست به چپ رو هینتش نمایش داده بشه.
ممنون.
ممنون.
mbshareat
چهارشنبه 03 خرداد 1391, 21:20 عصر
سلام
ببخشید دیر جواب میدم
این تصویر رو ببینیند:
87406
با این کد به این تصویر رسیدم:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ColorHint(Button1.Hint,300,clred);
end;
اما این کد شما واسه خودش هر جا که شد یه هینت نمایش میده.
منظورتون از هرجا چیه؟ این کد تعیین می کنه پنجره هینت کجا باشه:
procedure SetHintPos();
Var
L,T:Integer;
begin
L:=Mouse.CursorPos.X+15;
T:=Mouse.CursorPos.Y+15;
If (L+Form.Width)>Screen.Width Then
L:=Mouse.CursorPos.X-5-Form.Width;
If (T+Form.Height)>Screen.Height Then
T:=Mouse.CursorPos.Y-Form.Height;
Form.Left:=L;
Form.Top:=T;
end;
در هر صورت ساختار هینتی که ساختم اونقدر پیچیده نیست که کسی با سابقه شما برای درست کردنش مشکلی داشته باشه یه پنجره است که می تونین با DT_RTLREADING و DrawTextEx توش فارسی بنویسین و یه تایمر که چک می کنه ماوس روی کنترلی که وقتی هینت ظاهر شده ماوس روش بوده باقی مونده یا نه؟
راستش من بیشتر از این بلد نیستم. اگه کس دیگه هم می تونه کمک کنه بسم الله..
mbshareat
پنج شنبه 04 خرداد 1391, 10:31 صبح
سلام
اگه خواستین این کد رو برای رنگی کردن متن فارسی به کار ببرین:
procedure TForm1.FormCreate(Sender: TObject);
var
sl:TStringList;
begin
sl:=TStringList.Create;
sl.Add('<B>شماره فني :<->'+'123');
sl.Add('<G>ساعت ورود :<->'+'20:56');
sl.Add('<R>نام مرکز توليد کننده و انشعاب دهنده :<->'+'شرکت گاز!');
sl.Add('<B>مرکز شماره :<->'+'؟');
Button1.ShowHint:=False;
Button1.Hint:=sl.Text;
sl.Free;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ColorHint(Button1.Hint,300,clred);
end;
Mask
پنج شنبه 04 خرداد 1391, 11:13 صبح
ممنون دوست عزیز . خیلی کار جالبی بود . اینکه اعداد با حروف قارسی و انگلیسی در چند رنگ بود خیلی قشنگ و عالی بود.
فقط من از یونیت شما استفاده کردم.
نمیدونم چرا این هینتی رو که رسم میکنیم آپدیت نمیشه مقدارش.
کد زیر رو برای مثال و نمونه نوشتم.
یه نیگا بهش بکنید.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Msgs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
{ Public declarations }
end;
var
Form1: TForm1;
Img:array[1..2] of timage;
ListHint:TStringList;
Int1,Int2:Integer;
PLCNumberHint:Byte;
implementation
{$R *.dfm}
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
PLCNumberHint:=TComponent(Sender).Tag;
ColorHint(ListHint.Text, 300,clBlue);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Int1:=int1+5;
int2:=int2+1;
ListHint.Clear;
if PLCNumberHint=1 then
begin
ListHint.Add(' دستگاه شماره : '+IntToStr(PLCNumberHint));
ListHint.Add(' روند کار : '+inttostr(Int1))
end
else
begin
ListHint.Add(' دستگاه شماره : '+IntToStr(PLCNumberHint));
ListHint.Add(' روند کار : '+inttostr(Int2));
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ListHint.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ListHint:=TStringList.Create;
img[1]:=TImage.Create(self);
with img[1] do
begin
Parent:=form1;
Visible:=True;
Enabled:=True;
Picture.LoadFromFile('1.bmp');
Width:=100;
Height:=100;
Left:=20;
Top:=20;
Stretch:=True;
Cursor:=crHandPoint;
tag:=1;
OnMouseMove:=ImageMouseMove;
BiDiMode:=bdRightToLeft;
end;
img[2]:=TImage.Create(self);
with img[2] do
begin
Parent:=form1;
Visible:=True;
Enabled:=True;
Picture.LoadFromFile('1.bmp');
Width:=100;
Height:=100;
Left:=140;
Top:=20;
Stretch:=True;
Cursor:=crHandPoint;
tag:=2;
OnMouseMove:=ImageMouseMove;
BiDiMode:=bdRightToLeft;
end;
end;
end.
Mask
پنج شنبه 04 خرداد 1391, 14:45 عصر
البته کد راستچین کردن هینت رو هم پیدا کردم.
میزارم شاید روزی به در کسی خورد.
type
TMyHintWindow = class(THintWindow)
constructor Create(AOwner: TComponent); override;
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TMyHintWindow.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_LAYOUTRTL;
end;
mbshareat
پنج شنبه 04 خرداد 1391, 16:10 عصر
سلام
فرق یه حرفه ای و یه مبتدی همینه دیگه. من اولش می خواستم تغییر پارامترهای ColorHint رو بررسی کنم ولی بعدش حوصلم نکشید جزئیات رو بی خیال شدم.
این دو پروسیجر رو جایگزین کنین که مشکل حل شه:
procedure ColorHint(APrompt:String;FormWidth:Integer;BorderC olor:TColor);
Var
Tim:THintTimer;
begin
Set_Y(APrompt);
If HintVisible=true Then
Begin
If (APrompt<>CurHint)
Or (CurHintWidth<>FormWidth)
Or (CurHintBC<>BorderColor) Then
CloseHint
Else
Begin
SetHintPos;
Exit;
End;
End
Else
HintObjHandle:=
WindowFromPoint(Mouse.CursorPos);
CurHint:=APrompt;
CurHintWidth:=FormWidth;
CurHintBC:=BorderColor;
InitializeForm(FormWidth,BorderColor);
GetWindowRect(Form.Handle,HintObjRect);
SetHintPos;
If FormWidth=-1 Then
Begin
//Ïæ ÙÑÝ äæÔÊå ÝÖÇí ÎÇáí Memo Ý˜Ñ ãí ˜äã
//ÏÑ äÙÑ ãí íÑå ÈäÇÈÑ Çíä 17 ÑæÇÖÇÝå ˜ÑÏã æ
//Ñæ ÈÑÇÈÑ Memo ÚÑÖ DrawFramePrompt ÏÑ
//!ÚÑÖ ÝÑã ÞÑÇÑ ÏÇÏã
Form.Width:=
Form.Canvas.TextWidth(APrompt)+17;
FormWidth:=Form.Width;
End;
DrawFramePrompt('',APrompt,-FormWidth
,12,0,False);
With FormPic.Picture.Bitmap.Canvas Do
Begin
Brush.Color:=InverseColor(BorderColor);
//Transparent Ñ ˜ÑÏä ÈíÊ ã ÇÒ Ñä
Rectangle
(-1,-1,Form.Width+1,Form.Height+1);
Pen.Color:=BorderColor;
Brush.Color:=BorderColor;
RoundRect(0,0,Form.Width,Form.Height,9,9);
Brush.Color:=clWhite;
RoundRect(1,1,Form.Width-1,Form.Height-1,9,9);
End;
SetBkMode(FormPic.Canvas.Handle, TRANSPARENT);
DrawPrompt(True);
Tim:=THintTimer.Create(Form);
With Tim Do
Begin
OnTimer:=Tim.HintTime;
Interval:=100;
End;
Form.FormStyle:=fsStayOnTop;
SetWindowPos(Form.Handle, HWND_TOP, 0, 0, 0, 0,
SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
HintVisible:=True;
end;
procedure THintTimer.HintTime(Sender: TObject);
begin
If (HintVisible=True) Then
Begin
If (WindowFromPoint(Mouse.CursorPos)
<>HintObjHandle)
Or (InRect(Mouse.CursorPos.X,
Mouse.CursorPos.Y,HintObjRect)=False) Then
CloseHint;
End;
end;
یه نکته: برای TImage و چیزهای دیگه ای که هندل ندارند تست خارج شدن از محدوده گذاشتم ولی باز هم کافی نیست(مثلا در دو تصویر روی هم!)
با اینکه کلی وقت گذاشتم هنوز نمی دونم چکار کنم فرم هینت در قسمت بالای دسکتاپ ظاهر نشه!
اگه حوصله دارین روش کار کنین.(من که حوصلم تموم شد!)
mbshareat
پنج شنبه 04 خرداد 1391, 18:14 عصر
باز هم سلام
این یونیت رو بردارین پرش تصویر تا حد زیادی کم شده اما باز هم بالای صفحه گاهی ترسیم هینت به صورت پرش تصویر اتفاق میفته:
87432
اینجای کدتون رو هم تغییر بدین:
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
PLCNumberHint:=TComponent(Sender).Tag;
ColorHint(ListHint.Text, 300,clBlue,TImage(Sender));
end;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.