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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    Так в том то и прикол что регистр совпадал. Да даже просто начал строки с цифрами сверять, а оно не совпадало, ну ладно бы текст еще.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:22 08-04-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    Быть не может. Вы где-то ошиблись, видимо. Только что проверил (удостоверится, що з глузду не зъихав), Delphi 2007:
     

    Код:
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      s1, s2: WideString;
    begin
      s1 := 'аБв';
      s2 := 'аБв';
     
      if s1 = s2 then
        Caption := '!';
    end;
     

     
    , в заголовок формы выводит "!" (если регистр символа в какой-то из строк поменять - остается "Form1"). При этом - Pointer(s1) <> Pointer(s2), то есть, это именно что _разные_ строки.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 00:15 09-04-2010 | Исправлено: Odysseos, 00:18 09-04-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
     
    Вот моя программа: Ссылка
     
    Возможно и ошибся, но я проверял на MessageBox, где смотрел все что появляется, предварительно поместив сраниваемую строку между символами тире, дабы убедиться а нет ли пробелов. Потом проверял на цифрах, результат тот же.
     
    Код находится в модуле D_FinsWind.pas:

    Код:
    if (lstrcmpiW(@ObjectName[1], @pszEntry[1]) = 0) then

    Соответственно ранее код был такой:

    Код:
    if (ObjectName = pszEntry) then

     
    Может я действительно где-то ошибся.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 08:58 09-04-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988, я код по ссылке не смотрел (времени нет), но исходя из общепринятого стиля именования переменных (ведь Вы же всё из каких-то сишных/апишных примеров берёте, как я вижу) pszEntry - это указатель на некое число (скорее всего размер чего-либо). Сравнивать имя некоторого объекта с указателем на число - ну, сами понимаете...
     
    А вообще, строки обычным оператором сравнения сравнивать нельзя никогда, исключительно функциями WideSameText/WideSameStr/WideCompareText/WideCompareStr, как и написал Odysseos. Для Ansi-строк также есть соотв. аналоги с префиксом Ansi.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 10:07 09-04-2010 | Исправлено: AviDen, 10:08 09-04-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
    ObjectName и pszEntry это WideString.
     
    Ну теперь буду знать, просто практически всегда на форумах попадаются такие вот сравнения, я как-то не задумывался об этом.
     
    Odysseos
     
    Не знаю как насчет быстроты вашего рабочего кода, но я пока сделал так, впринципе если я ничего не попутал в коде, размер буфера будет увеличиваться до тех пор, пока разница будет равна 2.
     

    Код:
    function IniFileProfileExistsW(pszFileName, pszAppName: WideString): Boolean;
    var
      pszBuf : WideString;
      workBuf: LPWSTR;
      nSize  : DWORD;
      dwRet  : DWORD;
    begin
     
      Result := FALSE;
     
      nSize := MAX_PATH;
      dwRet := 0;
      SetLength(pszBuf, nSize);
     
      repeat
        Inc(nSize);
        SetLength(pszBuf, nSize);
        dwRet := GetPrivateProfileSectionNamesW(LPWSTR(pszBuf), nSize, LPWSTR(pszFileName));
      until
        (nSize - dwRet) <> 2;
     
      workBuf := LPWSTR(pszBuf);
     
      while (workBuf <> nil) and (workBuf^ <> #0) do
      begin
        if (lstrcmpiW(LPWSTR(pszAppName), workBuf) = 0) then
        begin
          Result := TRUE;
          Break;
        end;
        Inc(workBuf, lstrlenW(workBuf) + 1);
      end;
     
    end;

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 11:38 09-04-2010 | Исправлено: Maks150988, 14:05 09-04-2010
    Odysseos



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


    Код:
     
        Inc(nSize);
        SetLength(pszBuf, nSize);
        dwRet := GetPrivateProfileSectionNamesW(LPWSTR(pszBuf), nSize, LPWSTR(pszFileName));
     


     
    Я правильно понимаю, что если суммарная длина заголовков всех секций в ini-файле будет, например, MAX_PATH + 200, то функцию GetPrivateProfileSectionNamesW Вы вызовете 1 + 200 раз?

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 16:31 09-04-2010 | Исправлено: Odysseos, 16:32 09-04-2010
    apnss

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

    Цитата:
    Да мы вообще для проекта написали свой widestring-аналог TIniFile и не паримся... А то винапишные танцы с бубном по каждому мелкому поводу как-то не прельщают.  

     
    на д2010  свой компонент не тестили?  
     
    я тут был пару своих проектиков решил портануть. в них как-раз используются ДЛЛки с обработкой widestring'ов.  вроде все работает но память утекает непонятно куда . пришлось на время перенос отложить.  
     

    Всего записей: 708 | Зарегистр. 26-02-2002 | Отправлено: 16:34 09-04-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    apnss, нет, у нас проект на D7 и будет на ней ещё оооочень долго
    Для борьбы с утечками FastMM используете? Попробуйте, крайне рекомендую.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 17:37 09-04-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    А я не знаю как оптимальнее, у вас тоже цикл идет, только вначале вы выделяете буфер длинной со строку + BUF_SIZE. Можно от балды сразу 65535 ухнуть.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:54 09-04-2010
    apnss

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
     
    FastMM юзаем, но он кстати толком ничего не показывает. ДЛЛки шли отдельным проектом , там активно юзаеются калбэки и ракировки апликейшина.  
     
    скорее всего по Д2010 прийдется полностью менять концепцию и переписывать все  с нуля .  
     

    Всего записей: 708 | Зарегистр. 26-02-2002 | Отправлено: 18:45 09-04-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    вначале вы выделяете буфер длинной со строку + BUF_SIZE
     
    Я его не вначале выделяю длиной со строку, я перед каждой попыткой чтения увеличиваю буфер на BUF_SIZE. То есть - первый раз пытаюсь прочитать BUF_SIZE, не хватило - пытаюсь прочитать 2 * BUF_SIZE, не получилось - 3 * BUF_SIZE, и так пока не влезет.
     
    Можно вообще на каждом шаге удваивать текущую длину буфера - это еще быстрее будет, но затратнее по памяти - тут надо баланс искать.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 19:11 09-04-2010 | Исправлено: Odysseos, 19:30 09-04-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    apnss, гм, что значит - толком ничего не показывает? По каждой утечке в логе отражён стек-трейс до строки кода, где эта область памяти была выделена, с именами модулей/функций/процедур и номерами строк + содержание этого самого блока. И то, и другое в 90% случаев помогает определить реальный источник утечки.

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 19:34 09-04-2010
    Maks150988



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

    Код:
      repeat
        dwRet := GetPrivateProfileSectionNamesW(LPWSTR(pszBuf), nSize, LPWSTR(pszFileName));
        if ((nSize - dwRet) = 2) then
        begin
          Inc(nSize, MAX_PATH);
          SetLength(pszBuf, nSize);
        end;
      until
        (nSize - dwRet) <> 2;
     

    Ну и следом подкорректируем размер буфера.

    Код:
    SetLength(pszBuf, dwRet + 1);

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:37 09-04-2010 | Исправлено: Maks150988, 19:44 09-04-2010
    apnss

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
     
    я знаю как юзать FastMM в фулдебаг режиме  
     

    Цитата:
    apnss, гм, что значит - толком ничего не показывает?

     
    то и значит - лог пустой (я имею в виду утечки), но при работе приложения скомпиленного на  д2010 за полдня "уходит"  500метров ОЗУ в никуда.  
     
    при работе приложения скомпиленного в д2007  такого не наблюдается - прога "крутится"  неделями с теми же ДЛЛками.    
     
    проблема еще в том, что последних  исходников ДЛЛек у меня нет и взять их не у кого. это вообще отдельный проект был  
     
    вот такие пироги    
     
    ПыСы: нада завязывать  д2010 тут  офтоп

    Всего записей: 708 | Зарегистр. 26-02-2002 | Отправлено: 20:30 09-04-2010 | Исправлено: apnss, 20:33 09-04-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Odysseos
    Меня тут долго не было... Проблемы-с. Продолжая дискуссию о нахождении всех возможных вариантов определенного аккорда на грифе гитары. Ограничения простые - выбирается аккорд, допустим Dm (ре-минор), находятся ноты, входящие в данный аккорд - F(фа), A(ля), С (до). Это все легко. Вот дальше начинаются сложности. Надо найти все возможные сочетания этих трех нот на грифе гитары (то есть задействовано от 3-ех до 6-ти струн). Бас роли не играет. Ноты могут идти в любом произвольном порядке. Аккорд останется все равно тем же. Допустимы промежуточные незвучащие струны, так же как и наоборот, открытые струны. Главное, чтобы не звучали ноты НЕ входящие в аккорд. Невозможно, также, нахождение двух нот на ОДНОЙ струне в готовом аккорде. На гитаре всегда будет звучать только одна нота на каждой отдельно взятой струне. То есть, 1 струна <= 1 нота, но не обязательно использовать все струны. Допустимы удвоения нот в любых вариантах - FFAADD, DAAF, DFAFA и.т.д. Предел для растяжки пальцев можно взять в 4 лада (это не принципиально). Получаем участок грифа гитары 6 (струн) на 4 (лада) для каждой позиции (позиция - положение указательного пальца при взятии аккорда). Вот для этого участка надо найти все возможные варианты построения аккорда (в данном примере - Dm, ре-минор). Надо еще помнить, что нужны и те варианты, когда нота подходящая есть, но возможен вариант и с ее пропуском, так как можно ее получить на другой струне.  
    Преимущества в басах (допустим для тоники - Ре) нет. Задача не абстрактная. Если найду механизм как это осуществить, то все остальное уже довольно просто. Залез даже в теорию графов с их обходом, но что-то очень сложно. Тут другая идея - ведь все возможные аккорды можно описать схемой вида - 00 01 00 02 03 XX (аккорд С). У меня уже есть программа, в которой пользователь проставляя ноты аккорда (точки на грифе) узнает, что это за тип аккорда, к тому же автоматом пишется эта буквенно цифровая схема в одну строку. Так вот идея в том чтобы перебрать все варианты в каждом элементе строки (от 00 до 04) пока программа не выдаст, что это аккорд Dm. Но как организовать такой цикл? И сущает что будет слишком много "холостого" хода. Ведь найти ноты на грифе которые заведомо соответствуют нотам аккорда не сложно, хочется "плясать" от этого. Вообщем, не знаю как подступиться. Если кого интересует проблема - пишите на мыло тоже. Буду рад если сможете как-то помочь.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 23:27 10-04-2010 | Исправлено: Bonivur, 23:44 10-04-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
     
    Мдя... Чего уж сложного-то?
     
    Подробнее...
     
    Ноты ищутся "вниз" по струне (по повышению тона), если нота еще не появлялась в аккорде - то сразу берется она, иначе - ищется следующая в пределах заданной дистанции и т.д.; если все ноты со струны уже были в аккорде - берется первая найденная (самая близкая к начальной позиции).

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 00:48 11-04-2010
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги, помогите составить хранимую процедуру для Firebird. Нужно чтобы сервер возвращал набор данных при изменении значения символьного поля в главной таблице у связанной с ней по символьному полю. Использую Delphi 2007 и IBDAC.

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 03:27 11-04-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EugeneBoss3
     
    Во-первых - для Firebird'а есть отдельная тема.
     
    А во-вторых - объясните, плз, понятней.

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    кто-нибудь имеет опыт создания некоего простого аналога векторного редактора или автокада или скорее визио...
    надо визуализировать план помещений (возможно даже в 3d) с движущимися объектами...
    или копать в сторону opengl или directx или может даже xna ?
    или искать библиотеки под delphi (желательно бесплатные) ?

    Всего записей: 2934 | Зарегистр. 10-04-2003 | Отправлено: 08:22 11-04-2010
    aspis

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    svs123456789
    Тоже возникала аналогичная задача визуализации плана. За основу взял Контейнер визуальных объектов

    Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 09:45 11-04-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