Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.038 c
8-1097458381
Tatyana
2004-10-11 05:33
2005.01.23
ресурсы видеокарты


14-1104912807
syte_ser78
2005-01-05 11:13
2005.01.23
получение части стринговой переменной?


4-1102433538
Eagle Owl
2004-12-07 18:32
2005.01.23
Температура процессора...


1-1105280604
Skiner_Y
2005-01-09 17:23
2005.01.23
Как грузить из DLL рисунок


1-1105448371
nap
2005-01-11 15:59
2005.01.23
лексический анализатор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский