Обсуждение Программирование на Delphi/Pascal

KL9YnEr

Ословед
Ну вообщето и в дельфи и в текстовике, который я экспортнул скриптом из 3дМакса, разделитель это точка!!!
 

byterus

Ословед
Награды
4
Конечно, у тебя наверняка нетипизированный файл, из которого кроме как строки читать не получится.
Если нужно читать именно строки без проблем - используй класс TStringList и его метод LoadFromFile - а потом обрабатывай считанное. Извращения с чтением файлов, поддерживаемых стандартом исходного Паскаля - это как-то уже не гут, похоже на пытки инквизиции, хоть на дворе уже 2009 год ))))

Странный совет, а если файл весит 1gb, а нам нужно только первые три строчки? По моему, человек все делает правильно, для анализа строк я бы посоветовал использовать регулярные выражения(для Delphi есть библиотека RegExpr).
 

KL9YnEr

Ословед
Да не использую я постороннии библиотеки.
Неужели не возможно из строкового типа сохранмть в действительный стандартными средствами???
 
Награды
5
Странный совет, а если файл весит 1gb, а нам нужно только первые три строчки? По моему, человек все делает правильно, для анализа строк я бы посоветовал использовать регулярные выражения(для Delphi есть библиотека RegExpr).
Какой вопрос - такой ответ. Не хочу флеймить и оффтопить, но тогда это проблема задающего вопрос.
У вас лично в практике были гигабайтные файлы? Если да - это проблемы оптимизации и исходной идеологии.
У меня на корпоративной базе данных при идеологии использования метаданных для объектов больше 5 мегабайт в файлах никогда не водилось.
 

byterus

Ословед
Награды
4
Да не использую я постороннии библиотеки.
Неужели не возможно из строкового типа сохранмть в действительный стандартными средствами???

Код:
  function MyStrToFloat(const AStr: string): Extended;
  begin
    Result := StrToFloat(StringReplace(AStr, '.', ',', []));
  end;
 

    KL9YnEr

    очки: 6
    спосябки
Награды
5
Ладно, остановимся на потоках и не будем ссориться:drinks_ch
Да не вопрос :)
Хочу только заметить, что например стандартный ZLib на порядок быстрее пашет, если свопировать архив на хард, а не в поток памяти.
Почему так - загадка. На большинстве аналогичных zip-компонент такая проблема наблюдалась таким же сверхъестественным образом.
Так что все от реализации, батенька, зависит, от реализации )

2аффтар
Судя по скриншоту - читай строчку за строчкой, у тебя формат видимо известный. А потом считанную строчку перебрасывай в нужный Float или Integer.
И заюзай код byterus
 
Ну вообщето и в дельфи и в текстовике, который я экспортнул скриптом из 3дМакса, разделитель это точка!!!
Вообще-то в делфи разделителем целой части по умолчанию являтся запятая.
Где-то в начале программы пиши
Код:
DecimalSeparator:='.';
Тем самым переназначаем делитель целой части на точку.

PS Читаем справку делфи.
 
Народ, нужна помощь с довольно сложным вопросом. Делаю универсальную dll-БД сразу для нескольких проэктов. В идеале мне от неё нужно вот что:
-Выделение памяти под нужды приложения.
-Сохранение/загрузка с диска выделенной памяти с возможностью шифрования.
-ПРЯМОЙ доступ к выделенной памяти.

Т.е. мне нужно чтобы dll создавало массив byte (к примеру) в памяти, а приложение писало объекты/массивы В ЭТУ ОБЛАСТЬ памяти где находится массив dll. Т.е. поверх, чтобы приложение считало эту область памяти объектом а dll массивом байт, пригодным для записи на диск. Но проблема в том что если просто передовать pointer то тип данных в dll и тип которому присваивается pointer должны совпадать, а мне нужна универсальность. Помогите плз, даже не представляю в какую сторону копать...
 
Награды
5
Вообще-то в делфи разделителем целой части по умолчанию являтся запятая.
Где-то в начале программы пиши
Код:
DecimalSeparator:='.';
Тем самым переназначаем делитель целой части на точку.

PS Читаем справку делфи.
Не, это все канеш шоколадно, но код не будет универсальным.
Тогда уж запомнить сепаратор, считать файл и потом восстановить.
PS Девэкспрессы не морочатся по поводу строк ввода, они тупо читают именно строку, а потом меняют все вхождения текущего децимал сепаратора на точку - так с точки зрения безопасности кода правильней, поскольку смена глобальных переменных - это не шоколад.
 

DarkByte

Ословед
Вообще-то в делфи разделителем целой части по умолчанию являтся запятая.
Где-то в начале программы пиши
Код:
DecimalSeparator:='.';
Тем самым переназначаем делитель целой части на точку.

PS Читаем справку делфи.
Значение переменной DecimalSeparator берётся из настроек системы, и если мне не изменяет память, то получить его так же можно при помощи функции GetLocaleInfo с флагом LOCALE_SDECIMAL.
 
Награды
5
Значение переменной DecimalSeparator берётся из настроек системы, и если мне не изменяет память, то получить его так же можно при помощи функции GetLocaleInfo с флагом LOCALE_SDECIMAL.
Это больше похоже на лечение гланд проктологом :D
Глобальная переменная есть - вот ее и юзаем :)
 

Ku-Klux-Klan

Ословед
Народ, такая проблема.

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

byterus

Ословед
Награды
4
Народ, такая проблема.

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

Используй процедуру Sleep(milliseconds: Cardinal):


Sleep(1000) - заморозит программу на 1 секунду.
 
Награды
7
Народ, нужна помощь с довольно сложным вопросом. Делаю универсальную dll-БД сразу для нескольких проэктов. В идеале мне от неё нужно вот что:
-Выделение памяти под нужды приложения.
-Сохранение/загрузка с диска выделенной памяти с возможностью шифрования.
-ПРЯМОЙ доступ к выделенной памяти.
Погляди на формат TIFF. По сути дела набор бинарных блоков с заголовком и неким индексом позволяющим грузить определенные блоки в память. Я имею в виду не конкретную реализацию, а общую идею. Там очень много различных мелких подзадач по каждой из которых можно писать очень обширное описание. Например: формат БД на диске (заголовок файла, формат внутренних структур данных - блоков и индекса, идентификация блоков), способы шифрования, фрагментация блоков внутри файла, защита от сбоев и т.п.
 

Ku-Klux-Klan

Ословед
Используй процедуру Sleep(milliseconds: Cardinal):


Sleep(1000) - заморозит программу на 1 секунду.

Так то работает. Но возникла проблема следующего характера: нельзя двигать форму и вообще проводить какие-либо действия с ней. Поставил для начал Sleep(10000)
на 10 сек. В цикле я поставил Application.ProccesMassege для того чтобы хоть переодически прорисовывалась форма. Оказалось, что это слишком мало, чтобы перемещать форму. Затем поставил Sleep(1), т.е. на однумилисекунду. Форму можно спокойно перемещать, менять размер и т.д. Но вот закрыть ее не получается. Как это можно сделать?
 
Награды
7
Так то работает. Но возникла проблема следующего характера: нельзя двигать форму и вообще проводить какие-либо действия с ней. Поставил для начал Sleep(10000)
на 10 сек. В цикле я поставил Application.ProccesMassege для того чтобы хоть переодически прорисовывалась форма. Оказалось, что это слишком мало, чтобы перемещать форму. Затем поставил Sleep(1), т.е. на однумилисекунду. Форму можно спокойно перемещать, менять размер и т.д. Но вот закрыть ее не получается. Как это можно сделать?
Завести внутри формы булевское свойство которое говорило бы что было запрошено закрытие формы. В обработчике события OnCloseQuery проверить что обработка выполняется, отменить закрытие но выставить это свойство. В цикле обработки анализировать это свойство и прекращать цикл/обработку и закрывать форму, если свойство было выставлено.

Хотя это всё странно, особенно Sleep.
 

byterus

Ословед
Награды
4
Так то работает. Но возникла проблема следующего характера...

Выполняйте работу в отдельном потоке, тогда главный поток приложения блокироваться не будет. К сожалению, я не освоил мастерства многопоточности, по этому более подробно рассказать немогу:(
 
Награды
7
Выполняйте работу в отдельном потоке, тогда главный поток приложения блокироваться не будет. К сожалению, я не освоил мастерства многопоточности, по этому более подробно рассказать немогу:(
Основная сложность что с многопоточностю, что с возможностями подвигать форму пока что-то там выполняется заключается в том что пользователь имеет возможность кроме этого понажимать ещё и на кнопочки, потыкать в пункты меню, запустить какую-нибудь ещё операцию... приходится всё это отслеживать.
 

DarkByte

Ословед
Так то работает. Но возникла проблема следующего характера: нельзя двигать форму и вообще проводить какие-либо действия с ней. Поставил для начал Sleep(10000)
на 10 сек. В цикле я поставил Application.ProccesMassege для того чтобы хоть переодически прорисовывалась форма. Оказалось, что это слишком мало, чтобы перемещать форму. Затем поставил Sleep(1), т.е. на однумилисекунду. Форму можно спокойно перемещать, менять размер и т.д. Но вот закрыть ее не получается. Как это можно сделать?
Добавь рядом с Application.ProcessMessages; строку if Application.Terminated then exit;
Вместо exit можно использовать break, чтобы просто выйти из цикла, на случай если программе требуется корректно завершиться.

Код:
procedure SleepS(val: integer; dif: integer=10);
var i,r: integer;
begin
  r:=val div dif;
  for i:=1 to dif do begin
    if Application.Terminated then break;
    Application.ProcessMessages;
    Sleep(r);
  end;
end;
Использовать можно как обычный Sleep, только в данном случае форма не будет подвисать и будет нормально закрываться.
 
Погляди на формат TIFF. По сути дела набор бинарных блоков с заголовком и неким индексом позволяющим грузить определенные блоки в память. Я имею в виду не конкретную реализацию, а общую идею. Там очень много различных мелких подзадач по каждой из которых можно писать очень обширное описание. Например: формат БД на диске (заголовок файла, формат внутренних структур данных - блоков и индекса, идентификация блоков), способы шифрования, фрагментация блоков внутри файла, защита от сбоев и т.п.
Дело не в самом сохранении на диск. Смысл в следующем:
К примеру есть указатель на некий массив byte находящийся в dll. Мне нужно заставить приложение использовать этот массив в качестве любого объекта будь то TBitMap или integer. Т.е. писать поверх существующего массива, к примеру если это TBitMap размером 100х100 то в массив размером 300000 должны быть поочередно записаны R G B состовляющие каждой точки.
 
Сверху