Вопрос № 130050: Добрый день, Эксперты! Прошу помощи. Нужен алгоритм поиска в произвольном файле 4-х байт. Объясняю подробней: Есть файл(сэйв игры), который постоянно растет. Состоит он из блоков(записей) разных структур. Заголовок нужной мне записи ...Вопрос № 130131: Добрый вечер!
Вот возник вопросик необходимо написать программу, которая показывала текст и рисунки с форматированием. Нашел компонент http://www.trichedit.com/features/, но он 30 дней работает, может кто может помочь?
Заранее благадарен....Вопрос № 130133: Здравствуйте. Я пытаюсь перейти на библиотеку KOL. Если есть эксперты, кто с ней работал, вопрос к ним. Работаю из Delphi 7. Возникли 2 вопроса:
1. У меня на TabControl лежит Panel и Splitter. У обоих Align=caLeft. При этом Splitter всегда выравн...Вопрос № 130148: такой вопрос приходит строка в ввиде string ;23;23;432;5434;545;34;5;54
вот сам вопрос как ее расшифровать тоесть после расшифровка чтоб она выглядела так a:=23 b:=23 c:=432 . как это сделать не представляю, сделал по мелочи но алгоритм получился...
Вопрос № 130.050
Добрый день, Эксперты! Прошу помощи. Нужен алгоритм поиска в произвольном файле 4-х байт.
Объясняю подробней: Есть файл(сэйв игры), который постоянно растет. Состоит он из блоков(записей) разных структур. Заголовок нужной мне записи я знаю. Структуру знаю, но длина постоянно меняется. Начинается он всегда с 4-х байт. Для открытия и чтения файла использую TFileStream. Так вот, есть ли какой алгоритм поиска в файле по байтам, как это реализовано в WinHex ? Если просто перебирать байты, то это очень
и очень долго, тем более сэйв постоянно растет.
Т.е. находить то я нахожу нужную мне последовательность байтов, но в файле 30 Мб на это уходит минут 5-10, что сами понимаете... Есть интересные варианты алгоритмов поиска подстроки в строке. Тот же самый алгоритм Бойера-Мура, но не знаю как его применить.
Мне нужно находить 4 байта, т.е. DWORD. Сейчас в голове крутится один вариант в лоб. В памяти делаем временный массив(таблицу) допустим длиной 32 кб
, куда считываем блоки, а дальше сканируем 1-4 байт, сравниваем, далее 2-5. Но это тоже будет долго, фактически побайтовое сравнение.
Заранее благодарю.
Отправлен: 01.04.2008, 14:22
Вопрос задал: svsrus (статус: 8-ой класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: PavelGM
Здравствуйте, svsrus!
Первое - если вы каждый раз делаете seek (и повторно считываете часть данных), то понятно откуда так все тормозит - читаете в 4 раза больше чем нужно и мелкими порциями. Так что ваша идея о буфере это правильная мысль - это не "в лоб" - это правильный подход.
Второе - почему не сделать буфер в 1-4 Мб - при нынешних размерах памяти это не напрягает, а чтение не будет задерживать (тем более при нынешних размерах кэшах процессоров есть прямой смысл увеличивать буфер, чтобы он был не меньше).
Третье - зачем сравнивать побайтно, когда можно сравнивать словами DWORD при помощи приведения типа, например так DWORD(Addr(p[i])), если p - это буфер. Конечно потери из-за выравнивания будут, но скорее всего не критичные по сравнению с файловыми операциями.
P.S. Алгоритм Бойера-Мура хорош для строк, т.е. "длинных" данных. В вашем случае его использование скорее замедлит процесс.
Ответ отправил: PavelGM (статус: Студент)
Ответ отправлен: 02.04.2008, 10:35 Оценка за ответ: 5 Комментарий оценки: Спасибо.
Вопрос № 130.131
Добрый вечер!
Вот возник вопросик необходимо написать программу, которая показывала текст и рисунки с форматированием. Нашел компонент http://www.trichedit.com/features/, но он 30 дней работает, может кто может помочь?
Заранее благадарен.
Отвечает: PavelGM
Здравствуйте, Овчинников Николай Владиславович!
Встроенный в Delphi компонент RichEdit со вкладки Win32. Чем-то не устраивает?
Можно использовать компонент WebBrowser и подсовывать ему сформированный HTML файл.
Еще вариант - импортировать системный ActiveX RichTextBox - он более корректно с RTF работает (один в один как WordPad - это его часть похоже и есть).
Ответ отправил: PavelGM (статус: Студент)
Ответ отправлен: 02.04.2008, 10:46 Оценка за ответ: 5 Комментарий оценки: я буду пробывать этот вариант!
Вопрос № 130.133
Здравствуйте. Я пытаюсь перейти на библиотеку KOL. Если есть эксперты, кто с ней работал, вопрос к ним. Работаю из Delphi 7. Возникли 2 вопроса:
1. У меня на TabControl лежит Panel и Splitter. У обоих Align=caLeft. При этом Splitter всегда выравнивается по левому краю TabControl, а к нему уже прилипает Panel. Как сделать, чтобы было наоборот. Сначала Panel, а затем Splitter?
2. В качестве таблицы я использую mdvXLGrid. Мне нужно программно заполнить ячейки. При выполнении
Form1.GridL.Cells[1, 1].Text:='Текст';
в модуле KOLmdvXLGrid возникает ошибка (см. приложение)
Как правильно заполнять ячейки?
Отвечает: Yakki
Здравствуйте, Хукаленко Дмитрий!
1. Для Splitter сделайте Align=caRight затем Align=caLeft, все.
2. Скорее всего ошибка в модулях (*.dpk, *.bpl) компонента/библиотеки, например плохо скачано, затем архив восстановлен. Переустановите библиотеку.
Ответ отправил: Yakki (статус: 1-ый класс)
Ответ отправлен: 02.04.2008, 10:27 Оценка за ответ: 4 Комментарий оценки: 1. Пробовал: не работает.
Вопрос № 130.148
такой вопрос приходит строка в ввиде string ;23;23;432;5434;545;34;5;54
вот сам вопрос как ее расшифровать тоесть после расшифровка чтоб она выглядела так a:=23 b:=23 c:=432 . как это сделать не представляю, сделал по мелочи но алгоритм получился очень длинный и неустойчивый. помогите если сможете. заранее спасибо.
Отправлен: 02.04.2008, 06:39
Вопрос задал: Doget (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 6)
Отвечает: Овчинников Николай Владиславович
Здравствуйте, Doget!
На форму поместил label-ы, и button.
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
i,p,d:integer;
begin
s:=label1.Caption;
p:=1;
label2.Caption:='';
d:=65; //номер символа A
for i:=1 to length(s) do begin
if s[i]=';' then begin
label2.caption:=label2.caption+chr(d)+':='+copy(s,p,i-1)+' ';
p:=i+1;
inc(d);
end;
end;
end;
Отвечает: Selya
Здравствуйте, Doget!
Для разбора строки используйте TStrings и его свойства Delimiter и DelimitedText, если разделитель нужно указывать. Если же разделитель - запятая, то используйте CommaText
См.пример:
Приложение:
Ответ отправил: Selya (статус: 10-ый класс)
Ответ отправлен: 02.04.2008, 10:43 Оценка за ответ: 4
Отвечает: Louken
Здравствуйте, Doget!
Принцип таков:
Имеем массив - m, в нем попорядку должны храниться все значения (23;23;432;5434;545;34;5;54), т.е. m[0] = a = 23, ..., m[3] = d = 5434 и т.д. Остается только заполнить массив значениями, это делает процедура ParserString из приложения. Там же показан принцип ее использования.
Приложение:
Ответ отправил: Louken (статус: Студент)
Ответ отправлен: 02.04.2008, 13:33 Оценка за ответ: 3