Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при попытке создать файл с помощью 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 вся ветка

Форум: "KOL";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
8-1149494028
hgd
2006-06-05 11:53
2007.01.28
Подскажите компонент


5-1147638855
Лев
2006-05-15 00:34
2007.01.28
Нужна компонента типа TMemo но с возможностью простейшего формата


15-1168069576
gggg
2007-01-06 10:46
2007.01.28
AutoCAD да да и ще раз AutoCAD..


2-1168287682
Dim..ON
2007-01-08 23:21
2007.01.28
закрытие чужого приложения


5-1147125189
Константинов
2006-05-09 01:53
2007.01.28
Свойства - события





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский