嗨,我有一个使用 VirtualStringTree 的项目,带有此记录:
type
TStudentsSession = record
StudentName : String;
StudentClass : String;
StudentHandRaised:Boolean;
end;
我有这些程序:
Procedure TMainForm.StudentHandRaised(AStudentName: String)
var
Node: PVirtualNode;
Data: ^TStudentsSession;
begin
Node := StudentsVst.GetFirst;
while Node <> nil do
begin
Data := StudentsVst.GetNodeData(Node);
if Data.StudentName = AStudentName then
begin
Data.StudentHandRaised := True;
Break;
end;
Node := StudentsVst.GetNext(Node);
end;
end;
Procedure TMainForm.StudentHandsDown(AStudentName: String)
var
Node: PVirtualNode;
Data: ^TStudentsSession;
begin
Node := StudentsVst.GetFirst;
while Node <> nil do
begin
Data := StudentsVst.GetNodeData(Node);
if Data.StudentName = AStudentName then
begin
Data.StudentHandRaised := False;
Break;
end;
Node := StudentsVst.GetNext(Node);
end;
end;
我们按顺序排列了这 4 名学生:
- 学生A
- 学生B
- 学生C
- 学生D
我想要的是这个:
1:StudentB举手:
- 学生B
- 学生A
- 学生C
- 学生D
2:StudentC举手:
- 学生B
- 学生C
- 学生A
- 学生D
StudentC 不会跳到 StudentB 上(因为 StudentB 还在举手)
3:StudentD举手:
- 学生B
- 学生C
- 学生D
- 学生A
StudentC 不会跳到 StudentB 或 StudentC 上(因为两者都还在举手)
4:StudentB收回手:
- 学生C
- 学生D
- 学生A
- 学生B
StudentB 将被移动到最后一个位置
我尝试使用此程序:
procedure TMainForm.ReArrangeStudents;
var
Node, PreviNode: PVirtualNode;
Data: ^TStudentsSession;
begin
Node := StudentsVst.GetFirst;
while Node <> nil do
begin
Data := StudentsVst.GetNodeData(Node);
if Data.StudentHandRaised then
PreviNode := StudentsVst.GetPrevious(Node, False)
else
PreviNode := StudentsVst.GetNext(Node);
StudentsVst.MoveTo(Node, PreviNode, amInsertBefore, False);
Node := StudentsVst.GetNext(Node);
end;
end;
谢谢你们