2013-05-12 5 views
-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]); 

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; 

результат такого рода будет копией массива, который будет использоваться для заполнения строки сетки, но как я заполнить строку сетки, используя массив записей?

+0

Не сортирует массив Привет/Lo. Сортируйте его нормально. Затем запустите управление gui hi/lo. Используйте ответ из моего ответа на свой последний вопрос. –

+0

@DavidHeffernan, так ли это будет: = 0; hi: = n-1; while lo <= hi do начало выход: = lo; inc (lo); если lo> hi, то перерыв; выход: = hi; dec (hi); – Nathan

+0

Ну, этот код не будет компилироваться. Доходность - псевдокод. Каждый раз, когда вы получаете доход, добавьте элемент с этим индексом. И все готово. –

ответ

1

Строковая сетка не имеет никакой информации или ассоциации с вашей пользовательской записью. Вам нужно будет решить, как вы хотите заполнить сетку на основе данных, которые она представляет. В Delphi нет стандартных операций по размещению данных из записи в сетку. Это связано с тем, что запись может содержать много разных типов данных, которые не могут быть представлены через строку.

Вам необходимо изучить, как работает StringGrid, используя ресурсы, найденные в Интернете, и в документации Delphi на StringGrid.

+0

Я ранее задавал заголовки столбцов для строковой сетки, но как я могу отобразить массив записей в сетке строк. – Nathan

+0

Строковая сетка не обязательно связана с данными любого типа. Вам нужно вручную добавлять строки к нему любым способом. Если вы знаете, как отображать заголовки столбцов, вы также должны понимать, как загружать строки данных. –

+1

Короче говоря, вы должны прочитать документацию о том, как работает управление, прежде чем задавать вопросы, которые являются скорее начальными. –

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); 
+0

Оператор, не применимый к этому операнду, если после этого появится AArray [i] Nathan

+0

Вы должны изменить это, чтобы соответствовать вашему вкусу. IOW, если вы сравниваете «CatScore's», это будет AArray [i] .CatScore Adem

+0

ah okay thanks, также откуда берутся Fpersons? где я занимаюсь этим. он не любит readpersonsfromfile и fillgridwithpersons, а также – Nathan