2016-03-15 47 views
1

我正在創建一個程序,它可以移動一組記錄並將這些學生記錄保存到一個文件中。將一組記錄從文件加載回程序中?

但是我現在希望將數據(StudentName,Class,Grade)重新加載到數組中,然後將它們顯示在另一個表單上的列表框中。

我嘗試了一些方法,但沒有成功。

這是寫在文件中的代碼:

unit NewStudent; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 
    ExtCtrls, studentdata; 


    { TFormNewStudent } 
Type 
    TFormNewStudent = class(TForm) 
    Button1: TButton; 
    ButtonAddStudent: TButton; 
    Button3: TButton; 
    ComboBoxPredictedGrade: TComboBox; 
    EditClass: TEdit; 
    EditName: TEdit; 
    procedure Button1Click(Sender: TObject); 
    procedure Button3Click(Sender: TObject); 
    procedure ButtonAddStudentClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 

    private 
    { private declarations } 
    public 
    { public declarations } 
    end; 

Type 
    TPupil = Record 
    Name:String[30]; 
    ClassGroup:String; 
    ComboBoxPredictedGrade:Integer; 
    end; 

var 
    FormNewStudent: TFormNewStudent; 
    StudentRecArray : Array[1..30] of TPupil; 
    StudentNo:integer; 
    studentFile:TextFile; 
implementation 

{$R *.lfm} 

{ TFormNewStudent } 

procedure TFormNewStudent.Button1Click(Sender: TObject); 
begin 
    FormStudentData.visible:=true; 
    FormNewStudent.visible:=false; 
end; 

procedure TFormNewStudent.Button3Click(Sender: TObject); 
begin 
    FormStudentData.visible:=False; 
    FormNewStudent.visible:=True; 
end; 

procedure TFormNewStudent.ButtonAddStudentClick(Sender: TObject); 
var 
    newStudent:string; 
Begin 
    assignfile(studentFile,'G:\ExamGen\studentfile.txt'); 
    StudentRecArray[StudentNo].Name:=EditName.text; 
    StudentRecArray[StudentNo].ClassGroup:=EditClass.text; 
    StudentRecArray[StudentNo].ComboBoxPredictedGrade:=ComboBoxPredictedGrade.ItemIndex; 
    append(studentFile); 
    newStudent:=(StudentRecArray[StudentNo].Name)+','+(StudentRecArray[StudentNo].ClassGroup)+','+(IntToStr(StudentRecArray[StudentNo].ComboBoxPredictedGrade)); 
    writeln(studentFile,newStudent); 
    closefile(StudentFile); 
    StudentNo := StudentNo + 1; 
end; 

procedure TFormNewStudent.FormCreate(Sender: TObject); 
begin 
    ComboBoxPredictedGrade.Items.Add('A'); 
    ComboBoxPredictedGrade.Items.Add('B'); 
    ComboBoxPredictedGrade.Items.Add('C'); 
    ComboBoxPredictedGrade.Items.Add('D'); 
    ComboBoxPredictedGrade.Items.Add('E'); 
    ComboBoxPredictedGrade.Items.Add('U'); 
end; 



end.      

截圖1:StudentFile
截圖2:通過Zamrony P. Juhara給出AddStudent Form

+1

請將您的學生文件中的內容添加爲文本,而不是截圖。它實際上並不那麼大,我們將無法從圖像中複製/粘貼。 –

+1

你試過幾種方法? 「沒有成功」是什麼意思?有錯誤嗎?結果與預期結果有什麼不同?如果你想要「最好的方法」,那可能就是使用數據庫來存儲這些信息。 –

+2

你的'ClassGroup:string'將永遠不會工作,因爲它沒有定義的長度。您需要使用'ShortString',就像您使用'Name:string [30];'所做的一樣。有了這個說法,一個沒有明確問題陳述的問題(*我已經嘗試了幾種方法,但沒有成功*)是非常難以問及的,圖像只能用於無法用文本顯示的東西。由於您的文件是文本,因此絕對沒有理由將其放在圖像中,並且表單的圖像完全沒有意義且無關緊要。如果您希望我們提供幫助,請儘可能方便地爲我們提供幫助。 –

回答

1
var 
    myFile : TextFile; 
    text : string; 
    lines : TStringList; 
    i  : integer; 
... 

lines := TStringList.Create(); 
AssignFile(studentFile,'G:\ExamGen\studentfile.txt'); 
Reset(studentFile); 

i:=1; 
while not Eof(studentFile) do 
begin 
    ReadLn(studentFile, text); 
    lines.CommaText := text; 
    studentRecArray[i].Name := lines[0]; 
    studentRecArray[i].ClassGroup := lines[1]; 
    studentRecArray[i].ComboBoxPredictedGrade := StrToInt(lines[2]); 
    inc(i); 
end; 

CloseFile(studentFile); 

lines.Free(); 
2

答案是正確的,但你的方法這裏可能不是最方便的。您可以定義包含每個學生信息的記錄,然後編寫程序將該記錄寫入文件,然後編寫另一個記錄讀取該記錄。如果您最終會更改記錄的格式,則還必須重寫此代碼。在我看來,有更好的方法。

您可以定義記錄只包含簡單的成員,如肯·懷特建議:

TPupil = Record 
    Name:String[30]; 
    ClassGroup:String[20]; //some convenient value 
    ComboBoxPredictedGrade:Integer; 
    end; 

這種記錄有固定的大小,幷包含在自身所有需要的信息(版本ClassGroup:String實際存儲指針指向內存中的另一個區域在您的字符串),然後就可以保存並加載它非常容易:

var 
    myFile : File of TPupil; 

procedure TFormNewStudent.ButtonAddStudentClick(Sender: TObject); 
Begin 
    assignfile(studentFile,'G:\ExamGen\studentfile.txt'); 
    StudentRecArray[StudentNo].Name:=EditName.text; 
    StudentRecArray[StudentNo].ClassGroup:=EditClass.text; 
    StudentRecArray[StudentNo].ComboBoxPredictedGrade:=ComboBoxPredictedGrade.ItemIndex; 
    append(studentFile); 

    Write(studentFile,StudentRecArray[StudentNo]); //THAT'S IT! 

    closefile(StudentFile); 
    inc(StudentNo); 
end; 

procedure TFormNewStudent.ReadFromFile; 
begin 
    AssignFile(myFile,'G:\ExamGen\studentfile.txt'); 
    Reset(studentFile); 

    StudentNo:=1; 
    while not Eof(studentFile) do begin 
    Read(studentFile,StudentRecArray[i]); 
    inc(StudentNo); 
    end; 
end; 

很少有缺點:文件也不是那麼可讀像從前那樣,因爲整數是完全一樣的4字節的值保存,不是它的cimal表示。

如果您從一個記錄移動到另一個記錄,那麼您可以使用流式傳輸系統,因爲IDE會將表單保存到光盤,.dfm或.lfm文件中,因此您可以使用流式傳輸系統自動保存對象的複雜層級並將其加載回來。

相關問題