PDA

View Full Version : تعیین فرمهای باز برنامه و...(یه کم تخصصی)



MOHSEN731
دوشنبه 15 فروردین 1384, 01:41 صبح
با سلام
دو سوال فوری از دوستان :
1-چگونه می توان در یک فرم تعداد و نام یک کامپوننت مثلا edit را بدست آورم ?
2-چگونه می توان فهمید در برنامه چند فرم و چه فرمهایی باز است?
ممنون از راهنماییتان

مهدی کرامتی
دوشنبه 15 فروردین 1384, 02:47 صبح
اینطوری:

procedure TForm1.Button1Click(Sender: TObject);
var
iCounter:integer;
tmpForm:TForm;
begin
for iCounter :=0 to Application.ComponentCount-1 do
if Application.Components[iCounter] is TForm then
begin
tmpForm := TForm(Application.Components[iCounter]);
ListBox1.Items.Add(tmpForm.Name+' , Showing: '+ BoolToStr(tmpForm.Showing,True));
end;
end;
بهمین روش میتونی تعداد و نام عناصر بخصوصی بر روی فرم رو پیدا کنی. اگر پیدا نکردی بگو تا برات بنویسم.

vcldeveloper
دوشنبه 15 فروردین 1384, 03:58 صبح
-چگونه می توان در یک فرم تعداد و نام یک کامپوننت مثلا edit را بدست آورم ?


procedure TForm1.btn3Click(Sender: TObject);
var
i : word;
begin
for i := 0 to Form1.ComponentsCount-1 do
if Form1.Components[i] is TEdit then
ListBox1.Items.Add(Form1.Components[i].Name);
end;



-چگونه می توان فهمید در برنامه چند فرم


function GetFormsCount: word;
var
i : word;
begin
Result := 0;
for i := 0 to Application.ComponentCount-1 do
if Application.Components[i] is TForm then
Result := Result + 1;
end;


و چه فرمهایی باز است


if TWinControl(Application.Components[i]).Showing then
ShowMessage('Form ' + Application.Components[i].Name + ' is showing');

MOHSEN731
چهارشنبه 17 فروردین 1384, 23:53 عصر
آقای کرامتی من سورس شما را به سورس زیر تغییر دادم تا بجای نمایش اینکه کدام فرمها باز است فرمهای باز را از حافظه خالی کند ولی در هنگام اجرای برنامه خطای [List Index Out of Bounds [5 می دهد ولی وقتی به جای tmpForm.Free دستور tmpForm.Close را می گزارم همه فرمها بسته شده و خطای نمی دهد ولی همچنان در حافظه برنامه من فعال است و حافظه اشغال کرده است در کل آیا راهی وجود دارد که حافظه اشتغال شده توسط همه فرمهای برنامه غیر از mainForm آزاد شود؟



var
iCounter:integer;
tmpForm:TForm;
begin
for iCounter := 0 to Application.ComponentCount-1 do
if Application.Components[iCounter] is TForm then
begin
tmpForm := TForm(Application.Components[iCounter]);
if tmpForm <> Application.MainForm then tmpForm.Free;
end;
end;
با تشکر

مهدی کرامتی
پنج شنبه 18 فروردین 1384, 01:55 صبح
از اونجاییکه حال ندارم چیزی رو که میگی بنویسم نمونه چیزی رو که نوشتی ضمیمه کن تا چک اش کنم.

vcldeveloper
پنج شنبه 18 فروردین 1384, 02:23 صبح
در هنگام اجرای برنامه خطای [List Index Out of Bounds [5 می دهد ولی وقتی به جای tmpForm.Free دستور tmpForm.Close را می گزارم همه فرمها بسته شده و خطای نمی دهد
با هربار اجرای دستور tmpForm.Free یک واحد از Application.ComponentCount کم میشه، درحالی که یک واحد به iCounter اضافه میشه! در نتیجه فاصله مقادیر پایین و بالای حلقه for با آزاد کردن هر فرم به هم نزدیکتر میشند، تا جایی که مقدار iCounter مساوی Application.ComponentCount میشه و Exception مورد نظر رخ میده.
برای رفع این مشکل یک راه حل اینه که از حلقه ای غیر از for بصورت زیر استفاده کنی:


var
iCounter:integer;
tmpForm:TForm;
begin
iCounter := 0;
while iCounter < Application.ComponentCount do
begin
if Application.Components[iCounter] is TForm then
begin
tmpForm := TForm(Application.Components[iCounter]);
if tmpForm <> Application.MainForm then
begin
tmpForm.Free;
//To prevent "List index out of bounds"
Dec(iCounter);
end;
end;
Inc(iCounter);
end;
end;

DelphiMan
پنج شنبه 18 فروردین 1384, 22:26 عصر
ولی وقتی به جای tmpForm.Free دستور tmpForm.Close را می گزارم همه فرمها بسته شده و خطای نمی دهد ولی همچنان در حافظه برنامه من فعال است و حافظه اشغال کرده است در کل آیا راهی وجود دارد که حافظه اشتغال شده توسط همه فرمهای برنامه غیر از mainForm آزاد شود؟


بجای free از release استفاده کنید.