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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    volser
    Это я читал, а без ADO ?

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

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



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

    Цитата:
    Если не присвоить nil, то после dispose(p1); оба указателя никуда не указывают и вроде как не существуют

    Я просто это еще не осознал . Будем думать .

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 17:36 27-10-2009
    RomanTim

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Cryogen2003
    http://msdn.microsoft.com/en-us/library/aa772170%28VS.85%29.aspx

    Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 17:48 27-10-2009
    Cryogen2003



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

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 17:50 27-10-2009
    Frodo_Torbins

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

    Код:
    dispose(p1);
    p1:=nil;
    if Assigned(p2) then dispose(p2); //а тут p2 показывает в общем случае в космос

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:57 27-10-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Ну и на этом спасибо, теперь хоть понятно как расжимать строку. Пригодится.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:07 27-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Varenik
    и я сам
    Мы тут с вами наверное, вконец запутали человека  
     
    JohnSilver182
    Я бы порекомендовал, все таки, почитать какую-нибудь литературу сперва, чтобы сложилось хоть какое-то представление... А потом уже - к нам...
     
    От себя еще добавлю 5 копеек:
    Ф-ция Assigned НЕ ПРОВЕРЯЕТ, РАСПРЕДЕЛЕНА ЛИ ПАМЯТЬ по данному указателю, а всего лишь проверяет указатель на равенство nil.. Цитата из справки:

    Цитата:
    Assigned function
    Tests for a  nil (unassigned) pointer or procedural variable.
     

    Таким образом, на самом деле:

    Код:
     
    var p1,p2:^integer;  // Объявить указатель на целое
    begin
    new(p1);new(p2);     // Отвести под указатели области памяти
    p1^:=1;              // Указателю p1 указывать  на 1
    p2:=p1;              // Указателю p2 указывать на ту же 1
    dispose(p1);         // Освобождаем память, на которую указывает указатель.
                         // После этого указатель p1 НЕ СТАНОВИТСЯ равным nil,
                         // и не меняет своего значения!!! Просто та область памяти,
                         // на которую он указыват, уже не существует!!!
    if Assigned(p2) then // Аналогично - память, на которую указывает p2 уже не
                         // существует, мы ее освободили вызовом dispose(p1),
                         // однако p2 <> nil (p2 попрежнему имеет значение того
                         // адреса, по которому когда-то была распределена память),
                         // поэтому Assigned(p2) = true
      dispose(p2);       // тут справедливый эксцершен, а что ж ты хотел...
     

    Думаю, корректнее подобные коды заключать в блоки try...finally типа такого:

    Код:
     
    var p1,p2:^integer;      // Объявить указатель на целое
    begin
      new(p1); new(p2);      // Отвести под указатели области памяти
      try
        p1^:=1;              // Указателю p1 указывать  на 1
        p2:=p1;              // Указателю p2 указывать на ту же 1
      finally
        dispose(p1);         // Что бы не случилось между try...finally, по любому  
                             // освобождаем память, на которую указывает указатель.
                             // После этого указатель p1 НЕ СТАНОВИТСЯ равным nil,
                             // и не меняет своего значения!!! Просто та область памяти,
                             // на которую он указыват, уже не существует!!!
        p1:= nil; p2:= nil;  // обнуляем указатели
        // теперь Assigned(p2) равно как и Assigned(p1) даст ложь
      end;
    end;
     

     

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 21:12 27-10-2009 | Исправлено: psa1974, 21:15 27-10-2009
    NOwlar



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Только new(p2) делать не надо - утечка памяти образуется.

    Всего записей: 170 | Зарегистр. 25-01-2006 | Отправлено: 12:51 28-10-2009
    psa1974



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

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 13:07 28-10-2009
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не так то все просто с указателями

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 13:29 28-10-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как можно сделать удаление файла, который открыт другим приложением? Ну или может быть как поставить файл на удаление после освобождения его другой программой?
     
    То есть для чего нужно:  
    1) Создается tempfile  для запуска по нему через shellexecute ассоциированной программы.
    2) А потом стало быть файл надо удалить
     
    Может быть просто такое, что тот же excel, acrobat reader забыли закрыть и файл разумеется не удалиться.  
    Через вставку в RunOnce это конечно работает, но если пользователь имеет права простого usera, то такое просто не прокатывает.
     
    Стало быть, чего делать?

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 13:39 28-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnSilver182
    Нихто и не говорил, что просто! Наоборот - прямая работа с указателями - потенциальный источник проблем (хотя и открываются большие возможности). Тут надо отдавать полный отчет своим действиям, поскольку компилятор на такие вещи смотрит "сквозь пальцы" - его достаточно легко ввести в заблуждение.
     
    Добавлено:
    Cryogen2003
    А зачем так сложно? а напрямую почитать в реестре, какая программа ассоциирована с нужным расширением и запустить ее через, например ф-цию CreateProcess? Простой юзер же вроде имеет доступ к реестру по чтению?

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 13:48 28-10-2009
    volser

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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    Смотри под # запуск программы по расширению (имя исполняемого модуля берется из реестра)...
     

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 15:35 28-10-2009 | Исправлено: psa1974, 15:41 28-10-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    psa1974
    Секунду, ну программу я предположим запустил, но в нее же надо передать сам файл для открытия.
    Ну может быть вы просто меня не совсем поняли, к примеру я должен открыть файл Excel, то есть должен запустить сам excel с параметром в виде этого файла
     
    volser
    Файл может быть 20 килов, а может быть и 20 мегов (программа по электронодокументообороту ).  
     


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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 15:48 28-10-2009 | Исправлено: Cryogen2003, 15:52 28-10-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    WinRAR при каждом запуске проверяет не остались ли старые временные файлы, и если остались, то удаляет.
    Еще при создании файла можно ему указать атрибут FILE_FLAG_DELETE_ON_CLOSE.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:57 28-10-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Программно из бд загружается данные в richеdit потом  нужно найти в нем слова по шаблону и выделить .......
    как мне найти слова по шаблону типа "л*лиум" где * любое колво символов.....

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 15:59 28-10-2009
    Cryogen2003



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

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 16:03 28-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cryogen2003
    Да, не так понял  
    Хорошо, тогда такой вариант: запускаем программу вместе с файлом через ту же ф-цию CreateProcess (почти как в том варианте, что я привел), получаем дескриптор созданного процесса и ожидаем, пока процесс не завершится, после чего со спокойной душой и чистой совестью убиваем файл. Если надо будет пример реализации - скажи, скину...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 16:10 28-10-2009 | Исправлено: psa1974, 16:12 28-10-2009
    Cryogen2003



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    psa1974
    Да не, с реализацией то все понятно, просто по идее тоже нельзя сидеть и ждать до последнего, пока документ просмотрят, закроют процесс и только потом прибивать все.  Просто я тут вспомнил есть программа, которая умеет закрывать все дескрипторы и потом в принципе можно с файлом делать что хочешь (программа звалась Unlocker), вот и подумал, что может быть это легко сделать
     
    Хотя судя по всему придется сделать именно как ты сказал, а то пользакам дай волю, так пооткрывают у себя 100 документов

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

    Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 16:16 28-10-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