root/trunk/LCLFileInString.pas

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

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

  • Property svnmailer:content-charset set to cp1251
Line 
1 ////////////////////////////////////////////////////////////
2 //            Класс для работы с файлом, как              //
3 //                с паскалевской строкой                  //
4 //                     LCL-вариант                        //
5 //                        v 1.5                           //
6 //                                                        //
7 //              Copyright (C) 2007 Sagrer                 //
8 //          Распространяется на условиях LGPL 2.1         //
9 //                  см. файл lgpl.txt                     //
10 //                                                        //
11 //                  sagrer@yandex.ru                      //
12 ////////////////////////////////////////////////////////////
13
14 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
15 // 1) Sagrer (sagrer@yandex.ru)
16
17 ////////////////////////////////////////////////////////////////////////
18
19 unit LCLFileInString;
20
21 {$mode objfpc}{$H+}
22
23 interface
24
25 uses
26   Windows, SysUtils, Forms, Dialogs, Classes;
27  
28 const
29   //Коды для OutputMessagesMode
30   FIS_Output_none = 0;        //Не выводить мессаги.
31   FIS_Output_GUI = 1;         //Выводить окошки в GUI.
32   FIS_Output_Console = 2;     //Выводить о ошибках в консоль.
33
34 type
35   TFileInString = Class (TObject)                //Класс для загрузки файла в строку и сохранения. + работа со строкой.
36   public
37     //Переменные
38     OutputMessagesMode : Integer;                //Куда выводить мессаги о ошибках - в GUI / в консоль / в никуда.
39     FileString : AnsiString;                     //Тут хранится собсно загруженная инфа.
40     FirstLoaded : boolean;                       //Признак того что какая-либо информация когда-либо загружалась.
41     //Конструкторы-деструкторы
42     constructor Create; virtual;                            //Конcтруктор  %).
43     Destructor Destroy; override;                           //Типа деструктор.
44     //Методы
45     Function Siz : Integer;                      //Получить размер загруженной инфы.
46     Function Load(const FName : AnsiString) : boolean; virtual; //Загрузить из файла.
47     Procedure Save(const FName : AnsiString);                   //Сохранить в файл.
48     Procedure MakNewFile(); virtual;                              //"Создать новый файл" %).
49     Procedure AddChar(const ch : char);                         //Добавить символ.
50     Procedure AddByte(const bt : byte);                         //Добавить байт.
51     Function ReadStr(const FirstByte, BytesRead : Integer) : AnsiString;    //Прочитать строку.
52     Procedure LoadFromResource(const ResName, ResType : PChar);             //Загрузить инфу из ресурса.
53   end; 
54
55 implementation
56
57 ////////////////////////////////////////
58 //           TFileInString            //
59 ////////////////////////////////////////
60
61 //------------------------------------//
62 //      Конструкторы-деструкторы      //
63 //------------------------------------//
64
65 Constructor TFileInString.Create;
66 //Конутруктор  %).
67 begin
68   FirstLoaded := false;
69   FileString := '';
70   SetLength(FileString,0);
71   OutputMessagesMode := FIS_Output_none;      //По умолчанию вывод в никуда.
72 end;
73
74 Destructor TFileInString.Destroy;
75 begin
76   //Типа деструктор.
77   SetLength(FileString,0);
78   inherited;
79 end;
80
81 //------------------------------------//
82 //             Методы                 //
83 //------------------------------------//
84
85 Function TFileInString.Siz : Integer;
86 //Получить размер загруженной инфы.
87 begin
88   Result := Length(FileString);
89 end;
90
91 Function TFileInString.Load(const FName : AnsiString) : boolean;
92 //Загрузить из файла.
93 var
94   DataFile: THandle;
95   FileSize: DWORD;
96   Resultt : integer;
97 begin
98   Result := false;
99   FileString := '';
100   Resultt := 0;
101   //Процедура загрузки в строку.
102   //Открываю файл и получаю его размер.
103   //Кстати проверяю файл на его наличие :).
104   If FileExists(FName) = true then begin
105     DataFile := FileOpen(FName, fmOpenRead or fmShareDenyNone);
106     if DataFile = 0 then
107       if OutputMessagesMode = FIS_Output_GUI then begin
108         Application.MessageBox(PChar('Error, loading'+FName),'Error',MB_OK or MB_ICONERROR);
109       end
110       else if OutputMessagesMode = FIS_Output_Console then begin
111         Writeln('Error, loading'+FName);
112       end;
113     try
114       FileSize := GetFileSize(DataFile, nil);
115       SetLength(FileString, FileSize);
116       ReadFile(THandle(DataFile),Pointer(FileString)^,FileSize,LongWord(Resultt),nil)
117     finally
118       CloseHandle(DataFile);
119     end;
120     FirstLoaded := true;
121     Result := true;
122   end
123   else begin
124     //Наорать на юзверя (или программера), что файла нету!
125     if OutputMessagesMode = FIS_Output_GUI then begin
126       ShowMessage('Ошибка! Типа не могу открыть файл '+FName+', т.к. открывать то нечего. Проверьте пути.');
127     end
128     else if OutputMessagesMode = FIS_Output_Console then begin
129       Writeln('Error, cant load file'+FName+'because file is not exists! Check paths!');
130     end;
131   end;
132 end;
133
134 procedure TFileInString.Save(const FName : AnsiString);
135 //Сохранить в файл.
136 var
137   DataFile: THandle;
138   FileSize: DWORD;
139   Resultt : integer;
140
141 begin
142   //Процедура сейва из строки..
143   Resultt := 0;
144   If Siz <> 0 then begin
145     if FirstLoaded = true then begin
146       //Если есть чего сохранять, то погнали.
147       if (DirectoryExists(ExtractFilePath(FName)) = false) and (ExtractFilePath(FName) <> '') then begin
148         //Если папки для файла нет, то попробовать создать ее...
149         ForceDirectories(ExtractFilePath(FName));
150       end;
151       //Если старый файл есть - создать пустой на его месте.
152       DataFile := CreateFile(PChar(FName),GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
153       //DataFile := FileOpen(FName, fmOpenWrite or fmShareDenyWrite);
154       if DataFile = 0 then
155         if OutputMessagesMode = FIS_Output_GUI then begin
156           Application.MessageBox(PChar('Error, Saving'+FName),'Error',MB_OK or MB_ICONERROR);
157         end
158         else if OutputMessagesMode = FIS_Output_Console then begin
159           Writeln('Error, Saving'+FName);
160         end;
161       try
162         FileSize := siz;
163         WriteFile(THandle(DataFile),Pointer(FileString)^,FileSize,LongWord(Resultt),nil)
164       finally
165         CloseHandle(DataFile);
166       end;
167       FirstLoaded := true;
168     end
169     else begin
170       //Если сохранять нечего, то громко заругаться!
171       if OutputMessagesMode = FIS_Output_GUI then begin
172         ShowMessage('ЕПТЫТЬ!..., кароче в обьект класа еще ни разу ниче не грузилось! А сохранять то чего блин??? Типа ошибка, ниче не сохранилось :(');
173       end
174       else if OutputMessagesMode = FIS_Output_Console then begin
175         Writeln('ERROR! Nothing loaded into TFileInString class''s object! Nothing to save!');
176       end;
177     end;
178   end
179   else begin
180     //Если файл пустой (0 байтов)
181
182     //try
183       DataFile := CreateFile(PChar(FName),GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
184     //finally
185       CloseHandle(DataFile);
186     //end;
187   end;
188 end;
189
190 Procedure TFileInString.MakNewFile();
191 //"Создать новый файл" %).
192 begin
193   //ПроцеДурка для "создания" файла - чтоб новый делать можно было.
194   FirstLoaded := true;
195   SetLength(FileString,0);
196   FileString := '';
197 end;
198
199 Procedure TFileInString.AddChar(const ch : char);
200 //Добавить символ.
201 begin
202   //Процедура добавки байта в строку в виде чара.
203   FileString := FileString+ch;
204 end;
205
206 Procedure TFileInString.AddByte(const bt : byte);
207 //Добавить байт.
208 begin
209   //Процедура добавки байта в строку в виде байта...
210   FileString := FileString+char(bt);
211 end;
212
213 Function TFileInString.ReadStr(const FirstByte, BytesRead : Integer) : AnsiString;
214 //Прочитать строку.
215 var
216   TempInt, LastByte : Integer;
217 begin
218   //Прочитать строку начиная с нужного байта.
219   //и по конечный байт.
220   TempInt := Length(FileString);
221   LastByte := FirstByte+BytesRead;
222
223   If LastByte <= TempInt+1 then begin
224     //Только если LastByte не вылезло за пределы файла.
225     //(точнее за пределы переменной - в ту часть памяти, куда лезть не положено)
226     //ато винда покажет синий экранчик :).
227     SetLength(Result,LastByte-FirstByte);
228     Result := Copy(FileString,FirstByte,BytesRead);
229     SetLength(Result,LastByte-FirstByte);
230   end
231   else begin
232     result := '';
233   end; 
234 end;
235
236 Procedure TFileInString.LoadFromResource(const ResName, ResType : PChar);
237 //Загрузить инфу из ресурса.
238 var
239   R : HRSRC;
240   G : HGlobal;
241   P : PChar;
242   Sz : DWORD;
243   E : Integer;
244  
245 begin
246   //Функа для загрузки инфы в файл из ресурса, присобаченного к экзейнику.
247  
248   //Читаем % )). Сделано аналогично тому как сделано в KOL.
249   R := FindResource( HInstance, ResName, ResType );
250   if R <> 0 then
251   begin
252     Sz := SizeofResource( HInstance, R );
253     G := LoadResource( HInstance, R );
254     if G <> 0 then
255     begin
256       P := GlobalLock( G );
257       if P = nil then
258       begin
259         E := GetLastError;
260         if E = ERROR_INVALID_HANDLE then
261            P := Pointer( G )
262         else
263            Exit;
264       end;
265       SetLength(FileString,Sz);
266       CopyMemory(@FileString[1],P,Sz);
267       if P <> Pointer( G ) then GlobalUnlock( G );
268       //FreeResource( G );
269       { from Win32.hlp: "You do not need to call the FreeResource
270         function to free a resource loaded by using the LoadResource
271         function." }
272     end;
273   end;
274 end;
275
276 end.
Note: See TracBrowser for help on using the browser.