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

Вниз

В чём может быть дело???   Найти похожие ветки 

 
Ega23 ©   (2005-01-13 14:32) [0]

Есть такая процедура:

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".
В чём может быть дело????


 
арапор   (2005-01-13 14:34) [1]

может

for i:=1 to ComponentCount


 
Ega23 ©   (2005-01-13 14:37) [2]

2 арапор   (13.01.05 14:34) [1]
может
for i:=1 to ComponentCount


"Это врад-ли..." (с) Товарищ Сухов.


 
Анонимщик ©   (2005-01-13 14:41) [3]

Ты уверен, что доступ к твоему файлу с именем aFileName разрешен? Какой имя, кстати?


 
Neznaika ©   (2005-01-13 14:43) [4]

>> TMemo(Components[i]).Lines.SaveToFile(aFileName);

aFileName - это что, стесняюсь спросить.


 
Anatoly Podgoretsky ©   (2005-01-13 14:43) [5]

Неизвестное значение глобальной переменной aFileName, зря закоментировал Showmessage(aFileName);


 
Ega23 ©   (2005-01-13 14:46) [6]

Ты уверен, что доступ к твоему файлу с именем aFileName разрешен? Какой имя, кстати?

Имя вполне нормальное, файл существует, параллельно могу открыть notepad"ом, всё стереть, сохранить и закрыть.
Exception летит даже если "отковычить" ShowMessage(aFileName), т.е. сразу после TMemo(Components[i]).Lines.Clear; При этом, на экране мемо действительно очищается. Но всё, что дальше - аллес.


 
Семен Сорокин ©   (2005-01-13 14:46) [7]

на TMemo(Components[i]).Lines.Clear;
может у него (TMemo) на событие  OnChange стоит что-то что меняет index в Components (например создание/удаление компонента), попробуй так:

procedure BtnClearClick(Sender:TObject);
var
i:Integer;
_memo: TMemo;
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
       _memo := TMemo(Components[i]);      _memo.Lines.Clear;
       //Showmessage(aFileName);
       _memo.Lines.SaveToFile(aFileName);
       Break;
      end;
  end;//With TForm(Sender) do
end;//if (Sender is TForm) then
end;//procedure BtnClearClick(


 
Ega23 ©   (2005-01-13 14:50) [8]

Вот полный код процедуры:


function ShowTexLogFile(const aFileName:String):Boolean;
           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(
var
aForm:TForm;
aPanel:TPanel;
OnClearClick:TMethod;
List:TStringList;
i:Integer;
begin
Result:=False;
//if not FileExists(aFileName) then Exit;
try
 Application.CreateForm(TForm, aForm);
 try
  With aForm do
   begin
    Caption:=aFileName;
    BorderStyle:=bsSingle;
    Height:=500;
    Width:=750;
    Position:=poScreenCenter;
   end;
  With TMemo.Create(aForm) do
   begin
    Parent:=aForm;
    Name:="memSQLLogMonitor";
    Align:=alClient;
    ScrollBars:=ssBoth;
    //Height:=440;
    Clear;
    List:=TStringList.Create;
    if FileExists(aFileName) then
     begin
      List.LoadFromFile(aFileName);
      for i:=List.Count-1 downto 0 do Lines.Add(List.Strings[i]);
     end;
    List.Free;
   end;
  aPanel:=TPanel.Create(aForm);
  With aPanel do
   begin
    Parent:=aForm;
    Height:=45;
    Align:=alBottom;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Cancel:=True;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-10;
    Left:=aPanel.Width-110;
    Anchors:=[akTop, akRight];
    Caption:="Çàêðûòü";
    ModalResult:=mrOK;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-30;
    Left:=aPanel.Width-220;
    Anchors:=[akTop, akRight];
    Caption:="Î÷èñòèòü";
    OnClearClick.Code:=@BtnClearClick;
    OnClearClick.Data:=aForm;
    OnClick:=TNotifyEvent(OnClearClick);
   end;
  aForm.ShowModal;
 finally
  aForm.Free;
 end;
except on E:Exception do
 raise Exception.Create("ShowTexLogFile "+E.Message);
end;
end;



 
Ega23 ©   (2005-01-13 14:51) [9]

2 Anatoly Podgoretsky ©   (13.01.05 14:43) [5]
Неизвестное значение глобальной переменной aFileName, зря закоментировал Showmessage(aFileName);

По-идее aFileName должна быть видна... Или я ошибаюсь?


 
Anatoly Podgoretsky ©   (2005-01-13 14:53) [10]

Расскоментируй строчку и скажи имя в момент ошибки. Кроме того проверь, что файл именно в этот момент не занят.


 
Александр Иванов ©   (2005-01-13 14:56) [11]


>                   begin
>                    TMemo(Components[i]).Lines.Clear;
>                    //Showmessage(aFileName);
>                    
>TMemo(Components[i]).Lines.SaveToFile(aFileName);
>                    Break;
>                    end;

Странная последовательность


 
Neznaika ©   (2005-01-13 14:57) [12]


> Anatoly Podgoretsky ©   (13.01.05 14:53) [10]
> Расскоментируй строчку и скажи имя в момент ошибки. Кроме
> того проверь, что файл именно в этот момент не занят.


У меня почему-то сомнение, что в этот момент afilename вообще пустой ;-)


 
Семен Сорокин ©   (2005-01-13 14:58) [13]

Ega23 ©   (13.01.05 14:50) [8]
как вариант aFileName присвоить Memo.Hint и юзать его.


 
Ega23 ©   (2005-01-13 14:58) [14]

Расскоментируй строчку и скажи имя в момент ошибки. Кроме того проверь, что файл именно в этот момент не занят

Раскомментировал. Поставил на ней breakpoint. Остановился. По Ctrl+F7 aFileName="E:\Egorov\Work\Pass\Сопровождение\Src\SupportClient\InfoView.log"
Дальше - exception. Файл нигде более не открыт.


 
Anatoly Podgoretsky ©   (2005-01-13 15:02) [15]

Ega23 ©   (13.01.05 14:51) [9]
Кому видна? Нам нет.

Ega23 ©   (13.01.05 14:58) [14]
Попробуй в этот момент его переписать ручками.


 
Verg ©   (2005-01-13 15:04) [16]


> Ega23 ©   (13.01.05 14:50) [8]


По-моему так делать вообще нельзя. Т.е. ты из локальной процедуры делаешь подобие метода объекта (с явной передачей self из поля Data у TMethod), который будет вызван вне контекста фрейма стека ShowTexLogFile. А ведь компилер при трансляции этой локальной процедуры отсчитывает смещение до aFileName именно от этого фрейма (исходя из его наличия).


 
Ega23 ©   (2005-01-13 15:07) [17]

Странная последовательность

Ничего странного. В ран-тайме создаётся форма, на ней Memo, 2 Button"а ("Очистить" и "Закрыть"). Это как раз метод для "Очистить".


 
Александр Иванов ©   (2005-01-13 15:11) [18]

Ega23 ©   (13.01.05 15:07) [17]
Я о том, что Memo сначала очищается, а потом пустая строка сохраняется в файл. :)


 
Ega23 ©   (2005-01-13 15:12) [19]

2 Verg ©   (13.01.05 15:04) [16]

А что тогда делать? В design-time всё делать? А этих форм - до чёртиков и все разные...


 
Neznaika ©   (2005-01-13 15:13) [20]

>>Anatoly Podgoretsky ©   (13.01.05 15:02) [15]
>>Попробуй в этот момент его переписать ручками.

Поддерживаю идею!


 
Ega23 ©   (2005-01-13 15:14) [21]

Я о том, что Memo сначала очищается, а потом пустая строка сохраняется в файл. :)

Уже пробовал. Не пустую строку сохранял. Эффекта - ноль.


 
Verg ©   (2005-01-13 15:19) [22]


> const aFileName:String


Сделай глобальной переменной (локальной для модуля) переменнуz, например, localFileName: string;, в ShowTexLogFile присвой ей aFileName, а впроцедуре BtnClearClick используй значение именно этой переменной. Саму BtnClearClick не делай локальной для ShowTexLogFile.


 
Erik1 ©   (2005-01-13 15:31) [23]

Вобщето такие циклы личше наоборот писать
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.
Это общие рекомендации, конечно проблемы это не решит, но может помоч в ее решении.


 
Ega23 ©   (2005-01-13 15:35) [24]

2 Erik1 ©   (13.01.05 15:31) [23]
Если уж оптимизировать, так ControlCount и Controls[i]


 
Плохиш ©   (2005-01-13 15:38) [25]


>Ega23 ©   (13.01.05 15:35) [24]

Так, что [7]/[23] заработало?
Может использовать функцию FindComponent?


 
Ega23 ©   (2005-01-13 15:41) [26]

[7]/[21] не помогло, пробую реализовать по [22]...


 
Arm79 ©   (2005-01-13 15:43) [27]

Может, конечно, и глупо, но почему бы не попробовать вместо TMemo(Components[i]).Lines.SaveToFile(aFileName);

(Components[i] as TMemo).Lines.SaveToFile(aFileName);


 
Семен Сорокин ©   (2005-01-13 15:49) [28]


> Ega23 ©   (13.01.05 15:41) [26]
> [7]/[21] не помогло, пробую реализовать по [22]...

тогда вместо глобальной переменной localFileName можно использовать [13] с ShowHint = false;


 
Ega23 ©   (2005-01-13 15:49) [29]

2 Arm79 ©   (13.01.05 15:43) [27]

Без разницы. Я могу ошибиться, но вроде реализация as сделана
if aaa is ttt then ttt(aaa)


 
Ega23 ©   (2005-01-13 15:53) [30]

2 Семен Сорокин ©   (13.01.05 15:49) [28]

Блин. А ведь сработало! А на [13] я что-то внимания не обратил сначала...
Спасибо!


 
VMcL ©   (2005-01-13 15:53) [31]

>>Ega23 ©  (13.01.05 15:12) [19]

Вынести BtnClearClick на самый верхний уровень процедур. То есть сделать так, чтобы BtnClearClick перестала быть вложенной процедурой.



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
1-1105464482
Magic_STI
2005-01-11 20:28
2005.01.23
Вывод ресалтов поиска


14-1104250139
Чеширский_Кот
2004-12-28 19:08
2005.01.23
AOL


3-1103633684
den_777
2004-12-21 15:54
2005.01.23
Частое изменение метаданных в INTERBASE


9-1097689488
Colonel
2004-10-13 21:44
2005.01.23
Помогите нарисовать...


14-1104751852
vecna
2005-01-03 14:30
2005.01.23
Кто какие подарки получил на НГ?! =)