سؤال

في الوحدة أدناه ، لدي متغير معلن في قسم التنفيذ - محلي للوحدة. لديّ أيضًا إجراء ، أعلن في قسم النوع الذي يأخذ وسيطة ويعين هذه الوسيطة للمتغير المحلي المعني. يتم تمرير كل مثيل من هذا tframe متغير فريد من خلال passMeTheVar.

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

بمعنى آخر:

Unit FlexibleUnit;
interface
uses
//the uses stuff
type
TFlexibleUnit=class(TFrame)
   //declarations including
   procedure makeThisInstanceX(passMeTheVar:integer);
private
//
public
//
end;

implementation
uses //the uses
var myLocalVar;

procedure makeThisInstanceX(passMeTheVar:integer);
begin
myLocalVar:=passMeTheVar;
end;

//other procedures using myLocalVar 
//etc to the 
end;

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

ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;

وعندما أفعل:

ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"

يبدو أنهما يشتركان في نفس المتغير "Mylocalvar".

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

تعديل:

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

هل كانت مفيدة؟

المحلول

Mylocalvar هو متغير عالمي ، ولكنه مرئي فقط داخل الوحدة.

سيكون المتغير المحلي في إجراء/وظيفة ، مثل

procedure makeThisInstanceX(passMeTheVar: integer);
var
  myLocalVar: Integer;
begin
  myLocalVar := passMeTheVar;
end;

إذا كنت تريد متغير مثيل ، فإن كل إطار يحتوي على نسخته الخاصة ، ضعه في الفصل:

type
  TFlexibleUnit = class(TFrame)
     procedure makeThisInstanceX(passMeTheVar:integer);
  private
    myLocalVar: Integer;
  ...
  end;

نصائح أخرى

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

http://oreilly.com/catalog/delphi/Chapter/Ch02.html

الإطار / الوحدة / الفئة / التحكم

أحيي محاولتك البطولية لتحسين الكود. ومع ذلك ، فإن الحكم على أسئلتك وتعليقاتك يؤسفني أن أبلغكم أن فهمك محدود للغاية.

الإطار ليس وحدة ليست فئة. الإطار هو فئة ولكن ليس كل فئة هو إطار. الإطار هو عنصر تحكم ولكن ليس كل عنصر تحكم هو إطار. الوحدات لها أقسام واجهة وتنفيذ (والتهيئة والانتهاء). تحتوي الفصول على أجزاء خاصة وعامة (ومحمية ونشر).

لم أضع الفقرة الأخيرة في محاولة للتدريس ولكن للسماح لك بتقديم مستوى فهمك. يجب على مطور Delphi عدم وجود مشكلة في الفقرة. أنا لا أحاول أن أجعلك تشعر بالسوء أو الظهور - فقط أحاول المساعدة. ربما لا يكون الفضل المكدس هو الأداة المناسبة لك في هذا الوقت.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top