[ popmilan76 @ 12.11.2013. 21:06 ] @
Posto sam u nedoumici oko otvaranja formi,imam jedno pitanje....Kako otvarate drugu formu,jel preko Form1.show; ili preko sledeceg koda....
procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
F: TFrmPotvrda;
begin
F:= TFrmPotvrda.Create(nil);

try

F.Showmodal;

finally
f.Free;
end;
end;

end.

gde ovu formu prebacujem u available forms,u delu options

Dakle,sta od ova dva je bolje i sta je skolski....
[ ((BugA)) @ 12.11.2013. 22:25 ] @
Nisam siguran na sta tacno mislis, posto pod jednim podrazumevas Form1.Show(), a onda pod drugim prikazujes citav kod u kome prvo kreiras instancu forme a zatim koristis F.ShowModal() - ove dve stvari nisu iskljucive. Da li ces koristiti Show() ili ShowModal() zavisi od toga sta zelis da postignes tom formom koju prikazujes, a kreiranje forme dinamicki mozes raditi i u jednom i u drugom slucaju (doduse, ne sa ovim istim kodom).

Racunam da je pitanje da li koristiti (1) automatski (staticki) kreirane forme (one koje se npr. nalaze u Project > Options > Forms > Auto-create forms) ili ih odatle (2) prebaciti desno u "Available forms" pa ih kreirati dinamicki - u ovom slucaju je resenje pod (2) generalno bolje, osim mozda u specificnim slucajevima.

Forme koje se nalaze unutar "Auto-create forms" se automatski kreiraju po pokretanju aplikacije (sto se moze videti u Project > View Source, pa obratiti paznju na Application.CreateForm() i parametre koje uzima), cime se dodeljuju (zauzimaju) resursi i kreira jedna instanca forme (obicno skrivena, ukoliko nije drugacije podeseno), i to bez obzira hocemo li je uskoro koristiti ili ne. Ovim formama mozemo pristupiti bilo kada u toku rada aplikacije bez potrebe da ih prvo sami kreiramo (i pod uslovom da ih nismo u medjuvremenu sami unistili - ne zatvorili, jer ih zatvaranje obicno samo skriva, ne unistava (Free())).

Sa druge strane, forme unutar "Available forms" iz ugla aplikacije ne postoje dok ih sami ne kreiramo (kao u primeru iz tvog koda), i samim tim ne zauzimaju bespotrebno resurse racunara sve do trenutka dok nam zaista nisu potrebne (opet pod uslovom da ih programer na pravi nacin i u pravo vreme kreira).

Prvi nacin ("Auto-create forms") nudi (uglavnom za pocetnike) prostije, brze i lakse resenje baratanja sa vise formi, ali moze biti neoptimizovan i bespotrebno trositi resurse racunara, dok drugi ("Available forms") predstavlja mnogo elegantnije resenje (i bezbolnije po resurse racunara), ali zahteva malo paznje od strane programera koji mora da vodi racuna gde i kad forme kreira/unistava (sto je i inace slucaj i kada se radi sa bilo kojim drugim objektima, ne samo tipa forme).

E sad, ako aplikacija ima par prostih formi, onda ti realno nije toliko ni vazno kako ces raditi (po pitanju resursa) - drugi nacin i dalje predstavlja (po meni) bolje resenje (skolsko), samo je pitanje da li ces imati vremena/volje da to odradis kako treba (jer ispadne malo vise posla). Medjutim, ako je u pitanju poslovna aplikacija koja sadrzi desetine ili stotine (moguce i kompleksnih) formi, onda mislim da je drugi nacin jedini ispravan - osim ako ne zelis da cekas dva dana na pokretanje aplikacije, pritom zauzimajuci pola resursa racunara :)
[ reiser @ 12.11.2013. 22:50 ] @
Da se nadovezem na post iznad mene, jedno od najboljih resenja (bar po meni) je da napises staticku public proceduru koja ce pokrenuti formu. Dakle, to bi trebalo da izgleda otprilike ovako:

Code:

type
  TfrmSecond = class(TForm)
  private
  public
    class function RunModal: Integer;
  end;

var
  frmSecond: TfrmSecond;

implementation

class function TfrmSecond.RunModal: Integer;
begin
  Application.CreateForm(TfrmSecond, frmSecond);
  try
    result := frmSecond.ShowModal;
  finally
    frmSecond.Free;
  end;
end;


I onda iz drugih formi otvaras formu sa TfrmSecond.RunModal.
[ popmilan76 @ 13.11.2013. 09:22 ] @
Hvala na odgovorima...ja sam do sada radio na prvi nacin,jer je svakako laksi,a nisam imao vise od 6-7 formi,maksimalno 10...Pitanje sam postavio,jer hocu da predjem na ovaj drugi nacin,bas zbog cuvanja resursa racunara....Ako otvorim jednu formu(Form1),u kojoj su dbgrid1,u query1,i dataset....pa iz nje otvorim form2,u kojoj se nalaze text box1,textbox2,itd....i hocu da iz tih textbox promenim,dbgrid1 u prvoj formi....to mogu samo preko prvog nacina,ali preko drugog ne znam....Dakle, u Form2,postoji i dugme koje zatvara tu formu,a ostavlja formu 1,i promeni dbgrid sa textbox iz druge forme.....Kako to odraditi pomocu onog drugog nacina,skolskog primera....Hvala
[ _deran_ @ 13.11.2013. 15:57 ] @
Forme ne bi trebalo oslobadjati sa Free nego sa Release.
[ reiser @ 13.11.2013. 17:53 ] @
Savrseno je bezbedno da se forma osloadja pomocu .Free(). Jedini scenario gde treba da se koristi .Release() je ako formu oslobadjas u sred nekog njenog event handlera.
[ ((BugA)) @ 13.11.2013. 18:42 ] @
Citat:
reiser:
Da se nadovezem na post iznad mene, jedno od najboljih resenja (bar po meni) je da napises staticku public proceduru koja ce pokrenuti formu. Dakle, to bi trebalo da izgleda otprilike ovako:

Code:

type
  TfrmSecond = class(TForm)
  private
  public
    class function RunModal: Integer;
  end;

var
  frmSecond: TfrmSecond;

implementation

class function TfrmSecond.RunModal: Integer;
begin
  Application.CreateForm(TfrmSecond, frmSecond);
  try
    result := frmSecond.ShowModal;
  finally
    frmSecond.Free;
  end;
end;


I onda iz drugih formi otvaras formu sa TfrmSecond.RunModal.

Par komentara - prvo, mislim da ne bi trebalo da eksplicitno koristis Application.CreateForm() jer to nije isto sto i TForm.Create(), barem ako govorimo o prostom kreiranju formi. Application.CreateForm() moze imati dodatne (nezeljene?) efekte, npr. ukoliko jos uvek nije (iz bilo kog razloga) dodeljena glavna forma aplikacije prvi poziv Application.CreateForm() ce formu koja se kreira uzeti za glavnu. Dalje, Application.CreateForm() automatski postavlja aplikaciju za vlasnika forme, sto nam takodje mozda ne odgovara.

Drugo, upotreba globalne promenljive "frmSecond" je sumnjiva. U zavisnosti od njene primene (unutar klase, na sta mozemo uticati, ali i primene same klase u programu, na sta potencijalno ne mozemo uticati (!)) moze doci do pucanja aplikacije (Access Violation). Globalne promenljive bi u globalu trebalo izbegavati :)

Ne menjajuci pocetnu ideju, mislim da bi sledeca implementacija bila bolje resenje:
Code:

type
  TfrmSecond = class(TForm)
  private
  public
    class function RunModal(): Integer;
  end;

implementation

class function TfrmSecond.RunModal(): Integer;
var
  frmSecond: TfrmSecond;
begin
  frmSecond := TfrmSecond.Create(nil)
  try
    result := frmSecond.ShowModal;
  finally
    frmSecond.Free;
  end;
end;

[ ((BugA)) @ 13.11.2013. 18:54 ] @
Citat:
_deran_: Forme ne bi trebalo oslobadjati sa Free nego sa Release.
Citat:
reiser: Savrseno je bezbedno da se forma osloadja pomocu .Free(). Jedini scenario gde treba da se koristi .Release() je ako formu oslobadjas u sred nekog njenog event handlera.

Slozio bih se sa reiser-om (pogotovo ako govorimo o modalnim formama), i jos dodao da koriscenje Release() umesto Free() cesce moze sugerisati da je u pitanju los dizajn, zbog cega ce nas kasnije samo vise boleti glava.

Release() je nista vise do odlozeno Free(), u fazonu "nemoj unistiti formu sada, nego malo posle", gde ovo "malo posle" moze biti ko zna kad - obicno nakon obrade svih poruka koje su na formu cekale, pa na kraju i same poruke koju smo poslali preko Release(), ali sustina je da to vise ne zavisi od nas, vise nemamo nad tim kontrolu. Verujem da (mozda) moze naci primenu, ali mi je Free() mnogo sigurnije (da ne kazem bolje :) resenje.
[ ((BugA)) @ 13.11.2013. 19:29 ] @
Citat:
popmilan76: Hvala na odgovorima...ja sam do sada radio na prvi nacin,jer je svakako laksi,a nisam imao vise od 6-7 formi,maksimalno 10...Pitanje sam postavio,jer hocu da predjem na ovaj drugi nacin,bas zbog cuvanja resursa racunara....Ako otvorim jednu formu(Form1),u kojoj su dbgrid1,u query1,i dataset....pa iz nje otvorim form2,u kojoj se nalaze text box1,textbox2,itd....i hocu da iz tih textbox promenim,dbgrid1 u prvoj formi....to mogu samo preko prvog nacina,ali preko drugog ne znam....Dakle, u Form2,postoji i dugme koje zatvara tu formu,a ostavlja formu 1,i promeni dbgrid sa textbox iz druge forme.....Kako to odraditi pomocu onog drugog nacina,skolskog primera....Hvala

Ovo je sad pitanje dizajna (arhitekture) aplikacije, i moze se resiti na vise nacina.

Moze ovako:
Code:

procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
  F: TFrmPotvrda;
begin
  F:= TFrmPotvrda.Create(nil);
  try
    F.ShowModal();
    DbGrid1... := F.TextBox1.Text; // ovo korigovati shodno tome gde zelis da pises u DbGrid1 i odakle da citas iz TextBox1
  finally
    F.Free();
  end;
end;

Ili, recimo, koristeci event handler-e.
Code:

procedure TFrmPriznanje.Form2TextBoxChange(Sender: TObject);
begin
  // ovde sad mozes dobiti vrednost iz TextBox1 kao
  // (Sender as TEdit).Text
  // ili gde se vec tekst nalazi (ovde je dat primer ako je TextBox1 tipa TEdit)
  //
  // primer:
  DbGrid1... := (Sender as TEdit).Text;
end;

procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
  F: TFrmPotvrda;
begin
  F:= TFrmPotvrda.Create(nil);
  try
    F.TextBox1.OnChange := Form2TextBoxChange; // pozovi Form2TextBoxChange() na svaku promenu vrednosti TextBox1 koji se nalazi na Form2
    F.ShowModal();
  finally
    F.Free();
  end;
end;

[ popmilan76 @ 13.11.2013. 20:22 ] @
Zar ne treba prvo napravim insert ili edit database....kao ovako

procedure TFrmPotvrda.BitBtn1Click(Sender: TObject);
var
F: TFrmPriznanje;
begin
F:= TFrmPriznanje.Create(nil);
try

F.ShowModal;
f.Query2.DataSource.DataSet.Edit ;
f.DBGrid1.Columns[5].field.AsString := combobox1.Text ;
f.Query2.DataSource.DataSet.Post ;

finally
F.Free;
end;
end;

end.
[ ((BugA)) @ 13.11.2013. 20:39 ] @
Zato sam i napisao da korigujes shodno svojim potrebama, ja sam ti samo pokazao kako da uzmes vrednost sa druge forme :)
[ popmilan76 @ 13.11.2013. 20:50 ] @
Mozes pogledati moj kod,mislim da u njemu nesto ne valja....prijavljuje gresku...i kako da zatvorim form2,da mi ostane form1 sa promenom...Sve mi se vise cini da cu nastaviti da radim sa svim formama kao autocreate....

Dakle ,zanima me kako to sve funkcionise,,,,gde se forma kreira,gde nestaje,i tako to....

[Ovu poruku je menjao popmilan76 dana 14.11.2013. u 00:00 GMT+1]
[ ((BugA)) @ 14.11.2013. 01:13 ] @
Deder bar napisi koju gresku prijavljuje i gde, davno nisam radio sa ovim data-aware komponentama pa stvarno ne bih znao napamet :) Mozda ne bi bilo lose ni da otvoris posebnu temu za probleme sa menjanjem vrednosti unutar TDBGrid-a, kako bi se ovde drzali diskusije o formama.

Evo dodatnog objasnjenja, malo cu promeniti imena da bi bilo jasnije o cemu se radi:
Code:
procedure TForm1.DBGrid1DblClick(Sender: TObject); // procedura se poziva (recimo) na dupli klik unutar DBGrid1 na formi 1
var
  Forma2: TForm2;
begin
  Forma2 := TForm2.Create(nil); // kreiramo formu pod imenom Forma2, tipa TForm2, forma je sakrivena (ne vidi se na ekranu)
  try
    Forma2.ShowModal(); // prikazujemo formu 2 (pojavljuje se na ekranu) kao modalnu 
      // (znaci da nemamo pristup drugim formama aplikacije dok ovu formu ne zatvorimo)
      // Takodje, izvrsavanje ove metode (DBGrid1DblClick()) se ovde zaustavlja, sve do trenutka dok ne
      // zatvorimo formu 2, nakon cega se izvrsavanje nastavlja u sledecem redu

    Self.DBGrid1.DataSource.DataSet.Edit; // omoguci izmenu podataka

    Self.DBGrid1.DataSource.DataSet.FieldByName('ImePolja').AsString := Forma2.TextBox1.Text; // nastavak izvrsavanja
      // (nakon zatvaranja forme 2), Forma2 i dalje postoji,
      // samo je sada (ponovo) skrivena (da, njenim zatvaranjem je nismo unistili, 
      // vec samo sakrili - osim ako nismo namestili da se prilikom zatvaranja i unisti...)
      // Dokle god formu 2 ne unistimo, imamo najnormalniji pristup svim njenim
      // osobinama / vrednostima, sto se vidi iz ovog primera gde citamo
      // vrednost Text iz komponente TextBox1 koja se nalazi na formi 2, i dodeljujemo je
      // komponenti DbGrid1 koja se nalazi na formi 1 (unutar cije se procedure nalazimo,
      // pa u ovom slucaju Self predstavlja formu 1, tj. objekat klase TForm1)

    Self.DBGrid1.DataSource.DataSet.Post; // upisi izmene u bazu
  finally
    Forma2.Free(); // kada nam Forma2 vise nije potrebna, unistavamo je i oslobadjamo resurse koje je koristila,
      // nakon ovoga Forma2 vise ne postoji i ne mozemo joj pristupiti (niti citati vrednosti sa nje)
  end;
end;
[ captPicard @ 14.11.2013. 11:10 ] @
Ako ti DBGrid ima isti datasource kao i druga forma gdje vučeš podatke, ne vidim potrebe da prvo puniš grid pa onda radiš post. Dovoljno je da post napraviš u drugoj formi i refreshas query kada se vratiš u prvu formu i podatak će biti tamo zapisan.
[ popmilan76 @ 14.11.2013. 15:30 ] @
Imam otvorene dve forme,s tim sto mi je focus na drugoj....i sada u drugoj imam combobox1,i iz njega menjam dbgrid1 u prvoj formi

procedure TFrmPotvrda.BitBtn1Click(Sender: TObject);
var
Form2: TFrmPriznanje;
begin

Form2:= TFrmPriznanje.Create(nil);
try

Form2.ShowModal;
form2.DBGrid1.DataSource.DataSet.Edit ;
form2.DBGrid1.DataSource.DataSet.Fields[5].asstring := combobox1.Text ;
form2.DBGrid1.DataSource.DataSet.Post ;
finally

Form2.Free;

end;
end;


i posle ovoga mi nista ne pojavljuje........i kada hocu da skinem form1,prikazuje gresku dataset is not ionsert or edit mode ili tako nesto.....

Gde gresim....


FrmPotvrda je u ovom slucaju Form1,a FrmPriznanje je Form2
[ reiser @ 14.11.2013. 15:46 ] @
Greska je u tome sto te promene u Form2 trebas da uradis pre nego sto pozoves ShowModal. ShowModal ti prekida izvrsavanje funkcije dok se forma ne zatvori, i sve ono sto radis nakon toga, radis na vec zatvorenoj formi. Dakle:

Code:

procedure TFrmPotvrda.BitBtn1Click(Sender: TObject);
var
  Form2: TFrmPriznanje;
begin
  Form2:= TFrmPriznanje.Create(nil);
  try
    Form2.DBGrid1.DataSource.DataSet.Edit;
    Form2.DBGrid1.DataSource.DataSet.Fields[5].asstring := combobox1.Text ;
    Form2.DBGrid1.DataSource.DataSet.Post;
    Form2.ShowModal;
  finally
    Form2.Free;
  end;
end;
[ popmilan76 @ 14.11.2013. 15:57 ] @
U ovom slucaju prikazuje da mi nije dataset u insertmode ili edit mode...


I kako da zatvorim prvu formu......
[ reiser @ 14.11.2013. 16:30 ] @
Tako sto uzmes knjigu/dokumentaciju/google u ruke i citas :) Mislim, uopste ne zelim da budem maliciozan, ali ono sto ti radis nije ispravan nacin da se uci programiranje.. Ne mozes da pises nesto tek-tako i da ocekujes da radi ispravno. Pravis pocetnicke greske i bez da se trudis da ih sam resis, pitas ovde, ljudi ti pomognu, ali ti i dalje nastavljas da pravis iste greske. Pokusaj da razumes zasto nesto ne radi i resis ga sam, tako ces najbrze napredovati. Za pocetak, identuj kod.
[ popmilan76 @ 14.11.2013. 17:16 ] @
Nikoga ja ovde ne teram da mi pomogne....Naravno,sve je dobrovoljno,ako neko hoce,hoce,ako nece,nece...njegova stvar...Da sam to bilo gde nasao,ne bih pitao,jednostavno nisam nasao.....
[ popmilan76 @ 14.11.2013. 17:36 ] @
Code:
procedure TForm1.DBGrid1DblClick(Sender: TObject); // procedura se poziva (recimo) na dupli klik unutar DBGrid1 na formi 1
var
Forma2: TForm2;
begin
Forma2 := TForm2.Create(nil); // kreiramo formu pod imenom Forma2, tipa TForm2, forma je sakrivena (ne vidi se na ekranu)
try
Forma2.ShowModal(); // prikazujemo formu 2 (pojavljuje se na ekranu) kao modalnu
// (znaci da nemamo pristup drugim formama aplikacije dok ovu formu ne zatvorimo)
// Takodje, izvrsavanje ove metode (DBGrid1DblClick()) se ovde zaustavlja, sve do trenutka dok ne
// zatvorimo formu 2, nakon cega se izvrsavanje nastavlja u sledecem redu

Self.DBGrid1.DataSource.DataSet.Edit; // omoguci izmenu podataka

Self.DBGrid1.DataSource.DataSet.FieldByName('ImePolja').AsString := Forma2.TextBox1.Text; // nastavak izvrsavanja
// (nakon zatvaranja forme 2), Forma2 i dalje postoji,
// samo je sada (ponovo) skrivena (da, njenim zatvaranjem je nismo unistili,
// vec samo sakrili - osim ako nismo namestili da se prilikom zatvaranja i unisti...)
// Dokle god formu 2 ne unistimo, imamo najnormalniji pristup svim njenim
// osobinama / vrednostima, sto se vidi iz ovog primera gde citamo
// vrednost Text iz komponente TextBox1 koja se nalazi na formi 2, i dodeljujemo je
// komponenti DbGrid1 koja se nalazi na formi 1 (unutar cije se procedure nalazimo,
// pa u ovom slucaju Self predstavlja formu 1, tj. objekat klase TForm1)

Self.DBGrid1.DataSource.DataSet.Post; // upisi izmene u bazu
finally
Forma2.Free(); // kada nam Forma2 vise nije potrebna, unistavamo je i oslobadjamo resurse koje je koristila,
// nakon ovoga Forma2 vise ne postoji i ne mozemo joj pristupiti (niti citati vrednosti sa nje)
end;
end;



Ovo mi se svidja sto je BUG odradio.....sasvim je okej,nego nije u potpunosti odradjeno.....i moze li da forme budu u available forems,a da se pokrecu sa obicnim form1show.
[ popmilan76 @ 18.11.2013. 15:48 ] @
Dakle imam dve forme,ni jedna od njih nije main form,dakle iz main form ulazum u prvu modalformu,FrmPriznanje,i to mi se otvori....zatim iz prve forme ulazim u drugu modalformu...pomocu sledeceg koda....

procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
form4 : TFrmPotvrda;
begin
form4 := TFrmPotvrda.Create(nil);
try

form4.Edit1.Text := combobox1.Text ;
form4.DateTimePicker1.Date := dbgrid1.Fields[1].asdatetime;
form4.Edit2.Text := dbgrid1.Fields [3].asstring;
form4.memo1.Text := dbmemo1.Field.AsString ;


form4.Showmodal;


finally
form4.Free;

end;
end;

end.

u ovoj prvoj formi mi se nalazi dataset,sa query...i dupli klik na dbgrid,i pojavi mi se druga forma,FrmPotvrda...i u njoj imam,edit1,memo1 i jos ponesto....i dva dugmeta,i u dugmeti OK,imam kod koji treba da zatvori drugu modalformu,i ostane samo prva,sa izmenama iz druge...i u tom dugmetu imam sledeci kod....

procedure TFrmPotvrda.BitBtn1Click(Sender: TObject);

var

form3 : TFrmPriznanje;

begin
form3 := TFrmPriznanje.Create(nil);
try
form3.Query2.Active := true;
while NOT form3.Query2.Eof do begin
//Now fill the result in ComboBox1.

form3.ComboBox1.Items.Add(form3.query2['redbr']);

form3.Query2.Next;

form3.dbgrid1.edit;
...
...
...
form3.post;

end;

form3.Showmodal;




finally
form3.ShowModal ;
end;
end;


Molio bih Vas za pomoc ,jako mi je potrebna....


[ komplikator @ 18.11.2013. 17:18 ] @
Iskreno, sve ti je poslagano zbrda zdola i kao što sam ti davno pisao nisi pohvatao koncepciju dizajniranja win aplikacija i osnove Delphi OOP.
Učeći metodom pokušaja i pogreške ćeš ubiti previše vremena, neke osnove se jednostavno moraju znati. Najtoplije ti savjetujem da proučiš knjigu Delphi 2005 bez tajni prevedena ti je s engleskog (izvrstan autor Marco Cantu).

Gledaj, kod win gui aplikacija je uvijek jedna forma osnovna. Razlog je u tome kako windoze rade i kako prenose poruke i još ponešto.
Ozbiljnije pisani programi koriste svoje bootstrapere koji dinamički učitavaju forme i module. Ja recimo imam neku glavnu konfiguracijsku klasu koja radi sva moguća podešavanja, inicializacije, učitavanja, prati ovlasti i sl. i prema tome kreira datamodule, poziva forme koje su zapravo naslijeđene klase i koje su predstavljaju neke entitete i sadrže razne metode za pretraživanja, ažuriranja, obrade, a svaka se može prikazati, prikazati modalno ili prikazati na kartici, no to je nešto na što je otišlo 12 mjeseci rada i dvocifren broj staža u oop programiranju.

Ono što tebe buni je razlika između običnih i modalnih formi, način kako ih kreirati i kako ih ubijati tj. oslobađati i redoslijed radnji.
Možeš otvarati modalne forme jednu za drugom no aktivna je samo ona na vrhu i nema micanja sve dok ne vrati svoj modalni rezultat. Predlažem ti da napraviš data modul koji će biti glavni i na njemu budu svi dijeljeni datasetovi pa iz njega po potrebi kreiraš, otvaraš i prikazuješ što trebaš.

Na žalost previše je toga za pisati i preporučujem ti prevedene knjige kao što su Delphi 2005 i Delphi 6 vodič za programere, a onda imaš dovoljno znanja da znaš kako dalje.

Želim ti savjetovati još par stvari:

Bježi od pisanja poslovne logike unutar event handlera, to je jako loša ideja i loša praksa. Nauči to izbjegavati još dok je vrijeme i nije uzelo maha. Pokušaj se naučiti da što više raznih obrada, rezultata, provjera i sl. izdvajaš u funkcije prema određenim scope-ima, a kad dovoljno stasaš to sve digneš na nivo klasa i metoda.

U današnje vrijeme se manje koristi madžarska notacija no klasama, funkcijama i varijablama dodijeljuj neka smislena imena, to će ti također jednog dana uštedjeti nešto kose na glavi, a kôd je čitljiviji i tebi i drugima.

Piši komentare, kao i ovo s nazivima štedi kosu, poneku pepeljaru ili čašu, a k tome spada u osnovna pravila programiranja.

Pratim tvoje postove i izradu blagajne i lijepo je što imaš entuzijazam i volju nešto raditi i naučiti i samo naprijed!
[ popmilan76 @ 18.11.2013. 17:30 ] @
Hvala na ohrabrenju....jos sam daleko od pisanja klasa i metoda...Pomenutu knjigu imam,ali u njoj nema bas nista,sto se tice toga,samo kako se otvara modalna forma i to je to....
[ popmilan76 @ 18.11.2013. 19:48 ] @
Ono sto meni treba ,jeste da imam pored jedne otvorene glavne main form,iz nje otvaram drugu,a iz druge trecu,i treba iz trece da se vratim na drugu,sa izmenjenim podacima....Ne znam jel me neko razume...
[ Rapaic Rajko @ 19.11.2013. 10:12 ] @
Ja sam te razumeo, al onaj kod... auh. Otkud ti samo ideja da ponovo kreiras FrmPriznanje...
Evo ti prva pomoc:

Code:

procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
  form4 : TFrmPotvrda;
begin
  form4 := TFrmPotvrda.Create(nil);
  try
    form4.Edit1.Text := combobox1.Text ;
    form4.DateTimePicker1.Date := dbgrid1.Fields[1].asdatetime;
    form4.Edit2.Text := dbgrid1.Fields [3].asstring;
    form4.memo1.Text := dbmemo1.Field.AsString ;

    form4.Showmodal;
    // na ovom mestu prepisi izmene, direktno citas iz form4 (FrmPotvrda), i napucavas gde treba na OVOJ formi (FrmPriznanje)

  finally
    form4.Free; 
  end;
end;


Pozz
[ popmilan76 @ 19.11.2013. 20:26 ] @
Joj,bas sam glup,ali stvarno ne razumem...ovo sa showmodal me izludjuje.....u onom delu sto si napisao da prepisem one izmene,opet nece.....i ja tu krajnju formu tek treba da menjam......znaci imam combobox iz njega da menjam dbgrid1,iz prethodne forme....
[ popmilan76 @ 19.11.2013. 21:24 ] @
I jos nesto,mogu li nastaviti raditi sa show,bez showmodal,,,,ali da u dp file izbrisem autocreate sve forme sem pocetne....mislim one ce ostati u onom delu autocreate,preko options....ako ih izbrisem ovamo,da li ce se stvarno izbrisati ili ce ih i dalje praviti kao autocreate...
[ komplikator @ 20.11.2013. 12:38 ] @
Hajdemo ovako:

Glavni dpr tj. projektni file je rezultat onoga što postaviš u autocreate listi u postavkama projekta.
Kreiraš li forme sam, dinamički tada ti ne treba taj autocreate odnosno Application.CreateForm tvojih formi, izuzev one početne (što sam ti savjetovao da bude svim formama vidljiv datamodul), a način kreiranja formi nema nikakve veze sa
prikazom i sakrivanjem forme ili modalnim prikazom.

Običan ili modalni prikaz se razlikuju upravo po modalnosti, modalna forma se mora zatvoriti da bi se mogao vratiti njenom roditelju. Bitno je da forme kreiraš prije pozivanja, a vjerujem da znaš i to da se modalna forma ne može sakriti. Ako se međusobno
nešto ne vidi tada ti negdje nešto nedostaje u uses listama. Kod uses lista ćeš vjerojatno uletjeti u kružne reference koje možeš raspetljati tako da jedan unit dodaješ u implementaciju, a ovaj drugi prvome u interface, ovisno gdje trebaš što pozvati ili deklarirati.
[ popmilan76 @ 20.11.2013. 15:30 ] @
Da to sam razumeo i znam,ali kada izbrisem u delu dp fajla ovaj deo

Application.CreateForm(TFrmUnos, FrmUnos);
Application.CreateForm(TFrmPriznanje, FrmPriznanje);
Application.CreateForm(TFrmPotvrda, FrmPotvrda);

dakle druge forme ,koje nisu main....

i dalje radi kao da su sve forme autocreate,i one su poslke u onom delu ,ne auto create,nego available form.....

Da li svi programeri rade sa showmodal ili ne.....

I koliko je to bitno....
[ captPicard @ 20.11.2013. 19:53 ] @
Bitno je šta ti treba, ako mora biti prikazana samo ta forma onda je bitno. Ali ako radiš sa "nemodalnim" formama onda moraš dobro znati šta radiš, pogotovo vezano za transakcije. Preporučam da za početak pohvataš kako se radi sa modalnim formama a nakon toga kreneše dalje.
[ popmilan76 @ 20.11.2013. 20:58 ] @
pogledaj inbox pa vidi sta moze da se uradi...unapred zahvala....
[ popmilan76 @ 24.11.2013. 13:02 ] @
evo postavicu moj projekat,znaci treba iz frmpotvrda da izmenim dbgrid u frmpriznanje,ali da oba bude otvorena....Hvala
[ ((BugA)) @ 24.11.2013. 15:25 ] @
Nisam siguran sta tacno zelis kad kazes da "oba bude otvorena" - da li da "ova" (frmPriznanje ili frmPotvrda?) bude otvorena, ili da "obe" budu otvorene... Elem, evo jednog primera kako da iz frmPriznanje modalno otvoris frmPotvrda, izmenis vrednosti i klikom na "Potvrdi" zatvoris frmPotvrda a izmenjene vrednosti prikazes na frmPriznanje.

Potrebne izmene:
Unit3.pas > FrmPriznanje > Query1, property "RequestLive" postavi na "True".
Unit4.pas > FrmPotvrda > BitBtn1, property "ModalResult" postavi na "mrOk".
Unit3.pas > TFrmPriznanje.DBGrid1DblClick() procedura, izmeni je da izgleda ovako:
Code:
procedure TFrmPriznanje.DBGrid1DblClick(Sender: TObject);
var
  form4 : TFrmPotvrda;
begin
  form4 := TFrmPotvrda.Create(nil);
  try
    form4.Edit1.Text := combobox1.Text ;
    form4.DateTimePicker1.Date := dbgrid1.Fields[1].asdatetime;
    form4.Edit2.Text := dbgrid1.Fields [3].asstring;
    form4.memo1.Text := dbmemo1.Field.AsString ;
    if (form4.Showmodal = mrOk) then // proveri da li smo kliknuli na "Potvrdi" (zato smo postavili ModalResult := mrOk)
    begin
      combobox1.Text := form4.Edit1.Text;
      dbgrid1.DataSource.DataSet.Edit; // za ovo nam je neophodno ono RequestLive := True odozgo
      dbgrid1.Fields[1].AsDatetime := form4.DateTimePicker1.Date;
      dbgrid1.Fields[3].AsString := form4.Edit2.Text;
      dbmemo1.Field.AsString := form4.Memo1.Text;
      dbgrid1.DataSource.DataSet.Post;
    end;
  finally
    form4.Free;
  end;
end;

Ovo radi, ali nisam siguran koliko je ispravno ovako raditi, mozda postoji neki drugi (preporuceni) nacin, mozda moze neko da prokomentarise, rekoh ja nisam sa ovim odaaavno radio.

Jos jedna (veoma bitna) stvar, ono sto su te drugi vec savetovali - obrati paznju na preglednost napisanog koda. Mozda ti to zvuci nebitno, ili te mrzi da na to obracas paznju dok "vezbas" i pises test aplikacije, ali navika koju sad steknes ce te (hteo ti to ili ne) kasnije pratiti i kada predjes na mnogo ozbiljnije projekte, a nepregledan kod je muka ziva za odrzavanje. Cak i svoju sopstvenu aplikaciju kada otvoris posle par meseci pauze moze ti biti nejasno sta i kako radi, a zamisli kako je kada gledas tudj kod - ako je jos "aljkav"... patnja je to :) Za pocetak, mozes pogledati preporuke odavde -- http://edn.embarcadero.com/article/10280.
[ popmilan76 @ 24.11.2013. 18:11 ] @
Da,za request true,imam obicaj da stavim uvek na true,i to je okej...sto se tice preglednosti,nemam tu naviku pisanja komentara,znam da treba,ali sta cu takav sam....da to je okej ,radi i meni ,samo treba promena u ovom delu.....

dbgrid1.DataSource.DataSet.Edit; // za ovo nam je neophodno ono RequestLive := True odozgo
dbgrid1.Fields[5].asstring := form4.ComboBox1.Text ;
dbgrid1.DataSource.DataSet.Post;


zasto mislis da ovo nije pravilno,kakve mogu biti posledice.....ili je ovo sasvim okej......


i jos nesto,sta valja stavljati u event formclose,jel dovoljno samo free,ili jos nesto...ili nista od toga....
[ Rapaic Rajko @ 25.11.2013. 11:53 ] @
Ne stavljaj nista u OnClose() event modalne forme, jer posle zatvaranja (izlaz iz metode ShowModal()) jos citas podatke sa nje, zar ne? Ako stavis CloseAction = caFree, forma se na Close() samoubije; nista od citanja podataka.
Imas ispod u finally delu ubijanje forme (form4.Free), i tako neka ostane.

Pozz
[ popmilan76 @ 26.11.2013. 18:29 ] @
Jel na isti nacin otvaram i Reporte,kao i forme,samo promenim umesto showmodal,stavljam preview....
[ captPicard @ 27.11.2013. 07:24 ] @
Imaš isto Preview i PreviewModal;
[ popmilan76 @ 27.11.2013. 09:33 ] @
Kod mene ima samo Preview....u istoj aplikaciji imam onbefore print event nad ti reportom...posto treba da prikaze samo jedan record u tom uzvestaju....ja stavljam ovaj kod...

procedure TRepOdjave.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);

begin

if Table1RedBr.Value = strtoint(frmpoj.edit1.text) then begin
qrdbtext1.Enabled := true;
qrdbtext2.Enabled := true;
qrdbtext3.Enabled := true;
qrdbtext4.Enabled := true;
qrdbtext5.Enabled := true;
qrdbtext6.Enabled := true;
qrdbtext7.Enabled := true;
qrdbtext8.Enabled := true;

end
else
begin
qrdbtext1.Enabled := false;
qrdbtext2.Enabled := false;
qrdbtext3.Enabled := false;
qrdbtext4.Enabled := false;
qrdbtext5.Enabled := false;
qrdbtext6.Enabled := false;
qrdbtext7.Enabled := false;
qrdbtext8.Enabled := false;
end;
end;

end.


to mi radi u drugim aplikacijama,ali nece sada od kada sam krenuo sa showmodal....ova frmpoj je showmodal

[ Rapaic Rajko @ 27.11.2013. 10:18 ] @
Probaj sa

Code:

  if Table1RedBr.AsInteger = strtoint(frmpoj.edit1.text) then begin


ili

Code:

  if Table1RedBr.AsString = trim(frmpoj.edit1.text) then begin


Value je variant, i nema garancije da ce (automatska) konverzija u neki tip biti korektna.

Pozz
[ popmilan76 @ 27.11.2013. 10:42 ] @
Probao i ponovo mi izlazi ista greska....izadje ovo....


access vialation at adress 0048cb9a in module odjave.exe


a kada umesto edit1.text ,stavim neki broj recimo 2,izadje mi normalno sve....izadje drugi record ,kao sto i treba...
[ captPicard @ 27.11.2013. 12:26 ] @
Vjerojatno negdje ubiješ frmproj prije nego se pozoveš na njezin edit i naravno da ga tvoj report više ne vidi.
[ popmilan76 @ 27.11.2013. 14:40 ] @
verovatnoa,li gde ga ubijam.....ja kada stavim kod frmpoj,pa tacka,meni izlazi koje mogucnosti u toj formi,sve,pa i ova edit1.....
[ captPicard @ 27.11.2013. 16:37 ] @
Ne mora značiti da je taj problem koji sam ti rekao. Na kojoj liniji ti baci violation? Stavi break pa idi liniju po liniju. Ako ti stane na toj liniji onda je skoro pa sigurno taj problem. Btw, lakše ti je da samo proslijediš varijablu nego da pozivaš cijelu formu. Ili možeš još u frmproj npr.

Code (delphi):
QReport := TQReport.Create(self);
if Table1RedBr.AsInteger = strtoint(edit1.text) then
  begin
    QReport.QRDBText1.Enabled = False;
    //i tako sve redom
  end;
QReport.Preview; QReport.Release;


ili druga opcija, postaviš u QReport public varijablu intRedniBroj i onda

Code (delphi):
QReport := TQReport.Create(self);
QReport.intRedniBroj  := strtoint(edit1.text);
QReport.Preview; QReport.Release;


možeš koristiti i globalnu varijablu, niti jedan primjer mislim da nije loš...

Nakon frmproj. naravno da ti izlaze "mogućnosti" kada ti je frmproj u uses listi, ali to ne znači da ti možeš pozvati objekt iz frmproj (tedit) ako ti forma "ne postoji".

I za kraj samo mala napomena, lakše ti je izvrtiti dbedite nego pisati sve redom (ako postavljaš sve na true/false, a i ako ne možeš napraviti neki npr. array koji idu u filter a koji ne), znači (pišem iz glave, možda sam negdje napravio grešku, ali čisto da dobiješ dojam):

Code (delphi):
for i := 0 to ComponentCount - 1 do
begin
  if Components[i] is QRDBTextBox then
    QRDBTextBox.Components[i].Enabled := false;
end;
[ captPicard @ 27.11.2013. 16:59 ] @
I skini si ovo DelForExp već kada ti se neda sam uređivati kod

i onda Tools -> Source Formatter -> Whole project i onda če ti kod ličiti na nešto, ovako kako ti pišeš ri je jako nepregledno i teško je čitati kod.
[ popmilan76 @ 27.11.2013. 20:41 ] @
Pokusao sam da to uradim vec u frmpoj,ali mi sada prikazuje samo praznu stranicu,samo sa zaglavljem.....

procedure TFrmPoj.BitBtn1Click(Sender: TObject);
var
stampasvih : TRepOdjave;

begin
stampasvih := TRepOdjave.Create(self);

try

if stampasvih.Table1RedBr.AsInteger = strtoint(edit1.text) then
begin

stampasvih.qrdbtext1.Enabled := true;
stampasvih.qrdbtext2.Enabled := true;
stampasvih.qrdbtext3.Enabled := true;
stampasvih.qrdbtext4.Enabled := true;
stampasvih.qrdbtext5.Enabled := true;
stampasvih.qrdbtext6.Enabled := true;
stampasvih.qrdbtext7.Enabled := true;
stampasvih.qrdbtext8.Enabled := true;

end
else
begin
stampasvih.qrdbtext1.Enabled := false;
stampasvih.qrdbtext2.Enabled := false;
stampasvih.qrdbtext3.Enabled := false;
stampasvih.qrdbtext4.Enabled := false;
stampasvih.qrdbtext5.Enabled := false;
stampasvih.qrdbtext6.Enabled := false;
stampasvih.qrdbtext7.Enabled := false;
stampasvih.qrdbtext8.Enabled := false;

end;

stampasvih.preview;

finally
stampasvih.free;
end;
end;

end.


ono sto meni zapravo treba,jeste da se stampa samo odredjen red,ako kliknem u edit 2,da stampa drugi red


tj. da podaci koje stampam budu u bilo kom redu,ali da izadje stampa u selektvanom redu....dakle,podaci koji su u tabeli u 10 redu,da ih ja stampam u 2

[Ovu poruku je menjao popmilan76 dana 27.11.2013. u 21:54 GMT+1]

[Ovu poruku je menjao popmilan76 dana 27.11.2013. u 22:04 GMT+1]
[ captPicard @ 27.11.2013. 23:03 ] @
Mislim da nešto radiš jako krivo ali ne kužim šta točno radiš pa mi je teško otkriti problem.

Gdje otvaraš tablicu/dataset Table1RedBr.

Reci mi šta točno štampaš i onda ču ti moči bolje pomoći, možeš i na PM.

Citat:
dakle,podaci koji su u tabeli u 10 redu,da ih ja stampam u 2


Ako ti to znači da štampaš samo podatak u određenom REDU u tablici, onda ti onaj tvoj kod neče raditi, ili če štampati sve ili ništa.
[ popmilan76 @ 28.11.2013. 16:45 ] @
Baca gresku na ovaj deo table1redbr = frmpoj.edit1.text.....sve sam probao ,ali nece....ako stavim neki broj umesto edit,onda pokazuje taj red....
[ captPicard @ 28.11.2013. 18:55 ] @
Onda je definitivno problem koji sam ti gore naveo. Gdje pozivaš report? Pokaži cijeli kod gdje ga pozivaš.
[ popmilan76 @ 28.11.2013. 19:35 ] @
Ovako pozivam report......

procedure TFrmPoj.BitBtn1Click(Sender: TObject);
var
stampasvih : TRepOdjave;


begin
stampasvih := TRepOdjave.Create(nil);

try


stampasvih.Table1.Active := true;
stampasvih.Preview;

finally

stampasvih.free;

end;
end;

end.


i stavio sam onaj kod od pre u detailband before print.....to radi u aplikaciji bez ovih modalformi...
[ captPicard @ 28.11.2013. 22:32 ] @
Citat:
popmilan76:
Pokusao sam da to uradim vec u frmpoj,ali mi sada prikazuje samo praznu stranicu,samo sa zaglavljem.....

Code (delphi):
procedure TFrmPoj.BitBtn1Click(Sender: TObject);
var
  stampasvih : TRepOdjave;
begin
    stampasvih := TRepOdjave.Create(self);
  try
  if stampasvih.Table1RedBr.AsInteger   = strtoint(edit1.text) then
  begin
 stampasvih.qrdbtext1.Enabled := true;
end
else
begin
stampasvih.qrdbtext1.Enabled := false;
 end;
 stampasvih.preview;
  finally
       stampasvih.free;
     end;
end;

end.



A gdje otvaraš Table1?
[ popmilan76 @ 28.11.2013. 22:43 ] @
Stavim gore sa pocetka i taj kod ali opet nece....



stampasvih.Table1.Active := true;



I jos nesto,u vezi sa modalnim formama,kako refreshovati modalform,tj....kako refreshovati query.....da posle brisanja,nestanu delovi,koji su obrisani....znaci oni mi se pojavljuju u combobox1,ali kada izadjem pa udjem,oni nestanu...
[ popmilan76 @ 29.11.2013. 09:53 ] @
Ovo za refreshovanje sam provalio to mi ne treba......ostaje samo ovaj qreport......

takodje,koja je razlika izmedju show i showmodal,znam da se modalna ne moze skinuti,ona je u focusu dok se ne ide na close...samo me zanima jel bolje koristiti show ili showmodal,kao i sta se obino stavlje u create aplikation,self,nil ili aplication....pitam iz razloga jer mi je komplikovanije sa modal,moram u kodu da stavljam if shoemodal= ok then,vec hocu da u samoj toj aplikaciju,u njegovom buttonu stavljam event....

[Ovu poruku je menjao popmilan76 dana 29.11.2013. u 12:03 GMT+1]
[ captPicard @ 29.11.2013. 13:59 ] @

nil - specifies that no object owns the form - and therefore a developer (you) is responsible for freeing the created form (by calling myForm.Free when you no longer need the form)
Self - specifies the object in which the method is called. If, for example, you are creating a new instance of a TMyForm form from inside a Button's OnClick handler (where this button is placed on a MainForm) - self refers to "MainForm". Thus, when the MainForm is freed - it will also free "MyForm".
Application - specifies a global TApplication type variable created when you run your application. "Application" encapsulates your application as well as providing many functions that occur in the background of the program.


Code (delphi):
ShowModal = mrOk


Ne možeš na ovo gledati da li ti se da ili ne da pisati. Ako ti treba modalni rezultat onda moraš raditi tako, kako ti je netko od kolega bio napomenuo, na modalnoj formi postaviš button sa ModalResult = mrOk, mrCancel ili šta ti već treba.

Forme općenito
Communicating between forms
Forme

Za QR koristi Prevoew, PreviewModal sam skoro siguran da ti ne treba.

Mislim da moraš negdje malo pročitati/proučiti osnove jer ovako samo pogađaš i ustvari neznaš šta točno radiš, a to nije dobro, imati češ kasnije ozbiljnih problema. Prouči dobro gornje linkove i google is your friend :)

[ popmilan76 @ 29.11.2013. 14:54 ] @
Ma to je jesno,i pogledao sam...ja bih samo hteo da radim kao i do sada,znaci sa show,ali da mi forme ne budu u autocreate...da se ne kreiraju sve odjednom...imam par aplikacija koje dozvoljavam tako jer nemaju mnogo formi,ali neke preko 10 tak,moram ovako...I sta znaci modalna forma,jel ona samo za citanje ili ne....pozdrav
[ captPicard @ 29.11.2013. 15:52 ] @
Citat:
popmilan76: Ma to je jesno,i pogledao sam...ja bih samo hteo da radim kao i do sada,znaci sa show,ali da mi forme ne budu u autocreate...da se ne kreiraju sve odjednom...imam par aplikacija koje dozvoljavam tako jer nemaju mnogo formi,ali neke preko 10 tak,moram ovako...


Pa onda radi sa show ako želiš tako. Pitanje je šta ti treba a ne šta želiš. Show i ShowModal nema direktne veze sa time gdje se forma kreira. Opet bi ti citirao gornji post, isto kao i na ovo dolje pitanje. U linkovima imaš jako dobro opisano kako točno funkcioniraju modalne forme i čemu služe.

Citat:
popmilan76:I sta znaci modalna forma,jel ona samo za citanje ili ne....pozdrav


[ popmilan76 @ 01.12.2013. 17:42 ] @
Kako da u qreportu znam koji je koji red...dakle zelim da na recimo peti red,prikazem sedmi red iz tabele...izlistam jedan record u dbgridu,pomocu query i kada recimo kliknem na desni klik,i pokazem stampu,da izadje forma sa editom,u kojoj cu kucati taj red,recimo peti, koji treba da se prikaze,i da nista drugo ne bude prikazano sem petog reda,sa podacima iz dbgrida....Jel to moguce...