Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Код:
    var
      iValue : integer;
      pIntValue : pointer;
        pmp : ^integer;
    begin
    iValue := 2001;
       pIntValue := @iValue; // равно нулю
       pmp := @iValue; // но здесь равно 4 (указатель на тип)
      ShowMessage(IntToStr(SizeOf(pIntValue^)));
      ShowMessage(IntToStr(SizeOf(pmp^)));
    end;
     
    не зря же дают еще ReceiveDataLength

    Код:
    move(ReceiveData^, RD^, ReceiveDataLength);  

    все верно

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:39 07-04-2011 | Исправлено: greenpc, 13:48 07-04-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    при передачи параметров в поток тут av (write of adress 00000000). Я так понимаю пытаюсь записать в несуществующий указатель!? Но тогда как? FromHostIP передается нормально.
     
    move(ReceiveData^, CreateNewThread.ReceiveData^, ReceiveDataLength);

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 13:52 07-04-2011 | Исправлено: Man_Without_Face, 14:00 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    почему идет запуск потока перед передачей парам-ов ему?
    ЗЫ: обновите Ваш код чтобы было что смотреть
    ЗЫ2: отладку удобнее вести без потоков.  
    создайте процедуру с теме же парам-ми - нагляднее будет

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 14:07 07-04-2011 | Исправлено: greenpc, 14:13 07-04-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    обновленный код:
    Подробнее...

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 15:10 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    задать размер(выделить память) CreateNewThread.ReceiveData

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 15:28 07-04-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Огромное спасибо, все ок.
    Только не понимаю: я же память уже выделял, и просто перекидывал между указателями!?
    Правильно ли я теперь освобождаю память?
      freemem(ReceiveData); в procedure TNewThread.Execute;
    И нужно ли здесь то же освобождать? procedure NewThread(FromHostIP: Uint64; ReceiveData: pointer; ReceiveDataLength: cardinal);
    Добавилось только:   getmem(CreateNewThread.ReceiveData, ReceiveDataLength);
     
    И еще небольшой вопросик, нигде не нашел:
    Как прочить из ReceiveData 5й байт
    Move(ReceiveData^, pNum, ???);  

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 15:46 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Цитата:
    я же память уже выделял, и просто перекидывал между указателями

    help(f1) move - Copies bytes from a source to a destination.
    Цитата:
    И нужно ли здесь то же освобождать
    да. Вы же выделили память.
    Цитата:
    Как прочить из ReceiveData 5й байт  

    думаю так
    Код:
    Move((ReceiveData+5*sizeof(pNum))^, pNum, sizeof(pNum));  
    хотя могу ошибаться

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 15:56 07-04-2011 | Исправлено: greenpc, 15:56 07-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    Чтобы "перекидывать между указателями" надо их присваивать: "CreateNewThread.ReceiveData := ReceiveData;".
    Для освежения памяти: http://www.transl-gunsmoker.ru/2009/09/blog-post.html

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:01 07-04-2011 | Исправлено: Frodo_Torbins, 16:02 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    для потоков будет ошибка

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:06 07-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    К строке "move(ReceiveData^, RD^, ReceiveDataLength);" у меня нет никаких замечаний. Я о втором move в процедуре NewThread.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:24 07-04-2011 | Исправлено: Frodo_Torbins, 16:26 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    недоглядел. извиняюсь.

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:31 07-04-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Frodo_Torbins
    Ок, спасибо.
    Я понимаю так Подробнее...
    в procedure TNewThread.Execute; освобождать память так или что то лишнее?
    Dispose(vData);
    freemem(ReceiveData);
     
    greenpc

    Цитата:
    Move((ReceiveData+5*sizeof(pNum))^, pNum, sizeof(pNum));

    к сожалению так не работает...

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 16:52 07-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    В старших версиях наверно нужны дополнительные приведения типов: "Move(Pointer(Integer(ReceiveData)+5*sizeof(pNum))^, pNum, sizeof(pNum));".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:16 07-04-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Почему то всегда получается единица...
    В моем коде это строка идет после проверки уина (ppUin).

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 17:46 07-04-2011 | Исправлено: Man_Without_Face, 17:47 07-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    Попробуйте куда-нибудь вывести весь буфер.
    А вообще работа с указателями всегда выглядит страшно и несет в себе много скрытых глюков. Я бы сразу же избавился от них примерно так:
    Код:
    type
      TData = packed array of Byte;
    //...
    var
      RD: TData;
    //...
      SetLength(RD, ReceiveDataLength);
      move(ReceiveData^, RD[1], ReceiveDataLength);

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:55 07-04-2011 | Исправлено: Frodo_Torbins, 18:01 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face  
    сейчас из дома дельфей нет. ошибка скорее всего то что смещение 5*size
    правильно будет (5-1)*sizeof() - т.е. 4 байта пропускаем с 5 читаем.
    или (ReceiveData+sizeof(ppUin))^

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 19:18 07-04-2011
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face

    Код:
        mas: array of byte;
        mybyte : Byte;
    begin
      SetLength(mas,7);
      for i := low(mas) to High(mas) do mas[i]:=i;
      pIntValue :=@(mas[1]);
      move((pointer(integer(pIntValue)+1))^, mybyte, sizeof(mybyte));
      ShowMessage(IntToStr(mybyte));
    end;
     

    Frodo_Torbins
    прав.
    в догонку насчет "перекидывать между указателями"  
    я бы в процессе перекинул, а в процедуре OnReceivePacket передал напрямую. Потому что процесс выделил память- процесс освободил.
    а так получается на OnReceivePacket мы только выделяем память. а где освобождение.

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:59 08-04-2011 | Исправлено: greenpc, 09:11 08-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc
    Да, вроде бы так немного лучше. Хотя лично мне вообще работать с указателями не нравится, да и на выходе компилятор выдаст примерно тоже что и с массивом. Может даже массив сумеет оптимизировать.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:03 08-04-2011
    KorolCOOL



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ можно ли в Делфи создать программу, в которой можно было бы форматировать текст. Т.е хотя бы жалкое подобие WordPada реально сделать? Чтобы можно было, к примеру, слово курсивом выделить или жирным его сделать, размер шрифта изменить...  
     
    По идее это нужно будет использовать какой-то язык разметки для текста документа? Покопался в интернете, в одном месте кому-то так и советовали, дескать используй HTML теги, а потом пусть все это дело посылается в браузер. А иные вариаты существуют? Может какую библиотеку компонентов нужно притулить?

    Всего записей: 38 | Зарегистр. 04-11-2009 | Отправлено: 15:28 09-04-2011 | Исправлено: KorolCOOL, 15:30 09-04-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KorolCOOL
    Вместе с делфи поставляется несколько стандартных демок. Откройте демку RichEdit. Это то что вам нужно?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:34 09-04-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru