# Native Code > برنامه نویسی در Delphi > توسعه نرم افزار تحت وب >  ایجاد object در صفحه اینتراوب به شکل Run time

## iamehsan56

چطور می شه object در صفحه اینتراوب به شکل Run time ایجاد کرد . 
نمیدونم جایی که کدم رو می نویسم اشتباهه یا مشکل جای دیگه است که error میگیره و کاری نمی کنه .
من تو onsession هم کدم رو نوشتم اما فرقی نکرد . 
کسی می تونه کمک کنه 
ممنون می شم

----------


## iamehsan56

خوب اینطور که فهمیدم می شه واسه اینتراوب کامپوننت ساخت .
یعنی Custum component  
اما حالا من می خوام یه کنترلی از  jvcl رو مثلا تو اینتراوب استفاده کنم 
در مرحله اول یه کامپوننت معمولی ساختم 
اینو فهمیدم که :



///////////////////////////////////////////////////////////////
Similar to “VCL”
///////////////////////////////////////////////////////////////
Comes with complete source to components
Components inherit from
TIWBaseControl
4.0 controls: TIWControl
3.2 controls: TIWControl32
Creating new controls:
THINK HTML


///////////////////////////////////////////////////////////////
TIWBaseControl
///////////////////////////////////////////////////////////////

Design-time
IWDsnPaintHandlers: Handles painting of controls at design-time

Runtime
RenderHTML: Renders the corresponding HTML code for the control


////////////////////////////////////////////////////////////////
Creating Custom Components
///////////////////////////////////////////////////////////////

Overriding RenderHTML
Creating the design-time painting

For 4.0 controls
Inherit from TIWControl
For 3.2 controls
Inherit from TIWControl32
Cannot use JS
Cannot use CSS
Restricted to HTML 3.2






با توجه به نوشته های بالا منم اینو نوشتم 

 unit MyIWButton;

interface

uses
  SysUtils, Classes, Controls, IWVCLBaseControl,IWBaseControl;

type
  TMyIWButton = class(TIWBaseControl)

  //TIWBaseControl,Tbutton)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyCompIW', [TMyIWButton]);
end;

end.

          

 و مشکل اینه که وقتی یه page  اینتراوب باز می کنم اصلا  تو palette  نمی آد . اما وقتی یه برنامه win 32  مش سازم اونجا می آد و اتفاقا وقتی اضافه اش می کنم رو فرم پیغام می ده که نوع اینتراوبه و نمی تونه رو صفحه بیاردش 
اما نمی دونم چرا تو پروژه اینتراوب نمی شه اضافه اش کرد

----------


## vcldeveloper

یک آموزش ساده برای ساخت کامپوننت برای IntraWeb در لینک زیر هست:
http://www.atozed.com/intraweb/docs/...velopment.aspx

علاوه بر این، شرکت TMS مجموعه کامپوننتی برای IntraWeb تولید میکنه که قابلیت های زیادی به IntraWeb اضافه می کنند. می تونید علاوه بر استفاده از این کامپوننت ها، سورس آنها را هم برای ساخت کامپوننت های خودتان مطالعه کنید. البته این مجموعه رایگان نیست، و باید از سایت های کرک آن را پیدا کنید.

شرکت ArcanaTech هم یک مجموعه کامپوننت برای IntraWeb تولید میکنه که اوپن سورس هست. می تونید از کامپوننت های آن استفاده کنید، یا سورس آنها را مطالعه کنید. ظاهرا سورس کامپوننت ها در Google Code قرار داره. در ایران برای دسترسی به Google Code باید از پروکسی یا هر روش دیگه ایی که IP شما را مخفی میکنه، استفاده کنید، وگرنه Google Code اجازه دسترسی به سورس کد مورد نظر را به شما نمیده:
http://www.arcanatech.com/Products/IntrawebEliteSuite/tabid/58/Default.aspx

----------


## iamehsan56

آقای کشاورز 
من اون متنو خوندم 
اونجا اومده از خود کامپوننتای اینتراوب ارث گرفته و یه کامپوننت جدید ساخته .
اما من می خوام یه کامپوننت جدید از روی یه کامپوننت غیر اینتراوب بسازم . مثلا کامپوننتای JVCL .
در واقع از روی کامپوننتی win32  می خوام کامپوننت واسه اینتراوب بسازم
می شه راهنمایی بفرمایید در این مورد
ممنون

----------


## vcldeveloper

> اما من می خوام یه کامپوننت جدید از روی یه کامپوننت غیر اینتراوب بسازم . مثلا کامپوننتای JVCL .


نمی تونید به این شکل عمل کنید. اگر کامپوننت مورد نظر شما Non-Visual هست، باید یک کامپوننت IntraWeb بسازید که اون کامپوننت را Wrap کنه، یعنی یک لایه IntraWeb برای اون کامپوننت غیر IntraWebایی بسازید. اگر Visual هست، کار چندانی نمی تونید انجام بدید، چون در هر حال این کامپوننت برای اینکه نمایش داده بشه، باید کدهای HTML مناسب تولید کنه. تمامی کنترل های IntraWebایی که شما بصورت Visual استفاده می کنید، برای نمایش داده شدن در مرورگر، کد HTML تولید می کنند. شما نمی تونید همینطوری یک کنترل ویندوز را ببرید در IntraWeb و انتظار داشته باشید به همون شکل در مرورگر رسم بشه!

----------


## iamehsan56

درست آقای کشاورز
نهایت این که این کار شدنیه . درسته ؟ فقط باید کد html رو تولید کنه ؟درسته ؟
حالا واسه اینکار از کجا شروع کنم . 
لطفا راهنمایی بفرمایید .
بذارید یه جور دیگه هم مساله رو طرح کنم 
من قصدم از اینکار اینه که در نهایت بتونم . کنترلهایی که تو یه فرم هست رو بفرستم تو یه صفحه web  .

این کار من درسته ؟
یعنی یه فرم windows  دارم که یه سری کنترل روش وجود داره و با writecomponent  تو یه فایل ذخیره شدن . حالا می خوام این فایل رو تو فرم web  به شکل wb base  واسه user ها لود کنم .
لطفا راهنمایی کنید 
ممنونو می شم

----------


## vcldeveloper

من با IntraWeb کار نمی کنم، اطلاع دقیقی از جزئیات کار آن ندارم، ولی یک چیز مشخص هست، کنترل های IntraWeb فقط در ظاهر شبیه کنترل های ویندوز هستند، و ماهیت آنها متفاوت از کنترل های عادی ویندوز هست.
تا جایی که خاطرم هست، کامپوننت های IntraWeb یک متد خاص برای رسم کنترل با استفاده از کدهای HTML دارند که تقریبا عملکردی مثل عملکرد متد Paint برای کنترل های VCL دارند.

بطور کلی، برای ایجاد کنترل های جدید Visual نباید انتظار داشته باشید که یک سری کارهای روتین و ساده انجام بشه، و فرضا DBGrid شما به نسخه تحت وب تبدیل بشه! بلکه شما باید یک کنترل جدید IntraWeb بسازید، که چیزی شبیه به DBGrid را با استفاده از HTML رسم میکنه، و خصوصیات و رفتاری مشابه DBGrid داره. این خصوصیات و رفتار را هم باید خودتان پیاده سازی کنید، مثلا اگر قرار هست ستون های این گرید تحت وب عنوان داشته باشند، استفاده از یک DBGrid در داخل کامپوننت خودتان مشکلی را حل نمیکنه، بلکه خودتان باید یک خصوصیت Columns برای گرید ساخت خودتان ایجاد کنید، و هر زمان کاربر عنوان ستونی را تغییر می دهد، کدی بنویسید که خصوصیات HTML مربوط به آن کنترل را طوری تغییر دهد که عنوان مورد نظر کاربر در ستون مربوطه رسم شود. به عبارت دیگه، شما باید یک گرید کامل بسازید و تمام امور آن را خودتان کنترل کنید، فقط برای راحتی کار کاربر، خصوصیات آن را طوری تعریف کنید که مشابه کار با خصوصیات DBGrid عادی دلفی باشد.

----------


## iamehsan56

آقای کشاورز ممنون.
 متوجه قضیه شدم 
حالا یه سوال دارم من یه برنامه دارم که مثل یه designer  هستش و به طراح اجازه می ده یه سری object  رو به شکل run time تو یه فرم ویندوزی  ایجاد کنه .  و در نهایت ذخیره کنه .
این فایل ذخیره شده رو من می خوام به شکل web base  واسه کاربرا نمایش بدم .
حالا مساله من اینه که این object  رو به چه شکلی ذخیره کنم و به چه شکلی رو صفحه اینتراوب بازیابی کنم .
خودم می خواستم از همونwritecomponent واسه ذخیره اش استفاده کنم و از read component  برای load کردنش تو صفحه اینتراوب . اما چون اینا با هم کلاساشون فرق داره امکان پذیر نیست .
میشه  موقع  write  کردن واسه هر کدوم از اون object ها تو اون فایل  معادل اینتراوبیشو write  کرد .
مشکل تو این روشها اینه که باید یه حلقه for  بنویسم که بیاد این کارو انجام بده که وقتی تعداد object ها زیاد می شه ، می تونه خیلی کندش کنه .
شما می تونید راهی پیشنهاد کنید .
اصلا فکر می کنید اینتراوب می تونه واسه این کار مناسب باشه ؟ و اگه نیست چی رو پیشنهاد می کنید ؟
نمونه اش این فرم زیره که ویندوزی به وسیله طراح run time  ساخته می شه و در نهایت باید تو وب واسه کاربرا نمایش داده بشه 
تعداد این object ها ممکنه به 500  تا هم برسه 


ممنون می شم راهنماییم کنید
بازم خیلی ممنون

----------


## vcldeveloper

خب اگر این سطح از گرافیک را نیاز دارید، بهتر هست از Flash یا Silverlight برای تولید نسخه تحت وب استفاده کنید.
اشیاء موجود در کد دلفی را مستقیما نمی تونید به معادل های تحت وب با این شکل تبدیل کنید، بلکه باید پارامترهای هر یک از این اشیاء را (مثلا نوع شی، موقعیت آن، اندازه آن، و هر پارامتر دیگه ایی از شی که برای ساخت مجدد آن شی لازم است) در جایی ذخیره کنید، و سپس با خواندن این اطلاعات توسط نرم افزار تحت وب، اشیاء گرافیکی مورد نظرتان را تحت وب بسازید.

تا جایی که اطلاع دارم، IntraWeb قابلیت نمایش اشیاء Flash را داره. در نسخه های جدیدش از Silverlight هم پشتیبانی میکنه، پس می تونید نسخه تحت وب را با یکی از این تکنولوژی ها بسازید، و برای نمایش آن از IntraWeb استفاده کنید. البته اگر کل برنامه به همین شکل هست، وجود IntraWeb ضروری نیست، ولی اگر بخشی از برنامه اینطوری هست و بخش دیگه حاوی صفحات عادی هست، می تونید از IntraWeb برای اون بخش های عادی استفاده کنید، یا اینکه اون بخش ها را هم کلا با Flash یا Silverlight بنویسید. البته اگر اون بخش ها نیاز به تعامل با اشیاء دلفی داشته باشند، استفاده از IntraWeb کار را ساده تر میکنه.

----------


## iamehsan56

آقای کشاورز 
در مورد این بخش نظرتون چیه



> مشکل تو این روشها اینه که باید یه حلقه for بنویسم که بیاد این کارو انجام بده که وقتی تعداد object ها زیاد می شه ، می تونه خیلی کندش کنه .


لطفا راهنمایی بفرمایید

منطورتوت رو درباره این نفهمیدم



> البته اگر کل برنامه به همین شکل هست، وجود IntraWeb ضروری نیست

----------


## vcldeveloper

> در مورد این بخش نظرتون چیه


خب در هر حال باید از یک حلقه برای خواندن همه اشیاء از فایل استفاده کنید. کل فرآیند را میشه به بخش های کوچکتری تقسیم کرد، و برای هر کدام بهینه سازی هایی انجام داد، مثلا چگونگی ذخیره داده ها در فایل، چگونگی لود کرد فایل در حافظه، چگونگی خواندن مقادیر از فایل، و غیره.




> منطورتوت رو درباره این نفهمیدم


یعنی اگر کل پروژه به همین شکل حالت گرافیکی داره، کل آن را با Flash یا Silverlight انجام بدید، بهتر هست؛ اما اگر فقط بخشی از پروژه همچین حالتی داره، می تونید مابقی بخش ها را با IntraWeb انجام بدید، و فقط برای این بخش با گرافیک بالا از Flash یا Silverlight استفاده کنید.

----------


## iamehsan56

آقای کشاورز بازم ممنون از توضیحتون 
درباره این که :



> خب در هر حال باید از یک حلقه برای خواندن همه اشیاء از فایل استفاده کنید. کل فرآیند را میشه به بخش های کوچکتری تقسیم کرد، و برای هر کدام بهینه سازی هایی انجام داد، مثلا چگونگی ذخیره داده ها در فایل، چگونگی لود کرد فایل در حافظه، چگونگی خواندن مقادیر از فایل، و غیره


می شه یه راهنمایی کنید . بهتره چطوری کار کنم واسه خوندن از فایل و بهتره از چه فرمتی واسه ذخیره اش استفاده کنم . 
بازم ممنون

----------


## vcldeveloper

> می شه یه راهنمایی کنید . بهتره چطوری کار کنم واسه خوندن از فایل و بهتره از چه فرمتی واسه ذخیره اش استفاده کنم .


بستگی به نوع استفاده شما، داده هایی که در فایل ذخیره میشه، حجم داده ها، تعداد دفعات لود کردن از فایل، و مواردی از این قبیل داره. نمیشه یک راه حل کلی برای همه موارد موجود ارائه کرد.

----------


## iamehsan56

داده ها مشخصات object  ها هستند که من قبلا اونارو با write component ذخیره کردم 
حالا هم قاعدتا با read component  از تو فایل می خونمشون . خوب این که چطور می شه بهبودش داد رو نفهمیدم . می شه عملیاتی تر توضیح بدین 
ممنون می شم

----------


## vcldeveloper

خودِ IDE دلفی از WriteComponent و ReadComponent برای ذخیره و بازیابی فایل های DFM مربوط به فرم ها استفاده میکنه، و در این زمینه سرعت قابل قبولی داره. WriteComponent داده را بطور باینری ذخیره میکنه، و میتونه علاوه بر خصوصیات شی مورد نظر، خصوصیات مربوط به شی های متعلق به آن را هم ذخیره کنه، مثلا ذخیره شی یک فرم باعث میشه که تمام اجزاء متعلق به آن فرم هم ذخیره بشند، و نیازی نیست که برای هر کدام از آن کامپوننت ها این متد فراخوانی بشه.

----------


## iamehsan56

منظورتون اینه که از همین دو متد استفاده کنم یا باز روش بهتری هم هست
ممنون

----------


## vcldeveloper

همین دو متد خوب هستند، چون از مکانیزم Streaming داخلی دلفی استفاده می کنند، و هر بهبودی در این مکانیزم در نسخه های بعدی دلفی، موجب بهبود عملکرد برنامه شما هم میشه. از طرف دیگه، با توجه به کارایی IDE دلفی، می بینید که این روش برای تعداد زیاد اشیاء هم خوب جواب میده.

----------


## iamehsan56

یه سوال در همین رابطه واسه ام پیش می آد :
وقتی واسه هر کاربر یه session تشکیل بشه و بخواد این صفحه ای رو که ما داریم واسه اش run time  می سازیم ببینه . باید از اون فایل تو سرور خونده بشه و خوب به تعداد session ها باید از یه فایل خونده بشه . این نمی تونه باعث اشکال بشه و قتی کاربرای زیادی اون صفحه رو درخواست می کنن ؟
فکر می کنم خوندن از فایل وقتی کاربر ا زیادن سیستم رو کند می کنه . چون وقتی یه فایل باز می شه واسه کاربر بعدی هم می شه همین فایل باز بشه ؟
یا باز نمی دونم آیا مشکلات دیگه ای هم ایجاد  می کنه؟
لطفا راهنمایی بفرمایید

----------


## vcldeveloper

> فکر می کنم خوندن از فایل وقتی کاربر ا زیادن سیستم رو کند می کنه . چون وقتی یه فایل باز می شه واسه کاربر بعدی هم می شه همین فایل باز بشه ؟


بله، شما می تونید فایل را یک بار در هنگام شروع به کار برنامه در حافظه لود کنید، و برای همه کاربران از همان داده لود شده در حافظه استفاده کنید. البته اگر قرار هست این کاربران این داده ها را تغییر بدند، و مجددا در فایل ذخیره کنند، باید دسترسی به فایل Synchronize بشه.

----------


## iamehsan56

تعداد فایلهای من خیلی زیادن . چطور همه اونارو تو حافظه بار کنم . ممکنه بعضی وقتا تعداد این فایلها 100 تا یا بیشترم بشه .
فکر نمی کنم بشه همه این فایلارو تو حافظه بار کرد ؟!
لطفا بیشتر راهنمایی بفرمایید
با تشکر فراوان

----------


## vcldeveloper

> فکر نمی کنم بشه همه این فایلارو تو حافظه بار کرد ؟!


بستگی به برنامه شما داره. من که نمیدونم حجم هر کدام از این فایل ها چقدر هست، آیا همه کلاینت ها همیشه به همه داده های این فایل ها نیاز دارند یا نه؟ شما باید برنامه تان را متناسب با نوع نیازتان بنویسید، و متناسب با نیازهای برنامه تان هم برای آن سخت افزار مناسب تهیه کنید.

----------


## iamehsan56

حچم فایلها متغیره . خوب تو این فایلا  ممکنه 500 تا objec t  دلفی رو باهمون روش write component  ذخیره کنم . و کاربرا می تونن به همه صفحات دسترسی داشته باشن . اما در هر لحظه هر کلاینت فقط به یه صفحه دسترسی داره . اما در آن واحد ممکنه همه کاربرا یه صفحه رو تقاضا کنن
یه فایل با 500 تا کامپوننت رو که من ذخیره کردم حدود 300 کیلو بایت شد 
لطفا راهنمایی بفرمایید

----------


## vcldeveloper

> یه فایل با 500 تا کامپوننت رو که من ذخیره کردم حدود 300 کیلو بایت شد


خب، 300 کیلوبایت که چیزی نیست. شما 100 تا از این فایل ها را هم در حافظه سرور لود کنید، میشه 30 مگ.
مجبور نیستید همه را یک جا لود کنید، هر شی را که کاربری برای اولین بار درخواست کرد، در حافظه لود کنید، یعنی تا زمانی که کاربری شی ایی را درخواست نکرده، آن را لود نکنید. وقتی کاربری شی ایی را درخواست کرد، و آن را لود کردید، آن شی را در حافظه نگهدارید تا اگر کاربران دیگه هم آن را درخواست کردند، نیازی نباشه که شما دوباره آن را از روی هارد لود کنید.
اگر هم فرضا تعداد اشیاء لود شده از حد خاصی بالاتر رفت، می تونید بعضی از اشیاء موجود در حافظه را از حافظه خارج کنید.

خودتان باید یک مکانیزمی آماده کنید وضعیت استفاده از اشیاء را بررسی کنه، تا بتونه در زمان بالا رفتن لود، اشیائی که دیگه کاربری از آنها استفاده نمیکنه را از حافظه خارج کنه.

----------


## iamehsan56

ممنون . فکر می کنم راه موثری باشه . 
برای load اون فایل تو حافظه یه راهنمایی کوچولو می کنید که از کجا شروع کنم . فکر می کنم باید از اشیا stream  استفاده کنم . اما دقیقتر نمی دونم
بازم خیلی خیلی ممنون

----------


## vcldeveloper

> برای load اون فایل تو حافظه یه راهنمایی کوچولو می کنید که از کجا شروع کنم . فکر می کنم باید از اشیا stream استفاده کنم . اما دقیقتر نمی دونم


از TMemoryStream استفاده کنید.

----------


## iamehsan56

دنباله این موضوع در پست دیگری update  می گردد که در همین جهت می باشد .
اما درباره به کار گیری TMemory Strem
من لینکش رو می دم اینجا
http://www.barnamenevis.org/sh...d.php?t=187167

ممنون

----------

