![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В чём может быть дело???
Ega23 © (2005-01-13 14:32:00)Есть такая процедура:
procedure BtnClearClick(Sender:TObject);
var
i:Integer;
begin
if (Sender is TForm) then
begin
With TForm(Sender) do
begin
for i:=0 to ComponentCount-1 do
if (Components[i] is TMemo) then
if UpperCase(TMemo(Components[i]).Name)=UpperCase('memSQLLogMonitor') then
begin
TMemo(Components[i]).Lines.Clear;
//Showmessage(aFileName);
TMemo(Components[i]).Lines.SaveToFile(aFileName);
Break;
end;
end;//With TForm(Sender) do
end;//if (Sender is TForm) then
end;//procedure BtnClearClick(
на TMemo(Components[i]).Lines.SaveToFile(aFileName); получаю
Access violation at address 77F8FFDE in module 'ntdll.dll'.
В чём может быть дело????
VMcL (2005-01-13 15:53:00) [1]>> Ega23 © (13.01.05 15:12) [19]
Вынести BtnClearClick на самый верхний уровень процедур. То есть сделать так, чтобы BtnClearClick перестала быть вложеннойпроцедурой.
Ega23 (2005-01-13 15:53:00) [2]2 Семен Сорокин © (13.01.05 15:49) [28]
Блин. А ведь сработало! А на [13] я что-то внимания не обратил сначала...
Спасибо!
Ega23 (2005-01-13 15:49:00) [3]2 Arm79 © (13.01.05 15:43) [27]
Без разницы. Я могу ошибиться, но вроде реализация as сделана
if aaa is ttt then ttt(aaa)
Семен Сорокин (2005-01-13 15:49:00) [4]
> Ega23 © (13.01.05 15:41) [26]
> [7]/[21] не помогло, пробую реализовать по [22]...
тогда вместо глобальной переменной localFileName можно использовать [13] с ShowHint = false;
Arm79 (2005-01-13 15:43:00) [5]Может, конечно, и глупо, но почему бы не попробовать вместо TMemo(Components[i]).Lines.SaveToFile(aFileName);
(Components[i] as TMemo).Lines.SaveToFile(aFileName);
Ega23 (2005-01-13 15:41:00) [6][7]/[21] не помогло, пробую реализовать по [22]...
Плохиш (2005-01-13 15:38:00) [7]
>Ega23 © (13.01.05 15:35) [24]
Так, что [7]/[23] заработало?
Может использовать функцию FindComponent?
Ega23 (2005-01-13 15:35:00) [8]2 Erik1 © (13.01.05 15:31) [23]
Если уж оптимизировать, так ControlCount и Controls[i]
Erik1 (2005-01-13 15:31:00) [9]Вобщето такие циклы личше наоборот писать
Var
i: Integr;
Memo: TMemo;
begin
...
for i := ComponentCount-1 downto 0 do
if (Components[i] is TMemo) then
begin
Memo := TMemo(TForm(Sender).Components[i]);
и далее работаем с Memo.
Это общие рекомендации, конечно проблемы это не решит, но может помоч в ее решении.
Verg (2005-01-13 15:19:00) [10]
> const aFileName:String
Сделай глобальной переменной (локальной для модуля) переменнуz, например, localFileName: string;, в ShowTexLogFile присвой ей aFileName, а впроцедуре BtnClearClick используй значение именно этой переменной. Саму BtnClearClick не делай локальной для ShowTexLogFile.
Ega23 (2005-01-13 15:14:00) [11]Я о том, что Memo сначала очищается, а потом пустая строка сохраняется в файл. :)
Уже пробовал. Не пустую строку сохранял. Эффекта - ноль.
Neznaika (2005-01-13 15:13:00) [12]>>Anatoly Podgoretsky © (13.01.05 15:02) [15]
>>Попробуй в этот момент его переписать ручками.
Поддерживаю идею!
Ega23 (2005-01-13 15:12:00) [13]2 Verg © (13.01.05 15:04) [16]
А что тогда делать? В design-time всё делать? А этих форм - до чёртиков и все разные...
Александр Иванов (2005-01-13 15:11:00) [14]Ega23 © (13.01.05 15:07) [17]
Я о том, что Memo сначала очищается, а потом пустая строка сохраняется в файл. :)
Ega23 (2005-01-13 15:07:00) [15]Странная последовательность
Ничего странного. В ран-тайме создаётся форма, на ней Memo, 2 Button'а ("Очистить" и "Закрыть"). Это как раз метод для "Очистить".
Verg (2005-01-13 15:04:00) [16]
> Ega23 © (13.01.05 14:50) [8]
По-моему так делать вообще нельзя. Т.е. ты из локальнойпроцедуры делаешь подобие метода объекта (с явной передачей self из поля Data у TMethod), который будет вызван вне контекста фрейма стека ShowTexLogFile. А ведь компилер при трансляции этой локальной процедуры отсчитывает смещение до aFileName именно от этого фрейма (исходя из его наличия).
Anatoly Podgoretsky (2005-01-13 15:02:00) [17]Ega23 © (13.01.05 14:51) [9]
Кому видна? Нам нет.
Ega23 © (13.01.05 14:58) [14]
Попробуй в этот момент его переписать ручками.
Ega23 (2005-01-13 14:58:00) [18]Расскоментируй строчку и скажи имя в момент ошибки. Кроме того проверь, что файл именно в этот момент не занят
Раскомментировал. Поставил на ней breakpoint. Остановился. По Ctrl+F7 aFileName='E:\Egorov\Work\Pass\Сопровождение\Src\SupportClient\InfoView.log'
Дальше - exception. Файл нигде более не открыт.
Семен Сорокин (2005-01-13 14:58:00) [19]Ega23 © (13.01.05 14:50) [8]
как вариант aFileName присвоить Memo.Hint и юзать его.
Neznaika (2005-01-13 14:57:00) [20]
> Anatoly Podgoretsky © (13.01.05 14:53) [10]
> Расскоментируй строчку и скажи имя в момент ошибки. Кроме
> того проверь, что файл именно в этот момент не занят.
У меня почему-то сомнение, что в этот момент afilename вообще пустой ;-)