Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для Kaktuz
7 / 7 / 4
Регистрация: 28.05.2012
Сообщений: 169

Ресурсы приложения сделать отдельным файлом (не хранить внутри exe)

12.09.2013, 15:39. Показов 4502. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Знаю что можно создать *.res файл добавить в него данные, подключить его к проекту и потом загружать эти данные.
Но эти данные хранятся в *.exe файле самой программы, а хотелось бы что бы это был отдельный пусть даже *.res файл с которого потом будет идти чтение данных. Как это реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2013, 15:39
Ответы с готовыми решениями:

Header/Footer отдельным файлом или внутри index?
Приветствую Знакомлюсь с вёрсткой на bootstrap и смотрю на ютубе ролик с двухчасовой вёрсткой готового лендинга с нуля на бутстрапе...

Как хранить ресурсы в exe?
Как можно хранить ресурсы в exe если программа использует сторонние dll не .net,ну и конечно что бы программа работала после этого ну а ещё...

Как запустить проект не через Visual Studio, а отдельным файлом *.exe?
Создал проект WindowsFormsApplication1, которые выполняет необходимый для меня функционал Протестировал его в Visual Studio. Как дальше...

24
 Аватар для Kaktuz
7 / 7 / 4
Регистрация: 28.05.2012
Сообщений: 169
04.07.2014, 12:05  [ТС]
Студворк — интернет-сервис помощи студентам
Решил использовать простой ID
Code
1
#1#DZNKTFBJ#2#DZNKTFBJ
Как-то так вообщем. А можно и без индекса, ставить точку как разделитель кода и все.
Кстати, а в чем разница освобождения памяти, меду "FS.Free" и "FreeAndNil(FS)".
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
04.07.2014, 13:02
Цитата Сообщение от Kaktuz Посмотреть сообщение
Кстати, а в чем разница освобождения памяти, меду "FS.Free" и "FreeAndNil(FS)".
Fs.Free - этот метод делает следующее. Если Fs <> nil, то освобождает память, занятую экземпляром, на который указывает Fs. А FreeAndNil(Fs) - это процедура, которая вызовет Fs.Free и обнулит указатель Fs: Fs := nil. Использование FreeAndNil() повышает надёжность кода.
0
 Аватар для Kaktuz
7 / 7 / 4
Регистрация: 28.05.2012
Сообщений: 169
04.07.2014, 17:04  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
повышает надёжность кода
Будем знать.
Code
1
2
3
4
5
6
FS := TFileStream.Create(Form1.OpenDialog1.FileName, fmOpenRead);
SS := TStringStream.Create('');
DecodeStream(FS, SS);
Form1.Image1.Picture.Bitmap.LoadFromStream(SS);
FreeAndNil(FS);
FreeAndNil(SS);
Ошибок нет, но и изображения тоже нет...
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
04.07.2014, 20:51
Цитата Сообщение от Kaktuz Посмотреть сообщение
Ошибок нет, но и изображения тоже нет...
В потоке данные есть, но в Image1 они не загружены. Дело вот в чём. Все потоки унаследованы от класса TStream. В этом классе есть свойство: TStream.Position. Это свойство задаёт текущую позицию в потоке. Если мы читаем данные из потока (или записываем в поток), то эта запись (или чтение) начинается, как раз, с текущей позиции. Теперь смотрим, что происходит в коде. Перед третьей строкой кода имеем - 2 потока и в обоих текущая позиция равна нулю. Потом, в 3-й строке происходит вызов DecodeStream(FS, SS). При этом, по мере чтения данных из FS, текущая позиция FS.Position будет увеличиваться. И по мере записи данных в SS, будет увеличиваться текущая позиция SS.Position. Когда все данные будут считаны из FS и записаны в SS, то мы получим следующее:
FS.Position = FS.Size и SS.Position = SS.Size
И теперь, когда мы попытаемся загрузить данные из SS в Image, то данные будут грузиться от текущей позиции. А т. к. текущая позиция находится в конце потока, то ничего загружено не будет.

Отсюда вывод: перед загрузкой в Image текущую позицию потока SS надо установить на начальную позицию - на позицию 0 (ноль):
Delphi
1
2
SS.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(SS);
0
 Аватар для Kaktuz
7 / 7 / 4
Регистрация: 28.05.2012
Сообщений: 169
09.07.2014, 19:23  [ТС]
Собрал пакет. Вроде не плохо получилось.

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, StdCtrls, EncdDecd;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N11: TMenuItem;
    Memo1: TMemo;
    ListBox1: TListBox;
    N2: TMenuItem;
    N21: TMenuItem;
    N22: TMenuItem;
    N23: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N14Click(Sender: TObject);
    procedure N15Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
    procedure N22Click(Sender: TObject);
    procedure N23Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  FD: String;
  SL: TStringList;
  FS: TFileStream;
  SS: TStringStream;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.N13.Enabled := False;
  Form1.N14.Enabled := False;
  Form1.N15.Enabled := False;
  Form1.N2.Enabled := False;
  Form1.ListBox1.Enabled := False;
  Form1.Memo1.Enabled := False;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(SL);
  FreeAndNil(FS);
  FreeAndNil(SS);
end;
 
procedure TForm1.N11Click(Sender: TObject);
begin
  // Создать
  Form1.N11.Enabled := False;
  Form1.N12.Enabled := False;
  Form1.N14.Enabled := True;
  Form1.N15.Enabled := True;
  Form1.N2.Enabled := True;
  Form1.ListBox1.Enabled := True;
  Form1.Memo1.Enabled := True;
  SL := TStringList.Create;
end;
 
procedure TForm1.N12Click(Sender: TObject);
var i: Integer; s: String;
begin
  // Открыть
  Form1.OpenDialog1.Filter := 'Тип файла Base64 (*.base)|*.base|Все файлы (*.*)|*.*';
  If Form1.OpenDialog1.Execute Then
  begin
    Form1.ListBox1.Enabled := True;
    Form1.Memo1.Enabled := True;
    FD := Form1.OpenDialog1.FileName;
    SL := TStringList.Create;
    SL.LoadFromFile(Form1.OpenDialog1.FileName);
    For i:=0 To SL.Count-1 Do
    begin
      If Copy(SL.Strings[i],1,1) = '#' Then
      begin
        s := SL.Strings[i];
        Delete(s, 1, 1);
        Form1.ListBox1.Items.Add(Copy(s, 1, pos('/', s)-1));
      end;
    end;
    Form1.N11.Enabled := False;
    Form1.N12.Enabled := False;
    Form1.N13.Enabled := True;
    Form1.N14.Enabled := True;
    Form1.N15.Enabled := True;
    Form1.N2.Enabled := True;
  end;
end;
 
procedure TForm1.N13Click(Sender: TObject);
begin
  // Сохранить
  If FileExists(FD) Then SL.SaveToFile(FD);
end;
 
procedure TForm1.N14Click(Sender: TObject);
begin
  // Сохранить как...
  Form1.SaveDialog1.FileName := 'Base64';
  Form1.SaveDialog1.Filter := 'Тип файла Base64 (*.base)|*.base|Все файлы (*.*)|*.*';
  If Form1.SaveDialog1.Execute Then
  begin
    SL.SaveToFile(Form1.SaveDialog1.FileName);
  end;
end;
 
procedure TForm1.N15Click(Sender: TObject);
begin
  // Закрыть
  FreeAndNil(SL);
  Form1.ListBox1.Items.Clear;
  Form1.Memo1.Clear;
  Form1.StatusBar1.Panels[0].Text := 'Имя:';
  Form1.StatusBar1.Panels[1].Text := 'Размер:';
  Form1.StatusBar1.Panels[2].Text := 'Base64:';
  Form1.ListBox1.Enabled := False;
  Form1.Memo1.Enabled := False;
  Form1.N11.Enabled := True;
  Form1.N12.Enabled := True;
  Form1.N13.Enabled := False;
  Form1.N14.Enabled := False;
  Form1.N15.Enabled := False;
  Form1.N2.Enabled := False;
end;
 
procedure TForm1.N17Click(Sender: TObject);
begin
  // Выход
  Form1.Close;
end;
 
procedure TForm1.N21Click(Sender: TObject);
begin
  // Добавить
  If Form1.OpenDialog1.Execute Then
  begin
    FS := TFileStream.Create(Form1.OpenDialog1.FileName, fmOpenRead);
    SS := TStringStream.Create('');
    try
      EncodeStream(FS, SS);
      SL.Add('#'+ExtractFileName(Form1.OpenDialog1.FileName)+'/'+IntToStr(FS.Size)+'/'+IntToStr(SS.Size));
      SL.Add(StringReplace(StringReplace(Trim(SS.DataString),#13,'',[rfReplaceAll]),#10,'',[rfReplaceAll]));
      Form1.ListBox1.Items.Add(ExtractFileName(Form1.OpenDialog1.FileName));
    finally
      FreeAndNil(FS);
      FreeAndNil(SS);
    end;
  end;
end;
 
procedure TForm1.N22Click(Sender: TObject);
var n: Integer;
begin
  // Удалить
  If Form1.ListBox1.ItemIndex >= 0 Then
  begin
    n := Form1.ListBox1.ItemIndex;
    Form1.ListBox1.Items.Delete(n);
    SL.Delete(n*2);
    SL.Delete(n*2);
  end;
end;
 
procedure TForm1.N23Click(Sender: TObject);
var s: String;
begin
  // Извлечь
  If Form1.ListBox1.ItemIndex >= 0 Then
  begin
    s := SL.Strings[Form1.ListBox1.ItemIndex*2];
    Delete(s, 1, 1);
    Form1.SaveDialog1.FileName := Copy(s, 1, pos('/', s)-1);
    If Form1.SaveDialog1.Execute Then
    begin
      FS := TFileStream.Create(Form1.SaveDialog1.FileName, fmCreate);
      SS := TStringStream.Create(DecodeString(SL.Strings[Form1.ListBox1.ItemIndex*2+1]));
      try
        SS.Position := 0;
        FS.CopyFrom(SS, SS.Size);
      finally
        FreeAndNil(FS);
        FreeAndNil(SS);
      end;
    end;
  end;
end;
 
procedure TForm1.ListBox1DblClick(Sender: TObject);
var s: String;
begin
  s := SL.Strings[Form1.ListBox1.ItemIndex*2];
  Delete(s, 1, 1);
  Form1.StatusBar1.Panels[0].Text := 'Имя: '+Copy(s, 1, pos('/', s)-1);
  Delete(s, 1, pos('/', s));
  Form1.StatusBar1.Panels[1].Text := 'Размер: '+Copy(s, 1, pos('/', s)-1);
  Delete(s, 1, pos('/', s));
  Form1.StatusBar1.Panels[2].Text := 'Base64: '+s;
  Form1.Memo1.Text := SL.Strings[Form1.ListBox1.ItemIndex*2+1];
end;
 
end.
Миниатюры
Ресурсы приложения сделать отдельным файлом (не хранить внутри exe)  
Вложения
Тип файла: rar Package.rar (14.7 Кб, 5 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2014, 19:23

Локализация приложения: где хранить ресурсы
Вообщем через ресурсы приложения все сделал как нужно. Относительно среды запускается тот язык который нужен. Хочу иметь...

Как хранить все ресурсы приложения во внешнем файле (контейнере)
Опять подошла к некоему порогу, но есть сильные подозрения что тема очень не нова, но поиском не нашла по форуму ничего нужного. Файл...

Публикация приложения одним exe файлом
В общем начал изучать C# и вот встает вопрос: а как опубликовать проект, чтобы в конечном итоге был один екзешник и все необходимые файлы...

Запуск exe приложения внутри формы
Добрый вечер. Подскажите, пожалуйста, как можно сделать запуск программы внутри формы, то есть указать ссылку на exe и чтобы был вывод в...

Процедура отдельным файлом
Мне нужно разбить проект на отдельные модули, но столкнулся с небольшой проблемой хочу несколько процедур сделать универсальными и...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru