Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: salexn1
Дата сообщения: 12.09.2011 10:31
Dima335
как вариант заюзать Lookup поля
Тогда таблицу Person вообще не нужно дергать
Автор: AKazak
Дата сообщения: 12.09.2011 14:59
Привет всем!

Мне нужно прочитать и обработать большой файл в формате CSV (comma-separated values). Сейчас я для разбора использую класс TStrings построчно, но подозреваю что файл можно разбирать быстрее.

Порекомендуйте, пожалуйста, быструю альтернативу TStrings'у?
Автор: Frodo_Torbins
Дата сообщения: 12.09.2011 16:54
AKazak
TStringStream посмотрите. Но вообще все зависит от того где именно у вас "тормозит".
Автор: YuriyRR
Дата сообщения: 12.09.2011 17:49
AKazak

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

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

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


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

С обновлением сложнее - или Refresh, или искать компромисс. Опять же надо смотреть в сторону всяких ODAC, SDAC и т. п. - там это решено давно наверняка.
Автор: AKazak
Дата сообщения: 12.09.2011 21:19
Frodo_Torbins
YuriyRR
Благодарю. Буду пробовать!
Автор: R3Pa4eK
Дата сообщения: 18.09.2011 13:26
Как скрыть процесс копирование, переименования, удаления файлов от таких программ, как ShFilesAcSpy?
Автор: Maks150988
Дата сообщения: 18.09.2011 19:01
Всем привет у меня снова вопрос про массивы. Перейду сразу к делу. Собственно есть код:


Код: // Структура для хранения данных.

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

pRouteInfo: Array of TRouteItem;
Автор: druff
Дата сообщения: 19.09.2011 09:02
Maks150988
у меня совет будет немного не в ту степь, скорее на будущее: Стоит посмотреть в сторону замены record на class, а массива на TObjectList, не вижу никакой выгоды в работе с памятью напрямую, т.к. через списки и объекты работать безопаснее и удобнее, по моему мнению.
Автор: rrromano
Дата сообщения: 19.09.2011 10:42

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


idItem < iCount - если это не выполняется, но выполняется это: SetLength(pRouteInfo, iCount);
что будет?
Автор: R3Pa4eK
Дата сообщения: 19.09.2011 17:14
Как можно разблокировать файл? Нашел функцию UnLockFile, но как с ней работать - не знаю.
Автор: data man
Дата сообщения: 19.09.2011 17:33
R3Pa4eK

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

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

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

В первом случае она не поможет, т.к. область разлочивания должна строго соотвествовать залоченной.

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

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

Любой.

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

К сожалению, даже базовых знаний C++ нет...
Автор: Maks150988
Дата сообщения: 19.09.2011 22:05
druff

Пишу исключительно на апи без всл и не хочется тягать лишнее, ведь зачем он нужен, когда ожно без него обойтись в моем случае.

rrromano

Ну урежем массив, удалив при этом последний ненужный элемент, вроде все по уму. Если оставшееся количество элементов равно удаляемому, значит он и был последний и нахрен не нужен - просто массив укоротим на единичку. А если где-то внутри - скопируем память равную стольки то записям начиная с этого элемента.
Автор: rrromano
Дата сообщения: 20.09.2011 09:05
Maks150988

О. Раз исключительно на АПИ, я бы посоветовал так сделать: унаследовать класс списка, добавив ему к айтиму дополнительное свойство с типом, описывающим вашу структуру. И пользовать этот список ). Получится гораздо изящнее и безопаснее.
Автор: Maks150988
Дата сообщения: 20.09.2011 16:21
rrromano
У контрола есть сообщение LB_SETITEMDATA. Я сначала думал вот оно то что надо, record сохранял в нем. Но при чтении LB_GETITEMDATA была белиберда. А ведь как было бы удобно. ((

Заместо CopyMemory использую цикл.


Код: for i := (idItem + 1) to iCount do
pRouteInfo[i - 1] := pRouteInfo[i];
Автор: rrromano
Дата сообщения: 21.09.2011 10:13
Maks150988

// Структура для хранения данных.

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

pRouteInfo: Array of TRouteItem;

pszRouteName: WideString; - Вот это не говорит о размере строки в записи, от которого зависит размер записи. И вообще, это может быть указателем. Ну, скопировали вы его, а на что он указывает? )

Одно из двух: или дело в размере (зафиксировать его, тем более, что он прогнозируем в вашем случае), или дело в указателях - разрулить правильно ).
Автор: my610
Дата сообщения: 22.09.2011 01:37
Maks150988, никогда не используйте в структурах (как ваша, к примеру TRouteItem) типы String, WideString, которые потом планируется объявлять как XXX: array of TYyy; это 100% тро ло ло, который будет вылазить в самый непредсказуемый момент.
лучше использовать указатели на строки (PChar, PWideChar), то есть в вашем случае:

Код:
PRouteItem = ^TRouteItem;
TRouteItem = record
bGateWay : Boolean;
bChecked : Boolean;
pszRouteName: PWideChar;
dwNetWork : DWORD;
dwNetMask : DWORD;
end;
Автор: rrromano
Дата сообщения: 22.09.2011 09:04
my610

И всё равно лучше унаследовать класс и докрутить его. Безопаснее и удобнее в дальнейшем сопровождении.
Автор: Frodo_Torbins
Дата сообщения: 22.09.2011 11:13
my610
Цитата:
никогда не используйте в структурах (как ваша, к примеру TRouteItem) типы String, WideString, которые потом планируется объявлять как XXX: array of TYyy; это 100% тро ло ло, который будет вылазить в самый непредсказуемый момент.
А можно узнать, как такое возможно, и на какой версии делфи? Если бы речь шла о указателях, CopyMem и прочих не типобезопасных вещах, то еще понятно. А сами по себе массивы, записи и строки в любых комбинациях полностью безопасны.
Автор: DmitryKz
Дата сообщения: 22.09.2011 12:13
Вопрос, наверно, совсем не по теме... но как можно сделать мониторинг изменений в директории (и её поддиректориях)? Написать службу, это понятно, интересует способ реализации. Я так понимаю, этот тот же принцип, что применяют в своей работе антивирусы... Как это делается?
Автор: wasilissk
Дата сообщения: 22.09.2011 14:00
DmitryKz
Антивирусы ставят хуки на вызовы всяких ZCreateFile, ZCopyFile, ZWCreateFile, ZWopenFile...
Автор: rrromano
Дата сообщения: 22.09.2011 14:25
Frodo_Torbins
Представьте, что вы создали 2 элемента структуры, один из них заполнили. Второй остался непроинициализирован. Соответственно, поле структуры с типом строка тоже не проинициализирован. Теперь при операции присвоения Дельфи корректно скопирует всё содержимое одного элемента в другой, создав при этом экземпляр класса строковой переменной "за кадром". Всё ок. А теперь представьте, что вы копируете один элемент в другой путём копирования области памяти, а потом источник грохнете. Таким образом вы скопировали указатель на экземпляр класса строки, а саму строку прибили. Или попытались прибить. Что будет? Будет нехорошо. )))
Мне так кажется.
Автор: DmitryKz
Дата сообщения: 22.09.2011 14:29
wasilissk
Так, начинаю понимать... спасибо за указание направления.
Дополнительный вопрос: кто-нибудь знает, утилита FileMon работает по этому же принципу? Я знаю, что она связана с драйвером файловой системы... функции вида Zw...File принадлежат этому драйверу? Хочется добиться максимальной производительности при мониторинге...
Автор: Varenik
Дата сообщения: 22.09.2011 14:48
rrromano
Цитата:
создали 2 элемента структуры
Значит, проинициализированы оба, в том числе и строка как элемент каждой структуры. Если ей ничего не присвоить, то она будет просто пустой строкой
Автор: wasilissk
Дата сообщения: 22.09.2011 15:09
DmitryKz
http://technet.microsoft.com/ru-ru/sysinternals/bb896642
Абзац "Принцип работы FileMon"
Автор: DmitryKz
Дата сообщения: 22.09.2011 15:15
wasilissk
Жаль, на форуме нет возможности плюсовать ответы...
Спасибо!
Автор: Frodo_Torbins
Дата сообщения: 22.09.2011 15:54
rrromano
Цитата:
копируете один элемент в другой путём копирования области памяти, а потом источник грохнете
Вот это я и называю работой с указателями и не типобезопасным кодом. Если вы так делаете, то конечно у вас могут возникнуть проблемы.

DmitryKz
Есть такие винапишные функции как FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification - это если вы не хотите заморачиваться с драйверами и тревожить антивирусы.
Автор: data man
Дата сообщения: 22.09.2011 16:19
DmitryKz

Цитата:
как можно сделать мониторинг изменений в директории (и её поддиректориях)?

1. Использовать FindFirstChangeNotification*/FindNextChangeNotification.
Такой способ используется в ATFileNotification.
2. Использовать ReadDirectoryChanges.
Его использует TCnFileSystemWatcher из состава CnVcl (CnPack), например.

Оба компонента позволяют отслеживать (и рекурсивно - тоже) переименование, удаление, создание, изменение атрибутов, размера или их сочетания.
Автор: rrromano
Дата сообщения: 22.09.2011 16:37

Цитата:
Если вы так делаете, то конечно у вас могут возникнуть проблемы.


Нет, я так не делаю. Кажется, я собирался автору вопроса это писать а попало к вам ). Это он так делает.

Добавлено:

Цитата:
Значит, проинициализированы оба, в том числе и строка как элемент каждой структуры. Если ей ничего не присвоить, то она будет просто пустой строкой


Спасибо, я неправильно выразился. Конечно, проинициализированы, я там дальше указатели упоминал. Всё верно. Просто эта пустая строка всё равно создаётся в памяти как экземпляр класса, и в структуру пишется указатель на неё. А дальше, как я и писал. Правильно?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.