root/trunk/FileInString.pas

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