Задать вопрос
  • Как реализовать такую штуку(на картинке)?

    @Mercury13
    Программист на «си с крестами» и не только
    Пара из TEdit и TUpDown.
    Ответ написан
    Комментировать
  • Как осуществляется верификация компьютерных ролевых игр?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    У меня есть одна идея. Построим несколько конечных автоматов. Для каждой реплики задаются:
    — автомат (ноль или один);
    — набор состояний, в которых реплика видна (одно или несколько; имеет смысл, если автомат задан);
    — куда автомат переключить;
    — какие-то дополнительные условия, зависящие от игры (например, уровень интеллекта или разговора);
    — ссылка на функцию-спецусловие (таковых должны быть пара десятков на весь большой Fallout).
    Например, для четвёрки «Мордино/Сальваторе/Бишоп/Райт» состояний будет пять: ни с кем и с какой-то из семей. Тогда достаточно увидеть, что из Мордино нельзя перейти ни в какое другое, вот тебе и доказательство: ты член банды Мордино на всю жизнь. А если какая-то линия диалога включает спецусловия или два автомата одновременно — проверялка выведет сообщение: тут будь настороже.

    У некоторых автоматов может быть одно или несколько «конечных» состояний — можно наладить иерархию автоматов. Автоматы верхнего уровня могут требовать, чтобы нижестоящие были в конечном состоянии, но не наоборот.
    Ответ написан
    Комментировать
  • Subversion и флоппинет: что делать, когда пропал интернет?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Решение нашёл.
    Revert (возвращаемся к последнему сохранённому состоянию, теряя изменения), затем Update (скачиваем то, что написали дома).
    Ответ написан
    Комментировать
  • Как правильно написать MutexLocker?

    @Mercury13
    Программист на «си с крестами» и не только
    pthread_mutex_locker locker(&mutex);

    Назови его как-нибудь, и всё будет окей.
    Ответ написан
    Комментировать
  • Как сделать переключатель сигнала "наушники - колонки" своими руками?

    @Mercury13
    Программист на «си с крестами» и не только
    У меня есть переключатель аж на три выхода: колонки, наушники и «что попадётся» с передней панели. Использовался обычный галетный переключатель. Соединено всё обычным аудиокабелем.

    Кажется, плохая звуковая и обычные колонки куда больше портят звук, чем какой-то переключатель.
    Ответ написан
    Комментировать
  • Как работает PageControl?

    @Mercury13
    Программист на «си с крестами» и не только
    Как создавать вкладки (т.е. как пользоваться) — рассказал zedxxx.

    А что у него внутри? В общих чертах — создаётся большая куча TWinControl’ов. Один из них виден, остальные нет.
    Я фокус понял не до конца: есть у нас аналог PageControl, с дополнительной функциональностью «мастера» и без корешков, но кое на чём подглючивает. Но в целом так. За подробностями — именно что читайте исходники.
    Ответ написан
    Комментировать
  • Зачем нужен ООП?

    @Mercury13
    Программист на «си с крестами» и не только
    Я хотел спросить: вы что, студент? Потом посмотрел: нет, вебист. Вебистам действительно ООП нужно крайне редко; если не связывался с хитрой поддержкой сложных протоколов или со сложными моделями данных — в памяти, не в БД — можно писать без ООП и быть успешным вебистом.

    Я и сам долгое время не понимал, на что нужны эти объекты. Главный вопрос: ДЛЯ ЧЕГО?

    Для того, чтобы передать взаимодействие кучи вещей. Где нет взаимодействия, там нет ООП, и можно заниматься, например, научными расчётами, на которые мало кто из нас способен, высший пилотаж, и вообще про ООП ничего не знать. Помню, как Вассерман — тот самый, некогда программист техпроцессов — долго-долго вспоминал, что такое ООП.

    Предлагаю начать с простого.

    1. Объектный синтаксис. Было…
    iDog : integer;
    iDog := SpawnMonster(world, mtDog, x, y);
    ChargeAtPlayer(iDog);


    Стало…
    dog : TMonster;
    dog := world.SpawnMonster(mtDog, x, y);
    dog.ChargeAtPlayer;


    Уже стало красивее. Да и номер собаки можно случайно передать, например, вместо номера оружия; с типом TMonster такой фокус не пройдёт.

    2. Инкапсуляция.
    Это мы уже думаем над тем, чтобы вызовы функций не могли привести объект в «ненадлежащее» состояние, а всё, что может объект подпортить,— засунуто в private.

    3. Абстракция и наследование. Это уже «сложный пилотаж». Не высший — это неотъемлемая часть навыков хорошего программиста, да и для 80% задач это не нужно, зато в остальных 20-и очень улучшает жизнь. Самый простой пример. В какой-нибудь 2D-игре есть некий TGameObject, у которого виртуальные функции Live и Render. Первая прокручивает такт «жизни» объекта, вторая рисует его на экране. TGameObject можно разбить на TPlayer, TProjectile, TEnemy и TBonus, и т.д.

    Ах да. Для ООП не нужен объектно-ориентированный язык и объектный синтаксис, нужно объектно-ориентированное мышление. Например, Doom был написан на Си, но в очень-очень объектном стиле.
    Ответ написан
    Комментировать
  • СЕО. Не будет ли хуже от таких ссылок?

    @Mercury13
    Программист на «си с крестами» и не только
    Кроме того, правьте орфографию!
    Ответ написан
    Комментировать
  • Как вывести картинку формата tiff в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Не знаю пока, кто поддерживает TIFF (я бы поискал, а если не нашёл — сам бы наладил формат в достаточной для нашей недо-САПР мере). В FreeImage, говорят, есть обёртка для Delphi.

    Поскольку у вас чертежи, видимо, надо уменьшать картинки по методу Блэкмена или Ланцоша, оно есть в Graphics32.

    Второе. Надо понять, что означают эти дробные числа. Очень непохоже, что это координаты в пикселях. А не в пикселях — так в чём? Может, в линейных единицах — тогда из TIFF надо извлечь его DPI. (Да, кто-то утверждает, что координаты в процентах.)

    И ВНИМАНИЕ!
    X Y
    61,2289 15,32567
    56,36088 19,72337
    Налаживая считывание нашего текстового файла, сделайте, чтобы считывание было локаленезависимым. То есть: поставьте в настройках языка вместо десятичной запятой точку — и не должно слетать!
    Ответ написан
    Комментировать
  • Как наложить на картинку текст, что бы наведении мыши, вылазила подсказка?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача делится на три вопроса.
    I. Как перехватывать мышь? OnMouseMove и OnMouseLeave (вроде так оно…)
    II. Как нарисовать подсказку? Есть три способа это сделать, выбирайте любой:
    1. Отпечатать подсказку на компоненте-просмотрщике (например, в событии OnPaint). Например, подвели «крысика» — InvalidateRect, примерно соответствующий расположению подсказки (ну или Invalidate целиком, если считаете, что картинка рисуется быстро). В OnPaint — собственно отрисовка.
    2. Сделать собственное окошко-подсказку — например, такая же TForm. Внимание, TLabel не умеет вычислять вертикальный размер, когда текст перенесён, поэтому или найдите компонент, который закрывает этот просчёт, либо нарисуйте текст сами, как и в первой части.
    3. Вывести тултип средствами WinApi.
    III. Вот мы вычислили габариты подсказки и хотим её расположить в границах экрана (варианты 2, 3) или окна (вариант 1). Куда её всунуть? Сделайте несколько вариантов расположения, в порядке предпочтитения.
    • Снизу, горизонтальное выравнивание по левому краю. Если умещается по вертикали, но вылезает по горизонтали — сместить влево.
    • Затем сверху с теми же условиями.
    • Затем справа; вертикальное выравнивание — как уместится.
    • Затем слева; вертикальное выравнивание — как уместится.
    • А если ни один вариант не проканал — по координатам (0, 0).
    Ах да. Вычисляя габариты, убедитесь, что очень длинные подписи переносятся — чтобы не было подсказки, которая шире, чем экран.

    Вот так в общих чертах. Делать мне это приходилось; я использовал 1-й способ, однако «затравкой» делал не прямоугольник, а точку (нужны были подписи к графику). Естественно, выравнивал я с небольшим отступом, чтобы курсор не загораживал подпись. Использовал я Graphics32 с собственным кодом рисования закруглённого прямоугольника, получились кавайненькие такие полупрозрачные плашки.
    Ответ написан
    1 комментарий
  • С чего начинать: Спортивное программирование VS Изучение языка программирования?

    @Mercury13
    Программист на «си с крестами» и не только
    Если с твоих пальцев код слетает так легко, что можно уже в спортивное… то почему бы не заняться тем, что нужно в жизни и тем, что тебе нравится? Напиши нечто посложнее, чем арканоид или тетрис!

    Подумай, что тебе в жизни нравится. Скажем, игры. Вот берёшь и пишешь арканоид. Потом арканоид с хитрой физикой. Потом платформерный движок — пускай враги будут каляки-маляки, зато чтобы было интересно бегать-прыгать. Если любишь музыку — придумай какой-нибудь синтезатор или звукопреобразователь. Если фотографируешь — да хоть каталогизатор фотографий! И так далее.

    Если ты пока ещё туг в программировании, пиши что угодно, что пишется, но программировать научись. Спортивное, возможно, тебе и подойдёт, но, вероятно, ты будешь то ли клевать носом на непонятной лекции, то ли постоянно переспрашивать: как это? Сходи на их лекцию, посмотри, каково оно тебе?

    Прогерская работа — не олимпиада. Там много других задач: как это будет выглядеть с точки зрения пользователя? Стоит ли налаживать O(n) или обойтись O(n²)? Джонатан Блоу (автор великого Braid) говорит: 80%, что простейший алгоритм подойдёт, а в отладке он проще. Хотя и хорошие алгоритмы знать тоже надо, хотя бы на уровне теории.
    Ответ написан
    Комментировать
  • Правильно ли дробить CSS на отдельные файлы для каждой страницы?

    @Mercury13
    Программист на «си с крестами» и не только
    А тут думать надо, что между страницами общего, что различного и будет ли пользователь ходить на какую-то одну часть сайта, игнорируя остальные.

    Например, не зазорно, чтобы блог и файлохостинг имели разные CSS. А вот разным частям блога, вероятно, лучше один общий.
    Ответ написан
    Комментировать
  • Как отлаживать программы, которые долго выполняются?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Специальные условия выполнения. Например, у меня есть свой шаблон Array1d<>, в котором есть не только проверка диапазонов, но и т.н. «канарейка» — проверка, не испортила ли его случайно «сумасшедшая» подпрограмма. Все эти изыски включаются в параметрах компиляции.
    2. Детальные логи ключевых объектов: что случилось и по какой причине.
    3. Просто чутьё. Неинициализированную переменную на стеке я долго ловил: знал, где примерно ошибка, но любая диагностика (и даже перевод компилятора в debug) — стек смещается, и ищи ветра в поле. Включал проверку диапазонов, ту самую канарейку — ничего не даёт (ну естественно, никто и не пишет в «левую» память»). Много раз затыкал ошибку, но впоследствии я её как-то сумел продиагностировать, а дальше — дело техники.
    Ответ написан
    Комментировать
  • Кнопка fn на ноутбуке работает зеркально. Можно ли как нибудь исправить?

    @Mercury13
    Программист на «си с крестами» и не только
    Если это Lenovo, там есть небольшая засада.
    1. Установите клавиатурные драйверы и делайте это в настройках «Панель управления → Клавиатура».
    2. Если оно к тому же постоянно ругается, что Fn в Legacy-режиме — найдите и удалите файл mkrmsg.exe.

    Всё это из опыта эксплуатации Lenovo E330.
    Ответ написан
    Комментировать
  • Delphi XE5 почему не работает "suspend, resume, terminate" в потоке?

    @Mercury13
    Программист на «си с крестами» и не только
    У тебя PostThread — не переменная, а тип. Поэтому код

    type
      PostThread = class (TThread)
      end;
    
    PostThread.Create(true);

    срабатывает, но результат конструктора PostThread.Create уходит в никуда. А вызовы PostThread.Resume и тому подобные невозможны — они не классовые. Надо примерно так…

    type
      TPostThread = class (TThread)
      end;
    
    var
      PostThread : TPostThread;
    
    …
    PostThread := TPostThread.Create(true);
    PostThread.Resume;  // Suspend, Terminate и так далее…
    …
    PostThread.Free;   // Ну и убить его, наконец!


    Твоя ошибка: незнание жизненного цикла объекта; возможно, обучение на Turbo Pascal, в котором всё слегка не так.
    Ответ написан
    3 комментария
  • Как работать Excel-документами в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два варианта, автоматизация OLE и прямая поддержка XLS-файлов.

    Я сумасшедший и по спецификациям Micro$oft написал второе (всё-таки в коммерческой программе, от которой, впрочем, не требуются никакие оформительские изыски, так лучше).

    Для разовой утилиты лучше первое. Ещё можно работать через CSV.
    Ответ написан
    2 комментария
  • Какой аналог php функции is_string() в ЯП С++?

    @Mercury13
    Программист на «си с крестами» и не только
    C++ — язык со статической типизацией, и если x объявлено как string, то он всегда string. А если как int, то он никогда не string. Поэтому функция is_string в C++ просто не имеет смысла.

    Правда, существуют островки динамической типизации наподобие VARIANT из OLE — это уже смотрите по месту (msdn.microsoft.com/en-us/library/cc237865.aspx) и, скорее всего, это не ваш вопрос.

    Да, вы хотели проверять корректность ввода. Например, для проверки, будет ли строка числом, можно использовать www.cplusplus.com/reference/cstdlib/strtod (не забудьте потом проверить endptr!)
    Ответ написан
    Комментировать
  • Как проверить файл на пустоту в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    type
      TFileState = ( fsMissing, fsEmpty, fsSomething );
    
    function GetFileState(s : string) : TFileState;
    var
      sr : TSearchRec;
      err : integer;
    begin
      err := FindFirst(s, faAnyFile and not faDirectory, sr);
      if err <> 0
        then Result := fsMissing
      else if sr.Size = 0
        then Result := fsEmpty
        else Result := fsSomething;
      FindClose(sr);
    end;
    Ответ написан
  • Для чего нужны побитовые операции?

    @Mercury13
    Программист на «си с крестами» и не только
    Для чего битовые сдвиги вообще существуют? А потому, что они выполняются очень простой схемой — сдвиговым регистром. И вместо того, чтобы проводить умножение (поначалу это было десятки тактов), подключаем этот самый регистр к регистрам процессора, и выполним всё за один такт. Существовала даже программа, генерирующая быстрый код умножения на константу, например, 6 — сдвинуть, сложить и ещё раз сдвинуть. И это в своё время было быстрее, чем mul — а ведь сейчас мы без зазрения совести пишем mul eax, 6.

    Чего могут сдвиги, но со скрипом реализуется через всё остальное? Доступ к i-му биту.
    i-й бит = (x >> i) & 1

    По правилам хорошего программистского тона умножение, даже на 2 или на 4, пишется как обычное * (>> пишут, если компилятор непроходимо туп и умножение медленнее). А вот сдвиги — именно их, а не умножение — пишут, когда работают с битовыми полями.

    Есть также специальные сдвиги.
    * Арифметический сдвиг вправо (левый совпадает с обычным) — для чисел со знаком.
    * Сдвиг-вращение — в основном для криптографии.
    * Сдвиг-вращение через регистр флагов — в основном для длинной арифметики.
    Ответ написан
    Комментировать
  • Есть ли разница между лазерной и LED мышками?

    @Mercury13
    Программист на «си с крестами» и не только
    Было время, ≈2005—2007, светодиоды зверски «скакали». Сейчас у меня пучок мышек посовременнее, и не помню ни одного скачка. Условия, правда, не особо жёсткие.
    Ответ написан
    Комментировать