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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    Понятно. Тогда Apollo предлагать не буду .
    Насколько я понял, сам dbf-файл для экспорта создается из программы. Про более старый провайдер для FoxPro я ничего не знаю, поэтому предложу такой вариант. Создать пустой dbf-файл нужной структуры в таком же FoxPro как и у заказчика, сохранить в "укромном" месте, а потом просто копировать его и заполнять экспортными данными.

    Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 19:14 19-08-2011
    XPerformer



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

    Цитата:
    Создать пустой dbf-файл нужной структуры в таком же FoxPro как и у заказчика, сохранить в "укромном" месте, а потом просто копировать его и заполнять экспортными данными.

     
    Поддерживаю - лучший вариант для достижения совместимости.
    А для доступа к dbf рекомендую легкую и быструю библиотеку TDbf в исходниках
    http://sourceforge.net/projects/tdbf/files/
    Долгое время беспроблемно использовал для экспорта/импорта ее версию 4.0

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 19:40 19-08-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток. Расширил функционал ListBox. Создал свою структуру для каждого элемента наподобие ListView.
     
    type
      tagLISTBOXEXITEMW = packed record
        mask      : UINT;
        state     : UINT;
        pszText   : LPWSTR;
        cchTextMax: Integer;
        iImage    : Integer;
      end;
      PListBoxExItemW = ^TListBoxExItemW;
      TListBoxExItemW = tagLISTBOXEXITEMW;

     
    Обрабатываю сообщения по вставке/удалению строк.
     
    function CtrlWndProc_LbAddString(pcp: P_CTRL_PRO; hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
    var
      iCount: Integer;
      bRet  : Boolean;
    begin
      Result := CallWindowProcW(@pcp.CtrlProc, hWnd, uMsg, wParam, lParam);
      bRet := (Result <> LB_ERR) and (Result <> LB_ERRSPACE);
      if bRet then
      begin
        iCount := SendMessageW(hWnd, LB_GETCOUNT, 0, 0);
        SetLength(pcp.ItemData, iCount);
        pcp.ItemData[Result].state      := 0;
        pcp.ItemData[Result].iImage     := I_IMAGENONE;
        pcp.ItemData[Result].pszText    := '';
        pcp.ItemData[Result].cchTextMax := 0;
        RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
      end;
    end;
     
    function CtrlWndProc_LbInsertString(pcp: P_CTRL_PRO; hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
    var
      iCount: Integer;
      bRet  : Boolean;
    begin
      Result := CallWindowProcW(@pcp.CtrlProc, hWnd, uMsg, wParam, lParam);
      bRet := (Result <> LB_ERR) and (Result <> LB_ERRSPACE);
      if bRet then
      begin
        iCount := SendMessageW(hWnd, LB_GETCOUNT, 0, 0);
        SetLength(pcp.ItemData, iCount);
        if (Result < (iCount - 1)) then
          CopyMemory(
            @pcp.ItemData[Result + 1],
            @pcp.ItemData[Result],
            (iCount - 1 - Result) * SizeOf(pcp.ItemData[0])
          );
        pcp.ItemData[Result].state      := 0;
        pcp.ItemData[Result].iImage     := I_IMAGENONE;
        pcp.ItemData[Result].pszText    := '';
        pcp.ItemData[Result].cchTextMax := 0;
        RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
      end;
    end;
     
    function CtrlWndProc_LbDeleteString(pcp: P_CTRL_PRO; hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
    begin
      Result := CallWindowProcW(@pcp.CtrlProc, hWnd, uMsg, wParam, lParam);
      if (Result <> LB_ERR) then
      begin
        if (wParam < Result) then
          CopyMemory(
            @pcp.ItemData[wParam],
            @pcp.ItemData[wParam + 1],
            (Result - wParam) * SizeOf(pcp.ItemData[0])
          );
        SetLength(pcp.ItemData, Result);
        RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
      end;
    end;
     
    function CtrlWndProc_LbResetContent(pcp: P_CTRL_PRO; hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
    begin
      Result := CallWindowProcW(@pcp.CtrlProc, hWnd, uMsg, wParam, lParam);
      SetLength(pcp.ItemData, 0);
      RedrawWindow(hWnd, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
    end;

     
    Теперь необходимо вставить в элемент ListBox свою структуру.
     
    pszText := 'SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_EX_SETITEMINFO, i, Integer(@info))';
      i := SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_ADDSTRING, 0, Integer(LPWSTR(pszText)));
      ZeroMemory(@info, SizeOf(TListBoxExItemW));
      info.mask       := LBIF_TEXT or LBIF_IMAGE or LBIF_STATE;
      info.iImage     := 2;
      info.state      := LBIS_UNCHECKED;
      info.pszText    := LPWSTR(pszText);
      info.cchTextMax := lstrlenW(info.pszText) + 1;
      SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_EX_SETITEMINFO, i, Integer(@info))

     
    Пытаюсь получить содержимое буфера.
     
    SetLength(pszText, MAX_PATH);
                ZeroMemory(@info, SizeOf(TListBoxExItemW));
                info.mask       := LBIF_TEXT;
                info.pszText    := LPWSTR(pszText);
                info.cchTextMax := MAX_PATH;
                SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_EX_GETITEMINFO, iItem, Integer(@info));
                MessageBoxW(hWnd, LPWSTR(psztext), nil, MB_OK);

     
    Получается хрень какая-то. Собственно не понимаю как с пойнтерами работать. Мне нужно присваивать указатели или выделять под них память? Вобщем подскажите как правильнее надо. Ну и если память выделять то GetMem или что-нибудь из WinApi типа ClobalLock + до кучи.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:01 20-08-2011
    Man_Without_Face



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

    Цитата:
    сохранить в "укромном" месте, а потом просто копировать его и заполнять экспортными данными

    Спасибо, так и сделал.
     
    Другой вопрос появился: использую TLMDBrowseEdit для указания пути для копирования файла:
      CopyFile('file.DBF', LMDBEexport.text+'\file.DBF',true);
    Ошибка:
    E2010 Incompatible types: 'string' and 'Pointer'
    В хелпе написано:
    destination  
    Required. Character string destination where the file or files from source are to be copied. Wildcard characters are not allowed.  
     
    Как по другому файл скопировать с указанием заранее не известной директории?
     

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 15:56 22-08-2011
    Gnom3



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

    Цитата:
    Подскажите пожалуйста, как задать цвет окна через HWND?  
     Смысл такой - есть вызываемая функция, которая обрабатывет окно именно через хендл, нужно внутри этой-же функции к тому-же окну задать цвет. Насколько это возможно?

    Нашел ответ - создаю оконную процедуру для моего окна и в нем перерисовываю фон:

    Код:
     
    WM_ERASEBKGND:
       begin
         GetWindowRect(hDlg, DlgRect);  
         DlgRect.Right := DlgRect.Right - DlgRect.Left;
         DlgRect.Left := 0;
         DlgRect.Bottom := DlgRect.Bottom - DlgRect.Top;
         DlgRect.Top := 0;
         BRUSH := CreateSolidBrush($FF0000);
         try
           FillRect(wParam, DlgRect, BRUSH);
         finally
           DeleteObject(BRUSH);
         end;
         Result := 1;
       end;
    Появилась засада - на окне несколько элементов, можно-ли эти элементам, так-же задать цвет родителя снаружи?

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 16:04 22-08-2011
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Man_Without_Face
    CopyFile('file.DBF', PChar(LMDBEexport.text+'\file.DBF'),true);

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 16:40 22-08-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Навскидку, BitBlt с координат верхнего левого угла кнопки на родителе из HDC, полученном через GetDC(GetParent(ЭЛЕМЕНТ)).
    Кстати, заместо GetWindowRect можно использовать GetClientRect без дополнительного подсчета правой и нижней границы.
     
    Кто бы мне подсказал бы еще с моим вопросом... =)

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 11:17 23-08-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я, видимо, не совсем корректно задал вопрос  Прошу не судить за это строго. В общем, на окне находятся несколько объектов типа TNewNotebook и одного типа TPanel. Мне нужно поймать эти объекты и закрасить в цвет окна-родителя.
    Пробую выловить с помощью      EnumWindows(FillRect(wParam, RC1, BRUSH),0); ругается - [Error] Incompatible types: 'Integer' and 'Pointer'
     
    Я рою инет пока, и второй день не нахожу подходящего примера. По сути, нужно получить хендлы дочерних объектов определенного типа и применить к ним определенную функцию.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 17:57 23-08-2011 | Исправлено: Gnom3, 18:36 23-08-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    а статически через свойства не подходит, нужна обязательно динамическая закраска?
    и кол-во контролов наперёд неизвестно что ли?
    и вообще лучше не через АПИ делать, а через vcl-ные
    Components[],  ComponentCount

    Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 18:58 23-08-2011
    Gnom3



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

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

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

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 19:06 23-08-2011
    ShIvADeSt



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

    Цитата:
    Кто бы мне подсказал бы еще с моим вопросом... =)

    Самое простое - посмотри как это сделано в Дельфи (там элементам листбокса можно дату устанавливать), тут проблема в том, что если удаляешь элемент из листбокса, то нужно чистить за ним память.

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:11 24-08-2011
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    в CtrlWndProc_LbDeleteString указатель на строку pszText затирается, а память занятая строкой перед этим не освобождается, так же и в CtrlWndProc_LbResetContent
     
    а как выглядят функции для LB_EX_SETITEMINFO и LB_EX_GETITEMINFO
     
    в LB_EX_SETITEMINFO надо копировать строку из переданного указателя в свой, а не присваивать указатель
     
    в LB_EX_GETITEMINFO нельзя выделять память под возвращаемую строку, её выделяет тот кто шлет сообщение, а раз размер строки заранее не известен, то при передачи nil вместо указателя на строку, должен заполняться размер строки, и только вторым сообщением копирование строки в переданный указатель

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 08:05 24-08-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad
     
    Да это потом сделаю освобождение памяти. Я просто вот чего не пойму. Выполняю заполнение списка через CtrlWndProc_LbAddString два раза. В LB_EX_SETITEMINFO код такой.
     

    Код:
          if ((plbi.mask and LBIF_TEXT) <> 0) then
          begin
            bRet := IsBadWritePtr(plbi.pszText, plbi.cchTextMax);
            if not bRet then
            begin
    //          GetMem(pcp.ItemData[wParam].pszText, plbi.cchTextMax);
    //          ZeroMemory(pcp.ItemData[wParam].pszText, plbi.cchTextMax);
              pcp.ItemData[wParam].pszText := LPWSTR(GlobalAlloc(GPTR, plbi.cchTextMax));
              lstrcpynW(@pcp.ItemData[wParam].pszText, @plbi.pszText, plbi.cchTextMax);
            end;
          end;

     
    Ну а в LB_EX_GETITEMINFO код такой.
     

    Код:
          if ((plbi.mask and LBIF_TEXT) <> 0) then
          begin
    MessageBoxW(hWnd, pcp.ItemData[wParam].pszText, nil, MB_OK);
          end;

     
    В первой строке мусор, во второй - нормально. Не так выделил память или скопировал содержимое? Просто по всякому пробовал. =(

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 18:20 24-08-2011
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    под WideString надо в SizeOf(WChar) раз больше места
    плюс ещё под завершающий двойной null
    IsBadWritePtr(plbi.pszText, (plbi.cchTextMax+1)*SizeOf(WChar));  
    LPWSTR(GlobalAlloc(GPTR, (plbi.cchTextMax+1)*SizeOf(WChar));  
     
    после SetLength(pszText, MAX_PATH); надо бы ещё и обнулить
     
    тут +1 не нужен
    info.cchTextMax := lstrlenW(info.pszText) + 1;  
     
    msdn гласит что IsBadWritePtr, lstrlenW и lstrcpynW небезопасные и предлагает новые

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 23:00 24-08-2011
    Maks150988



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

    Код:
    ZeroMemory(@lbi, SizeOf(TListBoxExItemW));
                  lbi.mask       := LBIF_TEXT;
                  lbi.pszText    := LPWSTR(pszText);
                  lbi.cchTextMax := (lstrlenW(LPWSTR(pszText)) + 1) * SizeOf(WideChar);
                  SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_EX_SETITEMINFO,
                    iItem, Integer(@lbi));

     
    Получение текста:
     

    Код:
          if ((plbi.mask and LBIF_TEXT) <> 0) then
          begin
            bRet := IsBadWritePtr(plbi.pszText, plbi.cchTextMax);
            if not bRet then
            begin
              bRet := IsBadWritePtr(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);
              if not bRet then
                lstrcpynW(plbi.pszText, pcp.ItemData[wParam].pszText, plbi.cchTextMax);
            end;
          end;

     
    Выставление текста:
     

    Код:
          if ((plbi.mask and LBIF_TEXT) <> 0) then
          begin
            bRet := IsBadWritePtr(plbi.pszText, plbi.cchTextMax);
            if not bRet then
            begin
              if (pcp.ItemData[wParam].pszText <> nil) then
                FreeMem(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);
              pcp.ItemData[wParam].cchTextMax := plbi.cchTextMax;
              GetMem(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);
              ZeroMemory(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);
              bRet := IsBadWritePtr(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);
              if not bRet then
                CopyMemory(pcp.ItemData[wParam].pszText, plbi.pszText, plbi.cchTextMax);
            end;
          end;

     
    Почему-то если использование CopyMemory вместо lstrcpyW получается более корректным. Иначе при извлечении первой строки получается мусор а тут же все нормально. Все ли корректно? =(

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:41 25-08-2011
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Выставление информации:  
    lbi.cchTextMax := (lstrlenW(LPWSTR(pszText)) + 1) * SizeOf(WideChar);  указали в байтах размер текста + null
     
    Получение текста:
    bRet := IsBadWritePtr(plbi.pszText, plbi.cchTextMax); проверили plbi.cchTextMax байт
    bRet := IsBadWritePtr(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax);  тут видимо имелся ввиду IsBadReadPtr
    lstrcpynW(plbi.pszText, pcp.ItemData[wParam].pszText, plbi.cchTextMax); скопировали plbi.cchTextMax*2 байт, можно также заменить на CopyMemory
     
    IsBadWritePtr проверяет указатель на nil и доступна ли память на запись, а не то что эта память уже не занята другими данными
    так же и IsBadReadPtr проверяет на nil и доступна ли память на чтение, но не то что эта память занята переданным указателем
     
    Выставление текста: (раньше)
    GlobalAlloc(... plbi.cchTextMax) выделяет plbi.cchTextMax байт
    а
    lstrcpynW(... plbi.cchTextMax); копирует plbi.cchTextMax*2 байт
     
    Выставление текста: (сейчас)
    GetMem( ... .cchTextMax ) выделяет .cchTextMax байт
    CopyMemory(... plbi.cchTextMax); копирует plbi.cchTextMax байт

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 14:35 25-08-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как уменьшить размер .dll при использовании  ImageEn? А то библиотека весит 2 Мб. И еще, почему version info в delphi неактивное? То есть нельзя ввести названия компании и т.д.

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 19:08 04-09-2011 | Исправлено: R3Pa4eK, 19:41 04-09-2011
    marser

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

    Цитата:
    почему version info в delphi неактивное? То есть нельзя ввести названия компании и т.д.

    Нет файла ресурсов <Имя проекта>.res или не стоит галочка в <Include version information in project>

    Всего записей: 398 | Зарегистр. 29-03-2007 | Отправлено: 07:40 05-09-2011 | Исправлено: marser, 07:44 05-09-2011
    wasilissk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    >Как уменьшить размер .dll при использовании  ImageEn?
    http://en.wikipedia.org/wiki/UPX

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 08:00 05-09-2011
    druff

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А в D2006 есть какая-нибудь функция, которая любую строку может преобразовать к виду, пригодному для использования в качестве имени файла? (т.е. спец символы убирает, или заменяет на разрешённые символы)

    Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 11:59 06-09-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