|
[ mr.zhile @ 25.10.2008. 16:01 ] @
| Imam fromu i na njoj nekoliko DBEdit-a svaki od DBEdita ima svoj dogadjaj OnExit na formi se nalaze i dva Button-a kojim se potvrdjuju izmene(odnosno odustaje od rada OK,CANCEL)...Moj problem je u tome sto kada se fokus nalazi u nekom od DBEdit-a i klikne se na bilo koje dugme prolazi se kroz svaki DbEdiit?
Od jednog lika sam saznao da se to moze resiti sa DISPATCH controlom,kako sam ga razumeo fora je napraviti objekat koji ce u sklopu dogadjaja OnExit ispitati dal je se preslo u sledeci Edit ili je kliktnuto na neki od button-a,a kako to radi ja pojma nemam ,a on je prezauzet da bi mi objasnjavao?
Ako moze neko objasnjenjeili pomoc mnogo cu vam bti zahvalan
[Ovu poruku je menjao mr.zhile dana 25.10.2008. u 18:53 GMT+1] |
[ mr.zhile @ 25.10.2008. 17:52 ] @
AUUUUUUUUUU pa zar je toliko teska tema da niko ne odgovara?????!!!!!!!
Ljudi svaka informacija mi je dobro dosla,jer appsolutno ne znam kako da resim problem???
HVALA unaprede na bilo kom odgovoru!
[ savkic @ 25.10.2008. 18:15 ] @
> Moj problem je u tome sto kada se fokus nalazi u nekom od DBEdit-a i klikne se na bilo koje dugme prolazi se kroz svaki DbEdiit?
Razjasni.
> Od jednog lika sam saznao da se to moze resiti sa DISPATCH controlom, kako sam ga razumeo fora je napraviti objekat koji ce u sklopu
> dogadjaja OnExit ispitati dal je se preslo u sledeci Edit ili je kliktnuto na neki od button-a,a kako to radi ja pojma nemam
Konfuzno napisano, počni od početka i lepo kaži koji su problemi i šta želiš da postigneš.
[ mr.zhile @ 25.10.2008. 18:49 ] @
Evo da razjasnim postavicu kompletan kod Unitaa date forme pa mislim da ce biti jasnje sta hocu
Code:
unit UPrikazIzmenaClanova;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Mask, DBCtrls, Buttons, DBXpress, FMTBcd,
SqlExpr, DB, DBClient, SimpleDS;
type
TfrmPrikazIzmenaClanova = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
DBEdit6: TDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
DBText1: TDBText;
DBMemo1: TDBMemo;
Label7: TLabel;
DataSource1: TDataSource;
SimpleDataSet1: TSimpleDataSet;
procedure BitBtn1Click(Sender: TObject);
procedure DBEdit2Exit(Sender: TObject);
procedure DBEdit3Exit(Sender: TObject);
procedure DBEdit4Exit(Sender: TObject);
procedure DBEdit5Exit(Sender: TObject);
procedure DBEdit6Exit(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FID:integer;
FPisanje:boolean;
procedure DozvolaPisanja;
procedure PostojiBrLK;
public
function PraznoPolje(Text:String):boolean;
procedure OtvoriSifru(Id:integer;Pisanje:boolean);
function OtvorenRekord(BrRekorda:Integer):boolean;
end;
var
frmPrikazIzmenaClanova: TfrmPrikazIzmenaClanova;
implementation
uses UdmBiblioteka, global, ULogIn;
{$R *.dfm}
var
TD:TTransactionDesc;
procedure TfrmPrikazIzmenaClanova.BitBtn1Click(Sender: TObject);
begin
SimpleDataSet1.Close;
Close;
end;
procedure TfrmPrikazIzmenaClanova.DozvolaPisanja;
var
i:integer;
begin
for i:=0 to ComponentCount-1 do
begin
if Components[i] is TDBEdit then
(Components[I] as TDBEdit).ReadOnly:=not FPisanje;
end;
end;
procedure TfrmPrikazIzmenaClanova.OtvoriSifru(Id: integer;
Pisanje: boolean);
var
SQL:String;
begin
FID := id;
FPisanje := Pisanje;
td.TransactionID := 5;
td.IsolationLevel := xilREADCOMMITTED;
sql := 'select * from Clan where id = '+ IntToStr(FID);
SimpleDataSet1.Close;
SimpleDataSet1.DataSet.CommandText:=SQL;
dmBiblioteka.SQLConn.StartTransaction(TD);
SimpleDataSet1.Open;
dmBiblioteka.SQLConn.Commit(TD);
if FID=-1 then
begin
dmBiblioteka.spID_Clanovi.ExecProc;
SimpleDataSet1.Append;
SimpleDataSet1.FieldByName('ID').AsInteger:=dmBiblioteka.spID_Clanovi.Params[0].AsInteger;
end
else
begin
SimpleDataSet1.Edit;
end;
DozvolaPisanja;
end;
function TfrmPrikazIzmenaClanova.PraznoPolje(Text: String): boolean;
begin
if text=''then
Result:=true
else
Result:=false;
end;
procedure TfrmPrikazIzmenaClanova.DBEdit2Exit(Sender: TObject);
begin
if PraznoPolje(DBEdit2.Text) then
begin
ShowMessage('Polje ' + DBEdit2.DataField + 'ne moze biti prazno');
DBEdit2.SetFocus;
end
else
begin
PostojiBrLK;
end;
end;
procedure TfrmPrikazIzmenaClanova.DBEdit3Exit(Sender: TObject);
begin
if PraznoPolje(DBEdit3.Text) then
begin
ShowMessage('Polje ' + DBEdit3.DataField + 'ne moze biti prazno');
DBEdit3.SetFocus;
end
else
begin
DBEdit4.SetFocus;
end;
end;
procedure TfrmPrikazIzmenaClanova.DBEdit4Exit(Sender: TObject);
begin
if PraznoPolje(DBEdit4.Text) then
begin
ShowMessage('Polje ' + DBEdit4.DataField + 'ne moze biti prazno');
DBEdit4.SetFocus;
end
else
begin
DBEdit5.SetFocus;
end;
end;
procedure TfrmPrikazIzmenaClanova.DBEdit5Exit(Sender: TObject);
begin
if PraznoPolje(DBEdit5.Text) then
begin
ShowMessage('Polje ' + DBEdit5.DataField + 'ne moze biti prazno');
DBEdit5.SetFocus;
end
else
begin
DBEdit6.SetFocus;
end;
end;
procedure TfrmPrikazIzmenaClanova.DBEdit6Exit(Sender: TObject);
begin
if PraznoPolje(DBEdit6.Text) then
begin
ShowMessage('Polje ' + DBEdit2.DataField + 'ne moze biti prazno');
DBEdit6.SetFocus;
end
else
begin
BitBtn2.SetFocus;
end;
end;
procedure TfrmPrikazIzmenaClanova.PostojiBrLK;
var
SQL,broj:String;
begin
broj:=DBEdit2.Text;
sql:='select * from Clan where BR_LICNE_KARTE = ' + QuotedStr(broj);
SimpleDataSet1.Close;
SimpleDataSet1.DataSet.CommandText:=SQL;
dmBiblioteka.SQLConn.StartTransaction(TD);
SimpleDataSet1.Open;
dmBiblioteka. SQLConn.Commit(TD);
if SimpleDataSet1.RecordCount=0 then
begin
SimpleDataSet1.Append;
SimpleDataSet1.FieldByName('id').AsInteger:=dmBiblioteka.spID_Clanovi.Params[0].AsInteger;
SimpleDataSet1.FieldByName('BR_LICNE_KARTE').AsString:=broj;
end;
DBEdit3.SetFocus;
end;
procedure TfrmPrikazIzmenaClanova.BitBtn2Click(Sender: TObject);
begin
if SimpleDataSet1.State in [dsInsert,dsEdit] then
begin
SimpleDataSet1.Post;
dmBiblioteka.SQLConn.StartTransaction(TD);
try
if SimpleDataSet1.ApplyUpdates(0)=0 then
begin
dmBiblioteka.SQLConn.Commit(TD);
SimpleDataSet1.Refresh;
Close;
end
else
begin
UpisULog('Neuspesan pokusaj izmene podataka u bazi' + dmBiblioteka.SQLConn.Params.Values['Database']);
ShowMessage('Neuspesan pokusaj izmene podataka u bazi'#13#10 + dmBiblioteka.SQLConn.Params.Values['Database']);
dmBiblioteka.SQLConn.Rollback(TD);
end
except
dmBiblioteka.SQLConn.Rollback(TD);
end;
end;
end;
function TfrmPrikazIzmenaClanova.OtvorenRekord(BrRekorda: Integer): boolean;
var
i:Integer;
begin
for i := 0 to Screen.CustomFormCount-1 do
if (Screen.CustomForms[i] is TfrmPrikazIzmenaClanova) then
if BrRekorda = (Screen.Forms[i] as TfrmPrikazIzmenaClanova).FID then
begin
Result := True;
Break
end
else
Result := False
else
Result:=False
end;
procedure TfrmPrikazIzmenaClanova.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
frmPrikazIzmenaClanova.Free;
end;
end.
//EVO i DMF Forme
Left = 358
Top = 108
Width = 369
Height = 547
ActiveControl = DBEdit2
Caption = 'Prikaz / Izmena Clanova'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 361
Height = 472
Align = alClient
BorderStyle = bsSingle
TabOrder = 0
object Label1: TLabel
Left = 21
Top = 8
Width = 13
Height = 16
Alignment = taCenter
Caption = '&ID'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label2: TLabel
Left = 21
Top = 64
Width = 125
Height = 16
Alignment = taCenter
Caption = '&BROJ LIÈNE KARTE'
FocusControl = DBEdit2
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label3: TLabel
Left = 21
Top = 120
Width = 23
Height = 16
Alignment = taCenter
Caption = '&IME'
FocusControl = DBEdit3
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label4: TLabel
Left = 21
Top = 168
Width = 59
Height = 16
Alignment = taCenter
Caption = '&PREZIME'
FocusControl = DBEdit4
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label5: TLabel
Left = 21
Top = 224
Width = 56
Height = 16
Alignment = taCenter
Caption = '&ADRESA'
FocusControl = DBEdit5
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label6: TLabel
Left = 21
Top = 272
Width = 110
Height = 16
Alignment = taCenter
Caption = '&BROJ TELEFONA'
FocusControl = DBEdit6
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object DBText1: TDBText
Left = 32
Top = 40
Width = 65
Height = 17
Alignment = taCenter
DataField = 'ID'
DataSource = DataSource1
end
object Label7: TLabel
Left = 21
Top = 328
Width = 152
Height = 16
Caption = 'NAPOMENA_OPOMENA'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object DBEdit2: TDBEdit
Left = 20
Top = 85
Width = 121
Height = 21
DataField = 'BR_LICNE_KARTE'
DataSource = DataSource1
TabOrder = 0
OnExit = DBEdit2Exit
end
object DBEdit3: TDBEdit
Left = 20
Top = 138
Width = 121
Height = 21
DataField = 'IME'
DataSource = DataSource1
TabOrder = 1
OnExit = DBEdit3Exit
end
object DBEdit4: TDBEdit
Left = 20
Top = 191
Width = 121
Height = 21
DataField = 'PREZIME'
DataSource = DataSource1
TabOrder = 2
OnExit = DBEdit4Exit
end
object DBEdit5: TDBEdit
Left = 20
Top = 244
Width = 121
Height = 21
DataField = 'ADRESA'
DataSource = DataSource1
TabOrder = 3
OnExit = DBEdit5Exit
end
object DBEdit6: TDBEdit
Left = 21
Top = 297
Width = 121
Height = 21
DataField = 'TELEFON'
DataSource = DataSource1
TabOrder = 4
OnExit = DBEdit6Exit
end
object DBMemo1: TDBMemo
Left = 8
Top = 344
Width = 185
Height = 89
DataField = 'NAPOMENA_OPOMENA'
DataSource = DataSource1
ScrollBars = ssVertical
TabOrder = 5
end
end
object Panel2: TPanel
Left = 0
Top = 472
Width = 361
Height = 41
Align = alBottom
TabOrder = 1
object BitBtn1: TBitBtn
Left = 16
Top = 8
Width = 75
Height = 25
TabOrder = 0
OnClick = BitBtn1Click
Kind = bkClose
end
object BitBtn2: TBitBtn
Left = 128
Top = 8
Width = 75
Height = 25
Caption = '&OK'
TabOrder = 1
OnClick = BitBtn2Click
Kind = bkOK
end
end
object DataSource1: TDataSource
DataSet = SimpleDataSet1
Left = 176
Top = 72
end
object SimpleDataSet1: TSimpleDataSet
Aggregates = <>
DataSet.CommandText = 'select * from CLAN'
DataSet.MaxBlobSize = -1
DataSet.Params = <>
Params = <>
Left = 176
Top = 136
end
end
Znaci kad se forma kreira fiokus je na DBEDit2.Posto se u DBEditima nalaze polja baze br_licne karte,ime,prezime,....mora da se vrsi provera jer su neka od njih u bazi kao not null...ali ako se klikne na Cancel ili OK treba odmah da se izvrsi kod koji je vezan za njiih...medjutim kod mene se preskace iz edita u edit pa se to vrsi onoliko puta koliko edita ima,korisnik bi trrebao 5 puta da klikce na Ok,Cancal da bi obavio akcije...
Nadam se da sam malko razjasnio
@savkic
> Od jednog lika sam saznao da se to moze resiti sa DISPATCH controlom, kako sam ga razumeo fora je napraviti objekat koji ce u sklopu
> dogadjaja OnExit ispitati dal je se preslo u sledeci Edit ili je kliktnuto na neki od button-a,a kako to radi ja pojma nemam
Konfuzno napisano, počni od početka i lepo kaži koji su problemi i šta želiš da postigneš
Tebi konfuzno?A zamisli kako je tek meni
Rekao mi lik da se napravi objekat i da mu se prosledi kao dispatch sta je korisnik uradio,tj da li je kliknuo jedno od dugmadi ili je samo prebacio fokus na sledeci Edit?
[ savkic @ 25.10.2008. 19:22 ] @
> Znaci kad se forma kreira fiokus je na DBEDit2.Posto se u DBEditima nalaze polja baze br_licne karte,ime,prezime,....mora da se vrsi provera
> jer su neka od njih u bazi kao not null...ali ako se klikne na Cancel ili OK treba odmah da se izvrsi kod koji je vezan za njiih...medjutim kod
> mene se preskace iz edita u edit pa se to vrsi onoliko puta koliko edita ima,korisnik bi trrebao 5 puta da klikce na Ok,Cancal da bi obavio akcije...
Sam si ga tako programirao, po meni prva greška je kaskadno fokusiranje DBEdit boxova, druga validacija unetog sadržaja preko DBEdit kontrola.
Validacija treba da se radi u TField dataseta, ako sadržaj nije unet ili je pogrešno unet koristi se FocusControl metoda TFielda. Prelazak sa jednog polja na drugo najbolje je realizovati handlovanjem pritiska na Enter i strelice gore i dole, kada se pritisne enter pređe se na sledeću kontrolu i tako redom kao i da je tab pritisnut.
[ mr.zhile @ 25.10.2008. 20:19 ] @
Citat: Prelazak sa jednog polja na drugo najbolje je realizovati handlovanjem pritiska na Enter i strelice gore i dole, kada se pritisne enter pređe se na sledeću kontrolu i tako redom kao i da je tab pritisnut.
Kako hanblovanje da uradim?
Kako da sprecim to pomeraje izemdju DBEdita-a?
AKAko bi bilo dispatdh-ovanje kontrola sto mi je dao predlog onaj lik...?
Jel ima neki primercic da se nadje negde,ja se ubi trazeci nesto kako bi razumeo sta treba da radim?
[ savkic @ 25.10.2008. 23:49 ] @
> Kako hanblovanje da uradim?
http://www.elitesecurity.org/t296741-0#1763928
> Kako da sprecim to pomeraje izemdju DBEdita-a?
Obriši kod koji to radi, svi OnExit handleri su višak.
> AKAko bi bilo dispatdh-ovanje kontrola sto mi je dao predlog onaj lik...?
U tom delu ne mogu pomoći, nejasno je šta to predstavlja, traži dodatna razjašnjenja.
[ mr.zhile @ 26.10.2008. 12:06 ] @
Dispatch-ovanje,koliko sam ga ja razumeo,je da se edit OnExit dogasdjaju prosledi sta je korisnik uradio,da li je kliknuo na jedno od dva dugmeta,ili je prebacio fokus na sledeci edit,ali da se napravi objekat klase TDBEdit i da se za njega 'prikopca'dogadjaj on exit,tim dogadjajem da se ispita i prethodne akcije koje sam napisao u kodu i sta je korisnik uradio..valjda sam malko jasniji...veruj mi da mi glava puca,a namam pojma sta treba da radim...?
[ savkic @ 26.10.2008. 14:24 ] @
To meni ništa ne znači, dao sam ti predlog kako možeš rešiti problem, na tebi je da odlučiš kako ćeš uraditi.
[ mr.zhile @ 26.10.2008. 21:05 ] @
@savkic
Hvala na predlogu..
Znam sta treba,ali ne znam kako treba... 
Neznam kako bi treba da izgleda kod kojim bi se dispatch-ovala kontrola?
Mislim da bi u tom kodu trebalo obraditi neku od Windowsovih poruka...jer sam video da DbEdit ima proceduru dispatch,ali samo kakoooooooooooo?
[ priki @ 26.10.2008. 21:16 ] @
zašto bi obradjivao kontrolu, imaš i drugi metod tj način
pre pritiska na OK dugnme,
uradi proveru svih kontrola,
i ako neka kontrola ne ispunjava uslov, fokusiraj se na nju i
uradi exit iz te procedure, malo brute force-a
najbolje OnBeforePost dataset-a
i tako će korisnik morati uneti sve obavezne kontrole
[ mr.zhile @ 26.10.2008. 22:43 ] @
Kako uraditi proveru svih kontrola,jednom provedurom...?koliko kapiram ta procerura bi trebala da zameni sve OnExit dogadjaje ?
Cini mi se OK,ali mi deluje malo zbunjujuce jel moze nekii primercic?
[ priki @ 27.10.2008. 13:09 ] @
Code:
procedure TDM_Module.tbRadnaMestaBeforePost(DataSet: TDataSet);
begin
if DataSet.FieldByName('acName').asString = '' then begin
MessageDlg('Unos imena obavezan', mtWarning, [mbOK], 0);
dbEdit1.SetFocus;
Abort;
end;
.
..
...
end;
i tako redom za potrebna polja
[ Rapaic Rajko @ 27.10.2008. 14:07 ] @
Pa ako sve kontrole koje te zanimaju imaju OnExit (isti prototip), ti mozes jedan te isti OnExit dodeliti svima njima.
Kako ces znati koja je kontrola u pitanju, kad jednom udjes u event OnExit? Veoma prosto, koristi parametar Sender. Nesto ovako
Code:
if Sender = DBEdit2 then // poredjenje referenci/pointera; ovako ja radim
...
ili ovako
Code:
if TComponent(Sender).Name = 'DBEdit2' then // lepo ga pitamo za ime; sve na formi je TComponent, tako da i ovo moze
...
Istina je da bi ovo bio povelik handler zbog posebno napisanog koda za svaku kontrolu, ali bi radio posao. Ili ti ipak treba nesto drugo...?
Rajko
[ mr.zhile @ 27.10.2008. 14:30 ] @
@rajko
Upravo to sto si napiso,samo jos malo pojasni,na mom primeru please?
[ priki @ 28.10.2008. 09:48 ] @
Citat: Rapaic Rajko:
Istina je da bi ovo bio povelik handler zbog posebno napisanog koda za svaku kontrolu, ali bi radio posao. Ili ti ipak treba nesto drugo...?
Rajko
i prekomplikovan da bi poslovnu logiku provere unosa sa svih kontrola strpao u jedan handler
tj sve prilagodio prema njemu. Volim i ja univerzalna rešenja najviše,
samo ponekad nisu moguća ako ih ne isprojektuješ na početku aplikacije
[ mr.zhile @ 28.10.2008. 11:42 ] @
Hvala na pomoci!!!
Posluzio sam se pikijevim primerom i uradio sam na DataSet-u BeforPost,a na drugoj tabeli sam uradio OnValidation Field,cisto da bih probao kako i to izgleda...!!!
Jos jednom hvala svima,i zamolio bih Vas da mi pojasnite to
Citat: Volim i ja univerzalna rešenja najviše, samo ponekad nisu moguća ako ih ne isprojektuješ na početku aplikacije
Kako se projektuje automatsko resenje?Odnosno kako bi izgledalo na mom primeru,cisto da bi nesto novo naucio,a ovu aplikaciju sam dotegao pa ad radi kao podmazaana?
HVLA SVIMA na savetima puno mi znace!!!
[ Rapaic Rajko @ 28.10.2008. 11:44 ] @
Hm, sad meni nije jasno sta te buni...? Mozda kako da pozoves SetFocus date kontrole?
Mozda ovako:
Code:
procedure TForm1.DBEditExit(Sender: TObject);
var
CurDBEdit: TDBEdit;
begin
if Sender is TDBEdit then begin
CurDBEdit := TDBEdit(Sender);
if CurDBEdit = DBEdit1 then
begin
if neka_provera_unosa then
CurDBEdit.SetFocus
else
DBEdit2.SetFocus; // ili koja vec kontrola ide
end;
if CurDBEdit = DBEdit2 then
begin
if neka_provera_unosa then
CurDBEdit.SetFocus;
else
DBEdit3.SetFocus; // ili koja vec kontrola ide
end;
// etc.
end;
end;
Obrati paznju da u gornjem primeru mozes neka_provera_unosa pozvati i bez provere KOJI je edit u pitanju (naravno ako je slican uslov za unos, recimo neprazan edit itd.), pa tek kad se ustanovi da nije dobar unos, onda proveravati koja je sledeca kontrola za focus i postavljati isti.
Ne znam sta bi ti jos pomoglo, a nisam siguran da je ovo ono sto trazis...?
Rajko
[ priki @ 28.10.2008. 12:20 ] @
Citat: mr.zhile: Hvala na pomoci!!!
Posluzio sam se pikijevim primerom i uradio sam na DataSet-u BeforPost
Kako se projektuje automatsko resenje?Odnosno kako bi izgledalo na mom primeru,cisto da bi nesto novo naucio,a ovu aplikaciju sam dotegao pa ad radi kao podmazaana?
nije piki nego priki
pričamo o univerzalnim rešenjima, automatska ne postoje
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|