2014-01-19 1 views
1

Я программирую базу данных в Delphi для своей курсовой работы, и я столкнулся с проблемой.Проверьте, нет ли свободного места в массиве записей

UserRecord = record 
        Forename : string[20]; 
        Surname : string[20]; 
        Username : string[20]; 
        Password : string[20]; 
        gender : boolean; 
       end; 

var 
    User : UserRecord; 
    NewUserForm: TNewUserForm; 
    UserFile : file of UserRecord; 
    UserArray : array[1..20] of UserRecord; 

это урезанная версия моего кода, я хотел бы быть в состоянии сохранить запись «UserRecord» в массив UserArray, что простая вещь, чтобы сделать, но если уже есть один «пользователь 'в первой точке ввода моего массива, он переопределит его. Мне нужно найти способ проверить массив, чтобы найти пустую точку в массиве, поэтому я могу сохранить его там, а не постоянно переопределять первую точку входа.

+3

не использовать массивы фиксированной длины. Используйте динамические массивы 'TList '. Не используйте короткие струны. Используйте 'string'. Кроме того, пол не является 'Boolean' !!! –

+0

Когда вы используете 'файл записи', вы должны объявить свою запись как« упакованную », иначе вы будете сохранять хлам. –

+2

О, и прекратите использовать файл записи! –

ответ

0

Если вы хотите узнать, была ли строка заполнена или равна нулю, лучше всего добавить явный флаг, который вы использовали бы, чтобы пометить реальные строки из удаленных, например, в файлах DBF. Не заполненные ячейки могут считаться такими же, как и удаленные, если вы не хотите изменять длину массива в прогоне.

type UserRecord = record 
    Forename : string[20]; 
    Surname : string[20]; 
    Username : string[20]; 
    Password : string[20]; 
    gender : boolean; 
    FreeSpot : Boolean; 
end; 

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

for I := Low(UserArray) to High(UserArray) do 
    deleteRecord(I); // initialize buffer so we can start saving data 

procedure deleteRecord(const I: integer); 
begin 
    UserArray[ I ].FreeSpot := true; 
end; 

После того, что вы можете сделать спасительный ряд данных рутина, как, что:

// returns the array index where the data was stored, or -1 if did not saved 
function storeRecord(const data: UserRecord): integer; 
begin 
    for Result := Low(UserArray) to High(UserArray) do 
     if UserArray[ Result ].FreeSpot then 
     begin 
     UserArray[ Result ] := data; 
     UserArray[ Result ].FreeSpot := false; 
     Exit(); 
     end; 

    Result := -1; // out of the loop - found no free cell to take 
end; 

В случае, если вы не можете добавить поля к записи вы можете попробовать

type UserRecord = record 
    Forename : string[20]; 
    Surname : string[20]; 
    Username : string[20]; 
    Password : string[20]; 
    gender : boolean; 
end; 
UserRecordSlot = record 
    Data : UserRecord; 
    FreeSpot : Boolean; 
end; 

UserArray : array of UserRecordSlot; 

// returns the array index where the data was stored, or -1 if did not saved 
function storeRecord(const data: UserRecord): integer; 
begin 
    for Result := Low(UserArray) to High(UserArray) do 
     if UserArray[ Result ].FreeSpot then 
     begin 
     UserArray[ Result ].Data := data; 
     UserArray[ Result ].FreeSpot := false; 
     Exit(); 
     end; 

    Result := -1; // out of the loop - found no free cell to take 
end; 
+2

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

+0

@TLama хорошо. Но я действительно не хочу писать весь код :-) Это было просто семена для домашней работы, которую нужно было взять и продолжить по теме starter –

+1

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

1
function AddUserRecord(ARecord: UserRecord; var AUserArray: array of UserRecord): integer; 
var 
    EmptyRecord: UserRecord; 
    I: Integer; 
begin 
    ZeroMemory(@EmptyRecord, SizeOf(UserRecord)); 
    Result := -1; 
    for I := Low(AUserArray) to High(AUserArray) do 
    //Compare with an empty record 
    if CompareMem(@EmptyRecord, @AUserArray[I], SizeOf(UserRecord)) then 
    begin 
     AUserArray[I] := ARecord; 
     Result := I; 
     Exit; 
    end; 
end; 

procedure Test; 
var 
    UserArray : array[1..20] of UserRecord; 
    User : UserRecord; 
begin 
    //initialize record array 
    ZeroMemory(@UserArray, SizeOf(UserArray)); 

    //Your logic to fill the record 
    //ZeroMemory(@User, SizeOf(UserRecord)); 
    //User.Username := 'X'; 

    AddUserRecord(User, UserArray); 

end; 
+0

неявное предположение вместо явного значения ... может однажды укусить.Кроме того, если вы используете 'Exit (value)', то вы должны использовать довольно современный Delphi, и тогда вы, вероятно, сможете сравнивать записи, а не возвращаться к 'CompareMemory' –

+0

Да, я использую XE4, так отредактировал мой андер –

+0

и еще раз, предполагая, что это не лучший способ, и ваш ответ прочен, ошибка, которую он говорит, что это «курсовая работа», поэтому я думаю, что он не может изменить запись. Так что да, твой лучше :), но мои работы в этом случае –

Смежные вопросы