Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Одновременный вызов 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
1-1083688521
Влад Сташневский
2004-05-04 20:35
2004.05.16
Узнать адрес в программе вызова процедуры


3-1082558009
Masa
2004-04-21 18:33
2004.05.16
Как узнать, что юзверь передвинулся на другую запись в датасете ?


3-1082189901
Alexey3117
2004-04-17 12:18
2004.05.16
Нужна БД "СКЛАД" на Interbase


4-1080639896
DennisLNC
2004-03-30 13:44
2004.05.16
Перерисовка


1-1083412577
Jiurasdfgfr
2004-05-01 15:56
2004.05.16
Как присвоить String Char-y?