Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.037 c
15-1251387244
uw
2009-08-27 19:34
2009.10.25
Большой XML


2-1251290575
Kusma
2009-08-26 16:42
2009.10.25
Как выйти из программы


2-1251817288
EH
2009-09-01 19:01
2009.10.25
Скрыть ячейки StringGrid


15-1250973006
Юрий
2009-08-23 00:30
2009.10.25
С днем рождения ! 23 августа 2009 воскресенье


2-1251965130
ford
2009-09-03 12:05
2009.10.25
TWebBrowser список ссылок ячейки таблицы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский