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: 4321 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

priki

Član broj: 24732
Poruke: 700
*.dial-up.dsl.siol.net.

ICQ: 174153511


+26 Profil

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

priki

Član broj: 24732
Poruke: 700
*.dial-up.dsl.siol.net.

ICQ: 174153511


+26 Profil

icon Re: DataSet i dinamicko kreiranje komponenti04.12.2008. u 19:04 - pre 187 meseci
da, pnl da bude parent tvog novog panela
koje komponente, pa sve one koje treba da se kreiraju i oslobadjaju u runtime-u
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

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

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.dynamic.sbb.rs.



+62 Profil

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

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

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

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.44.*



+2 Profil

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

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.44.*



+2 Profil

icon Re: DataSet i dinamicko kreiranje komponenti05.12.2008. u 11:44 - pre 187 meseci
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 

Don't worry be happy
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.dynamic.sbb.rs.



+62 Profil

icon Re: DataSet i dinamicko kreiranje komponenti05.12.2008. u 23:42 - pre 187 meseci
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
 
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 komponenti06.12.2008. u 01:13 - pre 187 meseci
>

@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;

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 komponenti06.12.2008. u 13:24 - pre 187 meseci
>
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
Don't worry be happy
 
Odgovor na temu

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

Strane: 1 2

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

Postavi temu Odgovori

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