[ mr.zhile @ 04.12.2008. 12:18 ] @
Ideja je sledeca:
Kreirati komponte tipa TEdit, za dati sql text ,pri tome se misli na text tipa select* from + tabela
Sledecim kodom se kreiraju editi,ali problem nastaje kada se menjaju tabele,stari editi se ne brisu a novi se kreiraju
evo kodova kojima sam napravio edite i labele..
Kako da resim problem?
Code:

procedure TForm1.CreateFilter(Text:String;pnl:TPanel);
var
   i:Integer;
   ed:TEdit;
   lbl:TLabel;
   Compom:TComponent;
begin
   SimpleDataSet1.Open;
   for i := 0 to SimpleDataSet1.FieldCount - 1 do
      begin
         Compom := pnl.FindComponent('ed'+SimpleDataSet1.Fields[i].DisplayName);
         if Compom <> nil then
            Compom.Free;
            //Prvi malo elegantniji nacin
         with TEdit.Create(pnl) do
            begin
               Parent := pnl;
               Left := 10;
               Height := 20;
               Top := Height * i + 20;
               Name :='ed' + SimpleDataSet1.Fields[i].DisplayName;
               Text := '';
            end;

         with TLabel.Create(pnl) do
            begin
               Parent := pnl;
               Left := 10;
               Height := 20;
               Top := Height * i;
               Caption := SimpleDataSet1.Fields[i].DisplayLabel;
            end;

            { Drugi nacin

      ed := TEdit.Create(pnl);
         with ed do
            begin
               Parent := pnl;
               Left := 10;
               Height := 20;
               Top := Height * i + 20;
               Name :='ed' + SimpleDataSet1.Fields[i].DisplayName;
               Text := '';
            end;
      lbl := TLabel.Create(pnl);
         with lbl do
            begin
               Parent := pnl;
               Left := 10;
               Height := 20;
               Top := Height * i;
               Caption := SimpleDataSet1.Fields[i].DisplayLabel;
            end;           }
      end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   SQLConnection1.GetTableNames(ComboBox1.Items);
end;

procedure TForm1.OpenDataSet;
var
   TD:TTransactionDesc;
   SqlText,ObjName:String;
begin
   TD.TransactionID := 1;
   TD.IsolationLevel := xilREADCOMMITTED;

   SqlText := 'select * from $ObjName$';
   ObjName := ComboBox1.Text;
   SqlText := StringReplace(SqlText,'$ObjName$',ObjName,[]);

   SimpleDataSet1.Close;
   SimpleDataSet1.DataSet.CommandText := SqlText;

   SQLConnection1.StartTransaction(TD);
   SimpleDataSet1.Open;
   SQLConnection1.Commit(TD);
   cReateFilter(SqlText,pnlFilter);
end;

Dakle kreira nove ali ne brise stare?
[ mr.zhile @ 04.12.2008. 12:26 ] @
probao sami sa
Code:

   for i := 1 to pnl.ComponentCount-1  do
         pnl.Components[i].Free;

ali mi pukne gresku

List index out of Buonds()
[ Vic @ 04.12.2008. 12:35 ] @
probaj sa

forma.FindComponent('ed' + SimpleDataSet1.Fields.DisplayName).Free;

odnosno elegantnije napravi proceduru koja ce u sebi imati

forma.FindComponent(komponenta).free


pa iz petlje koja ti lista dataset polja pozivaj proceduru za brisanje istih
[ mr.zhile @ 04.12.2008. 12:45 ] @
@Vic
Hvala ti ali meni iste komponente brise ovaj kod
Code:

         Compom := pnl.FindComponent('ed'+SimpleDataSet1.Fields[i].DisplayName);
         if Compom <> nil then
            Compom.Free;

Da pojasnim treba mi procedura koja bi pre petlje "ocistila"panel od starih komponenti,i onda ukljucila petlju..?
[ Vic @ 04.12.2008. 12:47 ] @
Onda si mogao da sve te komponente stavis na jedan frame koji dinamicki kreiras. U tom slucaju bi mogao da ubijes frame pre petlje i kreiras ga ponovo. Posto vec koristis panel, probaj da ubijes ceo panel.
[ mr.zhile @ 04.12.2008. 13:01 ] @
E sad tek nece
pukne gresku access valitation....
Oivako sam probao da ubijem i napravim panel
Code:

   pnl.Free;
   pnl := TPanel.Create(Application);
   pnl.Visible := True;

E lupam glavu,a osecam da me neka sitnica pipi
[ Vic @ 04.12.2008. 13:03 ] @
Komponenta treba da ima svoj parent. Panelu je parent forma, a edit komponentama je parent Panel. Tu ti je problem.

Evo ti primer mog koda koji radi vec duze vreme (Tunos je Frame)


procedure TGlavna.Unostrebovanjapolinijama1Click(Sender: TObject);

begin
izmena:=false;
cleanFrames('unos');
unos:=Tunos.Create(self);
unos.Name:='unos';
unos.Parent:=panel1;
unos.Align:=alClient;
unos.initBUData(true);
end;

procedure TGlavna.cleanFrames(com:string);
var
i:integer;
begin
glavna.FindComponent(com).Free;
end;

[ mr.zhile @ 04.12.2008. 13:10 ] @
ma kad napisem
Pnl.parant := Form1
kreira panel ali bzvz neki panel...ne napravi ono sto ja hocu
Ma meni samo treba da ubijem kreirane edite,labele?
[ Vic @ 04.12.2008. 13:13 ] @
Pogledaj svoj kod jos malo. Label ti nema name. Petlje treba da idu od 0 do nn-1
[ mr.zhile @ 04.12.2008. 13:14 ] @
@Vic
Nikako se ne razumemo...ti mi uporno objasnjavaas kako d aizbrisem duplikate komponenti,ali ja sam to vec uradio,meni treba kako SVE komponente da izbrisem...?
[ Vic @ 04.12.2008. 13:19 ] @
Ne razumem o kojim duplikatima pricas. Ako ces da brises sve komponente, onda to radis kao i sto si napisao, samo kreces od 0

for i:=0 to Form(ili Panel).Components.count-1 do
form(ili Panel).Components.Free
end;
[ mr.zhile @ 04.12.2008. 13:28 ] @
Petlja ne brise sve ostavi poslednje kreiranu komponentu
i pukne ranije navedenu gresku
[ priki @ 04.12.2008. 14:14 ] @
prati malo sta se desava kad ih kreiras sa Owner-om i bez ownera

i oslobadjaj kreirane komponente sa:

Code:

if Assigned(compo) then
  FreeAndNil(compo)
[ mr.zhile @ 04.12.2008. 14:41 ] @
>>prati malo sta se desava kad ih kreiras sa Owner-om i bez ownera
Pa kad se kreira bez ownera komponenta se ne vidi...
NECE ni sa FreeAndNil da brise
NECE DA BRISE
[ priki @ 04.12.2008. 14:53 ] @
a jesi probao sa debug-erom i kako ti je namešten debug-er

ajde, postuj ceo unit
[ mr.zhile @ 04.12.2008. 15:01 ] @
jesam kako mi je namesten debuger klasicno,bez optimizacije,jer pratim broj komponenti...
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBXpress, StdCtrls, DB, SqlExpr, DBClient, SimpleDS, Grids,
  DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel2: TPanel;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    SimpleDataSet1: TSimpleDataSet;
    SQLConnection1: TSQLConnection;
    ComboBox1: TComboBox;
    pnlFilter: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure SimpleDataSet1BeforeOpen(DataSet: TDataSet);
  private
    { Private declarations }
  public
   procedure cReateFilter(Text:String;pnl:TPanel);
   procedure DeleteFilters(pnl:TPanel);
   procedure OpenDataSet;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CreateFilter(Text:String;pnl:TPanel);
var
   i:Integer;
   ed:TEdit;
   lbl:TLabel;
   Compom:TComponent;
begin
   for i := 0 to SimpleDataSet1.FieldCount - 1 do
      begin

      Compom := pnl.FindComponent('lb;'+SimpleDataSet1.Fields[i].DisplayName);
      if Compom <> nil then
            Compom.Free;

      lbl := TLabel.Create(pnl);
         with lbl do
            begin
               Parent := pnl;
               Left := 10;
               Top := 5;
               if i>0 then
               begin
                  Compom := pnl.FindComponent('ed'+SimpleDataSet1.Fields[i-1].DisplayName);
                  if Compom<>nil then
                     Top := ed.Top + ed.Height  + Height;
               end;
               Caption := SimpleDataSet1.Fields[i].DisplayLabel;
               Name := 'lbl' + SimpleDataSet1.Fields[i].DisplayName;
            end;

      Compom := pnl.FindComponent('ed'+SimpleDataSet1.Fields[i].DisplayName);

      if Compom <> nil then
         Compom.Free;

      ed := TEdit.Create(pnl);
         with ed do
            begin
               Parent := pnl;
               Left := 10;
               Height := 20;
               Top := lbl.Top+lbl.Height + Height  + 5;
               Name :='ed' + SimpleDataSet1.Fields[i].DisplayName;
               Text := '';
            end;

      end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   SQLConnection1.GetTableNames(ComboBox1.Items);
end;

procedure TForm1.OpenDataSet;
var
   TD:TTransactionDesc;
   SqlText,ObjName:String;
begin
   TD.TransactionID := 1;
   TD.IsolationLevel := xilREADCOMMITTED;

   SqlText := 'select * from $ObjName$';
   ObjName := ComboBox1.Text;
   SqlText := StringReplace(SqlText,'$ObjName$',ObjName,[]);

   SimpleDataSet1.Close;
   SimpleDataSet1.DataSet.CommandText := SqlText;

   SQLConnection1.StartTransaction(TD);
   SimpleDataSet1.Open;
   SQLConnection1.Commit(TD);

   cReateFilter(SqlText,pnlFilter);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
   OpenDataSet;
end;

procedure TForm1.SimpleDataSet1BeforeOpen(DataSet: TDataSet);
begin
   DeleteFilters(pnlFilter);
end;

procedure TForm1.DeleteFilters(pnl: TPanel);
var
   i,c:integer;
begin
   if pnl.ComponentCount>0 then
   for i := 0 to pnl.ComponentCount-1  do
   begin
      c:=i;//kad je i = pnl.ComponentCount - 2 pukne posle sledece linije 
      pnl.Components[i].Free;
      c := pnl.ComponentCount;
   end;
end;

end.
[ mr.zhile @ 04.12.2008. 15:45 ] @
>
Problem je u tome nece da brise komponente tipa TEdit,labele izbrise,a edite
nece
kompajliranjem sledecim kodom sam utvrdio to
Code:

   if pnl.ComponentCount>0 then
   for i := 0 to pnl.ComponentCount-1  do
   begin
      if (pnl.Components[i] is TEdit) then
         (pnl.Components[i] as TEdit).Free;
      if (pnl.Components[i] is TLabel) then
         (pnl.Components[i] as TLabel).Free;
   end;
[ mr.zhile @ 04.12.2008. 15:46 ] @
Problem je u tome nece da brise komponente tipa TEdit,labele izbrise,a edite nece
kompajliranjem sledecim kodom sam utvrdio to
Code:

   if pnl.ComponentCount>0 then
   for i := 0 to pnl.ComponentCount-1  do
   begin
      if (pnl.Components[i] is TEdit) then
         (pnl.Components[i] as TEdit).Free;
      if (pnl.Components[i] is TLabel) then
         (pnl.Components[i] as TLabel).Free;
   end;
[ mr.zhile @ 04.12.2008. 18:03 ] @
>

AJOJ ljudi POMOZITE MI ponovo sam sve napravio i nece da brise komponente
tip TEdit
[ mr.zhile @ 04.12.2008. 18:26 ] @
NARODE ULOG mi je mnogo velik za ovaj program...Please pomoc da dodjem do resenja
[ priki @ 04.12.2008. 18:46 ] @
ako vec prosledjujes panel,
zasto pre kreiranja TEDit komponenti ne kreiras jos jedan panel na tom prosledjenom panelu
i onda na tom novom panelu kreiras TEdit komponente

i onda kad pozoves free tog panela, novog, sve komponente koji je on vlasnik ce ti se unistiti
i tako u krug



[Ovu poruku je menjao priki dana 04.12.2008. u 20:00 GMT+1]
[ mr.zhile @ 04.12.2008. 18:57 ] @
@piki
Stani,da te razumem...da panel..u mom slucaju pnl...bude perent novog panela? a to mislis za sve i labele i edite ili samo edite?
[ priki @ 04.12.2008. 19:04 ] @
da, pnl da bude parent tvog novog panela
koje komponente, pa sve one koje treba da se kreiraju i oslobadjaju u runtime-u
[ savkic @ 04.12.2008. 19:45 ] @
Zapravo je vrlo jednostavno umesto for i := 0 to Count -1, koristi:
1) for i := Count - 1 downto 0 do
2) while Count > 0 do
[ Rapaic Rajko @ 04.12.2008. 21:30 ] @
Zhile, ovako nesto ce da radi:

Code:

while pnl.ComponentCount > 0 do
  pnl.Components[0].Free;


Treba malo znati i kako rade komponenti.
Prilikom kreiranja komponenta, ako mu prosledimo Owner-a (u konstruktoru), komponent sam sebe ubacuje u Components listu owner-a, samim tim i uvecava ComponentCount za 1.
Po istoj analogiji, kad se komponent unistava, on sam sebe izbaci iz liste Components svog owner-a (ako ga ima), sto automatski spusta ComponentCount za 1.

Rajko
[ franjo_tahi @ 05.12.2008. 10:00 ] @
Postoji i drugačiji pristup:

kreiraš public varijablu:

Code:

var
   SviEdit: array of TDBEdit;


u proceduri u kojoj kreiraš nove edit-t, najprije brišeš stare:

Code:

procedure TForm1.CreateFilter(Text:String;pnl:TPanel);
var
   i: integer;
   mtd: TDBEdit;
begin
   for i := 0 to Length(SviEdit)-1 do
      SviEdit[i].Free;

   SetLength(SviEdit, 0);

  ...



kontrole kreiraš kao i prije, samo nakon kreiranja kontrole dodaš npr...

Code:

      ...
      mtd := TDBEdit.Create;
      SetLength(SviEdit, Length(SviEdit)+1);
      SviEdit[Length(SviEdit)-1] := mtd
      ...


ista priča je s TLabel ili što već treba...
[ mr.zhile @ 05.12.2008. 11:15 ] @
Hvala svima na nesebicnim saetima...resio sam ovaj ,inace 1.deo problema...kreiranjem novog panela,na kom se nalaze editi,i labele...
2.takodje bitan deo problem ja sledeci...kreirani editi treba da budu filteri dataseta...odnosno treba proci kroz sve njih..utvrditi koji je za koje polje povezan...a onda napisati like upit..
Neznam kako da ih prodjem..
a uradio sam nekke funkcije kojima bi formirao like upit...evo koda funkcija
Code:



function TForm1.AddLike(Text: String; Field: TField): String;
var
   NotNoting : Boolean;
   NuChangeField:Integer;
begin
   if Text <> '' then
      NotNoting := True
   else
      NotNoting := False;

   if NotNoting then
      begin
         Inc(NuChangeField);
         Result := GetNuChangeField(NuChangeField) + Field.FieldName + ' like ' + QuotedStr('%' + Text + '%');
      end;
end;
function TForm1.GetNuChangeField(Number:Integer):String;
var
   Text:String;
begin
   if Number = 1 then
      Text := ' where '
   else if Number >= 2 then
      Text := ' and ';
end;
//ovo je neki iniicijalni kod funkcije koja bi prolazila kroz edite..
function TForm1.Condition(Sender: TObject; Feild: TField): String;
var
   CurrEdit:TEdit;
begin
   if ( Sender is TEdit ) then
      CurrEdit :=

end;

Opet trebam pomoc
[ mr.zhile @ 05.12.2008. 11:44 ] @
Code:

   for i := 0 to Form1.ComponentCount-1 do
      if ( Components[i] is TEdit ) then 
         ............
ovim kodom se kreecem kroz edit kontrole date forme...
kako da se kod prosledi promenljivoj
Code:

 Components[i] as TEdit 
[ Rapaic Rajko @ 05.12.2008. 23:42 ] @
Zhile, evo resenja. Predlazem da prosirimo ideju tahi-ja sa array-em, ali malo poboljsanu:

Prvo, deklarisemo jedan tip record-a

Code:

TFilterEditRec = record
  Edit: TEdit;
  Label: TLabel;
  FieldName: string;
end;  


Drugo, deklarisemo array ovih record-a, ali ne kao global, vec u private delu forme

Code:

private
  fEditArray: array of TFilterEditRec;


Trece, sledi prepravljena tvoja metoda za kreiranje edit-a

Code:

procedure TForm1.CreateFilter(Text:String;pnl:TPanel);
var
   i:Integer;
   ed:TEdit;
   lbl:TLabel;   
begin
  SetLength(fEditArray, SimpleDataSet1.FieldCount);

  for i := 0 to SimpleDataSet1.FieldCount - 1 do
  begin            
     lbl := TLabel.Create(pnl);
     with lbl do
     begin
       Parent := pnl;
       Left := 10;
       Top := 5;
       if i > 0 then
       begin
         Compom := pnl.FindComponent('ed'+SimpleDataSet1.Fields[i-1].DisplayName);
         if Compom <> nil then
           Top := ed.Top + ed.Height  + Height;
       end;
       Caption := SimpleDataSet1.Fields[i].DisplayLabel;
       Name := 'lbl' + SimpleDataSet1.Fields[i].DisplayName;
     end;
   
     ed := TEdit.Create(pnl);
     with ed do
     begin
       Parent := pnl;
       Left := 10;
       Height := 20;
       Top := lbl.Top+lbl.Height + Height  + 5;
       Name := 'ed' + SimpleDataSet1.Fields[i].DisplayName;
       Text := '';
     end;

     with fEditArray[i] do
     begin  
       Edit := ed;
       Label := lbl;
       FieldName := SimpleDataSet1.Fields[i].FieldName; // ili DisplayName ?
     end;
  end;
end;


I cetvrto (poslednje) kako brisemo edite i labele pomocu ovog array-a

Code:

for i := 0 to length(fEditArray) - 1 do // moze i ovako: for i := low(fEditArray) to high(fEditArray) do
  with fEditArray[i] do
  begin
    Edit.Free;
    Label.Free;
  end;  

SetLength(fEditArray, 0); // ovo brise same record-e


To bi, mislim, bilo to.
Pozdrav

Rajko
[ mr.zhile @ 06.12.2008. 01:13 ] @
>

@Rajko
HVALA
resio sam problem sa kreiranje i rbrisanjem....
mene mnogo vise muci kako da izgleda akcija kojom bi se sql kodu dodao where
uslov...a kada se 1.put otvori da se kreiraju labele,editi..a svaki sledeci
put da se kreiranje ignorise...
probaosam ovako,ali tu koristim 2 akcije,a treba jedna...
Code:


//NuOpen je private promenljivatipa integer

procedure TForm1.OpenDataSet;
var
   TD:TTransactionDesc;
   SqlText,ObjName:String;
begin

   Inc(NuOpen);

   TD.TransactionID := 1;
   TD.IsolationLevel := xilREADCOMMITTED;

   SqlText := 'select * from $ObjName$';
   ObjName := ComboBox1.Text;
   SqlText := StringReplace(SqlText,'$ObjName$',ObjName,[]);

   if NuOpen >= 2 then
      SqlText := SqlText+AddLike;

   SimpleDataSet1.Close;
   SimpleDataSet1.DataSet.CommandText := SqlText;

   SQLConnection1.StartTransaction(TD);
   SimpleDataSet1.Open;

   if SimpleDataSet1.RecordCount = 0 then
      begin
         SQLConnection1.Rollback(TD);
         acPregled.Execute;
      end
   else
      SQLConnection1.Commit(TD);

   if NuOpen = 1 then
      cReateFilter( SqlText , pnlFilter );
end;

function TForm1.Condition(Sender: TObject): String;
var
   CurrEdit:TEdit;
   CuName,Text:String;
begin
   if ( Sender is TEdit ) then
      CurrEdit := TEDit(Sender);
   if CurrEdit.Text <> '' then
      begin
         Inc(NuChangeField);

         if NuChangeField = 1 then
            Text := ' where '
         else if NuChangeField >= 2 then
            Text := ' and ';

         CuName := CurrEdit.Name;
         Delete( CuName , 1 , 2 );

         Result := Result + Text + CuName + ' like ' + QuotedStr('%' +
CurrEdit.Text + '%');
      end
end;


Function TForm1.AddLike:String;
var
   i: integer;
begin
   i := 0;
   NuChangeField := 0;
   while pnlFilter.ComponentCount > i do
      begin
         if pnlFilter.Components[i] is TEdit then
            Result :=  Condition(pnlFilter.Components[i]);
         Inc( i );
      end;

end;

procedure TForm1.acPregledExecute(Sender: TObject);
begin
   NuOpen := 0;
   OpenDataSet;
end;

procedure TForm1.acFilterExecute(Sender: TObject);
begin
   OpenDataSet;
end;
[ mr.zhile @ 06.12.2008. 13:24 ] @
>
POMOC LJUDI
kako da izgleda akcija kojom bi se razlikovalo dal je 1. put otvoren
dataset,odnosno kojom bi se 1. pput dataset otvorio da bi formirao edite,a
svaki naredni put da bi se filterao,a sve to jedna akcija da obavi