Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.11;
Скачать: CL | DM;

Вниз

Как сохранить Форму в файл и затем в работающем проекте восст....   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
14-33331
Scorpx
2003-07-25 09:08
2003.08.11
Согласны ли Вы с данной фразой?


8-33232
Serg123
2003-04-14 15:37
2003.08.11
Получение свойств avi файла


6-33245
Ghost
2003-06-04 10:45
2003.08.11
Определить какому каталогу соответствует открытый ресурс


1-33109
Region
2003-07-29 11:40
2003.08.11
Флэш


1-33110
Новенький
2003-07-28 23:14
2003.08.11
Вопрос по Memo