2009-09-18 3 views
4

현재 배열을 쓰고 읽는 클래스를 만들고 있습니다 파일을 열고 파일을 닫으면 모두 잘 작동합니다. 또한 bin 파일에 배열을 쓸 수 있습니다. 그러나 클래스에서 배열을 반환하는 것은 멀리있는 다리입니다.
는 지금까지 내가 할 수 아니에요 거기는이 문제는 주위클래스에서 단일 속성의 동적 배열을 만드는 방법

1) 공공 부분 기능 ReadArrFromFile에서 일하기 : 하나의 배열; ==> I 항상 E2029 식별자 예상 갔지만 ARRAY 발견 단일의 배열 을 : ==> 식별자 예상되지만 배열 함수 Tbinfiles.ReadArrFromFile로 구현에 & 호환 타입 단일 동적 배열

2)를 발견 내가 메인 프로그램에서 하나의 배열을 정의하면

경우 1

), 내가 코드기어 RAD 델파이 함께 일하고 있어요

메인 프로그램에 벌금 ReadArrFromFile에 대한 동일한 문제 2) 작품의 원인이 아니에요 2007windows 비스타.

unit UbinFiles; 

interface 

type 
    TBinFiles = Class 
     private 
     pFileName  : String;   // File name (FILENAME.bin) 
     pFileType  : string;   // File type (of ..) 
     pFileLoc   : string;   // FileLocation path 
     pMyarr   : array of single; // array to receive/provide results 
     pArrLen   : integer;   // To define arraylength 
     pFKA    : file;   // File Known As or the internal name 
     pRecsWritten  : integer;   // # of blocks written towards file 
     pRecsRead  : integer;   // # of blocks read from file 

     public 
     procedure SetFname(const Value: String); 
     procedure SetFtype(const Value: String); 
     procedure SetFLoc(const Value: String); 
     procedure SetArrLen(const Value: integer); 

     constructor Create;             overload; 
     constructor Create(Fname : String);         overload; 
     constructor Create(Fname : String ; Ftype : string);     overload; 
     constructor Create(Fname : String ; Ftype : string ; FLoc : String); overload ; 

     procedure OpenMyFile; 
     procedure CloseMyFile; 
     procedure Write2MyFile(Myarr : array of single); 
     procedure ReadFromMyFile; 
     function CheckBackSpace(MyPath : string) : string ; 
     procedure TSTreadAnArray(Myarr : array of single); 
//---first problem 
     function ReadArrFromFile : array of single; 

     published 

     property Fname : String read pFileName write SetFname; 
     property Ftype : String read pFileType write SetFtype; 
     property FLoc : String read pFileLoc write SetFLoc; 
     property ArrLen : integer read pArrLen write SetArrLen; 

end; 

implementation 

uses 
    Dialogs, SysUtils, StrUtils; // controls required for this class 
// 
//---Constructors----------------------------- 
// 
constructor TBinFiles.Create;    // void constructor 
begin 
    inherited; 
    self.pFileName  := 'MyBinary'; 
    self.pFileType  := ''; 
    self.pFileLoc  := 'C:\Users\'; 
    self.pRecsWritten := 0; 
    self.pRecsRead  := 0; 
end; 

constructor TBinFiles.Create(Fname: String); // contructor + Fname 
begin 
    self.pFileName  := Fname; 
    self.pFileType  := ''; 
    self.pFileLoc  := 'C:\Users\'; 
    self.pRecsWritten := 0; 
    self.pRecsRead  := 0; 
end; 

constructor TBinFiles.Create(Fname: String ; Ftype : string); // constructor etc.. 
begin 
    self.pFileName  := Fname; 
    self.pFileType  := Ftype; 
    self.pFileLoc  := 'C:\Users\'; 
    self.pRecsWritten := 0; 
    self.pRecsRead  := 0; 
end; 

constructor TBinFiles.Create(Fname: String ; Ftype : string ; FLoc : string); 
begin 
    self.pFileName  := Fname; 
    self.pFileType  := Ftype; 
    self.pFileLoc  := CheckBackSpace(FLoc); 
    self.pRecsWritten := 0; 
    self.pRecsRead  := 0; 
end; 
// 
//----setters--------------------------------------- 
// 
procedure TBinFiles.SetFname(const Value: String); // pFileName 
begin 
    pFileName   := Value; 
end; 

procedure TBinFiles.SetFtype(const Value: String); // pFileType 
begin 
    pFileType   := Value; 
end; 

procedure TBinFiles.SetFLoc(const Value: String); // pFileLoc 
begin 
    pFileLoc   := Value; 
end; 

procedure TBinFiles.SetArrLen(const Value: integer); 
begin 
    pArrLen   := Value; 
end; 


// 
//---general functions/procs---- 
// 
procedure Tbinfiles.OpenMyFile; 
begin 
    try 
    AssignFile(self.pFKA, self.pFileLoc + self.pFileName +'.bin'); 
    ReWrite(self.pFKA); 
    except 
    on E : Exception do 
     begin 
     ShowMessage(E.ClassName+' error raised, with message : '+E.Message); 
     end; 
    End; 
end; 

procedure Tbinfiles.CloseMyFile; 
begin 
    CloseFile(self.pFKA); 
End; 

procedure Tbinfiles.Write2MyFile(Myarr : array of single); 
begin 
    BlockWrite(self.pFKA, Myarr, 1,self.pRecsWritten); 
End; 

procedure Tbinfiles.ReadFromMyFile; 
begin 
    BlockRead(self.pFKA, self.pMyarr, 1,self.pRecsread); 
End; 

//------second problem----------------------------------------------<<<<<< doesn't work 

function Tbinfiles.ReadArrFromFile : array of single ; 
begin 
    BlockRead(self.pFKA, self.pMyarr, 1,self.pRecsread); 
End; 

function Tbinfiles.CheckBackSpace(MyPath : string) : string ; 
begin 
    if AnsiRightStr(MyPath, 1) = '\' 
    then Result := MyPath 
    else Result := MyPath + '\' 
    ; 
end; 

procedure Tbinfiles.TSTreadAnArray(Myarr : array of single); 
var i:integer; 
begin 
    for i := 0 to high(Myarr) do 
    begin 
     showmessage('Element ' + intToStr(i)+ floatToStr(MyArr[i])); 
    end; 
end; 

end. 
+2

스택 오버플로에 오신 것을 환영합니다. 다음 번에 문제가 여전히 나타나는 가장 작은 코드 조각으로 코드 샘플을 자르십시오. 구문 오류를 찾기 위해 * 모든 코드를 읽으 려하지 않습니다. –

답변

5

당신은 속성으로 배열을 가질 수 없습니다,하지만 당신은 배열 속성을 가질 수

TMyObject = class 
private 
    function GetSingleArray(aIndex: Integer): Single; 
    procedure SetSingleArray(aIndex: Integer; const Value: Single); 
    function GetSingleArrayCount: Integer; 
    procedure SetSingleArrayCount(const Value: Integer); 
    public 
    property SingleArray[aIndex: Integer]: Single read GetSingleArray write SetSingleArray; 
    //returns or sets the length of the single array 
    property SingleArrayCount: Integer read GetSingleArrayCount write SetSingleArrayCount; 
end; 
4

당신은 이름 유형을 사용할 수 있습니다 - 단위 Types에서 TSingleDynArray을 시도합니다. 그러나 배열 속성 (The_Fox's answer 참조)을 사용하는 것이 더 적절할 수 있습니다.

0

1) 제 선언 어레이 형에서 ..

type 
    TpMyarr = array of single; 

... 및 요 할 수있는보다 :

function ReadArrFromFile : TpMyarr; 

2) 제 dinamic 배열 호 SetLength를 쓰기 전에.

3) '자기'를 사용할 필요가 없습니다. 당신의 프로그램에서!

4) 대신 BlockRead/BlockWrite는 TFileStream delphi 클래스를 사용합니다.

+0

나는 dinamic 배열을 속성으로 할 수 있다는 것을 잊지 않습니다. 공개 섹션에서 선언해야합니다. 속성 MyArr : TpMyarr ReadArrFromFile; –

관련 문제