Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 30 odgovora
  • 6.504 pregleda

Najnovija ↓

DataSet i dinamicko kreiranje komponenti 04.12.2008. u 13:18 · pre 218 meseci #1
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?
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 13:26 · pre 218 meseci #2
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()
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 13:35 · pre 218 meseci #3
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
Potpis
ERROR974
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 13:45 · pre 218 meseci #4
@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..?
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 13:47 · pre 218 meseci #5
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.
Potpis
ERROR974
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:01 · pre 218 meseci #6
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
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:03 · pre 218 meseci #7
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;

Potpis
ERROR974
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:10 · pre 218 meseci #8
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?
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:13 · pre 218 meseci #9
Pogledaj svoj kod jos malo. Label ti nema name. Petlje treba da idu od 0 do nn-1
Potpis
ERROR974
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:14 · pre 218 meseci #10
@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...?
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:19 · pre 218 meseci #11
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;
Potpis
ERROR974
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 14:28 · pre 218 meseci #12
Petlja ne brise sve ostavi poslednje kreiranu komponentu
i pukne ranije navedenu gresku
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 15:14 · pre 218 meseci #13
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)
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 15:41 · pre 218 meseci #14
>>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:(
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 16:01 · pre 218 meseci #16
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.
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 16:45 · pre 218 meseci #17
>
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;
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 16:46 · pre 218 meseci #18
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;
Potpis
Don't worry be happy
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme