ورود

View Full Version : سوال: کار با OLE



MozenAbasi
دوشنبه 16 آبان 1390, 16:51 عصر
با سلام خدمت همه شما عزیزان
من می خوام با استفاده از OLE از آبجکت Microsoft Equation 3.0 اسفاده کنم ولی چون تا به حال از OLE استفاده نکردم نمی دونم چه جوری باید از خروجی که توسط Microsoft Equation 3.0 روی پنل OLE ایجاد میشه استفاده کنم .
برای توضیح بیشتر وقتی فرمول نویس رو انجام میدی و Microsoft Equation 3.0 رو می بندی فرموله میافته روی پنل OLE من می خوام مثلا خروجی OLE رو در قالب عکس بتونم تو یه Imaige نشونش بدم و بعدش تو پایگاهم ذخیره کنم .

ممنون میشم کسی راهنماییم کنه .

SAASTN
سه شنبه 17 آبان 1390, 04:12 صبح
من نمی دونم Word امکان خروجی گرافیکی گرفتن از Equation رو از طریق Automation میده یا نه، ولی یه راه اینه که فایل Word رو بصورت HTML ذخیره کنید، به ازای تمام فرمول ها دوتا فایل گرافیکی ایجاد میشه، GIF و PNG. این PNG پس زمینه سفید داره و Transparent نیست. اگه Transparency برات مهمه باید یه تنظیمی رو توی Word تغییر بدی، فکر نمی کنم لازم باشه هر بار تغییر کنه پس می تونی یه بار با دست ستش کنی. موقع SaveAs توی خود SaveDialog ی که باز میشه یه منو هست یه اسم Tools. آیتم Web Options رو انتخاب کن و تو تب Browsers چک "Allow PNG ..." رو بزن. حالا موقع Save دوتا فایل PNG ایجاد میشه، یکی با پس زمینه سفید و یکی Transparent.

MozenAbasi
سه شنبه 17 آبان 1390, 18:01 عصر
ممنون از پاسخت ولی من اصلا کاری با word ندارم ! فکر کنم نتونستم منظورم رو برسونم !
برای اینکه بهتر منظورم رو متوجه بشید مراحل زیر رو دنبال کنید :
مرحله اول :
1)http://1.iped.comeze.com/images/f6371c912614.jpg
مرحله دوم :
2)http://1.iped.comeze.com/images/4f5ddd735176.jpg
مرحله سوم :
3)http://1.iped.comeze.com/images/40b37847dbec.jpg
مرحله چهارم :
4)http://1.iped.comeze.com/images/4dbd1111727a.jpg
مرحله پنج : بعد از بستن پنجره Microsoft Equation 3.0 اتفاق زیر رخ میده
5)http://1.iped.comeze.com/images/e4450dc93010.jpg
و مشکل من اینجایت که می خوام به وضعیت زیر برسم آبجکت سمت راست یک Image هستش .
6)http://1.iped.comeze.com/images/9b902fc3289a.jpg

امیدوارم این دفعه تونسته باشم منظورم رو برسونم :)

Felony
سه شنبه 17 آبان 1390, 19:10 عصر
خوب اون قسمت فرم که OLE روش قرار داره رو روی یک Image رسم کن ؛ برات یک تابع نوشتم :

procedure OLE2Image(const OLE: TOleContainer; Image: TImage);
var
Source: TRect;
begin
// Set image size to ole size
Image.Height:= OLE.Height;
Image.Width:= OLE.Width;

// Get ole size & position on form
Source.Top:= OLE.Top;
Source.Left:= OLE.Left;
Source.Right:= OLE.Left + OLE.Width;
Source.Bottom:= OLE.Top + OLE.Height;

// Copy area of form that ole object is there
Image.Canvas.CopyRect(Image.ClientRect, TForm(OLE.Parent).Canvas, Source);
end;

استفاده :

OLE2Image(OleContainer1, Image1);

SAASTN
سه شنبه 17 آبان 1390, 22:40 عصر
اگه نمی خوای پس زمینه همیشه clBtnFace باشه هم:
http://stackoverflow.com/questions/2861008/how-to-extract-metafile-from-tolecontainer

یونیت ActiveX رو هم باید Use کنی.

اگرم مثل من همیشه لنگ Transparency هستی:
procedure DrawOleOnBmp(Ole: IOleObject; png: TPngImage);
var
ViewObject2: IViewObject2;
ViewSize: TPoint;
AdjustedSize: TPoint;
DC: HDC;
R: TRect;
I, J: Integer;
Line, Alpha: pByteArray;
begin
if Succeeded(Ole.QueryInterface(IViewObject2, ViewObject2)) then
begin
ViewObject2.GetExtent(DVASPECT_CONTENT, -1, nil, ViewSize);

DC := GetDC(0);
AdjustedSize.X := MulDiv(ViewSize.X, GetDeviceCaps(DC, LOGPIXELSX), 2540);
AdjustedSize.Y := MulDiv(ViewSize.Y, GetDeviceCaps(DC, LOGPIXELSY), 2540);
ReleaseDC(0, DC);

png.CreateBlank(COLOR_RGBALPHA, 8, AdjustedSize.X, AdjustedSize.Y);

SetRect(R, 0, 0, png.Width, png.Height);

png.Canvas.Brush.Color := clWhite;
png.Canvas.FillRect(R);
OleDraw(Ole, DVASPECT_CONTENT, png.Canvas.Handle, R);
for I := 0 to png.Height - 1 do
begin
Line := png.Scanline[I];
Alpha := png.AlphaScanline[I];
for J := 0 to png.Width - 1 do
if Line[J * 3] + Line[J * 3 + 1] + Line[J * 3 + 2] <> 765 then
begin
Alpha[J] := (765 - Line[J * 3] - Line[J * 3 + 1] - Line[J * 3 + 2]) div 3;
Line[J * 3] := 0;
Line[J * 3 + 1] := 0;
Line[J * 3 + 2] := 0;
end;
end;
end
else
begin
raise Exception.Create('Could not get the IViewObject2 interfact on the OleObject');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
png: TPngImage;
begin
png := TPngImage.Create;
DrawOleOnBmp(GraphicOleContainer1.OleObjectInterfa ce, png);
png.SaveToFile('c:\formula.png');
end;

MozenAbasi
پنج شنبه 19 آبان 1390, 08:21 صبح
از هر دو عزیزی که راهنمایی کردن ممنونم .
ولی اگه OLE رو به صورت آیکن انتخاب کنی دیگه این روشها جواب نمیده . باید چی کار کرد ؟:متفکر:

Felony
پنج شنبه 19 آبان 1390, 09:44 صبح
منظورتون چی هست ؟ یعنی خصیصه Iconic رو True کنیم ؟ اگر منظورتون همین هست که برای من مشکلی نداره .

SAASTN
جمعه 20 آبان 1390, 02:35 صبح
ایضا اگه:

یعنی خصیصه Iconic رو True کنیم ؟
این وضعیت تو کدی هم که من قرار دادم خطای RunTime داره، که با تبدیل DVASPECT_CONTENT به VASPECT_ICON تو خطهای 13 و 26 حل میشه و درست کار می کنه. خودتون می تونید یه شرط بذارید و این دو خط رو پارامتریک کنید.
البته تو این وضعیت اون کدی که من گذاشتم گند میزنه به تصویر و علتش هم اینه که من اون تبدیل آلفا رو بر اساس خرو جی رستر سیاه و سفید Equation بی شعور نوشتم. حالا یا خودتون باید اون تبدیل آلفا رو جوری تغییر بدین که نتیجه قابل قبول بشه یا اصلا قید شفافیت رو بزنید و از اون کدی که لینکش رو دادم استفاده کنید.

اگرم منظور وضعیت دیگه ایه که بیشتر توضیح بدید.

MozenAbasi
جمعه 20 آبان 1390, 11:03 صبح
بله منظورم اینه که Icon رو True کنیم .
من از همون کدی که لینکش رو قرار دادین استفاده کردم ولی باز هم خطای Runtime میده
در ضمن از پیگیری هر دو عزیز کمال تشکر رو دارم .

Felony
جمعه 20 آبان 1390, 11:56 صبح
الان مشکلت با کدی که من گذاشتم چی هست ؟!