![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при попытке создать файл с помощью PStrList.
Some © (2006-05-07 17:07:00)В некоторых каталогах скомпилированная программа не может создать файл с помощью SaveToFile,
выдаётся ошибка:
RunTime Error 216 at xxxxxx
Вот пример имени такого каталога:
D:\NTSOFT\CodeBlocks\
Если же файл уже создан, то всё ОК.
Пррбовал создавать новый проект - ошибка повторяется.
Delphi 3, KOL 2.35 Win2k
В чём здесь дело?
var sec,min,hours:byte; l:PStrList;
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var wndm:hwnd;
begin
if not JustOne(Form1.Form,'INDICATOR IS RUNNING') then
begin
IF ShowMsg('The Program Is Already Running.'+#13#10+'Terminate?',MB_YESNO)=6 THEN
begin
wndm := FindWindow('obj_Form', PChar('Time Online'));
if wndm <> 0 then SendMessage(wndm,WM_CLOSE,0,0);
end;
Form1.form.close;
end;
IF FileExists(GetStartDir+'indicator.ini') THEN
BEGIN
l:=NewStrList;
l.LoadFromFile(GetStartDir+'indicator.ini');
Form1.form.TOP:=Str2Int(l.Items[0]);
Form1.form.Left:=Str2Int(l.Items[1]);
l.Free;
END else
begin
Form1.form.TOP:=0-5;
Form1.form.Left:=(ScreenWidth div 2)-(Form1.form.Width div 2);
end;
// - - -
end;
procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
l:=NewStrList;
l.Add(Int2Str(Form1.form.top));
l.Add(Int2Str(Form1.form.Left));
l.SaveToFile(GetStartDir+'indicator.ini'); // <- ошибка где-то здесь
l.Free;
end;
homm (2006-05-09 09:30:00) [1]
> Меня эта конфигурация вполне устраивает, даже тоталкоммандер
> был на D2 написан.
Дак потому и был написан на D2, что KOL тогда небыло. Проекты, откомпилированые в разных версиях дельфей отличаются в худшем случае на пару килобайт. Все-же D3 уж больно неудобный. Если ты переживаеш по поводу производительности, то могу сказать, что на D5 я писал на Pmmx-225 с 64 метрами, да и сейчас у меня дома Cel563 со 128-ю.
2 Vladimir Kladov
Для TStrList переопределен Init, соответственно не выполняется следующий код:
procedure _TObj.Init;
begin
{$IFDEF _D2orD3}
FillChar( Pointer( Integer(@Self) + 4 )^, Sizeof( Self ) - 4, 0 );
{$ENDIF}
end;
Some (2006-05-09 00:52:00) [2]>где именно ошибка ? по какому адресу-то? потрассировать внутрь процедуры пробовал ?
Пробовал, но дальше делфи останавливается не ясно где, и если нажать F9 то появляется окно с ошибкой.
>надо бы его или доделать или не показывать вообще. да и с ресайзами бороться стилем
Это я исправил:
http://mostly.nm.ru/INDICATOR_KOL_1.08.zip
GMax (2006-05-08 21:29:00) [3]возможно есть какая-то разница при работе с памятью в D3 и позже...
где именно ошибка ? по какому адресу-то? потрассировать внутрь процедуры пробовал ?
у меня на w2k d7 без проблем (правда ShowMsg('The Program Is Already Running... выглядит совсем не красиво, появляется недоделанное второе окно. надо бы его или доделать или не показывать вообще. да и с ресайзами бороться стилем, или на крайняк Min/Max|Width/Height, чтобы не мигало)
Some (2006-05-08 19:58:00) [4]>Меня очень кофигурация Ваша Some удивила (Delphi 3, KOL 2.35 Win2k)
Меня эта конфигурация вполне устраивает, даже тоталкоммандер был на D2 написан.
>А вот почему Вы fbsToolWindow постоянно упоминаете, без него ошибка то есть???
Оно не влияет на ошибку, просто в версии KOL 1.08 я это свойство не нашёл.
Ещё: Добавил пустое событие OnMouseUp (KOL 2.35) - ошибка сразу же при запуске в делфи - если выполнять по шагам, то со строки
l.LoadFromFile(GetStartDir+'indicator.ini');
сразу же прыгает на
Timer1.Interval:=1000;
и далее на файл kol.pas в функцию
function WndFunc( W: HWnd; Msg: Cardinal; wParam, lParam: Integer )
: Integer; stdcall;
и далее появляется окно Runtimeerror 216.
MTsv DN (2006-05-08 17:42:00) [5]Привет...
И на NTFS, и на FAT32 все нормально...
Меня очень кофигурация Ваша Someудивила ( Delphi 3, KOL 2.35 Win2k), извините...
А вот почему Вы fbsToolWindowпостоянно упоминаете, без него ошибка то есть??? Если нет ошибки, так сделайте ToolWindow, вот так:
Form1.form.Style:= Form1.form.Style and WS_EX_TOOLWINDOW;
С уважением MTsv DN
Some (2006-05-08 16:25:00) [6]>А теперь поставь обратно 2.35, скомпилируй и все скорее всего будет работать
Нет, ошибка опять появляется.
>А точнее права на создание новых файлов.
У меня FAT 32, я под администратором всегда работаю.
homm (2006-05-08 15:29:00) [7]
> И зачем вообще нужен NTFS? По мне FAT32 и быстрееи надежнее
> и универсальнее
Не скажите. Винда со сжатого NTFS тома раза в 1,5 быстрее стартует. А про надежность я думаю Вы и так знаете.
Vladimir Kladov (2006-05-08 15:21:00) [8]А точнее права на создание новых файлов. (И зачем вообще нужен NTFS? По мне FAT32 и быстрее и надежнее и универсальнее).
homm (2006-05-08 15:02:00) [9]
> Сейчас поставил KOL версии ниже 2 (version 1.08) -скомпилировал
> - всё работает нормально.
А теперь поставь обратно 2.35, скомпилируй и все скорее всего будет работать. (только предположение) В крайнем случае посмотри, чем реализация StrList отличается.
Some (2006-05-08 14:47:00) [10]>Проверь права на запись в "некоторых" папках.
У меня полный доступ - все права.
Сейчас поставил KOL версии ниже 2 (version 1.08) -скомпилировал - всё работает нормально.
(Только нам нет свойства BorderStyle:=fbsToolWindow в инспекторе объектов).
homm (2006-05-08 09:39:00) [11]Проверь права на запись в "некоторых" папках.
MTsv DN (2006-05-08 07:30:00) [12]Delphi 7, KOL 2.35, XP
Тоже все работает.
С Уважением MTsv DN
homm (2006-05-07 22:25:00) [13]
> Delphi 3, KOL 2.35 Win2k
Delphi 5, KOL 2.33, XP
Все работает.
Some (2006-05-07 21:25:00) [14]>Проверьте, чему равно Form1 в OnClose. Вообще, в методе самой же
>формы к глобальной незачем обращаться, достаточно Form.Top :=.
Убрал Form1, но всё равно ошибка вылетает, вот полный исходник:
http://mostly.nm.ru/INDICATOR.zip
9кб
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit main;
interface
{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics,
mckCtrls {$ENDIF (place your units here->)},winsock;
{$ELSE}
{$I uses.inc}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
mirror;
{$ENDIF}
type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
Timer1: TKOLTimer;
Label1: TKOLLabel;
procedure KOLForm1FormCreate(Sender: PObj);
procedure Timer1Timer(Sender: PObj);
procedure KOLForm1Resize(Sender: PObj);
procedure KOLForm1Close(Sender: PObj; var Accept: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}
implementation
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I main_1.inc}
{$ENDIF}
var sec,min,hours:byte; dontsave:boolean;
function my_ip_address: longint;
const
bufsize = 255;
WSVer = $101;
var
buf: pointer;
RemoteHost: PHostEnt;
wsaData: TWSAData;
begin
if WSAStartup(WSVer, wsaData) <> 0 then
begin
my_ip_address := 0;
exit;
end;
buf := nil;
try
getmem(buf, bufsize);
winsock.gethostname(buf, bufsize);
RemoteHost := Winsock.GetHostByName(buf);
if RemoteHost = nil then
my_ip_address := winsock.htonl($07000001) // 127.0.0.1
else
my_ip_address := longint(pointer(RemoteHost^.h_addr_list^)^);
finally
if buf <> nil then
freemem(buf, bufsize);
end;
result := winsock.ntohl(result);
end;
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var wndm:hwnd; l:PStrList;
begin
//SET Form1.form.BorderStyle:=fbsToolWindow;
dontsave:=false;
if not JustOne(Form,'INDICATOR IS RUNNING') then
begin
IF ShowMsg('The Program Is Already Running.'+#13#10+'Terminate?',MB_YESNO)=6 THEN
begin
wndm := FindWindow('obj_Form', PChar('Time Online'));
if wndm <> 0 then SendMessage(wndm,WM_CLOSE,0,0);
end;
dontsave:=true;
form.close;
end;
IF FileExists(GetStartDir+'indicator.ini') THEN
BEGIN
l:=NewStrList;
l.clear;
l.LoadFromFile(GetStartDir+'indicator.ini');
form.TOP:=Str2Int(l.Items[0]);
form.Left:=Str2Int(l.Items[1]);
l.Free;
END else
begin
form.TOP:=0-5;
form.Left:=(ScreenWidth div 2)-(form.Width div 2);
end;
form.Caption:='Time Online';
form.StayOnTop:=true;
form.Height:=42;
form.Width:=99;
Label1.TextAlign:=taCenter;
Label1.Top:=0;
Label1.Left:=0;
Label1.Width:=90;
Label1.Height:=22;
Label1.Color:=clBlack;
Label1.Font.FontName:='Arial';
Label1.Font.FontQuality:=fqProof;
Label1.Font.FontStyle:=[];
Label1.Font.FontHeight:=20;
Label1.Font.Color:=clLime;
Label1.Caption:='00:00:00';
sec:=0;min:=0; hours:=0;
Timer1.Interval:=1000;
end;
procedure TForm1.Timer1Timer(Sender: PObj);
var s,sm,sh:string[1];
begin // exit;
if my_ip_address=2130706433 then //127.0.0.1
begin
form.Visible:=false;
sec:=0;min:=0; hours:=0;
exit;
end else form.Visible:=true;
s:='';sm:='';sh:='';
sec:=sec+1;
if sec>=60 then
begin
sec:=0;
min:=min+1;
end;
if min>=60 then
begin
min:=0;
hours:=hours+1;
end;
if sec<10 then s:='0';
if min<10 then sm:='0';
if hours<10 then sh:='0';
Label1.Caption:=sh+Int2Str(hours)+':'+sm+Int2Str(min)+':'+s+Int2Str(sec);
end;
procedure TForm1.KOLForm1Resize(Sender: PObj);
begin
form.Height:=42;
form.Width:=99;
end;
procedure Save2File;
var l:PStrList;
begin
l:=NewStrList;
l.Clear;
l.Add(Int2Str(Form1.form.top));
l.Add(Int2Str(Form1.form.Left));
l.SaveToFile(GetStartDir+'indicator.ini');
l.Free;
end;
procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
if not dontsave then Save2File;
end;
end.
Vladimir Kladov (2006-05-07 20:33:00) [15]Проверьте, чему равно Form1 в OnClose. Вообще, в методе самой же формы к глобальной незачем обращаться, достаточно Form.Top :=.
Some (2006-05-07 17:33:00) [16]>поместить в обработчик кнопки, ошибка тоже появляется?
Теперь ошибка уже везде появляется, а Applet я не использую.
homm (2006-05-07 17:17:00) [17]А если
> l:=NewStrList;
> l.Add(Int2Str(Form1.form.top));
> l.Add(Int2Str(Form1.form.Left));
> l.SaveToFile(GetStartDir+'indicator.ini'); //
> <- ошибка где-то здесь
> l.Free;
поместить в оьработчик кнопки, ошибка тоже появляется?
Просто мысли, что гдето-может юзатся Applet, который Terminated.