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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прошу не пинать за, возможно, элементарный вопрос - давно не пользовался WinAPI
    Вопрос такой:
    Необходимо запустить внешнее приложение с помощью CreateProcess и оставить его крутиться, пока не понадобится. Здесь проблем нет.
    А вот как потом отправить этому приложению сообщение, ведь дескриптор главного окна вновь созданного приложения CreateProcess не возвращает? Пользоваться FindWindow или этот дескриптор где-то все-таки спрятан в PROCESS_INFORMATION?
    Спасибо.
    С уважением, Сергей ака Grande.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 08:12 14-02-2012
    A_V

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

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 13:50 14-02-2012
    Grande



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

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 15:28 14-02-2012
    Frodo_Torbins

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

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:09 14-02-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всё, починил
    Использовал CreateProcess, потом FindWindow - пока работает.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 08:54 15-02-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    FindWindow плох тем, что может вернуть хендл окна, принадлежащего совершенно другому процессу.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:56 15-02-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grande
    лучше искать через EnumWindows + GetWindowThreadProcessId

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 14:29 15-02-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, может и дурацкий вопрос, но можно-ли убрать тень окна, которая была создана так:
    Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
    после показа формы?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 16:03 15-02-2012
    vetal71



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет
    следующий код дает ошибку (List out of bounds ...)

    Код:
     
    for I := 0 to ComponentCount - 1 do
        begin
          Item := Components[ I ];
          if Item.ClassNameIs( 'TTBXItem' ) then
          begin
            J := TTBXItem( Item ).Tag;
            IsFiltered[ J ] := TTBXItem( Item ).Checked;
          end;
        end;
     

     
    ComponentCount = 72, а ошибку дает при I = 12 в строке Item := Components[I].  
    В чем может быть прикол ?
     
     

    Всего записей: 299 | Зарегистр. 08-09-2008 | Отправлено: 17:58 15-02-2012
    wasilissk

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

    Цитата:
    В чем может быть прикол ?

    В методе SetItem?

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 18:16 15-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vetal71
     
    а Item что у тебя?
    и в каком классе этот цикл работает?

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Можно: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:19 15-02-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
     SetClassLong(Handle, GCL_STYLE,
         GetClassLong(Handle, GCL_STYLE) and not CS_DROPSHADOW);
    vetal71
    Возможно компонент внутри цикла (в сеттере у Item например) уничтожается. поставь брейкпойнт в начале цикла - потом на TComponent.Destroy и смотри стек
    Не, есть лучше идея:
    у тебя локальных переменных Components или ComponentCount не объявлено?

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 18:22 15-02-2012 | Исправлено: A_V, 18:45 15-02-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    A_V
    Странное что-то. Мало того что тень не убирается, при закрытии форма гарантированно уничтожается, а вот новая форма появляется уже без тени (форма вызывается из главной). Может ещё какая-то команда нужна?

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    попробуй с RecreateWnd

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 18:56 15-02-2012
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A_V
    Точно.
    Нашел ещё так (может кому понадобится) без RecreateWnd работает
     
    Procedure TSkin_Form.RebuildShadow(_b:boolean);
    const CS_DROPSHADOW = $00020000;
    var old: THandle; x,y:integer;
    begin
    if not(IsWinXP) then exit;
    old := GetWindowLong(MainForm.handle,GCL_STYLE);
    if _b then begin
    if not((old and CS_DROPSHADOW)=CS_DROPSHADOW) then begin
      SetClassLong(MainForm.handle, GCL_STYLE, old or CS_DROPSHADOW);
      MainForm.RecreateleForm;
      end;
    end else begin
    if (old or CS_DROPSHADOW)=CS_DROPSHADOW then begin
       ShowWindow(MainForm.handle, SW_HIDE);
      SetClassLong(MainForm.handle, GCL_STYLE, old and not CS_DROPSHADOW);
      ShowWindow(MainForm.handle, SW_NORMAL);
     end;
    end;
    end;

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 19:12 15-02-2012
    vetal71



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

    Цитата:
    а Item что у тебя?
    и в каком классе этот цикл работает?

    Item :TComponent;
    класс TForm
     

    Всего записей: 299 | Зарегистр. 08-09-2008 | Отправлено: 19:14 15-02-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vetal71
    чёрт его знает...
    проверь всё то, что тебе советовали выше...
    +
    вроде твой список компонент слетает...
    тебе надо на своей форме все компы пробежать?
    я бы попробовал ещё так жёстко:
     
    ТвояФорма.ComponentCount
    self.ComponentCount
    Item := ТвояФорма.Components[I];
    Item := self.Components[I];
    однофигственное...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:55 15-02-2012 | Исправлено: akaGM, 19:59 15-02-2012
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM, Frodo_Torbins
    Отписываюсь как обещал.
     
    Начал с варианта Frodo_Torbins. Раньше было так, как на скрине, а стало так, как на этом скрине. На втором скрине видно, что нарушен формат вывода (при размере шрифта 8 тоже), как выровнять х.з. PS. Выбор шрифта работает, и сохраняется.
     
    Вариант akaGM не удалось попробовать, т.к. требуется переустановка Delphi.
     
    Огромное спасибо за участие.

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

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

    Цитата:
    Вариант akaGM не удалось попробовать, т.к. требуется переустановка Delphi.

    это как это?
     
    вариант Frodo_Torbins с изменённым методом компилируется/собирается/запускается, а замена в коде комментария требует переустановки Дельфей?
    :)
     

    Цитата:
    как выровнять х.з.

    используй "Courier New"...
    тем более что
    Цитата:
    Выбор шрифта работает, и сохраняется.

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 20:05 15-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