Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.08.2012, 20:10
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Вот здесь я добавляю.
Код:
while Pos('<user>',answer)<>0 do
          begin

          tempuser.uid:=Pars('uid',answer);
          tempuser.fname:=Pars('first_name',answer);
          tempuser.lname:=Pars('last_name',answer);
          tempuser.online:=StrToInt(Pars('online',answer));

          memo1.Lines.Add('added user='+tempuser.fname+' '+tempuser.lname);
          memo1.Lines.Add('online='+IntToStr(tempuser.online));

          if copy(Pars('photo_rec',answer),Length(Pars('photo_rec',answer))-3,4)='.jpg' then
             begin
               try
                  gethttp.Get(Pars('photo_rec',answer), ms);
                  ms.Position := 0;

                  jpeg := TJPEGImage.Create;
                  jpeg.LoadFromStream(ms);

                  tempuser.photo:=TBitmap.Create;
                  tempuser.photo.Assign(jpeg);
                  jpeg.Free;
               finally
                  ms.Clear;
               end;
             end;

          Friends.AddObject(tempuser.uid,tempuser);

          delete(answer,1,Pos('</user>',answer));
    end;
Ответить с цитированием
  #17  
Старый 25.08.2012, 20:12
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

По поводу того, что мешает: Разве инициализация не нужна?
Ответить с цитированием
  #18  
Старый 25.08.2012, 20:14
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
Вот здесь я добавляю.
Код:
while Pos('<user>',answer)<>0 do
          begin

          tempuser.uid:=Pars('uid',answer);
....
Не вижу я здесь что то создания нового объекта типа:
Код:
tempuser := TUser.Create;
Здесь только присваивание некоторому объекту однажды уже созданному.
Ответить с цитированием
  #19  
Старый 25.08.2012, 20:18
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Это же лишнее по твоим словам?
Ответить с цитированием
  #20  
Старый 25.08.2012, 20:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
По поводу того, что мешает: Разве инициализация не нужна?
Это никакая не инициализация. Смотри:
Код:
       SelUser:=TUser.Create; // Здесь ты создаёшь объект и ссылку на него присваиваешь переменной SelUser
       for i := 0 to friends.Count-1 do
           begin
           if friends.Objects[i]=nil then memo1.Lines.Add('nil');
           SelUser:=TUser(TObject(friends.Objects[i]));  // А здесь ты забываешь ссылку на объект который создал выше и присваиваешь переменной SelUser ссылку на другой объект
А как ты теперь уничтожишь объект который создал в "SelUser:=TUser.Create" если ссылку на него ты успешно забыл? И зачем ты его вообще создавал если его так и не использовал?

Цитата:
Сообщение от Кодер
Это же лишнее по твоим словам?
Не путай. Это лишнее в процедуре чтения, а в процедуре инициализации нового объекта это необходимое.
Ответить с цитированием
  #21  
Старый 25.08.2012, 20:31
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

После добавления не выдает ничего:
Код:
messagebox(handle,PChar(TUser(friends.Objects[0]).fname),'',mb_ok);
Ответить с цитированием
  #22  
Старый 25.08.2012, 20:34
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
После добавления не выдает ничего:
Код:
messagebox(handle,PChar(TUser(friends.Objects[0]).fname),'',mb_ok);
Так может добавилось fname=''? Откуда я знаю, я же не вижу исходника которым ты добавляешь. Я когда у себя добавляю - всё нормально добавляется.
Ответить с цитированием
  #23  
Старый 25.08.2012, 20:37
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Я выкладывал:
Код:
while Pos('<user>',answer)<>0 do
          begin
          tempuser:=TUser.create;
          tempuser.uid:=Pars('uid',answer);
          tempuser.fname:=Pars('first_name',answer);
          tempuser.lname:=Pars('last_name',answer);
          tempuser.online:=StrToInt(Pars('online',answer));

          memo1.Lines.Add('added user='+tempuser.fname+' '+tempuser.lname);
          memo1.Lines.Add('online='+IntToStr(tempuser.online));

          if copy(Pars('photo_rec',answer),Length(Pars('photo_rec',answer))-3,4)='.jpg' then
             begin
               try
                  gethttp.Get(Pars('photo_rec',answer), ms);
                  ms.Position := 0;

                  jpeg := TJPEGImage.Create;
                  jpeg.LoadFromStream(ms);

                  tempuser.photo:=TBitmap.Create;
                  tempuser.photo.Assign(jpeg);
                  jpeg.Free;
               finally
                  ms.Clear;
               end;
             end;
          
          Friends.AddObject(tempuser.uid,tempuser);
          tempuser.Free;
          delete(answer,1,Pos('</user>',answer));
    end;
ms.Free;gethttp.Free;

С БД Access всё работало
Ответить с цитированием
  #24  
Старый 25.08.2012, 20:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Смотри.
При создании формы создаю 10 пользователей
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  friends := TStringList.Create;

  for i := 1 to 10 do
  begin
    tempuser := TUser.Create;
    tempuser.uid := IntToStr(i);
    tempuser.fname := 'first_name' + IntToStr(i);
    tempuser.lname := 'last_name' + IntToStr(i);
    tempuser.online := online;

    Friends.AddObject(tempuser.uid, tempuser);
  end;
end;

При нажатии на кнопку Button1 добавляю их в ListBox1:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  SelUser: TUser;
  i: Integer;
begin
  lb_users.Items.BeginUpdate;
  lb_users.Clear;

  Memo1.Lines.Add('count=' + IntToStr(friends.Count));

  for i := 0 to friends.Count - 1 do
  begin
    if friends.Objects[i] = nil then
    begin
      memo1.Lines.Add('nil');
    end else
    begin
      SelUser := TUser(friends.Objects[i]);

      memo1.Lines.Add(SelUser.fname + ' ' + SelUser.lname);
      memo1.Lines.Add('online=' + Inttostr(SelUser.online));

      if SelUser.online = online then
      begin
        lb_users.AddItem(SelUser.fname + ' ' + SelUser.lname,
          TObject(StrToInt(SelUser.uid)));
        memo1.Lines.Add('i=' + Inttostr(i) + ' user=' + SelUser.fname + ' ' + SelUser.lname);
      end;
    end;
  end;

  lb_users.Items.EndUpdate;
end;
У тебя такое разве не работает? И БД Access тут непричём.
Ответить с цитированием
  #25  
Старый 25.08.2012, 20:54
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
Я выкладывал:
Код:
while Pos('<user>',answer)<>0 do
          begin
          tempuser:=TUser.create;
          tempuser.uid:=Pars('uid',answer);
...
          
          Friends.AddObject(tempuser.uid,tempuser);
          tempuser.Free; // <--- Это ещё что такое???
...;
Ты добавляешь ссылку на объект tempuser в список Friends и тут же уничтожаешь этот объект? И куда теперь эта ссылка в списке Friends будет ссылаться?
Ответить с цитированием
  #26  
Старый 25.08.2012, 20:56
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Вот где собака сидела. Виноват. Просто напросто запутался
Ответить с цитированием
  #27  
Старый 26.08.2012, 21:22
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Для обработки текста в формате JSON пользуюсь всем известным классом TlkJSON.

При долгой работе моей программы в этой функции выскакивает ошибка access violation:
Код:
function TlkJSONobject.IndexOfName(const aname: WideString): Integer;
var
  mth: TlkJSONobjectmethod;
  i: Integer;
begin
  if not FUseHash then //ВОТ ЗДЕСЬ ОШИБКА
    begin
      result := -1;
      for i := 0 to Count - 1 do
        begin
//          mth := TlkJSONobjectmethod(FValue[i]);
          mth := TlkJSONobjectmethod(fList.Items[i]);
          if mth.Name = aname then
            begin
              result := i;
              break;
            end;
        end;
    end
  else
    begin
      result := ht.IndexOf(aname);
    end;
end;
С чем это может быть связано?
Ответить с цитированием
  #28  
Старый 26.08.2012, 21:38
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
Для обработки текста в формате JSON пользуюсь всем известным классом TlkJSON.
Честно говоря никогда с таким не работал...
Цитата:
Сообщение от Кодер
При долгой работе моей программы в этой функции выскакивает ошибка access violation:
Код:
function TlkJSONobject.IndexOfName(const aname: WideString): Integer;
var
  mth: TlkJSONobjectmethod;
  i: Integer;
begin
  if not FUseHash then //ВОТ ЗДЕСЬ ОШИБКА
...
С чем это может быть связано?
Точно не скажу в чём проблема (слишком мало информации), но с вероятностью ~90% могу утверждать, что ты работаешь с уже уничтоженным объектом.
Тебе нужно более строго следить за созданием и уничтожением объектов и "access vialation" будет очень редкой ошибкой.
Ответить с цитированием
  #29  
Старый 26.08.2012, 22:00
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

хм..Была бы ошибка тогда в моем модуле, разве нет?
Ответить с цитированием
  #30  
Старый 27.08.2012, 00:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Кодер
хм..Была бы ошибка тогда в моем модуле, разве нет?
Вовсе не обязательно. Очень часто с уже уничтоженным объектом можно ещё некоторое время работать и поймать "Access Violation" совсем в другом месте, когда место удалённого объекта займёт новый объект или данные, что приведёт к коллизиям.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter