PDA

View Full Version : create کردن آرایه از جنس button



mohammady2
سه شنبه 09 بهمن 1386, 07:08 صبح
create کردن آرایه از جنس دکمه ==> لطفا اگر اطلاعی در مورد نحوه create کردن یک آرایه از جنس button دارید من رو راهنمایی کنید .ممنون

SYNDROME
سه شنبه 09 بهمن 1386, 08:07 صبح
برای تعریف آرایه از دکمه به شکل زیر عمل کنید.


var
a :Array[1..2] OF TButton;

و سپس به شکل زیر Create کنید.


a[1] := TButton.Create(Owner);

موفق باشید

vcldeveloper
سه شنبه 09 بهمن 1386, 08:08 صبح
آرایه رو Create نمی کنند، هر یک از اعضای آن را Create می کنند:


var
i : integer;
A : array [1..5] of TButton;
begin
for i:= 1 to 5 do
A[i] := TButton.Create(Form1);
end;

البته برای نگه داشتن لیستی از Object ها روش های بهتری هست مثل TComponentList یا TObjectList در یونیت Contnrs.

MNosouhi
سه شنبه 09 بهمن 1386, 09:30 صبح
برنامه مورد نظر شما رو در تاپیک قبلی شما گزاشته ام. به لینک زیر مراجعه کنید :
http://barnamenevis.org/forum/showthread.php?t=89227

robochoo
سه شنبه 09 بهمن 1386, 13:43 عصر
اینجور اجزا برا کاری ساخت به یک مالک(Owner) نیاز دارند که عمر آنها وابسته به عمر مالک میشود.
و علاوه بر مالک به یک زمینه برای نمایش به نام Parent احتیاج دارند. بهتره هر کدوم از درایه ها رو ینجوری بسازی
a:=TButton.Create(Form1);
a.Parent:=Form1;

SYNDROME
سه شنبه 09 بهمن 1386, 18:53 عصر
اینجور اجزا برا کاری ساخت به یک مالک(Owner) نیاز دارند که عمر آنها وابسته به عمر مالک میشود.
و علاوه بر مالک به یک زمینه برای نمایش به نام Parent احتیاج دارند. بهتره هر کدوم از درایه ها رو ینجوری بسازی
a:=TButton.Create(Form1);
a.Parent:=Form1;
دوست عزیز
فکر نمی کنید نگه داشتن این نوع Button از نگه داستن آرایه خیلی سختر است و همچینین برای نامگذاری آن دچار مشکل می شوید.
موفق باشید

robochoo
سه شنبه 16 بهمن 1386, 19:08 عصر
فکر نمی کنم parent با اسم جزء تداخل داشته باشه.
تا جایی که میدونم Parent برای معرفی جد و مادر اجزا استفاد همیشه.
اجزایی که قابلیت نمایش را دارند باید برای نمایش تعلق آن ها به جزء دیگه معرفی بشه. اگه Parent معرفی نشه برای نمایش دادن دچاره مشکل میشی.
فکر کنم اجزایی که توسط windows به برنامه داده میشه مثه کلید، Parent داشته باشند.

SYNDROME
سه شنبه 16 بهمن 1386, 21:50 عصر
دوست عزیز منظور من این بود که نگه داشتن لیست Button ها در یک آرایه راحت است و اگر بخواهی برای تعریف هر Button از یک متغییر استفاده کنی خیلی با مشکل برخود می کنی.
حتی اگر بخواهی لیست Button هایی که در آرایه تعریف کرده ای را نمایش بدهی باید Parent مشخص شود.
موفق باشید

h.tehrani
چهارشنبه 08 اسفند 1386, 22:25 عصر
من مشکلی مشابه همین دارم اما با راه حلهای شما مشکل حل نشد.
فرض کنید تعداد 40 عدد panel وجود دارد برای آنکه بخشی از این پنلها نمایش داده شود باید چه کار کرد .
مثلا: از پنل 15 تا 38 را می خواهیم نمایش دهیم.مصداق آن در ایجاد یک تقویم است .اول هر ماه مشخص نیست چه روزی است و برای هر ماه یک پنل ممکن است visible شود.
لطفا اگر میتوانید به من کمک کنید.

SYNDROME
پنج شنبه 09 اسفند 1386, 07:24 صبح
من مشکلی مشابه همین دارم اما با راه حلهای شما مشکل حل نشد.
فرض کنید تعداد 40 عدد panel وجود دارد برای آنکه بخشی از این پنلها نمایش داده شود باید چه کار کرد .
مثلا: از پنل 15 تا 38 را می خواهیم نمایش دهیم.مصداق آن در ایجاد یک تقویم است .اول هر ماه مشخص نیست چه روزی است و برای هر ماه یک پنل ممکن است visible شود.
لطفا اگر میتوانید به من کمک کنید.
دوست عزیز شما باید در یک صفحه 6*6 از Label ها درست کنید و سپس با توجه به شروع هر ماه این Labelها را مقدار دهی کنید و نیازی به Create کردن فکر نمی کنم باشد.
موفق باشید

h.tehrani
پنج شنبه 09 اسفند 1386, 11:59 صبح
دوست عزیز شما باید در یک صفحه 6*6 از Label ها درست کنید و سپس با توجه به شروع هر ماه این Labelها را مقدار دهی کنید و نیازی به Create کردن فکر نمی کنم باشد.
موفق باشید
ببینید شاکله ی نرم افزار ساخته شده .40 پنل موجود است که در هر پنل تعدادی comboboxوeditو... وجود دارد این برای آن است که اطلاعات مربوط به همان روز وارد شود.
اما مشکل اینجاست که من نمیتوانم همین createکه شما برنامه آنرا نوشتید تبدیل به خواصیت visibleکنم واین عمل را برای پنل هایی که در آرایه ذخیره کرده ام اعمال کنم. با تشکر.

vcldeveloper
پنج شنبه 09 اسفند 1386, 14:17 عصر
اینجا رو ببینید:
http://barnamenevis.org/forum/showpost.php?p=346946&postcount=11

h.tehrani
جمعه 10 اسفند 1386, 13:03 عصر
اما هیچکدام از این جوابها مربوط به مشکل من نیست.مشکل نه تقویم شمسی است نه ...** مشکل خیلی واضحه همین کاری که برای create کردن انجام می دهیم(هر تعداد پنل که می خواهیم نمایش میدهیم) چطور میشود برای دستور visible انجام داد . پنلها از قبل ساخته شده اند و وجود دارند من فقط می خوام نشان دادن یا نشان ندادن آنها را کنترل کنم .


از راهنمایی های شما متشکرم اما اگر امکان دارد در این زمینه به من کمک کنید .

SYNDROME
جمعه 10 اسفند 1386, 15:23 عصر
اگر می خواهی Object هایی را که Create کرده ای نمایش دهید باید اینجوری عمل کنی.


a[1].Parent := Form1;
a[1].Visible := True;

موفق باشید

Rambod
جمعه 10 اسفند 1386, 20:19 عصر
یعنی هیچ جوره نمیشه تو دلفی در هنگام Design آرایه‌ای از کنترل‌ها ساخت؟ تو VB این کار خیلی راحته و با مقداردهی خصوصیت Index میشه این کار رو کرد.

h.tehrani
شنبه 11 اسفند 1386, 12:08 عصر
اگر می خواهی Object هایی را که Create کرده ای نمایش دهید باید اینجوری عمل کنی.

موفق باشید
باز هم میگم قرار نیست چیزی create بشه که ما نمایش بدیم یا نه. همه چیز از قبل طراحی شده .در نظر بگیرید 48 پنل به صورت 6*7 طراحی شده که داخل هر پنل تعدادی object وجود دارد . حالا: ما میخواهیم ،مثلا از پنل4 تا پنل40 نمایش داده شود.
فکر میکنم از این واضحتر دیگه نمیشه.

SYNDROME
شنبه 11 اسفند 1386, 18:12 عصر
لینک زیر را نگاه کنید.
کل Editهای صفحه را به ترتیب می خواند.از روی نام کامپونتها می توانی تشخیص دهی کدام را نمایش دهی.مثلا نام کامپونتها را Edit_01 تا Edit_40 بگذارید و با دستور Copy قسمت عددی را جدا کرده و اگر داخل رنج بود نمایش دهید.
http://barnamenevis.org/forum/showthread.php?t=89427&highlight=ComponentCount
موفق باشید

h.tehrani
یک شنبه 12 اسفند 1386, 13:12 عصر
اما چطور میشه با دستور copy مقدار عددی را جدا کرد؟در ضمن کد زیر رو هم نوشتم ولی نمیتونم کاملش کنم .
For i := 0 To ComponentCount Do
IF Components[i] Is Tpanel Then
Begin
if (Components[i] as Tpanel).visible= then
End

SYNDROME
یک شنبه 12 اسفند 1386, 20:25 عصر
اما چطور میشه با دستور copy مقدار عددی را جدا کرد؟در ضمن کد زیر رو هم نوشتم ولی نمیتونم کاملش کنم
خوب مثلا نام کامپونت را با Edit_شروع کن و سپس کاراکتر 6 و7 را عدد بگذار.ماننده


Edit_01

سپس به شکل زیر عمل کن.


Copy('Edit_01',6,2);

موفق باشید

h.tehrani
چهارشنبه 15 اسفند 1386, 10:47 صبح
مشکل پروژه حل نشد و در نهایت قالب پروژه را عوض کردم.
در طول این پروژه من با ناتوانی های دلفی در ضمینه های مختلف خیلی در گیر بودم.
وتوصیه میکنم قبل از نوشتن هر برنامه ابتدا از توانایی های برنامه ای که با آن کار میکنید خوب مطمئن شوید.در غیر این صورت مثل من چند هفته تلاشتونو باید پاک کنید.:گریه:
تشکر میکنم از تمامی دوستان .

vcldeveloper
چهارشنبه 15 اسفند 1386, 11:06 صبح
در طول این پروژه من با ناتوانی های دلفی در ضمینه های مختلف خیلی در گیر بودم.
وتوصیه میکنم قبل از نوشتن هر برنامه ابتدا از توانایی های برنامه ای که با آن کار میکنید خوب مطمئن شوید.
مشکل از دلفی نبود، از شما بود. من پیشنهاد میکنم قبل از شروع یک پروژه:
1- با زبان و محیط برنامه نویسی مورد نظر خودتون کاملا آشنا بشید.
2- قبل از پیاده سازی یک امکان جدید، توانایی های خود در پیاده سازی آن را کاملا بررسی کنید.

h.tehrani
پنج شنبه 16 اسفند 1386, 01:49 صبح
1- با زبان و محیط برنامه نویسی مورد نظر خودتون کاملا آشنا بشید.
2- قبل از پیاده سازی یک امکان جدید، توانایی های خود در پیاده سازی آن را کاملا بررسی کنید.
شما درست میگید اما این در صورتیه که مشکل پس از 2 هفته پیگیری و جستجو حل بشه .اما همین طور که میبینید نه شما و دوستان تونستید این مشکل رو حل کنید،و نه تمام کسانی که در اطراف من متخصص برنامه نویسی بودند تونستند این مشکل رو حل کنن وعلاوه بر اینها استاد راهنمای من در این پروژه برای این که مشکله من رو حل کنه پیشنهاد عوض کردن قالب پروژه رو داد و از حل مشکل ابراز بی اطلاعی کرد .که البته راهش با سلیقه من اصلا جور در نمیاد! به دلایلی که ذکر شد به این نتیجه رسیدم که اینجا دیگه دلفی کم آورده!
شایدم حرف شما به احتمال ضعیفی درست باشه برای همین، صفحه پروژه خودم رو برای دانلود در زیر گذاشتم .لطفا نگید که چرا از این راه برای رسیدن به هدفت میری چون با راه دیگه ای موافق نیستم.توجه کنید که میخوام تاریخی مه از کاربر گرفته میشه تقویم زیر نمایش داده بشه و اطلاعات مورد نیاز از کاربر گرفته بشه.ودر نهایت حقوق کارمند محاسبه بشه.
http://barnamenevis.org/forum/attachment.php?attachmentid=15171&stc=1&d=1204757323

SYNDROME
پنج شنبه 16 اسفند 1386, 07:29 صبح
شما درست میگید اما این در صورتیه که مشکل پس از 2 هفته پیگیری و جستجو حل بشه .اما همین طور که میبینید نه شما و دوستان تونستید این مشکل رو حل کنید،و نه تمام کسانی که در اطراف من متخصص برنامه نویسی بودند تونستند این مشکل رو حل کنن وعلاوه بر اینها استاد راهنمای من در این پروژه برای این که مشکله من رو حل کنه پیشنهاد عوض کردن قالب پروژه رو داد و از حل مشکل ابراز بی اطلاعی کرد .
ولی باز هم این دلیل به کم توانی و با ناتوانی دلفی نیست که در بالا علی کشاورز هم یاد کرد.
عوض کردن صورت مسئله کاری است که اکثر اساتید ما می کند تا از سوالاتی که جوابهای آن را باد نیستند فرار کنند.
اگر دوستان هم نتوانستد کمک کنند شاید روش حل مسئله روش درستی نبوده و باید از روش دیگری استفاده کرد.
موفق باشید

vcldeveloper
پنج شنبه 16 اسفند 1386, 08:13 صبح
اما همین طور که میبینید نه شما و دوستان تونستید این مشکل رو حل کنید،و نه تمام کسانی که در اطراف من متخصص برنامه نویسی بودند تونستند این مشکل رو حل کنن وعلاوه بر اینها استاد راهنمای من در این پروژه برای این که مشکله من رو حل کنه پیشنهاد عوض کردن قالب پروژه رو داد و از حل مشکل ابراز بی اطلاعی کرد .وقتی شما نمی تونید مشکلی که دارید درست توضیح بدید، انتظار دارید دیگران چیکار کنند؟!
از نظر دلفی برای کار شما باید امکان تعریف لیستی از اشیا فراهم باشه، که هست. از طرفی امکان تغییر خصوصیات این اشیاء هم وجود داشته باشه، که داره. اینجا مشکل اینه که شما بلد نیستید که چطور این کار رو انجام بدید و فقط هم میگید این راه حل نیست، آن راه حل نیست. مثلا به پست های خودتون در این تاپیک نگاه کنید:


فرض کنید تعداد 40 عدد panel وجود دارد برای آنکه بخشی از این پنلها نمایش داده شود باید چه کار کرد .
مثلا: از پنل 15 تا 38 را می خواهیم نمایش دهیم.مصداق آن در ایجاد یک تقویم است .اول هر ماه مشخص نیست چه روزی است و برای هر ماه یک پنل ممکن است visible شود.
اما مشکل اینجاست که من نمیتوانم همین createکه شما برنامه آنرا نوشتید تبدیل به خواصیت visibleکنم واین عمل را برای پنل هایی که در آرایه ذخیره کرده ام اعمال کنم.خب، تا اینجا کی میتونه کمک کنه؟! فقط مشخص شده که شما نتونستید مقدار خصوصیت Visible چند کنترل را تنظیم کنید. چرا نتونستید مشخص نیست، چون کاربران باید حدس بزنند شما از چه راهی رفتید. اکثرا هم به اندازه کافی گرفتار هستند که فرصت حدس زدن مشکل شما را نداشته باشند. وقتی مشکل مشخص نشده، جواب کلی میشه اونی که در پست شماره 14 (http://barnamenevis.org/forum/showpost.php?p=475459&postcount=14) گرفتید. در پست بعد از آن شما باز هم توضیحی به توضیحات قبلی اضافه نمی کنید، فقط همان توضیح را تکرار می کنید، Syndrome این بار راه حل دیگه ایی ارائه میکنه که شما هم قبول می کنید. اما در پست 18 کلا مسیر سوال را عوض می کنید و درباره کار کردن با تابع Copy می پرسید. در پست 19 درباره تابع Copy برای شما یک مثال زده میشه. در پست 20 انگار که اصلا مثالی برای Copy زده نشده و قبل از آن در پست 18 خودتان به راه حل ارائه شده "احسنت" نگفتید(!) مجددا ار حل نشدن مشکلتان گله مند هستید در حالی که باز هم اطلاعات جدیدی ارائه نمی کنید.

واقعا فکر می کنید چه کمکی باید به شما صورت می گرفت؟! کل سوالات شما این بود:
1- چطور مقدار Visible تعدادی Panel را تغییر بدیم.
2- چطور از تابع Copy استفاده کنیم.

جواب هر دو سوال هم در تاپیک داده شد. اگر جوابها به کار شما نیامد، علتش عدم توانایی شما در بیان مشکل بود.

مسلم هست که وقتی کاربری بدون ارائه اطلاعات بیشتر، فقط گله میکنه، کمتر کسی مشکل را پیگیری میکنه. من شخصا چند بار این تاپیک سر زدم، ولی هیچ توضیح مفیدی از شما ندیدم، پس بعد از مدتی بیخیال این تاپیک شدم و فقط پست ها را از نظر انظباطی کنترل می کردم. الان اگه وقت گذاشتم و سه صفحه تاپیک را مرور کردم، برای این بود که هم شما و سایر دوستانی که بعد از این ممکنه مشکلی براشون پیش بیاد، متوجه بشند که ما اینجا توانایی خواندن ذهن شما را نداریم. مسئولیتی هم در قبال حل مشکل شما نداریم. اگر مشکل به خوبی مطرح شده باشه و حل آن در توان ما باشه، کمک می کنیم، وگرنه به تاپیک توجه خاصی نمیشه و سوال فراموش میشه. پس لطفا وقتی به مشکلی بر می خورید، چند لحظه روی سوال فکر کنید، آن را از زوایای مختلف بررسی کنید و چک کنید که چقدر برای فردی که در جریان پروژه شما نیست، قابل فهم هست، بعد اگر به این نتیجه رسیدید که مشکل را کامل و جامع توضیح دادید و اطلاعات کافی ارائه کردید، اون وقت امید به گرفتن جواب داشته باشید.
من فکر می کنم اگر در پست قبل از شما انتقاد نکرده بودم، همین فرم ضمیمه شده را هم در تاپیک قرار نمی دادید!

vcldeveloper
پنج شنبه 16 اسفند 1386, 08:18 صبح
unit vhozoor;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Grids, DBGrids, DB, ADODB, Contnrs;

type
Thozoor = class(TForm)
{Components list is omitted for simplicity}
...
procedure Button4Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
MyPanels : TComponentList;

function IsMyPanel(control : TControl): Boolean;
procedure AddPanels;
procedure SetPanelVisibility(Index : integer; Visible: Boolean);
public
{ Public declarations }
end;

var
hozoor: Thozoor;

implementation

uses Unit1;

{$R *.dfm}

procedure Thozoor.FormCreate(Sender: TObject);
begin
MyPanels := TComponentList.Create(False);
AddPanels;
end;

procedure Thozoor.FormDestroy(Sender: TObject);
begin
MyPanels.Free;
end;

//Check Name property for the given control to see if it is MyPanel.
function Thozoor.IsMyPanel(control: TControl): Boolean;
begin
//A panle is MyPanle if its name follows this pattern: pX
//X is a number from 1 to 35.
Result := (Length(Control.Name) < 4) and (Copy(Control.Name,1,1) = 'p');
end;

//Sort the list according to panel names
function SortMyPanels(Item1, Item2: Pointer): Integer;
begin
Result := CompareText(TComponent(Item1).Name, TComponent(Item2).Name);
end;

//Adds panels to MyPanels list
procedure Thozoor.AddPanels;
var
j : integer;
begin
for j := 0 to ControlCount-1 do
if (Controls[j] is TPanel) and (IsMyPanel(Controls[j])) then
MyPanels.Add(Controls[j]);
MyPanels.Sort(@SortMyPanels);
end;

//Sets visibility of a given panel in MyPanels list
procedure Thozoor.SetPanelVisibility(Index: integer; Visible: Boolean);
begin
(MyPanels[Index] as TPanel).Visible := Visible;
end;مثال:


procedure Thozoor.Button1Click(Sender: TObject);
var
i : integer;
begin
for i := 1 to 7 do
SetPanelVisibility(i,False);
end;توضیحی بیشتر از اونی که توی خود کد نوشتم، نمیدم!

h.tehrani
پنج شنبه 16 اسفند 1386, 17:07 عصر
دوست ندارم فکر کنید که من قدر نشناسم ، ولی درصدی حق بدید که وقتی به آدم میگن که این کار در دلفی ممکن نیست و وقتی از گرفتن جواب از دوستان نا امید میشین به نتیجه ای که در مطلب 19 نوشتم میرسید.در هر صورت دوست نداشتم مشگل اینطوری حل بشه،یعنی من پروژرو بدم و شما حل کنید می خواستم خودم حل کنم که هر چی سعی کردم گویا شما منظور من رو از سئوال نفهمیدید ،این کار رو خودم هم درست نمی دونم ولی مثل اینکه بحث داشت خراب میشد. قبول دارم که سوادم در دلفی هنوز خیلی کمه و شاهدم که شما وقت زیادی رو برای حل کردن این مشکل صرف کردید.باز هم ممنونم:لبخندساده:
البته تا کد ها رو بفهمم وقت زیادی میبره ولی در هر حال متشکرم.سعی میکنم زیاد هم مزاحم شما نشم.

h.tehrani
یک شنبه 19 اسفند 1386, 12:05 عصر
چرا در برنامه پنلهای 1تا35 در نظر گرفته شده؟ وقتی برنامه اجرا میشه پنل های p1 تا p9 کار نمیکنه شاید مشکل از سُرت برنامه باشه .لطفا اگر کسی میتونه کمک کنه.

vcldeveloper
یک شنبه 19 اسفند 1386, 16:53 عصر
چرا در برنامه پنلهای 1تا35 در نظر گرفته شده؟
چون من اول یه آرایه 35 تایی برای نگه داری Object ها تعریف کرده بودم که بعدش منصرف شدم. برای بدست آوردن تعداد اشیای موجود در لیست:
MyPanels.Count


پنل های p1 تا p9 کار نمیکنه شاید مشکل از سُرت برنامه باشه
چون سورت حرف به حرف مقایسه میکنه در نتیجه مقادیری مثل 11 یا 12 که با 1 شروع میشند قبل از مقادیر 2و 3 و... قرار میگیرند که با مقادیری بزرگتر از یک شروع میشند. باید نام کنترلهایی که عددشون تک رقمی هست را بجای 1و2 و3 و 4 و... با 01و02و03و04 و...جایگزین کنید تا سورت ترتیب آنها را درست نمایش بده.

h.tehrani
سه شنبه 21 اسفند 1386, 15:26 عصر
مشکلات کار با پنل ها حل شد ولی در پیمایش روی edit comdobox label مشکل دارم در کدی که شما نوشتید نمیتواند کامپوننت های بالا را پیدا کند و ذخیره کند.چه باید کرد؟

vcldeveloper
سه شنبه 21 اسفند 1386, 16:01 عصر
نمیتواند کامپوننت های بالا را پیدا کند و ذخیره کند.
یعنی چی؟!!

h.tehrani
سه شنبه 21 اسفند 1386, 18:29 عصر
ببینید من در هر پنل یک edit یکcomboboxویکlabel قرار دادم اما نمیتوانم کاری که شما برای پنل ها انجام دادید برای آنها هم انجام دهم مثلا در کد زیر
var
j : integer;
begin
for j := 0 to ControlCount-1 do
if (Controls[j] is TPanel) and (IsMyPanel(Controls[j])) then
MyPanels.Add(Controls[j]);
MyPanels.Sort(@SortMyPanels);
میخواهم لیبل ها تاریخ آن روز را نمایش دهند اما در کد بالا اصلا لیبلی پیدا نمیکنه که وارد حلقه بشه .ببینید پنل ها parent لیبل و... هستند میخواهم بدانم چطور میشود اطلاعاتی که کاربر در ادیتها وارد میکند را بخوانم یا چطور caption لیبل ها را مقدار دهی کنم.

vcldeveloper
سه شنبه 21 اسفند 1386, 18:43 عصر
همونطور که داریم:

Controls[j] is TPanel
همونطور هم می تونیم داشته باشیم TEdit یا TLabel.
همونطور هم می تونیم داشته باشیم:

TLabel(Controls[j]).Caption := 'Test';

h.tehrani
چهارشنبه 22 اسفند 1386, 13:50 عصر
در طول اجرای، برنامه اصلا وارد شرط زیر نمیشود.باز هم میگم لیبل ها زیر مجموعه ی پنلها هستند این مشکلی ایجاد نمیکنه ؟

for q := 0 to ControlCount-1 do
begin
if (Controls[q] is Tlabel) and (IsMyll(Controls[q])) then
Myll.Add(Controls[q]);
end;

SYNDROME
چهارشنبه 22 اسفند 1386, 15:20 عصر
Trace کن ببین وارد حلقه می شودیا نه؟
ComponentCount-1 امتحان کن ببین درست می شود یا نه؟
اگر نشود برنامه را اینجا قرار بده تا تست شود.
موفق باشید

h.tehrani
چهارشنبه 22 اسفند 1386, 15:33 عصر
trace کردم وارد شرط نمیشه.

iranianprogrammers
پنج شنبه 23 اسفند 1386, 00:56 صبح
سلام .
یه برنامه خیلی وقت پیشا نوشته بودم که نرسیدم تکمیلش کنم .
شاید خیلی جاهاشو بد کد نویسی کرده باشم و خیلی جاها کدای زائدی باشه و شاید اصلا بدرد نخوره .
اما میذارم چون نسبت به چیزایی که اینجا یاد گرفتم تعهداتی دارم .



procedure TMainForm.butclick(sender : TObject );
var
btname : string ;
begin
btname := TButton(sender).Name;
ReminderForm.Edit_RemindeDate.Text := inttostr(CurrentYear) + '/' + copy(btname,3,2) + '/' + copy(btname,6,2);
ReminderForm.ShowModal ;
end;

Procedure TMainForm.CreateButton ; // ÑæÓå ÓÇÎÊ Ï˜ãå åÇ
var
counter : integer ;
//mybtn : TfcImageBtn ;
ButtonDate,ButtonAllYearDate : string ;
Begin
try
counter := 0 ;
for I := 1 to 5 do
Begin
for L := 7 downto 1 do
Begin
mybtn[strtoint(ReturnValidMountNumber(PageCount))][ReturnVildLPosistion(I*L)] := TfcImageBtn.Create(MountPage.Pages[pagecount]);
//-----------
with mybtn[strtoint(ReturnValidMountNumber(PageCount))][ReturnVildLPosistion(I*L)] do
Begin

Parent := MountPage.Pages[pagecount] ;
OnClick := butclick;
Caption := IntToStr(counter + 1) ;
Height := 32 ;
Width := 32 ;
Font.Size := 10 ;
BiDiMode := bdRightToLeft ;
Font.Name := 'Tahoma' ;
Font.Style := [fsBold] ;
Font.Color := clBlack ; // ÑæÒåÇí ÛíÑ ÊÚØíá
// Effects
TextOptions.Style := fclsOutline ;
TextOptions.OutlineColor := clWhite ;
//==
Image.LoadFromFile('C:\button\testn.bmp');
ImageDown.LoadFromFile('C:\button\testn2.bmp');
// ÌãÚå åÇ
IF LeftCounter = 30 Then
Begin
Font.Color := clRed ;
Image.LoadFromFile('C:\button\testtatiil.bmp');
End ;
//---
Left := SetLeftPos ;
Top := TopCounter * 28 ;
ButtonPosition[PageCount][ReturnVildLPosistion(i*L)] := Left ;
//==============
Name := 'b_' + ReturnValidMountNumber(PageCount) + '_' + ReturnValidDayNumber(counter + 1) ;

//====== ÑÝÊä ÊÇÑíÎ ÇãÑæÒ æ ãÔÎÕ ÓÇÒí ========
ButtonDate := SetTrueDate(PageCount, counter + 1) ; // ÊÇÑíÎ Çíä Ϙãå
ButtonAllYearDate := 'Year/' + copy(ButtonDate,6,5); // ÊÇÑíÎ Çíä Ϙãå ÏÑ ÝíáÏåÇí åãå ÓÇáå
//---
WhatsThisButtonImage(ButtonDate) ; // ÊÚííä Ô˜á˜åÇ
//====== ÇíÇä ========
// ÑÝÊä ÑæíÏÇÏ ÑæÒ
DTM.DBQuery.SQL.Clear ;
DTM.DBQuery.SQL.Add('select * from eventtable where date = ' + QuotedStr(ButtonDate));
DTM.DBQuery.ExecSQL ;
//-------------

IF DTM.DBQuery.RecordCount > 0 Then Hint := DTM.DBQuery.FieldValues['eventtitle'] ;

IF ButtonDate = CalenderForm.FarsiCalendar1.Today Then
Begin
//Flat := False ;
Font.Color := clBlue ; // ãÔÎÕ ÓÇÒí Ϙãå ÇãÑæÒ
MountPage.ActivePageIndex := PageCount ;
IF DTM.DBQuery.RecordCount > 0 Then
Begin
with EventForm do
Begin
Labl_Today.Caption := 'ÇãÑæÒ : ' + (ReturnPersianDate(LeftCounter,counter+1));
Labl_TodayEvent.Caption := DTM.DBQuery.FieldValues['eventtitle'] ;
Show;
End ;
End;
End ;
//====== ÇíÇä ========
//****************************
counter:= counter + 1 ;
//Top := TopCounter * 28 ;
SplashForm.ProgressBar_Loading.Position := SplashForm.ProgressBar_Loading.Position + 1 ;
IF counter = NumberOfMountDays Then Break ;
End ;
End;
End ;
except
end ; // end try
End;

Function TMainForm.WhatsThisButtonImage(Date:String):String ;
var
AllYear : String ;
HintEventTypeTemp,HintRemindeMessageTemp,HintCompo sed : String ;
Day,Mount : integer ;
Begin
AllYear := 'Year/' + copy(Date,6,5); // ÊÇÑíÎ Çíä Ϙãå ÏÑ ÝíáÏåÇí åãå ÓÇáå
day := strtoint(copy(Date,6,2));
Mount := strtoint(copy(Date,9,2)) ;
// ÊÚííä Ô˜á˜åÇí Ϙãå åÇí
with DTM.Query_Reminder do
begin
SQL.Clear ;
SQL.Add('Select * from remindertable where EventDate = ' + QuotedStr(Date) + 'OR EventDate = ' + QuotedStr(AllYear));
ExecSQL ;
end ;
//===
IF DTM.Query_Reminder.RecordCount = 1 Then // ÇÑ ÝÞØ í˜ ÚäæÇä ãæÌæÏ ÈæÏ
Begin
SmallIcon[day][Mount] := TfcImageBtn.Create(self);
with SmallIcon[day][Mount] do
Begin
Parent := MyBtn[day][Mount].Parent ;
Height := 16 ;
Width := 16 ;
SmallIcon[day][Mount].Top := MainForm.MyBtn[day][Mount].Top ;
SmallIcon[day][Mount].Left := MainForm.MyBtn[day][Mount].Left ;
HintEventTypeTemp := DTM.Query_Reminder.FieldValues['RemindeType'] ;
HintRemindeMessageTemp := DTM.Query_Reminder.FieldValues['RemindeMessage'] ;
HintComposed := HintEventTypeTemp + ' : ' + HintRemindeMessageTemp ;
Case DTM.Query_Reminder.FieldValues['RemindeIntType'] OF
0 : Begin
Image.LoadFromFile('C:\button\IcAp.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
1 : Begin
Image.LoadFromFile('C:\button\IcBirthday.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
2 : Begin
Image.LoadFromFile('C:\button\IcCheck.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
3 : Begin
Image.LoadFromFile('C:\button\IcQuiz.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
4 : Begin
Image.LoadFromFile('C:\button\IcMarry.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
5 : Begin
Image.LoadFromFile('C:\button\IcDead.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
6 : Begin
Image.LoadFromFile('C:\button\IcImportant.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
7 : Begin
Image.LoadFromFile('C:\button\IcUnknow.bmp');
ImageDown := Image ;
Hint := HintComposed ;
End ;
end;
SmallIcon[day][Mount].Repaint ;
End ;
End ;
//--
IF DTM.Query_Reminder.RecordCount > 1 Then
Begin
SmallIcon[day][Mount] := TfcImageBtn.Create(self);
with SmallIcon[day][Mount] do
Begin
Parent := MyBtn[day][Mount].Parent ;
Height := 16 ;
Width := 16 ;
SmallIcon[day][Mount].Top := MainForm.MyBtn[day][Mount].Top ;
SmallIcon[day][Mount].Left := MainForm.MyBtn[day][Mount].Left ;
Image.LoadFromFile('C:\button\many.bmp');
ImageDown := Image ;
With DTM.Query_Reminder Do
Begin
First ;
Hint := DTM.Query_Reminder.FieldValues['RemindeType']+ ' : ' + DTM.Query_Reminder.FieldValues['RemindeMessage'] + #13 ;
Next ;
While Not Eof Do
Begin
Hint := Hint + DTM.Query_Reminder.FieldValues['RemindeType']+' : ' + DTM.Query_Reminder.FieldValues['RemindeMessage'] + #13 ;
Next;
End ;
End ;
SmallIcon[day][Mount].Repaint ;
End ;
End;
End ;

h.tehrani
پنج شنبه 23 اسفند 1386, 10:41 صبح
اگر فایلش بود شاید میشد یه چیزایی فهمید ولی الان این کد هیچ کمکی نمیکنه!

h.tehrani
پنج شنبه 23 اسفند 1386, 11:59 صبح
یک طور دیگه سئوالمو مطرح میکنم .در کد زیر تمامی لیبل ها ی از پیش تعریف شده پاک میشود .حال اگر یک لیبل داخل یک پنل باشد دستور زیر هیچ تاثیری روی آن ندارد چرا؟

var
i:integer;
begin
For i := 0 To ControlCount-1 Do
IF Controls[i] Is Tlabel Then
Begin
(Controls[i] as tlabel).visible:=false;
End ;

vcldeveloper
پنج شنبه 23 اسفند 1386, 13:48 عصر
یک طور دیگه سئوالمو مطرح میکنم .در کد زیر تمامی لیبل ها ی از پیش تعریف شده پاک میشود .حال اگر یک لیبل داخل یک پنل باشد دستور زیر هیچ تاثیری روی آن ندارد چرا؟چون اگه به Help دلفی مراجعه کنید، متوجه میشید که Controls لیستی از کنترلهایی که Child کنترل مورد نظر هستند را در اختیار شما قرار میده. پس کنترل هایی مثل Label ایی که توی یک Panel هستند با خصوصیت Controls فرم قابل دسترس نیستند، چون Parent شان Panel هست، نه فرم.
از طرفی اگر در همان Help سری به لینک See Also می زدید، متوجه می شدید که خصوصیت دیگه ایی وجود داره به نام Components که اگر به توضیحاتش توجه کنید، نوشته لیست کامپوننت هایی که توسط کامپوننت موردنظر (در اینجا فرم) Owned هستند را بر میگردونه، یعنی هر کامپوننتی که Owner اش فرم مربوطه باشه با TForm.Components برگشت داده میشه. پس باید بجای Controls از Components و بجای ComponentsCount از ControlCounts استفاده بکنید تا جواب درست بگیرید.
همین مورد در پست 34# هم به شما گفته شد، ازش تشکر هم کردید، ولی همون سوال رو دوباره ادامه دادید!
این Help دلفی برای همه کاربرانش هست، مخصوص عده خاصی نیست. با یک F1 ساده روی نام کامپوننت، یا متد مربوطه در ادیتور هم فعال میشه و شما رو یکراست میبره به صفحه مربوط به اون متد، خصوصیت، رویداد، کلاس، یا تابع خاص.

SYNDROME
پنج شنبه 23 اسفند 1386, 23:18 عصر
var
i:integer;
begin
For i := 0 To ControlCount-1 Do
IF Controls[i] Is Tlabel Then
Begin
(Controls[i] as tlabel).visible:=false;
End ;

کد را به شکل زیر تغییر بده.


For i := 0 To componentCount-1 Do
IF Components[i] Is Tpanel Then
Begin
TPanel(Components[i]).Visible:=False;
End ;

موفق باشید