对于那些没有时间进入但可能有类似问题的人来说,最热门的(抱歉)答案.
规则#1一如既往地尽可能地从循环中移动.
2,移动TField var:= ADODataSet.FieldByname()退出循环3,ADODataSet.DisableControls(); 和ADODataSet.EnableControls(); 在循环4周围,stringGrid.Rows [r] .BeginUpdate()和EndUpdate()在每一行(不能做到控制)每一个剃掉几秒钟,但我把它降到"比眼睛快可以看到"通过改变
loop
stringGrid.RowCount := stringGrid.RowCount + 1;
end loop
Run Code Online (Sandbox Code Playgroud)
放在stringGrid.RowCount := ADODataSet.RecordCount;循环之前
+1并衷心感谢所有帮助过的人.
(现在我会去看看我能做些什么来优化绘制TChart,这也很慢;-)
在表中大约有3,600行,这需要45秒来填充字符串网格.我究竟做错了什么?
ADODataSet := TADODataSet.Create(Nil);
ADODataSet.Connection := AdoConnection;
ADODataSet.CommandText := 'SELECT * FROM measurements';
ADODataSet.CommandType := cmdText;
ADODataSet.Open();
while not ADODataSet.eof do
begin
TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1;
measurementDateTime := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger);
DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet);
startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0]));
elapsedTime := measurementDateTime - startDateTime;
TestRunDataStringGrid.Cells[0, Pred(TestRunDataStringGrid.RowCount)] := FormatDateTime('hh:mm:ss', elapsedTime);
TestRunDataStringGrid.Cells[1, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('inputTemperature').AsFloat);
TestRunDataStringGrid.Cells[2, … 我对 Firemonkey Stringgrid 进行排序的基本尝试,因为找不到任何其他示例。我欢迎任何关于最好地实现这一目标的优化或其他建议。我的代码基本上获取选择的列进行排序,并使用该排序顺序完成其他列:
procedure TfrmMain.StringGridSort(StrGrid: TStringGrid; SortColumn: Integer);
var
col, row, rowx: Integer;
MySortCol, MyListCols: TStringList;
begin
MySortCol := TStringList.Create;
MyListCols := TStringList.Create;
try
MySortCol.Sort;
MyListCols.Sorted := False;
StrGrid.BeginUpdate;
try
for row := 0 to StrGrid.RowCount - 1 do
MySortCol.AddObject(StrGrid.Cells[SortColumn, row], TObject(row));
MySortCol.Sorted := True;
for row := 0 to StrGrid.RowCount - 1 do
StrGrid.Cells[SortColumn, row] := MySortCol[row];
for col := 0 to StrGrid.ColumnCount - 1 do
if col <> SortColumn then
begin
MyListCols.Clear;
for row := 0 to …Run Code Online (Sandbox Code Playgroud) 我试图隐藏 Delphi 在 StringGrid 中当前选定的单元格周围绘制的边框(焦点矩形)。我正在做所有者绘图来自定义字符串网格的外观。我已经成功地摆脱了除了选择之外的所有内容。
我正在使用
GR.Left := -1;
GR.Top := -1;
GR.Right := -1;
GR.Bottom := -1;
StringGrid.Selection := GR;
Run Code Online (Sandbox Code Playgroud)
但如果你设置得非常快,就会出现错误(我在 onMouseMove 中运行它)。我的意思是它工作得很好,但是如果我足够快地调用这个特定的代码块,我会在 StringGrid 的渲染中遇到异常(因此我不能只是放弃尝试,除了它周围)。
关于如何可靠地解决这个问题有什么想法吗?
我在一个有1个FixedCol和1个FixedRow的表单上有一个TStringGrid对象.我希望能够在用户单击该行中的任何单元格时选择对象上的整行.此选择也必须对用户可见(我希望行改变颜色).
编辑:已将goRowSelect放在对象的选项中.现在有一种方法可以在单击固定列中的一个单元格时选择行吗?
只是为了测试我将Delphi 7程序转换为Delphi XE 5的难度,我在Delphi 7上编写了简单的应用程序 - 在Form上放置了TStringGrid,并在表单上添加了代码:
procedure TFMain.FormCreate(Sender: TObject);
begin
With StringGrid1 do
begin
Cells[0,0]:='????€';
end;
end;
Run Code Online (Sandbox Code Playgroud)
(实际上它写为Cells [0,0]:='ce ??€',但我预计会这样做).编译,构建,运行,没有Unicode,原因.然后在Delphi XE 5中重新打开项目,再次将行更改为Cells [0,0]:='čęжэ€',编译,构建,运行 - 并且没有Unicode(类似于čę|||)!这对我来说很奇怪.在Delphi Xe 5上使用相同代码从零开始构建新项目,同样的TStringGrid正在按预期工作.我知道这里有一些简单的技巧,也许是项目设置中的一些变化,但我不能谷歌...也许有人可以提供帮助?
最好的祝福.
我在Windows 10上使用Delphi Berlin.我需要在基于tStringGrid的tForm上使用tOpenDialog.
当我双击一个与打开的对话框上的固定列或行重叠的文件onFixedCellClick事件在打开对话框消失后立即自动触发.在下图中,文件位于第一行的固定行的相同位置.
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
OpenDialog1: TOpenDialog;
procedure FormClick(Sender: TObject);
procedure StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Options := StringGrid1.Options + [goFixedColClick, goFixedRowClick];
end;
procedure TForm1.FormClick(Sender: TObject);
begin
OpenDialog1.Execute;
end;
procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
Caption := '';
end;
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我可以通过移动对话框窗口或单击文件一次并单击打开按钮来处理此问题,但我无法保证将使用此功能的其他人会这样做.
是什么原因以及如何解决这个问题?
我正在使用拉撒路 0.9.30.2。我有一个标准的 TForm,上面有一个标准的 TStringGrid。在设计时,字符串网格上没有列或行。在对象检查器中设置以下值。
ColCount = 0
Columns = 0
FixedCols = 0
FixedRows = 0
RowCount = 0
Run Code Online (Sandbox Code Playgroud)
我想在运行时添加许多 TGridColumns,并且已经能够这样做,但总是得到一个固定列,这是我不想要的。我已经编写了与下面的示例非常相似的代码来执行此操作。当我编译并运行它时,我得到以下结果。
如何在运行时去掉固定列并保留剩余的列?
unit test;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids;
type
TForm1 = class(TForm)
SgGrid: TStringGrid;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.FormCreate(Sender: TObject);
var
GridColumn : TGridColumn;
anIndex : integer;
begin
for anIndex := 0 to 5 do
begin
GridColumn := SgGrid.Columns.Add;
GridColumn.Width := 50;
GridColumn.Title.Caption := 'Col …Run Code Online (Sandbox Code Playgroud) 我将checkboxes(TCheckBox)放在TStringGrid第一列的字符串grid()中.复选框显示正常,正确定位,并在鼠标悬停时通过发光响应鼠标.但是,当我点击它们时,它们不会切换.他们对点击作出反应并突出显示,但最后,实际Checked属性不会改变.更令人费解的是,我没有任何代码在它们存在时更改这些值,我甚至没有OnClick为这些复选框分配事件.此外,我默认这些复选框是未选中的,但在显示时,它们会被检查.
复选框与每个添加到列表中的记录一起创建,并在记录指针内引用,该记录指针分配给要放置复选框的单元格中的对象.
字符串网格黑客用于单元格突出显示:
type
THackStringGrid = class(TStringGrid); //used later...
Run Code Online (Sandbox Code Playgroud)
记录包含复选框:
PImageLink = ^TImageLink;
TImageLink = record
...other stuff...
Checkbox: TCheckbox;
ShowCheckbox: Bool;
end;
Run Code Online (Sandbox Code Playgroud)
创建/销毁复选框:
function NewImageLink(const AFilename: String): PImageLink;
begin
Result:= New(PImageLink);
...other stuff...
Result.Checkbox:= TCheckbox.Create(nil);
Result.Checkbox.Caption:= '';
end;
procedure DestroyImageLink(AImageLink: PImageLink);
begin
AImageLink.Checkbox.Free;
Dispose(AImageLink);
end;
Run Code Online (Sandbox Code Playgroud)
向网格添加行:
//...after clearing grid...
//L = TStringList of original filenames
if L.Count > 0 then
lstFiles.RowCount:= L.Count + 1
else
lstFiles.RowCount:= 2; …Run Code Online (Sandbox Code Playgroud) 我正在开发一种工具,它连接到SQL数据库,获取数据集,并在网格中显示该数据.用户必须能够选择一个单元格块(只是矩形),然后按CTRL+ C将其复制到剪贴板.
我该怎么做呢:
在可以粘贴到Excel的格式?我希望已经有一些现成的东西.它不需要Excel之类的所有剪贴板功能,只需突出显示一组矩形单元格并将其复制到剪贴板即可.
如果它可以在一个TStringGrid我喜欢保持我的功能,但也可以使用支持它的组件.
我在Delphi 7中有一个字符串网格,具有0..N行。如果用户单击列表框编号中的任何数字,则存在一个列表框,其编号从0..N开始,应在stringgrid上选择该行号。
所以我有这个
MystringGrid.Col :=0;
MystringGrid.Row :=Listbox.itemindex;
MystringGrid.Selection:=TGridRect(Rect(0,1 ,1 ,1));
MystringGrid.SetFocus;
Run Code Online (Sandbox Code Playgroud)
这将很好地选择网格上的行(突出显示),但问题是
listbox.itemindex=MystringGrid.rowcount;
Run Code Online (Sandbox Code Playgroud)
那个时候我明白了
Grid Index out of range error
Run Code Online (Sandbox Code Playgroud)
如在grids.pas中
if (ACol < 0) or (ARow < 0) or (ACol >= ColCount) or (ARow >= RowCount) then
InvalidOp(SIndexOutOfRange)
Run Code Online (Sandbox Code Playgroud)
(ARow >= RowCount) 是真的,所以错误
如何选择最后一行?
tstringgrid ×10
delphi ×9
delphi-xe2 ×2
stringgrid ×2
ado ×1
checkbox ×1
clipboard ×1
delphi-7 ×1
excel ×1
firemonkey ×1
fixed ×1
lazarus ×1
mouseevent ×1
ownerdrawn ×1
profiling ×1
sorting ×1
topendialog ×1
unicode ×1