Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

DataSet i dinamicko kreiranje komponenti

[es] :: Pascal / Delphi / Kylix :: DataSet i dinamicko kreiranje komponenti

Strane: 1 2

[ Pregleda: 4326 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon DataSet i dinamicko kreiranje komponenti04.12.2008. u 12:18 - pre 187 meseci
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?
Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 12:26 - pre 187 meseci
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()
Don't worry be happy
 
Odgovor na temu

Vic
Error974
BI&SE
Beograd

Član broj: 16118
Poruke: 396
194.106.185.*



+49 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 12:35 - pre 187 meseci
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
ERROR974
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 12:45 - pre 187 meseci
@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..?
Don't worry be happy
 
Odgovor na temu

Vic
Error974
BI&SE
Beograd

Član broj: 16118
Poruke: 396
194.106.185.*



+49 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 12:47 - pre 187 meseci
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.
ERROR974
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:01 - pre 187 meseci
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
Don't worry be happy
 
Odgovor na temu

Vic
Error974
BI&SE
Beograd

Član broj: 16118
Poruke: 396
194.106.185.*



+49 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:03 - pre 187 meseci
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;


ERROR974
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:10 - pre 187 meseci
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?
Don't worry be happy
 
Odgovor na temu

Vic
Error974
BI&SE
Beograd

Član broj: 16118
Poruke: 396
194.106.185.*



+49 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:13 - pre 187 meseci
Pogledaj svoj kod jos malo. Label ti nema name. Petlje treba da idu od 0 do nn-1
ERROR974
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:14 - pre 187 meseci
@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...?
Don't worry be happy
 
Odgovor na temu

Vic
Error974
BI&SE
Beograd

Član broj: 16118
Poruke: 396
*.imlek.co.yu.



+49 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:19 - pre 187 meseci
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;
ERROR974
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 13:28 - pre 187 meseci
Petlja ne brise sve ostavi poslednje kreiranu komponentu
i pukne ranije navedenu gresku
Don't worry be happy
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.datalab.si.

ICQ: 174153511


+26 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 14:14 - pre 187 meseci
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)
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 14:41 - pre 187 meseci
>>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
Don't worry be happy
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.datalab.si.

ICQ: 174153511


+26 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 14:53 - pre 187 meseci
a jesi probao sa debug-erom i kako ti je namešten debug-er

ajde, postuj ceo unit
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 15:01 - pre 187 meseci
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.

Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
*.com
Via: [es] mailing liste



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 15:45 - pre 187 meseci
>
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;

Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 15:46 - pre 187 meseci
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;

Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
*.com
Via: [es] mailing liste



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 18:03 - pre 187 meseci
>

AJOJ ljudi POMOZITE MI ponovo sam sve napravio i nece da brise komponente
tip TEdit
Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.177.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 18:26 - pre 187 meseci
NARODE ULOG mi je mnogo velik za ovaj program...Please pomoc da dodjem do resenja
Don't worry be happy
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: DataSet i dinamicko kreiranje komponenti

Strane: 1 2

[ Pregleda: 4326 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.