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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RedPromo
    Это не для красоты абсолютно. Без этого нет отрисовки процесса вообще.
    Я ведь вроде подробно описал свою проблему и как к этому решению пришел.
    Вообще, по уму, надо бы как-то отследить когда реально копирование файлов закончилось и тогда отключать прогрессбар. Вот только как этот момент отследить...
    Сейчас впечатление такое что копирование отправляется в отдельный процесс, а прога бежит дальше выполнять код, а следующее по коду - выключение прогрессбара. Вот она берет и отключает его, а в это время копирование ещё идет. Выглядит это как простое появление и моментальное отключение прогресс бара.
    Кто знает, может это особенность Weaver'а втихомолку отдельные процессы запускать, а может Вин7 тому виной...

    Всего записей: 541 | Зарегистр. 21-12-2008 | Отправлено: 01:21 06-07-2009 | Исправлено: SerGap, 01:29 06-07-2009
    ShIvADeSt



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

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

    В общем прежде чем писать такой код надо вначале разобраться как работает данная процедура - вот код
    Подробнее...
    то есть у тебя происходит 20 раз копирование одной и той же директории с места на место. Я в принципе это и предполагал, так как у этой функции нет параметра для прогресс бара, то есть она не возвращает управление пока не закончится (все это верно для винХР - я хз как там копирование в новых версиях работает). Тебе надо сделать след. На базе этой функции пишешь свою. В ней вначале получаешь размер всех файлов назовем DirSize Потом при копировании вводишь переменную Summa. Вначале она равна нулю. После копирования очередного файла прибавляешь его размер к сумма. И далее пишешь примерно так
    ProgressBar.Position:=(Summa*100 div DirSize);
    Application.ProcessMessages;
    тогда будет работать как надо.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:11 06-07-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    volser
    Есть права в Мои документы, но и это далеко не у всех. Так что сейчас запускается Excel сам и в нем уже все динамически создается (ничего особенного, просто колонки с текстом). Вот и хочу сделать все это же самое, но с поддержкой OpenOffice.
    Просто можно конечно создавать xls с помощью компонентов прямого создания файлы xls, но это решит только 70 процентов проблем у пользователей, а у остальных 30 процентов будет все так же.
     
    spasius
    НУ я знаю, в принципе подходит EMS Advanced Data Export Component Suite или то, что ты назвал. Но хотелось бы именно для динамического запуска OpenOffice и в нем автоматического создания всей той инфы, которую нужно показать пользователю.
     
    Если понадобиться, то могу текущий свой самописный класс показать


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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 10:07 06-07-2009
    SerGap



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

    Цитата:
    то есть у тебя происходит 20 раз копирование одной и той же директории с места на место

    Это не так, в коде, который я привел здесь, просто для наглядности написано так:
    Source:='источник';  
    Target:='цель';
    в моем же реальном коде, естественно Source и Target вычисляются и подставляются каждый раз новые в процессе выполнения цикла.
     

    Цитата:
    Я в принципе это и предполагал, так как у этой функции нет параметра для прогресс бара

    Как нет? А это?
    for i:=0 to 20 do
    .......
    ProgressBar1.Position:=i*10;
    .......
     

    Цитата:
    В ней вначале получаешь размер всех файлов..

    У меня другая проблема, мне не нужен прогрессбар зависящий от общего размера файлов. У меня кучка маленьких файлов, поэтому смысла заморачиваться на привязку к общему размеру нет. Т.е. вполне, в этом конкретном случае, полностью устраивает привязка к количеству файлов.
     

    Цитата:
    .. надо вначале разобраться как работает данная процедура..  
    ..то есть она не возвращает управление пока не закончится

    Вот как раз похоже на то что в моем случае возвращает, может из-за этого и проблема.
     
    Попробую резюмировать:
    1. Если я НЕ прописываю после завершения цикла строку
        ProgressBar1.Visible:=False;
        то все нормально отображается, т.к. процесс копирования начался, а программа
        побежала дальше по коду, НО... прогрессбар не отключен и у него есть время
        нормально отрисоваться.
    2. Если прогрессбар выключить сразу после цикла, то как писал впечатление отправки
        копирования в отдельный процесс и мгновенное отключение прогр.бара.
    3. Вполне допускаю что это особенность Weaver'а, поэтому было бы неплохо найти
        способ отслеживания момента физического завершения процесса копирования
        и после этого выключать прогрессбар.
    4. Sleep(100) пока что является единственным способом дать шанс прогрессу  
        отобразиться именно в процессе копирования.
     
     

    Всего записей: 541 | Зарегистр. 21-12-2008 | Отправлено: 10:45 06-07-2009 | Исправлено: SerGap, 11:05 06-07-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    А как OpenOffice реагирует, когда в него из браузера табличку копируешь? Просто можно попробовать формировать в памяти html-страничку, а потом через буфер обмена вставлять. Но это конечно только если в ячейках будет обычный текст.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:28 06-07-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    Хреново реагирует как-то. Тем более все равно надо сделать полный автомат, а не чтоб пользователь вставлял из буфера обмена сам. Так что уже много чего передумал на эту тему, самое легкое подготовить файл и его открыть через обычный ShellOpen. Но опять же проблема в том, что у процентов 30 пользователей прав на запись как класс нет.

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 13:21 06-07-2009
    volser

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

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 13:31 06-07-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вопрос такой где что поменять у TMSDump чтобы поля формата datetime выгружались в таком вот формате '21.12.2009' ('dd.mm.yyyy'), а не поумолчанию '2009-12-21 00:00:00' (yyyy.mm.dd hh:mm:cc)

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 14:06 06-07-2009
    SerGap



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

    Цитата:
    Попробуйте использовать Timer...

    Вот, честно говоря я так по началу и сделал, но он ведь будет всегда через определенное время отключать прогрессбар. Если будет отключать через дольшее время чем идет копирование - то не страшно. А если копирование "забуксует" - то внешне можно будет подумать что копирование завершено (таймер ведь все-равно прогрессбар отключит), а это уже совершенно не правильно.

    Всего записей: 541 | Зарегистр. 21-12-2008 | Отправлено: 14:27 06-07-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SerGap
    Таймер включать после выполнения цикла. В таймере отключать сам таймер.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 14:28 06-07-2009
    SerGap



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    volser
    Да, именно так и делал.
     
    Вобщем мне кажется ShIvADeSt натолкнул на правильную мысль насчет FullDirectoryCopy, видать ее надо править под новые сборки Delphi, чтобы она не давала выполнятся коду дальше пока она полностью не отработает.

    Всего записей: 541 | Зарегистр. 21-12-2008 | Отправлено: 14:49 06-07-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SIgor33
    Данные для скрипта берутся через AsString. Поскольку у вас тип поля DateTime, то значения получают так StrToDateTime. Для того чтобы данные были без времени приведите типы полей в самом запросе к типу дата. Бекап делайте через BackupQuery. Чтобы был правильный формат для даты опишите его здесь ShortDateFormat.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 14:56 06-07-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    volser
    Во первых TMSQuery не нашел процедуры BackupQuery. Ткните меня носом.
    А во вторых использую TMSDump имено потому что делаю дамп нескольких таблиц вот отсюда вопрос и возник

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 15:54 06-07-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SIgor33
    Почему TMSQuery если вы работаете с TMSDump? Сейчас в наличии нет MSDac, есть только UniDac, так что могут быть некоторые неточности. Вы можете сделать наследника TDADumpProcessor, у которого перекрыть метод BackupData. Дальше в классе TMSDump перекрыть метод GetProcessorClass, указав свой процессор.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 16:11 06-07-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    volser
    Frodo_Torbins
    Нашел в инете описание, как работать с OpenOffice. Буду по этому описанию стало быть дописывать код

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 16:40 06-07-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    volser
    Незнаю как будет работать ваш метод сложновато как то.
    Я в исходники где MSDump изменил dateformat все пошло.
    Только не известно как поведет себя на сервере где формат даты будет отличаться от европеийской

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 16:47 06-07-2009
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    All
    Уважаемый алл . Хотя это скорее не вопрос, но далее я поясню. Хочу поздравить всех посетителей этого топика (в первую очередь) и с двумя событиями.
    Первое не такое грандиозное - второго числа Microsoft выпустила сервис-пак 2 для Vista. Молодцы, - во первых символичная дата 02.07.2009. Сервис-пак 2, а у них ещё и система - семёрка. Во вторых выпустили они её ровно за четыре дня до 40000-го дня.
    С 40000-м днём всех!!!
     
    Сегодня DateTime1 := Trunc(Now);  вернёт вам 40000! По какому календарю не помню, но это сегодня умеет делать Delphi!!!!

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 18:18 06-07-2009 | Исправлено: delover, 18:20 06-07-2009
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ps  
    Незнаю, если я правильно понял Юлианский календарь отсчитывает дни от Рождества Христова. Григорианский, которым пользуемся и мы вносит некоторые тонкости о количестве дней в году и отсчитывает дни с конца 1899-го года (т.е.) с начала 1900-го. Вот именно с 1900-го года прошло сорок тысячь дней. Довольно реткое событие, с чем и поздравляю.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 20:30 06-07-2009 | Исправлено: delover, 20:31 06-07-2009
    OOD

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите гуру Delphi есть dbf файл к которому подключен с delphi 7 ...
    В DbGrid font.charset  стоит OEM_CHARSET данные отображаются почти нормально , за исключением отсутствия украинской буквы "і", но это не так страшно.... не могу вбить данные вбивая их на русском , они вбиваются но после этого отображаются в неправильно кодировке (иероглифами..) как их вбивать через  DbGrid сразу в кодировке OEM_CHARSET?

    Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 13:59 07-07-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    OOD
    Какие компоненты доступа к данным используете?

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 14:11 07-07-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