Вкомпилировать содержимое текстового файла (во время сборки проекта)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
sunjob
постоялец
Сообщения: 204
Зарегистрирован: 12.01.2011 14:19:54

Вкомпилировать содержимое текстового файла (во время сборки проекта)

Сообщение sunjob »

день добрый, колдуны!

как на этапе сборки "вкомпилировать" содержимое текстового файла в приложение?
(что бы потом отобразить в TMemo "About")
именно "вкомпилировать" а не загрузить из файла во время работы.

конечные сборки приложений делаю баш-скриптингом, поэтому, вполне подойдет хак/финт ушей на этом уровне.

спасибо

- linux
- fpc-3.2.2
- lazarus-3.8.0
- bash
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3070
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

В делфи и винде я это делал с легкостью - засовывая любые тексты и изображения в ресурсы. В лазаре и линуксе не интересовался, но краем глаза видел, что и там есть что-то подобное. Сам разбираться не стану - есть задачи и интереснее.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 492
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Добавить в ресурсы в параметрах проекта, потом загрузить в TMemo можно так:

Код: Выделить всё

var
  AStream: TStream;
begin
  AStream:= TResourceStream.Create(HInstance, 'HIGHLIGHTERS', RT_RCDATA);
  try
    Memo1.Lines.LoadFromStream(AStream);
  finally
    AStream.Free;
  end;
end;  
Аватара пользователя
Alexander
энтузиаст
Сообщения: 896
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Либо через ресурсы, либо как в MSEide+MSEgui в утилите form2pas.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Не совсем понятно. TMemo.Lines может хранить строки в самой форме lfm. В дизайне можно вставить текст. Если при сборке скриптами нужно что-то менять в тексте, можно вставить какие-нибудь теги, типа __Today__, и подменять башем

Код: Выделить всё

TEXT="$(cat umain.lfm)"
TEXT="${TEXT//__Today__/$(date +'%d.%m.%Y')}"
echo "${TEXT}" > umain.lfm.tmp
mv -f umain.lfm.tmp umain.lfm
или седом

Код: Выделить всё

sed -i "s|__Today__|$(date +'%d.%m.%Y')|g"
Хотя там есть https://www.freepascal.org/docs-html/3. ... gsu41.html и можно теги подменять на константы времени компиляции в рантайме.

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
begin
  MemoAbout.Text:=ReplaceStr(MemoAbout.Text,'__Today__',{$I %DATE%});
end;
Alex2013
долгожитель
Сообщения: 3267
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

sunjob писал(а): 20.02.2026 04:44:11 день добрый, колдуны!

как на этапе сборки "вкомпилировать" содержимое текстового файла в приложение?
(что бы потом отобразить в TMemo "About")
именно "вкомпилировать" а не загрузить из файла во время работы.
А просто константу с текстом вставить в исходник и добавить в FormCreate Memo1.Lines.Text:=MyText; не вариант ?

Код: Выделить всё

Const
  MyText:String=
    '1------------'+#13+#10+
    '2------------'+#13+#10+
    '3------------';
procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Text:=MyText;
end;
Но вообще то что вписано в дизайнере формы в поле Lines прекрасно "вкомпилируется" в код автоматически . (Размер почти ничем неограничен )
Зы
Если нужно что-то менять при сборке можно менять Lfm или действительно подключить ресурсы ... В общем вариантов много .
Аватара пользователя
sunjob
постоялец
Сообщения: 204
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

спасибо всем!
для себя решил, что использование рессурсов - наиболее удобно.

скрипт создания рессурса (pre_build.sh):

Код: Выделить всё

#!/bin/sh
rm -fr restext.lrs
lazres restext.lrs $TXT
добавляем скрип в секцию "пред-сборки":

Код: Выделить всё

menu / project / project options / compiler options / compiler command
execute before / command : pre_build.sh
подключение рессурса в секции инициализации:

Код: Выделить всё

initialization
{$I restext.lrs}
код загрузки рессурса:

Код: Выделить всё

memoTxt.Lines.Clear;
memoTxt.Lines.Add(LazarusResources.Find('restext').Value); 
Аватара пользователя
alexs
долгожитель
Сообщения: 4070
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Самый простой способ - использовать компоненты для хранения текстов. В Rx для этого RxStrHolder - по факту это обычный StringList обёрнутый в TComponent. Ещё есть RxTextHolder - коллекция StringList с поиском. Всё можно настроить в них визуально.
Аватара пользователя
sunjob
постоялец
Сообщения: 204
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

нужна загрузка "динамически изменяемого текста" - ваш компонент так может?

> Всё можно настроить в них визуально.
вот это как раз очень плохо :о) (надеюсь, обьяснять не надо?! все имхо, луше меньше и проще да надежнее)

за расширение кругозора - спасибо!
Сквозняк
энтузиаст
Сообщения: 1163
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

А ещё можно написать самопальную утилитку, которая будет создавать модуль с константой нужного содержания.
Аватара пользователя
sunjob
постоялец
Сообщения: 204
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

Сквозняк писал(а): 13.03.2026 21:29:05 можно написать самопальную утилитку,
а по вашему я что там сделал? :о)
все тоже самое только в стихах, с цветами и бутылкой шампанского?!

взять отдельный шаблон-модуль и в нем заменять "макрос" на содержимое "файла"?
это-же на много муторее чем
- 2 строчки кода в баш скрипте
- 2 строчки кода в модуле
и все автоматизировано?!
ко всему прочему - скрипт "pre/pos-build" очень так даже хороший подручный инструмент для "вообще".
все имхо... или я не правильно все не понял.

опишите ваш вариант более подробно?!
возможно, я не допонимаю сути.
Ответить