Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2011, 03:16   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
Печаль Программа закрывается сама от передачи данных по сити + добавление в базу

Здравствуйте.
Задача следующая передать данные от клиента серверу и добавить в базу.
Данные текстового и графического типа.
Проблема заключается в следующем при передачи большого количества фото программа просто закрывает без вывода каких либо ошибок.
Не могу понять в чем проблема вот кусок кода где сервер принемает графические данные.
Код:
if ClientConnect[ClientNumb].FotoKol>0 then
   begin
      SendTextOtServera(AContext,'KolFot_ok');
      for j:=1 to ClientConnect[ClientNumb].FotoKol do
         begin
            ClientConnect[ClientNumb].FotoName:=ReadTextOtClient(AContext);
            if ClientConnect[ClientNumb].FotoName='Fot1' then
               begin
                  ClientConnect[ClientNumb].FotoFlag[1]:=True;  
                  ClientConnect[ClientNumb].FotDate[1]:=TMemoryStream.Create;
                  AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[1]);
               end
            else
               if ClientConnect[ClientNumb].FotoName='Fot2' then
                  begin
                     ClientConnect[ClientNumb].FotoFlag[2]:=True;
                     ClientConnect[ClientNumb].FotDate[2]:=TMemoryStream.Create;
                     AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[2]);
                  end
               else
                  if ClientConnect[ClientNumb].FotoName='Fot3' then
                     begin
                        ClientConnect[ClientNumb].FotoFlag[3]:=True;
                        ClientConnect[ClientNumb].FotDate[3]:=TMemoryStream.Create;
                        AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[3]);
                     end
                  else
                     if ClientConnect[ClientNumb].FotoName='Fot4' then
                        begin
                           ClientConnect[ClientNumb].FotoFlag[4]:=True;
                           ClientConnect[ClientNumb].FotDate[4]:=TMemoryStream.Create;
                           AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[4]);
                        end
                     else
                        if ClientConnect[ClientNumb].FotoName='Fot5' then
                           begin
                              ClientConnect[ClientNumb].FotoFlag[5]:=True;
                              ClientConnect[ClientNumb].FotDate[5]:=TMemoryStream.Create;
                              AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[5]);
                           end
                        else
                           if ClientConnect[ClientNumb].FotoName='Fot6' then
                              begin
                                 ClientConnect[ClientNumb].FotoFlag[6]:=True;
                                 ClientConnect[ClientNumb].FotDat[6]:=TMemoryStream.Create;
                                 AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[6]);
                              end
                           else
                              if    ClientConnect[ClientNumb].FotoName='Fot7' then
                                 begin
                                    ClientConnect[ClientNumb].FotoFlag[7]:=True;
                                    ClientConnect[ClientNumb].FotDat[7]:=TMemoryStream.Create;
                                    AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[7]);
                                 end;

end;
end;
после чего идет добавление в базу
Код:
function  AddToBaseNewZpNaServere(ZpText:string;ClientNumb:byte):Boolean;
var
  i,j,id:Integer;
begin
    try
      AddObjectToNaPostanovku_ArendaParam(ClientNumb,id);
      AddObjectToNaPostanovku_UrParam(ClientNumb,id);
      AddObjectToNaPostanovku_GeoParam(ClientNumb,id);
      AddObjectToNaPostanovku_TechnikalPARAM(ClientNumb,id);
      AddObjectToNaPostanovku_StatParam(ClientNumb,id);
      AddObjectToNaPostanovku_ID();
      DM1.FIBT.Active:=True;
      DM1.FIBQ.Transaction.Commit;
      Zero(ClientNumb);
      AddToBaseNewZpNaServere:=True;
   except
       on E : Exception do
                begin
                   FormGlav.consol.Lines.Add(DateToStr(Date)+' - '+TimeToStr(Time)+' : '+'Ошибка: '+ e.Message);
                   DM1.FIBT.Active:=True;
                   DM1.FIBQ.Transaction.Rollback;
                   Zero(ClientNumb);
                   AddToBaseNewZpNaServere:=False;
           end;
   end;
end;
причем оно происходит данные в базе сохраняются. поэтому есть мнение что программа закрывается при работе функции Zerro();
Код:
procedure Zero(ClientNumb:byte);
var
i:Integer;
begin
   for i := 1 to 7 do
      begin
         ClientConnect[ClientNumb].FotDate[i].Free;
         ClientConnect[ClientNumb].FotoFlag[i]:=False;
      end;
end;
может кто скажет в чем проблема.
Lokos вне форума Ответить с цитированием
Старый 28.07.2011, 03:33   #2
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

походу нашел ошибку переделал функцию Zerro()

Код:
procedure Zero(ClientNumb:byte);
var
i:Integer;
begin
   for i := 1 to 7 do
      begin
         if ClientConnect[ClientNumb].FotoFlag[i]=true then
            begin
               ClientConnect[ClientNumb].FotDate[i].Destroy;
               ClientConnect[ClientNumb].FotoFlag[i]:=False;
            end;
      end;
end;
Видимо ошибка была в том что я уничтожал то что не было создано(
Lokos вне форума Ответить с цитированием
Старый 28.07.2011, 03:46   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

эмм я бы всегда использовал

Код:
if not (Object <> nil) then
begin
  FreeAndNil(Object);
end;
И тогда исключается возможность убивать то, что не было создано.

Ваш первый код, поверг меня в панический ужос! А если фотографий.. эмм скажем 400? Вы тоже все 400 фотографий опишите как:
if ClientConnect[ClientNumb].FotoName='FotN' then //Где N это номер от 1 до 400

Не занимайтесь мазохизмом на самим собой.

Код:
if ClientConnect[ClientNumb].FotoKol>0 then
   begin
      SendTextOtServera(AContext,'KolFot_ok');
      for j:=1 to ClientConnect[ClientNumb].FotoKol do
      begin
         ClientConnect[ClientNumb].FotoName:=ReadTextOtClient(AContext);
          if ClientConnect[ClientNumb].FotoName='Fot'+IntToStr(j) then
           begin
               ClientConnect[ClientNumb].FotoFlag[j]:=True;  
               ClientConnect[ClientNumb].FotDate[j]:=TMemoryStream.Create; //Где вы уничтожаете этот обьект? 
              try
               AContext.Connection.IOHandler.ReadStream(ClientConnect[ClientNumb].FotDate[1]);
              finally
                 FreeAndNil(ClientConnect[ClientNumb].FotDate[j]);
              end;
       end;
   end;
end;
Есть мнение не жить в каменном веке. А использовать MadExcept для отлова ошибок, а для отлова утечек памяти EurekaLog.
А ещё есть мнение, не заниматься быдлокодингом. Это чистейшей воды мазохизм над самим собой, не нужная трата времени и просто глупость.

Да прибудет с вами гугл

Последний раз редактировалось Человек_Борща; 28.07.2011 в 04:02.
Человек_Борща вне форума Ответить с цитированием
Старый 28.07.2011, 04:06   #4
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

фоток всего 7)
Спасибо за очень практичный совет.
Объекты унечтожаются в Zero()

Ваш код по приему фото не подойдет потому j может быть 3 а FotoName = fot6
в итоге получаем ошибку

но быдло код я все равно переправлю

Последний раз редактировалось Lokos; 28.07.2011 в 04:23.
Lokos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление данных в базу через LINQ to SQL pinch000 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 02.08.2011 13:09
программа передачи данных с дачтика SHT75 на атмегу 128 sers88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.02.2011 12:59
Добавление данных в базу через LINQ to SQL hk47 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 5 15.11.2010 17:44
Программа, выводящая сама себя Gorychev Общие вопросы Delphi 45 31.01.2010 02:45
Добавление строки в базу данных из visual studio Жендопыр Помощь студентам 0 24.07.2009 02:32