Форум: "Основная";
Текущий архив: 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