[ bventil @ 17.11.2006. 01:18 ] @
Zdravo!
Imama problem.
Koristim baze u BCB-u. Sve se nalaze u maticnom direktoriju programa. Kada exe verziju programa odnesem na neki drugi comp, i snimim u dir drugog naziva, program naravno ne radi, jer se sve nalazi na drugim putanjama. Kako se to resava?



[Ovu poruku je menjao bventil dana 17.11.2006. u 02:44 GMT+1]
[ X Files @ 17.11.2006. 06:42 ] @
Citat:

Koristim baze u BCB-u.

Koristiš li ADO ili BDE za pristup bazama?
Koju bazu koristiš?

Citat:

Kada exe verziju programa odnesem na neki drugi comp, i snimim u dir drugog naziva,
program naravno ne radi, jer se sve nalazi na drugim putanjama. Kako se to resava?

Svaki EXE traži još nekoliko DLL i BPL fajlova koje moraš imati na odredišnom računaru
da bi sve to proradilo. AKo koristiš BDE, treba cela instalacija BDE-a.

Postoje programi koji mogu da vide koji ti DLL i BPL fajlovi nedostaju:
Dependency Walker

Postoje programi za pravljenje instalacija (klasične instalacije koje si video 100 puta),
koji kulturno postavljaju nedostajuće datoteke, ali ti moraš reći šta ti treba.

Postoji i način da tvoj BCB EXE bude nešto veći, ai da ima sve DLL i BPL fajlove već
uključene u EXE:

SKINI: Project/Options/Linker/Use Dunamic RTL
SKINI: Project/Options/Packages/Build with runtime packages

Ali ako koristiš BDE, onda će ti bez obzira trebati zasebna instalacija BDE.
[ bventil @ 17.11.2006. 18:19 ] @
Hvala na odgovoru, mislio sam da imam samo 1 problem, a ocigledno ih imam malo vise :)
Ali, mene interesuje i sledece. Ako u programu koristim neku sliku, ili bilo koji drugi fajl, moram da upisem putanju do tog fajla, cak i ako se on nalazi u istom dir gde i program.
Ako program premestim na drugu putanju, na drugom compu, on nece moci da nadje taj fajl(sliku). Sta onda upisati umesto"c:\\....\\" za putanju do neke slike ili fajla?

A sto se tice baza, koristim BDE, i tek sad shvatam u koji sam shit uleteo. Hoce li znaci Express za BCB biti dovoljan da resi problem koji si naveo(tu da mu navedem da ukljuci i BDE)?
[ X Files @ 17.11.2006. 20:37 ] @
Citat:

Ako u programu koristim neku sliku, ili bilo koji drugi fajl, moram da upisem putanju do tog fajla,
cak i ako se on nalazi u istom dir gde i program.
Ako program premestim na drugu putanju, na drugom compu, on nece moci da nadje taj fajl(sliku).
Sta onda upisati umesto"c:\\....\\" za putanju do neke slike ili fajla?

Ako se fajl nalazi u folderu gde i exe, onda mozes da kazes nesto ovako:

Code:

Image1->Picture->LoadFromFile( ExtractFilePath( ParamStr(0) ) + "slika.jpg" );

ili:

Image1->Picture->LoadFromFile( ExtractFilePath( Application->ExeName ) + "slika.jpg" );

Dakle, tachna putanja se odredjuje dinamicki.

Citat:

A sto se tice baza, koristim BDE, i tek sad shvatam u koji sam shit uleteo.

Mani se BDE. Koristi ADO (samo me nemoj odmah pitati kako, jer cu momentalno da izgubim svu energiju :).

Citat:

Hoce li znaci Express za BCB biti dovoljan da resi problem koji si naveo(tu da mu navedem da ukljuci i BDE)?

Mislim da nece moci. Koliko se secam, lepo je pisalo da taj BDE treba samo chekirati, ali to je greska
u Help fajlu, ili drugim recima "Što je babi milo, to joj se i snilo".

Neko je nekad napravio poprilicno dobru instalaciju za BDE-a, i to kao fajl: bdeinfosetup.exe
Skini ga na primer ovde: http://www.href.com/pub/sw/index.htm

Ako hoces da se bakces sa instalacionim procedurama, pa da taj BDE bude u sklopu instalacije programa
a ne kao zasebna, pogledaj:

Inno Setup
http://www.jrsoftware.org/isinfo.php

... imaju resenje za sve. Imas i prevod za srpski jezik.

Uh...

[ bventil @ 17.11.2006. 23:56 ] @

Hvala ti puno!
Necu te vise daviti. Dovoljno je i ovo sto si mi pomogao.
Za ADO, cu naci vec nesto. Imam "Borland-C++-Builder-5-Developer's-Guide" i mislim da i tamo ima dosta oko toga.
Once again, Thanks!
[ X Files @ 18.11.2006. 08:06 ] @
Fora je u tome da prestanes da koroistis nekek komponente, a u zamenu uzmes druge:

TDatabase ->TADOCOnnection
TTable ->TADOTable
TQuery ->TADOQuery

itd...

Vizuelne komnponente ostaju iste: TDBGrid, TDBEdit, TDBNavigator, TDBCheckBox, ...

Takodje, komponennte za vezu ostaju iste: TDataSource, ...
[ DjoleReject @ 26.11.2006. 15:57 ] @
Nema veze sa Borlandom, ali ima sa naslovom, pa ako nemate nista protiv, pitao bih i ja nesto:

Kada kazes ofstream(ime_fajla), napravis fajl u istom folderu u kome je i exe.
Kako izvesti da taj fajl napravis u jednom folderu ispod? Znaci, ja imam u folderu u kome je exe drugi folder (npr. fajlovi) i zelim da se svi fajlovi prave bas tamo. A ne zelim da unapred znam gde je korisniku exe.
Moja naivna ideja je bila da ispred imena fajla (koje je char*, a ne string) dodam slova koja cine ime foldera i znak '\'. Ovo nije radilo, naravno. Zna li neko kako bi radilo?
[ X Files @ 26.11.2006. 19:48 ] @
Savet je da u praksi (sem za domaće zadatke) nikad ne polaziš
od pretpostavke da će fajl upisan bez cele putanje biti kreiran tamo
gde je EXE. Da ne ulazim sada u detalje...

Za početak, uvek možeš da znaš gde je tvoj EXE:

--- BCB ---
ParamStr( 0 );
Application->ExeName;

--- CPP ---
argv[0];

--- API ---
TCHAR buffer[ MAX_PATH+1 ] = {0};
::GetModuleFileName( NULL, buffer, MAX_PATH );
// buffer sadrži celu putanju+exe

Dalje, shodno biblioteci koju koristiš, treba da odvojiš EXE deo od Putanje,
i da na Putanju dodaš donju crtu plus fajl sa ekstenzijom:

Pogledaj na prime ovde:
http://forums.devx.com/archive/index.php/t-86043.html
[ DjoleReject @ 26.11.2006. 20:21 ] @
Ne, ono sto oni tamo rade ne pomaze. Meni treba da ne znam gde je covek kome dajem program smestio isti. Samo mi je zgodnije da se undo fajlovi prave u posebnom folderu (koji bi bio u folderu gde je exe i dll-ovi). Nije da je smak sveta ako ostane i ovako...
Inace, ako ti nije smaranje, mozes li mi objasniti to da nema sigurice kad samo kazes ime fajla? Ja na primer imam Klasu FileManager koja na svaki potez u editoru nivoa upisuje stanje u novi fajl. Oni se zovu "undo01.txt", "undo02.txt" i tako dalje... Ono sto bih zeleo je da budu stekovani u podfolderu "fajlovi", samo zbog preglednosti.
Sto se tice tvoje pomoci -
- ne radim sa Borlandom, pa prvi primer nije za mene.
- ne kontam sta si zeleo reci sa argv[0]. Da li da pre dizanja programa posaljem argument main-u. Kako bih i tada znao gde je on?
- Pokusacu sa API-jem, a tebi svakako hvala!
[ X Files @ 27.11.2006. 11:32 ] @
Citat:

Meni treba da ne znam gde je covek kome dajem program smestio isti.

Naravno. To je stvar izbora korisnika. Ti samo hoćeš da UNDO fajlove smeštaš u:
X:\TAMO_GDE_JE_KORISNIK_ODABRAO\UNDOFOLDER\undo01.txt
Odavde se vidi da je korisnik odabrao da mu EXE bude u TAMO_GDE_JE_KORISNIK_ODABRAO,
a ti si definisao folder UNDOFOLDER u koji ćeš stavljati undo fajlove.

Citat:

Samo mi je zgodnije da se undo fajlovi prave u posebnom folderu

O tome i govori gornji slučaj.

Citat:

Inace, ako ti nije smaranje, mozes li mi objasniti to da nema sigurice kad samo kazes ime fajla?

Postoji API: GetCurrentDirectory() koji govori gde je trenutni folder u koji se vrši snimanje.
Taj folder se može podesiti sa: SetCurrentDirectory().

Po defaultu, radni folder je tamo gde je EXE, ali ne mora da znači. Na primer, ako program
pokrećeš preko prečice (ikone) koju si napravio, a nisi podesio Working Folder, može se
dogoditi da ti radni folder više nije gde je EXE, nego negde sasvim drugde.

Takođe, mnogi Save/Open/Print/Browse dijalozi znaju da "razdese" radni folder, pa ti sve
lepo radi do prvog sledećeg Save As koji si uradio van radnog foldera.

Citat:

- ne kontam sta si zeleo reci sa argv[0].

int main( int argc, char*argv[] )
{
printf ( "%s", argv[0] );
return 0;
}
... ce ti dati putnju+exe gde program instaliran (pokrenut), dakle, na primer:
c:\Program Files\Di recnik\di.exe

To znači, da je argv[0] automatski "napunjen" sa celom putanjom, što ti je
polazni podatak da dalje ručno formiraš odgocarajuću UNDO folder.

U konkretnom slučaju, treba:

1) iz putanje
c:\Program Files\Di recnik\di.exe
... skloniti EXE deo, tako da ostane:
c:\Program Files\Di recnik\

2) dodati UNDO FOLDER:
c:\Program Files\Di recnik\MOJ_UNDO_FOLDER\

3) dodati UNDO fajl
c:\Program Files\Di recnik\MOJ_UNDO_FOLDER\Undo1.txt

4) proslediti ovu CELU putanju sa fajlom u ofstream, ili gde već prosledjuješ.


Citat:

- Pokusacu sa API-jem, a tebi svakako hvala!

API koji samti dao, radi istu stvar kao i argv[0], dajke, u nizu "buffer" čuva
celu putanju sa exe-om.

Kako ćeš da skloniš naziv fajla i dodaš svoj UNDO folder i dodaš UNDO fajl, to
je već tvoj problem. Ili ćeš ručno ili uz pomoć neke biblioteke (funkcije) koja
to radi za tebe.
[ X Files @ 27.11.2006. 13:40 ] @
Evo ti jedan primer kako da odrediš UNDO folder i UNDO fajl.
(generalno, bolje je koristiti gotove biblioteke i/ili klase za sve
vezano za fajlove, ali ovo tek da shvatis sta ti govorim)

Code:
   
// ovo je buffer gde cemo:
// 1. smestiti folder + fajl gde je EXE pokrenut: c:\Program Files\Di recnik\di.exe
// 2. kasnije napraviti UNDO folder + UNDO fajl: c:\Program Files\Di recnik\UNDO\Undo1.txt
char buffer[ MAX_PATH+1 ] = {0};

// za pocetak uzmi celu putanju+fajl gde je pokrenut program
::GetModuleFileName( NULL, buffer, MAX_PATH );

// test: c:\Program Files\Di recnik\di.exe
ShowMessage( buffer );

// ukloni naziv fajla iz putanje
int i = strlen ( buffer ) - 1;
while ( buffer[ i ] != '\\' )
   buffer[i--] = '\0';

// test: c:\Program Files\Di recnik\
ShowMessage( buffer );

// dodaj UNDO 
strcat( buffer, "UNDO\\" );

// test: c:\Program Files\Di recnik\UNDO
ShowMessage( buffer );

// dodaj Undo1.txt
strcat( buffer, "Undo1.txt" );

// test: c:\Program Files\Di recnik\UNDO\Undo1.txt
ShowMessage( buffer );
[ DjoleReject @ 27.11.2006. 14:56 ] @
Hvala ti X k`o bratu!!! Ne da si pomogao, nego si ultra-pomogao!

Ja bih umro, a ne bih znao da putanja dolazi u main po defaultu. Inace, ne mogu da koristim bas dijaloge kako ja hocu, jer ne otvaram prozor, nego je sve u HGE-u (engine za 2d igre). Jedino sto sada moram je ponovo listanje knjiga o WinAPI-ju, a to i ne volem bas previse :( Sta da se radi, nekako mi se uvek desi da zaglavim radeci stvari koje me smaraju...

Hvala jos jednom!
[ DjoleReject @ 27.11.2006. 14:59 ] @
Nego kad vec smaram... Ovo sa stringovima je najelegantnije moguce, ali fstream mi kaze da ne moze konvertovati string u char* (koji je valjda obavezan). Koja je po tvom misljenju najbolja stvar za ovu konverziju?
[ X Files @ 27.11.2006. 15:36 ] @
Ne znam na sta mislis, ali dovoljno je da na kraju koda koga sam ti dao
stavis:
Code:

// onaj kod odozgo
// ...
ofstream outfile ( buffer );
// ...
outfile.close();
// ...

[ pcaca @ 28.11.2006. 19:38 ] @
Citat:
DjoleReject: Nego kad vec smaram... Ovo sa stringovima je najelegantnije moguce, ali fstream mi kaze da ne moze konvertovati string u char* (koji je valjda obavezan). Koja je po tvom misljenju najbolja stvar za ovu konverziju?

Verovatno ti treba c_str() member klase string. Ova funkcija vraca C-style string (char*).
Code:
string path; //putanja do file
ofstream undofile(path.c_str());
[ DjoleReject @ 29.11.2006. 10:49 ] @
Momci - puno hvala!

Ja sam potpuno shokiran cinjenicom da mi ni jedan od profana nikada nije pomenuo argv[], a bar dve godine sam proveo cukajuci konzolne programe (i vrlo cesto koristeci i ove argumente za main). Hocu reci da ako ne znam ovo u Winu, to je moj propust, ali za argv[] su me iznervirali :)))

X Files - sori za cimanje...
[ DjoleReject @ 06.03.2007. 15:02 ] @
U ovoj temi sam poprilicno otvorio oci po nekim pitajnima, ali sada moram da je "dignem iz mrtvih"...
Naime, savet koji je X dao me je naterao da u svim projektima koristim ovakav pristup trazenju fajlova. Sve funkcionise odlicno, ali se pojavio problem u trenutku prelaska sa VS 2003 na VS 2005. 2005-ica prijavljuje gresku u delu koda ::GetModuleFileName( NULL, buffer, MAX_PATH );

Fora je sto ja ni kad sam prvi put dobio ovaj komad koda nisam bas najbolje razumeo kako on radi, ali sada sam u corsokaku zbog toga sto ne znam kako da ga promenim. Bio bih zahvalan na nekom resenju... Takodje, bilo bi veoma dobrodoslo i da neko teorijski "potkuje" neznalicu poput mene i objasni zasto je do problema uopste doslo (kao i sta ustvari znaci kad napises :: na pocetku reda - da li je to poziv win funkcija, lici na nekakvo pozivanje static funkcija...???).

Hvala unapred.
[ X Files @ 06.03.2007. 15:51 ] @
Citat:

2005-ica prijavljuje gresku u delu koda ::GetModuleFileName( NULL, buffer, MAX_PATH );

Šta se prijavljuje kao greška?
Citat:

[...] i sta ustvari znaci kad napises :: na pocetku reda - da li je to poziv win funkcija,
lici na nekakvo pozivanje static funkcija...???).

Te dve tačke imaju smisla kod BCB programa da se naglasi da se radi o API pozivu, a ne o nekoj
lokalno definisanoj funkciji, kakvih je BCB prepun. Možeš da eliminišeš.

Pošto pominješ VS, predlažem da usvojiš njihove konvencije za tipove i makro definicije. Probaj kod
da modifikuješ na sledeći način:
Code:

TCHAR buffer[ _MAX_PATH+1 ] ; 
GetModuleFileName( NULL , buffer , sizeof( buffer ) ) ;

... a ako koristiš "double-byte" karaktere:
Code:

GetModuleFileName( NULL , buffer , sizeof( buffer ) / sizeof( TCHAR ) ) ;


Mada je najbolje da nađeš neku gotovu klasu za manipulisanje nazivima fajlova, foldera, putanja i sl.

[ DjoleReject @ 11.03.2007. 22:07 ] @
Hvala puno, X.
Inace, kako se koriste te "gotove klase"? kao dll ili inkludujes heder? Ima li neko, kojim slucajem link ka necemu takvom (a da je provereno - inace bih nesto i sam izguglao, treba mi da znam iz prve ruke da radi).