Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44

TOpenDialog и запись в файл

09.11.2009, 17:47. Показов 4531. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток
столкнулся вот с такой проблемой - на форме есть много едитов, радио и чеков и один TOpenDialog. Их значения дописываются в файл. Путь к файлу хранится в переменной path, берущей значение из поля предыдущей формы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void saver()
{
    FILE *f;
    AnsiString path = StartForm->pathfile->Text;
    ShowMessage(path);           //путь ВЕРНЫЙ
    f=fopen(path.c_str(),"a");
    if( FileExists(path) )             //вот тут начинаются чудеса
        ShowMessage("OK");
    else
                ShowMessage("NO!");
    if(f== NULL) {
        ShowMessage("cannot open!");
        f=fopen(path.c_str(),"a");
        return;
    }
       ...
Если не выбирать значение TOpenDialog, то все работает отлично. НО если выбрать значение TOpenDialog, то при имеющимся ВЕРНОМ пути - говорит что файл не существует и соответственно не возможно открыть на дозапись.
Как это? и как это может быть связано?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2009, 17:47
Ответы с готовыми решениями:

TOpenDialog
Такой вопрос. Для программы нужна чтобы я указал директорию файла так: D:\\NewFolder\\1.doc как это сделать?? Может есть какой нибудь...

TOpenDialog
После данной компоненты приложение занимает на 4 МБ больше оперативной памяти. Подскажите пожалуйста...чем это может быть вызвано..и как...

TOpenDialog и TSaveDialog
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О., адрес, оценки. Определить количество абитуриентов,...

22
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
09.11.2009, 18:29
а как например выглядит этот "верный путь"? ..
так: D:\Temp\Folder\1.txt
или так: D:\\Temp\\Folder\\1.txt ?
(условно) для билдера верным является второй вариант.. при первом он может выдать ошибку.
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
09.11.2009, 19:44  [ТС]
заносил естественно с \\
суть не в этом. Если не использовать TOpenDialog (в смысле не вызывать его), то файл отлично открывается и записывается. При использовании TOpenDialog ругается что его нет - хотя он реально есть (даже если пару раз без него заносить норм - как только его используешь - ругань)
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
09.11.2009, 20:34
честно сказать никогда не было проблем с OpenDialog...не знаю чем вам помочь на основании того что имеется... у вас в приведенном кодеOpenDialog вообще нигде не светится, я так понимаю вы присваиваете

C++
1
path=OpenDialog1->FileName
???

вот код (*cpp файл):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString path;
FILE *f;
if( OpenDialog1->Execute() )
 
                {
                path=OpenDialog1->FileName;
                f=fopen(path.c_str(),"a");
                        ShowMessage(path);           //ïóòü ÂÅÐÍÛÉ
                if( FileExists(path) )             //âîò òóò íà÷èíàþòñÿ ÷óäåñà
                {
                ShowMessage("OK");
                }
                else
                {
                ShowMessage("NO!");
                }
                if(f== NULL)
                {
                ShowMessage("cannot open!");
                f=fopen(path.c_str(),"a");
                return;
                }
}
//AnsiString path = StartForm->pathfile->Text;
}
//---------------------------------------------------------------------------
форма, на ней кнопка (Button1) - жмыхаем - открывается OpenDialog - выбираем файл - мессага: путь, мессага: ок... все робит...
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
09.11.2009, 21:56  [ТС]
у меня тоже не было проблем) правда на билдере не программировал несколько лет
чуть позже выложу проект (он небольшой)
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
09.11.2009, 22:10  [ТС]
вот проектик. краткое описание:
при заполнении первой формы - создастся папка tests с подпапкой "название теста", название которого вводится в поле. а в этой папке файл test.txt
сам путь вводится в tedit pathfile, из которой он берется в след.формах

далее вторая форма AskForm, где собственно и происходят чудеса: заполняются поля и по необходимости выбирается файл (тот самый TOpenDialog). Дозапись значений в файл производится по нажатии "Добавить вопрос". при нажатии на "завершить" - также осуществляется дозапись и вызывается закл.форма (но это не суть).

проблема собственно с дозаписью во второй форме

да, если это имеет значение - Builder 2009
Вложения
Тип файла: rar testmaker.rar (60.5 Кб, 31 просмотров)
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 12:54
Увы у меня нет 2009 builder'a

Не по теме:

(хех гдеб намутить=) стоит того?)))


.. но так просмотрел код... блин кое че непонятно (если не проглядел где-либо): Вот в форме Ask.cpp OpenDialog встречается тока в одном месте (как вроде и во всем проекте):

C++
1
2
3
4
5
6
7
8
9
void __fastcall TAskForm::BrowClick(TObject *Sender)
{
    AnsiString tmp;
    if(OpenFileq->Execute())
    {
        //FileWay->Text=OpenFile->FileName;
        tmp=OpenFileq->FileName;
    }
}
и вот че смущает... в void saver() вы загружаете path из pathfile:

C++
1
    AnsiString path = StartForm->pathfile->Text;
а вот в BrowClick tmp никуда не пишется... мб в этом проблема? причем даже переменная эта не глобальная... так подумал бы что просмотрел))

з.ы.: проверить не могу т.к. билдера 2009го нету, а на 6 переводить пока нету времени (мб попозже займусь)
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
10.11.2009, 14:05  [ТС]
да. именно tmp никуда не пишется. даже если просто выполнить OpenFileq->Execute() без присваиваний - тоже не будет работать))
по поводу
и вот че смущает... в void saver() вы загружаете path из pathfile
на билдере не программировал очень давно - это мне показалось наиболее простым способом передать значение из другой формы) да и работает это ведь если TOpenDlg не задействовать...

ЗЫ
Не по теме:
(хех гдеб намутить=) стоит того?)))
хотел просто сначала 6ку под висту поставить - ругани было. нашел хороший вариант 2009... но его все равно уже поставил на хр) если надо - ссылочкой поделюсь
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.11.2009, 14:14
xmisserx, проблема в вашем коде такова, а что будет если окно не вызовут? лучше и вправду вызывать диалог перед сохранением... ну и конечно же придется трассировать, что же у вас попадает в параметры функции, так что-то определенное сказать сложно...
0
225 / 54 / 0
Регистрация: 29.09.2008
Сообщений: 52
10.11.2009, 14:28
у меня проблема, после открытия файла
Code
1
2
3
4
5
6
OpenDialog1->InitialDir=ExtractFilePath(Application->ExeName);
if (OpenDialog1->Execute())
{
        Memo_Temp->Clear();
        Memo_Temp->Lines->LoadFromFile(OpenDialog1->FileName);
}
путь остается тот где был открытый файл
а после у меня идет чтения и сохранения данных в файле который лежит в каталоге где находится экзешник
Code
1
2
3
Memo1->Lines->LoadFromFile("Log.dat");
Memo1->Lines->Add("запись даних");
Memo1->Lines->SaveToFile("Log.dat")
но оно мне выбивает ошибку что такого файла нету (потому что оно уже обращается по путю не там где лежит екзешник а где бил предидущий файл)
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 14:41
OMG...
даже если просто выполнить OpenFileq->Execute() без присваиваний - тоже не будет работать))
то есть OpenDialog вообще не работает?! 0о дык не проще тогда другой билдер поставить... хотя наверно я не так понял...

Не по теме:

ох)) не мой стиль программирования... попытался скомпилировать ваш проект у себя)))... тяжеловато в чужом коде разбираться)))))



странно у меня tmp=OpenFileq->FileName нормально работает ниже прикладываю скрин бейкпоинта тому в подтверждение... блин.. ИМО вам надо или сделать tmp глобальной и там как нибудь это использовать в saver'е или сохранить значение tmp в файл (например во временный) и загружать оттуда...

з.ы.:

Не по теме:

если надо - ссылочкой поделюсь
в личку плс))))


скрин:
Миниатюры
TOpenDialog и запись в файл  
0
225 / 54 / 0
Регистрация: 29.09.2008
Сообщений: 52
10.11.2009, 15:05
нет, OpenDialog работает, но после того как я открываю файл через OpenDialog не виконуеться команда открытия файла в мемо (потому что я обращаюсь к папке где лежит экзешник) но после открытия файла через OpenDialog путь остается не к папке где лежит экзешник а а тот где ми открыли файл, и потому уже выходит что чтения файла в мемо идет не с папки где лежит екзешник а с папки где ми открыли файл через OpenDialog, вот в чем проблема
Подскажите как ее решить.

Добавлено через 1 минуту
то что ми открываем через OpenDialog не связано с етим

Code
1
2
3
Memo1->Lines->LoadFromFile("Log.dat");
Memo1->Lines->Add("запись даних");
Memo1->Lines->SaveToFile("Log.dat")
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 15:25
2 Lebron182
(понял вы о другом)
дак мб вам стоит просто сделать так:

C++
1
2
3
4
AnsiString A=ExtractFilePath(Application->ExeName) + "\\Log.dat";
Memo1->Lines->LoadFromFile(A);
Memo1->Lines->Add("запись даних");
Memo1->Lines->SaveToFile(A); // ";" !!! =D
если я все правильно понял)))
1
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
10.11.2009, 15:27  [ТС]
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
xmisserx, проблема в вашем коде такова, а что будет если окно не вызовут? лучше и вправду вызывать диалог перед сохранением... ну и конечно же придется трассировать, что же у вас попадает в параметры функции, так что-то определенное сказать сложно...
какой окно? TOpenDialog? если его не вызывать - все отлично работает - все сохраняется.
при отладке - в path - путь верный, но если вызвать TOpenDialog, то f=NULL, при этом путь правильный, файл существует.... если не вызывать - все работает....
0
225 / 54 / 0
Регистрация: 29.09.2008
Сообщений: 52
10.11.2009, 15:37
Цитата Сообщение от sh4d°_°ff Посмотреть сообщение
если я все правильно понял)))
да вы верно поняли)
то что мне нужно) спасибо)
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.11.2009, 15:51
xmisserx, я про StartForm говорил...
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 16:23
всеееее... вкурил в чем проблема (таки скомпилировал.. да интересно) но походу у вас с Lebron182 одна и та же ошибка ..я поэкспериментировал немного... вот кидаю Ask "модифицированый" в общем тут вроде все робит (правда вам еще придется немного под себя подогнать но суть косяка кажись исправлена) обратите внимание када мы жмыхаем на "Добавиить" или на "Закончить" путь он выдает tests\четотам\четотам... это неверно... путь неполный

я добавил новую глобальную (h-файл) для Аск переменную tmp2 она равна пути
ну и примерно такой !эксперементальный! код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TAskForm::BrowClick(TObject *Sender)
{
if(StartForm->OpenDialog1->Execute())
{
tmp1=StartForm->OpenDialog1->FileName;
//FileWay->Text=OpenFile->FileName;
AnsiString dir="tests\\";
AnsiString fpath = dir + StartForm->TestName->Text + "\\test.txt";
//StartForm->pathfile->Text=fpath;
tmp2=ExtractFilePath(Application->ExeName) + "\\" + fpath;
/*
теперь это крутите как хотите должно робить всяко
*/
}
}
...
//---------------------=)---------
...
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall saver(AnsiString path)
{
    FILE *f;
 
 // AnsiString path = StartForm->pathfile->Text;
    ShowMessage(path);
 
    f=fopen(AskForm->tmp2.c_str(),"a");
    if( FileExists(path) )
        ShowMessage("OK");
 
//И Т.Д.
...
//---------------------=)---------
...
C++
1
saver(tmp2);
результат:
Миниатюры
TOpenDialog и запись в файл  
Вложения
Тип файла: rar testmaker.rar (1.7 Кб, 11 просмотров)
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
10.11.2009, 16:23  [ТС]
Lord_Voodoo, StartForm - она изначально запускается - как ее можно не вызвать?) если конечно правильно Вас понял


sh4d°_°ff, наверно не так поняли... TOpenDialog выполняется - с его вызовом как раз проблем не возникает. Но при его вызове как будто "пропадает" файл test.txt, когда выполняется сама запись в файл
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 16:25
кстати да, Lord_Voodoo сделал очень дельное замечание ИМО...
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
10.11.2009, 16:26  [ТС]
sh4d°_°ff, проект на второй машине - чуть позже попробую. надеюсь что это верно

зы - сейчас ссылку запм-ю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2009, 16:26
Помогаю со студенческими работами здесь

Работа с TOpenDialog
Здравствуйте! Как в TOpenDialog получить именно имя выбранного файла(т.е. просто 'name_prog.exe') и отдельно сам путь к каталогу, где...

Зависания TOpenDialog
Здравствуйте! Я только изучаю программирование и мой вопрос может показаться совсем смешным но я не знаю на него ответ, так что не кидайте...

TOpenDialog и CopyFile
Помогите подружить TOpenDialog и CopyFile. Задача: с помощью TOpenDialog получаем путь к файлу, затем копируем этот файл туда, куда нам...

TOpenDialog и Проводник
После того как сохранил файл с помощью Tsavedialog, при последующем запуске tsavedialog, topendialog, уже не видно этого файла, но он...

Компонент TOpenDialog
Каким образом можно сделать так, чтобы при использовании TOpenDialog отображались файлы и папки только текущего каталога. Например, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru