ограничение на количество картинок?

  • Автор темы ARTHES
  • Дата начала
A

ARTHES

Здравствуйте! Может кто подскажет, как решить такую проблему:
Пишу проект с развитым так сказать графическим оформлением, каждая кнопочка и т.д. прорисовывалась в фотошопе как отдельная картинка. Но проект не маленький, и картинок этих накопилось уже около 250-300, каждая весит от 20 Kb до 100 Kb, все вместе они где-то 8 Mb.
Так вот, при работе программы в определенный момент выкидывает ошибку открытия картинки:

...exception class EFOpenError with message 'Cannot open file images\buttons\us_edit_user.jpg'...

А картинка эта там все-таки есть. Причем после этого "события" ни одну картинку билдер уже не может открыть, даже те, которые только что открывал. Картинки загружаю так:

Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user.jpg");

Причем если закомментировать открытие картинок раньше в проекте, работа программы НЕ "продвигается" дальше, опять на том же шаге выдает такую же ошибку открытия картинки. Если же закомментировать открытие той картинки, на которой вылетает ошибка, то ошибка эта вылетает уже на следующей попытке открыть другую картинку.

Что было уже сделано:
- в Google ничего похожего не нашел;
- везде где использовал new использовал и delete;
- переместил из папки images\\... все бэкапы картинок и бэкапные *.psd-файлы в другое место, тем самым уменьшил вес папки в 15 раз, а количество в ней файлов в 3 раза;
- пересохранил 116 картинок с меньшим качеством, уменьшил тем самым вес еще 800 Kb;

НИЧЕГО из этого абсолютно никак не повлияло на работу программы, она вылетает в том же месте.

Может кто подскажет:
1. может ли быть такое, что в билдере есть какое-то ограничение на количество используемых в проекте картинок
2. может можно как-то ЧИСТИТЬ ПАМЯТЬ от картинок, которые были загружены на предыдущей форме, а на этой уже не используются
3. имеет ли смысл загружать картинки на каждую форму по мере открытия этой формы, а не на FormCreate , как это сделано у меня сейчас

Заранее благодарен.
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 12:42 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 12:42 )</span><!--QuoteEBegin-->2. может можно как-то ЧИСТИТЬ ПАМЯТЬ от картинок, которые были загружены на предыдущей форме, а на этой уже не используются
[snapback]55814" rel="nofollow" target="_blank[/snapback]​
[/quote]
В общем случае, после разрушения формы память будет очищена автоматически, если контролы были созданы в Design Time. Стоит только убедится, что форма действительно разрушается, а не скрывается, т.е. в Close формы должно стоять Action = caFree.
Ошибка явно из-за того, что доступ к файлу закрыт. К сожалению, хелпа под рукой нет, так что подробнее сказать ничего не могу.
<!--QuoteBegin-ARTHES+12:02:2007, 12:42 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 12:42 )</span><!--QuoteEBegin-->3. имеет ли смысл загружать картинки на каждую форму по мере открытия этой формы,
[snapback]55814" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это как? Я что-то не очень понял
 
A

ARTHES

Спасибо за идею, сейчас буду со всем этим разбираться, а пока везде где нашел поменял Hide() на Close(), но не помогло.

3. имеет ли смысл загружать картинки на каждую форму по мере открытия этой формы - имел ввиду оставлять на форме картинки пустые, на FormActivate загружать, на FormDeactivate делать картинку опять пустой, т.е. Image7->Picture->None
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 13:29 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 13:29 )</span><!--QuoteEBegin-->везде где нашел поменял Hide() на Close(), но не помогло.
[snapback]55830" rel="nofollow" target="_blank[/snapback]​
[/quote]
В FormClose стоит Action = caFree?
<!--QuoteBegin-ARTHES+12:02:2007, 13:29 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 13:29 )</span><!--QuoteEBegin-->оставлять на форме картинки пустые, на FormActivate загружать, на FormDeactivate делать картинку опять пустой, т.е. Image7->Picture->None
[snapback]55830" rel="nofollow" target="_blank[/snapback]​
[/quote]
ИМХО, не стоит, т.к. лишняя возня, не дающая какого-нибудь выйгрыша
 
A

ARTHES

На всех формах на onClose поставил Action = caFree, теперь на том же месте выдает ошибку:

...class EAccessViolation with message 'Access violation at address 0001001D. Write of adress 3A004300'...

ошибка вылетает или при загрузке формы, или при каком-либо действии на этой форме. Если на этой форме комментирую Action = caFree , получаю привычную ошибку открытия картинки. Может просто форму эту удалить и создать заново?
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 13:53 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 13:53 )</span><!--QuoteEBegin-->...class EAccessViolation with message 'Access violation at address 0001001D. Write of adress 3A004300'...
[snapback]55837" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если вылетает такое эксепшн, то дело явно не чисто. Без кода тут фиг что скажешь
 
A

ARTHES

даже и не знаю, поможет ли код, просто его так много... и вроде ничего особенного там нет...

Короче есть у меня в проге такая функция сохранения (удаления/редактирования) списка пользователей, который хранится в файле users.ini, и сохранения лога запуска программы и ее использования, который хранится в файле log +дата+время.log
При работе программы сразу загружается:
окно списка пользователей, на котором есть ListBox(в котором и есть список пользователей), кнопки типа "редактировать запись", "удалить запись", "новая запись" (выполнены в виде картинок). Кнопки эти пока не работают(еще не написал), но при загрузке формы кнопки "редактировать запись", "удалить запись" неактивны (одна картинка) пока не выберешь пользователя в ListBox-е,а как выберешь становятся активными(другая картинка):

Form Create:

[
void __fastcall TForm7::FormCreate(TObject *Sender)
{
GlobalWAS_modified = false;

usr_selected = false;
ListBox1->Clear();

FILE *stream;

stream = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream);
avail_usr_cnt = StrToInt(temp_str);
int k;

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream);

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n1_length = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n2_length = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n3_length = k;

fgets(usr_pssw_str, 6, stream);
usr_pssw = usr_pssw_str; //password of i. user
}

fclose(stream);

//--- one more time :unsure: ---//

FILE *stream2;

stream2 = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream2);

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream2);

fgets(usr_name_str, usr_n1_length, stream2);
usr_name1 = usr_name_str; //1. name of i. user
//ListBox1->Items->Add(usr_name1);

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n2_length, stream2);
usr_name2 = usr_name_str; //2. name of i. user

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n3_length, stream2);
usr_name3 = usr_name_str; //3. name of i. user

FULL_name = usr_name1 + " " + usr_name2 + " " + usr_name3;
ListBox1->Items->Add(FULL_name);

fgets(temp_str, 3, stream);

fgets(usr_pssw_str, 6, stream);
}
fclose(stream2);
Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user_unactive.jpg");
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user_unactive.jpg");
}
]

Form Activate:

[
void __fastcall TForm7::FormActivate(TObject *Sender)
{
if(GlobalWAS_modified == true)
{
usr_selected = false;

ListBox1->Clear();

FILE *stream;

stream = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream);
avail_usr_cnt = StrToInt(temp_str);
int k;

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream);

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n1_length = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n2_length = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str; //get the
k = just_str.Length(); // length of the string
usr_n3_length = k;

fgets(usr_pssw_str, 6, stream);
usr_pssw = usr_pssw_str; //password of i. user
}

fclose(stream);

//--- one more time :unsure: ---//

FILE *stream2;

stream2 = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream2);

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream2);

fgets(usr_name_str, usr_n1_length, stream2);
usr_name1 = usr_name_str; //1. name of i. user
//ListBox1->Items->Add(usr_name1);

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n2_length, stream2);
usr_name2 = usr_name_str; //2. name of i. user

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n3_length, stream2);
usr_name3 = usr_name_str; //3. name of i. user

FULL_name = usr_name1 + " " + usr_name2 + " " + usr_name3;
ListBox1->Items->Add(FULL_name);

fgets(temp_str, 3, stream);

fgets(usr_pssw_str, 6, stream);
}
fclose(stream2);

Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user_unactive.jpg");
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user_unactive.jpg");
}
]

ListBox1Click:

[
for(int i=0;i<ListBox1->Items->Count;i++)
{
if(ListBox1->Selected)
{
usr_selected = true;
Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user.jpg");
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user.jpg");
GlobalF_usr = usr_name1;
GlobalI_usr = usr_name2;
GlobalO_usr = usr_name3;
GlobalPSW_usr = usr_pssw;
}
}
]

FormClose:

[
void __fastcall TForm7::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
]

Еще на этой форме есть кнопки "доступ"(просмотр log-файлов) и "протоколы". Эти кнопки просто перекидывают на новые почти пустые окна окна, на которых пока(еще не написал) ничего кроме загрузки картинок не происходит.

Так вот ошибка вылетает когда я из любого окна "доступ" и "протоколы" перехожу на окно "пользователи" и выбираю в ListBox-е пользователя. Причем ошибка ОТКРЫТИЯ КАРТИНКИ вылетает, если во всех этих трех формах Action = caFree НЕТУ (в остальных во всех есть), а АКСЕСС ВИАЛЕЙШН когда ХОТЯ бы в ОДНОМ из этих трех файлов в FormClose Action = caFree ЕСТЬ, причем вылетает уже еще только на загрузке формы "пользователи".

Может проще все-таки переписать эту форму заново???
 
A

ARTHES

ИЗВИНЯЮСЬ, сейчас код перепишу нормально(а то ж не читается):

Короче есть у меня в проге такая функция сохранения (удаления/редактирования) списка пользователей, который хранится в файле users.ini, и сохранения лога запуска программы и ее использования, который хранится в файле log +дата+время.log
При работе программы сразу загружается:
окно списка пользователей, на котором есть ListBox(в котором и есть список пользователей), кнопки типа "редактировать запись", "удалить запись", "новая запись" (выполнены в виде картинок). Кнопки эти пока не работают(еще не написал), но при загрузке формы кнопки "редактировать запись", "удалить запись" неактивны (одна картинка) пока не выберешь пользователя в ListBox-е,а как выберешь становятся активными(другая картинка):
Код:
void __fastcall TForm7::FormCreate(TObject *Sender)
{
GlobalWAS_modified = false;

usr_selected = false;
ListBox1->Clear();

FILE *stream;

stream = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream);
avail_usr_cnt = StrToInt(temp_str);
int k;

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream);

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n1_length[i] = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n2_length[i] = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n3_length[i] = k;

fgets(usr_pssw_str, 6, stream);
usr_pssw[i] = usr_pssw_str;		//password of i. user
}

fclose(stream);

//--- one more time :) ---//

FILE *stream2;

stream2 = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream2);

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream2);

fgets(usr_name_str, usr_n1_length[i], stream2);
usr_name1[i] = usr_name_str;	  //1. name of i. user
//ListBox1->Items->Add(usr_name1[i]);

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n2_length[i], stream2);
usr_name2[i] = usr_name_str;	  //2. name of i. user

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n3_length[i], stream2);
usr_name3[i] = usr_name_str;	  //3. name of i. user

FULL_name[i] = usr_name1[i] + " " + usr_name2[i] + " " + usr_name3[i];
ListBox1->Items->Add(FULL_name[i]);

fgets(temp_str, 3, stream);

fgets(usr_pssw_str, 6, stream);
}
fclose(stream2);
Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user_unactive.jpg");
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user_unactive.jpg");
}

Код:
void __fastcall TForm7::FormActivate(TObject *Sender)
{
if(GlobalWAS_modified == true)
{
usr_selected = false;

ListBox1->Clear();

FILE *stream;

stream = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream);
avail_usr_cnt = StrToInt(temp_str);
int k;

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream);

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n1_length[i] = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n2_length[i] = k;

fgets(usr_name_str, 25, stream);
just_str = usr_name_str;		  //get the
k = just_str.Length();			//  length of the string
usr_n3_length[i] = k;

fgets(usr_pssw_str, 6, stream);
usr_pssw[i] = usr_pssw_str;		//password of i. user
}

fclose(stream);

//--- one more time :) ---//

FILE *stream2;

stream2 = fopen("D:\\RESEARCH\\users\\users.ini", "r");

fgets(temp_str, 3, stream2);

for(int i=0;i<avail_usr_cnt;i++)
{
fgets(temp_str, 3, stream2);

fgets(usr_name_str, usr_n1_length[i], stream2);
usr_name1[i] = usr_name_str;	  //1. name of i. user
//ListBox1->Items->Add(usr_name1[i]);

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n2_length[i], stream2);
usr_name2[i] = usr_name_str;	  //2. name of i. user

fgets(temp_str, 3, stream);

fgets(usr_name_str, usr_n3_length[i], stream2);
usr_name3[i] = usr_name_str;	  //3. name of i. user

FULL_name[i] = usr_name1[i] + " " + usr_name2[i] + " " + usr_name3[i];
ListBox1->Items->Add(FULL_name[i]);

fgets(temp_str, 3, stream);

fgets(usr_pssw_str, 6, stream);
}
fclose(stream2);

Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user_unactive.jpg");
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user_unactive.jpg");
}
}

Выбор пользователя:

Код:
void __fastcall TForm7::ListBox1Click(TObject *Sender)
{
for(int i=0;i<ListBox1->Items->Count;i++)
{
if(ListBox1->Selected[i])
{
usr_selected = true;
Image7->Picture->LoadFromFile("images\\buttons\\us_edit_user.jpg"); //вот здесь и вылетает
Image8->Picture->LoadFromFile("images\\buttons\\us_delete_user.jpg");
GlobalF_usr = usr_name1[i];
GlobalI_usr = usr_name2[i];
GlobalO_usr = usr_name3[i];
GlobalPSW_usr = usr_pssw[i];
}
}
}

Код:
void __fastcall TForm7::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

Еще на этой форме есть кнопки "доступ"(просмотр log-файлов) и "протоколы". Эти кнопки просто перекидывают на новые почти пустые окна окна, на которых пока(еще не написал) ничего кроме загрузки картинок не происходит.

Так вот ошибка вылетает когда я из любого окна "доступ" и "протоколы" перехожу на окно "пользователи" и выбираю в ListBox-е пользователя. Причем ошибка ОТКРЫТИЯ КАРТИНКИ вылетает, если во всех этих трех формах Action = caFree НЕТУ (в остальных во всех есть), а АКСЕСС ВИАЛЕЙШН когда в форме "пользователи" в FormClose Action = caFree ЕСТЬ, причем вылетает уже еще только на загрузке формы "пользователи". Если же Action = caFree будет в одной из форм "доступ" или "протоколы", то получаю Abstract Error!!!
 
E

European

1. Зачем одинаковые действия на FormCreate и FormActivate?
2. Уверен, что к моменту вызова TForm7::ListBox1Click относительный путь не был изменен? Может лучше использовать абсолютный?
 
A

ARTHES

переписал форму заново, не помогло. Код новой формы:

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit72.h"

#include "Unit73.h"
#include "Unit74.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm72 *Form72;
//---------------------------------------------------------------------------
__fastcall TForm72::TForm72(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm72::FormCreate(TObject *Sender)
{
//
}
//---------------------------------------------------------------------------
void __fastcall TForm72::FormActivate(TObject *Sender)
{
Image4->Picture->LoadFromFile("images\\buttons\\us_edit_user_unactive.jpg"); //вот здесь вылетает ошибка
Image5->Picture->LoadFromFile("images\\buttons\\us_delete_user_unactive.jpg");
}
//---------------------------------------------------------------------------
void __fastcall TForm72::ListBox1Click(TObject *Sender)
{
Image4->Picture->LoadFromFile("images\\buttons\\us_edit_user.jpg");
Image5->Picture->LoadFromFile("images\\buttons\\us_delete_user.jpg");
}
//---------------------------------------------------------------------------
void __fastcall TForm72::Image8Click(TObject *Sender)
{
Form72->Close();
Form73->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm72::Image9Click(TObject *Sender)
{
Form72->Close();
Form74->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm72::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
//---------------------------------------------------------------------------
Вылетает Access Violation, если убрать Action = caFree, то вылетает ошибка открытия картинки


И еще: что это значит:
если контролы были созданы в Design Time
 
E

European

Это значит, что ты помещал компоненты на форму в процессе разработке формы, а не создавал их динамически. Судя по твоему коду, ты их и создаешь в Design Time. Кстати, на счет монопольного доступа к файлу со стороны TImage - это я ступил. Так что с путями?
 
A

ARTHES

1. Зачем одинаковые действия на FormCreate и FormActivate?

чтобы не перегружать заново базу пользователей при каждой активации формы, а перегружать только в случае ее изменения (GlobalWAS_modified == true)


МЫСЛЬ: я заметил, что Access Violation вылетает при каждой повторной попытке Form72->Show() из ЛЮБОЙ формы после того, как было сделано Form72->Close() при Action = caFree в TForm72::FormClose

- может нужно потом уже не Show(), а что-то типа Open()???или Create()???
- может я что-то не подключил?
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 15:54 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 15:54 )</span><!--QuoteEBegin-->я заметил, что Access Violation вылетает при каждой повторной попытке Form72->Show() из ЛЮБОЙ формы после того, как было сделано Form72->Close() при Action = caFree в TForm72::FormClose
[snapback]55862" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну так и должно быть, т.к. Action = caFree заставляет форму разрушаться. Теперь надо ее не просто показать, а еще предварительно создать
 
A

ARTHES

... Так что с путями?

вот насчет этого ты как раз и БЫЛ ПРАВ !!!

Что-то меняет путь. Как только прописал путь абсолютный, ВСЕ ЗАРАБОТАЛО !!!!! :D

я закомментил все Action = caFree, перестал вылетать Access Violation, прописал абсолютные пути - и все заработало. Кстати относительный путь мог поменяться при открытии базы пользователей или добавлении списка log-файлов в ListBox на форме "доступ" - и база пользователей, и log-файлы лежат у меня в других директориях !!! Это ВСЕ ОБЬЯСНЯЕТ!!! аж сам довольный, что нашли в чем дело :D !!

С П А С И Б О О Г Р О М Н О Е



Теперь надо ее не просто показать, а еще предварительно создать

а как ее предварительно создать?
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 16:18 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 16:18 )</span><!--QuoteEBegin-->а как ее предварительно создать?
[snapback]55864" rel="nofollow" target="_blank[/snapback]​
[/quote]
Что-то типа:
Код:
TForm* pForm= new TForm( this);
pForm->ShowModal();

Если приоритетом является экономия памяти, то формы лучше разрушать (Action = caFree).
 
A

ARTHES

ВСЕ ПОНЯЛ!

ну вообще у меня здесь экономия памяти приоритетом не является (ну это пока :D ), но все равно спасибо. В будущем, я думаю пригодится!!!
 
B

Barmutik

Что-то мне кажется что проблема с путями .. а Вы не пробовали абсолютные пути указать а не относительные ?

А что будет если Вашу программу по линку запустят ? И текущая папка будет абы куда указывать?
 
A

ARTHES

ПРОБЛЕМА УЖЕ РЕШЕНА

все дело было в путях: нужно абсолютные пути указывать, а не относительные.

ВСЕМ СПАСИБО !!!
 
E

European

<!--QuoteBegin-ARTHES+12:02:2007, 17:10 -->
<span class="vbquote">(ARTHES @ 12:02:2007, 17:10 )</span><!--QuoteEBegin-->ПРОБЛЕМА УЖЕ РЕШЕНА
[snapback]55890" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это до тех пока, пока софтину в другую папку не установят :D. Ну ничего, постоянное изобретение велосипедов - характерная черта большинства программистов
 
A

ARTHES

не, там задача другая: изготавливается целый аппарат с сенсорным экраном, управляемый программоой, которую я собственно и пишу. Те, кто будут использовать аппарат ничего переустанавливать не будут, да и доступа то у них не будет, а вообще они и знать не будут, где там че установлено. Можно конечно записать в файл текущую директорию и считывать при каждой загрузке программы, но честно говоря нету времени всем этим заниматься - сроки и поджимают.
Короче всем спасибо за помощь.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!