在Delphi VCL项目中,我创建了一个简单TVirtualStringTree的两列.第一列将包含标识Name所表示数据的文本.数据记录还包含状态字段.第二列用于表示使用没有文本的图像(16x16像素)的记录状态.
我已经搜索了演示,但还没有掌握VTV如何显示节点的完整过程,并且还没有成功获得在指定列的节点中显示的图标.
所以我有三个相关的问题:
我看到在OnGetText事件中如何分配文本,但是我应该在哪里分配或更改图像以反映记录中的当前状态?
如何让图像实际显示在列中?
我的图像尺寸有限,还是比图标大?如果是这样,我是否需要更改任何设置以调整每行的高度(如果可能)?
我以 TGrid 列中的单元格为例。组件选项中没有颜色属性。颜色只能通过代码访问。代码必须放在 Draw Column Cell 事件中,但它是什么代码呢?我尝试使用与 VCL 组件中相同的过程,但 FMX 中的 Tcanvas 不包含画笔属性。网站上的其他类似问题仅提供有关如何处理颜色的推测。
是否有人成功更改了单元格(或其他组件)中的背景颜色?
我试图在运行时在窗体中定义ClientDataSet组件.我可以成功定义所有字段并在VCL表单程序中操作ClientDataSet,但是当我尝试将诸如AfterInsert之类的事件的事件处理程序添加到代码中时,编译器会对应于我的格式.
clientDataset在此过程中创建:
procedure TForm1.CreateNestedDataSets;
begin
cdsTables := TClientDataSet.Create(Self);
cdsNotes := TClientDataSet.Create(cdsTables); //nested dataset
//Define Tables
with TFloatField.Create(Self) do
begin
Name := 'TblID';
FieldKind := fkData;
FieldName := 'ID';
DataSet := cdsTables;
Required := True;
end;
... //define other fields for cdsTables & nested clientdataset cdsNotes
cdsNotes.AfterInsert := cdsNotesAfterInsert(cdsNotes: TDataSet);
//Create the ClientDataSet and its nested datasets
cdsTables.CreateDataSet;
//This is problem code line:
cdsNotes.AfterInsert := cdsNotesAfterInsert;
//Configure the DataSources
dsTables.DataSet := cdsTables;
dsNotes.DataSet := cdsNotes;
end;
Run Code Online (Sandbox Code Playgroud)
各种论坛讨论都提出了这个例子的方法:
MyLabel := TLabel.Create(self);
MyLabel.OnClick …Run Code Online (Sandbox Code Playgroud) 我创建了一个VCL表单,其中包含的多个副本TFrame,每个副本包含多个TLabel组件。
标签占据了框架内部的大部分区域,几乎没有暴露的客户区域用于专门选择框架。当用户选择框架组件并在各种标签标题中显示特定文本时,该程序必须采取措施。问题是,如果用户单击标签组件之一而不是框架中的空白区域,OnClick则不会触发该事件。
OnClick如果用户单击框架中的任意位置,如何生成框架的事件?
创建基于所请求页面内容显示文本的水印需要什么css?
我正在使用Drupal生成页面内容.这里的目的是用相关内容以图形方式增强页面.因此,除了页面的标题和正文之外,我还希望在页面内容和背景图像下显示一些相关的关键词作为半透明背景.背景图像和水印文本将根据不同类别的信息而变化.
我正在 Delphi 中探索 Virtual Treeview 并运行了一个示例程序,其中通过按 F2 来调用编辑器,开始编辑过程使用 Virtualtreeview 中的内置编辑器(无附加编辑组件)。文本发生了变化,但当我单击不同的节点时,它立即变回了原始文本。
这让我探索了 VirtualTrees.pas 中的源代码,以研究编辑过程是如何工作的。一切似乎都归结为TBaseVirtualTree.doedit. 我已经检查了每个步骤,但不确定列中的编辑框究竟是什么操作。
procedure TBaseVirtualTree.DoEdit;
begin
Application.CancelHint;
StopTimer(ScrollTimer);
StopTimer(EditTimer);
DoStateChange([], [tsEditPending]);
if Assigned(FFocusedNode) and not (vsDisabled in FFocusedNode.States) and
not (toReadOnly in FOptions.FMiscOptions) and (FEditLink = nil) then
begin
FEditLink := DoCreateEditor(FFocusedNode, FEditColumn);
if Assigned(FEditLink) then
begin
DoStateChange([tsEditing], [tsDrawSelecting, tsDrawSelPending, tsToggleFocusedSelection, tsOLEDragPending,
tsOLEDragging, tsClearPending, tsDrawSelPending, tsScrollPending, tsScrolling, tsMouseCheckPending]);
ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions,
not (toDisableAutoscrollOnEdit in FOptions.AutoOptions));
if FEditLink.PrepareEdit(Self, FFocusedNode, FEditColumn) then
begin
UpdateEditBounds;
// Node needs repaint …Run Code Online (Sandbox Code Playgroud) 我想以自动换行格式在字符串网格单元格中显示一个长字符串,并找到以下代码来做到这一点:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
//enable wordwrap in cells
var
S: String;
drawrect :trect;
begin
stringgrid1.Canvas.FillRect (Rect);
S:= (Sender As TStringgrid).Cells [ACol, ARow ];
If Length(S) > 0 Then Begin
drawrect := rect;
DrawText((Sender As TStringgrid).canvas.handle,
Pchar(S), Length(S), drawrect,
dt_calcrect or dt_wordbreak or dt_left );
If (drawrect.bottom - drawrect.top) >
(Sender As TStringgrid).RowHeights[Arow]
Then
(Sender As TStringgrid).RowHeights[Arow] :=
(drawrect.bottom - drawrect.top)
// changing the row height fires the event again!
Else Begin
drawrect.Right := …Run Code Online (Sandbox Code Playgroud) 我正在使用tRichEdit组件并使用tSpinedit使用trichedit.oncreate事件确定制表符间距,以生成一系列制表符位置.这工作正常,我生成的每个新段落都使用定义的制表符间距.但是,当使用SpinEdit1 Change事件时,我可以更改放置光标的文本段的制表符间距,但它不会在整个richedit文本中执行.
有没有办法在richedit文档中的所有段落中应用新的tabstop设置?
当我使用tForm1.SpinEdit1Change更改选项卡设置时,选项卡会更改当前段落和后续段落,但之前的段落保持不变.有没有办法迭代richedit1内容中的段落来改变'for'循环中的所有段落?我没有在属性中找到任何数组或列表.是否有用于在运行时全局设置选项卡的属性或另一种可以实现此目的的方法?
我想在一个对象(处理程序)中创建一个数组,该对象包含PHP中的一系列对象(主题).数组是处理程序的属性,我有一个创建新主题的方法.
class MyHandler (
$TheList = array();
$TempSubject = object; // class subject
public function AddNewSubject($information) {
$TempSubject = new subject($information);
$This->TheList [] = $TempSubject;
}
)
Run Code Online (Sandbox Code Playgroud)
如果我如上所述创建一个新主题,那么信息是否持久存在于对象之内MyHandler还是在AddNewSubject结束后丢失?我是PHP的新手,所以请评论任何错误.
我创建了一个动态数组记录,使用此actionexecute方法进行扩展:
procedure TForm1.AddTeamActionExecute(Sender: TObject);
Var
c : integer;
begin
c := length(PrjRecArray);
PrjRecArray[c].tmpLoadPrjRec (true, 'Team', 'Big Building', '123 Main Street' ,'',
'Somewhere', 'Ohio','43210', '555-1234', 'Bob', 'Big Cheese', '555-0123', 'bob@gmail.com');
PrjSg.Cells[0,PrjSg.RowCount-1] := (PrjRecArray[c].Team);
PrjSg.Cells[1,PrjSg.rowcount-1] := (PrjRecArray[c].Name);
PrjSg.Cells[2,PrjSg.rowcount-1] := (PrjRecArray[c].addr1);
PrjSg.Cells[3,PrjSg.rowcount-1] := (PrjRecArray[c].addr2);
PrjSg.Cells[4,PrjSg.rowcount-1] := (PrjRecArray[c].city);
PrjSg.Cells[5,PrjSg.rowcount-1] := (PrjRecArray[c].state);
PrjSg.Cells[6,PrjSg.rowcount-1] := (PrjRecArray[c].zip);
PrjSg.Cells[7,PrjSg.rowcount-1] := (PrjRecArray[c].phone);
PrjSg.Cells[8,PrjSg.rowcount-1] := (PrjRecArray[c].contact);
PrjSg.Cells[9,PrjSg.rowcount-1] := (PrjRecArray[c].title);
PrjSg.Cells[10,PrjSg.rowcount-1] := (PrjRecArray[c].conPhone);
PrjSg.Cells[11,PrjSg.rowcount-1] := (PrjRecArray[c].email);
PrjSg.RowCount := PrjSg.RowCount + 1;
Revised(true);
showmessage ('PrSG Rows = ' + inttostr (PrjSg.RowCount));
c …Run Code Online (Sandbox Code Playgroud) 我有一个TEditDelphi VCL 表单应用程序(包含在一个TFrame实例中,如果重要的话)。在用户指示他们完成编辑后,通过单击表单上的其他地方,插入符号和焦点将保留在此控件上,直到我单击另一个控件,然后该控件获得焦点。但是,TEdit无论用户单击何处,我都希望失去焦点。我希望我可以使用ActiveControl := nil结束对所选控件的关注,但我不确定在哪里调用它。
我想要的是焦点离开所选控件而不必将其转移到另一个控件。我可以在表单的OnClick事件中结束焦点,但是如果用户在我的表单上选择任何其他控件(也包含在框架中),这将不起作用,因为表单的OnClick事件没有被触发。OnClick为表单上的每个附加项目提供单独的事件似乎既不优雅又乏味。
实现这种行为的全局解决方案是什么?