Попробовал стандартными дельфийскими компонентами для AdoDB - секунд 30 открывается
А стандартные компоненты тут причем? ИМХО ошибки могут быть где угодно, начиная от проектирования БД заканчивая ...
Максим писал(а):
А если нужно открыть тоже самое, но с другим фильтром (предположим все из одной таблички, но каждая запись зависит от своего родителя и предположим уровень вложенности чайлдов 4) - дык и открывается просто приложение 2 минуты.
А изменить логику приложения так, чтобы таких запросов не возникало? Обычно подобные моменты свидетельствуют о несколько неверной архитектуре приложения.
А то прям как в том анекдоте: - А хто всрався? – Невiстка…
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
_SGK Да все можно сделать, не спорю. Просто берем к примеру рабочую базу на Оракле - хоть 100 табличек открывай, приложение будет открыто сразу. Я понимаю разные конечно базы, но хочется того же самого.
По поводу проектирования базы - уже немогу ничего исправить, база не моя и я не участвовал в ее проектировании.
Сделать, чтобы все Query были зависемы от родительской AdoTable - делал, толку нет. Все так же.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Может я уже окончательно заглючил, вот понять никак не могу как из файла прочитать такие структуры: допустим a - 4-x байтовое беззнаковое целое (longword), b - двухбайтовое беззнаковое целое (word). с - однобайтовое беззнаковое целое (byte). d - 10-ти байтовое вещественное число (extended). Всего 17байт на запись. Если я создаю тип:
то все это дело весит 24байта и читается из файла соответственно со сдвигом и некорректно. Так вот, как бы тут извернуться?? Добавлено спустя 49 секунд PS файл был записан х.з. какой программой, возможно написанной на C
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
Срочно нужно написать программу для считывания температуры с датчиков DS1820 по интерфейсу MicroLAN
датчик подключается к COM порту
кто интересуется есть исходники программ на делфи схемы и документация
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
_SGK Да, примерно такая связка.
Я просто все до сих пор балуюсь написанием плагинов для All My Movies (есть такая прога).
А так, база можно сказать и не очень большая - 2K записей, 260 метров (из-за скринов в базе) и селект по дате без сортировки. Так что по идее ничего особенного.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 24.12.2004 Откуда: Ставрополье
Здравствуйте, подскажите как найти в файле нужную последовательность байтов ?
Нужная последовательность : 1234
Код :
while not eof(файл) do begin
read(файл,b);
if b=1 then begin
read(файл,b);
if b=2 then begin
read(файлb);
if b=3 then
ххххххххххх
end;
end;
end;
Не ищет
_________________ Ставрополье Оверклокерс http://forums.overclockers.ru/viewtopic.php?t=125746 -= World Of Tanks =- (для связи Ватс Ап +7-903-418-03-43)
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
FatumNNM
FatumNNM писал(а):
подскажите как найти в файле нужную последовательность байтов ?
Так байтов или символов все же?
А read(file, string) читает строку вообще-то, а не один символ. Лучше вычитать весь файл в буфер и там уже с помощью строковых операций найти искомую подстроку
Здравствуйте, подскажите как найти в файле нужную последовательность байтов ?
--Vel-- писал(а):
Лучше вычитать весь файл в буфер и там уже с помощью строковых операций найти искомую подстроку
Думаю, что лучше таки читать в буфер фиксированного размера, к примеру, в 1Mb и производить поиск в нем, и так в цикле, с учетом смещения до конца файла.
Бо файлы бывают просто неприлично больших размеров - больше размера физически доступного ОЗУ и их чтение за один раз выглядит очень забавно.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
_SGK
_SGK писал(а):
Думаю, что лучше таки читать в буфер фиксированного размера, к примеру, в 1Mb и производить поиск в нем, и так в цикле, с учетом смещения до конца файла.
Но, нужно еще производить поиск в границах буфера. Т.е. вариант "12" находится в первом мегабайте, а "34" в начал второго. В принципе, не тяжело, но для облегчения первоначальной работы можно и весь файл загнать в буфер.
_SGK писал(а):
больше размера физически доступного ОЗУ и их чтение за один раз выглядит очень забавно.
Не помню как это выглядит в Delphi, а вот в C# он сначала вычитавает столько, сколько вмещается в память, потом матерится, вываливается, а память не освобождается. И тут уже не до смеха
Но, нужно еще производить поиск в границах буфера.
Безусловно, именно по этому я и написал об учете смещения.
_SGK писал(а):
и так в цикле, с учетом смещения до конца файла.
--Vel-- писал(а):
Не помню как это выглядит в Delphi, а вот в C# он сначала вычитавает столько, сколько вмещается в память, потом матерится, вываливается, а память не освобождается. И тут уже не до смеха
Я видел несколько вариантов ПО на Delphi, которые пытались читать больше чем нужно. Бедный винт аж ... от использования файла подкачки. Чем заканчивалось не скажу, бо никогда окончания не ждал, а просто снимал задачу.
Люди, пожалуста, извените, что перебиваю. Но мне нужна помощь.
Дело в том, что я обсолютный 0(ноль), в програмировании. Я слышал только что Delphi это лучшая программа для этого.
Не могли бы вы мне подсказать, как начать это дело. Может кто знает какие-нибудь ,,самоучители с нуля,, в сети.
Зарание спасибо.
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Igor (Lipa Sity) Залез на delphiworld.narod.ru и там поищи. Там ты точно и быстро найдешь искомый код.
А так, тут тебе уже посоветовали - лучше читать в буффер (ну например размером в 64 килобайта и уже проверять там), ну и так же учитывать смещения, если дошел до конца буфера.
Если файл текстовый и не особо большой, то можно что-то типа такого
Код:
var shift: array[0..255] of Byte; Look_At: Integer;
procedure Ts_init(P: PChar; m: Integer); var i: Integer; begin for i := 0 to 255 do shift[i] := m + 1; for i := 0 to m - 1 do Shift[Ord(p[i])] := m - i; Look_at := 0; while (look_At < m - 1) do begin if (p[m - 1] = p[m - (look_at + 2)]) then Exit else Inc(Look_at, 1); end;
end;
function Ts_Search(Text, p: PChar; m: Integer; Start: Longint): Longint; var I: Longint; T: PChar; begin T := Text + Start; Result := -1; repeat i := m - 1; while (t[i] <> p[i]) do t := t + shift[Ord(t[m])]; i := i - 1; if i < 0 then i := 0; while (t[i] = p[i]) do begin if i = 0 then Result := t - Text; i := i - 1; end; if Result = -1 then t := t + Look_AT + shift[Ord(t[m + look_at])]; until Result <> -1; end;
procedure SearchTextInFile(Str: String); var tt: string; L: Integer; L2, sp, a: Longint; F: file; Size: Integer; Buffer: PChar; begin tt := Str; L := Length(TT); ts_init(PChar(TT), L); try AssignFile(F, 'test.txt'); Reset(F, 1); Size := FileSize(F); GetMem(Buffer, Size + L + 1); try BlockRead(F, Buffer^, Size); StrCat(Buffer, PChar(TT)); SP := 0; A := 0; while SP < Size do begin L2 := Ts_Search(Buffer, PChar(TT), L, SP); SP := L2 + L; Inc(a); end; finally FreeMem(Buffer); end; finally CloseFile(F); end; end;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 24.12.2004 Откуда: Ставрополье
--Vel-- писал(а):
Так байтов или символов все же?
байтов
FatumNNM писал(а):
if b=1 then begin
var b:byte;
Может есть спец. компоненты для поиска в файлах ?
_________________ Ставрополье Оверклокерс http://forums.overclockers.ru/viewtopic.php?t=125746 -= World Of Tanks =- (для связи Ватс Ап +7-903-418-03-43)
Member
Статус: Не в сети Регистрация: 30.07.2006 Откуда: Москва-Ярик
Если файл двоичный, но меньше 4Гб:
Код:
uses Windows, SysUtils; {$APPTYPE CONSOLE} type PDWORD = ^DWORD;
const szex = 4; // size of example
var f: File; sz, rr, r, fpos, n, nofs: Integer; buff: array [0..32767] of byte; // 32 kbytes
begin Assign (f, ParamStr (1)); {$I-} Reset (f, 1); if IOresult <> 0 then exit; sz := FileSize (f); FillChar (buff, sizeof (buff), 0); // init. nofs := 0; rr := sizeof (buff) - (szex - 1); // 3 байта используются для дополнения if sz > 0 then while TRUE do begin fpos := FilePos (f); // save position BlockRead (f, buff[nofs], rr, r); // read // Производим поиск, не трогая последние три смещения (поскольку проверяются 4 байта) for n := 0 to r - szex - 1 do { if (buff[n + 0] = 1) and (buff[n + 1] = 2) and // unoptimized variant (buff[n + 2] = 3) and (buff[n + 3] = 4) then } if PDWORD(@buff[n])^ = $04030201 then // optimized variant begin WriteLn (format ('Result found at $%x', [fpos + n - nofs])); end; if r < rr then // end of file check break; nofs := szex - 1; // unchecked bytes // move last nofs bytes to start of buff Move (buff[r - nofs], buff[0], nofs); end; Close(f); WriteLn ('Scan complete'); Readln; end.
_________________ Плавайте поездами Аэрофлота! И синий BSOD нам заменяет небосвод...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения