Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизИзменение объекта Найти похожие ветки
← →
cyber-pilot (2009-08-21 12:47) [0]Есть ли в Delphi 2007 возможность поставить breakpoint на событие изменения данных в объекте, если есть то как это можно сделать?
Пробовал через "Data breakpoint", а мне выдается сообщение "invalid address".
← →
Kolan © (2009-08-21 12:49) [1]Что за событие «изменения данных»?
Если правильно догадался, то можно сделать сеттер и поставить точку там.
← →
cyber-pilot (2009-08-21 13:07) [2]
> Kolan © (21.08.09 12:49) [1]
>
> Что за событие «изменения данных»?
>
> Если правильно догадался, то можно сделать сеттер и поставить
> точку там.
Проблема у меня на самом деле в следующем. Есть объект, у него есть метод чтения данных из файла. После того, как выполняется этот метод, поля объекта забиваются мусором. Трассировал внутри метода, ошибок не нашел. Вот и думаю как определить, что же происходит с объектом.
А что значит сделать сеттер?
← →
Медвежонок Пятачок © (2009-08-21 13:09) [3]После того, как выполняется этот метод, поля объекта забиваются мусором.
Просто кривой метод. Зачем там брекпойнт непонятно
← →
Kolan © (2009-08-21 13:38) [4]У вас где то ошибка работы с памятью, поставить точку останова на «тот момент, когда я испортил память» не получится.
Покажите как читаете из файла.
← →
cyber-pilot (2009-08-21 14:15) [5]
> Покажите как читаете из файла.
Чтение из файла тянет за собой кучу модулей, а так как их писал не я, то не могу их просто так показать.
← →
Сергей М. © (2009-08-21 14:36) [6]
> метод чтения данных из файла
Что мешает показать хотя бы декларацию этого метода и фрагмент вызывающего этот метод кода ?
← →
cyber-pilot (2009-08-21 14:49) [7]
> Что мешает показать хотя бы декларацию этого метода и фрагмент
> вызывающего этот метод кода ?
Да, в принципе, ничего. Но не думаю, что это как-то поможет.
Вот здесь вызывается чтение файла:procedure TViewersMngr.CheckLoad(var aDoc: TDocInfo);
begin
if Assigned(aDoc.Doc) then
Exit;
aDoc.Doc := TRTFEditor.Create(nil);
try
aDoc.Doc.LoadFromFile(aDoc.DocName, ffDefault);
aDoc.Doc.UnlockFile;
except
FreeAndNil(aDoc.Doc);
raise;
end;
end;
А вот и сам метод:
function TRTFEditor.LoadFromFile(aFileName: TFileName; aFormat: TFileFormat): Boolean;
var
msg: String;
vExt: String;
vFormat: TFileFormat;
begin
Result := False;
if FFileName <> aFileName then
begin
FFileName := "";
FreeAndNil(FFileStream);
end;
if FFileName = "" then
begin
FFileName := aFileName;
FFileStream := TBufFileStream.Create(FFileName, fmOpenReadWrite);
end;
FAutoSaveName := "";
if aFormat = ffDefault then
begin
vExt := AnsiLowerCase(ExtractFileExt(aFileName));
if vExt = ".bak" then
begin
vExt := copy(aFileName, 1, Length(aFileName)-Length(vExt));
vExt := AnsiLowerCase(ExtractFileExt(vExt));
end;
if vExt = ".ct2" then
vFormat := ffCT2
else if vExt = ".xml" then
vFormat := ffXML
else if vExt = ".rtf" then
vFormat := ffRTF
else if vExt = ".txt" then
vFormat := ffANSI
else
vFormat := GetStreamFormat(FFileStream);
end
else
vFormat := aFormat;
msg := "Загружаю документ " + ExtractFileName(FFileName) +"...";
FFileStream.Position := 0;
LoadFromStream(msg, FFileStream, vFormat);
end;
← →
Kolan © (2009-08-21 14:53) [8]Я бы прошел по коду загзузки а в окноп простмотра добавил бы то поле что портится и следл бы где оно испортилось.
← →
Сергей М. © (2009-08-21 14:59) [9]Покажи метод TRTFEditor.LoadFromStream ..
← →
cyber-pilot (2009-08-21 15:12) [10]
> Сергей М. © (21.08.09 14:59) [9]
>
> Покажи метод TRTFEditor.LoadFromStream ..
function TRTFEditor.LoadFromStream(const aMsg: String; const aStream: TStream;
aFormat: TFileFormat): Boolean;
var
vList: TObjectList;
i: Integer;
begin
Result := False;
BeforeLoadFile;
vList := nil;
try
GenerateParsingExceptions := False;
SetLength(FMETRepl, 0);
case aFormat of
ffXML:
vList := XMLReadFile(aMsg, aStream, DocInfo, OnReadRTFStr);
ffDefault, ffRTF:
vList := RTFReadFile(aMsg, aStream, DocInfo, OnReadRTFStr);
ffOEM: begin
vList := OEMReadFile(aMsg, aStream);
DocInfo := cEmptyDocInfo;
end;
ffANSI: begin
vList := ANSIReadFile(aMsg, aStream);
DocInfo := cEmptyDocInfo;
end;
ffCT2:
vList := CTReadFile(aMsg, aStream, DocInfo, OnReadRTFStr);
else
raise Exception.Create("Неподдерживаемый формат документа.");
end;
if vList <> nil then
begin
FFileFormat := aFormat;
FPars.Clear;
for i := 0 to vList.Count - 1 do
FPars.Add(TScreenParag.Create(Self, vList[i] as TRTFParag));
NeedParsRestyle;
vList.OwnsObjects := False;
// Заменяем ссылки для удаленных в OnReadRTFStr МЕТок
for i := Low(FMETRepl) to High(FMETRepl) do
METReplace(FMETRepl[i].aFrom, FMETRepl[i].aTo);
ClearUndo;
ClearSets;
NeedParsRestyle;
RefreshScrollBars;
AfterLoadFile;
DoTextChanged;
Result := True;
end;
finally
SetLength(FMETRepl, 0);
FreeAndNil(vList);
GenerateParsingExceptions := True;
end;
end;
← →
Сергей М. © (2009-08-21 15:32) [11]На момент
if vList <> nil then
поля объекта еще не "забиты мусором" ?
← →
cyber-pilot (2009-08-21 15:57) [12]
> Сергей М. © (21.08.09 15:32) [11]
Нет, не забиты.
Похоже, что ошибка не в загрузке, а в другом месте. Тут есть такая оптимизация, что каждую секунду проверяется сколько открыто документов, если больше определенного числа, то те документы, которые давно не использовались выгружаются из памяти. Если поставить интервал побольше, то ошибка не происходит.
← →
Сергей М. © (2009-08-21 16:08) [13]
> Нет, не забиты.
Ну вот
Ищи в теле LoadFromStream строчку ПОСЛЕif vList <> nil then
, при выполнении которой ты обнаруживаешь "мусор".
← →
Ega23 © (2009-08-21 16:22) [14]
procedure TViewersMngr.CheckLoad(var aDoc: TDocInfo);
begin
if Assigned(aDoc.Doc) then
Exit;
aDoc.Doc := TRTFEditor.Create(nil);
try
aDoc.Doc.LoadFromFile(aDoc.DocName, ffDefault);
aDoc.Doc.UnlockFile;
except
FreeAndNil(aDoc.Doc);
raise;
end;
end;
А занафигаvar aDoc: TDocInfo
???
← →
Дмитрий Белькевич (2009-08-22 19:20) [15]
> А занафига var aDoc: TDocInfo ???
Сишное наследство?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.051 c