السؤال الأول
هناك أخي أكثر من إصدارة للدلفي7
Personal
هدفها الوافدين الجدد لدلفي وليس المطورين ولا تدعم برمجة قواعد البيانات ولا أية ميزة متقدمة لدلفي
وهناك
Professional Studio , Enterprise Studio , Architect Studio ولكل منها مستوا
هذا كود يقوم بالبحث عن نص ويعيد موقعه
للأمانة إسم المولف حسب الموقع : P. Below
كود
[font="Courier New"][b]function [/b]ScanFile([b]const [/b]FileName: [b]string[/b];
[b]const [/b]forString: [b]string[/b];
caseSensitive: Boolean): Longint;
[/font][font="Courier New"][b]const
[/b]BufferSize = $8001; [/font][font="Courier New"][color="#000080"][i]{ 32K+1 bytes }
[/i][/color][/font][font="Courier New"][b]var
[/b]pBuf, pEnd, pScan, pPos: PChar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Integer;
F: [b]file[/b];
SearchFor: PChar;
oldMode: Word;
[/font][b][font="Courier New"]begin
[/font][/b][font="Courier New"][color="#000080"][i]{ assume failure }
[/i][/color]Result := -1;
[b]if [/b](Length(forString) = 0) [b]or [/b](Length(FileName) = 0) [b]then [/b]Exit;
SearchFor := [b]nil[/b];
pBuf := [b]nil[/b];
[/font][font="Courier New"][color="#000080"][i]{ open file as binary, 1 byte recordsize }
[/i][/color]AssignFile(F, FileName);
oldMode := FileMode;
FileMode := 0; [/font][font="Courier New"][color="#000080"][i]{ read-only access }
[/i][/color]Reset(F, 1);
FileMode := oldMode;
[b]try [/b][/font][font="Courier New"][color="#000080"][i]{ allocate memory for buffer and pchar search string }
[/i][/color]SearchFor := StrAlloc(Length(forString) + 1);
StrPCopy(SearchFor, forString);
[b]if not [/b]caseSensitive [b]then [/b][/font][font="Courier New"][color="#000080"][i]{ convert to upper case }
[/i][/color]AnsiUpper(SearchFor);
GetMem(pBuf, BufferSize);
filesize := System.Filesize(F);
bytesRemaining := filesize;
pPos := [b]nil[/b];
[b]while [/b]bytesRemaining > 0 [/font][b][font="Courier New"]do
begin
[/font][/b][font="Courier New"][color="#000080"][i]{ calc how many bytes to read this round }
[/i][/color][b]if [/b]bytesRemaining >= BufferSize [/font][font="Courier New"][b]then
[/b]bytesToRead := Pred(BufferSize)
[/font][font="Courier New"][b]else
[/b]bytesToRead := bytesRemaining;
[/font][font="Courier New"][color="#000080"][i]{ read a buffer full and zero-terminate the buffer }
[/i][/color]BlockRead(F, pBuf^, bytesToRead, bytesToRead);
pEnd := @pBuf[bytesToRead];
pEnd^ := #0;
pScan := pBuf;
[b]while [/b]pScan < pEnd [/font][font="Courier New"][b]do
begin
if not [/b]caseSensitive [b]then [/b][/font][font="Courier New"][color="#000080"][i]{ convert to upper case }
[/i][/color]AnsiUpper(pScan);
pPos := StrPos(pScan, SearchFor); [/font][font="Courier New"][color="#000080"][i]{ search for substring }
[/i][/color][b]if [/b]pPos <> [/font][b][font="Courier New"]nil then
begin [/font][/b][font="Courier New"][color="#000080"][i]{ Found it! }
[/i][/color]Result := FileSize - bytesRemaining +
Longint(pPos) - Longint(pBuf);
Break;
[b]end[/b];
pScan := StrEnd(pScan);
Inc(pScan);
[b]end[/b];
[b]if [/b]pPos <> [b]nil then [/b]Break;
bytesRemaining := bytesRemaining - bytesToRead;
[b]if [/b]bytesRemaining > 0 [/font][font="Courier New"][b]then
begin
[/b]Seek(F, FilePos(F) - Length(forString));
bytesRemaining := bytesRemaining + Length(forString);
[b]end[/b];
[b]end[/b]; [/font][font="Courier New"][color="#000080"][i]{ While }
[/i][/color][/font][font="Courier New"][b]finally
[/b]CloseFile(F);
[b]if [/b]SearchFor <> [b]nil then [/b]StrDispose(SearchFor);
[b]if [/b]pBuf <> [b]nil then [/b]FreeMem(pBuf, BufferSize);
[b]end[/b];
[b]end[/b]; [/font][font="Courier New"][color="#000080"][i]{ ScanFile }
// Search in autoexec.bat for "keyb" with case insensitive
// In der autoexec.bat nach "keyb" suchen
[/i][/color][b]procedure [/b]TForm1.Button1Click(Sender: TObject);
[/font][font="Courier New"][b]var
[/b]Position: integer;
[/font][font="Courier New"][b]begin
[/b]Position := ScanFile('c:\autoexec.bat', 'keyb', False);
ShowMessage(IntToStr(Position));
[b]end[/b];[/font]
بالنسبة لموضوع القاموس لا أظن أن هذه الطريقة مجدية ربما إذا إستخدمت قواعد البيانات أفضل
أو حاول إستخدام TStringList فهي أسهل للبحث والتحميل من ملف ولكن
أيضا أنت تقول أن تأخذ كلمة من عمود ونظيرتها من أخر طيب ماذا لو كان للكلمة أكثر من معنى هل تأخذ عمودين أو ثلاث
البحث سوف يكون أطول وأكثر تعرضا للخطأ