imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 20.04.2008, 19:16     # 1
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
Заполнение массива в С++ Builder из файла "txt"

Существует текстовый файл "file.txt" следующего вида:
Цитата:
Номер;Описание_характеристики;Данные1;Данные2;Данные3;Данные4;Всего
1;Характеристика1;1;0;0;1;2
2;Характеристика2;0;8;2;1;11
3;Характеристика3;1;1;0;0;2
;ВСЕГО;2;9;2;2;15
;В %%;13;60;13;13;100
Необходимо заполнить двумерный массив числовыми данными из файла. Т.е. проигнорировать полностью первую строку в файле, значения "номер по порядку" и "Имя характеристики". В конечном результате нужно получить заполненный массив следующего вида:
Цитата:
1 0 0 1 2
0 8 2 1 11
1 1 0 0 2
2 9 2 2 15
13 60 13 13 100
Помогите, пожалуйста, это выполнить на языке C++ Builder. Заранее благодарен за помощь.
Emelman вне форума  
Старый 21.04.2008, 13:12     # 2
spike
Member
 
Аватар для spike
 
Регистрация: 02.09.2003
Сообщения: 215

spike Молодецspike Молодецspike Молодец
Lightbulb

не сильно заботясь об быстроте:
Код:
// создаем список
TStringList *slFile;
slFile = new TStringList;

slFile->LoadFromFile(GetCurrentDir()+"\\file.txt"); // заполняем список из файла

// обработка
for(int iC = 0; iC < slFile->Count; iC++)
{
AnsiString strTMP = slFile->Strings[iC];
strTMP.Delete(1,strTMP.Pos(";")); // стирается 1ый столбец
strTMP.Delete(1,strTMP.Pos(";")); // стирается 2ой столбец

strTMP.SubString(1,strTMP.Pos(";") - 1); // значение 3го столбца
strTMP.Delete(1,strTMP.Pos(";") + 1); // стирается 3й столбец

/* остальные столбцы по аналогии */

strTMP; // последний столбец
}

delete slFile; // удаляем список
__________________
не могу просто так сидеть, когда другие работают. пойду полежу.

Последний раз редактировалось spike; 21.04.2008 в 13:20.
spike вне форума  
Старый 23.04.2008, 21:06     # 3
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
spike, прости меня дурака, но я не всё понял. Разъясни, пожалуйста...
Я понял, что при открытии файла мы заполняем список. Затем пробегаем по каждой строке списка и удаляем содержимое до знака ";". Тем самым удаляем содержимое первых 2 столбцов. А вот что значит строчка
Цитата:
strTMP.SubString(1,strTMP.Pos(";") - 1); // значение 3го столбца
Что за команда "SubString"? И что значит "-1" в конце команды? Потом тоже не совсем понятно что обозначает первая единица в скобках? Один символ/одно слово или вообще что-то другое?
Потом мы зачем-то стираем и третий столбец.
Цитата:
strTMP.Delete(1,strTMP.Pos(";") + 1); // стирается 3й столбец
И здесь снова присутствует не понятное мне "+1"...
Строка
Цитата:
strTMP; // последний столбец
мне тоже не понятна. Мы считали оставшийся столбец, но ничего с ним не делаем... И нигде не вижу упоминания о массиве. Или я просто туплю?

Когда-то я неплохо программил на Pascal'е и Borland C++, но с тех пор прошло ОЧЕНЬ много времени и я без практики всё позабыл. И сейчас глядя на этот код чувствую себя первокласником... Может я конечно совсем обнаглел так наседая, но мне очень нужно в этом разобраться, поэтому очень прошу твоей помощи!!!
Emelman вне форума  
Старый 23.04.2008, 23:59     # 4
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 515

Borland - Гад и сволочь
Ну, если уж делать "как положено", то есть с привлечением средств ООП, то нужно создать класс, описывающий формат файла и умеющий считывать его в память (опционально - записывать содержимое памяти обратно в файл того же формата) с функцией-членом, обеспечивающей чтение произвольного элемента.
И при заполнении целевого массива использовать эту функцию со сдвигом на 2 столбца (т.е. 1-й элемент строки целевого массива считывается считывается из 3-го элемента соответствующей "строки" класса).
А всю "прозу жизни" (разбор строк файла) упрятывать в этот класс.
Если количество строк сильно переменное (скажем, от 10 до 10000) имеет смысл целевой двумерный массив заменить на связанный список указателей на элементы-"строки" (чтобы не выделять априорно лишнюю память и в то же время не оказаться в ситуации, когда выделенная память недостаточна для считывания файла).
В общем, очень многое зависит от того, что в дальнейшем планируется делать с целевым массивом...
Цитата:
Сообщение от Emelman Посмотреть сообщение
что значит "-1" в конце команды
Означает, что ";" в подстроку не попадает (крайним правым символом подстроки-результата этой команды становится символ слева от ";").
На самом деле, данная функция должна стоять в правой части оператора присваивания...
Цитата:
Сообщение от Emelman Посмотреть сообщение
Что за команда "SubString"?
Функция выделения подстроки, что вполне очевидно...

Цитата:
Сообщение от Emelman Посмотреть сообщение
Потом мы зачем-то стираем и третий столбец.
Чтобы следующая strTMP.SubString(1,strTMP.Pos(";") - 1); вернула значение четвёртого столбца...
Цитата:
Сообщение от Emelman Посмотреть сообщение
не понятное мне "+1"
Вот здесь мне тоже не совсем понятно, а лезть в мануал за описанием команды лень... Если данная команда - правильная, то почему "+1" нету в команде удаления первых двух столбцов?
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 24.04.2008, 09:20     # 5
spike
Member
 
Аватар для spike
 
Регистрация: 02.09.2003
Сообщения: 215

spike Молодецspike Молодецspike Молодец
Borland, "+1" это я ошибся, не надо
__________________
не могу просто так сидеть, когда другие работают. пойду полежу.
spike вне форума  
Старый 27.04.2008, 02:04     # 6
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
Borland, прошу прощения за свою назойливость, но не мог бы ты привести хотя бы примерный код? Я в классах вообще не разбираюсь. Только вчера удалось найти книгу, в которой рассказывается про классы и наследования.
Цитата:
Сообщение от Borland Посмотреть сообщение
Если количество строк сильно переменное (скажем, от 10 до 10000) имеет смысл целевой двумерный массив заменить на связанный список указателей на элементы-"строки" (чтобы не выделять априорно лишнюю память и в то же время не оказаться в ситуации, когда выделенная память недостаточна для считывания файла).
Массив будет постоянного размера - 5 столбцов и 37 строк. Соответственно текстовый файл сотоит из 38 строк (первая строка вообще не нужна, там пояснения).
Цитата:
Сообщение от Borland Посмотреть сообщение
В общем, очень многое зависит от того, что в дальнейшем планируется делать с целевым массивом...
С массивом ничего делаться не будет. В данном случае массив необходим исключительно как хранилище числовых данных, на основе которых потом будет строиться своеобразная диаграмма.
Emelman вне форума  
Старый 03.06.2008, 23:06     # 7
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
В конечном итоге с классами не разобрался. Массив заполнил использовав совет spike'а. Только немного изменил код, подогнав под свои нужды.
Сейчас возникла другая трудность. В программе участвуют 10 массивов одинакового размера, со всеми ними будут производиться одни и те же действия, поэтому пришёл к выводу, что нужно написать функцию, как в старом добром "Borland C++" (не Builder), и вызывать её для каждого массива. Для примера:
Код:
void vvodmass (int mass[5][5]) //объявляем функцию
{int i,j;
for (i=0; i<5; i++)
for (j-0; j<5; j++)
cin>>mass[i][j];}

void main()
{int a[5][5], b[5][5];
vvodmass (a); //вызываем функцию для массива "a"
vvodmass (b); //вызываем функцию для массива "b"
}
Так вот решил написать нечто подобное, но не пойму как правильно объявлять функцию. Написал примерно, как в примере:
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void diagramma(int mass[37][5])
{int i,j,otstup;

otstup=10;
for (i=0; i<35; i++)
{
Image1->(!Здесь выскакивает ошибка!)Canvas->Brush->Color=(TColor)RGB(0,255,0);
Image1->Canvas->Rectangle . . .
//дальше идёт процесс рисования на элементе Image1 столбиков диаграммы.
//Чтобы не грузить вас формулами, стёр всё ненужное.
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{int mass1[37][5],mass2[37][5],mass3[37][5],mass4[37][5],mass5[37][5];
int mass6[37][5],mass7[37][5],mass8[37][5],mass9[37][5],mass10[37][5];

diagramma (mass1);
}
Не знаю правильно ли я описал функцию и будет ли она работать, но при таком написании функции выскакивает лишь одна ошибка:
Цитата:
[C++ Error] Unit1.cpp(29): E2451 Undefined symbol 'Image1'
Подскажите, пожалуйста, где я, что не так написал. Почему программа перестала понимать что такое "Image1"?

P.S. Если забыть про остальные массивы, и прописать процесс рисования не как функцию, то диаграмма рисуется просто замечательно.
Emelman вне форума  
Старый 04.06.2008, 00:08     # 8
PhoeniX
Advanced Member
 
Аватар для PhoeniX
 
Регистрация: 12.05.2004
Пол: Male
Сообщения: 482

PhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собой
у тебя функция diagramma не является методом класса TForm1 и соответственно не может юзать внутренние объекты , коим является Image1
нужно либо функцию определить методом класса:
в Unit1.h там где "public: //User decloration" прописать прототип функции, а при описании функции указать void TForm1::diagramma(...),
либо передавать в функцию указатель на объект на ряду с остальными параметрами
__________________
Этот мир для таких, как мы,
Этот мир обречен на нас,
Но реальность не изменить,
И живем мы в ней здесь и сейчас.
(C) С.Маврин

Последний раз редактировалось PhoeniX; 04.06.2008 в 00:14.
PhoeniX вне форума  
Старый 04.06.2008, 00:16     # 9
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
С классами я уже пробовал разбираться, поэтому отбрасываем этот вариант. А что значит передавать в функцию указатель на объект? Везде прописывать "Form1->Image1->..."? Можно хотябы маленький пример для наглядности?
Emelman вне форума  
Старый 04.06.2008, 00:40     # 10
PhoeniX
Advanced Member
 
Аватар для PhoeniX
 
Регистрация: 12.05.2004
Пол: Male
Сообщения: 482

PhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собойPhoeniX Имеются все основания чтобы гордиться собой
да, так как ты написал тоже сработает в данном конкретном примере, но это имхо не хорошо, делать свои функции зависимыми от глобальных переменных

я говорил о том, что в функцию передавать указательна объект, то есть прототип функции будет выглядеть так:
void diagramma(int mass[37][5], TImage *Image1)
а вызывать ее соответственно вот так:
diagramma (mass1, Image1);
опять же в твоем конкретном случае, потому что функция diagramma вызывается из метода класса TForm1, где Image1 определен

да и с классом все просто:
в нижней панели окна кода находим закладки, среди них unit1.h, переходим туда и в public, там где определяется пользователем пишем
void diagramma(int mass[37][5]);
а в основном коде (cpp - файл) определяем прототип как
void TForm1::diagramma(int mass[37][5])

метод выбирай на свой вкус, судить о правильности и корректности я не буду (ну не считая первого случая, но там мое имхо)
__________________
Этот мир для таких, как мы,
Этот мир обречен на нас,
Но реальность не изменить,
И живем мы в ней здесь и сейчас.
(C) С.Маврин
PhoeniX вне форума  
Старый 04.06.2008, 21:17     # 11
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
Очередная проблема: Создаю "Form2" и заполняю на ней два поля "Edit". После закрытия этой формы нужно вернуть значения этих полей. Но командра "return" не желает работать. Выдаётся ошибка:
Цитата:
[C++ Error] Unit2.cpp(24): Е2467 '__fastcall TForm2::Button1Click(TObject *)' cannot return a value
Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{AnsiString author, nazvanie;

author=Edit1->Text;
nazvanie=Edit2->Text;
Form2->Close();
return author,nazvanie;
}
Подскажите, пожалуйста, что я снова делаю не так, или каким ещё образом можно вернуть данные два значения.
Emelman вне форума  
Старый 04.06.2008, 23:23     # 12
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 515

Borland - Гад и сволочь
Это ж самые основы программирования!!!
return ВСЕГДА возвращает ОДНО значение.
К тому же, насколько я понимаю описание твоей функции, она вообще не может возвращать значений ибо void (что вполне логично для обработчика клика).

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

Или возвращаемым значением функции делать экземпляр класса, содержащий необходимые значения внутри с соответствующей модификацией самой функции (хотя в качестве обработчика клика этот подход не годится).
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 05.06.2008, 02:07     # 13
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
Цитата:
Сообщение от Borland Посмотреть сообщение
К тому же, насколько я понимаю описание твоей функции, она вообще не может возвращать значений ибо void (что вполне логично для обработчика клика).
Я уже побегал немного по просторам глобальной сети и выяснил, что void ничего не возвращает. Сейчас задумался над "глобальными переменными". Но их почему-то все хаят. А мне похоже без них не обойтись.
К тому же, я прописал функцию рисования диаграммы, как сказал PhoeniX (мне нужна была функция, потому что придётся постоянно рисовать диаграмму, но с разным масштабом/с разных массивов), но вызвать её могу только при нажатии на "Button1", потому что я объявил массивы именно при нажании на эту кнопку.
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{int mass1[37][5],mass2[37][5],mass3[37][5],mass4[37][5],mass5[37][5];
int mass6[37][5],mass7[37][5],mass8[37][5],mass9[37][5],mass10[37][5];
При нажатии на другие кнопки или выборы в ComboBox (один из 10 массивов) естественно выскакивает ошибка:
Цитата:
[C++ Error] Unit1.cpp(201): E2451 Undefined symbol 'mass1'
Можно ли как-то объявить эти массивы глобально, чтобы их было видно при нажатии на любую кнопку?

P.S. Извините, что задаю так много вопросов и часто - очень глупых, но мне очень нужна ваша помощь. Заранее ПРЕМНОГО благодарен за все ответы и советы. Практически все предыдущие советы мне очень помогли.
Emelman вне форума  
Старый 05.06.2008, 08:49     # 14
doro
Full Member
 
Аватар для doro
 
Регистрация: 30.04.2002
Сообщения: 1 419

doro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собойdoro Имеются все основания чтобы гордиться собой
А не проще воспользоваться isdigit()?
doro вне форума  
Старый 06.06.2008, 01:39     # 15
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
В общем выяснил как объявлять переменные глобально и объявил соответствующим способом все 10 массивов и нужные для работы переменные. Программа отлично заработала. Теперь мне интересен другой вопрос: У меня в программе есть поток событий:
Код:
{import (mass1);
Form2->Show();
ComboBox11->Items->Delete(0);
ComboBox11->Items->Insert(0,"Имя диаграммы");
masshtab=(max*100/mass1[35][4]);
diagramma (mass1, masshtab, Image1, 310, 300);}
Подскажите, пожалуйста, что нужно прописать, чтобы после открытия "Form2" ничего не выполнялось до тех пор, пока она не будет закрыта?
Emelman вне форума  
Старый 06.06.2008, 22:46     # 16
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Emelman, Form2->ShowModal();
ЕЖ вне форума  
Старый 08.06.2008, 17:23     # 17
Emelman
Full Member
 
Аватар для Emelman
 
Регистрация: 30.07.2004
Адрес: Санкт-Петербург
Пол: Male
Сообщения: 544

Emelman Гурее всех гурых :-)
Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)Emelman Гурее всех гурых :-)
ЕЖ, то, что надо!

Возникла очередная интересная проблемка: Существует каталог, где расположен exe'шник программы и внутри него папка Base, в которой хранятся текстовые файлы с вышеописанными данными. В программе присутствует 2 кнопки: одна - импорт файла папки "Base", а другая вызывает OpenDialog. Если сначала импортировать файлы из папки "Base" (путь прописан "Base/<имя текстового файла>"), то всё работает "на Ура". Но стоит нажать другую кнопку и указать текстовый файл из левого каталога, то видимо рабочий каталог меняется на последний используемый, и из базы данных уже ничего не получить (<левый каталог>/Base/<имя текстового файла> - не найдено).
В идеале было бы не плохо сначала определить путь текущего каталога (где находится exe'шник) и запонимть его (пускай даже в переменной типа String). А перед нажатием на кнопку импортирования файла из папки "Base" изменить путь рабочего каталога на изначальный. Но я нигде не могу найти существуют-ли команды определения и смены рабочего каталога. Помогите, пожалуйста!
Emelman вне форума  
Старый 10.06.2008, 01:08     # 18
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Смотри свойства/функции Application->ExeName / ExtractFilePath() / GetCurrentDir()

При импорте просто используй абсолютный путь, что то типа ExtractFilePath(Application->ExeName) + твои файлы из Base
ЕЖ вне форума  
Старый 11.06.2008, 19:59     # 19
WISE
Newbie
 
Регистрация: 11.06.2008
Сообщения: 25

WISE Нимб уже пробиваетсяWISE Нимб уже пробивается
Path:=Application.ExeName; // полный путь и название запущенной программы
Path:=ExtractFileDir(Path); // отбрасываем название программы. Остается путь.
if Path[Length(Path)]<>'\' then Path:=Path+'\'; // если последний символ не \ то добавить его
{Последняя строка нужна для присвоения последнего символа '\',
потому что при обрезке файла 'C:\PROG.EXE' получим 'C:\',
а при обрезке 'C:\WINDOWS\PROG.EXE' получим 'C:\WINDOWS'}
WISE вне форума  
Старый 13.06.2008, 01:25     # 20
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
WISE, зачем? Есть ExtractFileDir, а есть ExtractFilePath - разница как раз в том, что ExtractFileDir не оставляет последнего символа '\', а ExtractFilePath оставляет.
ЕЖ вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 05:43.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.