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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Длинные строки и динамические массивы в Delphi все подробно расписано

    Всего записей: 34 | Зарегистр. 10-05-2011 | Отправлено: 11:39 25-09-2011
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброе время суток!!!
    Подсабите... есть код: Но есть загвоздка. А именно если oldstring длинее  newstring, как в этом случае, тогда получается не 1234 а 1234ty...
    Как уброть лишнее?
     
    procedure patch_exe;
    begin
    oldstring := 'qwerty';
    newstring := '1234';
    FileName := Form1.Edit1.Text+'.exe';
    s := oldstring;
    AssignFile(f, FileName);
    Reset(f, 1);
    for l := 0 to FileSize(f) - Length(oldstring) - 1 do
    begin
    Application.ProcessMessages;
    Seek(f, l);
    BlockRead(f, oldstring[1], Length(oldstring));
    if oldstring = s then
    begin
    seek(f, l);
    BlockWrite(f, newstring[1], Length(newstring));
    end;
     
    Application.ProcessMessages;
    end;
    CloseFile(f);
    showmessage('Done ');
    end;

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 07:05 26-09-2011
    data man



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

    Код:
    ...
    uses
      Windows, SysUtils;
    ...
    FileHandle := CreateFile(PСhar(Filename), GENERIC_WRITE, fmOpenWrite, Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    SetFilePointer(FileHandle, нужная длина, Nil, FILE_BEGIN (или FILE_END);
    SetEndOfFile(FileHandle);
    CloseHandle(FileHandle);
    ...
     


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

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 08:07 26-09-2011
    GRom V

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

    Цитата:
    Код:...  
    uses  
      Windows, SysUtils;  
    ...  
    FileHandle := CreateFile(PСhar(Filename), GENERIC_WRITE, fmOpenWrite, Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  
    SetFilePointer(FileHandle, нужная длина, Nil, FILE_BEGIN (или FILE_END);  
    SetEndOfFile(FileHandle);  
    CloseHandle(FileHandle);  
    ...

     
    Прошу просчения.... А можно практически - как это с моим кодом подружить???

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 08:58 26-09-2011
    YuriyRR



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

    Цитата:
     тогда получается не 1234 а 1234ty...

     
    procedure SetLength(var S; NewLength: Integer);
     
    Description
     
    S is a Delphi string or dynamic-array variable.
     
    NewLength is the new number of characters or elements in S.
     
    For a short-string variable, SetLength simply sets the length-indicator character (the character at S[0]) to the given value. In this case, NewLength must be a value between 0 and 255.
     
    For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. The one exception is when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 09:37 26-09-2011
    ShIvADeSt



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

    Цитата:
    Подсабите... есть код: Но есть загвоздка. А именно если oldstring длинее  newstring, как в этом случае, тогда получается не 1234 а 1234ty...  

    Если уберешь лишнее (уменьшишь размер ехешника на 2 байта) простым обрезанием строки, то получишь битый файл. Заполни пробелами до длины начальной строки и все. А если новая строка длиннее старой, то просто так не заменишь (опять же именно в ехешнике).

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:46 26-09-2011
    GRom V

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

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 10:18 26-09-2011
    my610

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V, если нужно обрезать строку в бинарнике, просто пропиши в ее конец 0x00:

    Код:
     
    71 77 65 72 74 79   qwerty    было
    31 32 33 34 00 00   1234       надо сделать
    31 32 33 34 00 79   1234.y    стало
     
    , тогда бодет отображаться 1234, но это возможно только если oldstring >= newstring, иначе нужно более серьезная модификация бинарника

    Всего записей: 34 | Зарегистр. 10-05-2011 | Отправлено: 10:51 26-09-2011
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    my610
    Спасибо за наводку (хотя на водку хватает)....глянь личку плизз

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 16:04 26-09-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вобщем спасибо всем  то дал ценные указания насчет работы с указателями.
    У меня вот непонятки с XML. Начал недавно осваивать. Почему-то если вызвать xml.documentElement, то при завершении работы программы появляется ошибка нарушения доступа. Это все, если вызвать CoUninitialize. Но блин получается я же должен закрыть COM и освободить ресурсы. В чем ошибка?
     

    Код:
    var
      hr     : HRESULT;
      xml    : IXMLDOMDocument;
      node   : IXMLDOMNode;
      child  : IXMLDOMNodeList;
      bRet   : Boolean;
      iCount : Integer;
      IdItem : Integer;
      pszData: WideString;
      pszText: WideString;
    begin
      hr := CoInitialize(nil);
      if (hr = S_OK) then
      try
        hr := CoCreateInstance(CLASS_DOMDocument, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IID_IXMLDOMDocument, xml);
        if (hr = S_OK) then
        try
          xml.async := FALSE;
          bRet := xml.load('file.xml');
          if bRet then
          begin
            node := xml.documentElement;
            {iCount := node.childNodes.length;
            for IdItem := 0 to (iCount - 1) do
            begin
              pszText := pszText + FormatW('Index = %d; ', [IdItem]);
              child := node.childNodes.item[IdItem].SelectNodes('type');
              pszData := child.item[0].text;
              pszText := pszText + FormatW('type = %s; ', [pszData]);
              child := node.childNodes.item[IdItem].SelectNodes('name');
              pszData := child.item[0].text;
              pszText := pszText + FormatW('name = %s; ', [pszData]);
              pszText := pszText + sLineBreak;
            end;
            MessageBoxW(0, LPWSTR(pszText), nil, MB_OK);}
          end;
        finally
          xml := nil;
        end;
      finally
        CoUninitialize;
      end;
    end.

     
    А вообще есть интерфейс каой-нибудь у msxml чтобы из буфера читать? Я загружаю файл из сети и скармливаю ей буфер. Неохото сохранять файл на диске.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:14 26-09-2011 | Исправлено: Maks150988, 19:16 26-09-2011
    data man



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

    Цитата:
    У меня вот непонятки с XML. Начал недавно осваивать.  

    Лучше сразу перейти на альтернативные компоненты (OmniXML, NativeXML, etc.), пока не поздно.  

    Цитата:
    чтобы из буфера читать?

    В них всё это есть.

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

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 19:43 26-09-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Компилятор делфи пытается сам освободить интерфейсы. Необходимый для этого код он вставляет после всего вашего кода, и перед "end.". В вашем случае это означает что действия с ком-обьектами производятся после вызова CoUninitialize. Попробуйте весь код по работе с интерфейсами вынести в отдельную процедуру, а CoUninitialize дергать после вызова этой процедуры. Если переменные-интерфейсы будут локальными для процедуры, то и код их закрытия компилятор вставит в конец этой процедуры, а не в конец программы.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:56 26-09-2011 | Исправлено: Frodo_Torbins, 19:59 26-09-2011
    druff

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

    Цитата:
    Лучше сразу перейти на альтернативные компоненты (OmniXML, NativeXML, etc.), пока не поздно.

     
    Почему?

    Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 11:27 27-09-2011
    ShIvADeSt



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

    Цитата:
    Почему?

    Потому что они имеют более человеко-ориентированные методы, чем стандартный от МС. Сам в свое время пытался юзать ДОМ от МС, однако мне не хотелось жрать кактус и я перешел на SimpleXML Там все гораздо проще.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:14 28-09-2011
    druff

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    спасибо. Я как раз раздумывал о формате для хранения сопроводительной информации к файлам. Надо сравнить эти альтернативные..

    Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 10:05 28-09-2011
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Для не очень больших файлов вполне хватит и ДОМ от МС.

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 23:21 28-09-2011
    ShIvADeSt



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

    Цитата:
    Для не очень больших файлов вполне хватит и ДОМ от МС.

    Тут дело такое, что я для того чтобы начать парсить простые и небольшие (для теста) хмл файлы при помощи ДОМ от МС потратил столько времени (правда это было более 5 лет назад, но все же), что плюнул и попробовал SimpleXML (мне его хватало за глаза) - результат - за пол часа я сделал все то же что и раньше, при этом мне хватило встроенной ридмишки. Плюс - если мне надо что то поправить в результатах вывода в хмл - я просто правил код SimpleXML и получал нужное. В случае с ДОМ - такой финт не прокатит.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:38 29-09-2011 | Исправлено: ShIvADeSt, 04:39 29-09-2011
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как в Windows 7 можно заблокировать или убрать кнопку Пуск

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 11:30 01-10-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V
    Заменить всю оболочку своей. А зачем это вообще нужно?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:56 01-10-2011
    Bladerender

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

    Всего записей: 13 | Зарегистр. 15-01-2007 | Отправлено: 12:11 01-10-2011
    Открыть новую тему     Написать ответ в эту тему

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