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

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

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

    Цитата:
    Как интересно...
    , ага, есть такое. Вопрос задавал из дома, а коммент писал с работы. И сам уже не помню, то ли профиля, два, то ли ещё чего...
    С индией засада. Снёс старую (вроде основательно), скомпилил и установил новую. Результат абсолютно идентичный, на выходе ловлю ответ типа

    Где же там сабака зарыта? Раньше (вроде на 9-х индях) меня спасало Utf8ToAnsi(IdHTTP1.post ...), а сейчас при таком алгоритме просто вышеуказанные кракозяблы превращаюцца в ??????. Но хочется ведь увидеть наш великий и могучий.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 09:30 30-10-2009 | Исправлено: Maximus777, 09:37 30-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maximus777
    Поставил патченую или официальную?  
    Дай ссылку, которую пытаешься загрузить, попробую у себя
    Насчет Utf8ToAnsi - в Дельфи 2009 это не надо.
     
    Берем урлу http://www.inf.ru/,
    Делаем:

    Код:
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      LClient : TIdHTTP;
    begin
      LCLient := TIdHTTP.create(nil);
      try
        if Edit2.Text <> '' then
          begin
          LClient.ProxyParams.ProxyServer := copy(Edit2.Text, 1, pos(':', Edit2.Text)-1);
          if pos(':', Edit2.Text) <> 0 then
            LClient.ProxyParams.ProxyPort := StrToInt(copy(Edit2.Text, pos(':', Edit2.Text)+1, $FF))
          else
            LClient.ProxyParams.ProxyPort := 80;
          end;
        Memo1.Lines.Text := LClient.Get(Edit1.Text);
      finally
        LCLient.Free;
      end;
    end;
     

    Получаем:
    Ссылка

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 10:44 30-10-2009 | Исправлено: psa1974, 10:45 30-10-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DreamKHV
    В VCL послав специальное сообщение окну, можно получить ссылку на его объект. Ну а там уже добраться до его чилда не проблема. Можно попробовать это сделать через RTTI, если работаем с нестандартным классом. НО:
    • Нужно знать версию делфи, на которой написано приложение;
    • Нужно внедрится в процесс этого приложения (например через хуки);
    • Нужно добраться до его менеджера памяти, чтобы потом не хватать AV.
    Вот такие вот шаманства. Пример реализации: http://www.devrace.com/en/dap/features.php

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    pics.kz
     
    Добавлено:

    Цитата:
    Поставил патченую или официальную?  

    Ставил ту, которую по Ссылке

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 11:38 30-10-2009
    DreamKHV



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

    Всего записей: 21 | Зарегистр. 19-03-2009 | Отправлено: 13:36 30-10-2009
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974, я только вот такой код использую:

    Код:
     procedure TForm1.Button1Click(Sender: TObject);
     var
       data: TIdMultiPartFormDataStream;
     begin
       data := TIdMultiPartFormDataStream.Create;
       try
         data.AddFile('fileData[]', Edit1.Text,'multipart/form-data');
         data.AddFormField('action', 'upload');
         data.AddFormField('galleries', '15');
         data.AddFormField('preview','1');
         data.AddFormField('preview_size','180');
         Memo1.Lines.Text := IdHTTP1.Post('http://pics.kz', data);
       finally
         data.Free;
       end;
     end;

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:54 30-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maximus777
     
    Поставь перед строкой  
    Memo1.Lines.Text := IdHTTP1.Post('http://pics.kz', data);
    строку
    IdHTTP1.Response.CharSet:= 'utf-8';
    Это мне позволило с помощью метода IdHTTP1.Get в моем примере из предыдущего поста получить правильные букофки со страницы http://pics.kz

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 15:45 30-10-2009
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974, земной поклон. Работает, чтоб его! Спасибо за помощь.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:13 31-10-2009 | Исправлено: Maximus777, 15:40 31-10-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DymDym2
    Это как-то относится к вопросам по Delphi ?
    А "новости" этой уже 5 дней - подпишитесь на DelphiFeeds.

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 20:32 31-10-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DymDym2
    Ну и зачем было отвлекать на такую ерунду ? Что ценного  из этой новости я должен был извлечь? (вопросы риторические).

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 22:45 31-10-2009 | Исправлено: psa1974, 22:46 31-10-2009
    bruteALEX



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос по Indy - pop3
    Забираю почту через свой самописный мини-клиент с ее дальнейшей обработкой. Но иногда случается необходимость забирать копию в Mozilla Thunderbird, но после забора или там или там повторно письма не забираются. Можно ли через pop3 присваивать письмам статус непрочитанный в Delphi (Indy)? Может в Imap!  
    Пожалуйста не посылайте читать документации pop, imap или каких-то там mime я не прогер и мне это как-то не идет
     
    Спасибо за ответ
    p.s. Почта от gmail

    Всего записей: 145 | Зарегистр. 03-01-2005 | Отправлено: 17:08 01-11-2009
    GrHnd



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SerBUser
    Спасибо - пригодится обязательно!

    Всего записей: 865 | Зарегистр. 01-04-2005 | Отправлено: 14:30 02-11-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привествую. Хочу спросить про потоки, а именно как корректно завершать поток, созданный через BeginThread. До запуска потока диспетчер задач показывает примерно 100 дескрипторов, а после - примерно в два раза больше. С чем это может быть связано.
     
    Код функции:
     

    Код:
    function ThreadCallback(LpParameter: Pointer): DWORD; stdcall;
    begin
     
      SetThreadPriority(hThread, THREAD_PRIORITY_BELOW_NORMAL);
     
      MessageBox(0, nil, nil, MB_OK);
     
      Result := 0; // Set up a 0 return value
      EndThread(0); // End the thread
     
    end;

     
    Код запуска:
     

    Код:
      hThread := BeginThread(nil, 0, @ThreadCallback, nil, 0, ThreadID);
      CloseHandle(hThread);
     

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:36 04-11-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите.
    Имеется ClientDataSet в режиме кэширования. Если пользователь отказывается от изменений при закрытии формы, то пишу действие:
    ClientDataSet.Cancel;
    ClientDataSet.CancelUpdates;
    При этом данные сбрасываются, но файл пересохраняется.
    Как избавится от пересохранения файла?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 19:13 04-11-2009
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    А зачем использовать именно BeginThread/EndThread? Это, в общем-то, внутренние функции RTL, не особо предназначенные для непосредственного использования. Как по мне - то лучше пользоваться либо классом TThread, либо чистым WinAPI.
     
    ...А почему хэндлы "текут"... Ну, во-первых, CloseHandle(hThread) не остановит и не уничтожит поток - поток будет выполняться, пока сам не закончиться (пока не выйдет из основной функции потока). А основная функция потока в случае использования BeginThread/EndThread - это некий ассемблерный ThreadWrapper внутри System.pas, который Вашу ThreadCallback вызывает уже сам. И когда и как он должен закончиться - надо смотреть в отладчике. А во-вторых - точно, что функция потока содержит только такой код и больше ничего? Если трассировать в отладчике, то в каждой из этих точек (как в основном потоке, так и в дочернем):
     
      1. hThread := BeginThread(nil, 0, @ThreadCallback, nil, 0, ThreadID)
     
      2. CloseHandle(hThread)
     
      3. сразу после CloseHandle(hThread)
     
      4. SetThreadPriority(hThread, THREAD_PRIORITY_BELOW_NORMAL);
     
      5. EndThread(0)
     
      6. сразу после EndThread(0) (если код функции именно такой, как показан - то точка должна быть на end;)
     
    - сколько будет занято хэндлов?

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 22:59 04-11-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Попробуйте перед отменой установить ClientDataSet.FileName := '';

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 23:52 04-11-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    Да тут начитаешься форумов, я вообще запутался как надо. Одни советуют мол BeginThread лучше использовать чем CreateThread, якобы инициализирует свои обработчики исключений или типа того, вообще муть какая-то. Смотрел на забугорных форумах что "гуру" предлагали, там вообще код типа CloseHandle(BeginThread(***)), мне вообще показался такой код странноватым.
     
    Я с отладчиком не дружу, но видать надо было в меню Run->Add breakpoint->Source breakpoint на ту строку на которой код. Результат получился такой.
     
    1.99
    2.100
    3.100
    4.99
    5.211
    6.207
     
    Потом если вызывать диалоговую процедуру, в которой в WM_INITDIALOG стартует этот поток, количество хэндлов будет оставаться таким же, ну может быть до 200 доходит, но дальше не увеличивается.
     
    Хотя может и мой косяк. Вместо MessageBox там тестово.
     

    Код:
      hTimer := SetTimer(hDwn, 0, 1000, nil);
     
      //
     
      GetTextFileFromServerW(AServerInfo[IndexUpdate].szLink, szBuf);
      if (szBuf <> '') then MessageBox(0, @szBuf[1], nil, MB_OK);
     
      //
     
      if (hTimer <> 0) then
        KillTimer(hDwn, hTimer);
     
     

     
    Ну и сама загрузка файла:
    >>>

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 01:26 05-11-2009
    Odysseos



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

    Цитата:
     
    код типа CloseHandle(BeginThread(***)), мне вообще показался такой код странноватым
     

     
    Строго говоря - Ваш код с промежуточной переменной по сути ничем не отличается от такой записи, всё то же самое - в обоих случаях мы просто говорим ОС, что нам этим потоком управлять не хочется, и ОС должна управлять им сама (а управлять она будет одним способом - принудительно "прибьёт" поток при завершении приложения - причём, не дожидаясь окончания выполнения им своей процедуры, в произвольном месте). Именно для того, чтоб можно было как-то управлять жизнью потока, у объектов класса TThread есть свойство Terminating.
     
     

    Цитата:
     
    ...
    4.99 (SetThreadPriority(hThread, THREAD_PRIORITY_BELOW_NORMAL);)
    5.211 (EndThread(0))
    ...
     

     
    Отсюда видно, что прирост хэндлов происходит не из-за собственно _создания_ потока, а из-за неких действий внутри процедуры потока - после которых хэндлы не освобождаются.
     
     
    По поводу же процедуры загрузки... Я, честно говоря, WinInet'ом никогда не пользовался, потому - внятно прокомментировать код не могу; вроде, на поверхностный взгляд ошибок с освобождением ресурсов там нет - однако ж хэндлы действительно расходуются... Могу предположить, что для работы WinInet'а инициализируются некие внутренние структуры (причём - не в самом WinInet.pas, а в нижележащем коде самой ОС), для которых и нужны эти самые хэндлы - и они будут автоматически освобождены при завершении приложения. Проверить это предположение просто - надо создать этот поток два-три раза (скажем, повесить его создание на кнопку, и щёлкать по ней), и проверить количество хэндлов при каждом запуске потоке.
     
     
    ...А зачем там два вложенных блока try ... finally с _пустым_ finally? Такой код, конечно, будет работать без проблем - но смысла не имеет. Чтоб тихо "погасить" возможные exception'ы - надо использовать блоки try ... except.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 08:40 05-11-2009 | Исправлено: Odysseos, 08:58 05-11-2009
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    А ну у меня по нажатии на кнопку и появляется диалоговое окно, а при инициализации этого диалога собственно и стартует этот поток. Количество открытых дескрипторов равняется 200 после первого запуска потока и варьируется вокруг этого числа.
    Код можно переделать и под except, но сам код впринципе-то не такой уж и мудренный чтобы исключения обрабатывать еще. А то можно и MessageBox в try except завернуть при желании, только надо ли.
    Да, надо будет посмотреть утечку ресурсов от WinInet, что-то подобное попадалось раньше. Сдается мне что как вариант можно и динамическую подрузку библиотеки использовать как с uxtheme.dll поступают.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 15:17 05-11-2009
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    Это, скорей всего, не утечка - а нормальное штатное поведение. Эти ~100 хэндлов нужны для работы функций WinAPI, описанных в WinInet.pas - просто резервируются они не сразу при запуске приложения, а при первом вызове соотв. функций, и потом корректно "отпускаются" при завершении работы приложения.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 15:23 05-11-2009 | Исправлено: Odysseos, 18:56 05-11-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