|
[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|