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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    XPerformer



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

    Цитата:
     Указатели на методы объектов имеют длину не 4 байта, как все остальные, а 8.  

    Может, правильнее сказать, состоят из двух 4-х байтовых указателей, а то народ подумает, что речь идет о 64-битной адресации...

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 02:38 15-03-2012
    wasilissk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuraseK
    Для TNotifyEvent вообще ничего подобного не нужно было городить, он уже объявлен of object. Вам всего лишь надо было завести процедурную переменную of object, вместо Pointer-а, было бы намного нагляднее.
    А подобное решение,.. как бы у вас не всплыло через годик трудноуловимым AV или обрушением стека.

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 06:42 15-03-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wasilissk
    А как это может спасти от "трудноуловимого AV"? Процедурные переменные как-то более защищены от обрушения стека, чем обычные поинтеры? по-моему, одно и то же... надо завести привычку проверять переменные на nil перед использованием

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 12:08 15-03-2012
    wasilissk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    При вызове в DoProc, будет переменная того же типа что и в конструкторе. А так как сейчас, можно забыть что там указатель на указатель на метод с непонятно какими параметрами. Плюс работа в потоке, можно потом очень долго искать кто попортил память. Так что AV или обрушение стека еще не самое худшее.

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 12:50 15-03-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuraseK
    Кстати да. Если нет надобности в произвольных параметрах или чем то подобном, то нет смысла делать работу компилятора. Просто обьявите переменную TNotifyEvent да и дело с концом.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:35 15-03-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хочу сделать Balloon Tooltips, чтобы выскакивал из статусбара формы. Можно ли так? И реализация этого не зависит от операционной системы? Просто читал, что это пошло с помощников Офиса, и МS вроде забили на это.

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 17:10 15-03-2012 | Исправлено: Ichigo2, 17:18 15-03-2012
    YuriyRR



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Уже море готовых.  

    Цитата:
    Можно ли так? И реализация этого не зависит от операционной системы?  

    Можно, не зависит.

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 03:48 16-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые знатоки, имеется такой код:
     
    Вызывающая программа

    Код:
     
    type
      TParams = record
        Answer1, Answer2, Answer3, Answer4: PChar;
        IniString1, IniString2, IniString3, IniString4: PChar;
        Frame, IP_Address, BSCPort, MO, FaultNo: PChar;
      end;
    ...
     
    var
      Parameters: TParams;
    begin
      Answer := GetCode(@Parameters);
    ...
     

     
    DLL:

    Код:
     
    type
      TParams = record
        Answer1, Answer2, Answer3, Answer4: PChar;
        IniString1, IniString2, IniString3, IniString4: PChar;
        Frame, IP_Address, BSCPort, MO, FaultNo: PChar;
      end;
     
    type
      TCodes = record
        Codes, Units: PChar;
      end;
     
    type
      PCodes = ^TCodes;
     
    ...
    function GetCode(Parameters: TParams): PCodes;
    begin
      ShowMessage(Parameters.Answer1);
     

     
    Так вот, ShowMessage показывает погоду в Антарктиде.
    Подскажите, пожалуйста, правильное решение - как передать запись PChar'ов в DLL и обратно.
    Спасибо.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 09:53 20-03-2012 | Исправлено: Grande, 10:19 20-03-2012
    akaGM

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

    Цитата:
    function GetCode(Parameters): PCodes;
    var
      Parameters: TParams;

    ты уверен, что это формат дельфи?
     
    +
     
    как ты вызываешь GetCode()?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 10:17 20-03-2012 | Исправлено: akaGM, 10:19 20-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Виноват, в спешке писал, исправил.
     
    Answer := GetCode(@Parameters);

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 10:19 20-03-2012 | Исправлено: Grande, 10:21 20-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    ты не торопись...

    Цитата:
    function GetCode(Parameters: TParams): PCodes;  
    ...
    Answer := GetCode(@Parameters);

    опять ведь фигню написал :)
     
    DLL тоже дельфийская или чья?
     

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 10:29 20-03-2012
    Grande



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

    Цитата:
    DLL тоже дельфийская или чья?

     
    Да, разумеется дельфийская.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 10:32 20-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    так как ты там у себя зовёшь getCode()?
    +
    такой нескромный вопрос:
    ты в своих Parameters: TParams; память для разных полей выделил?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 10:56 20-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется в виду, что память следует выделять для каждого поля или сразу для всего типа Record?
    P.S. Для всего типа выделил.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 11:05 20-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    для каждого из полей

    Цитата:
    type
      TParams = record
        Answer1, Answer2, Answer3, Answer4: PChar;
        IniString1, IniString2, IniString3, IniString4: PChar;
        Frame, IP_Address, BSCPort, MO, FaultNo: PChar;
      end;
     
    var
      Parameters: TParams;
    при таком описании у тебя каждое поле -- это указатель на строку, т.е. всего 4 байта (для Вин32)
    тебе надо делать что-то типа:
     
    Parameters.Answer1 := StrNew('не хочу температуру в Антарктиде :) ');


    я уже затрахался спрашивать:
     
    как ты вызываешь getCode()?  

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 11:14 20-03-2012 | Исправлено: akaGM, 11:20 20-03-2012
    Grande



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

    Цитата:
    как ты вызываешь getCode()?  

     
    Так я ж написал: Answer := GetCode(@Parameters);
     
    Или я не понял вопроса?

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 11:20 20-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    я тоже написал:

    Цитата:
    function GetCode(Parameters: TParams): PCodes;  
    ...
    var
    Parameters: TParams;
    ...
    Answer := GetCode(@Parameters);
     
    опять ведь фигню написал :)

    это неправильный вызов, попробуй скомпилируй...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 11:22 20-03-2012 | Исправлено: akaGM, 11:23 20-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Компилится...  
    Что-то у меня уже ум за разум заходит

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 11:26 20-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    Код:
    function GetCode(Parameters: TParams): PCodes;
    begin
    ...
    end;
     
    var
      Parameters: TParams;
    begin
    ...
      Answer := GetCode(@Parameters);
    ...
    вот так компилится?
    не верю! :)
     
    поэтому спрашиваю ещё раз, но немного по-другому:
    если вот так ты вызываешь
      Answer := GetCode(@Parameters);
     
    то каков тогда заголовок у GetCode() ?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 11:59 20-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Мда... Лохонулся. Вызываю-то так: Answer := GetCode(Parameters);
    А написал по-другому. Прошу прощения.
    P.S. А с написанным мной ранее вызовом, ессно, не компилится

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 12:11 20-03-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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