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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    Всё выяснилось, как только я попробовал наваять тестовый проектик с кодом, аналогичным твоему.
    Ошибка на самом деле возникает не в CoInitialize, а уже в CoUninitialize, и потому, что на момент вызова данной функции не все выделенные OLE-ресурсы освобождены, а именно объекты TaskBar и pfList.
     
    Delphi-то их освободит автоматически, но лишь в конце функции, одновременно с оператором end, а нас это не устаивает. Таким образом, твой пример надо переписать так:
     

    Код:
     
    procedure UpdateTaskbarVisibleWindow;  
    var  
      TaskBar: ITaskBarList;  
      pfList : IUnknown;  
      hr     : HRESULT;  
    begin  
     
      CoInitialize(nil);  
     
      try  
     
        hr := CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER or  
          CLSCTX_LOCAL_SERVER, IUnknown, pfList);  
     
        if (hr = S_OK) then  
        begin  
          TaskBar := pfList as ITaskbarList;  
          if (TaskBar.HrInit = S_OK) then  
     
            if Boolean(dwTaskWindow) then  
              begin  
                TaskBar.AddTab(hMain);  
                TaskBar.ActivateTab(hMain);  
              end  
            else  
              TaskBar.DeleteTab(hMain);  
        end;  
     
      Finally
        TaskBar:= Nil;
        pfList:= Nil;
        CoUninitialize;  
      end;  
     
    end;
     

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 15:24 06-03-2010 | Исправлено: AviDen, 15:26 06-03-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AviDen
    А, вот оно что. Тогда понятно. Буду знать.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:04 06-03-2010 | Исправлено: Maks150988, 18:46 06-03-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Кстати, включу-ка я функционал ITaskBarList в своего наследника от TForm...

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 17:48 06-03-2010
    KurkSS

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, а вот подскажите как быть в такой ситуации.....
     
    вот есть такая чтока как dll
    функция может быть описана на любом языке програмирования, а моя програма может
    её использовать.
     
    а вот что если нужно подгружать обьект.... тоесть сущность которая не только предоставляет поведение, но и должна сохранять знания свои между вызовами....
     
    Тоесть мне нужно динамически подгружать обьект, написанный на любом другом языке програмирования... лиш бы у него интерфейс был определённый.....
     
    Как это делаеться????
    Если смысл создать эту сущьность ввиде OLE обьекта... тогда вопрос где можно почитать
    как создать такое.......
    ЗЫ:вопрос чисто теоретический.... тоесть без конкретизации на 2 вопросе....
     
     
    2 вопрос....
    у меня будут соревноваться несколько сущностей, (см вопрос 1)
    если учитывать что количество обьектов будет просто огромное под 100 тысяч... тоесть никакой оперативы не хватит.... как можно выйти из такой ситуации....
    ЗЫ - сущности это базовый алгоритм работы и накопления знаний.... их несколько....
    а обьектов будет под 100 тысяч.... у них знания и опыт будет разный...

    Всего записей: 73 | Зарегистр. 22-05-2008 | Отправлено: 23:41 07-03-2010
    VadimLou



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1 - ole или интерфейсы. А почитать - есть даже книги типа Использование COM в Delphi.
    2 -
    Цитата:
     несколько сущностей

    Цитата:
    просто огромное под 100 тысяч
    - то несколько, то 100 тысяс - ты разберись ... 100 тыс - это не много, если они не будут конкурировать по доступу на изменение к одному ресурсу... А так вообщето существуют мьютексы, семафоры, критические секции, пулы... для удобства использования этого хозяйства  существуют всякие обёртки в виде классов (TRWS - read write synchronizer, ...) В общем хватает как описаний , так и примеров в книгах ...
     
     
     
    Добавлено:
    Odysseos
    Спасибо за

    Цитата:
     Windows 7 Components


    Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 03:44 08-03-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KurkSS
    Кроме COM можно еще применить подход из WinAPI. Библиотека реализует набор функций для работы с объектами, а первый параметр каждой функции - хендл или проще говоря номер объекта. Т. о. объекты живут внутри библиотеки, а вы лишь управляете ими извне. Этот подход хорош тем, что "объекты" не обязательно реализовывать как настоящие объекты, благодаря этому можно сэкономить ресурсы.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:10 08-03-2010
    KurkSS

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

    Цитата:
    - то несколько, то 100 тысяс - ты разберись ...

    А Внимательно почитать - сущность это класс, а 100тыс бедет экземпляров класов
     
    Frodo_Torbins
    Цитата:
    Т. о. объекты живут внутри библиотеки,

    а можно ключевые слова .... что искать для чтения????
     

    Всего записей: 73 | Зарегистр. 22-05-2008 | Отправлено: 12:37 08-03-2010 | Исправлено: KurkSS, 12:38 08-03-2010
    Frodo_Torbins

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

    Цитата:
    а можно ключевые слова .... что искать для чтения????

    Ну про WinAPI я уже сказал, что еще почитать... даже не знаю. Ну вот небольшой примерчик могу показать:
    Подробнее...

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:00 08-03-2010 | Исправлено: Frodo_Torbins, 14:01 08-03-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VadimLou
     
    Не за что
     
    ...Надо отметить, у этих компонентов есть один баг (хотя, подозреваю, он будет у всех компонентов, пользующихся именно таким описанием интерфейса с safecall-моделью вызовов - просто потому, что в таких условиях их едва ли кто тестирует, я сам совершенно случайно наткнулся) - при запуске приложения в случае, если системным shell'ом назначен не обычный explorer.exe (а, к примеру, Total Commander) - они в конструкторе выкидывают safecall exception.
     
    Чтоб исправить - надо найти все вызовы HrInit, и обрамить их в:

    Код:
     
      try
        FTaskbar.HrInit;
      except
        on E: ESafecallException do begin
          FTaskbar := nil;
     
          Exit;
        end;
      end;
     

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 16:47 08-03-2010 | Исправлено: Odysseos, 16:48 08-03-2010
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, посоветуйте по такому вопросу:
    в грид из бд (в ней около 100 тыс. записей) подгружается отфильтрованный список слов.
    Фильтрация происходит по первым символам вводящегося в эдите слова. Например, пользователь набрал в Edit букву 'а', программа построила запрос вида:
    query:='SELECT * FROM WORDS WHERE WORDVAL STARTING WITH '+#39+
                    word+#39+' ORDER BY WORDVAL'
    передала датасету, грид обновился - появились все слова из БД, начинающиеся на букву 'а'. Ввел следующий символ 'б' - грид обновился - в нем теперь слова начинающиеся на 'аб' и т. д. и т. п.
    Проблема в том, что иногда (даже вообще-то довольно часто) первая фильтрация (по одному, первому символу) происходит ну очень долго: и 5 секунд может и даже 10.
    Посоветуйте, как можно было бы ускорить этот процесс. БД - Firebird embedded, компоненты для доступа - Фибы...

    Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 21:33 08-03-2010
    KurkSS

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Цитата:
    примерчик могу показать:

    SetLength(MyObjects, Length(MyObjects) + 1);  
      NewObj := Length(MyObjects) - 1;Type incompatable TMyObjects and Integer
     
    Вообщем рекордам в куче я умею выделять память....
    Спасибо -  
    все переменые которые функциями длл создаються:
    1)Доступны напрямую из программы? ведь нет
    2)если длл выгрузить то ведь и данные тютю....
    я ктому что прикольный вариант но блин опасный......
     
    Слушай... а что если обьявить TMyObjects и в длл и в програме.... создавать масив в програме а функции дллевской передовать адрес ???
    я к тому что она из длл увидит этот адрес.... не случиться что иногда винда будет выдавать
    ПАМЯТЬ НЕ МОЖЕТ БЫТЬ РИИД или чтото типа того???

    Всего записей: 73 | Зарегистр. 22-05-2008 | Отправлено: 01:05 09-03-2010
    YuriyRR



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

    Цитата:
    DmitryKz


    Цитата:
    первая фильтрация (по одному, первому символу) происходит ну очень долго

    1.Не делать первую фильтрацию, фильтровать при условии 2 и более буков  (первая фильтрация обычно никому и не нужна)
    2. SELECT TOP 100 отбирать столько записей сколько влезет в грид. Далее можно навесить обработчики на PgUp Down и т.д или в трэде качать и из него показывать
    3. Там еще желательно, чтоб и слова в предложениях искались
    типа зубная паста мятная - ищем на па и находим. тогда еще и словарь строим
    СЛОВО - ID записи

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 01:52 09-03-2010
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Вместо Едита используй правильный контрол - LookupBox. Он как раз и занимается тем, что по первым буквам ищет нужную запись. Тебе остается только выводить в грид отсортированный список., а далее при вводе в лукапе буков в гриде будет производиться позиционирование на первый соотв элемент. Либо делать фильтрацию при нажатии на кнопку например Ентер. То есть пользователь ввел несколько букв, нажал ентер - получил выборку.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:37 09-03-2010
    snike555



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Я бы посоветовал поставить таймер. Искать не сразу после ввода символа, а напечатал символ, таймер сбился и включился сново, если прошло 0.5 сек, то происходит поиск. Если после первого символа ищёт уже нормально, то можно таймер только на 1вый символ сделать.

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 05:59 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    YuriyRR
    А вот с этого места поподробнее. Есть ли работающий пример, как сделать так, чтобы определенная часть данных подгружалась откуда-то (например из оракла, а другая часть наоборот прибивалась в памяти)?

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 08:54 09-03-2010
    greenpc

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

    Цитата:
    определенная часть данных подгружалась  

    подгружает небольшой кусок данных
    смотря чем Вы пользуетесь
    1. DOA - dataset  св-во queryallrecords - flase (кол-во readbuffer)
    2.ODAC - dataset  св-во FetchAll (кол-во FetchRows)

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 09:47 09-03-2010
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    greenpc
    Пользуюсь DOA. По поводу QueryAllRecords это понятно. Что по поводу остального? По крайней мере я там не нашел, чтобы была возможность загружать одну часть, а другую часть из памяти выгружать.

    ----------
    Холодильники мы

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 09:55 09-03-2010
    greenpc

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

    Цитата:
    была возможность загружать одну часть, а другую часть из памяти выгружать

    что Вы под этим подразумеваете?

    Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:05 09-03-2010
    jonikDk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    ну например для ODAC устанавливаешь свойство FetchRows = 100 и просто ходишь по простому гриду с записями когда ты доходишь до 101 записи DataSet сам фетчит следующие 100 записей и т.д.
    Для DOA я думаю аналогично.

    Всего записей: 1605 | Зарегистр. 01-03-2004 | Отправлено: 10:05 09-03-2010
    snike555



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

    Цитата:
     По крайней мере я там не нашел, чтобы была возможность загружать одну часть, а другую часть из памяти выгружать.

    А вам это зачем если не секрет? На сколько знаю есть ограничения в 100метров в PL\SQL Developer, раз это разработчики DOA, то возможно это ограничение существует в самих компонентах.  
    Но на самом деле нужно снабдить пользователя удобным фильтром и не заморачиваться такими вопросами.

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 10:19 09-03-2010
       

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