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

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

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

Author24 — интернет-сервис помощи студентам
доброго времени суток
столкнулся вот с такой проблемой - на форме есть много едитов, радио и чеков и один 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
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О., адрес,...

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

22
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
09.11.2009, 18:29 2
а как например выглядит этот "верный путь"? ..
так: D:\Temp\Folder\1.txt
или так: D:\\Temp\\Folder\\1.txt ?
(условно) для билдера верным является второй вариант.. при первом он может выдать ошибку.
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
09.11.2009, 19:44  [ТС] 3
заносил естественно с \\
суть не в этом. Если не использовать TOpenDialog (в смысле не вызывать его), то файл отлично открывается и записывается. При использовании TOpenDialog ругается что его нет - хотя он реально есть (даже если пару раз без него заносить норм - как только его используешь - ругань)
0
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
09.11.2009, 20:34 4
честно сказать никогда не было проблем с 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  [ТС] 5
у меня тоже не было проблем) правда на билдере не программировал несколько лет
чуть позже выложу проект (он небольшой)
0
1 / 1 / 2
Регистрация: 09.11.2009
Сообщений: 44
09.11.2009, 22:10  [ТС] 6
вот проектик. краткое описание:
при заполнении первой формы - создастся папка tests с подпапкой "название теста", название которого вводится в поле. а в этой папке файл test.txt
сам путь вводится в tedit pathfile, из которой он берется в след.формах

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

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

да, если это имеет значение - Builder 2009
Вложения
Тип файла: rar testmaker.rar (60.5 Кб, 28 просмотров)
0
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 12:54 7
Увы у меня нет 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  [ТС] 8
да. именно tmp никуда не пишется. даже если просто выполнить OpenFileq->Execute() без присваиваний - тоже не будет работать))
по поводу
и вот че смущает... в void saver() вы загружаете path из pathfile
на билдере не программировал очень давно - это мне показалось наиболее простым способом передать значение из другой формы) да и работает это ведь если TOpenDlg не задействовать...

ЗЫ
Не по теме:
(хех гдеб намутить=) стоит того?)))
хотел просто сначала 6ку под висту поставить - ругани было. нашел хороший вариант 2009... но его все равно уже поставил на хр) если надо - ссылочкой поделюсь
0
Почетный модератор
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.11.2009, 14:14 9
xmisserx, проблема в вашем коде такова, а что будет если окно не вызовут? лучше и вправду вызывать диалог перед сохранением... ну и конечно же придется трассировать, что же у вас попадает в параметры функции, так что-то определенное сказать сложно...
0
225 / 54 / 0
Регистрация: 29.09.2008
Сообщений: 52
10.11.2009, 14:28 10
у меня проблема, после открытия файла
Код
OpenDialog1->InitialDir=ExtractFilePath(Application->ExeName);
if (OpenDialog1->Execute())
{
        Memo_Temp->Clear();
        Memo_Temp->Lines->LoadFromFile(OpenDialog1->FileName);
}
путь остается тот где был открытый файл
а после у меня идет чтения и сохранения данных в файле который лежит в каталоге где находится экзешник
Код
Memo1->Lines->LoadFromFile("Log.dat");
Memo1->Lines->Add("запись даних");
Memo1->Lines->SaveToFile("Log.dat")
но оно мне выбивает ошибку что такого файла нету (потому что оно уже обращается по путю не там где лежит екзешник а где бил предидущий файл)
0
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 14:41 11
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 12
нет, OpenDialog работает, но после того как я открываю файл через OpenDialog не виконуеться команда открытия файла в мемо (потому что я обращаюсь к папке где лежит экзешник) но после открытия файла через OpenDialog путь остается не к папке где лежит экзешник а а тот где ми открыли файл, и потому уже выходит что чтения файла в мемо идет не с папки где лежит екзешник а с папки где ми открыли файл через OpenDialog, вот в чем проблема
Подскажите как ее решить.

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

Код
Memo1->Lines->LoadFromFile("Log.dat");
Memo1->Lines->Add("запись даних");
Memo1->Lines->SaveToFile("Log.dat")
0
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 15:25 13
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  [ТС] 14
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
xmisserx, проблема в вашем коде такова, а что будет если окно не вызовут? лучше и вправду вызывать диалог перед сохранением... ну и конечно же придется трассировать, что же у вас попадает в параметры функции, так что-то определенное сказать сложно...
какой окно? TOpenDialog? если его не вызывать - все отлично работает - все сохраняется.
при отладке - в path - путь верный, но если вызвать TOpenDialog, то f=NULL, при этом путь правильный, файл существует.... если не вызывать - все работает....
0
225 / 54 / 0
Регистрация: 29.09.2008
Сообщений: 52
10.11.2009, 15:37 15
Цитата Сообщение от sh4d°_°ff Посмотреть сообщение
если я все правильно понял)))
да вы верно поняли)
то что мне нужно) спасибо)
0
Почетный модератор
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.11.2009, 15:51 16
xmisserx, я про StartForm говорил...
0
говнокодер
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
10.11.2009, 16:23 17
всеееее... вкурил в чем проблема (таки скомпилировал.. да интересно) но походу у вас с 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  [ТС] 18
Lord_Voodoo, StartForm - она изначально запускается - как ее можно не вызвать?) если конечно правильно Вас понял


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

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

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

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

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

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

Не работает OnShow в TOpenDialog
Написал свой вопрос в форум &quot;Delphi для начинающих&quot;. Ответ не получил... Может быть на этом форуме...

TOpenDialog и Проводник отображение
Подскажите как можно исправить, чтобы при вызове OpenDialog отображались файлы? При вызове не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru