PDA

View Full Version : مشکل با راست چین کردن Treeveiw



MNosouhi
شنبه 27 آبان 1385, 10:53 صبح
به توصیه دوستان ، برای راست چین کردن Treeview از کد زیر استفاده کرده ام :

const
WS_EX_NOINHERITLAYOUT = $00100000; // Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = $00400000; // Right to left mirroring

procedure SetWinControlBiDi(Control: TWinControl);
var
ExStyle: Longint;
begin
ExStyle := GetWindowLong(Control.Handle, GWL_EXSTYLE);
SetWindowLong(Control.Handle, GWL_EXSTYLE, ExStyle or WS_EX_RTLREADING or WS_EX_RIGHT
or WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT );
end;
اما مشکل اینجاست که اگر Treeview از popupmenu استفاده کرده باشه ، بعد از راست چین کردن treeview ، دیگه popupmenu جواب نمیده .
مشکل از کجاست؟

babak869
یک شنبه 28 آبان 1385, 22:18 عصر
یه نمونه برنامه در این آدرس هست میتونید استفاده کنید »
http://barnamenevis.org/forum/showthread.php?t=46347&page=4

MNosouhi
یک شنبه 28 آبان 1385, 22:45 عصر
یه نمونه برنامه در این آدرس هست میتونید استفاده کنید »
آقا بابک ، همونطوزی که توضیح دادم ، مشکلی با راست چین کردن ندارم ، مشکل اینه که بعد از راست چین کردن دیگه نمیشه از Popupmenu استفاده کرد.
خودتون تست کنید تا ببینید.

ghabil
دوشنبه 29 آبان 1385, 01:06 صبح
آقا بابک ، همونطوزی که توضیح دادم ، مشکلی با راست چین کردن ندارم ، مشکل اینه که بعد از راست چین کردن دیگه نمیشه از Popupmenu استفاده کرد.
خودتون تست کنید تا ببینید.

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

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

تو یونیت Controls خط 5230:



procedure TControl.WMContextMenu(var Message: TWMContextMenu);
var
Pt, Temp: TPoint;
Handled: Boolean;
PopupMenu: TPopupMenu;
begin
if Message.Result <> 0 then Exit;
if csDesigning in ComponentState then
begin
inherited;
Exit;
end;

Pt := SmallPointToPoint(Message.Pos);
if InvalidPoint(Pt) then
Temp := Pt
else
begin
Temp := ScreenToClient(Pt);
if not PtInRect(ClientRect, Temp) then
begin
inherited;
Exit;
end;
end;


او تابعی که ضخیم کردم داره False برمیگردونه ، احنمالا یعنی اینکه فکر میکنه رایت کلیک خارج کنترل انجام شده ، حالا خودت یک ذره کلانجار برو ببینیم چه میکنی...

MNosouhi
دوشنبه 29 آبان 1385, 13:44 عصر
نه ببین مهم نیست تو چی توضیح دادی مهم اینه که اونجا یک برنامه ای هست که احتمالا قراره یک کاری که تو تاپیک یک چیزی ازش گفتی رو بکنه .
:متفکر:

احنمالا یعنی اینکه فکر میکنه رایت کلیک خارج کنترل انجام شده
دقیقا همینه ، position رو اشتباه برمیگردونه . البته در مورد تابع بالا (WMContextMenu) من نتونستم از Break Point استفاده کنم تا بتونم مشکل رو اساسی حل کنم (Invalid break point می شد) . اما به هر حال با تکه کد زیر مشکل حل شد:

procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if mbRight=Button then
PopupMenu1.Popup(Left+TreeView1.Left+(TreeView1.Wi dth+x),TreeView1.Top+top+y);
end;