Forum
Please
Log In
to post a new message or reply to an existing one. If you are not registered, please
register.
NOTE: Some forums may be read-only if you are not currently subscribed to
our technical support services.
Subject |
Author |
Date |
|
Offer Har
|
Jun 30, 2008 - 3:57 PM
|
|
|
Offer Har
|
Jun 30, 2008 - 2:53 PM
|
|
|
Offer Har
|
Jun 30, 2008 - 9:41 AM
|
I have a floating bar that in some cases I need to disabled to close ’X’ button - How do I do that? Thanks, Ron.
|
|
Technical Support
|
Jun 30, 2008 - 1:15 PM
|
The buttons in captions of resizable control bars (docked or floating) and in captions of toolbars are instances of the CExtBarNcAreaButton -based classes. The CExtBarNcAreaButtonClose class implements an X-button. You can create and use your own CExtBarNcAreaButtonClose -derived class. You can hide this button by overriding the CExtBarNcAreaButtonClose::OnQueryVisibility() virtual method and returning a false value from it. You can handle a button click in the overridden CExtBarNcAreaButtonClose::OnNcAreaClicked() virtual method and invoke the parent class method or display a message box with information about why closing is not recommended. You should override the CExtControlBar::OnNcAreaButtonsReinitialize() virtual method to make the control bar using your X button class instead of the default class. Your method should be similar to the original one but simply instantiate your class. Please note, coding your own caption button classes is typically needed if you need some specific caption buttons with custom look, size and/or behavior. If you want only to disable button clicks, you can avoid coding your button class and simply implement the CExtDynamicControlBar::NcButtons_HandleClick() virtual method which is a better solution, because it handles button clicks on both stand alone bars and tabbed group bar captions. Your implementation of the CExtDynamicControlBar::NcButtons_HandleClick() virtual method should return true if the click event is handled. In this case Prof-UIS will not do any default actions related to each particular button. By returning false value you will inform Prof-UIS that button click should be handled using default actions.
|
|
Offer Har
|
Jun 30, 2008 - 2:42 PM
|
Dear Support, All I want is that when I specify if, the button will look disabled. From the options you explained above, it does not sound even possible, unless I paint the button myself somehow, and I don’t undersatnd how. I know how to ’eat’ the click, and prevent the bar from being closed, but I get complains from our customers that this is not enough, as it looks like a bug that the button is enabled, and clikcing it does nothing, so they requested for it to look disabled, not only act disabled. Please explain how this can be implemented. Thanks, Ron.
|
|
Technical Support
|
Jul 1, 2008 - 7:21 AM
|
We follow the design presented in MS applications when caption buttons in toolbars and control bars are small UI elements, which can be visible and clickable or hidden. They cannot be visible and disabled. You may have noticed that a menu bar in MS Office applications in the floating state does not have a Close button and you even cannot hide it from the Toolbars page of Customize dialog because the check box in the list box item with Menu Bar text is disabled. We suspect Microsoft does not support disabled caption buttons because they are really small and disabled look may be not very recognizable. We can regard this as a feature request and implement support for disabled caption buttons in all the paint managers.
|
|
Offer Har
|
Jun 30, 2008 - 6:17 AM
|
If the value of the in place is bigger then the max value of the slider, the handle is drawn outside the cell. In a regular slider this cannot happen - it should be clamped to the max value. Same goes for values smaller then 0. Please fix, Ron.
|
|
Technical Support
|
Jun 30, 2008 - 12:59 PM
|
Thank you for reporting this issue. You can fix it in the following way. Find the following code at beginning of the CExtGridCellInplaceSlider::OnCalcSliderLayout() method: ULONG nScrollPos = ScrollPosGet();
ULONG nScrollPageSize = ScrollPageSizeGet();
ULONG nScrollTotalRange = ScrollTotalRangeGet();
ULONG nScrollLimit = ScrollLimitGet(); And insert the following code immediately after it: if( nScrollPos < 0 )
nScrollPos = 0;
if( nScrollPos > nScrollLimit )
nScrollPos = nScrollLimit;
|
|
Offer Har
|
Jun 30, 2008 - 1:02 PM
|
Hello support! You’re alive Been looking for you for a looong time... Thanks for the fix.
|
|
Offer Har
|
Jun 30, 2008 - 6:12 AM
|
Another call for the support! PLEASE give us the dignity to answer our questions!
|
|
Offer Har
|
Jun 28, 2008 - 8:19 AM
|
Where are you? Is there any chance I will some *some* answers any time soon? There are some bugs that are waiting for fixing...
|
|
howard liu
|
Jun 28, 2008 - 12:14 AM
|
Hi, Is there any Equivalent ProfuI control for ListView and listControl derived from these classes
|
|
howard liu
|
Jul 5, 2008 - 3:34 AM
|
Hi, Thanks for the sample application NewControls-beta-test2.zip Could you please provide us with the latest build/ dll that handles the list ctrl, list view (specialized version for the CListCtrl type provides skinned scroll bars) Thanks, Howard
|
|
Technical Support
|
Jul 7, 2008 - 12:42 PM
|
Please request the source code via email so we will reply with the download information.
|
|
howard liu
|
Jul 5, 2008 - 3:34 AM
|
Hi, Thanks for the sample application NewControls-beta-test2.zip Could you please provide us with the latest build/ dll that handles the list ctrl, list view (specialized version for the CListCtrl type provides skinned scroll bars) Thanks, Howard
|
|
Technical Support
|
Jul 7, 2008 - 12:41 PM
|
Please request the source code via email so we will reply with the download information.
|
|
Technical Support
|
Jun 30, 2008 - 1:02 PM
|
The grid control is very good replacement for the list view in report mode. But grid does not have other classic list view modes: list, small/big icon. The CExtNCSB template class (not CExtNCW !) has a specialized version for the CListCtrl type and provides skinned scroll bars. You should simply use the CExtNCSB < CListCtrl > class as the base of your list view class. This will make standard list view control be based on skinned Prof-UIS scroll bars. Better skinned list and tree view controls are developed for the next version (including a list view control with a skinned header):
NewControls-beta-test2.zip
|
|
howard liu
|
Jul 2, 2008 - 12:33 AM
|
If i use CExtNCSB < CListCtrl > class as the base of my list view class.some of the listview methods like GetListCtrl cannot be used . And also if i use CExtNCSB < CListView > instead of ClistView i am getting profUI ScrollBar,but THUMBTRACK and THUMBPOSITION functionality is missing.only on mousewheel change scrollBar is moving.plz tell how to enable THUMBTRACK and THUMBPOSITION functionality.
|
|
Offer Har
|
Jun 28, 2008 - 8:17 AM
|
Nope - but you can use the grid control for creating a list control equivalent.
|
|
howard liu
|
Jun 30, 2008 - 8:59 AM
|
But I Already have a listctrl and ListView which i want to modify to profui equivalent.many of listctrl and listview methods are not suppoerted by gridctrl as it is not derived from ClistCtrl.
|
|
Technical Support
|
Jul 2, 2008 - 11:24 AM
|
The CExtNCSB < CListCtrl > type is a specialized template class declared as: template < > class CExtNCSB < CListCtrl > : public CExtNCSB_Impl < CListCtrl > where CExtNCSB_Impl is a generic template class: template < class _BTNCSBimpl > class CExtNCSB_Impl : public _BTNCSBimpl In both cases the parent classes have the public access. So, if you have a CExtNCSB < CListCtrl > object or object of some class derived from CExtNCSB < CListCtrl > , the CListCtrl class methods must be available without any problems. Please ensure the CExtNCSB < CListCtrl > class is also a public base class of your list control class: class CYourListControl : public CExtNCSB < CListCtrl > The CExtNCSB < CListView > specialization is not supported yet. But you can copy the entire declaration of the template < > class CExtNCSB < CListCtrl > specialized template class from Prof-UIS source code to your project and replace the CListCtrl type with the CListView type in the copied lines. The new CExtNCSB < CListView > specialized template class must be inserted into your project before its usage in the classes derived from it.
|
|
Offer Har
|
Jun 30, 2008 - 9:01 AM
|
You are correct. This should be addressed to the support team (wherever they are... it seems they have left the building...) But as I asked this question in the past, and this was the answer I got, I am just relaying it to you
|
|
Kevin Murray
|
Jun 27, 2008 - 1:41 PM
|
So when last I asked about positioning toolbars in code after app startup, after they’ve been moved around, etc., based on a saved bit of data from an old, non-prof-uis system, you basically answered it would be really difficult to do. That remains true, but I’m getting closer, doing things I probably shouldn’t (or at least that you probably didn’t intend), and it works once or twice, but then my positioning code goes haywire again. And, of course, I’m being told to figure out how to make this work for backwards compatibility in our application. So, using the "Kill Bar" function found on this board, I have implemented the following: class CMyClass : public CExtCustomizeSite { ... void ReloadAllToolbars() { _EmptyContainers(); m_bInitComplete = false; m_pWndTop = NULL; // // loop through local toolbar list and remove them all using KillBar... // ... // reload the toolbars // EnableCustomization(...); } };
So, the first time I encounter settings that weren’t saved via Prof-UIS serialization system, I call the above, parse the data and start calling things like this:
CRect r; pPreviousBar->GetWindowRect( &r ); r.OffsetRect( 1, 0 ); m_pFrameWnd->DockControlBar( pBar, AFX_IDW_DOCKBAR_TOP, &r );
There’s a little more logic to interpret which bar goes where, but ultimately OffsetRect and DockControlBar are used as needed. After doing this, the toolbars are really durn close to being laid out the way the were in the old version of our application. Now after this, if you load a new settings file done through the Prof-UIS serialization again, the toolbars are now laid out fine as they were saved. All is fine. I then re-load the old version’s file, called my ReloadAllToolbars method again, do the docking logic again, and the toolbars don’t go where they should, with each getting it’s own row. Any help you can provide, even a different method than the above, would be greatly appreciated. I’m banging my head on the desk here... Kevin Murray AGI
|
|
Technical Support
|
Jun 30, 2008 - 1:10 PM
|
We believe the problem can really be caused by the r.top = 0; code. We also suspect that the difference between the first and next toolbar repositions can be related to the persistent affixment information which is stored inside each of Prof-UIS toolbars. This affixment information allows the toolbars to move each other after the user docks them into a new desired position inside the main frame window. Please invoke the pBar->_AffixmentSafeClearOuter(); code for each of toolbars before re-docking them.
|
|
Kevin Murray
|
Jun 30, 2008 - 6:10 PM
|
I tried the clear outer thing on just the current bar, the whole list of bars, current bar and last bar, to no avail. I also see the editor mangled my code. Here is the current state:
m_pFrameWnd->ShowControlBar( pBar, TRUE, TRUE );
if( pLastBar != NULL )
{
pLastBar->_AffixmentSafeClearOuter();
pBar->_AffixmentSafeClearOuter();
CRect r;
pLastBar->GetWindowRect( &r );
pBar->_CalcSize( !bHorz );
if( bHorz == TRUE )
{
if( pt.y == ptLast.y )
{
r.OffsetRect( 10, 0 );
}
else
{
r.OffsetRect( 0, 10 );
r.left = 0;
}
} // end if pInfo->m_bHorz
else
{
if( pt.x == ptLast.x )
{
r.OffsetRect( 0, 10 );
}
else
{
r.OffsetRect( 10, 0 );
r.top = 0;
}
} // end else (pInfo->m_bHorz == FALSE)
m_pFrameWnd->DockControlBar( pBar, iBarId, &r );
} // end if pLastBar
else
{
m_pFrameWnd->DockControlBar( pBar, iBarId );
}
pLastBar = pBar;
ptLast = pt;
m_pFrameWnd->RecalcLayout();
Hopefully easier to follow. The first time through, I get something like this:
[menu]
[toolbar1] [toolbar2] [toolbar3]
[toolbar4] [toolbar5] [toolbar6]
The second time through destroying and recreating the bars, then going through that same code loop above, I get something like this:
[menu]
[toolbar1] [toolbar2] [toolbar3]
[toolbar4]
[toolbar5]
[toolbar6]
|
|
Technical Support
|
Jul 1, 2008 - 12:49 PM
|
We believe the problem can be hidden in something very simple. For instance, it’s not recommended to compare variables with TRUE or true . Please use comparision with FALSE or false instead. Please also put the TRACE code into the code snippet in your message and take a look at the rectangles specified in the invocations of the DockControlBar() method. Please also insert some tracing of details like beginning new rows of bars. If the pLastBar pointer is NULL , then the pBar bar is docked without clearing its affixment.
|
|
Kevin Murray
|
Jul 1, 2008 - 1:15 PM
|
First run traces:
AFX_IDW_DOCKBAR_TOP
=====================
pLastBar’s (id = 6577) Window Rect = (6, 54) - (482, 80)
pBar’s (id = 4410) Offest Rect = (16, 54) - (492, 80)
pBar’s (id = 4410) Rect After DockControlBar = (16, 54) - (492, 80)
pLastBar’s (id = 4410) Window Rect = (482, 54) - (600, 80)
pBar’s (id = 4027) Offest Rect = (492, 54) - (610, 80)
pBar’s (id = 4027) Rect After DockControlBar = (492, 54) - (610, 80)
pLastBar’s (id = 4027) Window Rect = (600, 54) - (877, 80)
pBar’s (id = 4037) Offest Rect = (0, 64) - (877, 90)
pBar’s (id = 4037) Rect After DockControlBar = (0, 64) - (877, 90)
pLastBar’s (id = 4037) Window Rect = (6, 80) - (264, 106)
pBar’s (id = 205) Offest Rect = (16, 80) - (274, 106)
pBar’s (id = 205) Rect After DockControlBar = (16, 80) - (274, 106)
pLastBar’s (id = 205) Window Rect = (264, 80) - (429, 106)
pBar’s (id = 6612) Offest Rect = (0, 90) - (429, 116)
pBar’s (id = 6612) Rect After DockControlBar = (0, 90) - (429, 116)
pLastBar’s (id = 6612) Window Rect = (6, 106) - (246, 132)
pBar’s (id = 4053) Offest Rect = (16, 106) - (256, 132)
pBar’s (id = 4053) Rect After DockControlBar = (16, 106) - (256, 132)
AFX_IDW_DOCKBAR_LEFT
======================
The thread ’Win32 Thread’ (0x1754) has exited with code 0 (0x0).
pLastBar’s (id = 3990) Window Rect = (6, 132) - (33, 250)
pBar’s (id = 4020) Offest Rect = (0, 142) - (33, 260)
pBar’s (id = 4020) Rect After DockControlBar = (0, 142) - (33, 260)
Reload a Prof-UIS save, load above old set a second time:
AFX_IDW_DOCKBAR_TOP
=====================
pLastBar’s (id = 6577) Window Rect = (6, 54) - (482, 80)
pBar’s (id = 4410) Offest Rect = (16, 54) - (492, 80)
pBar’s (id = 4410) Rect After DockControlBar = (16, 54) - (492, 80)
pLastBar’s (id = 4410) Window Rect = (482, 54) - (600, 80)
pBar’s (id = 4027) Offest Rect = (492, 54) - (610, 80)
pBar’s (id = 4027) Rect After DockControlBar = (492, 54) - (610, 80)
pLastBar’s (id = 4027) Window Rect = (600, 54) - (877, 80)
pBar’s (id = 4037) Offest Rect = (0, 64) - (877, 90)
pBar’s (id = 4037) Rect After DockControlBar = (0, 64) - (877, 90)
pLastBar’s (id = 4037) Window Rect = (6, 80) - (264, 106)
pBar’s (id = 205) Offest Rect = (16, 80) - (274, 106)
pBar’s (id = 205) Rect After DockControlBar = (16, 80) - (274, 106)
pLastBar’s (id = 205) Window Rect = (16, 106) - (181, 132)
pBar’s (id = 6612) Offest Rect = (0, 116) - (181, 142)
pBar’s (id = 6612) Rect After DockControlBar = (0, 116) - (181, 142)
pLastBar’s (id = 6612) Window Rect = (6, 132) - (246, 158)
pBar’s (id = 4053) Offest Rect = (16, 132) - (256, 158)
pBar’s (id = 4053) Rect After DockControlBar = (16, 132) - (256, 158)
AFX_IDW_DOCKBAR_LEFT
======================
pLastBar’s (id = 3990) Window Rect = (6, 184) - (33, 302)
pBar’s (id = 4020) Offest Rect = (0, 194) - (33, 312)
pBar’s (id = 4020) Rect After DockControlBar = (0, 194) - (33, 312)
As you can see, in the second instance, the rect is calculated OK, but when GetWindowRect is called for it, the bar with id 205 isn’t on y value 80 anymore, but y value 106. I did add in the affixment clear after the NULL condition.
|
|
Technical Support
|
Jul 2, 2008 - 11:26 AM
|
Please try invoking pBar->MoveWindow( 0, 0, 0, 0, FALSE ); before each invocation of DockControlBar( ... ); . We suspect the bars are created with some large window rectangles and this affects row positions. If this does not help, we can connect to your computer remotely and try to find out what’s wrong.
|
|
Kevin Murray
|
Jul 2, 2008 - 12:29 PM
|
MoveWindow had no effect. My IS team tells me we can probably set up a Remote Assistance session or something similar. I’ll be out of the office tomorrow (July 3) through Monday, back on Tuesday (July 8). Feel free to email me details and I’ll see what we can get set up. Thanks, Kevin Murray
|
|
Technical Support
|
Jul 7, 2008 - 12:44 PM
|
We are sorry for the delay with this reply. Please tell us (via email) when and how we can connect to your desktop.
|
|
Technical Support
|
Jun 30, 2008 - 5:18 AM
|
Before answering, we would like to ask one important question: Do you invoke RecalcLayout() after processing each bar with ...OffsetRect() ... DockControlBar() ?
|
|
Kevin Murray
|
Jun 30, 2008 - 9:46 AM
|
Yes, I call: m_pFrameWind->ShowControlBar( pBar, TRUE, TRUE ); m_pFrameWnd->RecalcLayout();
Specifically, the loop I go through does this for each dock bar:
// ...retrieve data from file with (x, y) and whether horizontal or vertical // (x,y) in CPoint pt; horizontal in BOOL bHorz; // pBar and pLastBar are CExtToolControlBars m_pFrameWnd->ShowControlBar( pBar, TRUE, TRUE ); { CRect r; pLastBar->GetWindowRect( &r ); pBar->_CalcSize( !bHorz ); { { r.OffsetRect( 10, 0 ); } if( pLastBar != NULL ) if( bHorz == TRUE ) if( pt.y == ptLast.y ) else{ r.OffsetRect( 0, 10 ); r.left = 0; } } // end if pInfo->m_bHorz else{ { r.OffsetRect( 0, 10 ); } if( pt.x == ptLast.x ) else{ r.OffsetRect( 10, 0 ); r.top = 0; } } // end else (pInfo->m_bHorz == FALSE)m_pFrameWnd->DockControlBar( pBar, iBarId ); } pLastBar = pBar; ptLast = pt; m_pFrameWnd->RecalcLayout();
I use 10 for my offset value because I found if I use 1, putting the bar on a new row/column doesn’t always work. And, again, this works the first time I reset the toolbars, but not after that.
K.
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps: 1) ID Generation 2) Attach
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps: 1) ID Generation 2)
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps: 1) ID
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps: 1)
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps:
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps:
|
|
Technical Support
|
Jun 28, 2008 - 6:59 AM
|
It’s hardly to say what can be wrong with your combo box without seeing the code that creates it. Would you reproduce the problem with one of our samples?
|
|
Filippo Murroni
|
Jun 27, 2008 - 6:56 AM
|
Hi, first of all thanks for your help!!! I have a serious problem to add a CExtComboBox, created at runtime, inside a CExtToolControlBar. How can i do this? Note that: - ID has genereted at runtime; - I can see the combobox (like a button) but I can’t use it or scroll the combo list; - I use the ProfUi version 2.8.1. The program has these steps:
|
|
Scott Moore
|
Jun 26, 2008 - 12:45 PM
|
How easy or hard is it to make it so that double-clicking on the title bar of a floating dynamic bar will maximize it? Basically so it behaves like a regular window. Double clicking will maximize it then double-clicking again takes it back to the previous size.
|
|
Technical Support
|
Jun 30, 2008 - 5:08 AM
|
Unfortunately this feature is not supported. A floating mini frame window is a tool window (WS_EX_TOOLWINDOW ), which means it cannot be maximized. But it is possible to code a custom caption button for the control bar so when you click it, the window will look maximized.
|
|
Offer Har
|
Jun 26, 2008 - 10:57 AM
|
|
|
howard liu
|
Jun 26, 2008 - 8:29 AM
|
Hello, Is there any method or property for controlling or changing window size of CExtResizablepropertypage or CExtResizablepropertySheet window
|
|
Technical Support
|
Jun 26, 2008 - 1:01 PM
|
The property page windows are simply child dialogs of a property sheet window and the property sheet always automatically repositions its child page windows. The property sheet window is just a window. It also receives WM_SIZE and WM_WINDOWPOSCHANGED messages. It can also be repositioned using the MoveWindow() and SetWindowPos() APIs.
|
|
tera t
|
Jun 26, 2008 - 3:30 AM
|
Hello. I cannot use ItemLParamGet attached to Tab.
I want the following functions.
I want to set the base pointer of a subparameter or the class.
|
|
Technical Support
|
Jun 26, 2008 - 1:05 PM
|
The page container window contains some other of your windows like dialogs or other controls. You can use your windows as containers for any kind of required data.
|
|
tera t
|
Jun 26, 2008 - 8:03 PM
|
Hello. When I perform PageInsert(pCWnd)
ItemLParamGet contents are renewed by WindowHandle contents of pCWnd
Why is it such specifications? Cannot I set a parameter individually?
|
|
Technical Support
|
Jul 1, 2008 - 4:25 AM
|
You cannot use ItemLParamGet when CExtTabWnd is used inside CExtTabPageContainerWnd . The item data is internally used by the tab page container. As a workaround you can create an external map HWND <-> User Data and maintain it after each operation with the tabs. Then, using the page index you can always retrieve the corresponding HWND handle and search in the map associated user data.
|
|
tera t
|
Jun 26, 2008 - 12:36 AM
|
Hello. I want to change a menu dynamically.
I want to make it B-Menu from A-Menu.
I want to make it A-Menu from B-Menu. best regards
|
|
Technical Support
|
Jul 10, 2008 - 1:19 PM
|
The current version of the ribbon bar and ribbon page requires rebuilding of buttons collection if you want to change ribbon bar’s or ribbon page’s button layout and structure.
|
|
tera t
|
Jun 27, 2008 - 1:22 AM
|
Hello. If there is a good method, please teach it.
|
|