Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.70/97: Рейтинг темы: голосов - 97, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 11
1

Большой текст в Delphi. (Работа с ресурсами - примечание модератора Mawrat).

24.12.2011, 19:43. Показов 18273. Ответов 22

Можно ли вставить большой текст в Delphi до запуска программы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2011, 19:43
Ответы с готовыми решениями:

Работа с ресурсами
Всем доброго времени суток, с наступившим новым годом! Есть проблема: Я создал две процедуры,...

Работа с ресурсами
Нужно сделать программу с линейкой меню код такой #include <windows.h> #include <windowsx.h>...

Работа с ресурсами
Такой вопрос - например, я "засунул" базу данных в ресурсы, как только программа запускается, эта...

Работа с ресурсами
как загрузить в ресурсы программы dll'ку, а при запуске выгрузить ее ? Добавлено через 19 минут...

22
5441 / 2148 / 450
Регистрация: 20.11.2009
Сообщений: 7,186
Записей в блоге: 1
24.12.2011, 19:45 2
Что, зачем и почему???
0
NIch
24.12.2011, 19:58
  #3

Не по теме:

Цитата Сообщение от IHaveQuestions Посмотреть сообщение
большой текст
войну и мир что ли?

0
5441 / 2148 / 450
Регистрация: 20.11.2009
Сообщений: 7,186
Записей в блоге: 1
24.12.2011, 20:03 4
а как можно вставить в дельфи еще до запуска???в саму IDE дельфи или в разрабатываемую программу на дельфи???
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
24.12.2011, 22:19 5
IHaveQuestions, поясни, что хочешь сделать?
Экстрасенсы с курорта не вернулись
0
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 11
24.12.2011, 22:22  [ТС] 6
Да просто, мне нужно до запуска программы разместить текст на форме, достаточно большой. Притом в определенном количестве, при этом мне не хотелось бы для этого, создавать тучу текстовых файлов
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
24.12.2011, 23:14 7
IHaveQuestions, до запуска - нет такого понятия.
При запуске - совсем другое дело. Самый простой пример для TMemo - в обработчике события формы OnCreate написать:
Delphi
1
  Memo1.Lines.LoadFromFile('C:\text document.txt');
А зачем на файлы делить?
И что должна делать программа?
(надо пояснить всё, что можно - чтобы мы могли подсказать наиболее подходящий вариант решения задачи)

Добавлено через 44 секунды
Да, и сколько примерно мегабайт текст занимает?
0
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 11
24.12.2011, 23:16  [ТС] 8
Так то весь текст получится. А мне нужен определенный текст из этого файла.

Да и под "До запуска" Я имел ввиду во время настройки программы
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
24.12.2011, 23:19 9
IHaveQuestions, ну я ещё раз скажу - объясняй ты по-человечески. Ну не могу я угадать, какой именно кусок ты хочешь оттуда выцепить. По каким критериям должен выбираться этот определённый кусок файла?
0
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 11
24.12.2011, 23:23  [ТС] 10
Ну представь себе рассказ разделенный на главы.

Вот на них я и хочу поделить текст
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
24.12.2011, 23:34 11
Ой... допустим, каждое заглавие у нас на отдельной строчке. И допустим, заглавие начинается с символа набора символов '#>>>', то есть:
рассказ.txt
#>>> Глава 1
Жили были дед да бабка! Жили они счастливо.
Был у них огромный некрополь. И бла-бла-бла!
#>>> Глава 2
Однажды дед зарезал бабку и закопал тело на заднем дворе своего некрополя. Потом он начертил пентаграмму и начал читать заклинания из страшной книги "Некрономикон" в попытке вызвать Азатота!

Тогда объяви где-нить массив:
Delphi
1
2
Var
  Chappers: Array of String;
и вот тебе процедура загрузки в массив по главам отдельно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure LoadFromFile(FileName: String);
var
  s: String;
  fl: TextFile;
  i: Integer;
begin
  i := -1;
  AssignFile(fl, FileName);
  Reset(fl);
  While not EOF(fl) do
    begin
      ReadLn(fl, s);
      If pos('#>>>', s) = 1 then
        begin
          inc(i);
          SetLength(Chappers, i + 1);
          Delete(s, 1, 4);
          Chappers[i] := s;
        end
      else if i > -1 then
        Chappers[i] := Chappers[i] + s + #10#13;
    end;
  CloseFile(fl);
end;
1
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
25.12.2011, 05:32 12
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от IHaveQuestions Посмотреть сообщение
Можно ли вставить большой текст в Delphi до запуска программы
Как я понял, надо добавить какие-то данные в исполняемый файл программы (*.EXE). Это можно сделать с помощью добавления ресурсов в EXE или DLL файл.
Делается это так.
Предположим, наш проект расположен в папке Project. И, например, пускай нам надо добавить в исполняемый файл текст из файла Lecpas.txt и изображение из файла 01.bmp.
1. Создаём папки:
Код
Project\Resource
Project\Resource\Files
2. В папку Project\Resource\Files копируем нужные файлы:
Код
Project\Resource\Files\Lecpas.txt
Project\Resource\Files\01.bmp
3. В папке Project\Resource создаём файлы:
Код
Project\Resource\ResLib.bat
Project\Resource\ResLib.rc
4. Содержимое файла ResLib.bat оформляем так:
Код
brcc32.exe ResLib.rc
5. Содержимое файла ResLib.rc делаем таким:
Код
TXT RCDATA "Files\Lecpas.txt"
BMP RCDATA "Files\01.bmp"
Эти строки имеют формат: ИМЯ_РЕСУРСА ТИП_РЕСУРСА "Путь к файлу с данными"
Тип RCDATA обозначает любые данные.
6. Теперь запускаем файл ResLib.bat. В результате этого будет запущен компилятор ресурсов brcc32.exe, который на основе информации из файла ResLib.rc создаст файл ресурсов с именем:
Код
Project\Resource\ResLib.RES
В этот файл будут помещены два ресурса:
Код
- ресурс с именем TXT, типом RCDATA и с данными из файла "Files\Lecpas.txt"
- ресурс с именем BMP, типом RCDATA и с данными из файла "Files\01.bmp"
7. Теперь, готовый файл ресурсов:
Код
Project\Resource\ResLib.RES
копируем в папку проекта:
Код
Project\ResLib.RES
8. В любом из модулей проекта записываем команду компилятору (директива компилятору):
Delphi
1
{$R ResLib.res}
Эта команда означает, что компилятор должен в исполняемый файл поместить ресурсы из файла ResLib.res.
Чаще всего такую директиву добавляют в раздел implementation модуля, рядом с подобной директивой по загрузке ресурсов формы:
Delphi
1
2
3
4
5
implementation
 
{$R *.dfm}
 
{$R ResLib.res}
Или можно эту директиву добавить в модуль проекта:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program Project1;
 
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
{$R ResLib.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
9. Теперь нам надо написать код, с помощью которого мы сможем во время работы программы прочитать прикреплённые ресурсы. Пишем:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
implementation
 
{$R *.dfm}
 
{$R ResLib.res}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Rs : TResourceStream;
begin
  //Загрузка данных из ресурса с именем TXT в Мемо1.
  Rs := TResourceStream.Create(HInstance, 'TXT', RT_RCDATA);
  Memo1.Lines.LoadFromStream(Rs);
  FreeAndNil(Rs);
 
  //Загрузка данных из ресурса с именем BMP в Image1.
  Rs := TResourceStream.Create(HInstance, 'BMP', RT_RCDATA);
  Image1.Picture.Bitmap.LoadFromStream(Rs);
  FreeAndNil(Rs);
end;
 
end.
---
Компилятор ресурсов brcc32.exe лежит в папке: $(DELPHI)\Bin. Если Delphi установлен правильно, то эта папка добавлена в переменную окружения %PATH%.
---
Архив с этим проектом приложен к сообщению.
8
Вложения
Тип файла: rar WorkWithResource.rar (209.5 Кб, 289 просмотров)
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
25.12.2011, 11:06 13
базу данных подключи
0
2 / 2 / 0
Регистрация: 17.03.2012
Сообщений: 46
01.06.2013, 11:58 14
Цитата Сообщение от Mawrat Посмотреть сообщение
Как я понял, надо добавить какие-то данные в исполняемый файл программы (*.EXE). Это можно сделать с помощью добавления ресурсов в EXE или DLL файл.
Такой вопрос. при запуске программы на выполнение создается ехе-файл. после этого можно просто удалить файл ресурсов, он для работы программы не нужен(по-моему,включается в исполняемый файл). А как сделать так, чтобы ресурсный файл не включался в экзешник, а для работы программы он должен был быть в папке с программой? Или это можно сделать только с помощью ДЛЛ?
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
01.06.2013, 14:35 15
Цитата Сообщение от materikin Посмотреть сообщение
Такой вопрос. при запуске программы на выполнение создается ехе-файл. после этого можно просто удалить файл ресурсов, он для работы программы не нужен(по-моему,включается в исполняемый файл).
Да, верно - ресурсы включаются прямо в исполняемый файл.
Цитата Сообщение от materikin Посмотреть сообщение
А как сделать так, чтобы ресурсный файл не включался в экзешник, а для работы программы он должен был быть в папке с программой? Или это можно сделать только с помощью ДЛЛ?
Можно в DLL, конечно добавить. Но DLL, в общем, для других целей предназначены. Их основное назначение - эффективное предоставление исполняемого кода одновременно нескольким процессам. Т. е., DLL загружается в память в виде одного экземпляра. А пользоваться её кодом могут одновременно различные процессы. При этом код функций DLL отображается прямо в адресные пространства вызывающих процессов.
Для хранения данных лучше всё-таки использовать другие механизмы. Например, в папке с программой может быть вложенная папка с нужными файлами. Или можно в один файл загружать все нужные данные. Для этого например, можно использовать базу данных. MS Access для этого хорошо подходит. Все данные там хранятся в одном файле, который можно поставлять вместе с программой. И драйверы для доступа к такой базе, имеются на большинстве компьютеров - везде, где установлен MS Office.
Можно и без базы данных обойтись, если это обосновано какими-то вескими причинами. Все данные тогда можно хранить в одном файле в виде блоков, например, с таким форматом:
<Имя_блока : String[20]><Размер_данных : Integer><Данные_блока : array[1..Размер_данных] of Byte>
Можно в формат ещё добавить описание типа блока:
<Имя_блока : String[20]><Тип_блока : String[10]><Размер_данных : Integer><Данные_блока : array[1..Размер_данных] of Byte>
Для работы с таким файлом понадобится написать несколько функций:
Delphi
1
2
3
function ReadBlock(const aName : String; var aStr : TStream) : Boolean;
function WriteBlock(const aName : String; var aStr : TStream) : Boolean;
function DeleteBlock(const aName : String) : Boolean;
Или в таком виде:
Delphi
1
2
3
4
5
6
type
  TArrByte = array of Byte;
 
function ReadBlock(const aName : String; var aArr : TArrByte) : Boolean;
function WriteBlock(const aName : String; var aArr : TArrByte) : Boolean;
function DeleteBlock(const aName : String) : Boolean;
1
3 / 3 / 1
Регистрация: 30.05.2013
Сообщений: 35
01.06.2013, 15:03 16
Можно загрузить файл при открытии формы : Memo1.Lines.LoadFromFile('Путь к файлу.');
Или же можно сначала установить текст в Memo,установим текст с помощью lines,там в свойствах есть.
0
2 / 2 / 0
Регистрация: 17.03.2012
Сообщений: 46
01.06.2013, 17:05 17
А если мне нужно несколько изображений хранить в файле? а размер программы-не более 15 Мб хотелось бы(базы данных слишком большие), как быть? Видимо, самое оптимальное-ресурсный файл
0
Житель Земли
2838 / 2709 / 375
Регистрация: 26.07.2011
Сообщений: 10,771
Записей в блоге: 1
01.06.2013, 17:17 18
Цитата Сообщение от materikin Посмотреть сообщение
А если мне нужно несколько изображений хранить в файле? а размер программы-не более 15 Мб хотелось бы(базы данных слишком большие), как быть? Видимо, самое оптимальное-ресурсный файл
уж не думаешь ли ты, что если общий размер изображений превысит 15 мб, то путем помещения в ресурсный файл он каким-то волшебным образом уменьшится?! да, ты можешь заархивировать их, запихать в ресурс, прилинковать к исполняемому файлу, а потом извлекать и распаковывать во временную папку. но учти, что 200 МБ JPEG в 15 мб ну никак не поместятся.
0
2 / 2 / 0
Регистрация: 17.03.2012
Сообщений: 46
01.06.2013, 18:24 19
Цитата Сообщение от DenNik Посмотреть сообщение
но учти, что 200 МБ JPEG в 15 мб ну никак не поместятся.
нее, ты не понял. изображений там на 15 Мб, но мне надо, чтобы они были в одном файле и не входили в экзешник, а лежал этот файл в папке с программой
0
Житель Земли
2838 / 2709 / 375
Регистрация: 26.07.2011
Сообщений: 10,771
Записей в блоге: 1
01.06.2013, 18:34 20
Цитата Сообщение от materikin Посмотреть сообщение
чтобы они были в одном файле и не входили в экзешник, а лежал этот файл в папке с программой
используй запись/чтение потоков
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2013, 18:34

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Работа с ресурсами
Знаю, что вопрос глупый, но пожалуйста посоветуйте хорошую программу для работы с ресурсами. Кроме...

Работа с ресурсами
Здравствуйте. Необходимо организовать проигрывание аудиофайла из папки Resources, но не с...

Работа с ресурсами.
Какая функция отвечает за удаление ресурса из exe проги во время её работы или по завершению...

Работа с ресурсами
Вообщем вся картина на картине :) Вот Main.cpp void error(char code) { cout &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.