Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В чём может быть дело???


Страницы:   1 2

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 вообще пустой ;-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо