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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    VandB



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Мда...... WinFX. На 1 форуме посвешенному программированию, и на оф сайте чтото было подобное. Визуал студио уже потдерживает WinFX.

    Всего записей: 164 | Зарегистр. 05-05-2009 | Отправлено: 16:55 28-08-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VandB
    А я уж думал майкрософт опять что то придумал. А это всего лишь старое название .NET Framework 3.0. Так вот, .NET Framework 3.x уже давно и успешно поддерживается в Delphi Prism.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:42 28-08-2009 | Исправлено: Frodo_Torbins, 17:45 28-08-2009
    VandB



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

    Всего записей: 164 | Зарегистр. 05-05-2009 | Отправлено: 21:00 28-08-2009
    spasius



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну обычный .Net Framework и в чем прикол не пойму ... просто новые понты Мелкомягких ...

    Всего записей: 695 | Зарегистр. 16-03-2009 | Отправлено: 21:16 28-08-2009
    Granmer



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Создаю несколько объектов в рантайме, один из них кнопка "удалить". По нажатию, на которую удаляются созданные обекты и сама кнопка. Как правильно удалить из события onClick саму кнопку "удалить", которая вызвала обработчик? Остальные объекты удаляются нормально, а вот с этой кнопкой - эксепшен вылетает, что логично, но не знаю как правильно. Подскажите, плиз, кому не сложно.

    Всего записей: 236 | Зарегистр. 20-08-2003 | Отправлено: 13:36 29-08-2009
    DreamKHV



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Granmer, попробуй так.

    Код:
     
    var
     Btn: hWnd;
     
    procedure ButtonClick(Sender: TObject);
    begin;
     SendMessage(Btn, WM_SYSCOMMAND, SC_CLOSE, 0);
    end;
     
    procedure CreateButton;
    var
     Button: TButton;
    begin;
     Button := TButton.Create(Self);
     Button.Parent := Self;
     Button.OnClick := ButtonClick;
     Button.Visible := true;
     Btn := Button.Handle;  
    end;
     

    Всего записей: 21 | Зарегистр. 19-03-2009 | Отправлено: 14:29 29-08-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Granmer
    Идея с посылкой сообщения показаная выше правильная, но я бы делал иначе. Во-первых использовал PostMessage вместо SendMessage. Во-вторых отправлял бы собственное сообщение форме (WM_USER+n). Ну и в обработчике сообщения всеже удалял бы сам обьект кнопку.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:34 29-08-2009
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Мне надо выводить на TImage (на котором уже есть фон Bitmap1) маленькую картинку (Bitmap2). Картинка - красный кружок на белом фоне (25х25 пикс.). Так вот как я не стараюсь, не могу выводить так, чтобы белый фон стал прозрачным и виден был только красный кружок. Пробовал и Transparent свойство Canvas и BrushCopy и Draw. Все хорошо получается когда картинка большая (100 на 100 пикселей), а вот с такой маленькой получается красный кружок в обрамлении белой рамки. То есть, не до конца фон убирается. Подскажите вообще какой механизм вывода на один Bitmap другого Bitmap'a с прозрачным фоном?

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 19:06 29-08-2009
    RaB0TNiK

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может уже не актуально, но вот способ лучше

    Код:
     
    procedure ButtonClick(Sender: TObject);
    begin
      TButton(Sender).Destroy;
    end;
     

    Всего записей: 3 | Зарегистр. 27-08-2009 | Отправлено: 19:38 29-08-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Код в студию, и пример изображений тоже.
    RaB0TNiK
    Этот способ потенциально может выдавать AV.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:17 29-08-2009
    Bonivur



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

    Цитата:
    Код в студию, и пример изображений тоже.

    Картинка (B2 загружается из ресурса BUTTON) -    
     
    Код :

    Код:
     
    var
      B1,B2 :TBitmap;
    begin
      B1 := TBitmap.Create; //не имеет значения. создется в другом месте, простая картинка
                                       //отображается нормально, с ней проблем нет никаких
      B2 := TBitmap.Create;
       
      B2.LoadFromResources(HInstance,'BUTTON'); //подгружаем картинку 2
      B2.Transparent:=true;
      B2.TransparentColor:=B.Canvas.Pixels[1,1];{пробовал другие значения для пикслеей -или еще хуже или то же самое - по краям красного кружка видны черные очертания (цвет фона)}
       
      B1.Canvas.Draw(0,0,B2);
     


    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 22:10 29-08-2009
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Есть предположение что возле самого кружка  цвет пикселя отличен от пикселя в (1,1). Попробуй посмотреть в каком нить просмотрщике, с указанием прозрачного пиксель (1,1).У меня нечто подобное было, когда PNG сохранял как BMP.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:03 30-08-2009
    Bonivur



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

    Цитата:
    Есть предположение что возле самого кружка  цвет пикселя отличен от пикселя в (1,1). Попробуй посмотреть в каком нить просмотрщике, с указанием прозрачного пиксель (1,1).У меня нечто подобное было, когда PNG сохранял как BMP.

    Да, ты прав, убрал нестыковки с цветом, все вроде нормально, но вот только никак не избавиться от зазубрин по краям круглой кнопки (ровная линия никак не выходит при таком масштабе). Не знаю как с этим бороться. При таких малых пикселях выходит "лестница". Можно ли рисовать с уменьшением размера картинки? То есть вставлять bmp больший по размеру так чтобы на первом BMP (фоне) он выглядел бы меньше по размеру. То есть масштабировать не саму исходную картинку, а ее вывод на холст. Короче изменение размера налету как нибудь можно сделать или какой размер у картинки такой в результате и будет?

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 10:18 30-08-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Конечно можно, но я бы на вашем месте просто использовал PNG или битмап с альфа-каналом.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:10 30-08-2009
    Bonivur



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

    Цитата:
    Конечно можно, но я бы на вашем месте просто использовал PNG или битмап с альфа-каналом.

    1) Как возможно? Какая процедура позволяет изменять размер выводимого bitmap'a? Пробовал StretchDraw, но она как-то искажает рисунок, появляются точки на нем.  
    2) Разве можно использовать PNG файлы в Дельфи (в частности в ресурсах)? Если не трудно подробнее не эту тему. Где найти исходники примеров такого использования? И что такое битмап с альфаканалом. Не слышал про такой. Я думал альфаканал поддерживают только GIF и PNG. Мне надо чтобы графика загружалась из ресурсов программы.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 11:37 30-08-2009
    Frodo_Torbins

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

    Цитата:
    StretchDraw, но она как-то искажает рисунок, появляются точки на нем.
    Именно поэтому я и предложил PNG.

    Цитата:
    Разве можно использовать PNG файлы в Дельфи (в частности в ресурсах)?
    В ресурсы вообще можно запихнуть все что угодно. А для работы с PNG можно использовать например TPNGImage.

    Цитата:
    И что такое битмап с альфаканалом.
    Это битмап с 32 битами на пиксель. Причем в четвертом байте должны лежать значения альфаканала. Вот моя попытка работы с такими изображениями: http://delphikingdom.com/asp/answer.asp?IDAnswer=63111 А вот функция от майкрософта: AlphaBlend.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:50 30-08-2009 | Исправлено: Frodo_Torbins, 12:51 30-08-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    А если нужна более "продвинутая" работа с изображениями, то известная библиотека Graphics32. Тут и слои как в Photoshop, и несколько алгоритмов сглаживания, трансформации и куча других возможностей. Очень быстрая.
    В общем это отдельная большая тема.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 13:24 30-08-2009
    Bonivur



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

    Код:
     
    //в файле ресурсов добавляем строку
    PNG RCDATA "PNG.png"
    //в файле ресурсов добавляем строку
     
    interface
     
    uses
    ..., PNGImage;
     
    var
    ImagePNG: TImage;
     
    implementation
     
    {$R *.dfm}
    {$R myres.res}
     
     
    procedure LoadPNGFromRes;
    var
    MyPNG: TPNGObject;
    ResStream: TResourceStream;
    begin
    MyPNG:=TPNGObject.Create;
    ResStream:=TResourceStream.Create(H Instance,'PNG',RT_RCDATA);
    try
    MyPNG.LoadFromStream(ResStream);
    ImagePNG.Picture.Assign(MyPNG);
    finally
    MyPNG.Free;
    ResStream.Free;
    end;
    end;
     
    Но при попытке рисовать на Bitmape (
    Bitmap.Canvas.Draw(10,10,MyImage.Picture.Graphics) )
    выдает ошибку.
     

     
     
    Все уже решил сам проблему. Оказывается никакой TIMage не нужен. Рисуем сразу TPNGObject. Вот так вот. Всем спасибо.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 13:33 30-08-2009 | Исправлено: Bonivur, 14:52 30-08-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    А какую ошибку?
    Можно еще попробовать так: Bitmap.Canvas.Draw(10,10,MyPNG), только тогда переменная MyPNG должна быть глобальной, а ImagePNG можно будет убрать.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:50 30-08-2009
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    вот код, который работает (для модуля PNGImage)  

    Код:
     
    PNG RCDATA "PNG.png"  
    //в файле ресурсов добавляем строку  
     
    interface  
     
    uses  
    ..., PNGImage;  
     
    implementation  
     
    {$R *.dfm}  
    {$R myres.res}  
     
    procedure LoadPNGFromRes;  
    var  
      MyPNG: TPNGObject;  
      ResStream: TResourceStream;  
    begin  
      MyPNG:=TPNGObject.Create;  
      ResStream:=TResourceStream.Create(HInstance,'PNG',RT_RCDATA);  
    try  
      MyPNG.LoadFromStream(ResStream);  
      Bitmap.Canvas.Draw(10,10,MyPNG);
    finally  
      MyPNG.Free;  
      ResStream.Free;  
    end;  
    end;  
       


    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 15:20 30-08-2009
       

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru