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

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

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

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

ShIvADeSt



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

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

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

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Господа, помогите плиз с переводом заголовочников из WinSDK. Есть вот такой хидер: magnification.h, я перевел его так: Magnification.pas. Опыта в этом деле у меня нету, и похоже где то я ошибся. По крайней мере пример у меня пока так и не заработал.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:05 13-03-2010
    nixmagic



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую всех. Помогите, кто, чем может. Засел, как мне кажется, на ровном месте. Часто приходилось работать с базами FoxPro (DBF). Делал это через стандартный объект Table. Но вот потребовалось мне программно получить структуру таблицы. Хотел это сделать так:
    Table.FieldDefs[0].Name
    Table.FieldDefs[0].Size
    Table.FieldDefs[0].Precision
    Только вот для полей типа ftFloat возвращается значение 0 для Size и Precision. Пробовал разные способы и альтернативные компоненты, но результат тот же. Вообще какая-то ерунда. Казалось бы, простейшая задача, а ничего не получается.

    Всего записей: 7 | Зарегистр. 23-08-2008 | Отправлено: 19:36 13-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
     
    tagMAGTRANSFORM = record -> tagMAGTRANSFORM = packed record
     
    v: array[1..3, 1..3] of Single -> v: packed array[1..3, 1..3] of Single
     
    tagMAGIMAGEHEADER = record -> tagMAGIMAGEHEADER = packed record
     
    tagMAGCOLOREFFECT = record -> tagMAGCOLOREFFECT = packed record
     
    transform: array[1..5, 1..5] of Single -> transform: packed array[1..5, 1..5] of Single
     
     
    ...Кроме того - я бы в функциях MagGetXXX var-параметры заменил на const, а в функциях MagSetXXX - var-параметры заменил на out. На уровне скомпилированного кода разницы не будет - но вот с точки зрения логики программ на Pascal/Delphi оно будет явно точней.
     
    Добавлено:
    Да - и массивы индексировать стоит от 0 до n - 1, как это в C принято - чтоб потом, сверяя собственный код с msdn (например), не маяться постоянной конверсией индексов в уме.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 21:43 13-03-2010
    Frodo_Torbins

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

    Цитата:
    packed record

    В начале моего перевода указаны директивы {$ALIGN ON} и {$MINENUMSIZE 4}. Честно признаюсь, скопипастил их из Windows.pas Мне казалось, что они там нужны именно что бы не писать packed. Хотя пожалуй все равно напишу, хуже не будет.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:23 13-03-2010
    psa1974



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

    Цитата:
    Кроме того - я бы в функциях MagGetXXX var-параметры заменил на const. На уровне скомпилированного кода разницы не будет - но вот с точки зрения логики программ на Pascal/Delphi оно будет явно точней.

    Позволю себе не согласиться. использование const-параметра подразумевает возможность передачи вместо указателя nil. При использовании var-параметра передача nil в качестве указателя невозможна.
    Пример. Берем ф-цию BOOL WINAPI MagGetWindowSource(HWND hwnd, RECT *pRect);
    ее можно абсолютно точно описать двумя способами:
    а) function MagGetWindowSource(hwnd: HWND; const pRect: PRect): Boolean;
    или
    б) function MagGetWindowSource(hwnd: HWND; var pRect: TRect): Boolean;
    Исходя из смысла, ф-ция должна что-то вернуть в параметре pRect. Оба описания работоспособны, однако вариант А допускает как вызов:
    MagGetWindowSource(fhwnd, @fRect);
    так и вызов:
    MagGetWindowSource(fhwnd, nil);
    и вот в таком случае у нас случится AV, когда ф-ция MagGetWindowSource попытается что-то в nil записать.
     
    Однако бывают случаи, и часто, когда, согласно документации, ф-ция может принимать в качестве буфера не только указатель на выделенную память, но и nil (например, в схеме, когда первый раз ф-ция вызывается с nil и возвращает реально необходимую длину буфера, после чего мы выделяем нужную память и вызываем ф-цию второй раз, передав ей уже указатель на эту память). Обычно такой подход используется, когда буфер - строка символов. В таком случае параметр необходимо описывать именно как const-параметр.
    Поэтому надо тщательно подходить к вопросу, какой тип выходного параметра использовать.
     
    Насчет
    Цитата:
    а в функциях MagSetXXX - var-параметры заменил на out
    - без проблем, out - это тот же var, только не инициализированный на входе в ф-цию, хотя разницу между var и out знает только компилятор Дельфи. Для вызываемой внешней ф-ции между var и out разницы нет. Да и компилятор Дельфи такие параметры по-разному воспринимает только при передаче в качестве параметров динамических переменных - строк, массивов и при вызове методов интерфейсов. В остальных случаях разница между ними чисто эстетическая

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 00:23 14-03-2010 | Исправлено: psa1974, 02:45 14-03-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    Хм, а по мне этот самый transform[5][5] будет уже отсчитываться на делфи с нуля -> transform: packed array [0..4, 0..4] of Single оно вроде так идет если не ошибаюсь.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 02:11 14-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
     
    Я в курсе таких сособенностей. Если функцуия может как-то особенно реагировать на nil вместо параметра - то параметр и надо передавать как указатель, ни const, ни var, ни out не подойдут. В случае же, когда передача nil'а не имеет смысла - то const в случае неизменяемости параметра, var в случае изменяемости и out - в случае только получения значения в этот параметр. Это называется автодокументацией кода
     
    Добавлено:
    Maks150988
     
    У вопрошавшего явно написано: v: array[1..3, 1..3] of Single и transform: array[1..5, 1..5] of Single.
     
    Добавлено:
    Frodo_Torbins
     
    Директива {$ALIGN ON} как раз говорит, что выравнивание нужно - а модификатор packed ее отменяет.
     
    ...Я вообще предпочитаю никогда не менять параметры выравнивания директивами - с ними пробьлем больше получается, чем они решают. К примеру - захотелось перенести кусок кода с описаниями типов в другой модуль, про директивы забыли - получили массу трудноотлавливаемых ошибок на ровном месте. Поэтому - лучше явно указывать, где оно packed (в основном - либо перевод C-шных хидеров, либо передача блоков памяти другому приложению).

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 11:12 14-03-2010
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    А я, вообще, чего-то не заметил CALLBACK. Может переименовано, либо не существенно, либо проглядел.
     
    Добавлено:

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 14:14 14-03-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    А, все, заметил ваше добавленное предложение где вы как раз пишите про отсчет с нуля в массиве.
    Frodo_Torbins
    Мне кажется что Float сишный это Double, а не Single. Вот. Но это предположение всего-лишь.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:01 14-03-2010
    psa1974



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

    Цитата:
    В случае же, когда передача nil'а не имеет смысла - то const в случае неизменяемости параметра, var в случае изменяемости

    Цитата:
    Кроме того - я бы в функциях MagGetXXX var-параметры заменил на const.

    Раз мы тут все в курсе таких особенностей, то давай все-таки будем последовательны и не будем советовать чушь - ф-ции Get всегда что-то возвращают в своих "указательных" параметрах, т.е. параметр - как раз изменяемый по определению, т.е. var. Единственный вариант сделать его const и при этом в нем что-то вернуть - описать как указатель, о чем я выше и написал и показал, на что при этом можно напороться. В любом случае, Frodo_Torbins, вероятно, эта информация будет полезна, хотя в своем варианте он сделал в данном случае все верно и без наших советов .
     
    Ну и про индексацию массивов - однозначно с нуля.
    Цитата:
    У вопрошавшего явно написано
    - на то он и вопрошает, что не уверен в верности своего результата и если в чем-то он ошибается, его надо поправить а не соглашаться.

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 17:03 14-03-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем большое спасибо за помощь, большую часть замечаний я учел. И самое главное - апишный пример заработал. Теперь буду выяснять почему не работает VCL-ный.
    delover
    Куда девать этот CALLBACK, и для чего он вообще нужен я так и не понял. Похоже это просто определение процедурного типа.
    Maks150988
    На StackOverflow читал, что Float эквивалентен Single.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:05 14-03-2010
    vetal71



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

    Цитата:
    Приветствую всех. Помогите, кто, чем может. Засел, как мне кажется, на ровном месте. Часто приходилось работать с базами FoxPro (DBF). Делал это через стандартный объект Table. Но вот потребовалось мне программно получить структуру таблицы. Хотел это сделать так:  
    Table.FieldDefs[0].Name  
    Table.FieldDefs[0].Size  
    Table.FieldDefs[0].Precision  
    Только вот для полей типа ftFloat возвращается значение 0 для Size и Precision. Пробовал разные способы и альтернативные компоненты, но результат тот же. Вообще какая-то ерунда. Казалось бы, простейшая задача, а ничего не получается.

     
    присоединяюсь к просьбе nixmagic. Может кто-нибудь сталкивался с проблемой
     
     
     

    Всего записей: 299 | Зарегистр. 08-09-2008 | Отправлено: 17:04 15-03-2010
    nixmagic



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нашел в компоненте Apollo:
    ApolloTable.CopyStructureExtended('structure.dbf')
    Сохраняет структуру таблицы в отдельный dbf файл, тип поля, его размерность и точность. Но это какое-то извращение и лишние действия. Сам же объект ApolloTable, как и родной Table, упорно не хочет показывать параметры полей через FieldDefs.

    Всего записей: 7 | Зарегистр. 23-08-2008 | Отправлено: 18:53 15-03-2010
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Ф топку его, ф топку. Ещё вариант переименовать всю структуру. Ещё вариант оформлять стубы в автодокументированном коде, но как вариант - это вовсе не для меня бы вариант. В некоторых текстах видел, что по хорошему пишут либо заглушку, либо нечто более похожее на то, что должно быть в функции обратного вызова. Иногда как оформить, чтобы слинковалось. А может когда нибудь и в паскале увидим?
     
    Добавлено:
    Чем делегат не вариант? Кроме положительных эмоций из точки нэт я ещё и новую командную строку увидел.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:40 15-03-2010
    Man Without Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как dbchart перерисовать. Когда меняю значения, график перерисовывается, но если значения больше предыдущих линии вылазят за границы графика. Пробовал       dbchart1.Refresh; и  dbchart1.AutoRepaint := true;
    и т.п. не помогает. Заранее спасибо.

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 09:41 16-03-2010
    greenpc

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

    Цитата:
    Подскажите как dbchart перерисовать. Когда меняю значения, график перерисовывается
    так в чем же вопрос
    а если нужно изменить масштаб то нажимаем F1 в среде и получаем

    Цитата:
    TChartAxis component
    Declaration
    property Automatic : Boolean;
    Description
    If Axis.Automatic property is True, then the Maximum and Minimum values for the Axis will be calculated with all Axis dependent Series.


    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:01 16-03-2010
    AviDen



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

    Цитата:
    Приветствую всех. Помогите, кто, чем может. Засел, как мне кажется, на ровном месте. Часто приходилось работать с базами FoxPro (DBF). Делал это через стандартный объект Table. Но вот потребовалось мне программно получить структуру таблицы. Хотел это сделать так:  
    Table.FieldDefs[0].Name  
    Table.FieldDefs[0].Size  
    Table.FieldDefs[0].Precision  
    Только вот для полей типа ftFloat возвращается значение 0 для Size и Precision. Пробовал разные способы и альтернативные компоненты, но результат тот же. Вообще какая-то ерунда. Казалось бы, простейшая задача, а ничего не получается.

     
    FoxPro я уже не помню, но если тип Float там тот же, что и в Delphi, то он не может иметь ни размера, ни точности, т.к. это десятичный тип с плавающей запятой, т.е., распределение имеющихся разрядов под целую и дробную часть производится динамически, в зависимости от конкретного числа. Всё, что можно о нём сказать заранее - это максимальное кол-во значащих цифр мантиссы.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 13:20 16-03-2010
    greenpc

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen, nixmagic, vetal71
    был такой компонент
    Цитата:
    КОМПОНЕНТ  TDBF  Version 1.11  -  14.06.2004             Freeware         }
    {-----------------------------------------------------------------------------}
    {   Copyright  2002-2004 Брусникин И.В.                     majar@nm.ru    

    пробуйте. именно им обрабатывал *.dbf . понравился больше чем apollo и им подобные

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:44 16-03-2010
    mvictor71



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen, nixmagic, vetal71
    или Halcyon. Для работы с dbf от VFP мне подошел только он.
    Правда, это варез

    Всего записей: 289 | Зарегистр. 15-02-2005 | Отправлено: 14:04 16-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    greenpc, mvictor71 спасибо, мне как-то без надобности ))

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 14:51 16-03-2010
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru