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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ESV1987
    Вы напросились Сейчас я буду бомбардировать ваш мозг сильно сложными вещами:
    Для начала стоит узнать, как массивы устроены внутри. Вот статья: http://www.transl-gunsmoker.ru/2009/09/blog-post.html По идее вам нужен только раздел "Ссылки (References)", но лучше прочтите всю.
    Далее про передачу массивов в подпрограммы: http://www.transl-gunsmoker.ru/2009/09/of-const.html
    По поводу специализированных классов: в Delphi2009 и выше есть так называемые дженерики: http://keeper89.blogspot.com/2011/07/delphi.html Я думаю, что они очень сильно могли бы упростить вам жизнь. Если последние версии делфи вам не доступны по причине платности, то можно заменить их свободным Lazarusом.

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 10:57 04-02-2012 | Исправлено: Frodo_Torbins, 11:02 04-02-2012
    ESV1987

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
     
    1. Если честно, я так и делал, возможно, только перед входным динамическим массивом, который в процедуре не меняется, я не ставил var, а ставил его только перед выходным.
     
    (... x: array of double, var y: array of double ...);  
     
    Проверю на буднях, но по-моему были с таким подходом какие-то проблемы.
     
    2. Это я понимаю, что можно на каждом шаге увеличивать размерность. Но когда массив очень огромный делфи может выдавать сообщение о переполнении памяти (по-моему "out of memory")...
     
     
    Frodo_Torbins
    Спасибо! Буду читать, позже отпишусь, что получилось.

    Всего записей: 56 | Зарегистр. 31-03-2007 | Отправлено: 11:23 04-02-2012 | Исправлено: ESV1987, 11:26 04-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ESV1987
    Перед параметром в функции можно не указывать ничего, указывать const или var. Если не указано ничего, то это передача по значению - каждый раз перед вызовом функции массив будет копироваться. Если указан const или var, то это передача по ссылке. То есть никакого копирования данных не произойдет. Единственная разница между const и var в том, что в случае с const компилятор не позволит вам менять переданное значение. В более новых версиях делфи можно еще использовать out, он аналогичен var, но компилятор запрещает читать из него значения.
    Отсюда вывод: если работаете с большими массивами, то нужно использовать const для входных параметров, и var для выходных.
    Теперь по поводу увеличения размерности. Проблемы тут возникают в большей степени из-за фрагментации памяти. Проблема фрагментации решается очень просто: нужно увеличивать размер массива не на одну единицу, а сразу на 100, и в отдельной переменной хранить сколько реально используется. Можно делать это самому, а можно поручить дженерику TList<T> или менеджеру памяти FastMM4. Последний кстати работает и в старых делфях, а в новых вообще используется по умолчанию.

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 11:52 04-02-2012
    akaGM

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

    Цитата:
    Но когда массив очень огромный делфи может выдавать сообщение о переполнении памяти (по-моему "out of memory")...
    огромный -- это сколько, терабайты?
    может тогда надо пересматривать логику программы?
    ну или тупо сбрасывать уже посчитанное на диск, и высвобождать память под новую порцию счёта?
     
    и я бы не лез в новомодные языковые расширения типа дженериков без уверенного владения базовыми основами...

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 13:06 04-02-2012 | Исправлено: akaGM, 13:07 04-02-2012
    ESV1987

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    у меня кстати ещё один вопрос вспомнился:
    Допустим у нас есть несколько однотипных записей (record), у каждой из которых есть поле T:double; Так вот, если написать:
     
    with rec1, rec2, rec3, rec4, rec5, rec6 do T:=198888;
     
    Поле T почему-то меняется только у одной записи (по-моему, первой, но точно я сейчас не скажу). В чём тут проблема?

    Всего записей: 56 | Зарегистр. 31-03-2007 | Отправлено: 22:53 11-02-2012
    Frodo_Torbins

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

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 23:46 11-02-2012
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    История такая. Имеется некоторый старый агрегат который в процессе своей работы распечатывал на принтере пошаговый рапорт (время начала/конца, номинальные/фактические значения, сообщения об ошибках и т.п.). Принтер накрылся. Совсем. Ремонту не подлежит. К кабелю принтера был подключен компьютер и на скорую руку написана программа, которая выводит рапорт на экран. Программа работает, но есть одно но...Шрифт которым она пишет очень мелкий (размер 8). Можно изменить размер, есть диалог выбора, но он почему-то не срабатывает. Кто в теме, поправьте код пожайлуста. Сам я в Delphi полный ноль, так юзер только. Выкладываю папку целиком, так как программа(ExCom.exe) запускается из неё и в ней ещё есть файлы х.з. имеющие отношение к ней или нет. Сделал скрин на нём всё видно. Папка с программой

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 02:41 12-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster
    в архиве не всё...
    например, там не хватает библиотек, начинающихся с Adxxx (AdPort) и других, так что не скомпилировать...
     
    но ты попробуй вот что сделать:
    в файле ExCom0.pas в самом его конце найди след. блок

    Код:
    procedure TOsnova.Fontdialog2Click(Sender: TObject);
    begin
    if fontdialog1.execute then
        begin
    1    //memo1.Font.Name:=fontdialog1.Font.Name;
    2    // memo1.Font.Name:='arial';
    3    //memo1.Font.Size:=fontdialog1.Font.Size;
        end;
    end;
    и убери комментарий в 1-ой и 3-ей строчке, а если тебе наплевать, что там будет жёстко вбит фонт, то тогда раскомментируй 2 и 3

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 05:13 12-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster
    Предлагаю пока обходной вариант: Панель управления -> Экран -> 125% (можно 150%).

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 11:54 12-02-2012
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Большое спасибо за быстрый ответ. Буду на работе только в среду. Объязательно попробую ваше решение. О результате отпишу.
     
    Frodo_Torbins
    Спасибо. Такое решение не подходит даже временно, т.к. на компьютере запущены две программы (не указал об этом ранее), одна из них - ExCom - и обе выводят информацию на экран одновременно, каждая в своей половине. Изменения затронут оба окна на экране, что недопустимо.

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 13:39 12-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster
    Тогда пробуйте так: Reader.rar. Только я сразу предупреждаю, что не имею ни малейшего понятия как оно будет работать, и будет ли вообще, т к используется другая версия компонент для работы с COM-портом.

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 13:54 12-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster,
    Frodo_Torbins
    ну не знаю...
    я не такой специалист в дельфях как вы, но мне кажется, что на все теже 125% (можно 150%), кот. вы предлагаете -- прав я, так как используемый сейчас в программе выбор фонта _не делает ни хрена_ чтобы при этом ни выбиралось...

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 14:34 12-02-2012 | Исправлено: akaGM, 14:36 12-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Да, не делал. Но если программу нельзя было бы перекомпилировать, то такой вариант тоже мог прокатить. Там ведь стояло "memo1.Font.size:= 8", так вот оно конвертируется в высоту в пикселях с учетом DPI. А DPI как раз и настраивается этим "Панель управления -> Экран -> 125%". То есть с помощью этой настройки можно было бы увеличить шрифт в этой проге, попутно увеличив шрифт во всей системе. Вот только jr13ster уже написал, что такой вариант ему не подходит.

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 14:56 12-02-2012
    akaGM

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

    Цитата:
    нельзя было бы перекомпилировать
    это я вообще-то о себе, а если нельзя ему, то зачем тогда спрашивать, чтобы экзюк раскрякать?
     

    Цитата:
    Экран -> 125%". То есть с помощью этой настройки можно было бы увеличить шрифт в этой проге, попутно увеличив шрифт во всей системе. Вот только jr13ster уже написал, что такой вариант ему не подходит
    мне тоже :)
    из-за одной программы во всей системе? -- не наш метод, сейчас лучше посоветую ему воспользоваться лупой, можно экранной, можно настоящей :)

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 15:05 12-02-2012
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Ваш вариант "забрал", в среду отпишусь прокатило или как...

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 16:45 12-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster
    я тоже посмотрел, переписан тот же TOsnova.Fontdialog2Click...
     
    хорошая идея сохранять его в конфиге, а если при этом есть возможность его загружать чтобы не переустанавливать каждый раз -- тогда вообще всё в шоколаде...
     
    ---
    есть...
    не увидел с первого раза, тогда бери вариант Frodo_Torbins не задумываясь, и не забудь его поблагодарить :)

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 16:56 12-02-2012 | Исправлено: akaGM, 17:06 12-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Да, откомпилить в конце концов удалось, так что поправить код не составило большого труда. Но остается вопрос, правильно ли я выбрал версию компоненты для работы с COM-портом.

    Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 17:04 12-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    "всё будет хорошо" :)

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 17:29 12-02-2012
    akaGM

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

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 21:17 12-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а вот у меня такая задачка...
     
    есть здоровенный файл common.inc такого формата:
    Код:
    //prototypes
    function f1();
    function f2();
    function f3();
     
    //implementation
    function f1();
    begin
    end;
     
    function f2();
    begin
    end;
     
    function f3();
    begin
    end;

     
    что-то не получается у меня ограничиться им одним для включения и в интерфейсную и в реализационную-части юнита вот таким образом
    Код:
    interface
     
    {$I common.inc}
     
    implementation
     
    {$I common.inc}
     
    end.
    приходится разбивать на два...
    поковырялся, поковырялся с ifdef'ами, так и не смог пока...
     
    -D для командной строки не использовать...
     


    полезно задавать вопросы...
    пока его здесь письменно :) формулировал, то вроде нашёл одно решение:
    Код:
    interface
    {$DEFINE COMMON_INTERFACE}
    {$I common.inc}
    {$UNDEF COMMON_INTERFACE}
     
    implementation
    {$DEFINE COMMON_IMPLEMENTATION}
    {$I common.inc}
    {$UNDEF COMMON_IMPLEMENTATION}
    end.

     
    вопросы рулят! :)

    Всего записей: 24844 | Зарегистр. 06-12-2002 | Отправлено: 17:45 13-02-2012 | Исправлено: akaGM, 17:52 13-02-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