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

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Не забывайте, что приведение WideString к PWideChar/LPWSTR не продлевает жизнь строке.  
     
    Обратите внимание на процедуру PluginExecute. Вы заполняете структуру binfo и ассоциируете ai с её полями ... но, ведь, после выхода из процедуры структура binfo уничтожается и, в итоге, LPWSTR поля в ai указывают неизвестно куда. Поэтому вы и получаете мусор. Надеюсь вы дальше сообразите что делать

    Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 13:36 23-07-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Возник вопрос.
    Рисую на 32 битном TBitmap. Потом мне нужно его очистить так чтобы он стал прозрачным. InValidateRect даёт заливку белым. Нужно чтобы TBitmap действительно стал прозрачным, а не указать свойство Transparent.
    Как это сделать?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:26 23-07-2012
    SevereK20

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    отпишитесь, если найдете решение проблемы.
    я использовал фон формы..

    Всего записей: 7684 | Зарегистр. 07-05-2010 | Отправлено: 17:53 23-07-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SevereK20
    Мне этот способ не подходит. Мне нужно именно прозрачное.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:57 23-07-2012
    jFobos



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    У TBitmap нету альфа канала. Переходите на TPNGImage (или gif/ico).

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 20:51 23-07-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    В цикле через ScanLine интерпретируйте каждый пиксель как Cardinal и присваивайте ноль. Можно еще ZeroMemory попробовать, но там не совсем тривиальная математика требуется.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 21:38 23-07-2012 | Исправлено: Frodo_Torbins, 21:41 23-07-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jFobos
    По крайней мере точно можно сделать реальную картинку с прозрачностью, а как при этом называется альфа канал дело десятое.
    Frodo_Torbins
    Вот и хотелось-бы какой-то пример реализации...

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 23:18 23-07-2012
    krapotkin

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Aleksandr N
    Прозрачность битмапа при выводе - это скорее особенность реализации конкретной библиотеки
    Например, при выводе на TImageBtn  брался за прозрачный цвет левой нижней точки...
     
    Поэтому неплохо бы знать - где рисовать то?

    Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 08:56 24-07-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Eternal_Shield
     
    Хм, да вот честно, не знаю или знаю, но не соображу... Даже ели оставить структуру TBillingInfo такой с вайдстрингами, то что можно сделать? Копировать вайдстринги в функции PluginExecute через lstrcpynW?
     
    Сделал тогда так:
     

    Цитата:

    function PluginExecute(out ai: ACCOUNT_INFO): BOOL; stdcall;
    type
      TBillingInfo = record
        errorCode   : Integer;
        msgError    : LPWSTR;
        balanceMoney: Double;
        balanceDraft: Double;
        tarifName   : LPWSTR;
        tarifDays   : Integer;
        daysLeft    : Integer;
      end;
    const
      pszTarif: LPWSTR = 'Тариф';
      pszError: LPWSTR = 'Ошибок не обнаружено';
    var
      binfo: TBillingInfo;
    begin
      ZeroMemory(@binfo, SizeOf(TBillingInfo));
      binfo.errorCode   := NO_ERROR;
      binfo.msgError    := pszError;
      binfo.balanceMoney:= 250.00;
      binfo.balanceDraft:= 30.00;
      binfo.tarifName   := pszTarif;
      binfo.tarifDays   := -1;
      binfo.daysLeft    := -1
      ai.fBalance        := binfo.balanceMoney;
      ai.fOverdraft      := binfo.balanceDraft;
      ai.pszTarif        := binfo.tarifName;
      ai.cchTarifMax     := (lstrlenW(ai.pszTarif) + 1) * SizeOf(WideChar);
      ai.dwTarifDays     := binfo.tarifDays;
      ai.dwTarifDaysLeft := binfo.daysLeft;
      ai.dwErrorCode     := binfo.errorCode;
      ai.pszError        := binfo.msgError;
      ai.cchErrorMax     := (lstrlenW(ai.pszError) + 1) * SizeOf(WideChar);
      Result := TRUE;
    end;

     
    Ну вроде бы оно работает. Только все равно наобум получилось. Не знаю как корректнее...

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 09:53 24-07-2012 | Исправлено: Maks150988, 09:55 24-07-2012
    Eternal_Shield

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

    Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 12:04 24-07-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    krapotkin
    Где рисовать не столь важно:
      FBmp := TBitmap.Create;
      FBmp.HandleType := bmDIB;
      FBmp.PixelFormat := pf32bit;
      рисуешь
    вот и весь метод реализации.
    А "брался за прозрачный цвет левой нижней точки" это как раз свойство Transparent. При этом изображение нисколько не прозрачное, просто удаляется именно этот цвет.
    Вот этот TBitmap мне и надо очистить чтобы не было никакой заливки цветом.
     
    Метод очистки не имеет значения: VCL или API.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 12:30 24-07-2012 | Исправлено: Aleksandr N, 12:32 24-07-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    krapotkin
    Познакомьтесь с функцией AlphaBlend. Кстати в последних версиях делфей она активно используется в RTL.
     
    Aleksandr N
    Если битмап тридцатидвухбитный, то нужно лишь знать, что строки в памяти располагаются начиная с нижней:
    Код:
    b.PixelFormat := pf32bit;
    ZeroMemory(b.ScanLine[b.Height -1], 4 * b.Height * b.Width);
    В противном случае придется учитывать тот факт, что конец каждой строки выравнивается на границу четырех байт.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:06 24-07-2012 | Исправлено: Frodo_Torbins, 13:08 24-07-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Eternal_Shield
    Функция PluginExecute находится вобще в сторонней DLL, она вызывается моей программой - плагин короче это. Плагин должен правильно заполнить структуру ACCOUNT_INFO, а моя программа использует эти данные вдальнейшем. Для удобства (а есть ли оно теперь уже) я завел отдельную структуру TBillingInfo, в которой оперирую данными, меняющимися несколько раз. После всех действий "скидываю" из TBillingInfo данные в ACCOUNT_INFO. Просто здесь урезанный код привел.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:53 24-07-2012
    Eternal_Shield

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Ну то, что это плагин - я догадался. Просто было неизвестно, если ли доступ к самой программе (может вы просто плагин к чьей-то проге пишите). Раз обе части программы доступны полностью, то можно в плагине везде использовать WideString, а в приложении (я так понимаю, оно на С++ написано) использовать BSTR; В теории должно работать. Если комплекс вообще на делфи, то просто WideString;

    Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 17:28 24-07-2012 | Исправлено: Eternal_Shield, 17:29 24-07-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Eternal_Shield
    Программа и плагины написаны на Delphi мной. Сделал SDK под это дело с описанием структур и функций плагинов для остальных программистов, кто захочет написать свой плагин под своего оператора. Насчет WideString и BSTR немного не понял... Мне как результат возвращать их или тоже в структурах?

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:37 24-07-2012
    Aleksandr N

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

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:40 24-07-2012
    Aleksandr N

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

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 21:53 24-07-2012
    Eternal_Shield

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

    Цитата:
    Насчет WideString и BSTR немного не понял... Мне как результат возвращать их или тоже в структурах?

    Да, везде использовать WideString, а вот если плагин будет писаться на Си, то вместо типа WideString в структурах плагина использовать тип BSTR. Честно, сам никогда не пробовал - не знаю, но ем-ро говорит, что BSTR - это эквивалент WideString .. поэтому всё должно работать.

    Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 16:51 26-07-2012 | Исправлено: Eternal_Shield, 22:23 26-07-2012
    XCV81



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    написал небольшую прогу без vcl использую winapi, при запуске открывается окошко в нем 2 объекта: RichEdit и кнопка, в RichEdit выводится некоторая информация, а кнопка просто ее обновляет, все хорошо, но... окошко получается определенного размера в котором и размещены эти объекты, но при попытке изменить размер окна программы - размер формы меняется, а вот размер объектов и их положение остаются неизменными... как сделать чтобы при изменении размера окна программы менялись и размер/положение остальных объектов?
    Главную форму и объекты на ней создаю так:
    Подробнее...
    для перерисовки объектов после изменения размера главной формы добавил в обработчик сообщений:
    Подробнее...
    по идее все объекты должны перерисоваться причем дважды, однако ни размер, ни их положение не меняется. Попробовал туда же добавить команду удаления кнопки и заново ее создать:
    Подробнее...
    получилось вообще забавно, после изменения размеров кнопки создается новая кнопка с "правильными" размером и положением, но дополнительно появляется и кнопка которая была изначально, тоесть получается 2 кнопки с одной и той же функцией, но разных размеров и в разных местах (откуда вообще берется 2-я кнопка), к слову если из последнего кода выбросить команду по созданию кнопки - то после изменения размеров окна кнопка просто пропадает (в принципе так и должно быть) - следовательно 1 команда Buttons := CreateWindowEx( WS_EX_STATICEDGE, 'Button', PAnsiChar('Обновить'), BS_DEFPUSHBUTTON or WS_VISIBLE or WS_CHILD, 10, R.Bottom-R.Top-60, R.Right-R.Left-30, 25, Wnd, 101, hInstance, nil ); создает 2 каким-то образом кнопки - "правильную" и "не правильную"...
    Подскажите пожалуйста как правильно заставить изменяться объекты при изменении формы.
    Заранее благодарен.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XCV81
    Вам нужно вызвать SetWindowPos    

    Код:
     
    WM_SIZE:
        begin
        ....
           SetWindowPos ....
        ....
        end
     

    procedure SetWindowPos(Wnd, WndInsertAfter: HWnd; X, Y, cx, cy: Integer; Flags: Word);
         Изменяет pазмеp, положение и поpядок окна.
         Паpаметpы:
         Wnd: Идентификатоp окна.
         WndInsertAfter: Пpедыдущее окно в списке администpатоpа окон.
         X, Y: Веpхний левый угол.
         cx: Новая шиpина окна.
         cy: Новая высота окна.
         Flags: Флаги установки положения окна.
     
     
     
    Добавлено:
    В догонку
    CreateWindowEx не меняет окно, а создает новое.
     
    пишу на скорую руку, так что код воспринимай как подсказку, а не как готовое решение
     
    SetWindowPos(Buttons, HWND_BOTTOM, 10, R.Bottom-R.Top-60, R.Right-R.Left-30, 25, SWP_NOACTIVATE)
     
    Флаги установки положения окна.
    SWP_HIDEWINDOW - после проделаных действий над окном ( перемещением и изменением размера ) окно прячется      
    SWP_NOSIZE - если указан этот параметр, то 5й и 6й параметры учитываться не будут, т.е. окно менять размер не будет (этот  параметр указан в нашем примере )
    SWP_NOMOVE - если указан этот параметр, то 3й и 4й параметры учитываться не будут, т.е. окно не будет перемещаться.
    SWP_SHOWWINDOW - после проделаных действий над окном ( перемещением и изменением размера ) окно будет показано ( работает  только если окно было спрятано).
    SWP_NOACTIVATE - после проделаных действий над окном ( перемещением и изменением размера ) окно не активируется.
    Также доступны флаги: swp_DrawFrame, swp_NoRemove ,swp_NoSize, swp_NoRedraw, swp_NoZOrder

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 17:19 07-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