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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter, спасибо огромное, действительно то что надо, век живи век учись

    Всего записей: 432 | Зарегистр. 03-10-2007 | Отправлено: 18:58 07-08-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем.
    Нужна ваша помощь, я уже весь измучился.
    В одном месте никак не хочет работать функция pos. Вот кусок кода

    Код:
     
    for i := 0 to length(rec) do
    begin
      if  pos(_tag,rec[i].tag)<>0 then
          with form1.StringGrid1 do
          begin
    ...

    В этом месте ни в какую. Pos всегда выдает 0. rec[i].tag это массив записей, где каждое поле - строка. Смотрел что в переменных в этот момент - все правильно, то есть должно выдать хоть что-то. Как будто pos не может принять эти строчки. AnsiPos тоже не работает.

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 22:09 12-08-2012
    XPerformer



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

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 22:12 12-08-2012 | Исправлено: XPerformer, 22:12 12-08-2012
    idiMAN

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Если rec - массив, то правильние будет писать  

    Код:
     
    for i := Low(rec) to High(rec) do  
     

    если же индексация массива у Вас начинается с нуля, то и в этом случае будет правильным

    Код:
     
    for i := 0 to length(rec)-1 do  
     

     
    По указанному фрагменту кода нельзя понять, какие типы данных у Ваших переменных, меняется ли переменная цикла i внутри цикла? И если Вы уверены, что  должен быть pos <> 0, попробуйте сравнить напрямую значения переменных, возможно они хоть и выглядят одинаково, но написаны по-разному. К примеру в одном русская буква "с", а в другом английская и т.п.

    Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 12:08 13-08-2012 | Исправлено: idiMAN, 12:08 13-08-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот скрин переменных на строчке pos
       
    Переменные string, объявлены глобально. Делал через локальные - тоже не помогает.

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 21:08 13-08-2012 | Исправлено: Ichigo2, 21:10 13-08-2012
    idiMAN

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Ну всё правильно твоя программа работает!!!
     
    Судя по твоему скриншоту pos(_tag,rec[i].tag)=0, так и должно быть, ведь подстрока _tag не будет найдена в строке rec[i].tag
     
    Обрати внимание на концевой пробел в _tag, у тебя после буквы "н" в слове "один" стоит пробел. Его на скриншоте отчётливо видно.
    Т.е. подстрока "один " не содержится в строке "*один*два*", т.е pos=0

    Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 23:06 13-08-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    idiMAN, заработало!11
    Вы просто гений, уважаемый! Глаз-алмаз!
    Пропустил _tag через TrimRight и pos выдает заветную двоечку.
    Добра вам.
     

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 23:17 13-08-2012
    eddoc



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

    Цитата:
    Пропустил _tag через TrimRight

     что мешает использовать более универсальную функцию Trim, к тому же и писАть короче

    Всего записей: 328 | Зарегистр. 25-11-2007 | Отправлено: 08:44 14-08-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет. Кому не сложно и кто "собаку съел" на массивах гляньте плиз мой небольшой демо пример. Я сделал функции по работе с массивом но не уверен что все корректно с освобождение памяти при удалении элементов. Ну итак пройдитесь по функциям и скажите что где можно упростить или оптимизировать. Образаюсь еще и потому что при изменении элемента массива после нескольких раз программы тупо вылетает. С отладчиком все равно не умею работать так что беспонтово глядеть внего приходится своими знаниями стараться избегать глупых ошибок при работе с указателями.
     
    MyArrayTest.zip

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    В CopyArrayItem написан бред. А в UpdateArrayItem нужна оптимизация.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:51 16-08-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    А как правильнее в CopyArrayItem хотя бы? =)

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 21:16 16-08-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Все сильно зависит от логики, которую нужно реализовать. Если строки всегда должны копироваться, то просто добавить проверку на нуль в SrcInfo.pszText. Но какой тогда смысл возится с такими указателями, если точно такой же результат можно получить, применив WideString? Если нужно копировать указатель, то тогда непонятно когда можно удалять строку. Хоть счетчик ссылок добавляй.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:10 16-08-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Да, мненужно, чтобы строки всегда копировались. Где добавить проверку? Перед CopyMemory или AllocArrayItem? А может сразу проверить на nil и выполнить их после успешности проверки?

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:38 16-08-2012
    FalseMaster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Обращаюсь к тем, кто на данный момент пользуется D2007 с последним хотфиксом (Апрель 2008), устанавливающимся из запароленного архива "RADStudio2007apr08hotfix.exe". Мне очень нужны обновлённые до версии 11.0.2963.11001 файлы DCC32.exe и DCC100.dll. Если на форуме есть нежадные люди, не страдающие копирофилией, скиньте пожалуйста мне их на мыло (falsemaster@rambler.ru) или залейте на какой-нибудь обменник. Они в zip'е всего метр весят.

    Всего записей: 47 | Зарегистр. 02-05-2009 | Отправлено: 05:20 17-08-2012
    idiMAN

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

    Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 07:55 17-08-2012
    FalseMaster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Извиняюсь за оффтопик, но если чё, модер пост может кильнуть. Просто хочу выразить благодарность. idiMAN, спасибо огромное, ты меня спас от нервного срыва - я уже третьи сутки тщетно прошу эти файлики на разных форумах - дохлый номер, никто не даёт. Видимо в рунете стало очень много уродов на квадратный сантиметр. ... В общем, спасибо ещё раз и всего наилучшего.

    Всего записей: 47 | Зарегистр. 02-05-2009 | Отправлено: 08:33 17-08-2012
    idiMAN

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    FalseMaster
    Я думаю большинство просто сидит на старших версиях...

    Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 09:23 17-08-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Ну если всегда копироватся должно, то там более менее нормально. А проверку SrcInfo.pszText добавьте рядом с DestInfo.pszText.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:09 17-08-2012
    Maks150988



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

    Код:
    function AllocArrayItem(var ptrInfo: MY_INFO_EX): Boolean;
    begin
      GetMem(ptrInfo.pszText, ptrInfo.cchTextMax);
      Result := ptrInfo.pszText <> nil;
    end;
     
    procedure CopyArrayItem(var DestInfo: MY_INFO_EX; const SrcInfo: MY_INFO_EX);
    var
      bRet: Boolean;
    begin
      CopyMemory(@DestInfo, @SrcInfo, SizeOf(MY_INFO_EX));
      if (SrcInfo.pszText <> nil) then
      begin
        bRet := AllocArrayItem(DestInfo);
        if bRet then
          lstrcpynW(DestInfo.pszText, SrcInfo.pszText, DestInfo.cchTextMax);
      end;
    end;
     

     
    Так? =)
     
    А что насчет неправильности UpdateArrayItem?

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:09 17-08-2012 | Исправлено: Maks150988, 17:19 17-08-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Вроде так. А в UpdateArrayItem у вас куча ненужных перераспределений памяти благодаря DeleteArrayItem и InsertArrayItem. От них нужно избавится.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:39 17-08-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