منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "Main";
الأرشيف الحالي: 2002.07.29;
تنزيل: [xml.tar.bz2];

إلى

تحديد عنوان المنشئ البحث عن فروع مماثلة


Ученик   (2002-07-16 16:13) [0]

هل يمكن لعنوان الفصل تحديد عنوان مُنشئ كائنات هذه الفئة؟

فار
P: المؤشر ؛
بدأ
P: = TBitmap ؛

تحتاج إلى حساب عنوان TBitmap.Create باستخدام P ، هل من الممكن؟



Skier   (2002-07-16 16:20) [1]

> تلميذ
لماذا؟
ماذا تريد ان تفعل ؟؟



Ученик   (2002-07-16 16:23) [2]

> المتزحلق
استدعاء إنشاء كائنات من هذه الفئة في عنوان الفصل ، كل شيء واضح مع المكونات ، وهناك منشئ. تجاوز ؛ ، ولكن إذا كان من TPersistent أو TObject ؟؟؟؟



Skier   (2002-07-16 16:27) [3]

> تلميذ
للحفر الدائم:
- RegisterClass
- إلغاء التسجيل
- RegisterClasses
- إلغاء التسجيل
- فيند كلاس
- GetClass






Ученик   (2002-07-16 16:29) [4]

يسمى مُنشئ TObject



Skier   (2002-07-16 16:30) [5]

> تلميذ
في السعي لتحقيق:
قرأت عن metaclasses.



Skier   (2002-07-16 16:32) [6]

> تلميذ
ولماذا لديك TObject TBitmap؟



Digitman   (2002-07-16 16:38) [7]

حسنًا ، على سبيل المثال:

showmessage (inttohex (عدد صحيح (@ إنشاء خريطة) ، 8)) ؛

وإذا كانت طريقة المنشئ التي تحمل الاسم الذي تهتم به قد تم اعتبارها حمولة زائدة؟ ماذا بعد؟

و - لماذا تحتاج هذا؟ إن لم يكن سرا؟




Ученик   (2002-07-16 16:41) [8]

> المتزحلق
فار
P: TPersistentClass ؛
بدأ
RegisterClasses ([TBitmap]) ؛
P: = GetClass ("TBitmap") ؛
إذا P <> لا شيء بعد ذلك
P.Create.
دعا TObject.Create

> ديجتمان
استدعاء عنوان الفصل لإنشاء كائنات من هذه الفئة.



Digitman   (2002-07-16 16:42) [9]

حسنًا ، لنفترض أنك تسمي طريقة بناء الصف ..
وفي الواقع ، من سيخلق المثال لك؟



Skier   (2002-07-16 16:48) [10]

> تلميذ

نوع TBitmapClass = فئة TBitmap ؛ فار P: TBitmapClass ؛ بدأ RegisterClasses ([TBitmap]) ؛ P: = TBitmapClass (GetClass ("TBitmap")) ؛ إذا P <> لا شيء ، ثم P.Create ؛



Ученик   (2002-07-16 16:53) [11]

> ديجتمان
يتم إنشاء المثيل ، وسيقوم P.Create.Free باستدعاء TBitmap.Destroy ، فقط المُنشئ هو الذي سيتسبب في حدوث المشكلة.



Ученик   (2002-07-16 16:56) [12]

> ديجتمان
يتم إنشاء المثيل ، وسيقوم P.Create.Free باستدعاء TBitmap.Destroy ، فقط المُنشئ هو الذي سيتسبب في حدوث المشكلة.
> المتزحلق
يؤخذ TBitmap كمثال ، في مكانه يمكن أن يكون أي شيء آخر.

هل هناك نوع من جدول الأسلوب ، والبنائين ليست هناك في مكان ثابت؟



Digitman   (2002-07-16 17:39) [13]

> تلميذ

لا ، انتظر ...
بواسطة من / كيف وكيف سيتم إنشاء مثيل منك ، لأنك لا ترغب في رفض خدمات المترجم؟

نص طريقة المنشئ لا يقوم بذلك ، وتتمثل مهمته في تهيئة مثيل موجود



Ученик   (2002-07-16 17:46) [14]

> ديجتمان
لا أعرف الإجابة ، أنا فقط أتعلم ، فقط أحاول تنفيذ التعليمات البرمجية المشار إليها أعلاه ، يتم إنشاء الكائنات ،
المنشئ المحدد لهم لا يسمى



Skier   (2002-07-16 17:55) [15]

> تلميذ
لسوء الحظ ، أحفاد منشئ TPS ثابت لا
تداخل (تجاوز).
يمكن القيام بذلك فقط بدءًا من TComponent :(



Digitman   (2002-07-16 17:56) [16]

> تلميذ

بالطبع ، سيتم إنشاء كائن في هذا المثال! لا شك في ذلك)

ولكن في هذا المثال ، يقوم المترجم ضمنياً بعمل تطبيق واستدعاء الكود لإنشاء المثيل لك ...

تريد استدعاء أسلوب مُنشئ معين في وقت التشغيل تمامًا مثل إجراء تهيئة نوع ما. والسؤال هو أي مثيل؟ سيكون لديك لرعاية هذا بنفسك ...

سؤال آخر - كيف تأمل في استدعاء طريقة المُنشئ ، حتى معرفة عنوانه ، إذا كان به معلمة واحدة أو أكثر (غير معروفة مقدمًا)؟




Ученик   (2002-07-16 18:16) [17]

> ديجتمان
> تريد استدعاء طريقة مُنشئ معينة في وقت التشغيل ببساطة> كنوع من إجراءات تهيئة المثيل.

أريد أن أسمي مُنشئ كائن ، في رأيي ، يجب أن يفعل كل شيء ، على الأقل باستثناء الاتصال بـ TObject.Create لا يوجد شيء آخر هناك. إنها مشكلة بالفعل في العديد من المعلمات ، لكنني أردت أن أغمض عيني الآن ، على الرغم من أن بعض الرسائل الغريبة تومض في دلفي إذا كانت المكتبات المكونة غير متطابقة.



Юрий Зотов   (2002-07-16 18:25) [18]

> طالب

هناك شيء ما افسدت بطريقة ما. اشرح ببساطة - ما الذي يجب عمله؟ إنشاء كائن غير مكون ، معرفة الإشارة إلى فئتها؟ أو أي شيء آخر؟

ومثالك

نوع
TBitmapClass = فئة TBitmap ؛

فار
P: TBitmapClass ؛
بدأ
RegisterClasses ([TBitmap]) ؛
P: = TBitmapClass (GetClass ("TBitmap")) ؛
إذا P <> لا شيء ، ثم P.Create ؛

ما يعادل تماما ل TBitmap.Create الدعوة المعتادة. لماذا هذه الأجراس وصفارات؟



Ученик   (2002-07-16 18:29) [19]

> يوري زوتوف
لقد افسدت شيئًا ما ، ليس لي.



Skier   (2002-07-16 18:31) [20]

هذا لي. أنا فقط أعتقد أن الطالب يريد أن يكون
التعامل مع ورثة TBitmap.
لقد تصور شيئًا آخر :)



[NIKEL]   (2002-07-16 18:36) [21]

في رأيي لا يمكن الحصول على عناوين المدمر والمنشئ ...



Skier   (2002-07-16 18:39) [22]

> [نيكل]
showmessage (inttohex (عدد صحيح (@ TBitmap.Create) ، 8)) ؛

لماذا لا تخاطب :)



Юрий Зотов   (2002-07-16 18:48) [23]

مرتبك حقًا ، أعتذر.

لكن ما هو السؤال؟ كما ترى ، أنا لا أطلب شيئًا. أوضح ذلك لأنني أقدر تقريبًا ما تريد ومعرفة كيفية القيام بذلك. لكن لكي يتكلم المرء ، يجب ألا يخمن المرء ، لكن كن متأكداً تمامًا.



Ученик   (2002-07-16 19:11) [24]

> يوري زوتوف
لذلك لا توجد مطبات ، أريد إنشاء كائن من هذه الفئة على عنوان الفصل.



vuk   (2002-07-16 19:18) [25]

إلى Digitman:
> نص طريقة المنشئ لا يقوم بذلك ، فالمهمته هي
> تهيئة مثيل موجود
....
> تريد استدعاء طريقة معينة للمنشئ في وقت التشغيل فقط
> كنوع من إجراء تهيئة المثيل. السؤال هو ماذا
> المثال؟ سيكون لديك لرعاية هذا بنفسك ...

أنت مخطئ هنا. المنشئ هو الذي يخلق المثال. ويمكنك الحصول على عنوانه ، ويمكنك أيضًا الاتصال (إذا كنت تعرف كيف). هنا فقط هو الشيء الوحيد - من الأفضل عدم القيام بذلك. : س)



vuk   (2002-07-16 19:25) [26]

للطالب:
يمكنك إنشاء مثيل ، لكن لا يمكنك دائمًا القيام بذلك بشكل صحيح. على سبيل المثال ، بالنسبة لورثة TComponent ، يتم ذلك ببساطة (يوجد مُنشئ افتراضي هناك) ، لكن بالنسبة للفئات الأخرى ، قد يكون ذلك مشكلة.



Ученик   (2002-07-16 19:27) [27]

> فوك
مع الآخرين ، فقط السؤال)))



vuk   (2002-07-16 19:32) [28]

إذا كنت بحاجة إلى إنشاء مثيل _your_class ، فلا يتم حل هذه المهمة بشكل عام ، لأن كل فئة لها مُنشئها الخاص ولا يتم تسجيلها في أي جداول.



Ученик   (2002-07-16 19:36) [29]

> فوك
> ... غير مسجل في أي جداول.

آسف



Digitman   (2002-07-17 10:02) [30]

> فوك

فيما يلي التفاصيل الدقيقة:

إذا كان قبل استدعاء طريقة الإنشاء لفئة معينة PON dl = 1 ، ثم مباشرة قبل تهيئة المثيل ، سيتم استدعاء إجراء نظام ClassCreate ، وهو المسؤول عن إنشاء المثيل. وإلا (RON dl = 0) ، سيتم إجراء محاولة تهيئة فقط ، وسيؤدي ذلك إلى استثناء في حالة عدم وجود مثيل.

جميع المنشئات الموروثة تسمى dl = 0.

يتم دائمًا الدعوة إلى أي طريقة إنشاء لأي فئة بإدخال عنوان VMT في RON eax

بالإضافة إلى ذلك ، إذا كانت طريقة إنشاء الفصل تحتوي على معلمات ، فيجب أيضًا تمريرها: المعلمة الأولى (بترتيب إدراجها في إعلان المُنشئ) - إلى RON ecx ، والباقي - عن طريق الضغط المتسلسل على الرصة.

> تلميذ

المترجم بأكمله يولد هذا التسلسل من الإجراءات "بشفافية" للمبرمج.

جهل هذه الحقائق عندما يتم استدعاء المنشئ بشكل صريح (على العنوان الفعلي) سيؤدي بالضرورة إلى وضع استثنائي.




Ученик   (2002-07-17 10:10) [31]

> ديجتمان
إذا كنت بحاجة إلى شيء ما ، يمكنك الكتابة في المجمع المدمج ، ولكن يبدو أنه لا يوجد عنوان ، على أي حال ، شكرًا.



Игорь Шевченко   (2002-07-17 10:20) [32]

تتم كتابة عنوان المدمر في جدول VMT مع الإزاحة -4
(VmtDestroy)



Digitman   (2002-07-17 10:32) [33]

> تلميذ

كيف لا؟ ها هو!

الإجراء TfMain.ButtonXClick (المرسل: TObject) ؛
فار
فار
p: الإجراء ؛
ج: TClass ؛
t: TObject ؛
بدأ
p: = @ TComponent.Create ؛
c: = GetClass ("TComponent") ؛
ASM
وسائل التحقق ، 1 / ​​/ إنشاء مثيل
وسائل التحقق ، [ج] // VMT
mov ecx، 0 // Owner = nil
call dword ptr [p] // في الواقع - اتصل بالمنشئ على العنوان
mov [t]، eax // والنتيجة هي ارتباط إلى ex-p الذي تم إنشاؤه والأولي
الغاية؛

t.free. / / تدمير الكائن الذي تم إنشاؤه

الغاية؛



Ученик   (2002-07-17 10:52) [34]

> ايجور شيفتشينكو
كان حول المصمم
> ديجتمان
لدينا مشكلة في استدعاء منشئي الكائنات التي تم إنشاؤها بواسطة TObject و TPersistent ، ليس لديهم أي مشاكل مع المكونات ؛ لديهم مُنشئ تجاوز ؛ ويسمى كل شيء بالطريقة المعتادة
TComponentClass (FindClass ("اسم الفصل الدراسي")). قم بإنشاء (AOwner)



vuk   (2002-07-17 10:58) [35]

> هنا بعض الخفايا
أنا عن هذا. بشكل عام ، يمكنك كتابة ما كتبته أسهل قليلاً. إذا تذكرنا أن المُنشئ هو وظيفة تُرجع المثيل الذي تم إنشاؤه ، فكل شيء بسيط. يمكن تمثيل مُنشئ بدون معلمات مثل هذا:

نوع
TSimpleConstructor = دالة (ClassRef: TClass): TObject؛ تسجيل.
وفقا لذلك ، فإن منشئ TComponent تبدو وكأنها

نوع
TComponentConstructor = function (ClassRef: TClass ؛ AOwner: TComponent): TObject؛ تسجيل.

ثم يصبح التحدي أسهل. افترض أنه في المثال أعلاه ، يكون المتغير p من النوع TComponentConstructor ويحتوي على عنوان المنشئ ، فستكون مكالمته شيئًا مثل هذا:
ASM
وسائل التحقق ، 1
الغاية؛
t: = P (c ، لا شيء) ؛

ولكن فقط في المثال الذي ذكرته ، سيكون كل هذا غير ضروري ، حيث يمكن إجراء كل نفس ، لأن أحفاد TComponent لديهم مُنشئ افتراضي وليس كل الإجراءات المذكورة أعلاه مطلوبة بشكل خاص. لن يساعد هذا مؤلف السؤال بأي حال من الأحوال في حل مشكلته ، لأنه لا يعرف فئة الحالات التي سينشئها ، وبالتالي لن يكون قادرًا على الحصول على عنوان مُنشئ معين (لقد قمت بذلك بوضوح في السطر المظلل).
ومع ورثة TComponent ، كل شيء بسيط. افترض أن المتغير A يحتوي على مثيل لبعض السليل TComponent ، ثم:
C: = TComponentClass (A.GetClass) .Create (nil)؛




Digitman   (2002-07-17 11:16) [36]

> فوك
>> للمؤلف السؤال في حل مشكلته ، وهذا لن يساعد بأي حال من الأحوال

بالطبع ، لن يساعد! وأنا أتحدث عن هذا ، فقط لن يبدو أنه يفهم هذا.

وكل ما ذكرته ، كما قلت ، "معقد" - فقط في الرغبة لإظهار بوضوح أن العنوان قد تم تحديده بشكل صحيح وأن الدعوة الصريحة لطريقة البناء إلى العنوان المستلم أمر ممكن تمامًا ، ولكنها تنطوي على المشكلات المذكورة أعلاه.

> تلميذ

TComponent هو سليل TPersistent المباشر ، وليس من الواضح في هذه الحالة الصعوبات التي تواجهك إذا قلت أنه يمكنك بناء أي سليل TComponent دون مشاكل.



Ученик   (2002-07-17 11:26) [37]

> ديجتمان
> وأنا أتحدث عن هذا ، فقط الآن لا يبدو أنه يفهم ذلك>.

لقد توقفت منذ فترة طويلة المتدرب (16.07.02/19/36 XNUMX:XNUMX)

> TComponent هو الخلف المباشر لـ TPersistent ، وليس من الواضح في هذه الحالة ما الصعوبات التي تواجهها إذا قلت ذلك> يمكنك إنشاء أي خليفة TComponent دون مشاكل.

الذهن الذي تفتقر إليه السيد (Digitman ، Yuri Zotov) ، الذهن ، ولن يكون لك الثمن))) ، تكتب كثيرًا وبصورة جيدة عن الأشياء البسيطة.







Digitman   (2002-07-17 11:56) [38]

> تلميذ

لا أرى أنك "توقفت" ...
لذلك ما زلت لا تستطيع أن تشرح بذكاء جوهر المشكلة ...

لقد أخبروك بالفعل - على أي حال ، عليك أن تعرف فئة الكائن المسجل مسبقًا ، وأن يكون لديك رابط إلى واصف الفئة ولديك إعلان عن مُنشئها. عندها فقط يمكن أن يستدعي VMT أساليب إنشاء الفصل باستخدام المحاذير أعلاه.



Ученик   (2002-07-17 12:03) [39]

> ديجتمان
الذهن ، الذهن واليقظة مرة أخرى ، اقرأ هذه الصفحة مرة أخرى.



Digitman   (2002-07-17 12:40) [40]

> تلميذ

هراء. في هذه الحالة ، أنت أنت الذي لست حذرا.

أقتبس لك:

1
>> تحتاج إلى حساب عنوان TBitmap.Create باستخدام P ، >> هل من الممكن؟

2
>> منشئ البناء دعا


إليك - مرة أخرى - رمز يجيب على سؤالك (1) ويدحض بيانك (2)

TBitmap الخاص بك لا يرتبط TComponent.

الإجراء TfMain.ButtonXClick (المرسل: TObject) ؛ فار فار p: الإجراء ؛ ج: TClass ؛ t: TObject ؛ بدأ p: = @ TComponent.Create ؛ / / هنا هو العنوان RegisterClass (TBitmap) ؛ c: = GetClass ("TBitmap") ؛ ASM وسائل التحقق ، 1 وسائل التحقق ، [ج] استدعاء dword ptr [p] // هنا هو إنشاء كائن TBitmap mov [t] ، eax ينتهي. t.free. / / فيما يلي تدمير كائن TBitmap الذي تم إنشاؤه ينتهي.

ارسم وتأكد من نفسك !!!



Ученик   (2002-07-17 12:44) [41]

> ديجتمان
Если Вам будет легче, то каюсь, я сам не знаю что хочу, задаю дурацкие вопросы и не прислушиваюсь к ответам великих мастеров Delphi, надеюсь мы не будем продолжать, кто-то должен оказаться умнее.



Digitman   (2002-07-17 12:48) [42]

> تلميذ

Так вот если "сам не знаю что хочу" - разберись для начала, а потом уже упрекай стремящихся помочь тебе в невнимательности. С аргументами серьезными, а не словоблудием !



Ученик   (2002-07-17 12:52) [43]

> ديجتمان
لا تعليق



Digitman   (2002-07-17 13:00) [44]

> تلميذ
نعم ، كما يحلو لك يا سيدي)



Ученик   (2002-07-17 13:04) [45]

> ديجتمان
)



Уролог   (2002-07-17 13:10) [46]

Господа ! Сдается мне, старому специалисту, что у Digitman © потолще и подлиннее, чем у Ученик. И есть подспудная мысль, что Ученик"а мучает юношеский максимализм. Но это уже к другому специалисту.



Ученик   (2002-07-17 13:22) [47]

>Уролог
Вы сейчас полностью дискредитировали уважаемого Digitman.



Skier   (2002-07-17 13:23) [48]

Ребята, завязывайте...



Digitman   (2002-07-17 14:32) [49]

> تلميذ

За меня не волнуйся)
Мне совершенно по-барабану беспредметный треп постороннего.

Вот гораздо важнее, что ты скажешь по теме ...
Но ты-таки решил закрыть тему, не доведя ее до истины ... И совершенно напрасно ...



صفحات: 1 2 فرع كامل

المنتدى: "Main";
الأرشيف الحالي: 2002.07.29;
تنزيل: [xml.tar.bz2];

الطابق العلوي





الذاكرة: 0.73 ميغابايت
الوقت: 0.054 ج
1-95317
MSK
2002-07-17 13:57
2002.07.29
قفل المفتاح


3-95179
Oleon
2002-07-05 13:13
2002.07.29
الانتقال من InterBase المحلي إلى خادم InterBase


3-95181
Alecsandr
2002-07-05 17:07
2002.07.29
باستخدام DbRichEdit و Paradox FormattedMemo DB


1-95409
BAY
2002-07-16 10:51
2002.07.29
استمارات


1-95379
maxim2
2002-07-15 20:53
2002.07.29
هل يمكن التقاط الحدث MouseDown في الحدث MouseMove





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch English الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский