From: <ob...@us...> - 2008-09-18 11:20:11
|
Revision: 11900 http://jvcl.svn.sourceforge.net/jvcl/?rev=11900&view=rev Author: obones Date: 2008-09-18 18:20:07 +0000 (Thu, 18 Sep 2008) Log Message: ----------- Now compiles with all versions Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-09-17 21:46:01 UTC (rev 11899) +++ trunk/jvcl/run/JvCsvData.pas 2008-09-18 18:20:07 UTC (rev 11900) @@ -1068,7 +1068,7 @@ procedure TJvCsvStream.Append; begin - Stream.Seek(0,soEnd); + Stream.Seek(0, soFromEnd); end; constructor TJvCsvStream.Create(const FileName: string; Mode: DWord; @@ -1084,7 +1084,7 @@ is_rewrite := (Mode and fmJVCSV_REWRITE_FLAG)=fmJVCSV_REWRITE_FLAG; - FStream := TFileStream.Create(Filename, {16 lower bits only}Word(Mode),Rights); + FStream := TFileStream.Create(Filename, {16 lower bits only}Word(Mode){$IFDEF COMPILER6_UP}, Rights{$ENDIF COMPILER6_UP}); //Stream := FStream; { this makes everything in the base class actually work if we inherited from Easy Stream} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wp...@us...> - 2008-10-07 15:40:30
|
Revision: 11948 http://jvcl.svn.sourceforge.net/jvcl/?rev=11948&view=rev Author: wpostma Date: 2008-10-07 15:40:27 +0000 (Tue, 07 Oct 2008) Log Message: ----------- Workaround for seriously annoying behaviour of JvCsvDataSet when DataSet.Separator = ';' but CSVFieldDef still contains commas. Not very much fun to deal with that error. This change does a much more reasonable handling of CsvFieldDef parsing. Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-10-07 15:19:06 UTC (rev 11947) +++ trunk/jvcl/run/JvCsvData.pas 2008-10-07 15:40:27 UTC (rev 11948) @@ -3253,7 +3253,11 @@ if Length(aCsvFieldDef) > 0 then begin - JvStringToCsvRow(aCsvFieldDef, Separator, CsvFieldRec, False, False); + if (Separator<>',') and (Pos(Separator,aCsvFieldDef)=0) then begin + JvStringToCsvRow(aCsvFieldDef, ',', CsvFieldRec, False, False); { workaround for serious annoyance } + end else begin + JvStringToCsvRow(aCsvFieldDef, Separator, CsvFieldRec, False, False); + end; ColNum := 0; while CsvRowGetColumnMarker(CsvFieldRec, ColNum) <> JvCsv_COLUMN_ENDMARKER do This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2008-10-07 17:18:58
|
Revision: 11952 http://jvcl.svn.sourceforge.net/jvcl/?rev=11952&view=rev Author: obones Date: 2008-10-07 17:18:52 +0000 (Tue, 07 Oct 2008) Log Message: ----------- Style cleaning (partial) D5/D6 compatibility Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-10-07 17:18:31 UTC (rev 11951) +++ trunk/jvcl/run/JvCsvData.pas 2008-10-07 17:18:52 UTC (rev 11952) @@ -133,11 +133,11 @@ interface -{$ifdef COMPILER7_UP} +{$IFDEF COMPILER7_UP} // The WideString field code will COMPILE on Delphi 7, but the WideString field only WORKS // on Delphi 2007 and up. -{$define JVCSV_WIDESTRING} -{$endif} +{$DEFINE JVCSV_WIDESTRING} +{$ENDIF COMPILER7_UP} uses {$IFDEF UNITVERSIONING} @@ -147,7 +147,7 @@ Classes, {$IFNDEF NO_UNICODE} JclBase, // now BOM constants are in JclBase formerly in JclUnicode - {$endif} + {$ENDIF NO_UNICODE} JvJCLUtils, // some constants needed. SysUtils, DB; @@ -316,7 +316,9 @@ { Row collection } TJvCsvRows = class(TList) - + private + function GetDecimalSeparator: AnsiChar; + procedure SetDecimalSeparator(const Value: AnsiChar); protected FEnquoteBackslash: Boolean; FBackslashCrLf:Boolean; // Are CR/LFs changed to \r and \n? @@ -341,19 +343,10 @@ function GetRowAllocSize:Integer; function RecordSize:Word; procedure InternalInitRecord(Buffer:TJvRecordBuffer {was PChar}); - private - function GetDecimalSeparator: AnsiChar; - procedure SetDecimalSeparator(const Value: AnsiChar); - - - protected - { note these are not intended to be used outside this unit, so they are protected. access these throught the CsvDataSet class public or published properties only. } property DecimalSeparator : AnsiChar read GetDecimalSeparator write SetDecimalSeparator default USDecimalSeparator; property Separator : AnsiChar read FSeparator write FSeparator; - published - public constructor Create; @@ -406,7 +399,7 @@ private FStream:TFileStream; // Tried TJclFileStream also but it was too slow! Do NOT use JCL streams here. -wpostma. FFilename:String; - FStreamBuffer: {$IFDEF COMPILER12_UP}PByte{$ELSE}PChar{$ENDIF}; + FStreamBuffer: {$IFDEF COMPILER12_UP}PByte{$ELSE}PChar{$ENDIF COMPILER12_UP}; FStreamIndex:Integer; FStreamSize:Integer; FLastReadFlag:Boolean; @@ -456,7 +449,7 @@ FValidateHeaderRow: Boolean; FExtendedHeaderInfo: Boolean; FCreatePaths: Boolean; - FFormatSettings:TFormatSettings; + FFormatSettings: TFormatSettings; procedure SetSeparator(const Value: AnsiChar); procedure InternalQuickSort(SortList: PPointerList; L, R: Integer; @@ -749,9 +742,9 @@ { Row Access as String } function GetRowAsString(const Index: Integer): string; virtual; - {$IFDEF COMPILER12_UP} + {$IFDEF COMPILER12_UP} function GetRowAsAnsiString(const Index: Integer): AnsiString; virtual; - {$endif} + {$ENDIF COMPILER 12_UP} function CurrentRowAsString: string; virtual; // Return any row by index, special: -1 means last row NEW. @@ -981,6 +974,9 @@ {$IFDEF HAS_UNIT_VARIANTS} Variants, {$ENDIF HAS_UNIT_VARIANTS} + {$IFDEF HAS_UNIT_ANSISTRINGS} + AnsiStrings, + {$ENDIF HAS_UNIT_ANSISTRINGS} Controls, Forms, JvVCL5Utils, JvJVCLUtils, @@ -1011,29 +1007,29 @@ raise EJvCsvDataSetError.CreateResFmt(@RsECsvErrFormat, [TableName, Msg]); end; -procedure JvCsvDatabaseError2(const TableName, Msg: string;Code:Integer); +procedure JvCsvDatabaseError2(const TableName, Msg: string; Code: Integer); begin raise EJvCsvDataSetError.CreateResFmt(@RsECsvErrFormat2, [TableName, Msg, Code]); end; -function JvCsvStrToFloatDef(strvalue:String;defvalue:Double;aseparator:AnsiChar):Double; +function JvCsvStrToFloatDef(strvalue: string; defvalue: Double; aseparator: AnsiChar): Double; begin { does not raise exceptions} result := JvSafeStrToFloatDef(strvalue,defvalue, - {$IFDEF COMPILER12_UP}Char({$endif} + {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP} aseparator - {$IFDEF COMPILER12_UP}){$endif} + {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP} ); // // JvJCLUtils end; -function JvCsvStrToFloat(strvalue:String;aseparator:AnsiChar):Double; +function JvCsvStrToFloat(strvalue: string; aseparator: AnsiChar): Double; begin { raises EConvertError exception } result := JvSafeStrToFloat(strvalue, - {$IFDEF COMPILER12_UP}Char({$endif} + {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP} aseparator - {$IFDEF COMPILER12_UP}){$endif} + {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP} ); // // JvJCLUtils end; @@ -1088,33 +1084,11 @@ -{$IFDEF COMPILER12_UP} -// Delphi 2009 says goodbye to good old single-byte Win32 -// API calls, so we have to provide a few of our own to -// avoid a huge number of wasteful String <-> AnsiString inline -// conversions. -function JvCsvUpperCase(sValue:AnsiString):AnsiString; -var - svalue_length: Integer; -begin - svalue_length := Length(sValue); - SetString(Result, PAnsiChar(sValue), svalue_length); - if svalue_length > 0 then - CharUpperBuffA(PAnsiChar(Result), svalue_length); -end; -{$ENDIF} - - - - //------------------------------------------------------------------------- - // TJvCsvStream METHODS - //------------------------------------------------------------------------- - - +//------------------------------------------------------------------------- +// TJvCsvStream METHODS +//------------------------------------------------------------------------- function GetFileSizeEx(h:hFile; FileSize:PULargeInteger):Bool; stdcall; external Kernel32; - - procedure TJvCsvStream.Append; begin Stream.Seek(0, soFromEnd); @@ -1129,8 +1103,8 @@ FFilename := FileName; FLastReadFlag := false; - is_append := (Mode and fmJVCSV_APPEND_FLAG)=fmJVCSV_APPEND_FLAG; - is_rewrite := (Mode and fmJVCSV_REWRITE_FLAG)=fmJVCSV_REWRITE_FLAG; + is_append := (Mode and fmJVCSV_APPEND_FLAG) = fmJVCSV_APPEND_FLAG; + is_rewrite := (Mode and fmJVCSV_REWRITE_FLAG) = fmJVCSV_REWRITE_FLAG; FStream := TFileStream.Create(Filename, {16 lower bits only}Word(Mode){$IFDEF COMPILER6_UP}, Rights{$ENDIF COMPILER6_UP}); @@ -1183,10 +1157,10 @@ } function TJvCsvStream.ReadLine: AnsiString; var - buf : Array of {$IFDEF COMPILER12_UP}Byte{$ELSE}Char{$ENDIF COMPILER12_UP}; - n : Integer; - ok : Boolean; - quote_flag,lf_flag,cr_flag : Boolean; + buf: array of {$IFDEF COMPILER12_UP}Byte{$ELSE}Char{$ENDIF COMPILER12_UP}; + n: Integer; + ok: Boolean; + quote_flag, lf_flag, cr_flag: Boolean; begin { Ignore linefeeds, read until carriage return, strip carriage return, and return it } SetLength(buf,150); @@ -1317,13 +1291,16 @@ constructor TJvCustomCsvDataSet.Create(AOwner: TComponent); begin - inherited Create(AOwner); + FData := TJvCsvRows.Create; - GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,FFormatSettings); { this is updated later, to modify to have custom DecimalSeparator } + {$IFDEF RTL150_UP} + GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FFormatSettings); { this is updated later, to modify to have custom DecimalSeparator } + {$ELSE} + FFormatSettings.DecimalSeparator := DecimalSeparator; + {$ENDIF RTL150_UP} - Separator := ','; // set After creating FData! FCreatePaths := True; // Creates subdirectories automatically when saving. @@ -1384,21 +1361,21 @@ function TJvCustomCsvDataSet.GetSeparator: AnsiChar; begin Assert(Assigned(FData)); - result := FData.Separator; + Result := FData.Separator; end; function TJvCustomCsvDataSet._CsvFloatToStr(fvalue:Double):String; begin - { raises exception EJvConvertError (same as EConvertError) } - FFormatSettings.DecimalSeparator := {$IFDEF COMPILER12_UP}Char({$endif}GetDecimalSeparator {$IFDEF COMPILER12_UP}){$endif}; - result := FloatToStr( fvalue, FFormatSettings ); + // raises exception EJvConvertError (same as EConvertError) + FFormatSettings.DecimalSeparator := {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP}GetDecimalSeparator {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP}; + Result := FloatToStr(fvalue{$IFDEF RTL150_UP}, FFormatSettings{$ENDIF RTL150_UP}); end; function TJvCustomCsvDataSet.GetTextBufferSize: Integer; begin Assert(Assigned(FData)); - result := FData.TextBufferSize; + Result := FData.TextBufferSize; end; procedure TJvCustomCsvDataSet.SetRowUserData(UserData: Pointer); @@ -1469,7 +1446,7 @@ inherited; FFileDirty := False; if FUseSystemDecimalSeparator then begin - FData.DecimalSeparator := {$IFDEF COMPILER12_UP}AnsiChar({$endif}SysUtils.DecimalSeparator{$IFDEF COMPILER12_UP}){$endif}; + FData.DecimalSeparator := {$IFDEF COMPILER12_UP}AnsiChar({$ENDIF COMPILER12_UP}SysUtils.DecimalSeparator{$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP}; end; end; @@ -1795,7 +1772,7 @@ Exit; FieldIndex := FieldRec^.FPhysical; ValueLen := Length(Pattern); // if valuelen is zero then we are searching for blank or nulls - Pattern := {$IFDEF COMPILER12_UP}JvCsvUpperCase{$ELSE}UpperCase{$ENDIF COMPILER12_UP}(Pattern); // make value case insensitive. + Pattern := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(Pattern); // make value case insensitive. // Now check if field value matches given pattern for this row. for I := 0 to FData.Count - 1 do @@ -1813,12 +1790,7 @@ end else begin - FieldValue := - {$IFDEF COMPILER12_UP} - JvCsvUpperCase(FieldValue); - {$ELSE} - UpperCase(FieldValue); - {$ENDIF COMPILER12_UP} + FieldValue := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(FieldValue); if JvCsvWildcardMatch(FieldValue, Pattern) then // hide row if not same prefix begin @@ -2227,8 +2199,8 @@ StrValueB := AnsiString(KeyValues[I + Lo]); if loCaseInsensitive in Options then begin - StrValueA := {$IFDEF COMPILER12_UP}JvCsvUpperCase{$ELSE}UpperCase{$ENDIF COMPILER12_UP}(StrValueA); - StrValueB := {$IFDEF COMPILER12_UP}JvCsvUpperCase{$ELSE}UpperCase{$ENDIF COMPILER12_UP}(StrValueB); + StrValueA := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(StrValueA); + StrValueB := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(StrValueB); end; if StrValueA = StrValueB then Inc(MatchCount) @@ -2476,8 +2448,8 @@ DT: TDateTime; ATimeStamp: TTimeStamp; {$IFDEF JVCSV_WIDESTRING} - NewUniVal:WideString; - {$endif} + NewUniVal: WideString; + {$ENDIF JVCSV_WIDESTRINGS} begin //Trace( 'SetFieldData '+Field.FieldName ); PDestination := GetActiveRecordBuffer; @@ -2518,7 +2490,7 @@ if not Assigned(CsvColumnData) then begin {$IFDEF DEBUGINFO_ON} OutputDebugString('JvCsvData.pas: Column data corrupt or missing.'); - {$endif} + {$ENDIF DEBUGINFO_ON} Exit; end; @@ -2539,7 +2511,7 @@ NewVal := '' else case Field.DataType of - {$IFDEF JVCSV_WIDESTRING} + {$IFDEF JVCSV_WIDESTRING} ftWideString: { New and only working in Delphi 2009. Private-Convention-Warning: Wide fields ALWAYS enquoted. @@ -2551,8 +2523,7 @@ NewVal := _Enquote(Utf8Encode(NewUniVal)); end; - {$ENDIF} - + {$ENDIF JVCSV_WIDESTRING} ftString: begin // ftString appears to be limited to ANSI Strings even in Delphi 2009. @@ -2779,7 +2750,7 @@ ts: TTimeStamp; {$IFDEF JVCSV_WIDESTRING} GetUniValue:WideString; - {$ENDIF} + {$ENDIF JVCSV_WIDESTRING} begin Result := False; @@ -2944,14 +2915,14 @@ //------------------------------------------------------------------------ try case Field.DataType of - {$IFDEF JVCSV_WIDESTRING} + {$IFDEF JVCSV_WIDESTRING} ftWideString: begin {$IFDEF COMPILER12_UP} - GetUniValue := UTF8ToWideString(_Dequote(TempString)); // UTF8Decode deprecated in D2009. Use UTF8ToWideString? - {$else} + GetUniValue := UTF8ToWideString(_Dequote(TempString)); + {$ELSE} GetUniValue := UTF8Decode(_Dequote(TempString)); - {$endif} + {$ENDIF COMPILER12_UP} length_n := Length(GetUniValue)*2; if (length_n>FData.FTextBufferSize) then length_n := FData.FTextBufferSize; @@ -2960,7 +2931,7 @@ MoveMemory( {dest} Buffer, {src} PWideChar(GetUniValue), {count} length_n); PWideChar(Buffer)[Length(GetUniValue)] := WideChar(0); { wide terminal } end; - {$ENDIF JVCSV_WIDESTRING} + {$ENDIF JVCSV_WIDESTRING} // Basic string copy, convert from String to fixed-length // buffer, padded with NUL i.e. Chr(0): @@ -3239,23 +3210,28 @@ aCsvFieldDef := AnsiString(CsvFieldDef); if aCsvFieldDef = '' then begin - if FHasHeaderRow and ReadCsvFileStream then begin + if FHasHeaderRow and ReadCsvFileStream then + begin aCsvFieldDef := FCsvFileTopLine; {formerly FCsvFileAsStrings[0];} {$IFDEF DEBUGINFO_ON} - if (aCsvFieldDef='') then - OutputDebugString('Top line of file empty. CsvFieldDef not provided either.'); - {$endif} + if (aCsvFieldDef='') then + OutputDebugString('Top line of file empty. CsvFieldDef not provided either.'); + {$ENDIF DEBUGINFO_ON} end; + if ExtendedHeaderInfo then CsvFieldDef := String(aCsvFieldDef); end; if Length(aCsvFieldDef) > 0 then begin - if (Separator<>',') and (Pos(Separator,aCsvFieldDef)=0) then begin + if (Separator<>',') and (Pos(Separator,aCsvFieldDef)=0) then + begin JvStringToCsvRow(aCsvFieldDef, ',', CsvFieldRec, False, False); { workaround for serious annoyance } - end else begin + end + else + begin JvStringToCsvRow(aCsvFieldDef, Separator, CsvFieldRec, False, False); end; @@ -3361,14 +3337,14 @@ FieldLen := 0; // automatic. CsvMaxLen := CsvMaxLen + 10; end; - {$IFDEF JVCSV_WIDESTRING} + {$IFDEF JVCSV_WIDESTRING} '~': begin // New UTF8 string type. [ Delphi 2009 only ] CsvMaxLen := CsvMaxLen + FieldLen; VclFieldType := ftWideString; FieldType := jcsvStringUTF8; end - {$ENDIF} + {$ENDIF JVCSV_WIDESTRING} else JvCsvDatabaseError(FTableName, Format(RsEInvalidFieldTypeCharacter, [FieldTypeChar])); end; @@ -3478,18 +3454,20 @@ // creates a TStringList: old method: ExportCsvFile(FOpenFileName); if not WriteCsvFileStream then - raise EJvCsvDataSetError.Create('Unable to write to csv file '+FTableName); + raise EJvCsvDataSetError.Create('Unable to write to csv file '+FTableName); - if FHasHeaderRow then begin + if FHasHeaderRow then + begin FCsvStream.WriteLine(FHeaderRow); end; - for n := 0 to RecordCount-1 do begin - {$ifdef COMPILER12_UP} - CsvLine := JvTrimAnsiStringCrLf( GetRowAsAnsiString(n)); - {$else} - CsvLine := JvTrimAnsiStringCrLf( GetRowAsString(n)); - {$endif} - FCsvStream.WriteLine(CsvLine); + for n := 0 to RecordCount-1 do + begin + {$IFDEF COMPILER12_UP} + CsvLine := JvTrimAnsiStringCrLf( GetRowAsAnsiString(n)); + {$ELSE} + CsvLine := JvTrimAnsiStringCrLf( GetRowAsString(n)); + {$ENDIF COMPILER12_UP} + FCsvStream.WriteLine(CsvLine); end; FreeAndNil(FCsvStream); FFileDirty := False; @@ -3702,46 +3680,44 @@ FCsvFileLoaded := true; - if FLoadsFromFile then begin // The IF condition here is NEW! + if FLoadsFromFile then + begin if not Assigned(FCsvStream) then - FCsvStream := TJvCsvStream.Create(FOpenFileName) + FCsvStream := TJvCsvStream.Create(FOpenFileName) else - FCsvStream.Stream.Position := 0; // rewind. + FCsvStream.Stream.Position := 0; // rewind. if FHasHeaderRow then - FCsvFileTopLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine); + FCsvFileTopLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine); -{$IFNDEF NO_UNICODE} + {$IFNDEF NO_UNICODE} //------------------------------------------------------------------------- // This is the first unicode-friendly feature in JvCsvDataSet... // We can at least still open UTF8 files if they are really just ASCII // files plus a BOM marker like Windows notepad and some other apps add. //------------------------------------------------------------------------- //FUtf8Detected := false; {Future.} - if (Length(FCsvFileTopLine)>3) then begin + if (Length(FCsvFileTopLine)>3) then + begin // JvCsvData can detect the standard UTF-8 mark and work anyways when it is present // but cannot yet decode any special characters. This is a step on the route to proper // UTF-8 support. [uses JclUnicode.BOM_UTF8 to detect.] - if (BOM_UTF8[0]= Ord(FCsvFileTopLine[1])) and - (BOM_UTF8[1]= Ord(FCsvFileTopLine[2])) and - (BOM_UTF8[2]= Ord(FCsvFileTopLine[3])) then begin - // strip UTF-8 marker: - FCsvFileTopLine := Copy(FCsvFileTopLine,4,Length(FCsvFileTopLine)); - //FUtf8Detected := true; {future.} - end; + if (BOM_UTF8[0]= Ord(FCsvFileTopLine[1])) and + (BOM_UTF8[1]= Ord(FCsvFileTopLine[2])) and + (BOM_UTF8[2]= Ord(FCsvFileTopLine[3])) then + begin + // strip UTF-8 marker: + FCsvFileTopLine := Copy(FCsvFileTopLine,4,Length(FCsvFileTopLine)); + //FUtf8Detected := true; {future.} + end; end; -{$ENDIF} + {$ENDIF ~NO_UNICODE} - - Result := True; // it worked! - end; - end; - -function TJvCustomCsvDataSet.WriteCsvFileStream:Boolean; +function TJvCustomCsvDataSet.WriteCsvFileStream: Boolean; begin Result := False; if (FTableName='') then @@ -4057,8 +4033,8 @@ if FCsvCaseInsensitiveComparison then begin - StrLeft := {$IFDEF COMPILER12_UP}JvCsvUpperCase{$ELSE}UpperCase{$ENDIF COMPILER12_UP}(StrLeft); - StrRight := {$IFDEF COMPILER12_UP}JvCsvUpperCase{$ELSE}UpperCase{$ENDIF COMPILER12_UP}(StrRight); + StrLeft := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(StrLeft); + StrRight := {$IFDEF HAS_UNIT_ANSISTRINGS}AnsiStrings.{$ENDIF HAS_UNIT_ANSISTRINGS}UpperCase(StrRight); end; // everything sorts via string sort (default) or numeric sort @@ -4066,8 +4042,8 @@ case Column^.FFlag of jcsvNumeric: begin - NumLeft := JvCsvStrToFloatDef( String(StrLeft), -99999.9, GetSeparator); - NumRight := JvCsvStrToFloatDef( String(StrRight), -99999.9, GetSeparator); + NumLeft := JvCsvStrToFloatDef( string(StrLeft), -99999.9, GetSeparator); + NumRight := JvCsvStrToFloatDef( string(StrRight), -99999.9, GetSeparator); Diff := NumLeft - NumRight; if Diff < -0.02 then Result := -1 @@ -4624,7 +4600,7 @@ JvCsvRowToAnsiString(FData.GetRowPtr(GetIndex), Result); Result := Result; end; -{$endif COMPILER12_UP} +{$ENDIF COMPILER12_UP} // Get names of all the columns as a comma-separated string: @@ -5588,13 +5564,7 @@ DeleteFile(RemoveFile); - {$IFDEF COMPILER12_UP} - // delphi 2009 and later use Win32 CopyFileW - Windows.CopyFile(PWideChar( FileName) , PWideChar( BackupFilename), False); - {$else} - // delphi 2008 and previous use Win32 CopyFileA - Windows.CopyFile(PChar(FileName), PChar(BackupFilename), False); - {$endif} + Windows.CopyFile(PChar(FileName), PChar(BackupFilename), False); Result := True; end; @@ -5808,11 +5778,11 @@ {Write data rows minus column} for t:= 0 to RecordCount-1 do begin - {$ifdef COMPILER12_UP} + {$IFDEF COMPILER12_UP} DataRow := Self.GetRowAsAnsiString(t); - {$else} + {$ELSE} DataRow := Self.GetRowAsString(t); - {$endif} + {$ENDIF COMPILER12_UP} if Length(DataRow) >= JvCsv_MAXLINELENGTH - 1 then raise EJvCsvDataSetError.CreateResFmt(@RsECsvStringTooLong, [Copy(DataRow, 1, 40)]); JvStringToCsvRow(DataRow, Separator, PTempRow, True, EnquoteBackslash); @@ -5835,7 +5805,7 @@ FData.Clear; finally - FreeMem(PTempRow); + FreeMem(PTempRow); end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2008-10-07 18:05:06
|
Revision: 11953 http://jvcl.svn.sourceforge.net/jvcl/?rev=11953&view=rev Author: ahuser Date: 2008-10-07 18:04:58 +0000 (Tue, 07 Oct 2008) Log Message: ----------- Style clean Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-10-07 17:18:52 UTC (rev 11952) +++ trunk/jvcl/run/JvCsvData.pas 2008-10-07 18:04:58 UTC (rev 11953) @@ -100,7 +100,7 @@ // ABC:$80,DEFG:$140,HIJKLMN:%,OPQRST:@ // // $ = string (ftString) - also used if no character is given. -// % = whole integer value (ftInteger) +// % = whole Integer value (ftInteger) // & = floating point value (ftFloat) // @ = Ascii datetime value (ftDateTime) as YYYY/MM/DD HH:MM:SS (Component Specific) // # = Hex-Ascii Timestamp (A93F38C9) seconds since Jan 1, 1970 GMT (Component Specific) @@ -271,7 +271,7 @@ end; { CSV Data File Row is not very dynamic in this version: } - PtrToPtrToCsvRow = ^PCsvRow; // bookmark Data = double pointer indirection! Fun fun fun! + PtrToPtrToCsvRow = ^PCsvRow; // bookmark Data = Double pointer indirection! Fun fun fun! PCsvRow = ^TJvCsvRow; // a pointer to a record @@ -299,7 +299,7 @@ Filtered: Boolean; // row is hidden from view right now. RecursionFlag: Boolean; // helps us fix endless recursion bug in GetFieldData callbacks. WordFieldsAddr:Integer; // 0 or -1 means WordFieldsAddr not allocated yet! 1..n means how many bytes after first byte of TJvCsvRow is the TJvCsvRowWordFields record. - TextMaxLen:Integer; // Max size of Text area! + TextMaxLen:Integer; // Max size of Text area! _Text: array [0..JvCsv_MINLINELENGTH] of AnsiChar; // at least 10 characters of storage. typically MUCH MUCH more (ie 2k typical) end; @@ -328,7 +328,7 @@ FUserTag: array of Integer; FUserLength: Integer; // new dynamic-allocation-sizing fields: - FTextBufferSize : Integer; // How big is TJvCsvRow.Text effectively? + FTextBufferSize : Integer; // How big is TJvCsvRow.Text effectively? FMarginSize : Integer; // How much margin space after the calculated fields? FSeparator:AnsiChar; @@ -356,7 +356,7 @@ procedure InsertRow(const Position: Integer; Item: PCsvRow); - procedure AddRowStr(const Item: AnsiString); // convert String->TJvCsvRow + procedure AddRowStr(const Item: AnsiString); // convert string->TJvCsvRow function GetRowPtr(const RowIndex: Integer): PCsvRow; function GetRowAnsiStr(const RowIndex: Integer): AnsiString; procedure SetRowStr(const RowIndex: Integer; Value: AnsiString); @@ -396,43 +396,40 @@ // stream. //------------------------------------------------------------------------- TJvCsvStream = class(TObject) - private - FStream:TFileStream; // Tried TJclFileStream also but it was too slow! Do NOT use JCL streams here. -wpostma. - FFilename:String; - FStreamBuffer: {$IFDEF COMPILER12_UP}PByte{$ELSE}PChar{$ENDIF COMPILER12_UP}; - FStreamIndex:Integer; - FStreamSize:Integer; - FLastReadFlag:Boolean; + private + FStream: TFileStream; // Tried TJclFileStream also but it was too slow! Do NOT use JCL streams here. -wpostma. + FFilename: string; + FStreamBuffer: {$IFDEF COMPILER12_UP}PByte{$ELSE}PChar{$ENDIF COMPILER12_UP}; + FStreamIndex: Integer; + FStreamSize: Integer; + FLastReadFlag: Boolean; - procedure _StreamReadBufInit; + procedure _StreamReadBufInit; + public + function ReadLine: AnsiString; { read a string, one per line, wow. Text files. Cool eh?} - public + procedure Append; + procedure Rewrite; - function ReadLine:AnsiString; { read a string, one per line, wow. Text files. Cool eh?} + procedure Write(const s: AnsiString); {write a string. wow, eh? } + procedure WriteLine(const s: AnsiString); {write string followed by Cr+Lf } - procedure Append; - procedure Rewrite; + procedure WriteChar(c: AnsiChar); - procedure Write(s:AnsiString); {write a string. wow, eh? } - procedure WriteLine(s:AnsiString); {write string followed by Cr+Lf } + procedure WriteCrLf; + //procedure Write(const s: string); - procedure WriteChar(c:AnsiChar); + function Eof: Boolean; {is at end of file? } - procedure WriteCrLf; - //procedure Write(s:String); + { MODE is typically a fmJVCSV_xxx constant thatimplies a default set of stream mode bits plus some extended bit flags that are specific to this stream type.} + constructor Create(const FileName: string; Mode: DWORD = fmJVCSV_OpenReadShared; Rights: Cardinal = 0); reintroduce; virtual; + destructor Destroy; override; - function Eof:Boolean; {is at end of file? } + function Size: Int64; //override; // sanity - { MODE is typically a fmJVCSV_xxx constant thatimplies a default set of stream mode bits plus some extended bit flags that are specific to this stream type.} - constructor Create(const FileName: string; Mode: DWord = fmJVCSV_OpenReadShared; Rights: Cardinal = 0); reintroduce; virtual; - destructor Destroy; override; - - function Size:Int64; //override; // sanity - - { read-only properties at runtime} - property Filename:String read FFilename; - property Stream:TFileStream read FStream; { Get at the underlying stream object} - + { read-only properties at runtime} + property Filename: string read FFilename; + property Stream: TFileStream read FStream; { Get at the underlying stream object} end; @@ -469,7 +466,7 @@ function GetDecimalSeparator: AnsiChar; procedure SetDecimalSeparator(const Value: AnsiChar); - function _CsvFloatToStr(fvalue:Double):String; + function _CsvFloatToStr(fvalue:Double):string; protected // (rom) inacceptable names. Probably most of this should be private. @@ -480,7 +477,7 @@ FFileDirty: Boolean; // file needs to be written back to disk? FCsvFieldDef: string; // Our own "Csv Field Definition String" - FCsvKeyDef: string; // CSV Key Definition String. Required if FCsvUniqueKeys is True + FCsvKeyDef: string; // CSV Key Definition string. Required if FCsvUniqueKeys is True FCsvKeyCount: Integer; // Set by parsing FCsvKeyDef FAscending: array of Boolean; @@ -520,7 +517,7 @@ FCsvFileLoaded:Boolean; // Did InternalFileOpen already load the file? (makes it so that Duplicate calls don't re-load the entire file.) FCsvStream:TJvCsvStream; - FSpecialDataMarker:String; // Unless defined, OnSpecialData won't ever be called. + FSpecialDataMarker:string; // Unless defined, OnSpecialData won't ever be called. { event pointers } FOnSpecialData: TJvCsvOnSpecialData; // XXX Deprecated feature - suggest removal. -Wpostma. @@ -529,8 +526,8 @@ FOnSetFieldData: TJvCsvOnSetFieldData; // Helps to keep some other thing in sync with the contents of a changing CSV file. - FAlwaysEnquoteStrings:Boolean; // Always put double quotes around strings (for some CSV file reading software this is required.) - FAlwaysEnquoteFloats:Boolean; // Always put double quotes around floating point values (useful when DecimalSeparator==CsvSeparator) + FAlwaysEnquoteStrings:Boolean; // Always put Double quotes around strings (for some CSV file reading software this is required.) + FAlwaysEnquoteFloats:Boolean; // Always put Double quotes around floating point values (useful when DecimalSeparator==CsvSeparator) FUseSystemDecimalSeparator:Boolean; // Default is false which always uses US mode. FAppendOnly:Boolean; // If true, we don't load the entire content of the CSV from disk, only the last row, and every time we append and write, we only maintain the last row in memory (saves a lot of RAM.) @@ -629,7 +626,7 @@ procedure DefChanged(Sender: TObject); override; // handling functions for enquoting,dequoting string fields in csv files. - // handles using the default Excel method which is to double the quotes inside + // handles using the default Excel method which is to Double the quotes inside // quotes. // (rom) inacceptable names @@ -725,7 +722,7 @@ { Special declarations } // as long as the field names and positions have not changed. - procedure AssignFromStrings(const Strings: TStrings); virtual; // update String Data directly. + procedure AssignFromStrings(const Strings: TStrings); virtual; // update string Data directly. procedure AssignToStrings(Strings: TStrings); virtual; procedure DeleteRows(FromRow, ToRow: Integer); // NEW: Quickly zap a bunch of rows: @@ -740,7 +737,7 @@ function GetAsString(const Row, Column: Integer): string; virtual; - { Row Access as String } + { Row Access as string } function GetRowAsString(const Index: Integer): string; virtual; {$IFDEF COMPILER12_UP} function GetRowAsAnsiString(const Index: Integer): AnsiString; virtual; @@ -751,14 +748,14 @@ // Return any row by index, special: -1 means last row function GetColumnsAsString: string; virtual; - { Row Append one String } + { Row Append one string } procedure AppendRowString(const RowAsString: string); // Along with GetRowAsString, easy way to copy a dataset to another dataset! function IsKeyUnique: Boolean; // Checks current row's key uniqueness. Note that FCsvKeyDef MUST be set! procedure SaveToFile(const FileName: string); procedure LoadFromFile(const FileName: string); - procedure DeleteCsvColumn( fieldName:String); // must be done when not Active! [NEW 2007!] + procedure DeleteCsvColumn(const AFieldName: string); // must be done when not Active! [NEW 2007!] {These are made protected so that you can write another derived component which has access to various protected fields } protected @@ -796,7 +793,7 @@ This is only useful if you use the Hex encoded date-time fields. } property TimeZoneCorrection: Integer read FTimeZoneCorrection write FTimeZoneCorrection default 0; - { If False (default) we use the more normal CSV rendering of quotes, which is to double them in + { If False (default) we use the more normal CSV rendering of quotes, which is to Double them in the csv file, but if this property is True, we use backslash-quote to render quotes in the file, which has the side-effect of also requiring all backslashes to themself be escaped by a backslash. So filenames would have to be in the form "c:\\directory\\names\\like\\c\\programmers\\do\\it". @@ -809,7 +806,7 @@ {new} property CreatePaths: Boolean read FCreatePaths write FCreatePaths default True; // When saving, create subdirectories/paths if it doesn't exist? - property SpecialDataMarker:String read FSpecialDataMarker write FSpecialDataMarker; // Unless defined, OnSpecialData won't ever be called. If you have NON-CSV data being parsed/ignored when a certain marker/prefix is found, set it up here. + property SpecialDataMarker:string read FSpecialDataMarker write FSpecialDataMarker; // Unless defined, OnSpecialData won't ever be called. If you have NON-CSV data being parsed/ignored when a certain marker/prefix is found, set it up here. { Additional Events } property OnSpecialData: TJvCsvOnSpecialData read FOnSpecialData write FOnSpecialData; @@ -833,8 +830,8 @@ property HeaderRow: AnsiString read FHeaderRow; // first row of CSV file. property SavesChanges: Boolean read FSavesChanges write FSavesChanges default True; - property AlwaysEnquoteStrings:Boolean read FAlwaysEnquoteStrings write FAlwaysEnquoteStrings; // Always put double quotes around strings (for some CSV file reading software this is required.) - property AlwaysEnquoteFloats:Boolean read FAlwaysEnquoteFloats write FAlwaysEnquoteFloats; // Always put double quotes around floating point values (useful when DecimalSeparator==CsvSeparator) + property AlwaysEnquoteStrings:Boolean read FAlwaysEnquoteStrings write FAlwaysEnquoteStrings; // Always put Double quotes around strings (for some CSV file reading software this is required.) + property AlwaysEnquoteFloats:Boolean read FAlwaysEnquoteFloats write FAlwaysEnquoteFloats; // Always put Double quotes around floating point values (useful when DecimalSeparator==CsvSeparator) property UseSystemDecimalSeparator:Boolean read FUseSystemDecimalSeparator write FUseSystemDecimalSeparator default false; // Default is false which always uses US mode. Must be false by default because of existing code assuming this behaviour. @@ -904,7 +901,7 @@ property AppendOnly; end; -{ CSV String Processing Functions } +{ CSV string Processing Functions } procedure JvCsvRowToAnsiString(RowItem: PCsvRow; var RowString: AnsiString); { modified! } @@ -920,7 +917,7 @@ procedure CsvRowSetColumnMarker(Row: PCsvRow; ColumnIndex: Integer; ColumnMarker: Integer); function CsvRowGetColumnMarker(Row: PCsvRow; ColumnIndex: Integer): Integer; -{ Date/Time String decoding functions } +{ Date/Time string decoding functions } // Decides a TIME_T (A common standard-C-library way of encoding date time values // as a number of seconds since 12:00 AM Jan 1, 1970 UTC) which is stored in Hex @@ -952,7 +949,7 @@ function JvCsvWildcardMatch(Data, Pattern: AnsiString): Boolean; // numeric filter helper function: -function JvCsvNumCondition(FieldValue:Double; compareOperator:TJvCsvFilterNumCompare; numValue:Double):Boolean; +function JvCsvNumCondition(FieldValue: Double; CompareOperator: TJvCsvFilterNumCompare; NumValue: Double): Boolean; {$IFDEF UNITVERSIONING} @@ -978,12 +975,7 @@ AnsiStrings, {$ENDIF HAS_UNIT_ANSISTRINGS} Controls, Forms, - JvVCL5Utils, - JvJVCLUtils, - JvCsvParse, - JvConsts, - JvResources, - JvTypes; + JvVCL5Utils, JvJVCLUtils, JvCsvParse, JvConsts, JvResources, JvTypes; const // These characters cannot be used for separator for various reasons: @@ -1012,62 +1004,52 @@ raise EJvCsvDataSetError.CreateResFmt(@RsECsvErrFormat2, [TableName, Msg, Code]); end; - -function JvCsvStrToFloatDef(strvalue: string; defvalue: Double; aseparator: AnsiChar): Double; +function JvCsvStrToFloatDef(const StrValue: string; DefValue: Double; ASeparator: AnsiChar): Double; begin - { does not raise exceptions} - result := JvSafeStrToFloatDef(strvalue,defvalue, - {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP} - aseparator - {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP} - ); // // JvJCLUtils + { does not raise exceptions} + Result := JvSafeStrToFloatDef(StrValue, DefValue, Char(ASeparator)); // JvJCLUtils end; -function JvCsvStrToFloat(strvalue: string; aseparator: AnsiChar): Double; +function JvCsvStrToFloat(const StrValue: string; ASeparator: AnsiChar): Double; begin - { raises EConvertError exception } - result := JvSafeStrToFloat(strvalue, - {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP} - aseparator - {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP} - ); // // JvJCLUtils + { raises EConvertError exception } + Result := JvSafeStrToFloat(StrValue, Char(ASeparator)); // JvJCLUtils end; - { Trim TRAILING CrLf but not leading, or middle, or spaces } -function JvTrimAnsiStringCrLf(s:AnsiString):AnsiString; +function JvTrimAnsiStringCrLf(const S: AnsiString): AnsiString; var - m:Integer; + I: Integer; begin - for m := Length(s) downto 1 do begin - if (s[m]<>Chr(10)) and (s[m]<>Chr(13)) then - break; + for I := Length(S) downto 1 do + begin + if (S[I] <> #10) and (S[I] <> #13) then + begin + Result := Copy(S, 1, I); + Exit; end; - if m < Length(s) then - result := Copy(s,1,m) - else - result := s; - - + end; + Result := S; end; {Word fields are fixed size, but variable location, so we need to FIND them.} -function GetWordFields(RowItem: PCsvRow):PJvCsvRowWordFields; +function GetWordFields(RowItem: PCsvRow): PJvCsvRowWordFields; var - p:PAnsiChar; - magic:Cardinal; + P: PAnsiChar; + Magic: Cardinal; begin Assert(Assigned(RowItem)); - if (RowItem^.Magic <> JvCsvRowMagic ) then - raise EJvCsvDataSetError.Create('Internal error. Memory corruption suspected in CsvRow memory area'); + + if RowItem^.Magic <> JvCsvRowMagic then + raise EJvCsvDataSetError.Create('Internal error. Memory corruption suspected in CsvRow memory area'); Assert(RowItem^.WordFieldsAddr > 0); - p := Pointer(RowItem); - Inc(p, RowItem.WordFieldsAddr ); + P := Pointer(RowItem); + Inc(P, RowItem.WordFieldsAddr); - result := PJvCsvRowWordFields( p ); - magic := result^.Magic2; - if (magic<>JvCsvRowMagic2) then - raise EJvCsvDataSetError.Create('Memory Corruption Suspected in WordFields area of CsvRow memory'); // memory corruption check! + Result := PJvCsvRowWordFields(P); + Magic := Result^.Magic2; + if Magic <> JvCsvRowMagic2 then + raise EJvCsvDataSetError.Create('Memory Corruption Suspected in WordFields area of CsvRow memory'); // memory corruption check! end; {Calculated data area is now after the word fields, and we need to locate the area } @@ -1077,72 +1059,66 @@ Assert(RowItem^.Magic = JvCsvRowMagic ); Assert(RowItem^.AllocSize>0); Assert(RowItem^.WordFieldsAddr > 0); - result := RowItem^.WordFieldsAddr+SizeOf(TJvCsvRowWordFields); - Assert(result< RowItem^.AllocSize); -end; + Result := RowItem^.WordFieldsAddr + SizeOf(TJvCsvRowWordFields); + Assert(Result < RowItem^.AllocSize); +end; - //------------------------------------------------------------------------- // TJvCsvStream METHODS //------------------------------------------------------------------------- -function GetFileSizeEx(h:hFile; FileSize:PULargeInteger):Bool; stdcall; external Kernel32; +function GetFileSizeEx(h: HFILE; FileSize: PULargeInteger): BOOL; stdcall; + external Kernel32; procedure TJvCsvStream.Append; begin Stream.Seek(0, soFromEnd); end; -constructor TJvCsvStream.Create(const FileName: string; Mode: DWord; - Rights: Cardinal); +constructor TJvCsvStream.Create(const FileName: string; Mode: DWORD; Rights: Cardinal); var - is_append:Boolean; - is_rewrite:Boolean; + IsAppend: Boolean; + IsRewrite: Boolean; begin - FFilename := FileName; + FFilename := FileName; - FLastReadFlag := false; - is_append := (Mode and fmJVCSV_APPEND_FLAG) = fmJVCSV_APPEND_FLAG; - is_rewrite := (Mode and fmJVCSV_REWRITE_FLAG) = fmJVCSV_REWRITE_FLAG; + FLastReadFlag := False; + IsAppend := (Mode and fmJVCSV_APPEND_FLAG) = fmJVCSV_APPEND_FLAG; + IsRewrite := (Mode and fmJVCSV_REWRITE_FLAG) = fmJVCSV_REWRITE_FLAG; + FStream := TFileStream.Create(Filename, {16 lower bits only}Word(Mode){$IFDEF COMPILER6_UP}, Rights{$ENDIF COMPILER6_UP}); - FStream := TFileStream.Create(Filename, {16 lower bits only}Word(Mode){$IFDEF COMPILER6_UP}, Rights{$ENDIF COMPILER6_UP}); + //Stream := FStream; { this makes everything in the base class actually work if we inherited from Easy Stream} - //Stream := FStream; { this makes everything in the base class actually work if we inherited from Easy Stream} + if IsAppend then + Self.Append // seek to the end. + else + Stream.Position := 0; - if is_append then begin - Self.Append // seek to the end. - end else - Stream.Position := 0; + if IsRewrite then + Rewrite; - if is_rewrite then - Rewrite; - - - _StreamReadBufInit; - + _StreamReadBufInit; end; destructor TJvCsvStream.Destroy; begin if Assigned(FStream) then FStream.Position := 0; // avoid nukage - FreeAndNil( FStream ); + FreeAndNil(FStream); FreeMem(FStreamBuffer); // Buffered reads for speed. inherited; end; - - function TJvCsvStream.Eof: Boolean; begin if not Assigned(FStream) then - result := false - //Result:= True + Result := False + //Result := True else - result := (FLastReadFlag) and (FStreamIndex>=FStreamSize); - //Result:= FStream.Position >= FStream.Size; + Result := FLastReadFlag and (FStreamIndex >= FStreamSize); + //Result := FStream.Position >= FStream.Size; end; { TJvCsvStream.ReadLine: @@ -1157,79 +1133,88 @@ } function TJvCsvStream.ReadLine: AnsiString; var - buf: array of {$IFDEF COMPILER12_UP}Byte{$ELSE}Char{$ENDIF COMPILER12_UP}; + Buf: array of {$IFDEF COMPILER12_UP}Byte{$ELSE}Char{$ENDIF COMPILER12_UP}; n: Integer; ok: Boolean; - quote_flag, lf_flag, cr_flag: Boolean; + QuoteFlag, LfFlag, CrFlag: Boolean; begin { Ignore linefeeds, read until carriage return, strip carriage return, and return it } - SetLength(buf,150); + SetLength(Buf,150); -// SetLength(buf,JvCsv_MAXLINELENGTH);//16384; +// SetLength(Buf,JvCsv_MAXLINELENGTH);//16384; // count := 1; n := 0; - lf_flag := false; - cr_flag := false; - quote_flag := false; + LfFlag := False; + CrFlag := False; + QuoteFlag := False; repeat - if (n>=Length(buf)) then - SetLength(buf,n+100); + if n >= Length(Buf) then + SetLength(Buf, n + 100); - if ( FStreamIndex>=FStreamSize) then begin - FStreamSize := Stream.Read( FStreamBuffer[0], JvCsvStreamReadChunkSize); - if (FStreamSize=0) then - begin - if (FStream.Position >= FStream.Size) then - FLastReadFlag:= True - else - raise EJvCsvDataSetError.Create('Can''t read CSV file '+FFilename) - end - else if (FStreamSize<JvCsvStreamReadChunkSize) then begin - FLastReadFlag := true; - end; - FStreamIndex := 0; - end; - if ( FStreamIndex>=FStreamSize) then begin - ok := false; + if FStreamIndex >= FStreamSize then + begin + FStreamSize := Stream.Read(FStreamBuffer[0], JvCsvStreamReadChunkSize); + if FStreamSize = 0 then + begin + if FStream.Position >= FStream.Size then + FLastReadFlag:= True + else + raise EJvCsvDataSetError.CreateFmt('Can''t read CSV file %s', [FFilename]); end - else begin - buf[n] := FStreamBuffer[FStreamIndex]; // p^; - Inc(FStreamIndex); - ok := true; - end; + else + if FStreamSize < JvCsvStreamReadChunkSize then + FLastReadFlag := True; + FStreamIndex := 0; + end; - if ok then begin - if buf[n]> JvCsvQuote {34} then begin // test for MOST common case first! - Inc(n); - cr_flag := false; - lf_flag := false; - end else begin - if buf[n]=JvCsvQuote {34} then // quote - quote_flag := not quote_flag; + if FStreamIndex >= FStreamSize then + ok := False + else + begin + Buf[n] := FStreamBuffer[FStreamIndex]; // p^; + Inc(FStreamIndex); + ok := True; + end; - if buf[n]=JvCsvLf {10} then begin // linefeed - lf_flag := true; - Inc(n); - end else if buf[n]= JvCsvCR {13} then begin // carriage return - cr_flag := true; - Inc(n); - end else begin - Inc(n); - cr_flag := false; - lf_flag := false; - end; - if (cr_flag) and (lf_flag) and (not quote_flag) then begin - break; - end; + if ok then + begin + if Buf[n]> JvCsvQuote {34} then // test for MOST common case first! + begin + Inc(n); + CrFlag := False; + LfFlag := False; + end + else + begin + if Buf[n] = JvCsvQuote {34} then // quote + QuoteFlag := not QuoteFlag; - end; - end; + if Buf[n] = JvCsvLf {10} then // linefeed + begin + LfFlag := True; + Inc(n); + end else + if Buf[n]= JvCsvCR {13} then // carriage return + begin + CrFlag := True; + Inc(n); + end else + begin + Inc(n); + CrFlag := False; + LfFlag := False; + end; + + if CrFlag and LfFlag and not QuoteFlag then + Break; + end; + end; until not ok; - SetLength(buf,n); + SetLength(Buf, n); - result := PAnsiChar(@buf[0]); { was String(buf) } + Result := PAnsiChar(@Buf[0]); { was string(Buf) } end; procedure TJvCsvStream.Rewrite; @@ -1240,55 +1225,48 @@ function TJvCsvStream.Size: Int64; { Get file size } begin - if Assigned(FStream) then begin - GetFileSizeEx( FStream.Handle, PULargeInteger(@result) ); {int64 result} - end else - result := 0; - + if Assigned(FStream) then + GetFileSizeEx(FStream.Handle, PULargeInteger(@Result)) {int64 Result} + else + Result := 0; end; -{ Look at this. A stream that can handle a String parameter. What will they think of next? } -procedure TJvCsvStream.Write(s: AnsiString); +{ Look at this. A stream that can handle a string parameter. What will they think of next? } +procedure TJvCsvStream.Write(const s: AnsiString); begin - Stream.Write( s[1],Length(s) ); {The author of TStreams would like you not to be able to just write Stream.Write(s). Weird. } + Stream.Write(s[1], Length(s)); {The author of TStreams would like you not to be able to just write Stream.Write(s). Weird. } end; procedure TJvCsvStream.WriteChar(c: AnsiChar); begin - Stream.Write(c,1); + Stream.Write(c, 1); end; procedure TJvCsvStream.WriteCrLf; begin - WriteChar(Chr(13)); - WriteChar(Chr(10)); + WriteChar(#13); + WriteChar(#10); end; -procedure TJvCsvStream.WriteLine(s: AnsiString); +procedure TJvCsvStream.WriteLine(const s: AnsiString); begin - Write(s); - WriteCrLf; + Write(s); + WriteCrLf; end; - - - - - procedure TJvCsvStream._StreamReadBufInit; begin - if not Assigned(FStreamBuffer) then begin - //FStreamBuffer := AllocMem( JvCsvStreamReadChunkSize); - GetMem(FStreamBuffer,JvCsvStreamReadChunkSize); + if not Assigned(FStreamBuffer) then + begin + //FStreamBuffer := AllocMem( JvCsvStreamReadChunkSize); + GetMem(FStreamBuffer,JvCsvStreamReadChunkSize); end; - end; //------------------------------------------------------------------------- - // TJvCustomCsvDataSet METHODS - //------------------------------------------------------------------------- +// TJvCustomCsvDataSet METHODS +//------------------------------------------------------------------------- - constructor TJvCustomCsvDataSet.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -1364,14 +1342,13 @@ Result := FData.Separator; end; -function TJvCustomCsvDataSet._CsvFloatToStr(fvalue:Double):String; +function TJvCustomCsvDataSet._CsvFloatToStr(fvalue:Double):string; begin // raises exception EJvConvertError (same as EConvertError) FFormatSettings.DecimalSeparator := {$IFDEF COMPILER12_UP}Char({$ENDIF COMPILER12_UP}GetDecimalSeparator {$IFDEF COMPILER12_UP}){$ENDIF COMPILER12_UP}; Result := FloatToStr(fvalue{$IFDEF RTL150_UP}, FFormatSettings{$ENDIF RTL150_UP}); end; - function TJvCustomCsvDataSet.GetTextBufferSize: Integer; begin Assert(Assigned(FData)); @@ -1480,25 +1457,23 @@ end; // JvCsv Numeric filtering helper function: -function JvCsvNumCondition(FieldValue:Double; compareOperator:TJvCsvFilterNumCompare; numValue:Double):Boolean; +function JvCsvNumCondition(FieldValue: Double; CompareOperator: TJvCsvFilterNumCompare; NumValue: Double):Boolean; begin -result := false; - case compareOperator of + case CompareOperator of + jfIntEqual: + Result := Trunc(FieldValue) = Trunc(NumValue); - jfIntEqual: - result := ( Trunc(FieldValue)=Trunc(numValue) ); + jfIntNotEqual: + Result := Trunc(FieldValue) <> Trunc(NumValue); - jfIntNotEqual: - result := ( Trunc(FieldValue)<>Trunc(numValue) ); + jfLessThan: + Result := FieldValue < NumValue; - jfLessThan: - result := ( FieldValue < numValue ); - - jfGreaterThan: - result := ( FieldValue > numValue ); - - end; - + jfGreaterThan: + Result := FieldValue > NumValue; + else + Result := False; + end; end; // Recursive wildcard matching function @@ -1523,6 +1498,7 @@ // replace all '%%' -> '%' (don't put duplicate wildcards in) I := 1; while I < PatternLength do + begin if (Pattern[I] = '%') and (Pattern[I + 1] = '%') then begin Pattern := Copy(Pattern, 1, I) + Copy(Pattern, I + 2, PatternLength); @@ -1530,23 +1506,24 @@ end else Inc(I); + end; // find any | and split into two or more strings, and run ORs on them - FirstBoolCondition := Pos('&', String(Pattern)); + FirstBoolCondition := Pos('&', string(Pattern)); if FirstBoolCondition > 0 then begin Result := _WildcardsMatchBoolOp(Data, Pattern, '&'); Exit; end; - FirstBoolCondition := Pos('|', String(Pattern)); + FirstBoolCondition := Pos('|', string(Pattern)); if FirstBoolCondition > 0 then begin Result := _WildcardsMatchBoolOp(Data, Pattern, '|'); Exit; end; - FirstWildcard := Pos('%', String(Pattern)); // wildcards? + FirstWildcard := Pos('%', string(Pattern)); // wildcards? if FirstWildcard = 0 then - FirstWildcard := Pos('?', String(Pattern)); // other wildcard. + FirstWildcard := Pos('?', string(Pattern)); // other wildcard. if FirstWildcard <= 0 then begin // no wildcard case. @@ -1655,7 +1632,6 @@ First; end; - procedure TJvCustomCsvDataSet.SetFilterOnNull(const FieldName: string; NullFlag: Boolean); var I: Integer; @@ -1686,17 +1662,16 @@ First; end; - procedure TJvCustomCsvDataSet.SetMarginSize(const Value: Integer); begin if Active then - raise Exception.Create('Can''t change memory properties on an active data set'); + raise Exception.Create('Can''t change memory properties on an active data set'); - Assert(Assigned(FData)); + Assert(Assigned(FData)); FData.MarginSize := Value; end; -// Numeric Filtering: Make Rows Visible Only if they match an integer or floating point numeric comparison operator. +// Numeric Filtering: Make Rows Visible Only if they match an Integer or floating point numeric comparison operator. // evaluate condition: // [FieldName] [numericoperator: < > = <> ] [Numeric Value Parameter] procedure TJvCustomCsvDataSet.SetFilterNum(const FieldName: string; compareOperator:TJvCsvFilterNumCompare; numValue: Double ); @@ -1727,33 +1702,29 @@ sFieldValue := FData.GetARowItem(I, FieldIndex); if (Length(sFieldValue) > 0) and (sFieldValue[1] = '"') then sFieldValue := _Dequote(sFieldValue); // remove quotes. - //sFieldValue := UpperCase(sFieldValue); // pointless on numerics - try - FieldValue := JvCsvStrToFloat( String(sFieldValue), GetSeparator); // remember, this baby throws EConvertError on exception! + //sFieldValue := UpperCase(sFieldValue); // pointless on numerics + try + FieldValue := JvCsvStrToFloat(string(sFieldValue), GetSeparator); // remember, this baby throws EConvertError on exception! - // if { FieldValue [ = <> > < ] numValue } then.... - if JvCsvNumCondition(FieldValue, compareOperator, numValue) then // hide row if not same prefix - begin - // Inc(stillVisible) // count the number that are still visible. - end - else begin - PRow^.Filtered := True - end; - except - on E:EConvertError do begin - PRow^.Filtered := True; // hide error rows. - end; - end; - - end;{if not already hidden!} - + // if { FieldValue [ = <> > < ] numValue } then.... + if JvCsvNumCondition(FieldValue, compareOperator, numValue) then // hide row if not same prefix + begin + // Inc(stillVisible) // count the number that are still visible. + end + else + PRow^.Filtered := True + except + on E: EConvertError do + PRow^.Filtered := True; // hide error rows. + end; + end;{if not already hidden!} end;{ for loop} FIsFiltered := True; if Active then First; end; -// String Filtering: Make Rows Visible Only if they match filterString +// string Filtering: Make Rows Visible Only if they match filterString procedure TJvCustomCsvDataSet.SetFilter(const FieldName: string; Pattern: AnsiString); var @@ -1813,8 +1784,8 @@ at once. } function TJvCustomCsvDataSet._AllocateRow: PCsvRow; begin - result := PCsvRow( AllocMem( FData.GetRowAllocSize )); - FData.InternalInitRecord( TJvRecordBuffer(result)); // {was PChar(result) } + Result := PCsvRow( AllocMem( FData.GetRowAllocSize )); + FData.InternalInitRecord( TJvRecordBuffer(Result)); // {was PChar(Result) } end; procedure TJvCustomCsvDataSet._ClearFilter; // Clear Previous Filtering. @@ -1854,7 +1825,7 @@ function TJvCustomCsvDataSet.AllocRecordBuffer: TJvRecordBuffer; begin Assert(Assigned(FData)); - result := FData.AllocRecordBuffer; + Result := FData.AllocRecordBuffer; end; { calc fields support } @@ -1865,9 +1836,7 @@ // a dynamically resized buffer used for calculated field // storage: { was FillChar } - FillChar( Buffer[ GetCalcDataOffset(PCsvRow(Buffer)) ], - JvCsv_MaxCalcDataOffset{CalcFieldsSize}, - {initbytevalue}0 ); + FillChar(Buffer[GetCalcDataOffset(PCsvRow(Buffer))], JvCsv_MaxCalcDataOffset{CalcFieldsSize}, {initbytevalue}0 ); end; { calc fields support and buffer support } @@ -1915,15 +1884,12 @@ FData.FEnquoteBackslash := Value; end; - function TJvCustomCsvDataSet.GetEnquoteBackslash: Boolean; begin Assert(Assigned(FData)); - result := FData.FEnquoteBackslash; + Result := FData.FEnquoteBackslash; end; - - procedure TJvCustomCsvDataSet.FreeRecordBuffer(var Buffer: TJvRecordBuffer { was PChar} ); begin if Buffer <> nil then @@ -1958,8 +1924,6 @@ RowPtr^.Index := -1; // Not Yet Indexed RowPtr^.IsDirty := RowAlreadySaved; - - RowPtr^.Bookmark.Flag := bfEOF; RowPtr^.Bookmark.Data := JvCsv_ON_BOF_CRACK; // no index into FData yet. CsvRowSetColumnMarker(RowPtr, {column} 0, {marker value} 0); @@ -2024,7 +1988,7 @@ TempString := GetCsvRowItem(RowPtr, PhysicalLocation); - // Strip quotes first (Both floating point and String fields can get enquoted on us) + // Strip quotes first (Both floating point and string fields can get enquoted on us) if Field.DataType in [ftString,ftFloat] then begin L := Length(TempString); @@ -2038,15 +2002,15 @@ ftString: Result := TempString; ftInteger: - Result := StrToInt( String(TempString) ); + Result := StrToInt( string(TempString) ); ftFloat: { Default CLASSIC behaviour of this component is to encode outgoing data in US format regardless of system regional settings. This has become more flexible now, but we still default at designtime-defaults to using a DOT. } - Result := JvCsvStrToFloat( String(TempString), GetSeparator ); + Result := JvCsvStrToFloat( string(TempString), GetSeparator ); ftBoolean: - if StrToIntDef(String(TempString), 0) <> 0 then + if StrToIntDef(string(TempString), 0) <> 0 then Result := True else Result := False; @@ -2084,7 +2048,7 @@ Result := -1; // failed. FieldLookup := FieldByName(FieldName); if FieldLookup.DataType <> ftInteger then - Exit; // failed. Can only auto increment on integer fields! + Exit; // failed. Can only auto increment on Integer fields! if not Assigned(FieldLookup) then Exit; //failed. @@ -2162,7 +2126,7 @@ begin if I < Count then begin - FieldLookup[I] := FieldByName( String(KeyFieldArray[I]) ); + FieldLookup[I] := FieldByName( string(KeyFieldArray[I]) ); CsvColumnData[I] := FCsvColumns.FindByFieldNo(FieldLookup[I].FieldNo); if not Assigned(FieldLookup[I]) then Exit; @@ -2397,9 +2361,9 @@ begin LocalEnquoteBackslash := GetEnquoteBackslash; // can force on, or let it turn on automatically. - if Pos( String(StrVal), Cr) > 0 then // we are going to need to enquote the backslashes + if Pos( string(StrVal), Cr) > 0 then // we are going to need to enquote the backslashes LocalEnquoteBackslash := True; // absolutely need it in just this case. - if Pos( String(StrVal), Lf) > 0 then + if Pos( string(StrVal), Lf) > 0 then LocalEnquoteBackslash := True; // absolutely need it in just this case. S := '"'; @@ -2548,52 +2512,46 @@ CP := Field.Size - 1; NewVal := Copy(PAnsiChar(Buffer), 1, CP + 1); //---------------------------------------------------------------------------------------------------- - // STRING ENQUOTING IN CSV: If user displayed value contains a comma, a backslash, or a double quote character + // string ENQUOTING IN CSV: If user displayed value contains a comma, a backslash, or a Double quote character // then we MUST encode the whole string as a string literal in quotes with the embeddded quotes // and backslashes preceded by a backslash character. //---------------------------------------------------------------------------------------------------- if AlwaysEnquoteStrings - or ( Pos(String(Separator), String(NewVal) ) > 0) - or ( Pos(Cr, String(NewVal) ) > 0) - or ( Pos(Lf, String(NewVal) ) > 0) - or ( Pos('"', String(NewVal) ) > 0) - or ( (Pos('\', String(NewVal) ) > 0) and EnquoteBackslash) - then - NewVal := _Enquote(NewVal); // puts whole string in quotes, escapes embedded commas and quote characters! + or (Pos(string(Separator), string(NewVal)) > 0) + or (Pos(Cr, string(NewVal)) > 0) + or (Pos(Lf, string(NewVal)) > 0) + or (Pos('"', string(NewVal)) > 0) + or ((Pos('\', string(NewVal)) > 0) and EnquoteBackslash) + then + NewVal := _Enquote(NewVal); // puts whole string in quotes, escapes embedded commas and quote characters! - - (*end;*) - end; ftInteger: - begin - NewVal := AnsiString(IntToStr(PInteger(Buffer)^)); + begin + NewVal := AnsiString(IntToStr(PInteger(Buffer)^)); + end; - end; - - ftFloat: begin - NewVal := AnsiString(_CsvFloatToStr(PDouble(Buffer)^)); - - if (( AlwaysEnquoteFloats) or ( Separator=GetDecimalSeparator ) ) then - NewVal := _Enquote(NewVal); // puts whole string in quotes, escapes embedded commas and quote characters! - + NewVal := AnsiString(_CsvFloatToStr(PDouble(Buffer)^)); + if (AlwaysEnquoteFloats or (Separator = GetDecimalSeparator ) ) then + NewVal := _Enquote(NewVal); // puts whole string in quotes, escapes embedded commas and quote characters! end; ftBoolean: NewVal := AnsiString(IntToStr(Ord(PWordBool(Buffer)^))); // bugfix May 26, 2003 - WP + // There are two ways of handling date and time: ftDate: // NEW: TDateField support! if (CsvColumnData^.FFlag = jcsvAsciiDate) then - begin - ATimeStamp.Time := 0; - ATimeStamp.Date := Integer(Buffer^); - DT := TimeStampToDateTime(ATimeStamp); - NewVal := JvDateIsoStr(DT); - end - else - JvCsvDatabaseError2(FTableName, RsEFieldTypeNotHandled, Ord(CsvColumnData^.FFlag)); + begin + ATimeStamp.Time := 0; + ATimeStamp.Date := Integer(Buffer^); + DT := TimeStampToDateTime(ATimeStamp); + NewVal := JvDateIsoStr(DT); + end + else + JvCsvDatabaseError2(FTableName, RsEFieldTypeNotHandled, Ord(CsvColumnData^.FFlag)); ftTime: // NEW: TTimeField support! if CsvColumnData^.FFlag = jcsvAsciiTime then begin @@ -2642,7 +2600,7 @@ JvCsvDatabaseError2(FTableName, RsEFieldTypeNotHandled, Ord(CsvColumnData^.FFlag)); end; - // Set new Data value (NewVal = String) + // Set new Data value (NewVal = string) SetCsvRowItem(RowPtr, PhysicalLocation, NewVal); if Assigned(FOnSetFieldData) and (RowPtr^.Index >= 0) then FOnSetFieldData(Self, FData.GetUserTag(RowPtr^.Index), FData.GetUserData(RowPtr^.Index), Field.FieldName, NewVal); @@ -2756,8 +2714,6 @@ //Trace( 'GetFieldData '+Field.FieldName ); - - if not FCursorOpen then Exit; if Field = nil then @@ -2933,7 +2889,7 @@ end; {$ENDIF JVCSV_WIDESTRING} - // Basic string copy, convert from String to fixed-length + // Basic string copy, convert from string to fixed-length // buffer, padded with NUL i.e. Chr(0): ftString: begin @@ -2952,15 +2908,15 @@ end; // Standard Integer conversion: ftInteger: - PInteger(Buffer)^ := StrToInt(String(TempString)); + PInteger(Buffer)^ := StrToInt(string(TempString)); // Standard Double-precision Float conversion: ftFloat: - PDouble(Buffer)^ := JvCsvStrToFloat(String(TempString),GetSeparator); // was StrToFloatUS + PDouble(Buffer)^ := JvCsvStrToFloat(string(TempString),GetSeparator); // was StrToFloatUS ftBoolean: if TempString = '' then PInteger(Buffer)^ := 0 else - if StrToIntDef( String(TempString), 0) <> 0 then + if StrToIntDef( string(TempString), 0) <> 0 then PWordBool(Buffer)^ := True // bugfix May 26, 2003 - WP else PWordBool(Buffer)^ := False; // bugfix May 26, 2003 - WP @@ -2976,7 +2932,7 @@ Exit; end; // XXX Delphi Weirdness Ahead. Read docs before you try to - // understand this. The data in Buffer^ is an integer timestamp + // understand this. The data in Buffer^ is an Integer timestamp Integer(Buffer^) := DateTimeToTimeStamp(ADateTime).Date; end else @@ -2991,7 +2947,7 @@ Result := False; { field is NULL, no date/time value } Exit; end; - // The data in Buffer^ is an integer timestamp + // The data in Buffer^ is an Integer timestamp Integer(Buffer^) := DateTimeToTimeStamp(ADateTime).Time; end else @@ -3088,9 +3044,9 @@ function TJvCustomCsvDataSet.GetBackslashCrLf: Boolean; begin if Assigned(FData) then - result := FData.BackslashCrLf + Result := FData.BackslashCrLf else - result := false; + Result := false; end; procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: TJvRecordBuffer { was PChar}; Data: Pointer); @@ -3173,7 +3129,7 @@ // <coldef> = columname:<Data-type-character><size> // // See comments at the top of this unit for a discussion of the -// various VCL DB field types like Integer and String, and how +// various VCL DB field types like Integer and string, and how // they map to the special "FieldTypeChar" values defined here. procedure TJvCustomCsvDataSet.InternalInitFieldDefs; var @@ -3189,7 +3145,7 @@ ColNum : Integer; Pos1 : Integer; symbolOrdinal : Integer; - FieldTypeChar : AnsiChar; // field options (%=integer, etc) + FieldTypeChar : AnsiChar; // field options (%=Integer, etc) VclFieldType : TFieldType; // official VCL field type FieldLen : Integer; FieldType : TJvCsvColumnFlag; @@ -3221,7 +3177,7 @@ end; if ExtendedHeaderInfo then - CsvFieldDef := String(aCsvFieldDef); + CsvFieldDef := string(aCsvFieldDef); end; if Length(aCsvFieldDef) > 0 then @@ -3242,9 +3198,9 @@ CsvFieldOption := GetCsvRowItem(CsvFieldRec, ColNum); // get a string in the format COLUMNAME:Options // Look for Colon or Semicolon: - Pos1 := Pos(':', String(CsvFieldOption)); + Pos1 := Pos(':', string(CsvFieldOption)); if Pos1 <= 0 then - Pos1 := Pos(';', String(CsvFieldOption)); + Pos1 := Pos(';', string(CsvFieldOption)); if Pos1 <= 0 then begin @@ -3270,7 +3226,7 @@ FieldTypeChar := '$'; CsvFieldOption := Copy(CsvFieldOption, Pos1 + 1, 80); end; - FieldLen := StrToIntDef( String(CsvFieldOption), JvCsv_DEFAULT_CSV_STR_FIELD); + FieldLen := StrToIntDef( string(CsvFieldOption), JvCsv_DEFAULT_CSV_STR_FIELD); end; case FieldTypeChar of @@ -3301,21 +3257,20 @@ FieldLen := 0; // automatic. CsvMaxLen := CsvMaxLen + 20; end; - '/': - begin // /=date only as ascii YYYY/MM/DD + '/': + begin // /=date only as ascii YYYY/MM/DD VclFieldType := ftDate; FieldType := jcsvAsciiDate; FieldLen := 0; // automatic. CsvMaxLen := CsvMaxLen + 10; - end; - '*': - begin // *=time only as HH:MM:SS + end; + '*': + begin // *=time only as HH:MM:SS VclFieldType := ftTime; FieldType := jcsvAsciiTime; FieldLen := 0; // automatic. CsvMaxLen := CsvMaxLen + 10; - end; - + end; '!': begin // != Boolean field True/False VclFieldType := ftBoolean; // Boolean field in dataset @@ -3368,12 +3323,12 @@ // that as necessary: //Was: TFieldDef.Create(FieldDefs, ...., ColNum); - FieldDefs.Add( String(CsvFieldName), VclFieldType, FieldLen, False); + FieldDefs.Add( string(CsvFieldName), VclFieldType, FieldLen, False); // Now create our internal field Data structure: PCsvFieldDef := AllocMem(SizeOf(TJvCsvColumn) {+ 8 BIGFudge}); PCsvFieldDef^.FFlag := FieldType; {such as jcsvString} - PCsvFieldDef^.FFieldDef := FieldDefs.Find( String(CsvFieldName)); + PCsvFieldDef^.FFieldDef := FieldDefs.Find( string(CsvFieldName)); // Note: field order is established when we open the file (later) PCsvFieldDef^.FPhysical := -1; // not yet located in the physical file! @@ -3404,7 +3359,7 @@ begin if CsvKeys[I] = '' then JvCsvDatabaseError(FTableName, RsEInternalErrorParsingCsvKeyDef); - PCsvFieldDef := FCsvColumns.FindByName( String(CsvKeys[I])); + PCsvFieldDef := FCsvColumns.FindByName( string(CsvKeys[I])); if not Assigned(PCsvFieldDef) then JvCsvDatabaseError(FTableName, Format(RsEContainsField, [CsvKeys[I]])) else @@ -3484,9 +3439,8 @@ procedure TJvCustomCsvDataSet.InternalClose; begin if not FCursorOpen then - begin Exit; - end; + Flush; BindFields(False); if DefaultFields then @@ -3543,31 +3497,27 @@ LogicalRow := PCsvRow(FData.AllocRecordBuffer); PhysicalRow := PCsvRow(FData.AllocRecordBuffer); try + JvStringToCsvRow( Key + Separator, Separator, LogicalRow, False, False); // initialize row and put items in their logical order. + CsvRowInit(@PhysicalRow); + // Move from Logical (TFieldDef order) to their physical (As found in CSV file) ordering: + for I := 0 to FCsvKeyCount - 1 do + begin + aStr := GetCsvRowItem(@LogicalRow, I); + SetCsvRowItem(@PhysicalRow, FCsvKeyFields[I].FPhysical, aStr); + end; + RecNo := InternalFindByKey(PhysicalRow); + if RecNo < 0 then + Exit; - - - JvStringToCsvRow( Key + Separator, Separator, LogicalRow, False, False); // initialize row and put items in their logical order. - CsvRowInit(@PhysicalRow); - // Move from Logical (TFieldDef order) to their physical (As found in CSV file) ordering: - for I := 0 to FCsvKeyCount - 1 do - begin - aStr := GetCsvRowItem(@LogicalRow, I); - SetCsvRowItem(@PhysicalRow, FCsvKeyFields[I].FPhysical, aStr); - end; - RecNo := InternalFindByKey(PhysicalRow); - if RecNo < 0 then - Exit; - - FRecordPos := RecNo; - Resync([]); - Result := True; + FRecordPos := RecNo; + Resync([]); + Result := True; finally FreeMem(LogicalRow); FreeMem(PhysicalRow); end; end; - procedure TJvCustomCsvDataSet.InternalAddRecord(Buffer: Pointer; Append: Boolean); var RecPos: Integer; @@ -3637,23 +3587,23 @@ function TJvCustomCsvDataSet.GetFileName: string; begin // If FTableName is not set, you can't save or load a file, fire an exception: - Assert(Length(FTableName) <> 0, RsEInvalidTableName); + Assert(Length(FTableName) <> 0, RsEInvalidTableName); - if (Length(FTableName) > 2) and (FTableName[1] = '.') and - IsPathDelimiter(FTableName, 2) then // reasonably portable, okay? + if (Length(FTableName) > 2) and (FTableName[1] = '.') and + IsPathDelimiter(FTableName, 2) then // reasonably portable, okay? // Design-time local paths that don't move if the current working // directory moves. These paths reference the directory the program // starts in. To use this at design time you have to enter the // table name as '.\Subdirectory\FileName.csv' (or './subdir/...' on Kylix) - Result := IncludeTrailingPathDelimiter(FInitialWorkingDirectory) + FTableName // SPECIAL CASE. - else - Result := ExpandUNCFilename(FTableName); // Expand using current working directory to full path name. DEFAULT BEHAVIOR. + Result := IncludeTrailingPathDelimiter(FInitialWorkingDirectory) + FTableName // SPECIAL CASE. + else + Result := ExpandUNCFilename(FTableName); // Expand using current working directory to full path name. DEFAULT BEHAVIOR. end; function TJvCustomCsvDataSet.GetMarginSize: Integer; begin Assert(Assigned(FData)); - result := FData.MarginSize; + Result := FData.MarginSize; end; { ReadCsvFileStream: @@ -3672,14 +3622,14 @@ // return, or we won't get our Data in the table. -WP. - if FCsvFileLoaded then begin + if FCsvFileLoaded then + begin Result := True; //loaded already! just return true and quit. Exit; // don't repeat! end; FCsvFileLoaded := true; - if FLoadsFromFile then begin if not Assigned(FCsvStream) then @@ -3720,17 +3670,13 @@ function TJvCustomCsvDataSet.WriteCsvFileStream: Boolean; begin Result := False; - if (FTableName='') then + if FTableName = '' then Exit; // We can return immediately ONLY if there is no file to load, // otherwise this routine is parsing already-loaded Data, and we should NOT // return, or we won't get our Data in the table. -WP. - if Assigned(FCsvStream) then - FreeAndNil(FCsvStream); - - + FreeAndNil(FCsvStream); FCsvStream := TJvCsvStream.Create(FOpenFileName, fmJVCSV_Truncate ); Result := True; // it worked! - end; @@ -3764,7 +3710,7 @@ Strings.BeginUpdate; try for I := 1 to Strings.Count - 1 do - Strings[I] := Strings[I] + String(Commas); + Strings[I] := Strings[I] + string(Commas); finally Strings.EndUpdate; end; @@ -3775,7 +3721,7 @@ TempBuf: array [0..JvCsv_MAXCOLUMNS] of AnsiChar; // Contains a string containing a whole bunch of commas! AppendStr:AnsiString; CsvLine:AnsiString; - Counter:INteger; + Counter:Integer; csvFileExists :Boolean; begin if FCursorOpen then @@ -3792,81 +3738,90 @@ // Create TField components when no persistent fields have been created if DefaultFields then - CreateFields; + CreateFields; BindFields(True); // bind FieldDefs to actual Data if FCsvColumns.Count > 1 then - begin - // Create a null terminated string which is just a bunch of commas: - FillChar(TempBuf, JvCsv_MAXCOLUMNS - 1, 0); - FillChar(TempBuf, FCsvColumns.Count - 1, Separator); - TempBuf[FCsvColumns.Count - 1] := Chr(0); - // When adding an empty row, we add this string as the ascii equivalent: - FEmptyRowStr := TempBuf; - end - else - FEmptyRowStr := ''; // nothing. + begin + // Create a null terminated string which is just a bunch of commas: + FillChar(TempBuf, JvCsv_MAXCOLUMNS - 1, 0); + FillChar(TempBuf, FCsvColumns.Count - 1, Separator); + TempBuf[FCsvColumns.Count - 1] := Chr(0); + // When adding an empty row, we add this string as the ascii equivalent: + FEmptyRowStr := TempBuf; + end + else + FEmptyRowStr := ''; // nothing. - FRecordPos := JvCsv_ON_BOF_CRACK; // initial record pos before BOF - BookmarkSize := SizeOf(Integer); - // initialize bookmark size for VCL (Integer uses 4 bytes on 32 bit operating systems) + FRecordPos := JvCsv_ON_BOF_CRACK; // initial record pos before BOF + BookmarkSize := SizeOf(Integer); + // initialize bookmark size for VCL (Integer uses 4 bytes on 32 bit operating systems) - csvFileExists:= False; + csvFileExists:= False; if FLoadsFromFile then // ReadCsvFileStream:Creates file stream and start reading it. Sets FCsvFileTopLine. - csvFileExists := ReadCsvFileStream; + csvFileExists := ReadCsvFileStream; - if FHasHeaderRow then + if FHasHeaderRow then + begin + if csvFileExists and not ExtendedHeaderInfo and (FCsvFileTopLine <> '') then + FHeaderRow := FCsvFileTopLine + else + begin + FHeaderRow := AnsiString(GetColumnsAsString); // creating a new file! set up HeaderRow + FCsvFileTopLine := FHeaderRow; + end; + + if Length(FHeaderRow) > 0 then + try + ProcessCsvHeaderRow; + except + FHeaderRow:= ''; + FreeAndNil(FCsvStream); + raise; + end; + + if FAppendedFieldCount > 0 then + begin + FillChar(TempBuf, FAppendedFieldCount, Separator); + TempBuf[FAppendedFieldCount] := Chr(0); + AppendStr := TempBuf; + end; + end; + + // Load rows from disk to memory, using Stream object to read line by line. + if FLoadsFromFile and Assigned(FCsvStream) then + begin + while not FCsvStream.Eof do + begin + CsvLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine);// leading space, trailing space and crlf are removed by Trim! + if CsvLine <> '' then begin - if csvFileExists and (not ExtendedHeaderInfo) and (FCsvFileTopLine<>'') then - FHeaderRow := FCsvFileTopLine - else begin - FHeaderRow := AnsiString(GetColumnsAsString); // creating a new file! set up HeaderRow - FCsvFileTopLine := FHeaderRow; + if (FSpecialDataMarker <> '') + and (Pos(FSpecialDataMarker, string(CsvLine)) = 1) + and Assigned(FOnSpecialData) then + begin + // This very rarely used feature should + // probably be removed from the JVCL? -WPostma. + FOnSpecialData(Self, Counter, CsvLine); + end + else + begin + // Process the row: + ProcessCsvDataRow(CsvLine, Counter); + Inc(Counter); end; - - if Length(FHeaderRow) > 0 then - try - ProcessCsvHeaderRow; - except - FHeaderRow:= ''; - FreeAndNil(FCsvStream); - raise; - end; - if FAppendedFieldCount > 0 then begin - FillChar(TempBuf, FAppendedFieldCount, Separator); - TempBuf[FAppendedFieldCount] := Chr(0); - AppendStr := TempBuf; - end; end; - // Load rows from disk to memory, using Stream object to read line by line. - if FLoadsFromFile and Assigned(FCsvStream) then begin - while not FCsvStream.Eof do begin - CsvLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine);// leading space, trailing space and crlf are removed by Trim! - if CsvLine<>'' then begin - if (FSpecialDataMarker<>'') - and (Pos(FSpecialDataMarker, String(CsvLine)) = 1) - and Assigned(FOnSpecialData) - then begin - // This very rarely used feature should - // probably be removed from the JVCL? -WPostma. - FOnSpecialData(Self, Counter, CsvLine); - end else begin - // Process the row: - ProcessCsvDataRow(CsvLine, Counter); - Inc(Counter); - end; - end; - end; {while} - end;{if} - if Active then - First; - FCursorOpen := True; - + end; {while} + end;{if} + if Active then + First; + FCursorOpen := True; - { clean up stream object } - FreeAndNil( FCsvStream); + + { clean up stream object } + FreeAndNil( FCsvStream); end; procedure TJvCustomCsvDataSet.InternalPost; @@ -3969,7 +3924,7 @@ Result := (PCsvRow(BufPtr)^.Bookmark.Data); // Record number. end else begin - result := 0; + Result := 0; end; end; @@ -4083,7 +4038,7 @@ Result := InternalFieldCompare(SortColumns[I], Left, Right); if Result <> 0 then begin - if not SortAscending[I] then // inverts comparison result when Descending! + if not SortAscending[I] then // inverts comparison Result when Descending! Result := -Result; // XXX REPEAT Result := InternalFieldCompare( SortColumns[I],Left,Right); Exit; // found greater or less than condition @@ -4169,7 +4124,7 @@ SortAscending[I] := not SortAscending[I]; SortFieldNames[I] := Copy(SortFieldNames[I],2,Length(SortFieldNames[I])); end; - SortColumns[I] := FCsvColumns.FindByName( String(SortFieldNames[I])); + SortColumns[I] := FCsvColumns.FindByName( string(SortFieldNames[I])); if not Assigned(SortColumns[I]) then JvCsvDatabaseError(FTableName, Format(RsESortFailedInvalidFieldNameInList, [SortFieldNames[I]])); end; @@ -4320,7 +4275,6 @@ RowPtr.AllocSize := GetRowAllocSize; RowPtr.Separator := Separator; - // initialize magic in WordFields: p := Buffer; Inc(p, RowPtr.WordFieldsAddr ); @@ -4331,13 +4285,12 @@ FREcordsValid := true; end; - function TJvCsvRows.RecordSize: Word; begin - result := GetRowAllocSize; { - BookmarkSize??? } + Result := GetRowAllocSize; { - BookmarkSize??? } end; -procedure TJvCsvRows.AddRowStr(const Item: AnsiString); // convert String->TJvCsvRow +procedure TJvCsvRows.AddRowStr(const Item: AnsiString); // convert string->TJvCsvRow var PNewItem: PCsvRow; begin @@ -4349,25 +4302,22 @@ function TJvCsvRows.AllocRecordBuffer: TJvRecordBuffer { was PChar}; begin Assert(FTextBufferSize >= JvCsv_MINLINELENGTH); - result := AllocMem( GetRowAllocSize ); {was SizeOf(TJvCsvRow)} - InternalInitRecord(result); + Result := AllocMem( GetRowAllocSize ); {was SizeOf(TJvCsvRow)} + InternalInitRecord(Result); end; - - - function TJvCsvRows.GetRowAllocSize: Integer; begin - Assert(FTextBufferSize >=JvCsv_MINLINELENGTH); - result := (SizeOf(TJvCsvRow)-JvCsv_MINLINELENGTH) + FTextBufferSize + SizeOf( TJvCsvRowWordFIelds) + JvCsv_MaxCalcDataOffset + FMarginSize; + Assert(FTextBufferSize >= JvCsv_MINLINELENGTH); + Result := (SizeOf(TJvCsvRow) - JvCsv_MINLINELENGTH) + FTextBufferSize + SizeOf(TJvCsvRowWordFIelds) + JvCsv_MaxCalcDataOffset + FMarginSize; end; function TJvCsvRows.GetRowPtr(const RowIndex: Integer): PCsvRow; begin - if (RowIndex >= 0) and (RowIndex < Count) then - Result := PCsvRow(Get(RowIndex)) // return pointer to a row item. - else - raise EJvCsvDataSetError.CreateRes(@RsECsvNoRecord); { NO Such Record } + if (RowIndex >= 0) and (RowIndex < Count) then + Result := PCsvRow(Get(RowIndex)) // return pointer to a row item. + else + raise EJvCsvDataSetError.CreateRes(@RsECsvNoRecord); { NO Such Record } end; function TJvCsvRows.GetRowAnsiStr(const RowIndex: Integer): AnsiString; @@ -4401,8 +4351,6 @@ SetCsvRowItem(GetRowPtr(RowIndex), ColumnIndex, Value); end; - - procedure TJvCsvRows.SetDecimalSeparator(const Value: AnsiChar); begin FDecimalSeparator := Value; @@ -4413,12 +4361,9 @@ Result := GetCsvRowItem(GetRowPtr(RowIndex), ColumnIndex); end; - - - function TJvCsvRows.GetDecimalSeparator: AnsiChar; begin - result := FDecimalSeparator + Result := FDecimalSeparator; end; procedure TJvCsvRows.Clear; @@ -4432,14 +4377,14 @@ constructor TJvCsvRows.Create; begin - FTextBufferSize := JvCsvDefaultTextBufferSize; - FMarginSize := JvCsv... [truncated message content] |
From: <ob...@us...> - 2008-10-16 19:07:05
|
Revision: 11965 http://jvcl.svn.sourceforge.net/jvcl/?rev=11965&view=rev Author: obones Date: 2008-10-16 19:07:03 +0000 (Thu, 16 Oct 2008) Log Message: ----------- Mantis 4538: Must put a #0 at the end when using as a PChar, or it will read out of the memory. Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-10-16 16:22:00 UTC (rev 11964) +++ trunk/jvcl/run/JvCsvData.pas 2008-10-16 19:07:03 UTC (rev 11965) @@ -1212,6 +1212,8 @@ end; end; until not ok; + Inc(n); + Buf[n] := {$IFDEF COMPILER12_UP}0{$ELSE}#0{$ENDIF COMPILER12_UP}; SetLength(Buf, n); Result := PAnsiChar(@Buf[0]); { was string(Buf) } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2008-12-22 13:50:47
|
Revision: 12088 http://jvcl.svn.sourceforge.net/jvcl/?rev=12088&view=rev Author: obones Date: 2008-12-22 13:50:38 +0000 (Mon, 22 Dec 2008) Log Message: ----------- Mantis 4604: JvCsvStrToFloat should always have been given GetDecimalSeparator and not GetSeparator, the latter being the field separator. Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2008-12-22 13:42:23 UTC (rev 12087) +++ trunk/jvcl/run/JvCsvData.pas 2008-12-22 13:50:38 UTC (rev 12088) @@ -1706,7 +1706,7 @@ sFieldValue := _Dequote(sFieldValue); // remove quotes. //sFieldValue := UpperCase(sFieldValue); // pointless on numerics try - FieldValue := JvCsvStrToFloat(string(sFieldValue), GetSeparator); // remember, this baby throws EConvertError on exception! + FieldValue := JvCsvStrToFloat(string(sFieldValue), GetDecimalSeparator); // remember, this baby throws EConvertError on exception! // if { FieldValue [ = <> > < ] numValue } then.... if JvCsvNumCondition(FieldValue, compareOperator, numValue) then // hide row if not same prefix @@ -2009,7 +2009,7 @@ { Default CLASSIC behaviour of this component is to encode outgoing data in US format regardless of system regional settings. This has become more flexible now, but we still default at designtime-defaults to using a DOT. } - Result := JvCsvStrToFloat( string(TempString), GetSeparator ); + Result := JvCsvStrToFloat( string(TempString), GetDecimalSeparator ); ftBoolean: if StrToIntDef(string(TempString), 0) <> 0 then @@ -2913,7 +2913,7 @@ PInteger(Buffer)^ := StrToInt(string(TempString)); // Standard Double-precision Float conversion: ftFloat: - PDouble(Buffer)^ := JvCsvStrToFloat(string(TempString),GetSeparator); // was StrToFloatUS + PDouble(Buffer)^ := JvCsvStrToFloat(string(TempString),GetDecimalSeparator); // was StrToFloatUS ftBoolean: if TempString = '' then PInteger(Buffer)^ := 0 @@ -3999,8 +3999,8 @@ case Column^.FFlag of jcsvNumeric: begin - NumLeft := JvCsvStrToFloatDef( string(StrLeft), -99999.9, GetSeparator); - NumRight := JvCsvStrToFloatDef( string(StrRight), -99999.9, GetSeparator); + NumLeft := JvCsvStrToFloatDef( string(StrLeft), -99999.9, GetDecimalSeparator); + NumRight := JvCsvStrToFloatDef( string(StrRight), -99999.9, GetDecimalSeparator); Diff := NumLeft - NumRight; if Diff < -0.02 then Result := -1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-07-03 09:31:36
|
Revision: 12367 http://jvcl.svn.sourceforge.net/jvcl/?rev=12367&view=rev Author: obones Date: 2009-07-03 09:31:35 +0000 (Fri, 03 Jul 2009) Log Message: ----------- Mantis 4675: Leave the assert in GetFileName but ensure a real exception is only triggered when needed, after all the CSV data may not be loaded/saved in a file. Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2009-07-02 20:12:43 UTC (rev 12366) +++ trunk/jvcl/run/JvCsvData.pas 2009-07-03 09:31:35 UTC (rev 12367) @@ -3347,11 +3347,11 @@ n: Integer; CsvLine: AnsiString; begin - if FTableName = '' then - raise EJvCsvDataSetError.CreateRes(@RsETableNameNotSet); + if FFileDirty and FSavesChanges then + begin + if FTableName = '' then + raise EJvCsvDataSetError.CreateRes(@RsETableNameNotSet); - if FFileDirty and FSavesChanges and (FTableName <> '') then - begin // Make backup first, if enabled (>2) if FAutoBackupCount > 0 then begin @@ -3679,12 +3679,20 @@ InternalClose; // close first! Counter := 0; - FOpenFileName := GetFileName; // Always use the same file name to save as you did to load!!! MARCH 2004.WP FFileDirty := False; - if (FTableName = '') and FLoadsFromFile then - JvCsvDatabaseError(RsENoTableName, RsETableNameRequired); + if FLoadsFromFile then + begin + if FTableName = '' then + JvCsvDatabaseError(RsENoTableName, RsETableNameRequired); + FOpenFileName := GetFileName; // Always use the same file name to save as you did to load!!! MARCH 2004.WP + end + else + begin + FOpenFileName := ''; + end; + InternalInitFieldDefs; // initialize FieldDef objects. // Create TField components when no persistent fields have been created This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-08-23 09:42:10
|
Revision: 12463 http://jvcl.svn.sourceforge.net/jvcl/?rev=12463&view=rev Author: ahuser Date: 2009-08-23 09:42:02 +0000 (Sun, 23 Aug 2009) Log Message: ----------- Mantis #4900: TJvCsvDataSet, when loading, doesn't parse correctly text that contains a comma Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2009-08-21 16:25:24 UTC (rev 12462) +++ trunk/jvcl/run/JvCsvData.pas 2009-08-23 09:42:02 UTC (rev 12463) @@ -1172,21 +1172,17 @@ if LStreamIndex >= LStreamSize then Break; - Buf[n] := LStreamBuffer[LStreamIndex]; // p^; + Buf[n] := LStreamBuffer[LStreamIndex]; Inc(LStreamIndex); case Buf[n] of JvCsvQuote: {34} // quote QuoteFlag := not QuoteFlag; JvCsvLf: {10} // linefeed - begin - Inc(n); - if not QuoteFlag then - Break; - end; + if not QuoteFlag then + Break; JvCsvCR: {13} // carriage return begin - Inc(n); if not QuoteFlag then begin { If it is a CRLF we must skip the LF. Otherwise the next call to ReadLine @@ -1199,13 +1195,11 @@ Break; end; end - else - Inc(n); end; + Inc(n); end; FStreamIndex := LStreamIndex; - //Inc(n); { ahuser: This cause the string to include CR or LF. Is this by intention? } SetString(Result, PAnsiChar(@Buf[0]), n); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-09-14 18:48:13
|
Revision: 12499 http://jvcl.svn.sourceforge.net/jvcl/?rev=12499&view=rev Author: ahuser Date: 2009-09-14 18:48:01 +0000 (Mon, 14 Sep 2009) Log Message: ----------- Mantis #4935: CSVDataset error (FCsvFileLoaded protection) Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2009-09-13 08:01:22 UTC (rev 12498) +++ trunk/jvcl/run/JvCsvData.pas 2009-09-14 18:48:01 UTC (rev 12499) @@ -807,7 +807,7 @@ property AlwaysEnquoteStrings: Boolean read FAlwaysEnquoteStrings write FAlwaysEnquoteStrings default False; // Always put Double quotes around strings (for some CSV file reading software this is required.) property AlwaysEnquoteFloats: Boolean read FAlwaysEnquoteFloats write FAlwaysEnquoteFloats default False; // Always put Double quotes around floating point values (useful when DecimalSeparator==CsvSeparator) - property UseSystemDecimalSeparator: Boolean read FUseSystemDecimalSeparator write FUseSystemDecimalSeparator default false; // Default is false which always uses US mode. Must be false by default because of existing code assuming this behaviour. + property UseSystemDecimalSeparator: Boolean read FUseSystemDecimalSeparator write FUseSystemDecimalSeparator default False; // Default is false which always uses US mode. Must be false by default because of existing code assuming this behaviour. property AppendOnly: Boolean read FAppendOnly write FAppendOnly default False; // If true, we don't load the entire content of the CSV from disk, only the last row, and every time we append and write, we only maintain the last row in memory (saves a lot of RAM.) @@ -1038,7 +1038,7 @@ P := Pointer(RowItem); Inc(P, RowItem.WordFieldsAddr); - Result := PJvCsvRowWordFields(P); + Result := PJvCsvRowWordFields(P); Magic := Result^.Magic2; if Magic <> JvCsvRowMagic2 then raise EJvCsvDataSetError.Create('Memory Corruption Suspected in WordFields area of CsvRow memory'); // memory corruption check! @@ -1609,7 +1609,7 @@ PRow := PCsvRow(FData[I]); Assert(Assigned(PRow)); // if custom function returns False, hide the row. - PRow^.Filtered := not FilterCallback(I); + PRow^.Filtered := not FilterCallback(I); end; FIsFiltered := True; if Active then @@ -3000,7 +3000,7 @@ if Assigned(FData) then Result := FData.BackslashCrLf else - Result := false; + Result := False; end; procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: TJvRecordBuffer; Data: Pointer); @@ -3059,7 +3059,7 @@ procedure TJvCustomCsvDataSet.SetBackslashCrLf(const Value: Boolean); begin if Assigned(FData) then - FData.BackslashCrLf := Value; + FData.BackslashCrLf := Value; end; procedure TJvCustomCsvDataSet.SetBookmarkData(Buffer: TJvRecordBuffer; Data: Pointer); @@ -3389,8 +3389,8 @@ FCursorOpen := False; FRecordPos := JvCsv_ON_BOF_CRACK; FOpenFileName := ''; - FCsvFileLoaded := false; - FData.FRecordsValid:=false; + FCsvFileLoaded := False; + FData.FRecordsValid := False; end; procedure TJvCustomCsvDataSet.InternalHandleException; @@ -3434,7 +3434,7 @@ aStr: string; begin Result := False; - LogicalRow := PCsvRow(FData.AllocRecordBuffer); + LogicalRow := PCsvRow(FData.AllocRecordBuffer); PhysicalRow := PCsvRow(FData.AllocRecordBuffer); try JvStringToCsvRow(Key + Separator, Separator, LogicalRow, False, False); // initialize row and put items in their logical order. @@ -3567,7 +3567,7 @@ Exit; // don't repeat! end; - FCsvFileLoaded := True; + FCsvFileLoaded := True; if FLoadsFromFile then begin @@ -3585,7 +3585,7 @@ // We can at least still open UTF8 files if they are really just ASCII // files plus a BOM marker like Windows notepad and some other apps add. //------------------------------------------------------------------------- - FUtf8Detected := false; {Future.} + FUtf8Detected := False; {Future.} if Length(Line) > 3 then begin // JvCsvData can detect the standard UTF-8 mark and work anyways when it is present @@ -3680,9 +3680,7 @@ FOpenFileName := GetFileName; // Always use the same file name to save as you did to load!!! MARCH 2004.WP end else - begin FOpenFileName := ''; - end; InternalInitFieldDefs; // initialize FieldDef objects. @@ -3705,69 +3703,74 @@ BookmarkSize := SizeOf(Integer); // initialize bookmark size for VCL (Integer uses 4 bytes on 32 bit operating systems) - csvFileExists:= False; - if FLoadsFromFile then // ReadCsvFileStream:Creates file stream and start reading it. Sets FCsvFileTopLine. - csvFileExists := ReadCsvFileStream; + csvFileExists := False; + try + if FLoadsFromFile then // ReadCsvFileStream:Creates file stream and start reading it. Sets FCsvFileTopLine. + csvFileExists := ReadCsvFileStream; - if FHasHeaderRow then - begin - if csvFileExists and not ExtendedHeaderInfo and (FCsvFileTopLine <> '') then - FHeaderRow := FCsvFileTopLine - else + if FHasHeaderRow then begin - FHeaderRow := GetColumnsAsString; // creating a new file! set up HeaderRow - FCsvFileTopLine := FHeaderRow; - end; + if csvFileExists and not ExtendedHeaderInfo and (FCsvFileTopLine <> '') then + FHeaderRow := FCsvFileTopLine + else + begin + FHeaderRow := GetColumnsAsString; // creating a new file! set up HeaderRow + FCsvFileTopLine := FHeaderRow; + end; - if FHeaderRow <> '' then - try - ProcessCsvHeaderRow; - except - FHeaderRow := ''; - FreeAndNil(FCsvStream); - raise; + if FHeaderRow <> '' then + try + ProcessCsvHeaderRow; + except + FHeaderRow := ''; + FreeAndNil(FCsvStream); + raise; + end; + + if FAppendedFieldCount > 0 then + begin + SetLength(AppendStr, FAppendedFieldCount); + FillNativeChar(AppendStr[1], FAppendedFieldCount, Separator); end; - - if FAppendedFieldCount > 0 then - begin - SetLength(AppendStr, FAppendedFieldCount); - FillNativeChar(AppendStr[1], FAppendedFieldCount, Separator); end; - end; - // Load rows from disk to memory, using Stream object to read line by line. - if FLoadsFromFile and Assigned(FCsvStream) then - begin - while not FCsvStream.Eof do + // Load rows from disk to memory, using Stream object to read line by line. + if FLoadsFromFile and Assigned(FCsvStream) then begin - CsvLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine);// leading space, trailing space and crlf are removed by Trim! - if CsvLine <> '' then + while not FCsvStream.Eof do begin - if (FSpecialDataMarker <> '') - and (Pos(FSpecialDataMarker, CsvLine) = 1) - and Assigned(FOnSpecialData) then + CsvLine := JvTrimAnsiStringCrLf(FCsvStream.ReadLine);// leading space, trailing space and crlf are removed by Trim! + if CsvLine <> '' then begin - // This very rarely used feature should - // probably be removed from the JVCL? -WPostma. - FOnSpecialData(Self, Counter, CsvLine); - end - else - begin - // Process the row: - {$IFDEF UNICODE} - if FUtf8Detected then - ProcessCsvDataRow(Utf8ToAnsi(CsvLine), Counter) + if (FSpecialDataMarker <> '') + and (Pos(FSpecialDataMarker, CsvLine) = 1) + and Assigned(FOnSpecialData) then + begin + // This very rarely used feature should + // probably be removed from the JVCL? -WPostma. + FOnSpecialData(Self, Counter, CsvLine); + end else - {$ENDIF UNICODE} - ProcessCsvDataRow(string(AnsiString(CsvLine)), Counter); - Inc(Counter); + begin + // Process the row: + {$IFDEF UNICODE} + if FUtf8Detected then + ProcessCsvDataRow(Utf8ToAnsi(CsvLine), Counter) + else + {$ENDIF UNICODE} + ProcessCsvDataRow(string(AnsiString(CsvLine)), Counter); + Inc(Counter); + end; end; - end; - end; {while} - end;{if} - if Active then - First; - FCursorOpen := True; + end; {while} + end;{if} + if Active then + First; + FCursorOpen := True; + except + FCsvFileLoaded := False; + raise; + end; { clean up stream object } FreeAndNil(FCsvStream); @@ -3896,7 +3899,7 @@ // FTableName := ChangeFileExt(FTableName,'.csv'); { update internal filename table } -// FBmkFileName:= ChangeFileExt(FTableName, '.bmk' ); // bookmark file +// FBmkFileName := ChangeFileExt(FTableName, '.bmk' ); // bookmark file end; procedure TJvCustomCsvDataSet.SetTextBufferSize(const Value: Integer); @@ -3907,7 +3910,6 @@ FData.TextBufferSize := Value; end; - procedure TJvCustomCsvDataSet.EmptyTable; begin // Erase Rows. @@ -3937,7 +3939,7 @@ case Column^.FFlag of jcsvNumeric: begin - NumLeft := JvCsvStrToFloatDef(StrLeft, -99999.9, GetDecimalSeparator); + NumLeft := JvCsvStrToFloatDef(StrLeft, -99999.9, GetDecimalSeparator); NumRight := JvCsvStrToFloatDef(StrRight, -99999.9, GetDecimalSeparator); Diff := NumLeft - NumRight; if Diff < -0.02 then @@ -4210,7 +4212,7 @@ procedure TJvCsvRows.InternalInitRecord(Buffer: TJvRecordBuffer); var RowPtr: PCsvRow; - p: TJvRecordBuffer; + P: TJvRecordBuffer; begin RowPtr := PCsvRow(Buffer); RowPtr.Magic := JvCsvRowMagic; @@ -4220,12 +4222,12 @@ RowPtr.Separator := AnsiChar(Separator); // initialize magic in WordFields: - p := Buffer; - Inc(p, RowPtr.WordFieldsAddr ); - PJvCsvRowWordFields(p)^.Magic2 := JvCsvRowMagic2; - //DebugPJvCsvRowWordFields := PJvCsvRowWordFields(p); + P := Buffer; + Inc(P, RowPtr.WordFieldsAddr); + PJvCsvRowWordFields(P)^.Magic2 := JvCsvRowMagic2; + //DebugPJvCsvRowWordFields := PJvCsvRowWordFields(P); - FREcordsValid := true; + FREcordsValid := True; end; function TJvCsvRows.RecordSize: Word; @@ -5557,9 +5559,9 @@ if MatchSourceField[I].DataType=ftString then begin if MatchSourceField[I].IsNull then - StrValue := '' + StrValue := '' else - StrValue := MatchSourceField[I].Value; + StrValue := MatchSourceField[I].Value; MatchDestField[I].Value := StrValue; end else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-10-02 08:59:34
|
Revision: 12533 http://jvcl.svn.sourceforge.net/jvcl/?rev=12533&view=rev Author: ahuser Date: 2009-10-02 08:59:22 +0000 (Fri, 02 Oct 2009) Log Message: ----------- Mantis 4901: [TJvCsvDataSet] loading successively different csv files in a same TJvCsvDataSet fires un unexpected exception Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2009-10-02 08:14:44 UTC (rev 12532) +++ trunk/jvcl/run/JvCsvData.pas 2009-10-02 08:59:22 UTC (rev 12533) @@ -453,6 +453,7 @@ FTimeZoneCorrection: Integer; // defaults to 0 (none) FFileDirty: Boolean; // file needs to be written back to disk? + FDefaultCsvFieldDefs: Boolean; // True if the CsvFieldDefs come from the file FCsvFieldDef: string; // Our own "Csv Field Definition String" FCsvKeyDef: string; // CSV Key Definition string. Required if FCsvUniqueKeys is True FCsvKeyCount: Integer; // Set by parsing FCsvKeyDef @@ -1847,6 +1848,7 @@ begin CheckInactive; FCsvFieldDef := Value; + FDefaultCsvFieldDefs := False; FHeaderRow := ''; FieldDefs.Clear; // Clear VCL Database field definitions FCsvColumns.Clear; // Clear our own CSV related field Data @@ -3114,12 +3116,13 @@ FieldDefs.Clear; // Clear VCL Database field definitions FCsvColumns.Clear; // Clear our own CSV related field Data + FDefaultCsvFieldDefs := False; aCsvFieldDef := CsvFieldDef; if aCsvFieldDef = '' then begin if FHasHeaderRow and ReadCsvFileStream then begin - aCsvFieldDef := FCsvFileTopLine; {formerly FCsvFileAsStrings[0];} + aCsvFieldDef := FCsvFileTopLine; {$IFDEF DEBUGINFO_ON} if aCsvFieldDef = '' then OutputDebugString('Top line of file empty. CsvFieldDef not provided either.'); @@ -3128,6 +3131,7 @@ if ExtendedHeaderInfo then CsvFieldDef := aCsvFieldDef; + FDefaultCsvFieldDefs := True; end; if aCsvFieldDef <> '' then @@ -3391,6 +3395,13 @@ FOpenFileName := ''; FCsvFileLoaded := False; FData.FRecordsValid := False; + if FDefaultCsvFieldDefs then + begin + FCsvFieldDef := ''; + FHeaderRow := ''; + FieldDefs.Clear; + Fields.Clear; + end; end; procedure TJvCustomCsvDataSet.InternalHandleException; @@ -4496,13 +4507,13 @@ if not ValidateHeaderRow then begin for I := 0 to FCsvColumns.Count - 1 do - PCsvColumn(FCsvColumns.Get(I))^.FPhysical := I; + PCsvColumn(FCsvColumns[I])^.FPhysical := I; Exit; end; FAppendedFieldCount := 0; // Columns Not Yet Found: for I := 0 to FCsvColumns.Count - 1 do - PCsvColumn(FCsvColumns.Get(I))^.FPhysical := -1; + PCsvColumn(FCsvColumns[I])^.FPhysical := -1; // Do initial parse. JvStringToCsvRow(FHeaderRow, Separator, CsvFieldRec, False, False); @@ -4514,14 +4525,14 @@ // Mantis 3192: Remove the options from the field name or FindByName will // never find the column which will lead to a Database error being triggered - ColonPos := Pos(':', string(CsvFieldName)); + ColonPos := Pos(':', CsvFieldName); if (ColonPos > 0) then CsvFieldName := Copy(CsvFieldName, 1, ColonPos - 1); if CsvFieldName = '' then JvCsvDatabaseError(FTableName, RsEErrorProcessingFirstLine); - PtrCsvColumn := FCsvColumns.FindByName( string(CsvFieldName)); + PtrCsvColumn := FCsvColumns.FindByName(CsvFieldName); if PtrCsvColumn = nil then begin // raise database exception: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-05-16 13:29:18
|
Revision: 12773 http://jvcl.svn.sourceforge.net/jvcl/?rev=12773&view=rev Author: ahuser Date: 2010-05-16 13:29:11 +0000 (Sun, 16 May 2010) Log Message: ----------- Mantis #5109: TJvCustomCsvDataSet.ClearFilter fires a memory leak Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2010-05-16 12:57:30 UTC (rev 12772) +++ trunk/jvcl/run/JvCsvData.pas 2010-05-16 13:29:11 UTC (rev 12773) @@ -640,8 +640,7 @@ procedure ClearFilter; // Clear all previous SetFilters, shows All Rows. Refresh screen. - // (rom) inacceptable name - procedure _ClearFilter; // Clear Previous Filtering. DOES NOT REFRESH SCREEN. + procedure ClearPreviousFilter; // Clear Previous Filtering. DOES NOT REFRESH SCREEN. procedure CustomFilter(FilterCallback: TJvCustomCsvDataSetFilterFunction); {NEW:APRIL 2004-WP} @@ -1667,12 +1666,8 @@ FieldIndex: Integer; sFieldValue: string; FieldValue: Double; - //stillVisible : Integer; - //m: TBookmark; begin - // m := GetBookmark; FieldRec := FCsvColumns.FindByName(FieldName); - // stillVisible := 0; if not Assigned(FieldRec) then Exit; FieldIndex := FieldRec^.FPhysical; @@ -1715,12 +1710,8 @@ FieldRec: PCsvColumn; FieldIndex: Integer; FieldValue: string; - //stillVisible : Integer; - //m: TBookmark; begin - // m := GetBookmark; FieldRec := FCsvColumns.FindByName(FieldName); - // stillVisible := 0; if not Assigned(FieldRec) then Exit; FieldIndex := FieldRec^.FPhysical; @@ -1770,7 +1761,7 @@ FData.InternalInitRecord(TJvRecordBuffer(Result)); // {was PChar(Result) } end; -procedure TJvCustomCsvDataSet._ClearFilter; // Clear Previous Filtering. +procedure TJvCustomCsvDataSet.ClearPreviousFilter; // Clear Previous Filtering. var I: Integer; PRow: PCsvRow; @@ -1789,13 +1780,17 @@ M: TBookmark; begin M := GetBookmark; - _ClearFilter; - // Update screen. - if Active then - if Assigned(M) then - GotoBookmark(M) - else - First; + try + ClearPreviousFilter; + // Update screen. + if Active then + if Assigned(M) then + GotoBookmark(M) + else + First; + finally + FreeBookmark(M); + end; end; function TJvCustomCsvDataSet.BookmarkValid(Bookmark: TBookmark): Boolean; @@ -2656,8 +2651,12 @@ DisableControls; try M := GetBookmark; // This appears a bit silly but it works very well. - First; // Redraws all controls once to relocate to top. - GotoBookmark(M); // Go back where we were. This could Result in some odd scrolling behaviour but I haven't seen it yet. + try + First; // Redraws all controls once to relocate to top. + GotoBookmark(M); // Go back where we were. This could Result in some odd scrolling behaviour but I haven't seen it yet. + finally + FreeBookmark(M); + end; finally EnableControls; end; @@ -3006,7 +3005,6 @@ procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: TJvRecordBuffer; Data: Pointer); begin -// I := PCsvRow(Buffer)^.bookmark.Data; PInteger(Data)^ := PCsvRow(Buffer)^.Bookmark.Data; end; @@ -3070,7 +3068,6 @@ procedure TJvCustomCsvDataSet.InternalFirst; begin -// Eof := False; FRecordPos := JvCsv_ON_BOF_CRACK; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-05-16 14:05:25
|
Revision: 12776 http://jvcl.svn.sourceforge.net/jvcl/?rev=12776&view=rev Author: ahuser Date: 2010-05-16 14:05:19 +0000 (Sun, 16 May 2010) Log Message: ----------- Mantis #5108: TJvCustomCsvDataSet.Locate fails when setting a Filter Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2010-05-16 13:59:21 UTC (rev 12775) +++ trunk/jvcl/run/JvCsvData.pas 2010-05-16 14:05:19 UTC (rev 12776) @@ -2027,15 +2027,15 @@ Max := -1; for RecIndex := 0 to FData.Count - 1 do try - // skip filtered rows: - RowPtr := FData[RecIndex]; - Assert(Assigned(RowPtr)); // FData should never contain nils! - if RowPtr^.Filtered then - Continue; // skip filtered row! - - Value := GetFieldValueAsVariant(CsvColumnData, FieldLookup, RecIndex); - if Value > Max then - Max := Value; // keep maximum. + // skip filtered rows: + RowPtr := FData[RecIndex]; + Assert(Assigned(RowPtr)); // FData should never contain nils! + if not RowPtr^.Filtered then // skip filtered row! + begin + Value := GetFieldValueAsVariant(CsvColumnData, FieldLookup, RecIndex); + if Value > Max then + Max := Value; // keep maximum. + end; except on E: EVariantError do Exit; // failed. @@ -2107,58 +2107,59 @@ end; // Now search - // First; for RecIndex := 0 to FData.Count - 1 do begin - MatchCount := 0; - for I := 0 to Count - 1 do + if not PCsvRow(FData.Items[RecIndex])^.Filtered then // Mantis #5108: Don't need to trap filtered records begin - Value := GetFieldValueAsVariant(CsvColumnData[I], FieldLookup[I], RecIndex); - if Lo < 0 then // non-vararray! - CompareResult := Value = KeyValues - else // vararray! - CompareResult := Value = KeyValues[I + Lo]; + MatchCount := 0; + for I := 0 to Count - 1 do + begin + Value := GetFieldValueAsVariant(CsvColumnData[I], FieldLookup[I], RecIndex); + if Lo < 0 then // non-vararray! + CompareResult := Value = KeyValues + else // vararray! + CompareResult := Value = KeyValues[I + Lo]; - if CompareResult then - Inc(MatchCount) - else - if Options <> [] then - begin - if VarIsStr(Value) then + if CompareResult then + Inc(MatchCount) + else + if Options <> [] then begin - StrValueA := Value; - StrValueB := KeyValues[I + Lo]; - if loCaseInsensitive in Options then - CompareResult := {Ansi}CompareText(StrValueA, StrValueB) = 0 - else - CompareResult := StrValueA = StrValueB; + if VarIsStr(Value) then + begin + StrValueA := Value; + StrValueB := KeyValues[I + Lo]; + if loCaseInsensitive in Options then + CompareResult := {Ansi}CompareText(StrValueA, StrValueB) = 0 + else + CompareResult := StrValueA = StrValueB; - if CompareResult then - Inc(MatchCount) - else - begin - if loPartialKey in Options then + if CompareResult then + Inc(MatchCount) + else begin - if loCaseInsensitive in Options then + if loPartialKey in Options then begin - StrValueA := {Ansi}UpperCase(StrValueA); - StrValueB := {Ansi}UpperCase(StrValueB); + if loCaseInsensitive in Options then + begin + StrValueA := {Ansi}UpperCase(StrValueA); + StrValueB := {Ansi}UpperCase(StrValueB); + end; + if Pos(StrValueB, StrValueA) = 1 then + Inc(MatchCount); end; - if Pos(StrValueB, StrValueA) = 1 then - Inc(MatchCount); end; end; end; end; - end; - if MatchCount = Count then - begin - RecNo := RecIndex; // Move cursor position. - Result := True; - Exit; + if MatchCount = Count then + begin + RecNo := RecIndex; // Move cursor position. + Result := True; + Exit; + end; end; - // Next; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-06-07 14:38:31
|
Revision: 12794 http://jvcl.svn.sourceforge.net/jvcl/?rev=12794&view=rev Author: ahuser Date: 2010-06-07 14:38:23 +0000 (Mon, 07 Jun 2010) Log Message: ----------- Mantis #5110: TJvCustomCsvDataSet.FindByCsvKey crashes when used Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2010-06-07 14:18:27 UTC (rev 12793) +++ trunk/jvcl/run/JvCsvData.pas 2010-06-07 14:38:23 UTC (rev 12794) @@ -3446,12 +3446,12 @@ PhysicalRow := PCsvRow(FData.AllocRecordBuffer); try JvStringToCsvRow(Key + Separator, Separator, LogicalRow, False, False); // initialize row and put items in their logical order. - CsvRowInit(@PhysicalRow); + CsvRowInit(PhysicalRow); // Move from Logical (TFieldDef order) to their physical (As found in CSV file) ordering: for I := 0 to FCsvKeyCount - 1 do begin - aStr := GetCsvRowItem(@LogicalRow, I); - SetCsvRowItem(@PhysicalRow, FCsvKeyFields[I].FPhysical, aStr); + aStr := GetCsvRowItem(LogicalRow, I); + SetCsvRowItem(PhysicalRow, FCsvKeyFields[I].FPhysical, aStr); end; RecNo := InternalFindByKey(PhysicalRow); if RecNo < 0 then @@ -4234,7 +4234,7 @@ PJvCsvRowWordFields(P)^.Magic2 := JvCsvRowMagic2; //DebugPJvCsvRowWordFields := PJvCsvRowWordFields(P); - FREcordsValid := True; + FRecordsValid := True; end; function TJvCsvRows.RecordSize: Word; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-11-27 14:09:37
|
Revision: 12908 http://jvcl.svn.sourceforge.net/jvcl/?rev=12908&view=rev Author: ahuser Date: 2010-11-27 14:09:30 +0000 (Sat, 27 Nov 2010) Log Message: ----------- Mantis #5266: Error in JvCsvDataSet Filter (RecordCount always returned all records even if a filter was specified) Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2010-11-27 13:49:11 UTC (rev 12907) +++ trunk/jvcl/run/JvCsvData.pas 2010-11-27 14:09:30 UTC (rev 12908) @@ -318,6 +318,7 @@ FSeparator: Char; FDecimalSeparator: Char; { NOTE: DEFAULT value for historical backwards compatibilty reasons is the USA default of '.' } + FFilteredCount: Integer; // number of records that are filtered function GetUserTag(Index: Integer): Integer; procedure SetUserTag(Index, Value: Integer); @@ -352,6 +353,8 @@ property UserTag[Index: Integer]: Integer read GetUserTag write SetUserTag; property UserData[Index: Integer]: Pointer read GetUserData write SetUserData; + property FilteredCount: Integer read FFilteredCount; + { these properties should ONLY be set before any actual rows have been allocated. } property TextBufferSize: Integer read FTextBufferSize write FTextBufferSize; // How big is TJvCsvRow.Text effectively? property MarginSize: Integer read FMarginSize write FMarginSize; // How much margin space after the calculated fields? (typically 2 bytes) @@ -446,6 +449,7 @@ function _CsvFloatToStr(Value: Double): string; + procedure SetRowFiltered(ARow: PCsvRow; AFiltered: Boolean); protected // (rom) inacceptable names. Probably most of this should be private. FTempBuffer: TJvRecordBuffer; // Allocated on first access to field variable data only! @@ -1361,6 +1365,18 @@ Result := FData.GetUserTag(RecNo); end; +procedure TJvCustomCsvDataSet.SetRowFiltered(ARow: PCsvRow; AFiltered: Boolean); +begin + if ARow^.Filtered <> AFiltered then + begin + if AFiltered then + Inc(FData.FFilteredCount) + else + Dec(FData.FFilteredCount); + ARow^.Filtered := AFiltered; + end; +end; + procedure TJvCustomCsvDataSet.SetRowTag(TagValue: Integer); var RecNo: Integer; @@ -1613,7 +1629,7 @@ PRow := PCsvRow(FData[I]); Assert(Assigned(PRow)); // if custom function returns False, hide the row. - PRow^.Filtered := not FilterCallback(I); + SetRowFiltered(PRow, not FilterCallback(I)); end; FIsFiltered := True; if Active then @@ -1642,7 +1658,7 @@ begin FieldValue := FData.GetARowItem(I, FieldIndex); if (Length(FieldValue) > 0) = NullFlag then - PRow^.Filtered := True; + SetRowFiltered(PRow, True); end; end; FIsFiltered := True; @@ -1695,10 +1711,10 @@ // Inc(stillVisible) // count the number that are still visible. end else - PRow^.Filtered := True + SetRowFiltered(PRow, True) except on E: EConvertError do - PRow^.Filtered := True; // hide error rows. + SetRowFiltered(PRow, True); // hide error rows. end; end;{if not already hidden!} end;{ for loop} @@ -1735,7 +1751,7 @@ if ValueLen = 0 then begin if FieldValue <> '' then // if not empty, hide row. - PRow^.Filtered := True; + SetRowFiltered(PRow, True); end else begin @@ -1746,7 +1762,7 @@ // Inc(stillVisible) // count the number that are still visible. end else - PRow^.Filtered := True + SetRowFiltered(PRow, True); end; end end; @@ -1775,7 +1791,7 @@ begin PRow := PCsvRow(FData[I]); if Assigned(PRow) then - PRow^.Filtered := False; // clear all filter bits. + SetRowFiltered(PRow, False); // clear all filter bits. end; FIsFiltered := False; end; @@ -3859,7 +3875,7 @@ function TJvCustomCsvDataSet.GetRecordCount: Integer; begin if FData.Count > 0 then - Result := FData.Count + Result := FData.Count - FData.FilteredCount else Result := 0; end; @@ -4167,6 +4183,18 @@ { CsvRows: dynamic array of pointers } +constructor TJvCsvRows.Create; +begin + FTextBufferSize := JvCsvDefaultTextBufferSize; + FMarginSize := JvCsvDefaultMarginSize; + +{ DecimalSeparator: + This 'US' constant value is important for backwards compatibility. + DO NOT CHANGE this default, it would break people's code. +} + FDecimalSeparator := USDecimalSeparator; +end; + function TJvCsvRows.GetUserTag(Index: Integer): Integer; begin if (Index < 0) or (Index >= FUserLength) then @@ -4189,7 +4217,6 @@ FUserTag[Index] := Value; end; - function TJvCsvRows.GetUserData(Index: Integer): Pointer; begin if (Index < 0) or (Index >= FUserLength) then @@ -4214,11 +4241,15 @@ procedure TJvCsvRows.AddRow(Item: PCsvRow); begin Add(Pointer(Item)); + if Item.Filtered then + Inc(FFilteredCount); end; procedure TJvCsvRows.InsertRow(const Position: Integer; Item: PCsvRow); begin Insert(Position, Pointer(Item)); + if Item.Filtered then + Inc(FFilteredCount); end; procedure TJvCsvRows.InternalInitRecord(Buffer: TJvRecordBuffer); @@ -4293,7 +4324,9 @@ begin if (RowIndex >= 0) and (RowIndex < Count) then begin - P := Self[RowIndex]; + if PCsvRow(List^[RowIndex]).Filtered then + Dec(FFilteredCount); + P := Items[RowIndex]; if P <> nil then FreeMem(P); end; @@ -4316,21 +4349,10 @@ begin for I := 0 to Count - 1 do FreeMem(Items[I]); + FFilteredCount := 0; inherited Clear; end; -constructor TJvCsvRows.Create; -begin - FTextBufferSize := JvCsvDefaultTextBufferSize; - FMarginSize := JvCsvDefaultMarginSize; - -{ DecimalSeparator: - This 'US' constant value is important for backwards compatibility. - DO NOT CHANGE this default, it would break people's code. -} - FDecimalSeparator := USDecimalSeparator; -end; - { Call this one first, then AssignFromStrings on subsequent updates only.} procedure TJvCustomCsvDataSet.OpenWith(Strings: TStrings); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-03-31 19:43:44
|
Revision: 13007 http://jvcl.svn.sourceforge.net/jvcl/?rev=13007&view=rev Author: jfudickar Date: 2011-03-31 19:43:38 +0000 (Thu, 31 Mar 2011) Log Message: ----------- Mantis 0005531: [TJvCustomCsvDataSet] fkLookup FieldKind field not updating Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2011-03-31 12:20:17 UTC (rev 13006) +++ trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:43:38 UTC (rev 13007) @@ -2441,6 +2441,8 @@ if AnsiChar(PDestination[0]) <> #0 then Move(Buffer^, PDestination[1], Field.DataSize); //Result := True; {there is no return value, oops} + // Notify controls of a field change: + DataEvent(deFieldChange, Longint(Field)); Exit; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-03-31 19:49:45
|
Revision: 13008 http://jvcl.svn.sourceforge.net/jvcl/?rev=13008&view=rev Author: jfudickar Date: 2011-03-31 19:49:39 +0000 (Thu, 31 Mar 2011) Log Message: ----------- Mantis 0005528: [TJvCustomCsvDataSet] BeforeScroll and AfterScroll not firing in Locate procedure Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:43:38 UTC (rev 13007) +++ trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:49:39 UTC (rev 13008) @@ -445,6 +445,8 @@ function GetBackslashCrLf: Boolean; procedure SetBackslashCrLf(const Value: Boolean); function GetDecimalSeparator: Char; + // ----------- THIS IS A DUMMY FUNCTION, DON'T USE IT!: + function LocateRecord(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; procedure SetDecimalSeparator(const Value: Char); function _CsvFloatToStr(Value: Double): string; @@ -649,10 +651,7 @@ procedure CustomFilter(FilterCallback: TJvCustomCsvDataSetFilterFunction); {NEW:APRIL 2004-WP} - // ----------- THIS IS A DUMMY FUNCTION, DON'T USE IT!: - function Locate(const KeyFields: string; const KeyValues: Variant; - Options: TLocateOptions): Boolean; override; - + function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override; //------------ /// procedure FilteredDeletion(Inverted: Boolean); /// XXX TODO? @@ -735,7 +734,6 @@ procedure LoadFromFile(const FileName: string); procedure DeleteCsvColumn(const AFieldName: string); // must be done when not Active! [NEW 2007!] - {These are made protected so that you can write another derived component which has access to various protected fields } protected property InternalData: TJvCsvRows read FData write FData; @@ -2070,8 +2068,8 @@ // XXX TODO: REMOVE HARD CODED LIMIT OF 20 FIELDS SEARCHABLE!!! -function TJvCustomCsvDataSet.Locate(const KeyFields: string; const KeyValues: Variant; - Options: TLocateOptions): Boolean; // override; +function TJvCustomCsvDataSet.LocateRecord(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): + Boolean; // Options is [loCaseInsensitive] // or [loPartialKey] // or [loPartialKey,loCaseInsensitive] @@ -5715,6 +5713,18 @@ end; end; +function TJvCustomCsvDataSet.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): + Boolean; +begin + DoBeforeScroll; + Result := LocateRecord(KeyFields, KeyValues, Options); + if Result then + begin + Resync([rmExact, rmCenter]); + DoAfterScroll; + end; +end; + {$IFDEF UNITVERSIONING} initialization RegisterUnitVersion(HInstance, UnitVersioning); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-03-31 19:51:31
|
Revision: 13009 http://jvcl.svn.sourceforge.net/jvcl/?rev=13009&view=rev Author: jfudickar Date: 2011-03-31 19:51:25 +0000 (Thu, 31 Mar 2011) Log Message: ----------- Mantis 0005529: [TJvCustomCsvDataSet] Lookup function absence Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:49:39 UTC (rev 13008) +++ trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:51:25 UTC (rev 13009) @@ -734,6 +734,7 @@ procedure LoadFromFile(const FileName: string); procedure DeleteCsvColumn(const AFieldName: string); // must be done when not Active! [NEW 2007!] + function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {These are made protected so that you can write another derived component which has access to various protected fields } protected property InternalData: TJvCsvRows read FData write FData; @@ -5725,6 +5726,14 @@ end; end; +function TJvCustomCsvDataSet.Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): + Variant; +begin + Result := Null; + if LocateRecord(KeyFields, KeyValues, []) then + Result := FieldValues[ResultFields]; +end; + {$IFDEF UNITVERSIONING} initialization RegisterUnitVersion(HInstance, UnitVersioning); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-04-01 19:04:16
|
Revision: 13010 http://jvcl.svn.sourceforge.net/jvcl/?rev=13010&view=rev Author: jfudickar Date: 2011-04-01 19:04:09 +0000 (Fri, 01 Apr 2011) Log Message: ----------- Mantis 0005534: [TJvCustomCsvDataSet]: create calculated /lookup fields at run-time Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2011-03-31 19:51:25 UTC (rev 13009) +++ trunk/jvcl/run/JvCsvData.pas 2011-04-01 19:04:09 UTC (rev 13010) @@ -728,6 +728,7 @@ function GetColumnsAsString: string; virtual; { Row Append one string } procedure AppendRowString(const RowAsString: string); // Along with GetRowAsString, easy way to copy a dataset to another dataset! + procedure CreateFields; override; function IsKeyUnique: Boolean; // Checks current row's key uniqueness. Note that FCsvKeyDef MUST be set! procedure SaveToFile(const FileName: string); @@ -3712,11 +3713,12 @@ else FOpenFileName := ''; - InternalInitFieldDefs; // initialize FieldDef objects. - // Create TField components when no persistent fields have been created if DefaultFields then - CreateFields; + CreateFields // InternalInitFieldDefs is called inside + else + InternalInitFieldDefs; // initialize FieldDef objects. + BindFields(True); // bind FieldDefs to actual Data if FCsvColumns.Count > 1 then @@ -5607,6 +5609,12 @@ end; end; +procedure TJvCustomCsvDataSet.CreateFields; +begin + InternalInitFieldDefs; + inherited CreateFields; +end; + //------------------------------------------------------------------------- //DeleteCsvColumn // This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-04-10 17:00:54
|
Revision: 13014 http://jvcl.svn.sourceforge.net/jvcl/?rev=13014&view=rev Author: jfudickar Date: 2011-04-10 17:00:47 +0000 (Sun, 10 Apr 2011) Log Message: ----------- Changed TJvCustomCsvDataSet.Locate to override, as suggested by Sean Farrow. Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2011-04-08 07:17:22 UTC (rev 13013) +++ trunk/jvcl/run/JvCsvData.pas 2011-04-10 17:00:47 UTC (rev 13014) @@ -735,7 +735,7 @@ procedure LoadFromFile(const FileName: string); procedure DeleteCsvColumn(const AFieldName: string); // must be done when not Active! [NEW 2007!] - function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; + function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; override; {These are made protected so that you can write another derived component which has access to various protected fields } protected property InternalData: TJvCsvRows read FData write FData; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-09-10 10:23:54
|
Revision: 13417 http://jvcl.svn.sourceforge.net/jvcl/?rev=13417&view=rev Author: obones Date: 2012-09-10 10:23:45 +0000 (Mon, 10 Sep 2012) Log Message: ----------- Compatibility with earlier versions as well as XE3 Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2012-09-10 10:09:31 UTC (rev 13416) +++ trunk/jvcl/run/JvCsvData.pas 2012-09-10 10:23:45 UTC (rev 13417) @@ -207,16 +207,18 @@ EJvCsvKeyError = class(EDatabaseError); // Key Uniqueness or Key Problem - {$IFDEF COMPILER12_UP} - TJvRecordBuffer = TRecordBuffer; // Delphi 2009 - {$ELSE} - TJvRecordBuffer = PAnsiChar; - {$ENDIF COMPILER12_UP} - {$IFDEF RTL240_UP} + PJvMemBuffer = PByte; + TJvRecordBuffer = TRecordBuffer; TJvValueBuffer = TValueBuffer; TJvBookmark = TBookmark; {$ELSE} + {$IFDEF UNICODE} + PJvMemBuffer = PByte; + {$ELSE} + PJvMemBuffer = PAnsiChar; + {$ENDIF UNICODE} + TJvRecordBuffer = Pointer; TJvValueBuffer = Pointer; TJvBookmark = Pointer; {$ENDIF RTL240_UP} @@ -345,7 +347,7 @@ constructor Create; procedure AddRow(Item: PCsvRow); - function AllocRecordBuffer: TJvRecordBuffer; { was PChar, now in tiburon it is PByte } + function AllocRecordBuffer: PJvRecordBuffer; { was PChar, now in tiburon it is PByte } procedure InsertRow(const Position: Integer; Item: PCsvRow); procedure AddRowStr(const Item: string); // convert string->TJvCsvRow @@ -572,23 +574,23 @@ procedure SetCsvFieldDef(const Value: string); { Mandatory VCL TDataSet Overrides - Pure Virtual Methods of Base Class } - function AllocRecordBuffer: TJvRecordBuffer; override; - procedure FreeRecordBuffer(var Buffer: TJvRecordBuffer); override; - procedure InternalInitRecord(Buffer: TJvRecordBuffer); override; - function GetRecord(Buffer: TJvRecordBuffer; GetMode: TGetMode; + function AllocRecordBuffer: PJvRecordBuffer; override; + procedure FreeRecordBuffer(var Buffer: PJvRecordBuffer); override; + procedure InternalInitRecord(Buffer: PJvRecordBuffer); override; + function GetRecord(Buffer: PJvRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; function GetRecordSize: Word; override; procedure SetFieldData(Field: TField; Buffer: TJvValueBuffer); override; - procedure ClearCalcFields(Buffer: TJvRecordBuffer); override; + procedure ClearCalcFields(Buffer: PJvRecordBuffer); override; // Bookmark methods: - procedure GetBookmarkData(Buffer: TJvRecordBuffer; Data: TJvBookmark); override; - function GetBookmarkFlag(Buffer: TJvRecordBuffer): TBookmarkFlag; override; + procedure GetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); override; + function GetBookmarkFlag(Buffer: PJvRecordBuffer): TBookmarkFlag; override; procedure InternalGotoBookmark(Bookmark: TJvBookmark); override; - procedure InternalSetToRecord(Buffer: TJvRecordBuffer); override; // on Insertion??? - procedure SetBookmarkFlag(Buffer: TJvRecordBuffer; Value: TBookmarkFlag); override; - procedure SetBookmarkData(Buffer: TJvRecordBuffer; Data: TJvBookmark); override; + procedure InternalSetToRecord(Buffer: PJvRecordBuffer); override; // on Insertion??? + procedure SetBookmarkFlag(Buffer: PJvRecordBuffer; Value: TBookmarkFlag); override; + procedure SetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); override; // Navigational methods: procedure InternalFirst; override; @@ -1831,7 +1833,7 @@ end; { You shouldn't create a "TJvCsvRow-memory-buffer-record-aggregate" anywhere else than here. } -function TJvCustomCsvDataSet.AllocRecordBuffer: TJvRecordBuffer; +function TJvCustomCsvDataSet.AllocRecordBuffer: PJvRecordBuffer; begin Assert(Assigned(FData)); Result := FData.AllocRecordBuffer; @@ -1839,7 +1841,7 @@ { calc fields support } -procedure TJvCustomCsvDataSet.ClearCalcFields(Buffer: TJvRecordBuffer); +procedure TJvCustomCsvDataSet.ClearCalcFields(Buffer: PJvRecordBuffer); begin // Assumes that our buffer is a TJvCsvRow followed by // a dynamically resized buffer used for calculated field @@ -1899,7 +1901,7 @@ Result := FData.FEnquoteBackslash; end; -procedure TJvCustomCsvDataSet.FreeRecordBuffer(var Buffer: TJvRecordBuffer); +procedure TJvCustomCsvDataSet.FreeRecordBuffer(var Buffer: PJvRecordBuffer); begin if Buffer <> nil then FreeMem(Buffer); @@ -1907,7 +1909,7 @@ { called after the record is allocated } -procedure TJvCustomCsvDataSet.InternalInitRecord(Buffer: TJvRecordBuffer); +procedure TJvCustomCsvDataSet.InternalInitRecord(Buffer: PJvRecordBuffer); var RowPtr: PCsvRow; begin @@ -2235,7 +2237,7 @@ end; end; -function TJvCustomCsvDataSet.GetRecord(Buffer: TJvRecordBuffer; GetMode: TGetMode; +function TJvCustomCsvDataSet.GetRecord(Buffer: PJvRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; var RowPtr: PCsvRow; @@ -3038,12 +3040,12 @@ Result := False; end; -procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: TJvRecordBuffer; Data: TJvBookmark); +procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); begin PInteger(Data)^ := PCsvRow(Buffer)^.Bookmark.Data; end; -function TJvCustomCsvDataSet.GetBookmarkFlag(Buffer: TJvRecordBuffer): TBookmarkFlag; +function TJvCustomCsvDataSet.GetBookmarkFlag(Buffer: PJvRecordBuffer): TBookmarkFlag; begin Result := PCsvRow(Buffer)^.Bookmark.Flag; end; @@ -3071,7 +3073,7 @@ Result := Bookmark_Gtr; end; -procedure TJvCustomCsvDataSet.SetBookmarkFlag(Buffer: TJvRecordBuffer; Value: TBookmarkFlag); +procedure TJvCustomCsvDataSet.SetBookmarkFlag(Buffer: PJvRecordBuffer; Value: TBookmarkFlag); begin PCsvRow(Buffer)^.Bookmark.Flag := Value; end; @@ -3082,7 +3084,7 @@ FRecordPos := PInteger(Bookmark)^; end; -procedure TJvCustomCsvDataSet.InternalSetToRecord(Buffer: TJvRecordBuffer); +procedure TJvCustomCsvDataSet.InternalSetToRecord(Buffer: PJvRecordBuffer); begin FRecordPos := PCsvRow(Buffer)^.Bookmark.Data; // Look up index from the record. // Resync([]); @@ -3096,7 +3098,7 @@ FData.BackslashCrLf := Value; end; -procedure TJvCustomCsvDataSet.SetBookmarkData(Buffer: TJvRecordBuffer; Data: TJvBookmark); +procedure TJvCustomCsvDataSet.SetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); begin PCsvRow(Buffer)^.Bookmark.Data := PInteger(Data)^; end; @@ -4301,7 +4303,7 @@ AddRow(PNewItem); end; -function TJvCsvRows.AllocRecordBuffer: TJvRecordBuffer; +function TJvCsvRows.AllocRecordBuffer: PJvRecordBuffer; begin Assert(FTextBufferSize >= JvCsv_MINLINELENGTH); Result := AllocMem(GetRowAllocSize); {was SizeOf(TJvCsvRow)} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-09-10 10:26:12
|
Revision: 13418 http://jvcl.svn.sourceforge.net/jvcl/?rev=13418&view=rev Author: obones Date: 2012-09-10 10:26:01 +0000 (Mon, 10 Sep 2012) Log Message: ----------- Compatibility with earlier versions as well as XE3 Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2012-09-10 10:23:45 UTC (rev 13417) +++ trunk/jvcl/run/JvCsvData.pas 2012-09-10 10:26:01 UTC (rev 13418) @@ -347,7 +347,7 @@ constructor Create; procedure AddRow(Item: PCsvRow); - function AllocRecordBuffer: PJvRecordBuffer; { was PChar, now in tiburon it is PByte } + function AllocRecordBuffer: PJvMemBuffer; { was PChar, now in tiburon it is PByte } procedure InsertRow(const Position: Integer; Item: PCsvRow); procedure AddRowStr(const Item: string); // convert string->TJvCsvRow @@ -574,23 +574,23 @@ procedure SetCsvFieldDef(const Value: string); { Mandatory VCL TDataSet Overrides - Pure Virtual Methods of Base Class } - function AllocRecordBuffer: PJvRecordBuffer; override; - procedure FreeRecordBuffer(var Buffer: PJvRecordBuffer); override; - procedure InternalInitRecord(Buffer: PJvRecordBuffer); override; - function GetRecord(Buffer: PJvRecordBuffer; GetMode: TGetMode; + function AllocRecordBuffer: PJvMemBuffer; override; + procedure FreeRecordBuffer(var Buffer: PJvMemBuffer); override; + procedure InternalInitRecord(Buffer: PJvMemBuffer); override; + function GetRecord(Buffer: PJvMemBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; function GetRecordSize: Word; override; procedure SetFieldData(Field: TField; Buffer: TJvValueBuffer); override; - procedure ClearCalcFields(Buffer: PJvRecordBuffer); override; + procedure ClearCalcFields(Buffer: PJvMemBuffer); override; // Bookmark methods: - procedure GetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); override; - function GetBookmarkFlag(Buffer: PJvRecordBuffer): TBookmarkFlag; override; + procedure GetBookmarkData(Buffer: PJvMemBuffer; Data: TJvBookmark); override; + function GetBookmarkFlag(Buffer: PJvMemBuffer): TBookmarkFlag; override; procedure InternalGotoBookmark(Bookmark: TJvBookmark); override; - procedure InternalSetToRecord(Buffer: PJvRecordBuffer); override; // on Insertion??? - procedure SetBookmarkFlag(Buffer: PJvRecordBuffer; Value: TBookmarkFlag); override; - procedure SetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); override; + procedure InternalSetToRecord(Buffer: PJvMemBuffer); override; // on Insertion??? + procedure SetBookmarkFlag(Buffer: PJvMemBuffer; Value: TBookmarkFlag); override; + procedure SetBookmarkData(Buffer: PJvMemBuffer; Data: TJvBookmark); override; // Navigational methods: procedure InternalFirst; override; @@ -1833,7 +1833,7 @@ end; { You shouldn't create a "TJvCsvRow-memory-buffer-record-aggregate" anywhere else than here. } -function TJvCustomCsvDataSet.AllocRecordBuffer: PJvRecordBuffer; +function TJvCustomCsvDataSet.AllocRecordBuffer: PJvMemBuffer; begin Assert(Assigned(FData)); Result := FData.AllocRecordBuffer; @@ -1841,7 +1841,7 @@ { calc fields support } -procedure TJvCustomCsvDataSet.ClearCalcFields(Buffer: PJvRecordBuffer); +procedure TJvCustomCsvDataSet.ClearCalcFields(Buffer: PJvMemBuffer); begin // Assumes that our buffer is a TJvCsvRow followed by // a dynamically resized buffer used for calculated field @@ -1901,7 +1901,7 @@ Result := FData.FEnquoteBackslash; end; -procedure TJvCustomCsvDataSet.FreeRecordBuffer(var Buffer: PJvRecordBuffer); +procedure TJvCustomCsvDataSet.FreeRecordBuffer(var Buffer: PJvMemBuffer); begin if Buffer <> nil then FreeMem(Buffer); @@ -1909,7 +1909,7 @@ { called after the record is allocated } -procedure TJvCustomCsvDataSet.InternalInitRecord(Buffer: PJvRecordBuffer); +procedure TJvCustomCsvDataSet.InternalInitRecord(Buffer: PJvMemBuffer); var RowPtr: PCsvRow; begin @@ -2237,7 +2237,7 @@ end; end; -function TJvCustomCsvDataSet.GetRecord(Buffer: PJvRecordBuffer; GetMode: TGetMode; +function TJvCustomCsvDataSet.GetRecord(Buffer: PJvMemBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; var RowPtr: PCsvRow; @@ -3040,12 +3040,12 @@ Result := False; end; -procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); +procedure TJvCustomCsvDataSet.GetBookmarkData(Buffer: PJvMemBuffer; Data: TJvBookmark); begin PInteger(Data)^ := PCsvRow(Buffer)^.Bookmark.Data; end; -function TJvCustomCsvDataSet.GetBookmarkFlag(Buffer: PJvRecordBuffer): TBookmarkFlag; +function TJvCustomCsvDataSet.GetBookmarkFlag(Buffer: PJvMemBuffer): TBookmarkFlag; begin Result := PCsvRow(Buffer)^.Bookmark.Flag; end; @@ -3073,7 +3073,7 @@ Result := Bookmark_Gtr; end; -procedure TJvCustomCsvDataSet.SetBookmarkFlag(Buffer: PJvRecordBuffer; Value: TBookmarkFlag); +procedure TJvCustomCsvDataSet.SetBookmarkFlag(Buffer: PJvMemBuffer; Value: TBookmarkFlag); begin PCsvRow(Buffer)^.Bookmark.Flag := Value; end; @@ -3084,7 +3084,7 @@ FRecordPos := PInteger(Bookmark)^; end; -procedure TJvCustomCsvDataSet.InternalSetToRecord(Buffer: PJvRecordBuffer); +procedure TJvCustomCsvDataSet.InternalSetToRecord(Buffer: PJvMemBuffer); begin FRecordPos := PCsvRow(Buffer)^.Bookmark.Data; // Look up index from the record. // Resync([]); @@ -3098,7 +3098,7 @@ FData.BackslashCrLf := Value; end; -procedure TJvCustomCsvDataSet.SetBookmarkData(Buffer: PJvRecordBuffer; Data: TJvBookmark); +procedure TJvCustomCsvDataSet.SetBookmarkData(Buffer: PJvMemBuffer; Data: TJvBookmark); begin PCsvRow(Buffer)^.Bookmark.Data := PInteger(Data)^; end; @@ -4303,7 +4303,7 @@ AddRow(PNewItem); end; -function TJvCsvRows.AllocRecordBuffer: PJvRecordBuffer; +function TJvCsvRows.AllocRecordBuffer: PJvMemBuffer; begin Assert(FTextBufferSize >= JvCsv_MINLINELENGTH); Result := AllocMem(GetRowAllocSize); {was SizeOf(TJvCsvRow)} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-09-10 11:07:52
|
Revision: 13419 http://jvcl.svn.sourceforge.net/jvcl/?rev=13419&view=rev Author: obones Date: 2012-09-10 11:07:42 +0000 (Mon, 10 Sep 2012) Log Message: ----------- Compatibility with earlier versions as well as XE3 Modified Paths: -------------- trunk/jvcl/run/JvCsvData.pas Modified: trunk/jvcl/run/JvCsvData.pas =================================================================== --- trunk/jvcl/run/JvCsvData.pas 2012-09-10 10:26:01 UTC (rev 13418) +++ trunk/jvcl/run/JvCsvData.pas 2012-09-10 11:07:42 UTC (rev 13419) @@ -2416,7 +2416,7 @@ RowPtr: PCsvRow; NewVal: string; CP, PhysicalLocation: Integer; - PDestination: TJvRecordBuffer; + PDestination: PJvMemBuffer; CsvColumnData: PCsvColumn; DT: TDateTime; ATimeStamp: TTimeStamp; @@ -2449,7 +2449,7 @@ Exit; Inc(PDestination, GetCalcDataOffset(RowPtr) + Field.Offset); - PDestination[0] := Ord(Buffer <> nil); + PDestination[0] := {$IFNDEF RTL200_UP}AnsiChar{$ENDIF RTL200_UP}(Ord(Buffer <> nil)); if AnsiChar(PDestination[0]) <> #0 then Move({$IFDEF RTL240_UP}PByte(@Buffer[0]){$ELSE}Buffer{$ENDIF RTL240_UP}^, PDestination[1], Field.DataSize); @@ -2702,7 +2702,7 @@ function TJvCustomCsvDataSet.GetFieldData(Field: TField; Buffer: TJvValueBuffer): Boolean; var RowPtr: PCsvRow; - PSource: TJvRecordBuffer; + PSource: PJvMemBuffer; UserString, TempString: string; AnsiStr: AnsiString; PhysicalLocation: Integer; @@ -3898,7 +3898,7 @@ function TJvCustomCsvDataSet.GetRecNo: Integer; {RecNo := FRecordPos+1} var - BufPtr: PByte; + BufPtr: PJvMemBuffer; begin CheckActive; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |