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.484 pregleda

Najnovija ↓

Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 19:46 · pre 218 meseci
izmenjeno 1 put, poslednji put priki 04.12.2008. u 20:00
  1. priki04.12.2008. u 20:00zapis iz teksta poruke
#21
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
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 19:57 · pre 218 meseci #22
@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?
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 20:04 · pre 218 meseci #23
da, pnl da bude parent tvog novog panela
koje komponente, pa sve one koje treba da se kreiraju i oslobadjaju u runtime-u
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 20:45 · pre 218 meseci #24
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
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: DataSet i dinamicko kreiranje komponenti 04.12.2008. u 22:30 · pre 218 meseci #25
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
Re: DataSet i dinamicko kreiranje komponenti 05.12.2008. u 11:00 · pre 218 meseci #26
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...
Re: DataSet i dinamicko kreiranje komponenti 05.12.2008. u 12:15 · pre 218 meseci #27
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
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 05.12.2008. u 12:44 · pre 218 meseci #28
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 
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 06.12.2008. u 00:42 · pre 217 meseci #29
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
Re: DataSet i dinamicko kreiranje komponenti 06.12.2008. u 02:13 · pre 217 meseci #30
>

@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;
Potpis
Don't worry be happy
Re: DataSet i dinamicko kreiranje komponenti 06.12.2008. u 14:24 · pre 217 meseci #31
>
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
Potpis
Don't worry be happy
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme