PDA

View Full Version : مشکل در پيدا کردن عناصر



h_mohamadi
پنج شنبه 12 بهمن 1391, 08:07 صبح
من يک سئوال داشتم که اين بود
من يک برنامه دارم که در آن تعداد عناصر خيلي زياد است و مي خواهم ببينم آيا دستوري وجود دارد که با نوشتم آن بدون بردن نام عناصر خواص آنها را تغيير دهم
مثلا با آن دستور بتوانم اگر 20 تا استرين گريد در فرم است که يک سري از آنها در پنل هاي مختلفي در فروم من هستند و من مي خواهم بگويم تمام استرين گريدها عرض ستون و ارتفاع ستون آنها تغييرکند و يا 100 تا مسک اديت را خاصيت اتو سايز آنها را عوض کنم
من يک نمونه از دستوراتم گذاشته ام
لطفا من را راهنمايي فرمائيد

hossein_h62
پنج شنبه 12 بهمن 1391, 09:08 صبح
سلام
مثلا اگر خاصیت AutoSize همه MaskEdit هاتون رو بخواین True کنید :
with Form1 do
for I := 0 to ComponentCount - 1 do
if Components[I] is TMaskEdit then
TMaskEdit(Components[I]).AutoSize := True;

h_mohamadi
پنج شنبه 12 بهمن 1391, 09:59 صبح
سلام
مثلا اگر خاصیت AutoSize همه MaskEdit هاتون رو بخواین True کنید :
with Form1 do
for I := 0 to ComponentCount - 1 do
if Components[I] is TMaskEdit then
TMaskEdit(Components[I]).AutoSize := True;

ممنونم ولي مشکل من اين است که MaskEdit هايي که داخل پنل است را نمي شناسد

hossein_h62
پنج شنبه 12 بهمن 1391, 10:10 صبح
ممنونم ولي مشکل من اين است که MaskEdit هايي که داخل پنل است را نمي شناسد
این کد تمام MaskEdit هارو تحت تاثیر قرار میده چه در پنل باشند چه نباشن!

BORHAN TEC
پنج شنبه 12 بهمن 1391, 10:44 صبح
ممنونم ولي مشکل من اين است که MaskEdit هايي که داخل پنل است را نمي شناسد
شما از کدام نسخه دلفی استفاده می کنید؟ کدی که جناب hossein_h62 قرار دادن را من در XE3 تست کردم و بدون هیچ مشکلی کار می کرد. حتی اگر 10 تا پنل هم روی هم قرار دهید و در آخری یک MaskEdit باشد کد ایشان تمام کنترلها را پیمایش می کند.

h_mohamadi
پنج شنبه 12 بهمن 1391, 10:59 صبح
شما از کدام نسخه دلفی استفاده می کنید؟ کدی که جناب hossein_h62 قرار دادن را من در XE3 تست کردم و بدون هیچ مشکلی کار می کرد. حتی اگر 10 تا پنل هم روی هم قرار دهید و در آخری یک MaskEdit باشد کد ایشان تمام کنترلها را پیمایش می کند.

من از دلفي 7 استفاده کردم و در سيستم من تعداد استرين گريد را 0 مي دهد چون هيچ استرين گريدي روي فروم نيست

hossein_h62
پنج شنبه 12 بهمن 1391, 11:39 صبح
من از دلفي 7 استفاده کردم و در سيستم من تعداد استرين گريد را 0 مي دهد چون هيچ استرين گريدي روي فروم نيست
در اون کدی که شما در برنامتون نوشتین بجای TControl از TComponent استفاده کنید جواب میده. یعنی کدتون بصورت زیر میشه :
procedure TForm1.Button1Click(Sender: TObject);
var i,J:Integer;
begin
J:=0;
for i:=0 to ControlCount-1 do
with Controls[i] Do
begin
if ClassName=TStringGrid.ClassName then
J:=J+1;
end;
ShowMessage(IntToStr(J));
end;

h_mohamadi
پنج شنبه 12 بهمن 1391, 12:56 عصر
ممنونم از راهنمايي دوستان خوبم مشکلم حل شد

SayeyeZohor
یک شنبه 15 بهمن 1391, 20:45 عصر
می تونی از این کد که نوشتم استفاده کنی دیگه هرجا هر چی بخوای جواب می ده
کلاْ برای داینامیک کردن خوبه :چشمک:

TYPE
TModifyComponentMethod = PROCEDURE(AComponent: TComponent) OF OBJECT;


PROCEDURE TForm1.NewFindComponent(NForm: TCustomForm; CompType: TComponentClass; List: TList; AllForm: Boolean);
var
I, J: Integer;
FormName, FormComp: TComponent;
BEGIN
List.Clear;
FOR I := 0 to Application.ComponentCount - 1 DO
FOR J := 0 to Application.Components[I].ComponentCount - 1 do
BEGIN
FormName := Application.Components[I]; // نام فرم هاي موجود در پروژه ...
FormComp := Application.Components[I].Components[J];
// نام كامپوننت هاي موجود در فرم ها ...
IF AllForm THEN
BEGIN
If (FormComp is CompType) then List.Add(FormComp);
END
ELSE
BEGIN
If (FormName = NForm) AND (FormComp is CompType) then List.Add(FormComp);
END;
END;
END;
PROCEDURE TForm1.ModifyComponents(NForm: TCustomForm; CompType: TComponentClass; Method: TModifyComponentMethod; AllForm: Boolean);
var
List: TList;
I: Integer;
BEGIN
List := TList.Create;
NewFindComponent(NForm, CompType, List, AllForm);
For I := 0 to List.Count - 1 Do Method(TComponent(List[I]));
FreeAndNil(List); //{OR} List.Free;
END;

PROCEDURE TForm1.ChangeSizes(AComponent: TComponent);
BEGIN
// كردن Left To Right براي ...
TEdit(AComponent).Width := 121;
TEdit(AComponent).BiDiMode := bdRightToLeft;
END;


procedure TForm1.FormCreate(Sender: TObject);
begin
ModifyComponents(Form1, TEdit, ChangeSizes, False);
end;

یوسف زالی
یک شنبه 15 بهمن 1391, 21:26 عصر
کد شما مشکل ساختاری داره.
اگر روی panel یک panel باشه که روش یک panel باشه و توش دکمه باشه چی می شه؟
برای این کارها باید از روشهایی مثل بازگشتی استفاده کرد.

SayeyeZohor
دوشنبه 16 بهمن 1391, 18:02 عصر
کد شما مشکل ساختاری داره.
اگر روی panel یک panel باشه که روش یک panel باشه و توش دکمه باشه چی می شه؟
برای این کارها باید از روشهایی مثل بازگشتی استفاده کرد.

جواب میده عزیز

یوسف زالی
دوشنبه 16 بهمن 1391, 21:44 عصر
بله حواسم نبود.
اما روش اصولی و صحیحش این هست:


procedure DoForEvery(HostComponent: TComponent; ClassType: TComponentClass; DoWhat: TNotifyEvent);
var
i: integer;
begin
for i := 0 to HostComponent.ComponentCount -1 do
begin
DoForEvery(HostComponent.Components[i], ClassType, DoWhat);
if HostComponent.Components[i] is ClassType then
DoWhat(HostComponent.Components[i]);
end;
end;


مثال:


TForm1 = class(TForm)
.
.
procedure Button1Click(Sender: TObject);
private
procedure ChangeWidth(Sender: TObject);
public
{ Public declarations }
end;
.
.
procedure TForm1.ChangeWidth(Sender: TObject);
begin
if Sender is TEdit then
TEdit(Sender).Width := 150;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DoForEvery(Application {or Self}, TEdit, ChangeWidth);
end;

gholami146
سه شنبه 24 بهمن 1391, 12:33 عصر
// uses TYPINFO,Controls
procedure TForm1.SetProperties(ClassName,

SomeProperty: string; Value: Integer);
var
i: integer;
PropInfo: PPropInfo;
Component: TComponent;
begin
for i := 0 to ComponentCount - 1 do
begin
Component := Components[i];
if (Component is TControl) and ((Component.ClassName = ClassName)
or (ClassName = 'AllComponents')) then
begin
PropInfo := GetPropInfo(Component.ClassInfo, SomeProperty);
if Assigned(PropInfo) then
SetOrdProp(Component, PropInfo, Integer(Value));
end;
end;
end;

// Examples, Beispiele:

procedure TForm1.Button1Click(Sender: TObject);
begin
// Make all components readonly
SetProperties('AllComponents', 'readonly', 1);
// Make all components of Class TEdit invisible
SetProperties('TEdit', 'visible', 0);
// Set the Height Property of all TLabels
SetProperties('TLabel', 'Height', 30);
// Set ShowHint to false for all components
SetProperties('AllComponents', 'ShowHint', 0);
// Disable all TMemo Components
SetProperties('TMemo', 'Enabled', 0);
// Set Autosize to true for all TLabels
SetProperties('TLabel', 'Autosize', 1);
end;