Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизОдновременный вызов OpenDialog1.Execute и Append(f); Найти похожие ветки
← →
Sniper-Max © (2004-04-23 21:41) [0]Я вызываю AssignFile(f, "1.txt") в таймере где записываю в фаил (f : TextFile) нужные значения.
После этого я пишу Append(f);
Короче пишу в фаил и закрываю его. (Все как обычно)
Все работает просто замечательно, но вот когда я попытался вызвать OpenDialog1.Execute по нажатию кнопки, то у меня вылетела ошибка File not found!
В дэбаге смотрел, как раз падает на Append(f);
Мне необходимо вызвать этот диалог при ведущейся записью в фаил! А тут они только по отдельности работают :(
В чем тут может быть дело? Почему не совместимо? Что посоветуете?
Эх... вот засада блин... :( Может мозг уже перегрелся :)))
← →
VID © (2004-04-23 22:18) [1]Ну ты вообще то не указал как закрываешь файл...
короче
procedure tform1.timer1timer(...);
begin
assignfile(f, "1.txt");
append(f);
...
closefile(f);
end;
procedure tform1.opendialog1execute(...);
begin
if assigned(f) then
try closefile(f) except exit end;
//А здесь уже делаешь чё надо с файлом имя которого имеешь в OpenDialog1.filename
end;
← →
Sniper-Max © (2004-04-24 07:30) [2]
procedure WriteLog(...);
var
fileLog : TextFile;
begin
AssignFile(fileLog, "log.txt");
Append(fileLog);
...
CloseFile(fileLog);
end;
Вызывается она у меня тогда когда по сети придет посылка, я ее должен записать! Прийти она может в любой момент и я в отладке просто это на таймер запихнул (типа они приходят)...
А вот вызываю Form2.OpenDialog1.Execute для того, что бы открыть фаил для чтения, прочитать из него нужную информацию и затем отослать по сети... Совершенно fileLog тут ни причем!
Запнулся чисто на Form2.OpenDialog1.Execute;
Если я вызвал Form2.OpenDialog1.Execute и просто сижу, смотрю тупо на это диалоговое окно... То обвалится как только посылка придет и попробует записать в фаил!!!
И куда мне писать посылки если я буду тупо кликнув на "Open File" и ничего не делая меня отвлекли, сидеть и смотреть...
Я же даже пока ничего не делаю!!! Совершенно! Просто Execute и все!
← →
SPeller © (2004-04-24 08:36) [3]Потому что OpenDialog.Execute не возвращается пока не закроется диалог. Тут у тебя, по все видимости, бяка с разделением ресурсов между потоками.
← →
Sniper-Max © (2004-04-24 09:22) [4]to SPeller
Как же мне быть?
Ладно, попробую написать свой OpenDioalog который ничего делать не будет кроме как путь к файлу вернет, что мне всего-то и надо. А потом я считаю из файла и все будет ништяк :) Надеюсь по крайней мере так :)
Но этот бред мне совершенно не понятен!!! Какое нафиг разделение ресурсов? Кривой какой-то компонент этот OpenDialog :(
← →
SPeller © (2004-04-24 09:26) [5]
> Кривой какой-то компонент этот OpenDialog
Компонент-то ровный, а вот руки ваши такими не назовёшь.
> попробую написать свой OpenDioalog который ничего делать
> не будет кроме как путь к файлу вернет
А так не получится?MyVar := MyFileName;
Нафига диалоги всякие?
← →
VID © (2004-04-24 10:58) [6]Sniper-Max
А ты примаешь посылки в основном потоке ?
Т.е. у тебя как я понимаю в основном потоке создаётся компонент TClient/ServerSocket и с его помощью ты принимая текст, записываешь (там же в основном потоке) этот текст в файл ? так ?
Если так, то учти что любое модальное окно, каковым является окно выбора файла (OpenDialog) не даст нормально фунционировать твоему коду, который выполняется "как бы в фоне".
Если же сам приёмник посылок (TClient/ServerSocket) создан и дополнительном потоке, и проблема всё равно возникает, то незнаю тогда в чём дело.
А таймер твой - плохой имитатор "фонового" приёма посылок, потому что ты его поставил в основной поток, а там действует правило модального окна...
У меня есть подозрение, что дельфи кривым называют те, кто раньше программировал на VB :) - ну привыкли они к кривости, и она для них является нормой.
← →
SPeller © (2004-04-24 11:33) [7]
> У меня есть подозрение, что дельфи кривым называют те, кто
> раньше программировал на VB :)
Потому что VB не поддерживает многопоточности :)
← →
Sniper-Max © (2004-04-25 08:22) [8]to VID
Я жду события от DLL, она соединяется, принимает посылки...
Мне приходит посылка (байтовый массив).
Я ее разбираю для дальнейшего отображения в моей проге и записываю ее в фаил.
Так же я могу собрать нужную посылку и отослать...
В одной из пасылок должна быть конфигурация, которая читается из файла... Я решил с этим опен диалогом...
Если не вести лог, т.е. не вызывать функцию Append, то все работает, вижу, что посылки идут, отображаются...
Да, я не создавал больше потоков... Наверное ты прав на счет модального окна... Я не знаю... буду разбираться...
← →
Sniper-Max © (2004-04-25 08:31) [9]Я тут хотел свое окошко написать для открытия окна, да вот только опять на такую же фигню напоролся.
Я воткнул копмпонент DirectoryListBox и вот при смене дирректории он у меня падал! Это опять же если лог вести.
Сделал пока так... просто ручками фаил написать для дальнейшего чтения и передачи посылки :) Хотелось бы удобства в выборе файла...
← →
Sniper-Max © (2004-04-25 18:12) [10]to SPeller
Да... видимо придется отказаться от диалога упрощающего выбор файла.
Но мне это все же не до конца понятно... :( Почему так...
← →
VID © (2004-04-25 21:28) [11]приём/передачу посылок реализуй в доп. потоке....
пусть все функции и callback функции используемой тобою библиотеки обрабатываются в этом доп. потоке.
← →
RealRascal © (2004-04-26 06:01) [12]я вот что не понял: у тебя что, файл лога каждый раз заново открывается, когда что-то в лог записать нужно?
В любом сл., если у тя вылазит file not found то попробуй вставить вместо append вот этоif fileexists(filename) then
begin
assign(f,filename);
append(f);
end else
begin
assign(f,filename);
rewrite(f);
end;
← →
Sniper-Max © (2004-04-26 06:58) [13]Если файл существует тогда открываем его на запись в конец файла иначе перезаписываем...
Это как бы совсем не то, что мне надо.
Дело не в ошибки на существование файла.
Файл конечно открывается и закрывается каждый раз, а вдруг прога упадет! Короче что бы данные не потерять!
Попробую создать дополнительный поток...
← →
Sniper-Max © (2004-04-27 06:48) [14]Все, я понял в чем тут дело!
Тут на самом-то деле проблема намного легче!
Вся фишка в том, что при вызове OpenDialog он меняет текущую директорию, а путь к лог-файлу у меня не абсолютный.
Я теперь при запуске программы определяю полный путь к моему логу и спокойно вызываю диалог открытия файла :)
Короче как всегда... глупая проблема, но мозги не всегда сразу включаются :)
Вообще спасибо чуваку не работе! Он натолкунул на эту мысль :)
Всем спасибо за помощь! ;)))
Удачи и хорошего кода в программах :)
← →
RealRascal © (2004-04-27 16:21) [15]
> Sniper-Max © (26.04.04 06:58) [13]
не надо ради этого делать close. Достаточно сделать flush.
← →
han_malign © (2004-04-27 18:03) [16]>не надо ради этого делать close. Достаточно сделать flush.
- для текстового файла? Щазз, разбежался - посмотри реализацию TextOpen...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c