На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Передача TStringList через сокет
    По сети передается структура следующего вида
    ExpandedWrap disabled
        TServerSendFileListMsg = record
          MsgNumber: integer;
          FileList: TStringList;
        end;
        PServerSendFileListMsg = ^TServerSendFileListMsg;

    Процедура отправки
    ExpandedWrap disabled
      procedure TForm1.ConnectUser(Socket: TCustomWinSocket; Size: Integer);
      var
          Msg: TServerSendFileListMsg;
          i: integer;
      begin
         Msg.MsgNumber := MSG_SERVERSENDFILELIST;
         MSG.FileList := TStringList.Create;
         Msg.FileList.Clear;
         for i := 0 to Files.Count - 1 do
           Msg.FileList.Add(Files.Strings[i]);
         Socket.SendBuf(Msg,SizeOf(TServerSendFileListMsg));
      end;

    Процедура приема и обработки
    ExpandedWrap disabled
      procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
      var
          Msg: Pointer;
          Size: integer;
      begin
        Size := Socket.ReceiveLength;
        GetMem(Msg,Size);
        Socket.ReceiveBuf(Msg^,Size);
        HandleMessage(Msg);
        FreeMem(Msg);
      end;
       
      procedure TForm1.HandleMessage(Msg: Pointer);
      begin
        case integer(Msg^) of
          MSG_SERVERSENDFILELIST: ServerSendFileList(Msg);
        end;
      end;
       
      procedure TForm1.ServerSendFileList(Msg: PServerSendFileListMsg);
      var
         i: integer;
      begin
        ListBox1.Items.Clear;
        for i := 0 to Msg^.FileList.Count - 1 do
          ListBox1.Items.Add(Msg.FileList.Strings[i]);
      end;

    При обращении к Msg.FileList вылетает access violation. В чем проблема?
      Цитата hawk1 @
      В чем проблема?

      в том, что фактически передаешь указатель на стринглист, а не сам текст.
      Либо разверни его в структуре в array[0..N] of char, либо передавай отдельно, после заголовка структуры: Socket.SendBuf(PChar(FileList.Text),Length(FileList.Text));
        Все равно та же ошибка.
          Нужно угадать, какой у тебя теперь код?
            мне одному кажется что вот тут не хватает кое чего...

            ExpandedWrap disabled
              ListBox1.Items.Add(Msg.FileList.Strings[i]); = ListBox1.Items.Add(Msg^.FileList.Strings[i]);
              Если речь идёт о об отсутствии оператора разыменования ^, то его ставить необязательно в тех случаях, когда не возникает неоднозначности
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0858 ]   [ 15 queries used ]   [ Generated: 20.09.26, 18:02 GMT ]