-4

我有记录结构

  Tperson = record
// setting/declaring the record
firstname: string[30];
surname: string[30];
form: string[5];
catscore: real;
predictedgrade: string[2];
giftedandtalented: string[255];
learningdifficulties: string[255];
behaviouraldifficulties: string[255];

我已经使用以下代码将其作为数组读取

procedure TForm1.Button1Click(Sender: TObject);
var
studentarray:array of Tperson;
studentarraycopy:array of tperson;
   i,j,c : integer;
begin
 i:=0;
 reset(personFile);
while not EOF(personfile) do
begin
i:=i+1;
read(personfile, studentArray[i]);

我将对这个记录数组进行排序,然后使用这段代码按照高、低、高、低对其进行排序。

  procedure SerratedSort(var A: array of TPerson);
  var
 s: Integer;
i: Integer;
t: TPerson;
 begin
s := Length(A);
 i := 0;
 while i < s do begin
   t := A[s - 1];
   System.Move(A[i], A[i + 1], (s - i + 1) * SizeOf(TPerson));
   A[i] := t;
   i := i + 2;
  end;
  end;

这种排序的结果将在用于填充字符串网格的数组的副本中,但是如何使用记录数组填充字符串网格?

4

2 回答 2

1

字符串网格不知道或与您的自定义记录相关联。您必须自己决定如何根据网格所代表的数据来填充网格。Delphi 中没有将数据从 Record 放入 Grid 的标准操作。这是因为一条记录可以包含许多不同类型的数据——这些数据可能无法通过字符串表示。

您需要使用 Internet 上的资源和 Delphi 关于 StringGrid 的文档来研究 StringGrid 的工作原理。

于 2013-05-12T20:52:19.883 回答
0
Type
  TPersonArray: array of TPerson;

procedure SerratedSortPersons(var A: TPersonArray);
var
  s: Integer;
  i: Integer;
  t: TPerson;
begin
  s := Length(A);
  i := 0;
  while i < s do begin
    t := A[s - 1];
    System.Move(A[i], A[i + 1], (s - i + 1) * SizeOf(TPerson));
    A[i] := t;
    i := i + 2;
  end;
end;

procedure SortPersons(var AArray: TPersonArray);
var {Basically the same as that posted by Marko Paunovic}
  i: Integer; 
  j: Integer;
  t: TPerson;
begin
  for i := Low(AArray) to High(AArray) - 1 do begin
    for j := i + 1 to High(AArray) do begin
      if AArray[i] < AArray[j] then begin
        t := AArray[i];
        AArray[i] := AArray[j];
        AArray[j] := t;
      end;
    end;
  end;
end;

procedure CopyPersons(const AOriginal: TPersonArray; out ACopy: TPersonArray);
var
  s: Integer;
begin
  s := Length(AOriginal);
  SetLength(ACopy, s);
  System.Move(AOriginal[0], ACopy[0], s * SizeOf(TPerson));
end;

你的程序流程应该是这样的:

ReadPersonsFromFile(FPersons); {do this somewhere else and keep it. So that you don't read from disk every time you need this data}

然后在一个过程中:

CopyPersons(FPersons, FPersonsCopy);
SortPersons(FPersonsCopy);
SerratedSortPersons(FPersonsCopy);
FillGridWithpersons(FPersonsCopy);
于 2013-05-12T22:01:29.130 回答