Bir procedure yazdim kodu kisaltmak icin, bazi sorunlar yaratiyor ve sormak istedigim bir takim sorular var yardimci olabilirseniz sevinirim.
Formlarim hep ayni kodlarla aciliyor degisen tek $ey ise isimler, o yuzden asagidaki procedure'u kullanarak formlari aciyorum.. Gorudgunuz uzere bahsi gecen 2 tane procedure'um var..
1. FormAc
2. FormAc'in icinde kullandigi AciksaKapat fonksiyonu..
AciksaKapat'i ekliyorum cunku ayni formun 2 kere acilmasini istemiyorum,
ve her acildiginda Anaformumdaki AcikFormlar isimli TList'ime formumu ekliyorum ki acik olan formlarimi gorebilmek icin..
Kod: Tümünü seç
anaform.AcikFormlar.Add(xForm);
Kod: Tümünü seç
procedure FormAc(xSenderForm: TForm; xSenderEdit: TcxButtonEdit; xKontrolEdit: TCxButtonEdit; xSQL : TStringList; xClassName : TFormClass;
xFormStyle : TFormStyle; xVariables : TStringList; xValues : array of Variant);
var
xQuery : TAdoQuery;
xForm : TForm;
i : integer;
begin
AciksaKapat(xClassName.ClassName, True);
xForm := xClassName.Create(xSenderForm);
anaform.AcikFormlar.Add(xForm);
xQuery := TADOQuery(xForm.FindComponent('ListeQuery'));
xQuery.Close;
xQuery.SQL.Clear;
xQuery.SQL.Text := xSQL.Text;
xQuery.Active := True;
if (xSenderEdit <> nil) then
begin
SetObjectProp(xForm, '_xGonderenEdit', xSenderEdit);
end;
if (xKontrolEdit <> nil) then
begin
SetObjectProp(xForm, '_xKontrolEdit', xKontrolEdit);
end;
if (xVariables <> nil) then
begin
For i := 0 to xVariables.Count-1 do
begin
SetPropValue(xForm, xVariables[i], xValues[i]);
end;
end;
if (xFormStyle = FsNormal) then
begin
xForm.FormStyle := FsNormal;
xForm.WindowState := WsNormal;
xForm.Position := PoScreenCenter;
xForm.Visible := False;
xForm.ShowModal;
exit;
end else
if (xFormStyle = FsMdiChild) then
begin
xForm.FormStyle := FsMdiChild;
xForm.Show;
exit;
end;
end;
Kod: Tümünü seç
procedure AciksaKapat(xClassName : string);
var
i : integer;
begin
if anaform.AcikFormlar.Count = 0 then exit;
for i := 0 to AcikFormlar.Count-1 do
begin
if TForm(AcikFormlar[i]).ClassName = xClassName then
begin
TForm(AcikFormlar[i]).Close;
break;
end;
end;
end;
Ve bunu her kullanan formumun OnClose eventine, Asagidaki kodu ekliyorum.
Kod: Tümünü seç
Anaform.AcikFormlar.Remove(self);
Action := CaFree;
Self := nil;
Kod: Tümünü seç
var
xValues : array of Variant;
begin
strSQL.Text := 'SELECT * FROM CH';
Formlar.FormAc(Self, nil, nil, StrSQL, TChKart, FsMdiChild, nil, xValues);
end;
Ancak anlayamadigim, bu kod bazen access violation hatasi veriyor. Bazen ise vermiyor.. Sebepleri ne olabilir? Ayrica bu kod cok isime yariyor, ama sizce memory leak vs gibi sorunlar cikarir mi?
Sorum biraz uzun oldu, ama benim icin cok onemli birsey, umarim yardimci olursunuz..
Simdiden tesekkür ederim, herkese kolay gelsin, iyi calismalar.