PDA

View Full Version : مشكل با Tedit



hector2000
دوشنبه 02 آبان 1390, 16:44 عصر
با سلام
اقا من يك مشكلي با Tedit در دلفي 7 دارم
من مي خواهم يك كلاس جديد بر پايه TCustomEdit تعريف كنم به من ارور ميده
مگر نبايد تو بخش type و بعد از كد زير اضافه شود؟
Form1 =class(Tform);

من مي خواهم از كد زير استفاده كنم كه tedit را راست چين مي كند ولي همش به اون قسمت ارور ميده

type
TEditAlignment = class(TCustomEdit)
protected
{ Protected declarations }
procedure CreateParams(var Params: TCreateParams); override;
end;

procedure TEditAlignment.CreateParams(var Params: TCreateParams);
const Alignments: array[TAlignment] of Longint =
(ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);

Params.Style := Params.Style or ES_MULTILINE or
Alignments[FAlignment];
end;

SAASTN
دوشنبه 02 آبان 1390, 22:22 عصر
پیاده سازی CreateParams رو تو بخش implementation قرار می دید دیگه؟
اون FAlignment هم private هست و شما نمی تونید اونجوری ازش استفاده کنید، به Alignment تغییرش بدبد. با این تغییرات کد کامپایل میشه، البته من نتیجه رو تست نکردم.

ولي همش به اون قسمت ارور ميده
برای بار nام! لطفا برای گزارش خطا حتما ذکر کنید که دقیقا کدوم خط خطا داره و متن خطا چی هست. از این جمله ای که نوشتید چه برداشتی میشه کرد؟ دیگه از کاربری که 50 تا پست زده باشه انتظار میره این مسائل رو رعایت کنه.

hector2000
سه شنبه 03 آبان 1390, 10:47 صبح
با سلام و سپاس
من اين نمونه كد را از سايت زير پيدا كردم كه اشاراتي به اين مسائل نكرده بود



http://www.delphi3000.com/articles/article_614.asp?SK=


در ضميمه فايل حاوي ارور ها را قرار مي دهم

SAASTN
سه شنبه 03 آبان 1390, 11:58 صبح
اون خطای اول مربوط به اینه که ExtCtrls رو use نکردین. بقیه هم خطا های سینتکسی هستند که ممکنه فقط در اثر یه جابجایی اشتباه ایجاد بشن.
به هر صورت دیشت تو XE دیدم CustomEdit صفت Alignment رو داشت، الان تو 2007 نداره! حالا نمیدونم 7 داره یا نه. اگه نداشته باشه هم میشه اضافش کرد. این کد رو تست کنید:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TEditAlignment = class(TCustomEdit)
private
FAlignment: TAlignment;
procedure SetAlignment(const Value: TAlignment);
protected
procedure CreateParams(var Params: TCreateParams); override;
published
property Alignment: TAlignment read FAlignment write SetAlignment;
end;

TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
procedure RadioGroup1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
EditAlignment: TEditAlignment;
public

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TEditAlignment }

procedure TEditAlignment.CreateParams(var Params: TCreateParams);
const
Alignments: array[TAlignment] of Longint =
(ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);

Params.Style := Params.Style or ES_MULTILINE or
Alignments[FAlignment];
end;

procedure TEditAlignment.SetAlignment(const Value: TAlignment);
begin
if FAlignment <> Value then
begin
FAlignment := Value;
RecreateWnd;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
EditAlignment := TEditAlignment.Create(Self);
EditAlignment.Parent := Self;

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
const
Alignments: array[0..2] of TAlignment = (taLeftJustify, taCenter, taRightJustify);
begin
if Assigned(EditAlignment) then
EditAlignment.Alignment := Alignments[RadioGroup1.ItemIndex];
end;

end.

اون RadioGroup هم سه تا آیتم داره که به ترتیب چپ، وسط و پائین هستند.
اما اگه منظور فقط راست چین کردن Edit هست و وسط چین کردن مد نظر نیست با خود BiDiMode میشه Edit رو راست چین کرد و نیازی به این دنگ و فنگ ها نیست.

hector2000
سه شنبه 03 آبان 1390, 13:08 عصر
77023
با تشكر از شما
ولي اين كد شما موقع كامپايل ارور ميده
تصوير ارورش را ضميمه مي كنم
من گزينه no را ميزنم و برنامه را كه اجرا مي كنم هيچي نمي ايد؟بايد install كنمش؟چطور بايد نتيجه اش را ببينم؟
در زمينه bidimode بايد خدمتتان عرض كنم كه اين گزينه در ويندوز 98 و در ويندوز اكس پي اورجينال درست كار نمي كند و چپ به راست نمي شود
ممنونم

SAASTN
سه شنبه 03 آبان 1390, 13:44 عصر
نیاز به هیچ نصبی نیست.
یه RadioGroup رو فرم قرار بدین و OnClickش رو برابر اون RadioGroup1Click قرار بدین. برای این منظور بجای اینکه روی OnClick کنترل توی Object Inspector دابل کلیک کنید عبارت RadioGroup1Click رو در مقابل OnClick توی Object Inspector پیست کنید. البته آیتم های اون رو فراموش نکنید.

hector2000
سه شنبه 03 آبان 1390, 15:04 عصر
سلام و تشكر فراوان از شما دوست ارجمندم ولي
من مشكلم با Tedit بود نه radio group ولي باز دستتون درد نكنه
من اين كد را كه فرموديد گذاشتم ولي اصلا راست به چپ نميشه
كل پروژه را براتون فرستادم.خودتون هم مي توانيد ببينيد:گریه:

BORHAN TEC
سه شنبه 03 آبان 1390, 15:41 عصر
این مشکلی که شما گفته اید مربوط به نسخه های قدیمی دلفی هست و راه حل کلی برای شما اینه که از TMemo بجای TEdit استفاده کنید، به این صورت که خاصیت alignment مربوط به TMemo را تنظیم کنید.
راستی، چرا شما از خاصیت BiDiMode مربوط به TEdit استفاده نمی کنید؟؟؟ :متفکر:

SAASTN
سه شنبه 03 آبان 1390, 15:50 عصر
آقا من این پروژه رو گذاشتم، اینجوری راحتتره.


من مشكلم با Tedit بود نه radio group
من برداشتم از روند بحث رو صادقانه عرض می کنم و امیدوارم ناراحت نشید، تصور می کنم شما فقط دنبال کد نهایی هستید که براتون کار کنه. پست ها رو دقیق نمی خونید و جسارتا در مورد مطالب تعمق نمی کنید وگرنه این مسئله ای نبود که بخواد اینقدر طول بکشه. این که شما به خودتون زحمت نمی دید که متن خطا رو با یه دیکشنری بررسی کنید و کوچکترین تلاشی برای حلش نمی کنید و می فرمائید مشکل با TEditه نه RadioGroup و در نهایت می بینم که تو پروژه که قرار می دین دوتا آیتم تو رادیو گذاشتین به اسمای Test1 و Test2 و ... من مطمئن نیستم شما حتی یکبار کد هایی قرار دادم رو خونده باشید.

hector2000
سه شنبه 03 آبان 1390, 16:07 عصر
این مشکلی که شما گفته اید مربوط به نسخه های قدیمی دلفی هست و راه حل کلی برای شما اینه که از TMemo بجای TEdit استفاده کنید، به این صورت که خاصیت alignment مربوط به TMemo را تنظیم کنید.
راستی، چرا شما از خاصیت BiDiMode مربوط به TEdit استفاده نمی کنید؟؟؟ :متفکر:
سلام
بله tmemo راه حلي است كه سايتهاي ديگر هم پيشنهاد كردن ولي من نمونه كدي ديدم كه ادها كرده بود اين كار را مي كند
bidimide در دلفي 7 و در ويندوز 98 و در ويندوز xp انگليسي درست كار نمي كند و مشكل دارد


آقا من این پروژه رو گذاشتم، اینجوری راحتتره.


من برداشتم از روند بحث رو صادقانه عرض می کنم و امیدوارم ناراحت نشید، تصور می کنم شما فقط دنبال کد نهایی هستید که براتون کار کنه. پست ها رو دقیق نمی خونید و جسارتا در مورد مطالب تعمق نمی کنید وگرنه این مسئله ای نبود که بخواد اینقدر طول بکشه. این که شما به خودتون زحمت نمی دید که متن خطا رو با یه دیکشنری بررسی کنید و کوچکترین تلاشی برای حلش نمی کنید و می فرمائید مشکل با TEditه نه RadioGroup و در نهایت می بینم که تو پروژه که قرار می دین دوتا آیتم تو رادیو گذاشتین به اسمای Test1 و Test2 و ... من مطمئن نیستم شما حتی یکبار کد هایی قرار دادم رو خونده باشید.
با سلام
نه اتفاقا من كد را مطالعه و بررسي كردم و متوجه شدم كه سه تا ايتم بايد در راديو گروپ باشه و حتي خودم اين كار را كردم و لي باز هم جواب نداد حتي من مقدار دستي بهش دادم كه بايد راست چين باشي و لي باز هم نشد.نميدانم اصلا اين كار شدني است در دلفي 7 يا نه.من كدهاي شما را خوب مطالعه كردم و يم سوال دارم:ايا بهتر نبود بجاي دادن ايندكس گزينه انتخاب شده در گروپ باكس ، مستقيما بهش مي گفتيم كه چيدمانت راست باشد(يعني مقدار عددي 2 را بهش ميداديم؟)

hector2000
سه شنبه 03 آبان 1390, 16:33 عصر
من به نكته جالبي بر خوردم و دليل اينكه چرا كدهاي شما درست كار نمي كرد را فهميدم
شما در دلفي 7 كد نمي نويسيد(احتمالا يا در 2007 و يا در 2009 مي نويسيد) اين خط از كد زير در دلفي 7 باعث ايجاد tedit نمي شود و ان را نشان نمي دهد ولي در دلفي 2007 و 2009 و 2010 باعث ايجاد tedit مي شود كه با كدهاي شما سازگار است و راست چين ميشود(پروژه شما در دلفي 7 باز نمي شود و ارور ميدهد و من ان را در دلفي 2010 باز كردم و كامپايل كردم)
EditAlignment := TEditAlignment.Create(Self)
يعني باز مي گرديم به نقطه اول كه دلفي 7 با tcustomedit مشكل دارد
ايا كاري ميشه كرد؟

SAASTN
چهارشنبه 04 آبان 1390, 22:21 عصر
ايا بهتر نبود بجاي دادن ايندكس گزينه انتخاب شده در گروپ باكس ، مستقيما بهش مي گفتيم كه چيدمانت راست باشد(يعني مقدار عددي 2 را بهش ميداديم؟)
تفاوتی در اصل قضیه نداره، من خواستم به صورت ظاهری ست شدن وضعیت های مختلف دیده بشه.

اين خط از كد زير در دلفي 7 باعث ايجاد tedit نمي شود و ان را نشان نمي دهد ولي در دلفي 2007 و 2009 و 2010 باعث ايجاد tedit مي شود
چطور به همچین نتیجه ای رسیدید؟ Create کردن یه شیئ چیزی نیست که توی ورژن های مختلف دلفی تغییر کنه. شما اصلا کد رو دیباگ کردید که ببینید اون خط اصلا اجرا میشه یا نه؟ به هر صورت توی پروژه ای که شما فرستاده بودن OnCreate فرم ست نشده بود و برای ست کردنش همون روند ست کردن GroupBox1OnCkick باید طی بشه.

پروژه شما در دلفي 7 باز نمي شود و ارور ميدهد
چه خطایی؟ یه بار دیگه تکرار می کنم که با جمله "ارور می دهد" کسی نمی تونه به شما کمک کنه، برای بالا بردن سرعت تاپیک توی همون پست اول باید متن خطا رو ذکر کنید.
اما به هر صورت شما میتونید یه پروژه جدید توی همون دلفی 7 ایجاد کنید و Unit1 اون پروژه ای رو که قرار دادم بهش Add کنید و از داخل فرم خودتون Form1 رو Show کنید. توی این روند احتمالا با چندتا خطای مختلف روبرو می شید. اول اینکه اگه پروژه ای که ایجاد کردید خودش حاوی Unit1 یا Form1 باشه امکان اضافه کردن رو نمی ده، پس قبلا اسم فرم و یونیت اصلی پروژتون رو تغییر بدید. مشکل دوم اینکه ممکنه یه سری از پراپرتی های کنترلها که توی XE وجود دارن توی 7 وجود نداشته باشن. برای حل این موضوع باید فایل dfm رو با یه ویرایشگر متن باز کنید و سطر(های) مربوط به اون پراپرتی مشکل زا رو ازش حذف کنید.
به هر صورت من Exe رو ضمیمه می کنم که تو 98 تست کنید.
77057

hector2000
چهارشنبه 04 آبان 1390, 23:00 عصر
از اينكه اينقدر براي من وقت مي گذاريد سپاسگزارم
من فايل exe شما را در ويندوز 98 اجرا كردم و ارور داد(احتمالا با نسخه از دلفي ان را كامپايل كرديد كه ويندوز 98 را ساپورت نمي كنه)
اين تصوير ارور:
77062

من يك پروژه جديد در دلفي 7 ايجاد مردم و در ان يك group radiobox گذاشتم و ايتم هايش را هم پر كردم. و ان وقت كل اطلاعات فايل unit1 را پاك كردم و اطلاعات فايل unit1 شما را در ان paste كردم و در رويداد onclick مربوط به radio group box متن radiogroup box1click را نوشتم و پروژه را اجرا كردم ولي هيچ tedit مجدد ظاهر نمي شود
من مجددا كل پروژه ام را ارسال ميكنم.ايا تغيير خاص ديگري بايد بدهم؟
ممنونم

SAASTN
چهارشنبه 04 آبان 1390, 23:07 عصر
من يك پروژه جديد در دلفي 7 ايجاد مردم و در ان يك group radiobox گذاشتم و ايتم هايش را هم پر كردم. و ان وقت كل اطلاعات فايل unit1 را پاك كردم و اطلاعات فايل unit1 شما را در ان paste كردم و در رويداد onclick مربوط به radio group box متن radiogroup box1click را نوشتم و پروژه را اجرا كردم ولي هيچ tedit مجدد ظاهر نمي شود
تو پست قبل گفتم که! OnCreate فرم رو هم با FormCreate ست کنید، مثل همون OnClick رادیو گروپ.

hector2000
چهارشنبه 04 آبان 1390, 23:26 عصر
اقا درست شد
دستت درد نكنه
روي فرم دوبل كليك كردم formcreate را شناخت و بعد از اجرا tedit ظاهر شد(توي 98 هم درست اجرا شد)
اقا وفت كردي pm و ايميلتو هم چك كن
ممنونم