我试图在列表视图数据模板内创建一个停靠面板,该面板占据其父选项卡控件的所有可用宽度。我首先将我的 XAML 基于这个问题,从而得出以下结论:
<TabControl x:Name="tabControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TabItem Header="Clipboard Buffer">
<ListView Name="clipboardListView" ScrollViewer.CanContentScroll="True">
<ListView.ItemTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="Black" CornerRadius="2,2,2,2">
<DockPanel Background="AliceBlue" Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}}">
<TextBlock Text="{Binding Text}" DockPanel.Dock="Top" />
</DockPanel>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</TabItem>
...
Run Code Online (Sandbox Code Playgroud)
这几乎可以工作,但是停靠面板似乎总是比选项卡控件中的可用空间宽一点,如您在此处看到的。
我可以使用滚动条移动并看到我的停靠面板的末尾,正如人们所期望的那样......
但是,如果我尝试重新调整窗体大小,则停靠面板仍略大于选项卡控件中的可用空间量。
我在这里缺少什么?如何使我的停靠面板保持在其父选项卡控件的宽度内?
我在Xamarin.Android项目中更新已安装的Nuget软件包时遇到了问题.运行更新时,我收到以下错误:
Could not install package 'Xamarin.Android.Support.Animated.Vector.Drawable
27.0.2'. You are trying to install this package into a project that targets
'MonoAndroid,Version=v8.0', but the package does not contain any assembly
references or content files that are compatible with that framework. For
more information, contact the package author.
Run Code Online (Sandbox Code Playgroud)
一个快速的谷歌搜索产生了几个结果与类似的答案,如在这个问题中找到的答案.似乎我只需要确保我的Target Framework设置足够高.
按照此处的说明,我开始Target Framework在Visual Studio 2017中进行更改,但是我发现它已经设置为使用8.0.
为了让这些软件包更新,我还缺少另一个步骤吗?
我正在尝试根据本文档阅读C ++中的环境变量。我的代码如下所示:
char * val;
val = getenv( "smartDir" );
ShowMessage( val );
delete val;
Run Code Online (Sandbox Code Playgroud)
我的问题是,val总是以NULL结尾,就像环境变量不存在一样。但是,我清楚地定义了变量,如下所示:
我在这里做错了什么?
到目前为止,在我的应用程序中,它已经确定在运行时创建的所有其他表单应该是模态的.因此,在创建新表单时,我使用类似以下代码块的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->ShowModal();
delete form;
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,表单的内存在用户关闭后很容易删除.
但是,在尝试弄清楚如何处理非模态对话框的内存管理时,我遇到了一个问题.显然,我不能简单地在ShowForm方法结束时调用delete,因为表单会在创建后立即删除.所以我留下这样的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->Show();
}
Run Code Online (Sandbox Code Playgroud)
基于此文档和我编写的测试应用程序,我知道form指针将在其所有者关闭后被删除.但是,这仍然让我有以下情况:
假设我有FormA一个按钮,它创建并显示FormB使用代码的实例,就像上面的方法一样.我现在单击按钮创建一个FormB然后关闭FormB,三次.直到FormA关闭,三个实例FormB仍留在内存中.
如何管理表单创建的内存,以便在表单关闭后删除为表单分配的内存?是否有标准的最佳实践,或者我缺少的内置功能?
TGrid我有一个继承自名为 的自定义网格控件TFmGrid。该控件在 Rad Studio 10 西雅图更新一中运行良好。TFmGrid我最近升级到 10.1 Berlin,并开始注意到当我运行应用程序和设计器时,我的控件上显示此错误消息:
尚未为类 TFmGrid 注册 TStyledPresentationProxy 的后代。也许有必要将 FMX.Grid.Style 模块添加到使用部分
下图显示了错误消息如何显示在我的网格控件上:
我首先按照消息的建议进行操作,然后添加#include <FMX.Grid.Style.hpp>到我的控件的头文件中TFmGrid,但这似乎没有执行任何操作。
因此,就尝试注册后代而言,TStyledPresentationProxy我不确定从哪里开始。我找到了有关以下方法的文档:
尝试使用指定名称或指定的控件类和控件类型组合来注册表示代理类。
所以我假设我需要使用这个方法或至少类似的方法,但我不明白我应该如何调用这个方法。
但这又带来了一个问题:我在哪里调用这段代码?
我的自定义控件在其命名空间中有一个方法Register(),我相信该方法是在创建控件时由 IDE 自动生成的:
namespace Fmgridu
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TFmGrid)};
RegisterComponents(L"Kalos FM Controls", classes, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要在那里调用一些东西来注册 的后代吗TStyledPresentationProxy?解决这个问题的正确方法是什么?
我希望网格在屏幕上伸展同时还应用了阴影效果,出于某种原因,当放置在DropShadowPanel内部时,我无法将网格拉伸.
以下是所需结果的示例,但没有阴影效果:
<Grid Background="LightBlue">
<Grid Background="WhiteSmoke" HorizontalAlignment="Stretch" Height="200" VerticalAlignment="Top" Margin="40"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
结果:
这是我的带有DropShadowPanel的xaml:
<Grid Background="LightBlue">
<controls:DropShadowPanel HorizontalAlignment="Stretch" Margin="40">
<Grid Background="WhiteSmoke" HorizontalAlignment="Stretch" Height="200" VerticalAlignment="Top"/>
</controls:DropShadowPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
而这完全隐藏了第二个网格.
为什么网格在DropShadowPanel中的行为不同?
我正在尝试使用Raycast2D来检测攻击是否击中了敌人。我为“敌人”图层创建了一个图层蒙版,并且在“敌人”图层上有一个带有碰撞器的对象。如果不使用LayerMask,我不会撞到对撞机,但是当我这样做时,我什么也没回来。我在这里想念什么?
LayerMask EnemyLayer;
void Start ()
{
EnemyLayer = LayerMask.NameToLayer ("Enemy");
}
public void BasicAttack()
{
PlayerVitality.Stamina = 0;
Vector2 attackDirection = CalculateAttackDirection ();
float attackDamage = CalculateDamage (BasicAttackDamage);
Debug.Log (EnemyLayer.value);
RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x + 2, transform.position.y), attackDirection, BasicAttackDistance, EnemyLayer.value);
if (hit.collider != null)
{
Debug.Log("You hit: " + hit.collider.gameObject.name);
}
}
Run Code Online (Sandbox Code Playgroud) 我需要将文件的上次修改时间与存储在数据库中的日期时间进行比较.我最初看了这个问题才开始.
我目前正在获取FILETIME文件的最后一次写入,将其转换为SYSTEMTIME.然后我用它SYSTEMTIME来创建一个TDateTime可以用来比较的对象.但是,FileModifiedDT尽管先前已修改过文件,但变量始终是当前时间.
FILETIME lastWriteTime;
String * FileNamePtr = new String( FileName );
GetFileTime( FileNamePtr, NULL, NULL, &lastWriteTime );
SYSTEMTIME systemTime;
FileTimeToSystemTime( &lastWriteTime, &systemTime );
TDateTime * FileModifiedDT = new TDateTime( systemTime.wYear, systemTime.wMonth,
systemTime.wDay, systemTime.wHour,
systemTime.wMinute, systemTime.wSecond,
systemTime.wMilliseconds );
Run Code Online (Sandbox Code Playgroud)
我GetFileTime在某种程度上错过了吗?我还有更好的方法吗?
我最近创建了简单的关卡生成器,它创建了一个带有分段的关卡。我曾经mesh.bounds.x查看下一段应该距离上一段多远。它对我来说非常有效,因为所有部分都是正方形的。现在我决定用更大的部分和其他边的比例(仍然是矩形)来完成这项工作。我的问题是,尽管我尝试了很多组合,但仍无法正确设置。
有人可以向我解释这是如何mesh.bound工作的吗?我还实例化了旋转段,也许这会导致一些错误?我所有的预制件都是从搅拌机导入的。
我的代码中有一部分实例化了一个段(在我决定使用更复杂的段之前):
size = meshh.bounds.size;
if ((x == 0) && (y == 0))
{
segments[x, y] = Instantiate(prefabs[0], new Vector3(segments[1, 1].transform.position.x - size.x, segments[1, 1].transform.position.y, segments[1, 1].transform.position.z + size.x), segments[1, 1].transform.rotation) as GameObject;
segments[x, y].tag = "Terrain";
}
Run Code Online (Sandbox Code Playgroud) I am attempting to add a low level mouse hook to a class. I am able to do so by placing this function in my CPP file:
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//my hook code here
return CallNextHookEx(0, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
Then, I set up the hook in the class constructor like so:
HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
This works fine for intercepting mouse events, however since the callback function is not defined …
编辑:现在我对发生的事情有了更好的了解,我想我可以更好地说出这个问题,因此它更有用.
我试图在C++中复制以下delphi代码
TThread.Queue(nil,
procedure
begin
LogMessage("test");
end
);
Run Code Online (Sandbox Code Playgroud)
代码的目的是调用一个TMemo以线程安全的方式更新表单的方法.这是我试图调用的方法的C++版本Thread.Queue
void __fastcall TClientForm::LogMessage( String message )
{
MemoLog->Lines->Add( message );
}
Run Code Online (Sandbox Code Playgroud)
因为我使用的是没有CLANG增强功能的BCC32编译器,所以不能使用Lambda.相反,根据这个文档,我需要创建一个继承TThreadProcedure的Invoke()方法来覆盖方法来完成我需要完成的工作.然后我可以将该类的实例传递给TThread::Queue.
我创建了以下继承TThreadProcuedure并包含invoke方法的类.
class TMyThreadProcedure : TThreadProcedure
{
void __fastcall Invoke( String message );
};
Run Code Online (Sandbox Code Playgroud)
但是,由于TThreadProcedure是一个抽象类,我不能简单地创建它的实例来传递TThread::Queue.TThreadProcedure当我将类的实例传递到其中时,继承和定义要调用的函数的正确方法是什么TThread::Queue?