#ifndef _RGB #define _RGB #includeint RGB(int r,int g,int b) { return r+256*g+Power(256,2)*b; } #endif
#include <System.hpp>
#include <SysUtils.hpp>
#include <Classes.hpp>
bool __fastcall CopyFile(AnsiString source_file,AnsiString target_file,bool nadpisywac)
{
if (FileExists(target_file))
if (nadpisywac)
DeleteFile(target_file);
else
return false;
TStream* Source=new TFileStream(source_file,fmOpenRead);
try
{
TStream* Target=new TFileStream(target_file,fmCreate);
try
{
Target->CopyFrom(Source,Source->Size);
}
__finally
{
delete Target; //usuniecie obiektu strumienia (plik zostaje)
}
}
__finally
{
delete Source; //usuniecie obiektu strumienia (plik zostaje)
}
return true;
}
//struktura uproszczona wzgledem TSearchRec
struct opis_pliku
{
AnsiString nazwa_pliku;
bool czy_katalog;
int poziom;
};
//funkcja sluzaca do porownywania przy sortowaniu elementow listy
int __fastcall porownaj_opisy_plikow(void* rekord1,void* rekord2)
{
return ((opis_pliku*)rekord1)->poziom-((opis_pliku*)rekord2)->poziom;
}
//---------------------------------------------------------------------------
void pliki_w_katalogu(AnsiString katalog_maska,TList* lista,bool rekurencyjnie)
{
AnsiString katalog=ExtractFileDir(katalog_maska);
//katalog_maska musi miec maske np. *
//zob. example do FindFirst
int Atrybuty=faReadOnly | faHidden | faSysFile | faVolumeID | faDirectory | faArchive | faAnyFile;
TSearchRec sr;
static int poziom=0;
if (FindFirst(katalog_maska,Atrybuty,sr)==0) //zajmuje pamiec
{
do
{
if (sr.Name!="." && sr.Name!="..")
{
opis_pliku* rekord=new opis_pliku;
//musze tworzyc dynamicznie, bo inaczej elementy listy beda zapominane po wyjsciu z biezacego zakresu
rekord->nazwa_pliku=katalog+PathDelim+sr.Name;
rekord->czy_katalog=(sr.Attr & faDirectory)==faDirectory;
rekord->poziom=poziom;
lista->Add(rekord);
if (rekord->czy_katalog && rekurencyjnie)
{
poziom++;
pliki_w_katalogu(rekord->nazwa_pliku+PathDelim+'*',lista,rekurencyjnie);
poziom--;
}
}
}
while (FindNext(sr)==0);
FindClose(sr); //zwalnia pamiec
}
}
//sprawdzenie czy podana sciezka to katalog
bool IsDirectory(AnsiString katalog)
{
bool wynik=false;
int Atrybuty=faReadOnly | faHidden | faSysFile | faVolumeID | faDirectory | faArchive | faAnyFile;
TSearchRec sr;
if (FindFirst(katalog,Atrybuty,sr)==0)
{
wynik= ((sr.Attr & faDirectory)==faDirectory);
}
FindClose(sr); //zwalnia pamiec
return wynik;
}
#include <stdio.h>
#include <fcntl.h>
void __fastcall ProgramExecute(AnsiString ansi_path,AnsiString ansi_arg1,AnsiString ansi_arg2)
{
const bool silence=true;
if (!silence) ShowMessage((AnsiString)"Proces nadrzedny PID="+getpid());
int arg_no=2;
if (ansi_arg2.IsEmpty() || ansi_arg2==NULL) arg_no=1;
if (ansi_arg1.IsEmpty() || ansi_arg1==NULL) arg_no=0;
char* path=ansi_path.c_str();
char* arg0="";
char* arg1=ansi_arg1.c_str();
char* arg2=ansi_arg2.c_str();
int open_max;
pid_t pid=fork();
//if (pid==0) execlp("xterm","-n XCommander-XTerm",NULL,NULL);return;
//if (pid==0) execlp("XEdit","","-v","FindAllFiles.~cpp",NULL);return;
switch(pid)
{
case -1:
//Wykonywane w procesie nadrzednym, proces potomny nie powstaje
if (!silence) ShowMessage("Can't create child process!"); break;
case 0:
//Wykonywane w procesie potomnym jezeli fork sie uda
if (!silence) ShowMessage((AnsiString)"Proces potomny PID="+getpid());
//Zamykanie otwartych plikow w procesie potomnym (i tak zostanie zastapiony)
open_max=sysconf(_SC_OPEN_MAX);
for(int i=(int)stderr+1;i<open_max;i++) fcntl(i,F_SETFD,FD_CLOEXEC);
switch(arg_no)
{
case 0: execlp(path,NULL); break;
case 1: execlp(path,arg0,arg1,NULL); break;
case 2: execlp(path,arg0,arg1,arg2,NULL); break;
}
break;
default:
//Wykonywane w procesie nadrzednym
if (!silence) ShowMessage((AnsiString)"Proces nadrzedny stworzyl proces PID="+pid);
}
}
Aby uruchomić program napisany w Kylix 3 w dowolnym środowisku XWin w systemie Linux należy udostępnić programowi następujący zbiór bibliotek ładowanych dynamicznie:
libborqt-6.9.0-qt2.3.so
libqtintf-6.9.0-qt2.3.so
libqt.so.2.3.0
libborqt-6.9-qt2.3.so -> libborqt-6.9.0-qt2.3.so
libqtintf-6.9-qt2.3.so -> libqtintf-6.9.0-qt2.3.so
libqt.so.2 -> libqt.so.2.3.0
#!/bin/bash declare -x LD_LIBRARY_PATH=/usr/local/kylix3/bin:$LD_LIBRARY_PATH XCommander &Gdy chcemy wykorzystać środowisko tcsh skrypt wyglądałby następująco:
#!/bin/tcsh setenv LD_LIBRARY_PATH /usr/local/kylix3/bin XCommanderZmienną można również ustawić na stałe (w pliku konfigurującym środowisko) i wówczas programy mogą być wywoływane bezpośrednio.
Problemy z instalcją Kylix 3 Open Edition pod RedHat 8 i RedHat 9
W RedHat 8 i 9 po instalcji Kylix 3 należy w ścieżce przeszukiwania projektów C++ ustawić katalog /bin/include na pierwszym miejscu. W tym celu należy:
1) uruchomić Kylix 3 dla C++,
2) z menu Project, Options... wybrać polecenie Project Options for Default
3) przejść do zakładki Directories/Conditionals,
4) w polu Include path należy przesunąć katalog /usr/include na pierwszą pozycję
W RedHat 9: jeżeli pojawia się błąd "unresolved external" należy zainstalować compact-glibc-6.2-2.1.43 z RedHat 7