Ответы пользователя по тегу Delphi
  • Как работает PageControl?

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

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

    @Mercury13
    Программист на «си с крестами» и не только
    Это к Sony или StarForce. И те, и другие делали заSHITу и прокалывались на подобном.
    Ответ написан
  • Delphi - програмная эмуляция удержания кнопок клавиатуры

    @Mercury13
    Программист на «си с крестами» и не только
    Автоповтор кнопок, к сожалению, придётся реализовывать самому.
    Ответ написан
    5 комментариев