Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Ошибка при попытке создать файл с помощью PStrList.   Найти похожие ветки 

 
Some   (2006-05-07 17:07) [0]

В некоторых каталогах скомпилированная программа не может создать файл с помощью 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-07 17:17) [1]

А если
>    l:=NewStrList;
>    l.Add(Int2Str(Form1.form.top));
>    l.Add(Int2Str(Form1.form.Left));
>    l.SaveToFile(GetStartDir+"indicator.ini");         //
> <- ошибка где-то здесь
>    l.Free;      
поместить в оьработчик кнопки, ошибка тоже появляется?

Просто мысли, что гдето-может юзатся Applet, который Terminated.


 
Some   (2006-05-07 17:33) [2]

>поместить в обработчик кнопки, ошибка тоже появляется?

Теперь ошибка уже везде появляется, а Applet я не использую.


 
Vladimir Kladov   (2006-05-07 20:33) [3]

Проверьте, чему равно Form1 в OnClose. Вообще, в методе самой же формы к глобальной незачем обращаться, достаточно Form.Top :=.


 
Some   (2006-05-07 21:25) [4]

>Проверьте, чему равно 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.


 
homm ©   (2006-05-07 22:25) [5]


> Delphi 3, KOL 2.35 Win2k

Delphi 5, KOL 2.33, XP
Все работает.


 
MTsv DN ©   (2006-05-08 07:30) [6]

Delphi 7, KOL 2.35, XP
Тоже все работает.

С Уважением MTsv DN


 
homm ©   (2006-05-08 09:39) [7]

Проверь права на запись в "некоторых" папках.


 
Some   (2006-05-08 14:47) [8]

>Проверь права на запись в "некоторых" папках.

У меня полный доступ - все права.

Сейчас поставил KOL версии ниже 2 (version 1.08) -скомпилировал - всё работает нормально.
(Только нам нет свойства BorderStyle:=fbsToolWindow в инспекторе объектов).


 
homm ©   (2006-05-08 15:02) [9]


> Сейчас поставил KOL версии ниже 2 (version 1.08) -скомпилировал
> - всё работает нормально.

А теперь поставь обратно 2.35, скомпилируй и все скорее всего будет работать. (только предположение) В крайнем случае посмотри, чем реализация StrList отличается.


 
Vladimir Kladov   (2006-05-08 15:21) [10]

А точнее права на создание новых файлов. (И зачем вообще нужен NTFS? По мне FAT32 и быстрее и надежнее и универсальнее).


 
homm ©   (2006-05-08 15:29) [11]


> И зачем вообще нужен NTFS? По мне FAT32 и быстрее и надежнее
> и универсальнее

Не скажите. Винда со сжатого NTFS тома раза в 1,5 быстрее стартует. А про надежность я думаю Вы и так знаете.


 
Some   (2006-05-08 16:25) [12]

>А теперь поставь обратно 2.35, скомпилируй и все скорее всего будет работать

Нет, ошибка опять появляется.

>А точнее права на создание новых файлов.

У меня FAT 32, я под администратором всегда работаю.


 
MTsv DN ©   (2006-05-08 17:42) [13]

Привет...

И на 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 19:58) [14]

>Меня очень кофигурация Ваша 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.


 
GMax   (2006-05-08 21:29) [15]

возможно есть какая-то разница при работе с памятью в D3 и позже...

где именно ошибка ? по какому адресу-то? потрассировать внутрь процедуры пробовал ?

у меня на w2k d7 без проблем (правда ShowMsg("The Program Is Already Running... выглядит совсем не красиво, появляется недоделанное второе окно. надо бы его или доделать или не показывать вообще. да и с ресайзами бороться стилем, или на крайняк Min/Max|Width/Height, чтобы не мигало)


 
Some   (2006-05-09 00:52) [16]

>где именно ошибка ? по какому адресу-то? потрассировать внутрь процедуры пробовал ?

Пробовал, но дальше делфи останавливается не ясно где, и если нажать F9 то появляется окно с ошибкой.

>надо бы его или доделать или не показывать вообще. да и с ресайзами бороться стилем

Это я исправил:
http://mostly.nm.ru/INDICATOR_KOL_1.08.zip


 
homm ©   (2006-05-09 09:30) [17]


> Меня эта конфигурация вполне устраивает, даже тоталкоммандер
> был на 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;



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.057 c
2-1168257030
Marvin
2007-01-08 14:50
2007.01.28
работа с tmemo


1-1165088447
BOB16
2006-12-02 22:40
2007.01.28
Как убрать мое приложение с панели задач


2-1168349527
Литейщик
2007-01-09 16:32
2007.01.28
Открытие файла (Excel,Access,txt и т.п.) из проекта Delphi


3-1162530427
m_i_p
2006-11-03 08:07
2007.01.28
сквозная нумерация в DbGrid


15-1168246600
Chort
2007-01-08 11:56
2007.01.28
Вопрос