Delphi İle Setup Programı Yapmak Gönderen: dynamo Tarih: 07 April 2007 11:59:35
InstallShield yada Innostup gibi programlarını kullanmak istemeyenler için kendi setup programını hazırlayacak bir uygulama.

Setup programı 2 kısımdan oluşur:Install ve Uninstall,yani 2 proje yapılacak.
Install programının yaptığı işlemler şunlar:
1-Kaynak dizini belirtile disk sürücüsüne kopyalar.
2-Programın masaüstüne,kısayolunu atar.
3-Başlat->Programlar'da Program Grubu oluşturur.
4-Programın daha sonra kaldırılması için Program Ekle/Kaldır da görünmesi için
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" altında kaydını yapar.
5-Uninstall.exe dosyasını Windows dizinine kopyalar.
Uninstall.exe programının yaptığı işlemler:
1-dizinsil fonksiyonu ile programın dizinini disk sürücüsünden kaldırır.Uninstall.exe nin kendisi Windows dizininde olduğundan bundan etkilenmez.yani sildiği dizinin içinde olmamalı.
2-Başlat->Programlar'da Program Grubunu kaldırı. normalde bunun çalışması gerkirdi.fakat bir yerde küçük bir hata mı var ,bir türlü program grubunu kaldırmıyor.

3-Registry de "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" anahtarını siler.
4-DeleteEXE prosedürü ile kendini siler.
----->Install projesi

Install programı.Kodlara mümkün olduğunca açıklama satırları ekledim.Programa kopyalama sürecini kullanıcıya bildirmesi için Progressbar ekledim....
unit Setup;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, FileCtrl, ComCtrls, DdeMan,ShlObj, ComObj,
ActiveX,Registry;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
ProgressBar1: TProgressBar;
BitBtn3: TBitBtn;
Label6: TLabel;
DdeClientConv1: TDdeClientConv;
DriveComboBox1: TDriveComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ListBox1: TListBox;
procedure BitBtn1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Inputdir, Outputdir,dizin_adi:string;
filecount:integer;
function FileCopyExit(inpath,outpath,filename:string; var canclose:boolean):boolean;
end;
var
Form1: TForm1;
implementation
uses UCopyFolder;
{$R *.dfm}
//kaynak dizinden(inpath) hedef dizine(outpath) dosyaları kopyalar
function TForm1.FileCopyExit(inpath,outpath,filename:string; var canclose:boolean):boolean;
begin
result:=true;
inc(filecount);
if tag<>0 then result:=false; {user pressed the stop button, abort}
//memo1.lines.add(format('%s from %s to %s',[filename,inpath,outpath]));
Application.ProcessMessages;
ProgressBar1.Position:= filecount; //kopyalama sürecini progressbarda göster
Label2.Caption:= filename; //kopyalanan dosya adını Label2'de göster
Label2.Refresh;
Label2.Repaint;
end;
//FindFiles prosedürü,dizin ve alt dizinlerdeki toplam dosya sayısını verir
// Recursive procedure to build a list of files
procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
var
SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: integer;
begin
if StartDir[length(StartDir)] <> '\' then
StartDir := StartDir + '\';
{ Build a list of the files in directory StartDir
(not the directories!) }
IsFound :=
FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
while IsFound do begin
FilesList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);
// Build a list of subdirectories
DirList := TStringList.Create;
IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0;
while IsFound do begin
if ((SR.Attr and faDirectory) <> 0) and
(SR.Name[1] <> '.') then
DirList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);
// Scan the list of subdirectories
for i := 0 to DirList.Count - 1 do
FindFiles(FilesList, DirList[i], FileMask);
DirList.Free;
end;
//---------KISAYOL OLUŞTUR---------------------------------------------------
//CreateLink('c:\windows\notepad.exe','c:\MyNotePad.lnk','','');
// Desktop, Start Menu ve Quick Launch'da oluştur
//CreateShortCut('Not defteri', 'c:\windows\notepad.exe', 'c:\windows\',[slDesktop, slStartMenu, slQuickLaunch]);
// Sadece Desktop ve Quick Launch'da oluştur
//CreateShortCut('Not defteri', 'c:\windows\notepad.exe', 'c:\windows\',[slDesktop, slQuickLaunch]);
// Sadece Desktop oluştur
//CreateShortCut('Not defteri', 'c:\windows\notepad.exe', 'c:\windows\',[slDesktop]);
type
TShortCutLocation = (slDesktop, slStartMenu, slQuickLaunch);
TShortCutLocations = set of TShortCutLocation;
procedure CreateShortCut(Description, ApplicationPath, StartFolder: string;Locations: TShortCutLocations);
var
MyObject : IUnknown;
MySLink : IShellLink;
MyPFile : IPersistFile;
Directory : string;
WFileName : WideString;
MyReg : TRegIniFile;
begin
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;
with MySLink do begin
{ Parametreler icin kullanilabilir:
SetArguments(PChar(Application Path));
}
MySLink.SetPath(PChar(ApplicationPath));
SetRelativePath(PChar(StartFolder),0);
SetWorkingDirectory(PChar(StartFolder));
SetDescription(PChar(Description));
SetIconLocation(PChar(ApplicationPath),0);
end;
MyReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');
// Desktop'a kisa yol olusturmak icin }
if slDesktop in Locations then
begin
Directory := MyReg.ReadString('Shell Folders','Desktop','');
WFileName := Directory+ '\' + Description + '.lnk';
MyPFile.Save(PWChar(WFileName) ,False);
end;
// Start Menu için
if slStartMenu in Locations then
begin
Directory := MyReg.ReadString('Shell Folders','Programs','');
{ Alt Klasörde oluşturmak için:
Directory = Directory + '\KlasorAdi';
CreateDir(Directory); }
WFileName := Directory+ '\' + Description + '.lnk';
MyPFile.Save(PWChar(WFileName) ,False);
end;
// QuickLaunch için
if slQuickLaunch in Locations then
begin
Directory := MyReg.ReadString('Shell Folders','Appdata','');
WFileName := Directory +'\Microsoft\Internet Explorer\Quick Launch\' +Description + '.lnk';
MyPFile.Save(PWChar(WFileName) ,False);
end;
MyReg.Free;
end;
//unistall programınının yolunu registry e verir
procedure CreateSoftwareEntry(const DisplayName, IconPath, Version, Publisher, UninstallPath: String);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + DisplayName, true) then
begin
Reg.WriteString('DisplayIcon', IconPath);
Reg.WriteString('DisplayName', DisplayName);
Reg.WriteString('DisplayVersion', Version);
Reg.WriteString('Publisher', Publisher);
Reg.WriteString('UninstallString', UninstallPath);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
dosya: TextFile;
satir,str:string;
FilesList: TStringList;
file_count:integer;
Reg:TRegistry;
GUID:string;
strGroup : string;
strExeName : string;
strExeFile : string;
strMacro : string;
bootdir:string;
begin
//DriveComboBox1.Drive yüklenecek disk sürücüsü seçilir
InputDir:=ExtractFilePath(Application.ExeName)+'\Personel Takip';
OutputDir:=DriveComboBox1.Drive+':\Personel Takip';
if not DirectoryExists(InputDir) then begin
Application.MessageBox('Personel Takip Kaynak Yükleme Dizini Bulunamadı...','PROGRAM YÜKLEME HATASI',MB_OK);
exit;
end;
if (Application.MessageBox('Programı Yüklemek İstiyor musunuz...?','UYARI',MB_YESNO)=IDNO) then begin
exit;
end;
if not DirectoryExists(OutputDir) then begin
CreateDir(OutputDir);
end else begin
if (Application.MessageBox('Personel Takip Programı Önceden Yüklenmiş...Devam Etmek İstiyor musunuz...?','UYARI',MB_YESNO)=IDNO) then begin
exit;
end;
end;
//----kaynak dizin ve alt dizinlerdeki içindeki toplam dosya sayısı---------
FilesList := TStringList.Create;
try
FindFiles(FilesList, InputDir, '*.*');
ListBox1.Items.Assign(FilesList);
file_count:=FilesList.Count;
finally
FilesList.Free;
end;
//--------------------------------------------------------------------------
ProgressBar1.Min:=0;
ProgressBar1.Max:= file_count;
ProgressBar1.Visible:=true;
//---kaynak klasör,alt klasör ,dosyaları kopyala---------------------
tag:=0;
filecount:=0;
screen.cursor:=crHourGlass;
copyfolder(InputDir,OutputDir,'*.*', 0,true,true,FileCopyExit);
screen.cursor:=crDefault;
Label2.Caption:='';
Application.MessageBox('Yükleme Tamamlandı...','Program Yükleme',MB_OK);
//unistal.exe yi Windows klasörüne kopyala
//bootdir ile windows'un yüklü olduğu disk sürücüsünü bul
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Setup', false) then
bootdir:=Reg.ReadString('BootDir');
Reg.CloseKey;
Reg.Free;
CopyFile(PChar(InputDir+'\Uninstall001.exe'),PChar(bootdir+'Windows\Uninstall001.exe'),true);
//unistal programını registry e kaydet
CreateSoftwareEntry('Personel Takip', OutputDir+'\Personel.exe', '1.0', 'TAIVAN BSC BIOMETRIC CO. INT.', bootdir+'Windows\Uninstall001.exe');
//başlat->programlarda group oluştur
strGroup := 'Personel Takip';
strExeName := 'Personel';
strExeFile := OutputDir+'\Personel.exe';
DdeClientConv1.SetLink('PROGMAN','PROGMAN') ;
strMacro := '[CreateGroup(' + strGroup + ')]';
DDEClientConv1.ExecuteMacro(PChar(strMacro),False);
//strMacro := '[ShowGroup(' + strGroup + ',1)]';
//DDEClientConv1.ExecuteMacro(PChar(strMacro),False);
strMacro := '[AddItem("' + strExeFile + '","' + strExeName + '")]';
DDEClientConv1.ExecuteMacro(PChar(strMacro),False);
if (Assigned(DDEClientConv1)) then begin
DDEClientConv1.CloseLink;
end;
//Desktop a kısayol oluştur
if FileExists(OutputDir+'\Personel.exe') then
CreateShortCut('Personel Takip', OutputDir+'\Personel.exe', OutputDir,[slDesktop]);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Label2.Caption:='';
//ProgressBar1.Visible:=false;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Close;
end;
Setup programı "UCopyFolder" adlı uniti kullanıyor.dizin/alt dizinler ve bunların içindeki dosyaları kopyalama işlemini bu unit içindeki "copyfolder" fonksiyonu yapıyor.UCopyFolder.pas kaynak kodu:
unit UCopyFolder;
{Copyright © 2006, Gary Darby, www.DelphiForFun.org
This program may be used or modified for any non-commercial purpose
so long as this original notice remains in place.
All other rights are reserved
}
{CopyFolder procedure copies files matching a given mask from one folder to
another. Parameters are;
FromFolder: Tha path to the folder containing the files to be copied
ToFolder: The path to the folder to receiver the files
Mask: A file mask to cntol which files are selected ('*.* = All files)
DupFileOpts: Four options are available when the file already exists:
1 ==> skip the file
2 ==> always copy the file
3 ==> copy the file if it is newer than the exitising copy
4 ==> ask the user what actoion to take
CopySubFolders: Files in subfolders of the specified Inopath folder will also be
copied if this parameter is true.
ResetreadOnly: If input files marked as "Readonly" will have that attribute
removed in the target location.
FileExit: The address of optional method (function of object) specifying a
user procedure to be called before each file is copied.
If the callback procedure is specified, it receives 4 parameters:
Inpath: Path to the input file.
OutputPath: path where the fle will be copied.
Filename: Name of the file to be copied.
Cancopy: Boolean parameter defaulting to true. Set "Cancopy" to
false to skip copying this file.
The FileExit function must return true if copying is to continmue,
and false to abort the copy procedure without copying further files.
}
interface
Uses windows,sysutils,dialogs,controls, forms, filectrl,masks;
type
TCopyFolderExit = function(inpath,outpath,filename:string;
var Cancopy:boolean):boolean of object;
function copyfolder(fromfolderIn, tofolderIn,mask:string; dupfileopts:integer;
copysubfolders, ResetReadOnly:boolean):boolean; overload;
function copyfolder(fromfolderIn, tofolderIn,mask:string; dupfileopts:integer;
copysubfolders, ResetReadOnly:boolean;
FileExit:TCopyFolderExit):boolean; overload;
implementation
{Define a Dummyclass to hold a dummfileexit method to provide a way for
the overloaded CopyFolder version without the file exit to pass this
function as a parameter to the overloaded verion that does the work}
type Tdummyclass = class(TObject)
function dummyfileexit(inpath,outpath,filename:string;
var Cancopy:boolean):boolean;
end;
{Dummy class to provide a instance of the dummyFileExit method required for the
overloaded version of CopyFolder}
var dummyclass:TDummyclass;
function Tdummyclass.dummyfileexit(inpath,outpath,filename:string;
var Cancopy:boolean):boolean;
begin {code doesntl matter since it will never be called}
result:=true;
end;
{*********** CopyFolder ***********}
function copyfolder(fromfolderIn, tofolderIn,mask:string; dupfileopts:integer;
copysubfolders, ResetReadOnly:boolean;
FileExit:TCopyFolderExit):boolean; overload;
{Copy files in "fromfolder" to "tofolder", creating tofolder if necessary.
If file exists in "tofolder" then action depends on value of "sync" parameter.
If "sync" is false, always copy, replacing existing file if necessary, if
"sync" is true, copy file if it does not exist in "tofolder" or it exists
in "tofolder" with an older date. }
var
f:TSearchrec;
r:integer;
mr:integer;
fromname,toname:string;
fromfolder,tofolder:string;
fromdate,todate:TDatetime;
//cancopy:boolean;
{----------- CopyAFile ----------}
procedure copyafile(FailExists:boolean);
var cancopy:boolean;
begin
cancopy:=true;
{This is just a substitute for "nil" testing for a
normal function (not a methof type function}
if @fileExit<>@tdummyclass.dummyfileexit {nil}
then result:=fileExit(fromfolder,tofolder,f.name,cancopy);
if cancopy then
begin
copyfile(pchar(fromname),pchar(toname),FailExists);
if resetreadonly and ((f.attr and faReadOnly)<>0)
then filesetattr(toname, f.attr and (not FAReadonly));
end;
end;
begin
result:=TRUE; {default}
fromfolder:=includeTrailingBackslash(fromfolderIn);
tofolder:=includeTrailingBackslash(tofolderIn);
if not directoryexists(tofolder)
then
if not createdir(tofolder) then
begin
raise Exception.Create('Cannot create '+tofolder);
result:=false;
end;
if result then
begin
r:= FindFirst(fromfolder+'*.*', FaAnyFile, F);
while (r=0) and result do
begin
If (length(f.name)>0) and (Uppercase(F.name)<>'RECYCLED')
and (F.name[1]<>'.') and (F.Attr and FAVolumeId=0)
then
begin
if ((F.Attr and FADirectory) >0) {get files from the next lower level}
then
begin
if copysubfolders
then result:=Copyfolder(fromfolder+F.Name+'\',
tofolder+f.name+'\', mask,
dupfileopts, copysubfolders, resetreadonly,FileExit)
end
else
try
if matchesmask(f.name,mask) then
begin
fromname:=fromfolder+f.name;
toname:=tofolder+f.name;
if fileexists(toname) then
begin
todate:=filedatetodatetime(fileage(toname));
fromdate:=filedatetodatetime(f.time);
case
dupfileopts of
1:{replace}
copyafile(false); {(pchar(fromname),pchar(toname),true); }
2:{replace if newer}
begin
if todate>fromdate then copyafile(false){(pchar(fromname),pchar(toname),true)}
end;
3: {ask}
begin
mr:= messagedlg('Replace '+toname +' created '
+formatdatetime(shortdateformat +' '+shorttimeformat,todate)
+#13+ 'with '+fromname+' created '
+FORMATDATETIME(SHORTDATEFORMAT +' '+SHORTTIMEFORMAT,FROMDATE),
mtconfirmation, [mbyes,mbno,mbcancel],0);
if mr=mryes then copyafile(false) {(pchar(fromname),pchar(toname),true) }
else if mr= mrcancel then result:=false;
end;
end; {case}
end {fileexists}
else copyafile(false);
end;{matchesmask}
except
showmessage('Invalid mask "'+mask+'" entered, see documentation');
result:=false;
end; {try}
end;
r:=Findnext(F);
end;
FindClose(f);
end;
end;
{************** CopyFolder (w/o Callback ***********8}
function copyfolder(fromfolderIn, tofolderIn,mask:string; dupfileopts:integer;
copysubfolders, ResetReadOnly:boolean):boolean; overload;
{Copyfolder version w/o callback call to fileExit, call a "do nothing" version}
begin
result := copyfolder(fromfolderIn, tofolderIn,mask,dupfileopts,
copysubfolders, ResetReadOnly, dummyclass.DummyFileExit);
end;
//initialization
// dummyclass:=TDummyClass.create;
end.
program yüklendikten sonra registry de oluşturduğu anahtar:

Denetim Masası->program Ekle/Kaldır da ikonu görünür--->"Perosnel Takip":

----->Uninstall projesi
Uninstall programı....
unit Uninstall0001;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, ADODB,Shellapi,Registry, DdeMan,StrUtils;
type
TfrmUnsetup = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
DdeClientConv1: TDdeClientConv;
Label1: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmUnsetup: TfrmUnsetup;
implementation
{$R *.dfm}
//programın yüklü olduğu dizini sil
//Uses Shellapi;
function dizinsil(FilesOrDir: string): boolean;
var
F: TSHFileOpStruct;
From: string;
Resultval: integer;
begin
FillChar(F, SizeOf(F), #0);
From := FilesOrDir + #0;
Screen.Cursor := crHourGlass;
try
F.wnd := 0;
F.wFunc := FO_DELETE;
F.pFrom := PChar(From);
F.pTo := nil;
F.fFlags := FOF_ALLOWUNDO or
FOF_NOCONFIRMATION or
FOF_SIMPLEPROGRESS or
FOF_FILESONLY;
F.fAnyOperationsAborted := False;
F.hNameMappings := nil;
Resultval := ShFileOperation(F);
Result := (ResultVal = 0);
finally
Screen.Cursor := crDefault;
end;
end;
//unistall program exe sini sil
procedure DeleteEXE;
function GetTmpDir: string;
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempPath(MAX_PATH, pc);
Result := string(pc);
StrDispose(pc);
end;
function GetTmpFileName(ext: string): string;
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempFileName(PChar(GetTmpDir), 'uis', 0, pc);
Result := string(pc);
Result := ChangeFileExt(Result, ext);
StrDispose(pc);
end;
var
batchfile: TStringList;
batchname: string;
begin
batchname := GetTmpFileName('.bat');
FileSetAttr(ParamStr(0), 0);
batchfile := TStringList.Create;
with batchfile do
begin
try
Add(':Label1');
Add('del "' + ParamStr(0) + '"');
Add('if Exist "' + ParamStr(0) + '" goto Label1');
Add('rmdir "' + ExtractFilePath(ParamStr(0)) + '"');
Add('del ' + batchname);
SaveToFile(batchname);
ChDir(GetTmpDir);
Application.MessageBox('Program Kaldırıldı....','Uninstalling program.',MB_OK);
WinExec(PChar(batchname), SW_HIDE);
finally
batchfile.Free;
end;
Halt;
end;
end;
procedure TfrmUnsetup.BitBtn1Click(Sender: TObject);
var
Reg: TRegistry;
grup,str:string;
strGroup : string;
strExeName : string;
strExeFile : string;
strMacro : string;
p1:pchar;
ProgTitel:string;
begin
if Application.MessageBox('Programı Kaldırmak İstiyor musunuz....?','UYARI',MB_YESNO)=ID_NO then
exit;
try
//registry de DisplayIcon anahtarından programın adını al
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Personel Takip', false) then
grup:=LeftStr(Reg.ReadString('DisplayIcon'),13);
Reg.CloseKey;
Reg.Free;
//unistal programının registry kaydını sil
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', false) then
Reg.DeleteKey('Personel Takip');
Reg.CloseKey;
Reg.Free;
//başlat->programlar grubunu kaldır
strGroup := grup;
strExeName := 'Personel';
strExeFile := grup+'\Personel.exe';
DdeClientConv1.SetLink('PROGMAN','PROGMAN') ;
strMacro := '[DeleteItem("' + strExeFile + '","' + strExeName + '")]';
DDEClientConv1.ExecuteMacro(PChar(strMacro),False);
if (Assigned(DDEClientConv1)) then
DDEClientConv1.CloseLink;
//programı sil
dizinsil(grup);
//exe kendini silsin
DeleteEXE;
except
Application.MessageBox('Program Kaldırılamadı....','HATA',MB_OK);
end;
end;
procedure TfrmUnsetup.BitBtn2Click(Sender: TObject);
begin
Close;
end;
end.
Program Ekle/Kaldır ile programı kaldırma:
örnek proje burda,kaynak kodları içinde.
Ynt: Setup Programı Gönderen: FetihlerFatihi Tarih: 07 April 2007 15:18:07
Teşekkür ettim.
Dosyaları sunucuya attım
Ynt: Setup Programı Gönderen: dynamo Tarih: 10 April 2007 11:57:05
Teşekkürler,hocam. yanlışlıkla Delphi İpuçları kısmına eklemiştim..
Ynt: Setup Programı Gönderen: FetihlerFatihi Tarih: 10 April 2007 21:13:01
Teşekkürler,hocam. yanlışlıkla Delphi İpuçları kısmına eklemiştim..
Sorfun değil. Mesleklerimizden biri de taşımacılık

Ynt: Setup Programı Gönderen: babahayati Tarih: 11 April 2007 09:25:41
dynamo; kitabı layıkıyla hakedecek arkadaşlarımızdan birisi,,
yine eline sağlık çok yararlı bir kaynak....
parantez içinde bir şey sormak isterdim, kodları ve dosyayı şu an inceleme/çalıştırma şansım yok; proje veri tabanı çalışmalarımızıda exe leştirebiliyormu? malum alislar BDE motoru vs..
Ynt: Delphi İle Setup Programı Yapmak Gönderen: dynamo Tarih: 12 April 2007 09:09:50
Bu tamamen programcının tercihine bağlı.Veritabanının yüklenip yüklenmediği,yüklenmişse alias oluşturma işlemlerini setup'tan yapmamak daha doğru olur diye düşünüyorum.Bu kontrol işlemlerini ben,uygulamanın(yüklediğimiz program,örnek Personel.exe)'nin Giriş formunun(Projede çalıştırılan ilk form) nun OnCreate olayında kontrol edip oluşturuyorum.
sql server için anlatayım.frmGiris->OnCreate' te ,önce servis çalışıyor mu kontrol ediyorum,servis çalışıyorsa database dosyası register edilmiş mi,edilmemişse kullanıcıya bırakmadan kod ile register ediyorum.
fakat uninstall programında paradox için alias varsa kaldırsın,sql server için database varsa detach etsin şeklinde kodu try-except içinde yazılabilir.
Ynt: Delphi İle Setup Programı Yapmak Gönderen: ayred_22 Tarih: 01 June 2007 21:17:50
install shieldi nerden yüklüyebilirim.yardımcı olursanız çok sevinirim.bana bugün lazım
Ynt: Delphi İle Setup Programı Yapmak Gönderen: kocaturk Tarih: 01 June 2007 23:27:58
install shieldi nerden yüklüyebilirim.yardımcı olursanız çok sevinirim.bana bugün lazım
Delphi standart sürüm kullanmıyorsan eğer delphi ile birlikte Install Shield Express zaten bedava gelir