PDA

View Full Version : ایجاد object در صفحه اینتراوب به شکل Run time



iamehsan56
شنبه 02 آبان 1388, 11:59 صبح
چطور می شه object در صفحه اینتراوب به شکل Run time ایجاد کرد .
نمیدونم جایی که کدم رو می نویسم اشتباهه یا مشکل جای دیگه است که error میگیره و کاری نمی کنه .
من تو onsession هم کدم رو نوشتم اما فرقی نکرد .
کسی می تونه کمک کنه
ممنون می شم

iamehsan56
شنبه 02 آبان 1388, 14:46 عصر
خوب اینطور که فهمیدم می شه واسه اینتراوب کامپوننت ساخت .
یعنی 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
شنبه 02 آبان 1388, 15:25 عصر
یک آموزش ساده برای ساخت کامپوننت برای IntraWeb در لینک زیر هست:
http://www.atozed.com/intraweb/docs/Develop/Custom/DelphiComponentDevelopment.aspx

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

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

iamehsan56
شنبه 02 آبان 1388, 16:26 عصر
آقای کشاورز
من اون متنو خوندم
اونجا اومده از خود کامپوننتای اینتراوب ارث گرفته و یه کامپوننت جدید ساخته .
اما من می خوام یه کامپوننت جدید از روی یه کامپوننت غیر اینتراوب بسازم . مثلا کامپوننتای JVCL .
در واقع از روی کامپوننتی win32 می خوام کامپوننت واسه اینتراوب بسازم
می شه راهنمایی بفرمایید در این مورد
ممنون

vcldeveloper
شنبه 02 آبان 1388, 20:46 عصر
اما من می خوام یه کامپوننت جدید از روی یه کامپوننت غیر اینتراوب بسازم . مثلا کامپوننتای JVCL .نمی تونید به این شکل عمل کنید. اگر کامپوننت مورد نظر شما Non-Visual هست، باید یک کامپوننت IntraWeb بسازید که اون کامپوننت را Wrap کنه، یعنی یک لایه IntraWeb برای اون کامپوننت غیر IntraWebایی بسازید. اگر Visual هست، کار چندانی نمی تونید انجام بدید، چون در هر حال این کامپوننت برای اینکه نمایش داده بشه، باید کدهای HTML مناسب تولید کنه. تمامی کنترل های IntraWebایی که شما بصورت Visual استفاده می کنید، برای نمایش داده شدن در مرورگر، کد HTML تولید می کنند. شما نمی تونید همینطوری یک کنترل ویندوز را ببرید در IntraWeb و انتظار داشته باشید به همون شکل در مرورگر رسم بشه!

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

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

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

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

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

http://barnamenevis.org/forum/attachment.php?attachmentid=38906&stc=1&d=1256455960
ممنون می شم راهنماییم کنید
بازم خیلی ممنون

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

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

iamehsan56
یک شنبه 03 آبان 1388, 11:48 صبح
آقای کشاورز
در مورد این بخش نظرتون چیه


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

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

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


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

vcldeveloper
یک شنبه 03 آبان 1388, 23:14 عصر
در مورد این بخش نظرتون چیه
خب در هر حال باید از یک حلقه برای خواندن همه اشیاء از فایل استفاده کنید. کل فرآیند را میشه به بخش های کوچکتری تقسیم کرد، و برای هر کدام بهینه سازی هایی انجام داد، مثلا چگونگی ذخیره داده ها در فایل، چگونگی لود کرد فایل در حافظه، چگونگی خواندن مقادیر از فایل، و غیره.


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

iamehsan56
دوشنبه 04 آبان 1388, 08:46 صبح
آقای کشاورز بازم ممنون از توضیحتون
درباره این که :


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


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

vcldeveloper
دوشنبه 04 آبان 1388, 08:50 صبح
می شه یه راهنمایی کنید . بهتره چطوری کار کنم واسه خوندن از فایل و بهتره از چه فرمتی واسه ذخیره اش استفاده کنم .
بستگی به نوع استفاده شما، داده هایی که در فایل ذخیره میشه، حجم داده ها، تعداد دفعات لود کردن از فایل، و مواردی از این قبیل داره. نمیشه یک راه حل کلی برای همه موارد موجود ارائه کرد.

iamehsan56
دوشنبه 04 آبان 1388, 12:40 عصر
داده ها مشخصات object ها هستند که من قبلا اونارو با write component ذخیره کردم
حالا هم قاعدتا با read component از تو فایل می خونمشون . خوب این که چطور می شه بهبودش داد رو نفهمیدم . می شه عملیاتی تر توضیح بدین
ممنون می شم

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

iamehsan56
سه شنبه 05 آبان 1388, 08:32 صبح
منظورتون اینه که از همین دو متد استفاده کنم یا باز روش بهتری هم هست
ممنون

vcldeveloper
سه شنبه 05 آبان 1388, 17:18 عصر
همین دو متد خوب هستند، چون از مکانیزم Streaming داخلی دلفی استفاده می کنند، و هر بهبودی در این مکانیزم در نسخه های بعدی دلفی، موجب بهبود عملکرد برنامه شما هم میشه. از طرف دیگه، با توجه به کارایی IDE دلفی، می بینید که این روش برای تعداد زیاد اشیاء هم خوب جواب میده.

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

vcldeveloper
چهارشنبه 06 آبان 1388, 15:55 عصر
فکر می کنم خوندن از فایل وقتی کاربر ا زیادن سیستم رو کند می کنه . چون وقتی یه فایل باز می شه واسه کاربر بعدی هم می شه همین فایل باز بشه ؟
بله، شما می تونید فایل را یک بار در هنگام شروع به کار برنامه در حافظه لود کنید، و برای همه کاربران از همان داده لود شده در حافظه استفاده کنید. البته اگر قرار هست این کاربران این داده ها را تغییر بدند، و مجددا در فایل ذخیره کنند، باید دسترسی به فایل Synchronize بشه.

iamehsan56
چهارشنبه 06 آبان 1388, 16:21 عصر
تعداد فایلهای من خیلی زیادن . چطور همه اونارو تو حافظه بار کنم . ممکنه بعضی وقتا تعداد این فایلها 100 تا یا بیشترم بشه .
فکر نمی کنم بشه همه این فایلارو تو حافظه بار کرد ؟!
لطفا بیشتر راهنمایی بفرمایید
با تشکر فراوان

vcldeveloper
پنج شنبه 07 آبان 1388, 00:28 صبح
فکر نمی کنم بشه همه این فایلارو تو حافظه بار کرد ؟!
بستگی به برنامه شما داره. من که نمیدونم حجم هر کدام از این فایل ها چقدر هست، آیا همه کلاینت ها همیشه به همه داده های این فایل ها نیاز دارند یا نه؟ شما باید برنامه تان را متناسب با نوع نیازتان بنویسید، و متناسب با نیازهای برنامه تان هم برای آن سخت افزار مناسب تهیه کنید.

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

vcldeveloper
پنج شنبه 07 آبان 1388, 11:17 صبح
یه فایل با 500 تا کامپوننت رو که من ذخیره کردم حدود 300 کیلو بایت شد
خب، 300 کیلوبایت که چیزی نیست. شما 100 تا از این فایل ها را هم در حافظه سرور لود کنید، میشه 30 مگ.
مجبور نیستید همه را یک جا لود کنید، هر شی را که کاربری برای اولین بار درخواست کرد، در حافظه لود کنید، یعنی تا زمانی که کاربری شی ایی را درخواست نکرده، آن را لود نکنید. وقتی کاربری شی ایی را درخواست کرد، و آن را لود کردید، آن شی را در حافظه نگهدارید تا اگر کاربران دیگه هم آن را درخواست کردند، نیازی نباشه که شما دوباره آن را از روی هارد لود کنید.
اگر هم فرضا تعداد اشیاء لود شده از حد خاصی بالاتر رفت، می تونید بعضی از اشیاء موجود در حافظه را از حافظه خارج کنید.

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

iamehsan56
پنج شنبه 07 آبان 1388, 11:28 صبح
ممنون . فکر می کنم راه موثری باشه .
برای load اون فایل تو حافظه یه راهنمایی کوچولو می کنید که از کجا شروع کنم . فکر می کنم باید از اشیا stream استفاده کنم . اما دقیقتر نمی دونم
بازم خیلی خیلی ممنون

vcldeveloper
جمعه 08 آبان 1388, 02:56 صبح
برای load اون فایل تو حافظه یه راهنمایی کوچولو می کنید که از کجا شروع کنم . فکر می کنم باید از اشیا stream استفاده کنم . اما دقیقتر نمی دونم
از TMemoryStream استفاده کنید.

iamehsan56
یک شنبه 10 آبان 1388, 11:30 صبح
دنباله این موضوع در پست دیگری update می گردد که در همین جهت می باشد .
اما درباره به کار گیری TMemory Strem
من لینکش رو می دم اینجا
http://www.barnamenevis.org/forum/showthread.php?t=187167

ممنون