Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизКак сохранить Форму в файл и затем в работающем проекте восст.... Найти похожие ветки
← →
IgorRu (2003-07-26 21:37) [0]Задачка :
Есть проект с множеством форм (конечным). Хотелось бы сохранить act эти формы в виде файлов ?????.dat. Затем создать новый проект, который ничего об этих формах не знает, кроме названий файлов ?????.dat, но может их из этих самых файлов создавать и показывать.
Для чего:
Слишком много пользователей работает с этой прогой, к тому же они разбросаны по городу и несколько по РФ. В случае изменений в отдельно взятой форме достаточно было бы разослать определенный ?????.dat
Бъюсь уже неделю. Не получается.... Hellllp
← →
dim- (2003-07-27 01:10) [1]а не проще посмотреть в сторону dll
← →
XenonXX (2003-07-28 04:48) [2]Сохрани инфу про все компоненты, а потом восстанавливай.
типа
for i:=0 to Form1.ComponentCount do
.....
Знаю, гемороя мноого-го, но больше ничего в голову не приходит.
← →
Rouse_ (2003-07-28 04:52) [3]Так есть же системы контроля версий...
И они довольно распространены.
Желаю успехов
← →
Zergling (2003-07-28 06:02) [4]Поопрбуй это. Правда у меня это было для TPageControl, но думаю работать будет.
// Сохранение проекта
Procedure SaveProject(AFileName: TFileName);
var
FS: TFileStream;
begin
FS:=TFileStream.Create(AFileName, fmCreate or fmShareDenyRead);
try
FS.WriteComponent(Form1);
finally
FS.Free;
end;
End;
// Чтение проекта
Procedure LoadProject(AFileName:TFileName);
var
FS: TFileStream;
begin
FS:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyRead);
try
Form1 := TForm1(FS.ReadComponent(Form1));
finally
FS.Free;
end;
End;
← →
___Nikolay (2003-07-28 06:08) [5]Так можно сохранить всю форму в файл:
constructor TForm1.Create(AOwner: TComponent); // override;
var
fname: string;
begin
{ Для динамически создаваемых контролов, может требоваться
RegisterClasses(..); }
fname := FormFilename;
if FileExists( fname ) then
begin
CreateNew(AOwner);
ReadComponentResFile(fname, Self);
end
else
inherited Create( AOwner );
end;
procedure TForm1.FormCloseQuery( Sender: TObject;
var CanClose: Boolean);
begin
WriteComponentResFile(FormFileName, Self);
end;
← →
IgorRu (2003-07-28 10:08) [6]Все это не помогает. Может есть возможность из Формы &&&.bpl создать? Как?
← →
mike-d (2003-07-28 10:23) [7]еще раз - dim- © (27.07.03 01:10)
самый выгодный вариант...
← →
IgorRu (2003-07-28 10:31) [8]Это про DLL , а сколько весит одна DLL как минимум 50K умножить на 200 юзверей получаем 10М. Система обмена информацией не выдержит.
← →
MalkoLinge (2003-07-28 10:49) [9]Там тебе хороший кусок кода для записи компонента (а форма тоже компонент) в поток. Это, ИМХО то, что тебе надо :)
← →
Armen (2003-07-28 11:12) [10]см Zergling.
Только не забудь регистрировать все компоненты, которые использует форма.
RegisterClasses?
← →
IgorRu (2003-07-28 11:14) [11]Какой кусок кода, это типа WriteComponentResFile(FormFileName, Self);. Я так понял это, что то типа DFM файла создает, мне же надо все вместе с кодом сбытий, рабочая форма, а не картинка.
← →
Плохиш (2003-07-28 11:18) [12]мне же надо все вместе с кодом сбытий
Волшебные слова, тогда только >dim- © (27.07.03 01:10)
← →
Armen (2003-07-28 11:46) [13]А событие и есть published property, так что оно будет в dfm-е.
Delphi так и хранит проект.
Ты не бойся, попробуй, и увидишь что с событиями все в порядке.
← →
Armen (2003-07-28 11:57) [14]Можно еще использовать TWriter.WriteRootComponent, TReader.ReadRootComponent и писать не только Published Properties, но и что угодно.
← →
Smithson (2003-07-28 12:00) [15]Товарищи! Код событий не сохраняется в DFM, только ссылка на процедуру (по имени).
Если тебе надо не только внешний вид формы менять, но и поведение - только и исключительно dll (ну или извращенный вариант - пакеты).
← →
Armen (2003-07-28 12:14) [16]>Smithson © (28.07.03 12:00)
Естественно Код событий не сохраняется в DFM, но он же существует в самай программе, и нужно только ссылка? А если надо менять и это, то никакой dll, bpl не помогут, надо будет или свой интерпретатор (таких полно, когда то я работал с TatScriptCompiler, компилирует в P код, вполне пригодный), или компилятор.
← →
IgorRu (2003-07-28 12:43) [17]Надо что бы форма Main умела и генерить форму по вызову из Меню
procedure TFmMain.WM_OpenList(var Msg: TMessage);
begin
with TFmList.Create(Self) do begin
Show;
end;
end;
Это работает а вот TFmList умела только
constructor TFmList.Create( aOwner: TComponent);
begin
CreateNew( aOwner );
ReadComponentResFile("FmList.dat", Self);
end;
Или что то подобное. В данной контрукции есть проблема, если прни компиляции TFmList какие либо компоненты не будут указаны (присутствующие в FmList.dat) возникает ошибка и уж темболее при компиляции должны быть описаны все процедуры и события. Хотелось бы иметь пустой TFmList при компиляции, а всю информацию брать из FmList.dat.
Есть идей как это сделать так чтобы FmList.dat или dll или bpl имел размер до 10K да еще умел взаимодействовать с другими элементами проекта, например DataModule.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c