root/branches/0_1_3/LCLTextFileInString.pas

Revision 111, 6.9 kB (checked in by sagrer, 1 year ago)

Пофиксаны кое-где объявления метода MakNewFile? - чтоб везде со скобками был, иначе перегрузка может поглюкивать.

  • Property svnmailer:content-charset set to cp1251
Line 
1 ////////////////////////////////////////////////////////////
2 //              Класс работы с файлом, как                //
3 //                с паскалевской строкой                  //
4 //               + функции для текстовика                 //
5 //                     LCL-вариант                        //
6 //                       v 1.3                            //
7 //                                                        //
8 //              Copyright (C) 2007 Sagrer                 //
9 //          Распространяется на условиях LGPL 2.1         //
10 //                  см. файл lgpl.txt                     //
11 //                                                        //
12 //                  sagrer@yandex.ru                      //
13 ////////////////////////////////////////////////////////////
14
15 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
16 // 1) Sagrer (sagrer@yandex.ru)
17
18 ////////////////////////////////////////////////////////////////////////
19
20 unit LCLTextFileInString;
21 ////////////////////////////////////////////////////////
22 //        Как бы надстройка над TFileInString         //
23 //       Набор фунок для работы с файло-строкой       //
24 //         подразумевая, что это текстовый файл       //
25 //                 Crafted by Sagrer                  //
26 ////////////////////////////////////////////////////////
27
28 {$mode objfpc}{$H+}
29
30 interface
31 uses LCLFileInString;
32
33 type
34   TTextFileInString = class (TFileInString)
35   public
36     //Класс для работы с текстовиком на основе TFileInString
37     Cursor : LongInt;
38     //Конструкторы-деструкторы
39     constructor Create; override;                           //Конутруктор  %).
40     Destructor Destroy; override;                           //Типа деструктор.
41     //Методы
42     Function Load(const FName : AnsiString) : boolean; override; //Загрузить из файла.
43     Procedure MakNewFile(); override;                              //"Создать новый файл" %).
44     Procedure AddStr(const Str : AnsiString);
45     Function ReadStrLn(const FirstByte : LongInt) : AnsiString;
46     Function CurReadStr : AnsiString;
47     Function CurReadLn : AnsiString;
48     Function Eof : boolean;
49     Function CurRead(const BytesRead : LongInt) : AnsiString;
50     Procedure InsertString(const Pos : LongInt; Str : AnsiString);
51     Procedure ReplaceString(const Pos : LongInt; Str : AnsiString);
52   end;
53
54 implementation
55
56 ////////////////////////////////////////
57 //        TTextFileInString           //
58 ////////////////////////////////////////
59
60 //------------------------------------//
61 //      Конструкторы-деструкторы      //
62 //------------------------------------//
63
64 Constructor TTextFileInString.Create;
65 //Конутруктор  %).
66 begin
67   inherited;       //Вызов родительского метода...
68   //Ставим курсор на единицу...
69   Cursor := 1;
70 end;
71
72 Destructor TTextFileInString.Destroy;
73 begin
74   //Типа деструктор.
75   inherited;
76 end;
77
78 //------------------------------------//
79 //             Методы                 //
80 //------------------------------------//
81
82 Function TTextFileInString.Load(const FName : AnsiString) : boolean;
83 //Загрузить из файла.
84 begin
85   Result := inherited;
86   Self.Cursor := 1;
87 end;
88
89 Procedure TTextFileInString.MakNewFile();
90 //"Создать новый файл" %).
91 begin
92   inherited;
93   Self.Cursor := 1;
94 end;
95
96 Procedure TTextFileInString.AddStr(const Str : AnsiString);
97 begin
98   FileString := FileString+Str+#13#10;
99 end;
100
101 Function TTextFileInString.ReadStrLn(const FirstByte : LongInt) : AnsiString;
102 var
103   I, TempInt : LongInt;
104 begin
105   //Прочитать строку начиная с нужного байта.
106   //Курсор не трогать.
107
108   //В начале - найти конец строки.
109   I := FirstByte;
110   TempInt := Length(FileString);
111   repeat
112     If (FileString[I] <> #13) and (FileString[I] <> #10) and (FileString[I] <> #12) and (I <> TempInt+1) then begin
113       I := I+1;
114     end;
115   until (FileString[I] = #13) or (FileString[I] = #10) or (FileString[I] = #12) or (I = TempInt+1);
116
117   //скопировать нужное число байтов (оно вычисляется также ниже).
118   result := ReadStr(FirstByte,I-FirstByte);
119 end;
120
121 Function TTextFileInString.CurReadStr : AnsiString;
122 begin
123   //Функа читает строку с точки курсора, и передвигает курсор в конец строки.
124   Result := ReadStrLn(Cursor);
125   Cursor := Cursor+Length(Result);
126 end;
127
128 Function TTextFileInString.CurReadLn : AnsiString;
129 begin
130   //Функа читает строку с точки курсора, и передвигает курсор на начало след. строки,
131   //если она вообще существует.
132   Result := CurReadStr;
133   If (Cursor <> Length(FileString)+1) and ((Length(FileString)+1)  - (Cursor) >=2) and (FileString[Cursor] = #13) then begin
134     //Если курсор еще не в конце, стоит на #13, и есть еще 2 байта, то...
135     Cursor := Cursor+2;
136   end
137   else if (Cursor <> Length(FileString)+1) and ((Length(FileString)+1)  - (Cursor) >=1) and (FileString[Cursor] <> #13) then begin
138     //Если курсор еще не в конце, стоит не на #13 и есть еще 1 байта, то...
139     Cursor := Cursor+1;
140   end;
141 end;
142
143 Function TTextFileInString.Eof : boolean;
144 begin
145   //Если курсор лежит в конце файла, то типа тру...
146
147   result := false;  //по умолчанию...
148
149   If Cursor = Length(FileString)+1 then begin
150     result := true;
151   end
152   else begin
153     If Cursor > Length(FileString)+1 then begin
154       //Если курсор за пределами файла вдруг оказался,
155       //то поправить, и вернуть тру...
156       Cursor := Length(FileString)+1;
157       result := true;
158     end;
159   end;
160 end;
161
162 Function TTextFileInString.CurRead(const BytesRead : LongInt) : AnsiString;
163 begin
164   //Функа, чтоб прочитать нужное число байтов из строки файла,
165   //передвинув при этом курсор.
166
167   result := ReadStr(Cursor,BytesRead);
168   Cursor := Cursor+BytesRead;
169 end;
170
171 Procedure TTextFileInString.InsertString(const Pos : LongInt; Str : AnsiString);
172 var
173   TempStr : AnsiString;
174 begin
175   //Функа, чтоб вставить (хоть в середину файла - в общем
176   // - на нужную позицию) строку.
177
178   TempStr := ReadStr(1,Pos-1); //Считать кусок строки до указанной позиции.
179   TempStr := TempStr+Str;  //Вставить строку...
180   If Pos-1 <> Length(FileString) then begin
181     //Если есть еще остаток строки...
182     TempStr := TempStr+ReadStr(Pos,Length(FileString)-Pos+1);  //Считать остаток строки.
183   end; 
184   FileString := TempStr;
185 end;
186
187 Procedure TTextFileInString.ReplaceString(const Pos : LongInt; Str : AnsiString);
188 var
189   TempStr, buf : AnsiString;
190   TempPos : LongInt;
191 begin
192   //Функа чтоб заменить (в середине файла гденить например)
193   //строку на строку (тоесть до #13#10 или до конца строки собсно...)
194   TempStr := ReadStr(1,Pos-1); //Считать кусок строки до указанной позиции.
195   TempStr := TempStr+Str;  //Вставить строку...
196   If Pos-1 <> Length(FileString) then begin
197     //Если есть еще остаток строки...
198     buf := ReadStrLn(Pos);    //Типа получить строку, и по ней узнать
199     //сколько в строке, попадающей под замену символов.
200     TempPos := Pos+Length(buf);
201
202     TempStr := TempStr+ReadStr(TempPos,Length(FileString)-TempPos+1);  //Считать остаток строки.
203   end;
204   FileString := TempStr;
205 end;
206
207 end.
Note: See TracBrowser for help on using the browser.