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

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



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

    Цитата:
     
    Как по мне, так проще залезть в исходники Inno Setup и исправить все что нужно там.  

    Это мне не подходит. Увы...

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 19:48 11-09-2011
    Dima335

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

    Цитата:
    Как вариант поместить на форму один компонент для таблицы Employee и один для Person. А связывать их уже ручками в коде.

    У меня таблиц подобных Person на самом деле много.
    Вот попробовал все-таки делать изменение во время отключенного adoquery, так возникает access violation. Возникает он в коде

    Код:
    procedure TcxGridEditingController.UpdateValue;
    begin
      if IsEditing and FEdit.EditModified then
      begin
        FEdit.ValidateEdit(True);
        FEditingItem.EditValue := FEdit.EditValue;
        if FEdit <> nil then
          FEdit.ModifiedAfterEnter := False;
      end;
    end;

    В строке FEditingItem.EditValue := FEdit.EditValue. Как перевести грид в состояние isediting=false (или как еще избежать AV)?

    Всего записей: 27 | Зарегистр. 30-08-2011 | Отправлено: 00:03 12-09-2011
    wasilissk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dima335
    Наверно логично проверку if FEdit <> nil then перенести двумя строками выше и добавить begin .. end;

    Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 07:19 12-09-2011
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dima335
    как вариант заюзать Lookup поля
    Тогда таблицу Person вообще не нужно дергать

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 11:31 12-09-2011
    AKazak



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!
     
    Мне нужно прочитать и обработать большой файл в формате CSV (comma-separated values). Сейчас я для разбора использую класс TStrings построчно, но подозреваю что файл можно разбирать быстрее.
     
    Порекомендуйте, пожалуйста, быструю альтернативу TStrings'у?

    Всего записей: 622 | Зарегистр. 24-12-2005 | Отправлено: 15:59 12-09-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AKazak
    TStringStream посмотрите. Но вообще все зависит от того где именно у вас "тормозит".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:54 12-09-2011
    YuriyRR



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

    Цитата:
    класс TStrings построчно

    В классе TStringList есть свойство commatext вот туда можно и пихнуть весь файл целиком. Будет много быстрее построчной обработки.
    Есть еще компанентик SciBit AsciiDataset он позволяет работать с CSV как с датасетом.

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 18:49 12-09-2011
    rrromano



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

    Цитата:
    Вопрос по базам. Есть БД (ADO), грид, в котором отображается результат запроса  

     
    1. Использовать LookUp-поле и избавться от нескольких таблиц в этом запросе. К стати, тут даже можно компонент типа table.
    2. Перехватывать BeforeDelete, делать Abort, удалять запросом и делать Refresh. Немного экзотично, но иногда можно с осторожностью. refresh можно и не делать, но тогда его делает или пользователь, или при каком-нибудь событии.
    3. Использовать нормальные компоненты ).
    4. две компоненты таблицы со связью мастер-деталь на уровне компоненты.
     
    С обновлением сложнее - или Refresh, или искать компромисс. Опять же надо смотреть в сторону всяких ODAC, SDAC и т. п. - там это решено давно наверняка.

    Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 18:53 12-09-2011
    AKazak



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    YuriyRR
    Благодарю. Буду пробовать!

    Всего записей: 622 | Зарегистр. 24-12-2005 | Отправлено: 22:19 12-09-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как скрыть процесс копирование, переименования, удаления файлов от таких программ, как ShFilesAcSpy?

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 14:26 18-09-2011
    Maks150988



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

    Код:
    // Структура для хранения данных.
     
      TRouteItem = record
        bGateWay    : Boolean;
        bChecked    : Boolean;
        pszRouteName: WideString;
        dwNetWork   : DWORD;
        dwNetMask   : DWORD;
      end;
    // Глобальный массив этих структур.
     
    pRouteInfo: Array of TRouteItem;

     
    Этот массив привязан к строчкам ListBox. При запуске приложения заполняю ListBox, допустим, пятью строками, в то же время заполняю таким количеством свой массив. Ну вроде самая легкая часть. Настает пора доабвления и удаления строк, а значит надо мутить и с массивом эти действия.
     
    Код удаления строки:
     

    Код:
    //idItem и iCount это Integer
     
              idItem := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX), LB_GETCURSEL, 0, 0);
              if (idItem <> LB_ERR) then
              begin
                iCount := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX),
                  LB_DELETESTRING, idItem, 0);
                if (iCount <> LB_ERR) then
                begin
                  if (idItem < iCount) then
                    CopyMemory(
                      @pRouteInfo[idItem],
                      @pRouteInfo[idItem + 1],
                      (iCount - idItem) * SizeOf(TRouteItem)
                    );
                  SetLength(pRouteInfo, iCount);
    //Move(pRouteInfo[idItem+1],pRouteInfo[idItem],(iCount-idItem)*SizeOf(pRouteInfo[0]));
     
                end;
              end;

     
    Вот вроде бы удалил строчку из контрола, удалил элемент из массива, сдвинул позиции там.
     
    Теперь редактирование элемента:
     

    Код:
    idItem := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX), LB_GETCURSEL, 0, 0);
              if (idItem <> LB_ERR) then

     
    Если удалять впервые после запуска программы последнюю строку и потом начать "редактирование", то все окей. Если где-то в другом месте - на последней редактируемой строке вылетает исключение. Пробовал не выводить егошний pszRouteName, вроде все путем, раз на раз не вылетает. Значит дело в освобождении строки? Как вобщем обыграть ситуацию? Ну и вобще помогите советами что где надо подправить, я чето не соображу.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:01 18-09-2011 | Исправлено: Maks150988, 20:04 18-09-2011
    druff

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    у меня совет будет немного не в ту степь, скорее на будущее: Стоит посмотреть в сторону замены record на class, а массива на TObjectList, не вижу никакой выгоды в работе с памятью напрямую, т.к. через списки и объекты работать безопаснее и удобнее, по моему мнению.

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



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

    Цитата:
    Всем привет у меня снова вопрос про массивы. Перейду сразу к делу. Собственно есть код:

     
    idItem < iCount - если это не выполняется, но выполняется это: SetLength(pRouteInfo, iCount);
    что будет?

    Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 11:42 19-09-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как можно разблокировать файл? Нашел функцию UnLockFile, но как с ней работать - не знаю.

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 18:14 19-09-2011
    data man



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

    Цитата:
    Как можно разблокировать файл?

    Любой или открытый из своей проги и залоченный вызовом LockFile?

    Цитата:
    Нашел функцию UnLockFile

    В первом случае она не поможет, т.к. область разлочивания должна строго соотвествовать залоченной.
     
    Добавлено:
    Если есть базовые знания C++, то можно взять исходники вот этого плагина для FAR и переписать функции на Delphi.
    Там, в файлах NTFx.* есть всё, что нужно, чтобы разлочить почти любой файл.

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

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



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

    Цитата:
    Любой или открытый из своей проги и залоченный вызовом LockFile?  

    Любой.

    Цитата:
    Если есть базовые знания C++, то можно взять исходники вот этого плагина для FAR и переписать функции на Delphi.
    Там, в файлах NTFx.* есть всё, что нужно, чтобы разлочить почти любой файл.
     

    К сожалению, даже базовых знаний C++ нет...

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



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

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:05 19-09-2011
    rrromano



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    О. Раз исключительно на АПИ, я бы посоветовал так сделать: унаследовать класс списка, добавив ему к айтиму дополнительное свойство с типом, описывающим вашу структуру. И пользовать этот список ). Получится гораздо изящнее и безопаснее.

    Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 10:05 20-09-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    rrromano
    У контрола есть сообщение LB_SETITEMDATA. Я сначала думал вот оно то что надо, record сохранял в нем. Но при чтении LB_GETITEMDATA была белиберда. А ведь как было бы удобно. ((
     
    Заместо CopyMemory использую цикл.
     

    Код:
    for i := (idItem + 1) to iCount do
      pRouteInfo[i - 1] := pRouteInfo[i];

     
    Никаких побочных эффектов не замечено. Правда выигрыш в скорости снижается при таком присваивании, особенно если строк в списке тысячи. Все равно непорядок какой-то. ((

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:21 20-09-2011
    rrromano



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    // Структура для хранения данных.  
       
       TRouteItem = record  
         bGateWay    : Boolean;  
         bChecked    : Boolean;  
         pszRouteName: WideString;  
         dwNetWork   : DWORD;  
         dwNetMask   : DWORD;  
       end;  
     // Глобальный массив этих структур.  
       
     pRouteInfo: Array of TRouteItem;
     
    pszRouteName: WideString; - Вот это не говорит о размере строки в записи, от которого зависит размер записи. И вообще, это может быть указателем. Ну, скопировали вы его, а на что он указывает? )
     
    Одно из двух: или дело в размере (зафиксировать его, тем более, что он прогнозируем в вашем случае), или дело в указателях - разрулить правильно ).

    Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 11:13 21-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